@worktile/theia 15.3.3 → 16.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/contextmenu/contextmenu.component.d.ts +1 -1
- package/components/conversion-hint/conversion-hint.component.d.ts +3 -3
- package/components/inline-toolbar/inline-toolbar.component.d.ts +3 -4
- package/components/listbox/listbox.d.ts +3 -3
- package/components/plugin-menu/plugin-menu.component.d.ts +4 -3
- package/components/table-select/table-select.component.d.ts +1 -1
- package/components/template/template.component.d.ts +2 -2
- package/components/toolbar/toolbar.component.d.ts +4 -4
- package/components/toolbar-dropdown/toolbar-dropdown.component.d.ts +2 -2
- package/components/toolbar-group/toolbar-group.component.d.ts +5 -6
- package/core/toolbar-item/base-toolbar-item.d.ts +6 -7
- package/core/utils/plugin-menu.d.ts +2 -2
- package/editor.component.d.ts +1 -1
- package/editor.module.d.ts +1 -1
- package/{esm2020 → esm2022}/components/action/prevent-default.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/column-resize-notifier.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/column-resize.directive.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/column-resize.module.mjs +9 -9
- package/{esm2020 → esm2022}/components/column-resize/event-dispatcher.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/overlay-handle.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/column-resize/resizing.store.mjs +4 -4
- package/{esm2020 → esm2022}/components/contextmenu/contextmenu.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/conversion-hint/conversion-hint.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/element/element.component.mjs +4 -4
- package/{esm2020 → esm2022}/components/inline-toolbar/inline-toolbar.component.mjs +6 -6
- package/esm2022/components/listbox/listbox.mjs +375 -0
- package/esm2022/components/plugin-menu/plugin-menu.component.mjs +191 -0
- package/{esm2020 → esm2022}/components/table-select/table-select.component.mjs +4 -4
- package/esm2022/components/template/template.component.mjs +62 -0
- package/{esm2020 → esm2022}/components/text/text.component.mjs +4 -4
- package/esm2022/components/toolbar/toolbar.component.mjs +266 -0
- package/esm2022/components/toolbar-dropdown/toolbar-dropdown.component.mjs +144 -0
- package/esm2022/components/toolbar-group/toolbar-group.component.mjs +122 -0
- package/{esm2020 → esm2022}/components/toolbar-item/toolbar-item.component.mjs +6 -6
- package/esm2022/constants/auto-format-rules.mjs +167 -0
- package/esm2022/constants/plugin-menu.mjs +328 -0
- package/esm2022/core/toolbar-item/base-toolbar-item.mjs +87 -0
- package/{esm2020 → esm2022}/core/utils/combine-plugins.mjs +1 -1
- package/esm2022/core/utils/plugin-menu.mjs +33 -0
- package/esm2022/custom-types.mjs +2 -0
- package/{esm2020 → esm2022}/editor.component.mjs +11 -11
- package/esm2022/editor.module.mjs +254 -0
- package/esm2022/interfaces/auto-format.mjs +2 -0
- package/esm2022/interfaces/editor.mjs +25 -0
- package/esm2022/interfaces/plugins/plugin-menu.mjs +19 -0
- package/esm2022/interfaces/plugins/with-override.mjs +2 -0
- package/esm2022/interfaces/reset-block-type-plugin-options.mjs +2 -0
- package/esm2022/interfaces/toolbar.mjs +12 -0
- package/{esm2020 → esm2022}/interfaces/view-base.mjs +4 -4
- package/esm2022/pipes.mjs +42 -0
- package/esm2022/plugins/align/align.editor.mjs +43 -0
- package/esm2022/plugins/align/align.plugin.mjs +64 -0
- package/{esm2020 → esm2022}/plugins/autoformat/autoformat.plugin.mjs +1 -1
- package/esm2022/plugins/autoformat/transforms/auto-format-block.mjs +14 -0
- package/esm2022/plugins/autoformat/transforms/auto-format-inline.mjs +78 -0
- package/esm2022/plugins/blockquote/blockquote.component.mjs +21 -0
- package/esm2022/plugins/blockquote/blockquote.editor.mjs +17 -0
- package/esm2022/plugins/blockquote/blockquote.plugin.mjs +85 -0
- package/{esm2020 → esm2022}/plugins/code/code.component.mjs +4 -4
- package/esm2022/plugins/code/code.editor.mjs +48 -0
- package/{esm2020 → esm2022}/plugins/code/code.plugin.mjs +1 -1
- package/esm2022/plugins/color/color.editor.mjs +27 -0
- package/{esm2020 → esm2022}/plugins/color/toolbar-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/common/block-card.plugin.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/common/common.plugin.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/common/get-fragment.plugin.mjs +1 -1
- package/esm2022/plugins/common/history.plugin.mjs +31 -0
- package/{esm2020 → esm2022}/plugins/common/insert-data-by-invalid-type.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/common/move-selection.plugin.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/common/remove-empty.plugin.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/common/remove-void.plugin.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/common/reset-type.plugin.mjs +1 -1
- package/esm2022/plugins/common/transforms.plugin.mjs +18 -0
- package/esm2022/plugins/deserialize/deserialize-html.plugin.mjs +53 -0
- package/esm2022/plugins/deserialize/deserialize-md.plugin.mjs +130 -0
- package/esm2022/plugins/font-size/font-size.editor.mjs +98 -0
- package/esm2022/plugins/heading/heading.editor.mjs +54 -0
- package/esm2022/plugins/heading/heading.plugin.mjs +136 -0
- package/{esm2020 → esm2022}/plugins/hr/hr.component.mjs +6 -6
- package/esm2022/plugins/hr/hr.editor.mjs +16 -0
- package/esm2022/plugins/hr/hr.plugin.mjs +56 -0
- package/esm2022/plugins/image/image.component.mjs +420 -0
- package/esm2022/plugins/image/image.editor.mjs +81 -0
- package/esm2022/plugins/indent/indent.editor.mjs +78 -0
- package/{esm2020 → esm2022}/plugins/indent/indent.plugin.mjs +1 -1
- package/esm2022/plugins/indent/on-keydown-indent.mjs +59 -0
- package/esm2022/plugins/inline-code/inline-code.component.mjs +26 -0
- package/esm2022/plugins/inline-code/inline-code.editor.mjs +48 -0
- package/esm2022/plugins/inline-code/inline-code.plugin.mjs +66 -0
- package/esm2022/plugins/link/edit/link-edit.component.mjs +103 -0
- package/{esm2020 → esm2022}/plugins/link/hover/link-hover.component.mjs +4 -4
- package/esm2022/plugins/link/link.component.mjs +167 -0
- package/esm2022/plugins/link/link.editor.mjs +66 -0
- package/{esm2020 → esm2022}/plugins/link/link.plugin.mjs +1 -1
- package/esm2022/plugins/list/components/bulleted-list.component.mjs +33 -0
- package/esm2022/plugins/list/components/list-item.component.mjs +93 -0
- package/esm2022/plugins/list/components/numbered-list.component.mjs +39 -0
- package/esm2022/plugins/list/list.editor.mjs +126 -0
- package/esm2022/plugins/list/list.plugin.mjs +312 -0
- package/esm2022/plugins/list/normalizers/get-list-normalizer.mjs +39 -0
- package/esm2022/plugins/list/normalizers/normalize-list-item.mjs +18 -0
- package/esm2022/plugins/list/normalizers/normalize-no.mjs +43 -0
- package/esm2022/plugins/list/on-key-down-list.mjs +33 -0
- package/esm2022/plugins/list/queries/get-list-item-entry.mjs +28 -0
- package/esm2022/plugins/list/queries/get-start-list-item.mjs +27 -0
- package/esm2022/plugins/list/queries/has-list-in-list-item.mjs +27 -0
- package/esm2022/plugins/list/queries/is-in-list.mjs +6 -0
- package/esm2022/plugins/list/queries/is-list-nested.mjs +10 -0
- package/esm2022/plugins/list/queries/is-list.mjs +5 -0
- package/{esm2020 → esm2022}/plugins/list/queries/is-node-type-list.mjs +1 -1
- package/esm2022/plugins/list/queries/is-selection-at-list-item-start.mjs +13 -0
- package/esm2022/plugins/list/queries/is-selection-in-same-list-item.mjs +17 -0
- package/{esm2020 → esm2022}/plugins/list/queries/is-single-list-item.mjs +1 -1
- package/esm2022/plugins/list/transforms/insert-list-data.mjs +72 -0
- package/esm2022/plugins/list/transforms/insert-list-item.mjs +72 -0
- package/esm2022/plugins/list/transforms/move-list-item-down.mjs +41 -0
- package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +43 -0
- package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +30 -0
- package/esm2022/plugins/list/transforms/move-list-item-up.mjs +78 -0
- package/esm2022/plugins/list/transforms/unwrap-list.mjs +10 -0
- package/esm2022/plugins/mark/mark.editor.mjs +28 -0
- package/{esm2020 → esm2022}/plugins/mark/mark.plugin.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/mention/mention.editor.mjs +1 -1
- package/esm2022/plugins/mention/mention.plugin.mjs +91 -0
- package/{esm2020 → esm2022}/plugins/mention/suggestion.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/node-id/node-id.plugin.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/normalizers/insert-paragraph-nodes.mjs +1 -1
- package/esm2022/plugins/normalizers/remove-empty-nodes.mjs +18 -0
- package/{esm2020 → esm2022}/plugins/normalizers/trailing-node.plugin.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/paint-format/paint-format.editor.mjs +1 -1
- package/{esm2020 → esm2022}/plugins/quick-insert/components/quick-insert.component.mjs +4 -4
- package/esm2022/plugins/quick-insert/quick-insert.editor.mjs +68 -0
- package/esm2022/plugins/quick-insert/quick-insert.plugin.mjs +104 -0
- package/esm2022/plugins/table/components/insert-mark/insert-mark.component.mjs +104 -0
- package/{esm2020 → esm2022}/plugins/table/components/row/row.component.mjs +6 -6
- package/{esm2020 → esm2022}/plugins/table/components/table.component.mjs +16 -16
- package/{esm2020 → esm2022}/plugins/table/components/td/td.component.mjs +4 -4
- package/{esm2020 → esm2022}/plugins/table/components/toolbar/table-options.component.mjs +6 -6
- package/esm2022/plugins/table/components/toolbar/table-toolbar.component.mjs +189 -0
- package/esm2022/plugins/table/table.editor.mjs +209 -0
- package/{esm2020 → esm2022}/plugins/table/table.pipe.mjs +7 -7
- package/esm2022/plugins/table/table.plugin.mjs +544 -0
- package/{esm2020 → esm2022}/plugins/table/table.service.mjs +4 -4
- package/esm2022/plugins/table/table.store.mjs +426 -0
- package/esm2022/plugins/table/table.types.mjs +60 -0
- package/{esm2020 → esm2022}/plugins/table/toolbar-item.component.mjs +6 -6
- package/esm2022/plugins/table/transforms/clear-cell.mjs +14 -0
- package/esm2022/plugins/table/transforms/clear-table-node.mjs +27 -0
- package/esm2022/plugins/table/transforms/insert-column.mjs +69 -0
- package/esm2022/plugins/table/transforms/insert-row.mjs +50 -0
- package/esm2022/plugins/table/transforms/insert-table.mjs +15 -0
- package/esm2022/plugins/table/transforms/remove-column.mjs +51 -0
- package/esm2022/plugins/table/transforms/remove-row.mjs +48 -0
- package/esm2022/plugins/table/transforms/remove-table.mjs +49 -0
- package/esm2022/plugins/table/utils/calc-anchor-position.mjs +25 -0
- package/esm2022/plugins/table/utils/cell-position.mjs +60 -0
- package/esm2022/plugins/table/utils/create-table-position.mjs +10 -0
- package/esm2022/plugins/table/utils/get-min-max-cell-index.mjs +69 -0
- package/esm2022/plugins/table/utils/get-select-cell-node.mjs +23 -0
- package/esm2022/plugins/table/utils/handle-cell.mjs +25 -0
- package/esm2022/plugins/table/utils/is-range-in-table.mjs +16 -0
- package/esm2022/plugins/table/utils/is-selection-in-table.mjs +51 -0
- package/esm2022/plugins/table/utils/merge-cell.mjs +108 -0
- package/esm2022/plugins/table/utils/set-menu-cell-invisibility.mjs +45 -0
- package/esm2022/plugins/table/utils/split-cell.mjs +29 -0
- package/esm2022/plugins/table/utils/table-entry.mjs +21 -0
- package/{esm2020 → esm2022}/plugins/todo-item/todo-item.component.mjs +7 -7
- package/esm2022/plugins/todo-item/todo-item.editor.mjs +32 -0
- package/esm2022/plugins/todo-item/todo-item.plugin.mjs +93 -0
- package/esm2022/plugins/vertical-align/toolbar-item.component.mjs +83 -0
- package/esm2022/queries/anchor-block-entry.mjs +13 -0
- package/esm2022/queries/anchor-block.mjs +6 -0
- package/esm2022/queries/anchor-inline-entry.mjs +10 -0
- package/{esm2020 → esm2022}/queries/find-descendant.mjs +1 -1
- package/esm2022/queries/find-node.mjs +45 -0
- package/esm2022/queries/get-above-by-type.mjs +14 -0
- package/esm2022/queries/get-above.mjs +9 -0
- package/esm2022/queries/get-anchor-block-entry.mjs +8 -0
- package/esm2022/queries/get-block-above.mjs +10 -0
- package/esm2022/queries/get-block-card-above.mjs +10 -0
- package/esm2022/queries/get-block-card-cursor.mjs +5 -0
- package/esm2022/queries/get-container-blocks.mjs +12 -0
- package/esm2022/queries/get-insert-elements-path.mjs +44 -0
- package/{esm2020 → esm2022}/queries/get-last-node.mjs +1 -1
- package/esm2022/queries/get-node.mjs +10 -0
- package/esm2022/queries/get-nodes-by-type.mjs +15 -0
- package/esm2022/queries/get-nodes.mjs +7 -0
- package/esm2022/queries/get-parent.mjs +12 -0
- package/esm2022/queries/get-plain-text.mjs +16 -0
- package/esm2022/queries/get-plugin-by-toolbar.mjs +13 -0
- package/{esm2020 → esm2022}/queries/get-point-before.mjs +1 -1
- package/esm2022/queries/get-point-from-location.mjs +15 -0
- package/esm2022/queries/get-rang-from-block-start.mjs +16 -0
- package/esm2022/queries/get-range-before.mjs +17 -0
- package/{esm2020 → esm2022}/queries/get-selection-marks.mjs +1 -1
- package/esm2022/queries/get-selection-nodes-by-type.mjs +30 -0
- package/esm2022/queries/get-text.mjs +9 -0
- package/esm2022/queries/get-toolbar-disabled.mjs +13 -0
- package/esm2022/queries/is-across-blocks.mjs +7 -0
- package/esm2022/queries/is-ancestor-empty.mjs +6 -0
- package/esm2022/queries/is-block-above-empty.mjs +11 -0
- package/esm2022/queries/is-block-active.mjs +8 -0
- package/esm2022/queries/is-block-card-cursor.mjs +4 -0
- package/{esm2020 → esm2022}/queries/is-block-text-empty-after-selection.mjs +1 -1
- package/esm2022/queries/is-contain-nested-type.mjs +29 -0
- package/esm2022/queries/is-container-type.mjs +3 -0
- package/esm2022/queries/is-empty-content-filter.mjs +23 -0
- package/{esm2020 → esm2022}/queries/is-empty-content.mjs +1 -1
- package/esm2022/queries/is-empty-paragraph-by-path.mjs +7 -0
- package/esm2022/queries/is-empty-paragraph.mjs +28 -0
- package/esm2022/queries/is-global-collapsed.mjs +5 -0
- package/esm2022/queries/is-include-types.mjs +12 -0
- package/esm2022/queries/is-node-type-in.mjs +9 -0
- package/esm2022/queries/is-node-type.mjs +15 -0
- package/esm2022/queries/is-paragraph.mjs +9 -0
- package/esm2022/queries/is-range-across-blocks.mjs +22 -0
- package/esm2022/queries/is-start.mjs +6 -0
- package/esm2022/queries/some-node.mjs +9 -0
- package/{esm2020 → esm2022}/services/context.service.mjs +4 -4
- package/{esm2020 → esm2022}/services/table-contextmenu.service.mjs +4 -4
- package/{esm2020 → esm2022}/services/toolbar.service.mjs +4 -4
- package/{esm2020 → esm2022}/shortcuts/index.mjs +1 -1
- package/esm2022/shortcuts/mark.mjs +25 -0
- package/esm2022/test/utils/with-editor.mjs +8 -0
- package/esm2022/test/utils/with-plugin.mjs +8 -0
- package/{esm2020 → esm2022}/transforms/clear-marks.mjs +1 -1
- package/esm2022/transforms/close-conversion-hint.mjs +8 -0
- package/{esm2020 → esm2022}/transforms/delete-element.mjs +1 -1
- package/esm2022/transforms/handle-continual-delete-backward.mjs +18 -0
- package/esm2022/transforms/handle-continual-insert-break.mjs +20 -0
- package/esm2022/transforms/insert-elements.mjs +38 -0
- package/esm2022/transforms/insert-paragraph.mjs +6 -0
- package/esm2022/transforms/move-children.mjs +22 -0
- package/esm2022/transforms/on-keydown-reset-block-type.mjs +22 -0
- package/{esm2020 → esm2022}/transforms/set-end-selection.mjs +1 -1
- package/esm2022/transforms/set-marks.mjs +9 -0
- package/esm2022/transforms/set-node.mjs +6 -0
- package/esm2022/transforms/un-hang-range.mjs +11 -0
- package/esm2022/transforms/un-wrap.mjs +12 -0
- package/esm2022/transforms/unwrap-nodes-by-type.mjs +14 -0
- package/{esm2020 → esm2022}/utils/auto-focus.mjs +1 -1
- package/esm2022/utils/copy-node.mjs +32 -0
- package/esm2022/utils/create-empty-paragraph.mjs +5 -0
- package/esm2022/utils/create-paragraph.mjs +14 -0
- package/{esm2020 → esm2022}/utils/dom.mjs +1 -1
- package/esm2022/utils/editor-uuid.mjs +8 -0
- package/esm2022/utils/fragment.mjs +74 -0
- package/esm2022/utils/get-editable-element-height.mjs +6 -0
- package/esm2022/utils/get-toolbar-class.mjs +6 -0
- package/esm2022/utils/index.mjs +20 -0
- package/esm2022/utils/insert-data-by-invalid-type.mjs +62 -0
- package/esm2022/utils/is-clean-empty-paragraph.mjs +37 -0
- package/esm2022/utils/is-inline.mjs +9 -0
- package/{esm2020 → esm2022}/utils/match.mjs +1 -1
- package/esm2022/utils/merge-element-options.mjs +19 -0
- package/esm2022/utils/scroll-into-view.mjs +38 -0
- package/{fesm2020 → fesm2022}/worktile-theia.mjs +397 -388
- package/fesm2022/worktile-theia.mjs.map +1 -0
- package/interfaces/auto-format.d.ts +5 -5
- package/interfaces/editor.d.ts +8 -6
- package/interfaces/plugins/plugin-menu.d.ts +5 -5
- package/interfaces/plugins/with-override.d.ts +2 -2
- package/interfaces/reset-block-type-plugin-options.d.ts +3 -3
- package/interfaces/toolbar.d.ts +5 -5
- package/interfaces/view-base.d.ts +3 -2
- package/package.json +11 -17
- package/pipes.d.ts +3 -3
- package/plugins/align/align.editor.d.ts +4 -4
- package/plugins/align/align.plugin.d.ts +2 -1
- package/plugins/autoformat/autoformat.plugin.d.ts +2 -1
- package/plugins/autoformat/transforms/auto-format-block.d.ts +5 -4
- package/plugins/autoformat/transforms/auto-format-inline.d.ts +2 -2
- package/plugins/blockquote/blockquote.component.d.ts +3 -3
- package/plugins/blockquote/blockquote.editor.d.ts +2 -2
- package/plugins/blockquote/blockquote.plugin.d.ts +2 -1
- package/plugins/code/code.component.d.ts +2 -3
- package/plugins/code/code.editor.d.ts +3 -3
- package/plugins/code/code.plugin.d.ts +2 -1
- package/plugins/color/color.editor.d.ts +3 -3
- package/plugins/common/block-card.plugin.d.ts +2 -1
- package/plugins/common/common.plugin.d.ts +2 -1
- package/plugins/common/get-fragment.plugin.d.ts +2 -1
- package/plugins/common/history.plugin.d.ts +6 -6
- package/plugins/common/insert-data-by-invalid-type.d.ts +2 -1
- package/plugins/common/move-selection.plugin.d.ts +2 -1
- package/plugins/common/remove-empty.plugin.d.ts +2 -1
- package/plugins/common/remove-void.plugin.d.ts +2 -1
- package/plugins/common/reset-type.plugin.d.ts +2 -1
- package/plugins/common/transforms.plugin.d.ts +2 -1
- package/plugins/deserialize/deserialize-html.plugin.d.ts +2 -1
- package/plugins/deserialize/deserialize-md.plugin.d.ts +2 -1
- package/plugins/font-size/font-size.editor.d.ts +3 -4
- package/plugins/heading/heading.editor.d.ts +3 -4
- package/plugins/heading/heading.plugin.d.ts +2 -2
- package/plugins/hr/hr.component.d.ts +3 -3
- package/plugins/hr/hr.editor.d.ts +3 -3
- package/plugins/hr/hr.plugin.d.ts +2 -1
- package/plugins/image/image.component.d.ts +2 -3
- package/plugins/image/image.editor.d.ts +8 -7
- package/plugins/indent/indent.editor.d.ts +3 -4
- package/plugins/indent/indent.plugin.d.ts +2 -1
- package/plugins/indent/on-keydown-indent.d.ts +2 -2
- package/plugins/inline-code/inline-code.component.d.ts +2 -3
- package/plugins/inline-code/inline-code.editor.d.ts +6 -5
- package/plugins/inline-code/inline-code.plugin.d.ts +2 -1
- package/plugins/link/edit/link-edit.component.d.ts +4 -3
- package/plugins/link/hover/link-hover.component.d.ts +1 -1
- package/plugins/link/link.component.d.ts +2 -3
- package/plugins/link/link.editor.d.ts +5 -5
- package/plugins/link/link.plugin.d.ts +2 -1
- package/plugins/list/components/bulleted-list.component.d.ts +2 -3
- package/plugins/list/components/list-item.component.d.ts +3 -3
- package/plugins/list/components/numbered-list.component.d.ts +2 -3
- package/plugins/list/list.editor.d.ts +11 -9
- package/plugins/list/list.plugin.d.ts +2 -1
- package/plugins/list/normalizers/get-list-normalizer.d.ts +3 -2
- package/plugins/list/normalizers/normalize-list-item.d.ts +3 -2
- package/plugins/list/normalizers/normalize-no.d.ts +3 -2
- package/plugins/list/on-key-down-list.d.ts +2 -2
- package/plugins/list/queries/get-list-item-entry.d.ts +3 -2
- package/plugins/list/queries/get-start-list-item.d.ts +2 -2
- package/plugins/list/queries/has-list-in-list-item.d.ts +5 -4
- package/plugins/list/queries/is-in-list.d.ts +3 -2
- package/plugins/list/queries/is-list-nested.d.ts +3 -2
- package/plugins/list/queries/is-list.d.ts +2 -2
- package/plugins/list/queries/is-node-type-list.d.ts +2 -1
- package/plugins/list/queries/is-selection-at-list-item-start.d.ts +2 -2
- package/plugins/list/queries/is-selection-in-same-list-item.d.ts +2 -2
- package/plugins/list/transforms/insert-list-data.d.ts +5 -3
- package/plugins/list/transforms/insert-list-item.d.ts +2 -2
- package/plugins/list/transforms/move-list-item-down.d.ts +3 -2
- package/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.d.ts +3 -2
- package/plugins/list/transforms/move-list-item-sublist-items-to-list.d.ts +3 -2
- package/plugins/list/transforms/move-list-item-up.d.ts +3 -2
- package/plugins/list/transforms/unwrap-list.d.ts +2 -2
- package/plugins/mark/mark.editor.d.ts +3 -2
- package/plugins/mark/mark.plugin.d.ts +2 -1
- package/plugins/mention/mention.plugin.d.ts +2 -1
- package/plugins/mention/suggestion.component.d.ts +1 -1
- package/plugins/node-id/node-id.plugin.d.ts +2 -2
- package/plugins/normalizers/insert-paragraph-nodes.d.ts +2 -1
- package/plugins/normalizers/trailing-node.plugin.d.ts +2 -2
- package/plugins/quick-insert/components/quick-insert.component.d.ts +3 -3
- package/plugins/quick-insert/quick-insert.editor.d.ts +6 -6
- package/plugins/quick-insert/quick-insert.plugin.d.ts +3 -3
- package/plugins/table/components/insert-mark/insert-mark.component.d.ts +3 -3
- package/plugins/table/components/table.component.d.ts +2 -3
- package/plugins/table/components/td/td.component.d.ts +2 -2
- package/plugins/table/components/toolbar/table-options.component.d.ts +3 -3
- package/plugins/table/components/toolbar/table-toolbar.component.d.ts +3 -3
- package/plugins/table/table.editor.d.ts +11 -11
- package/plugins/table/table.store.d.ts +12 -12
- package/plugins/table/table.types.d.ts +4 -3
- package/plugins/table/transforms/clear-cell.d.ts +3 -2
- package/plugins/table/transforms/clear-table-node.d.ts +2 -2
- package/plugins/table/transforms/insert-column.d.ts +5 -4
- package/plugins/table/transforms/insert-row.d.ts +2 -2
- package/plugins/table/transforms/insert-table.d.ts +3 -2
- package/plugins/table/transforms/remove-column.d.ts +2 -2
- package/plugins/table/transforms/remove-row.d.ts +2 -2
- package/plugins/table/transforms/remove-table.d.ts +2 -2
- package/plugins/table/utils/calc-anchor-position.d.ts +2 -2
- package/plugins/table/utils/cell-position.d.ts +3 -3
- package/plugins/table/utils/create-table-position.d.ts +3 -2
- package/plugins/table/utils/get-min-max-cell-index.d.ts +2 -2
- package/plugins/table/utils/get-select-cell-node.d.ts +3 -3
- package/plugins/table/utils/handle-cell.d.ts +3 -2
- package/plugins/table/utils/is-range-in-table.d.ts +3 -2
- package/plugins/table/utils/is-selection-in-table.d.ts +3 -3
- package/plugins/table/utils/merge-cell.d.ts +6 -5
- package/plugins/table/utils/set-menu-cell-invisibility.d.ts +2 -2
- package/plugins/table/utils/split-cell.d.ts +3 -3
- package/plugins/table/utils/table-entry.d.ts +5 -5
- package/plugins/todo-item/todo-item.component.d.ts +2 -3
- package/plugins/todo-item/todo-item.editor.d.ts +3 -3
- package/plugins/todo-item/todo-item.plugin.d.ts +2 -1
- package/plugins/vertical-align/toolbar-item.component.d.ts +2 -3
- package/queries/anchor-block-entry.d.ts +4 -2
- package/queries/anchor-block.d.ts +3 -2
- package/queries/anchor-inline-entry.d.ts +3 -2
- package/queries/find-descendant.d.ts +3 -2
- package/queries/find-node.d.ts +3 -3
- package/queries/get-above-by-type.d.ts +2 -3
- package/queries/get-above.d.ts +3 -3
- package/queries/get-anchor-block-entry.d.ts +4 -2
- package/queries/get-block-above.d.ts +3 -3
- package/queries/get-block-card-above.d.ts +3 -3
- package/queries/get-block-card-cursor.d.ts +2 -2
- package/queries/get-container-blocks.d.ts +2 -2
- package/queries/get-last-node.d.ts +3 -2
- package/queries/get-node.d.ts +3 -2
- package/queries/get-nodes-by-type.d.ts +2 -3
- package/queries/get-nodes.d.ts +2 -3
- package/queries/get-parent.d.ts +3 -3
- package/queries/get-plain-text.d.ts +2 -2
- package/queries/get-plugin-by-toolbar.d.ts +2 -3
- package/queries/get-point-before.d.ts +3 -2
- package/queries/get-point-from-location.d.ts +3 -2
- package/queries/get-rang-from-block-start.d.ts +2 -3
- package/queries/get-range-before.d.ts +3 -2
- package/queries/get-selection-marks.d.ts +2 -2
- package/queries/get-selection-nodes-by-type.d.ts +3 -2
- package/queries/get-text.d.ts +3 -2
- package/queries/get-toolbar-disabled.d.ts +2 -3
- package/queries/is-across-blocks.d.ts +3 -2
- package/queries/is-ancestor-empty.d.ts +3 -2
- package/queries/is-block-above-empty.d.ts +2 -2
- package/queries/is-block-active.d.ts +2 -2
- package/queries/is-block-card-cursor.d.ts +2 -2
- package/queries/is-block-text-empty-after-selection.d.ts +2 -2
- package/queries/is-contain-nested-type.d.ts +2 -2
- package/queries/is-container-type.d.ts +3 -2
- package/queries/is-empty-content-filter.d.ts +2 -2
- package/queries/is-empty-paragraph-by-path.d.ts +3 -2
- package/queries/is-empty-paragraph.d.ts +6 -4
- package/queries/is-global-collapsed.d.ts +2 -2
- package/queries/is-include-types.d.ts +2 -2
- package/queries/is-node-type-in.d.ts +2 -3
- package/queries/is-paragraph.d.ts +2 -2
- package/queries/is-range-across-blocks.d.ts +3 -3
- package/queries/is-start.d.ts +3 -2
- package/queries/some-node.d.ts +3 -2
- package/shortcuts/index.d.ts +2 -2
- package/shortcuts/mark.d.ts +2 -2
- package/test/utils/with-editor.d.ts +2 -0
- package/transforms/clear-marks.d.ts +2 -2
- package/transforms/close-conversion-hint.d.ts +2 -2
- package/transforms/delete-element.d.ts +3 -2
- package/transforms/handle-continual-delete-backward.d.ts +4 -3
- package/transforms/handle-continual-insert-break.d.ts +3 -3
- package/transforms/insert-elements.d.ts +3 -2
- package/transforms/insert-paragraph.d.ts +3 -2
- package/transforms/move-children.d.ts +3 -2
- package/transforms/on-keydown-reset-block-type.d.ts +2 -2
- package/transforms/set-end-selection.d.ts +2 -2
- package/transforms/set-marks.d.ts +3 -2
- package/transforms/set-node.d.ts +3 -2
- package/transforms/un-hang-range.d.ts +3 -2
- package/transforms/un-wrap.d.ts +2 -2
- package/transforms/unwrap-nodes-by-type.d.ts +2 -3
- package/utils/auto-focus.d.ts +2 -2
- package/utils/copy-node.d.ts +5 -3
- package/utils/create-paragraph.d.ts +2 -0
- package/utils/dom.d.ts +2 -2
- package/utils/editor-uuid.d.ts +3 -3
- package/utils/fragment.d.ts +7 -5
- package/utils/get-editable-element-height.d.ts +2 -2
- package/utils/get-toolbar-class.d.ts +2 -2
- package/utils/index.d.ts +1 -0
- package/utils/is-clean-empty-paragraph.d.ts +4 -3
- package/utils/is-inline.d.ts +3 -2
- package/utils/match.d.ts +2 -2
- package/utils/merge-element-options.d.ts +1 -1
- package/utils/scroll-into-view.d.ts +2 -2
- package/esm2020/components/listbox/listbox.mjs +0 -375
- package/esm2020/components/plugin-menu/plugin-menu.component.mjs +0 -191
- package/esm2020/components/template/template.component.mjs +0 -62
- package/esm2020/components/toolbar/toolbar.component.mjs +0 -266
- package/esm2020/components/toolbar-dropdown/toolbar-dropdown.component.mjs +0 -144
- package/esm2020/components/toolbar-group/toolbar-group.component.mjs +0 -122
- package/esm2020/constants/auto-format-rules.mjs +0 -167
- package/esm2020/constants/plugin-menu.mjs +0 -325
- package/esm2020/core/toolbar-item/base-toolbar-item.mjs +0 -87
- package/esm2020/core/utils/plugin-menu.mjs +0 -33
- package/esm2020/custom-types.mjs +0 -2
- package/esm2020/editor.module.mjs +0 -254
- package/esm2020/interfaces/auto-format.mjs +0 -2
- package/esm2020/interfaces/editor.mjs +0 -25
- package/esm2020/interfaces/plugins/plugin-menu.mjs +0 -19
- package/esm2020/interfaces/plugins/with-override.mjs +0 -2
- package/esm2020/interfaces/reset-block-type-plugin-options.mjs +0 -2
- package/esm2020/interfaces/toolbar.mjs +0 -12
- package/esm2020/pipes.mjs +0 -42
- package/esm2020/plugins/align/align.editor.mjs +0 -43
- package/esm2020/plugins/align/align.plugin.mjs +0 -64
- package/esm2020/plugins/autoformat/transforms/auto-format-block.mjs +0 -14
- package/esm2020/plugins/autoformat/transforms/auto-format-inline.mjs +0 -78
- package/esm2020/plugins/blockquote/blockquote.component.mjs +0 -21
- package/esm2020/plugins/blockquote/blockquote.editor.mjs +0 -20
- package/esm2020/plugins/blockquote/blockquote.plugin.mjs +0 -85
- package/esm2020/plugins/code/code.editor.mjs +0 -48
- package/esm2020/plugins/color/color.editor.mjs +0 -27
- package/esm2020/plugins/common/history.plugin.mjs +0 -31
- package/esm2020/plugins/common/transforms.plugin.mjs +0 -18
- package/esm2020/plugins/deserialize/deserialize-html.plugin.mjs +0 -53
- package/esm2020/plugins/deserialize/deserialize-md.plugin.mjs +0 -130
- package/esm2020/plugins/font-size/font-size.editor.mjs +0 -98
- package/esm2020/plugins/heading/heading.editor.mjs +0 -54
- package/esm2020/plugins/heading/heading.plugin.mjs +0 -136
- package/esm2020/plugins/hr/hr.editor.mjs +0 -16
- package/esm2020/plugins/hr/hr.plugin.mjs +0 -56
- package/esm2020/plugins/image/image.component.mjs +0 -420
- package/esm2020/plugins/image/image.editor.mjs +0 -81
- package/esm2020/plugins/indent/indent.editor.mjs +0 -78
- package/esm2020/plugins/indent/on-keydown-indent.mjs +0 -59
- package/esm2020/plugins/inline-code/inline-code.component.mjs +0 -26
- package/esm2020/plugins/inline-code/inline-code.editor.mjs +0 -48
- package/esm2020/plugins/inline-code/inline-code.plugin.mjs +0 -66
- package/esm2020/plugins/link/edit/link-edit.component.mjs +0 -103
- package/esm2020/plugins/link/link.component.mjs +0 -167
- package/esm2020/plugins/link/link.editor.mjs +0 -66
- package/esm2020/plugins/list/components/bulleted-list.component.mjs +0 -33
- package/esm2020/plugins/list/components/list-item.component.mjs +0 -93
- package/esm2020/plugins/list/components/numbered-list.component.mjs +0 -39
- package/esm2020/plugins/list/list.editor.mjs +0 -126
- package/esm2020/plugins/list/list.plugin.mjs +0 -312
- package/esm2020/plugins/list/normalizers/get-list-normalizer.mjs +0 -39
- package/esm2020/plugins/list/normalizers/normalize-list-item.mjs +0 -18
- package/esm2020/plugins/list/normalizers/normalize-no.mjs +0 -43
- package/esm2020/plugins/list/on-key-down-list.mjs +0 -33
- package/esm2020/plugins/list/queries/get-list-item-entry.mjs +0 -28
- package/esm2020/plugins/list/queries/get-start-list-item.mjs +0 -27
- package/esm2020/plugins/list/queries/has-list-in-list-item.mjs +0 -27
- package/esm2020/plugins/list/queries/is-in-list.mjs +0 -6
- package/esm2020/plugins/list/queries/is-list-nested.mjs +0 -10
- package/esm2020/plugins/list/queries/is-list.mjs +0 -5
- package/esm2020/plugins/list/queries/is-selection-at-list-item-start.mjs +0 -13
- package/esm2020/plugins/list/queries/is-selection-in-same-list-item.mjs +0 -17
- package/esm2020/plugins/list/transforms/insert-list-data.mjs +0 -72
- package/esm2020/plugins/list/transforms/insert-list-item.mjs +0 -73
- package/esm2020/plugins/list/transforms/move-list-item-down.mjs +0 -41
- package/esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +0 -43
- package/esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +0 -30
- package/esm2020/plugins/list/transforms/move-list-item-up.mjs +0 -78
- package/esm2020/plugins/list/transforms/unwrap-list.mjs +0 -10
- package/esm2020/plugins/mark/mark.editor.mjs +0 -28
- package/esm2020/plugins/mention/mention.plugin.mjs +0 -91
- package/esm2020/plugins/normalizers/remove-empty-nodes.mjs +0 -18
- package/esm2020/plugins/quick-insert/quick-insert.editor.mjs +0 -68
- package/esm2020/plugins/quick-insert/quick-insert.plugin.mjs +0 -104
- package/esm2020/plugins/table/components/insert-mark/insert-mark.component.mjs +0 -104
- package/esm2020/plugins/table/components/toolbar/table-toolbar.component.mjs +0 -189
- package/esm2020/plugins/table/table.editor.mjs +0 -209
- package/esm2020/plugins/table/table.plugin.mjs +0 -544
- package/esm2020/plugins/table/table.store.mjs +0 -426
- package/esm2020/plugins/table/table.types.mjs +0 -60
- package/esm2020/plugins/table/transforms/clear-cell.mjs +0 -14
- package/esm2020/plugins/table/transforms/clear-table-node.mjs +0 -27
- package/esm2020/plugins/table/transforms/insert-column.mjs +0 -69
- package/esm2020/plugins/table/transforms/insert-row.mjs +0 -50
- package/esm2020/plugins/table/transforms/insert-table.mjs +0 -15
- package/esm2020/plugins/table/transforms/remove-column.mjs +0 -51
- package/esm2020/plugins/table/transforms/remove-row.mjs +0 -48
- package/esm2020/plugins/table/transforms/remove-table.mjs +0 -49
- package/esm2020/plugins/table/utils/calc-anchor-position.mjs +0 -25
- package/esm2020/plugins/table/utils/cell-position.mjs +0 -60
- package/esm2020/plugins/table/utils/create-table-position.mjs +0 -10
- package/esm2020/plugins/table/utils/get-min-max-cell-index.mjs +0 -69
- package/esm2020/plugins/table/utils/get-select-cell-node.mjs +0 -23
- package/esm2020/plugins/table/utils/handle-cell.mjs +0 -25
- package/esm2020/plugins/table/utils/is-range-in-table.mjs +0 -16
- package/esm2020/plugins/table/utils/is-selection-in-table.mjs +0 -51
- package/esm2020/plugins/table/utils/merge-cell.mjs +0 -108
- package/esm2020/plugins/table/utils/set-menu-cell-invisibility.mjs +0 -45
- package/esm2020/plugins/table/utils/split-cell.mjs +0 -29
- package/esm2020/plugins/table/utils/table-entry.mjs +0 -21
- package/esm2020/plugins/todo-item/todo-item.editor.mjs +0 -32
- package/esm2020/plugins/todo-item/todo-item.plugin.mjs +0 -93
- package/esm2020/plugins/vertical-align/toolbar-item.component.mjs +0 -83
- package/esm2020/queries/anchor-block-entry.mjs +0 -13
- package/esm2020/queries/anchor-block.mjs +0 -6
- package/esm2020/queries/anchor-inline-entry.mjs +0 -10
- package/esm2020/queries/find-node.mjs +0 -45
- package/esm2020/queries/get-above-by-type.mjs +0 -14
- package/esm2020/queries/get-above.mjs +0 -9
- package/esm2020/queries/get-anchor-block-entry.mjs +0 -8
- package/esm2020/queries/get-block-above.mjs +0 -10
- package/esm2020/queries/get-block-card-above.mjs +0 -10
- package/esm2020/queries/get-block-card-cursor.mjs +0 -5
- package/esm2020/queries/get-container-blocks.mjs +0 -12
- package/esm2020/queries/get-insert-elements-path.mjs +0 -44
- package/esm2020/queries/get-node.mjs +0 -10
- package/esm2020/queries/get-nodes-by-type.mjs +0 -15
- package/esm2020/queries/get-nodes.mjs +0 -7
- package/esm2020/queries/get-parent.mjs +0 -12
- package/esm2020/queries/get-plain-text.mjs +0 -16
- package/esm2020/queries/get-plugin-by-toolbar.mjs +0 -13
- package/esm2020/queries/get-point-from-location.mjs +0 -15
- package/esm2020/queries/get-rang-from-block-start.mjs +0 -16
- package/esm2020/queries/get-range-before.mjs +0 -17
- package/esm2020/queries/get-selection-nodes-by-type.mjs +0 -30
- package/esm2020/queries/get-text.mjs +0 -9
- package/esm2020/queries/get-toolbar-disabled.mjs +0 -13
- package/esm2020/queries/is-across-blocks.mjs +0 -7
- package/esm2020/queries/is-ancestor-empty.mjs +0 -6
- package/esm2020/queries/is-block-above-empty.mjs +0 -11
- package/esm2020/queries/is-block-active.mjs +0 -8
- package/esm2020/queries/is-block-card-cursor.mjs +0 -4
- package/esm2020/queries/is-contain-nested-type.mjs +0 -29
- package/esm2020/queries/is-container-type.mjs +0 -3
- package/esm2020/queries/is-empty-content-filter.mjs +0 -23
- package/esm2020/queries/is-empty-paragraph-by-path.mjs +0 -7
- package/esm2020/queries/is-empty-paragraph.mjs +0 -28
- package/esm2020/queries/is-global-collapsed.mjs +0 -5
- package/esm2020/queries/is-include-types.mjs +0 -12
- package/esm2020/queries/is-node-type-in.mjs +0 -9
- package/esm2020/queries/is-node-type.mjs +0 -15
- package/esm2020/queries/is-paragraph.mjs +0 -9
- package/esm2020/queries/is-range-across-blocks.mjs +0 -22
- package/esm2020/queries/is-start.mjs +0 -6
- package/esm2020/queries/some-node.mjs +0 -9
- package/esm2020/shortcuts/mark.mjs +0 -25
- package/esm2020/test/utils/with-plugin.mjs +0 -11
- package/esm2020/transforms/close-conversion-hint.mjs +0 -8
- package/esm2020/transforms/handle-continual-delete-backward.mjs +0 -18
- package/esm2020/transforms/handle-continual-insert-break.mjs +0 -20
- package/esm2020/transforms/insert-elements.mjs +0 -38
- package/esm2020/transforms/insert-paragraph.mjs +0 -6
- package/esm2020/transforms/move-children.mjs +0 -22
- package/esm2020/transforms/on-keydown-reset-block-type.mjs +0 -23
- package/esm2020/transforms/set-marks.mjs +0 -9
- package/esm2020/transforms/set-node.mjs +0 -6
- package/esm2020/transforms/un-hang-range.mjs +0 -11
- package/esm2020/transforms/un-wrap.mjs +0 -12
- package/esm2020/transforms/unwrap-nodes-by-type.mjs +0 -14
- package/esm2020/utils/copy-node.mjs +0 -32
- package/esm2020/utils/create-empty-paragraph.mjs +0 -14
- package/esm2020/utils/editor-uuid.mjs +0 -8
- package/esm2020/utils/fragment.mjs +0 -74
- package/esm2020/utils/get-editable-element-height.mjs +0 -6
- package/esm2020/utils/get-toolbar-class.mjs +0 -6
- package/esm2020/utils/index.mjs +0 -19
- package/esm2020/utils/insert-data-by-invalid-type.mjs +0 -62
- package/esm2020/utils/is-clean-empty-paragraph.mjs +0 -37
- package/esm2020/utils/is-inline.mjs +0 -9
- package/esm2020/utils/merge-element-options.mjs +0 -19
- package/esm2020/utils/scroll-into-view.mjs +0 -38
- package/fesm2015/worktile-theia.mjs +0 -16674
- package/fesm2015/worktile-theia.mjs.map +0 -1
- package/fesm2020/worktile-theia.mjs.map +0 -1
- /package/{esm2020 → esm2022}/components/column-resize/resize-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/components/column-resize/selectors.mjs +0 -0
- /package/{esm2020 → esm2022}/components/index.mjs +0 -0
- /package/{esm2020 → esm2022}/components/listbox/listbox.type.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/code.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/color-select.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/default.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/error.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/index.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/node-types.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/selector.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/toolbar.mjs +0 -0
- /package/{esm2020 → esm2022}/core/create-plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/core/create-toolbar.mjs +0 -0
- /package/{esm2020 → esm2022}/core/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/flatten-deep-plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/get-plugin-options.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/get-plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/get-plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/merge-array.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/merge-deep-plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/merge-options.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/nested-structure-by-key.mjs +0 -0
- /package/{esm2020 → esm2022}/core/utils/plugins-by-key.mjs +0 -0
- /package/{esm2020 → esm2022}/core/with-theia.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/element.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/image.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/index.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/index.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/no-infer.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/plugin-key.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugins/plugins.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/upload.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/utility/index.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/utility/nested-structure-by-key.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/utility/override-by-key.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/utility/types.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/valid-children-types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/color/color.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/image/image.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/link/link.types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/get-list-item-sublist.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/queries/get-list-types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/list/types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/mention/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/mention/mention.type.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/soft-break/soft-break.plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/soft-break/soft-break.types.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/transforms/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/add-columns.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/calc-span.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/calculate-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/create-cell.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/create-row.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/create-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/get-grid-columns.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/is-header-row.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/is-legal-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/is-virtual-key.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/next-path.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/normalize-table.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/remove-columns.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/remove-row-column.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/set-cells-background-color.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/set-node-options.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/table/utils/table-position.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/vertical-align/vertical-align.editor.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/find-path.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-directly-parent.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-last-child-path.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-next-sibling-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/get-previous-path.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/index.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-ancestor.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-collapsed.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-descendant.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-first-child.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-point-at-root.mjs +0 -0
- /package/{esm2020 → esm2022}/queries/is-range-at-root.mjs +0 -0
- /package/{esm2020 → esm2022}/test/index.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/apply-deep-to-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/index.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/merge-deep-to-nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/blob.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/cast-array.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/color-picker.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/common.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/data-transform.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/id-creator.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/lodash.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/refocus.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/weak-maps.mjs +0 -0
- /package/{esm2020 → esm2022}/worktile-theia.mjs +0 -0
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { Transforms, Node, Range, Editor, Element, Path, Operation } from 'slate';
|
|
2
|
+
import { AngularEditor, ELEMENT_TO_COMPONENT, hotkeys } from 'slate-angular';
|
|
3
|
+
import { TableOptions } from './table.types';
|
|
4
|
+
import { isRangeInTable, isSelectionInTable, TablePosition } from './utils';
|
|
5
|
+
import { PluginKeys, TheEditor } from '../../interfaces';
|
|
6
|
+
import { ElementKinds } from '../../constants/node-types';
|
|
7
|
+
import { TheTableComponent } from './components/table.component';
|
|
8
|
+
import { TableEditor } from './table.editor';
|
|
9
|
+
import { clearTableNode } from './transforms/clear-table-node';
|
|
10
|
+
import { isVirtualKey } from './utils/is-virtual-key';
|
|
11
|
+
import { insertColumnAtRow } from './transforms/insert-column';
|
|
12
|
+
import { calculateAnchorPositionInCell } from './utils/calc-anchor-position';
|
|
13
|
+
import { CLIPBOARD_FORMAT_KEY } from '../../constants/default';
|
|
14
|
+
import { getOriginCell } from './utils/calc-span';
|
|
15
|
+
import { resetTableCell } from './utils/split-cell';
|
|
16
|
+
import { removeColumns } from './utils/remove-columns';
|
|
17
|
+
import { addColumns } from './utils/add-columns';
|
|
18
|
+
import { TheTableRowComponent } from './components/row/row.component';
|
|
19
|
+
import { TheTdComponent } from './components/td/td.component';
|
|
20
|
+
import { extractFragment } from '../../utils/fragment';
|
|
21
|
+
import * as TheQueries from '../../queries';
|
|
22
|
+
import { normalizeTable } from './utils/normalize-table';
|
|
23
|
+
import { cloneDeep } from '../../utils/lodash';
|
|
24
|
+
import { createPluginFactory } from '../../core';
|
|
25
|
+
import { TheTableToolbarItemComponent } from './toolbar-item.component';
|
|
26
|
+
import { PluginMenuIcons, ThePluginMenuItemType } from '../../constants/plugin-menu';
|
|
27
|
+
import { isSelectedCellMerged } from './utils/merge-cell';
|
|
28
|
+
import { timer } from 'rxjs';
|
|
29
|
+
import { isLegalTable } from './utils/is-legal-table';
|
|
30
|
+
import { createEmptyParagraph } from '../../utils/create-empty-paragraph';
|
|
31
|
+
import { createTablePosition } from './utils/create-table-position';
|
|
32
|
+
export const withTable = (editor) => {
|
|
33
|
+
const { deleteBackward, deleteForward, onKeydown, setFragmentData, insertData, normalizeNode, isBlockCard, renderElement, deleteCutData, isContainer, onChange, onClick } = editor;
|
|
34
|
+
editor.deleteBackward = unit => {
|
|
35
|
+
const opts = new TableOptions();
|
|
36
|
+
if (!isSelectionInTable(opts, editor)) {
|
|
37
|
+
deleteBackward(unit);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const { selection } = editor;
|
|
41
|
+
const [, startBlockPath] = Editor.above(editor, {
|
|
42
|
+
match: (n) => Editor.isBlock(editor, n)
|
|
43
|
+
});
|
|
44
|
+
const startPosition = createTablePosition(editor);
|
|
45
|
+
if (startBlockPath.length <= startPosition.cellEntry[1].length + 1 &&
|
|
46
|
+
startBlockPath.pop() === 0 &&
|
|
47
|
+
selection.anchor.offset === 0 &&
|
|
48
|
+
TheQueries.isStart(editor, selection.anchor, startBlockPath) &&
|
|
49
|
+
!Editor.isVoid(editor, TheQueries.anchorBlock(editor))) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
deleteBackward(unit);
|
|
53
|
+
};
|
|
54
|
+
editor.deleteForward = unit => {
|
|
55
|
+
const opts = new TableOptions();
|
|
56
|
+
const afterPoint = Editor.after(editor, editor.selection);
|
|
57
|
+
if (afterPoint && isRangeInTable(opts, editor, { anchor: afterPoint, focus: afterPoint })) {
|
|
58
|
+
const beforePosition = createTablePosition(editor);
|
|
59
|
+
const afterPosition = createTablePosition(editor, afterPoint.path);
|
|
60
|
+
if (beforePosition.cell && beforePosition.cell !== afterPosition.cell) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
deleteForward(unit);
|
|
65
|
+
};
|
|
66
|
+
editor.onClick = (event) => {
|
|
67
|
+
if (event.detail === 3) {
|
|
68
|
+
const isMergedCell = isSelectedCellMerged(editor);
|
|
69
|
+
const domSelection = window.getSelection();
|
|
70
|
+
if (domSelection && !domSelection.isCollapsed && editor.selection) {
|
|
71
|
+
const slateSelection = AngularEditor.toSlateRange(editor, domSelection);
|
|
72
|
+
const opts = new TableOptions();
|
|
73
|
+
const startPosition = TablePosition.create(opts, editor, slateSelection.anchor.path);
|
|
74
|
+
const endPosition = TablePosition.create(opts, editor, slateSelection.focus.path);
|
|
75
|
+
if (isMergedCell && startPosition.cell !== endPosition.cell) {
|
|
76
|
+
timer(81).subscribe(() => {
|
|
77
|
+
Transforms.select(editor, slateSelection.anchor.path);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
onClick(event);
|
|
83
|
+
};
|
|
84
|
+
editor.onKeydown = (event) => {
|
|
85
|
+
const opts = new TableOptions();
|
|
86
|
+
const isMoveUp = hotkeys.isMoveUp(event);
|
|
87
|
+
const isMoveDown = hotkeys.isMoveDown(event);
|
|
88
|
+
const isMoveBackward = hotkeys.isMoveBackward(event);
|
|
89
|
+
const isMoveForward = hotkeys.isMoveForward(event);
|
|
90
|
+
const { selection } = editor;
|
|
91
|
+
if (!selection || !selection.anchor || !selection.focus) {
|
|
92
|
+
onKeydown(event);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const startPosition = createTablePosition(editor);
|
|
96
|
+
const endPosition = createTablePosition(editor, selection.focus.path);
|
|
97
|
+
const isCollapsed = Range.isCollapsed(selection);
|
|
98
|
+
if (startPosition && endPosition && endPosition.isInTable()) {
|
|
99
|
+
// for keyboard up and down key in the table
|
|
100
|
+
if (isMoveUp || isMoveDown) {
|
|
101
|
+
const cellPath = endPosition.cellEntry[1];
|
|
102
|
+
const startPath = Editor.start(editor, cellPath).path;
|
|
103
|
+
const endPath = Editor.end(editor, cellPath).path;
|
|
104
|
+
const { isFirstLine, isLastLine } = calculateAnchorPositionInCell(editor);
|
|
105
|
+
startPath.pop();
|
|
106
|
+
endPath.pop();
|
|
107
|
+
if ((TheQueries.anchorBlockEntry(editor)[1].toString() !== startPath.toString() || !isFirstLine) && isMoveUp) {
|
|
108
|
+
onKeydown(event);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if ((TheQueries.anchorBlockEntry(editor)[1].toString() !== endPath.toString() || !isLastLine) && isMoveDown) {
|
|
112
|
+
onKeydown(event);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
event.preventDefault();
|
|
116
|
+
let at;
|
|
117
|
+
if (isMoveUp) {
|
|
118
|
+
const aboveRow = startPosition.table.children[startPosition.getRowIndex() - 1];
|
|
119
|
+
const aboveCell = aboveRow && aboveRow.children[startPosition.getColumnIndex()];
|
|
120
|
+
if (aboveCell) {
|
|
121
|
+
if (aboveCell.hidden) {
|
|
122
|
+
TableEditor.selectOriginCell(editor, startPosition.table, startPosition.getRowIndex() - 1, startPosition.getColumnIndex(), false);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
at = Editor.end(editor, TheEditor.findPath(editor, aboveCell));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const previousNodeEntry = Editor.previous(editor, { at: startPosition.tableEntry[1] });
|
|
131
|
+
const beforePoint = Editor.before(editor, startPosition.tableEntry[1]);
|
|
132
|
+
Editor.next(editor, { at: startPosition.tableEntry[1] });
|
|
133
|
+
if (previousNodeEntry) {
|
|
134
|
+
at = Editor.end(editor, previousNodeEntry[1]);
|
|
135
|
+
}
|
|
136
|
+
if (!previousNodeEntry && beforePoint) {
|
|
137
|
+
at = Editor.end(editor, beforePoint.path);
|
|
138
|
+
}
|
|
139
|
+
if (!previousNodeEntry && !beforePoint) {
|
|
140
|
+
AngularEditor.moveBlockCard(editor, startPosition.tableEntry[0], { direction: 'left' });
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
Transforms.select(editor, at);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
let belowRowIndex = startPosition.getRowIndex() + 1;
|
|
148
|
+
if (startPosition.cell.rowspan > 1) {
|
|
149
|
+
belowRowIndex = startPosition.getRowIndex() + startPosition.cell.rowspan;
|
|
150
|
+
}
|
|
151
|
+
const belowRow = startPosition.table.children[belowRowIndex];
|
|
152
|
+
const belowCell = belowRow && belowRow.children[startPosition.getColumnIndex()];
|
|
153
|
+
if (belowCell) {
|
|
154
|
+
if (belowCell.hidden) {
|
|
155
|
+
TableEditor.selectOriginCell(editor, startPosition.table, startPosition.getRowIndex() + 1, startPosition.getColumnIndex(), true);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
at = Editor.start(editor, TheEditor.findPath(editor, belowCell));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const nextNodeEntry = Editor.next(editor, { at: startPosition.tableEntry[1] });
|
|
164
|
+
const movePath = nextNodeEntry ? nextNodeEntry[1] : Editor.after(editor, startPosition.tableEntry[1]).path;
|
|
165
|
+
at = Editor.start(editor, movePath);
|
|
166
|
+
}
|
|
167
|
+
Transforms.select(editor, at);
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (isMoveBackward) {
|
|
172
|
+
const beforePoint = Editor.before(editor, editor.selection);
|
|
173
|
+
const beforePosition = beforePoint && createTablePosition(editor, beforePoint.path);
|
|
174
|
+
if (beforePosition && beforePosition.cell && beforePosition.cell.hidden) {
|
|
175
|
+
event.preventDefault();
|
|
176
|
+
const at = Editor.end(editor, TheEditor.findPath(editor, beforePosition.findPrevious()));
|
|
177
|
+
Transforms.select(editor, at);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (isMoveForward) {
|
|
181
|
+
const afterPoint = Editor.after(editor, editor.selection);
|
|
182
|
+
const afterPosition = afterPoint && createTablePosition(editor, afterPoint.path);
|
|
183
|
+
if (afterPosition.cell && afterPosition.cell.hidden) {
|
|
184
|
+
event.preventDefault();
|
|
185
|
+
const nextCell = afterPosition.findNext();
|
|
186
|
+
if (nextCell) {
|
|
187
|
+
const at = Editor.start(editor, TheEditor.findPath(editor, afterPosition.findNext()));
|
|
188
|
+
Transforms.select(editor, at);
|
|
189
|
+
event.preventDefault();
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
AngularEditor.moveBlockCard(editor, startPosition.tableEntry[0], { direction: 'right' });
|
|
193
|
+
event.preventDefault();
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Prevent deleting cells in the table
|
|
199
|
+
if (!isCollapsed && !startPosition.isInTable() && !isVirtualKey(event)) {
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
let tableOutPath;
|
|
202
|
+
Editor.withoutNormalizing(editor, () => {
|
|
203
|
+
if (Range.isForward(selection)) {
|
|
204
|
+
tableOutPath = Editor.end(editor, [selection.focus.path[0] - 1]);
|
|
205
|
+
clearTableNode(opts, editor, true);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
tableOutPath = Editor.start(editor, [selection.focus.path[0] + 1]);
|
|
209
|
+
clearTableNode(opts, editor);
|
|
210
|
+
}
|
|
211
|
+
const tableOutRange = Editor.range(editor, selection.anchor, tableOutPath);
|
|
212
|
+
Transforms.delete(editor, { at: tableOutRange });
|
|
213
|
+
});
|
|
214
|
+
// new range
|
|
215
|
+
const cellRange = Editor.range(editor, editor.selection.focus.path.slice(0, 3));
|
|
216
|
+
const focusRange = Range.intersection(editor.selection, cellRange);
|
|
217
|
+
Transforms.select(editor, focusRange);
|
|
218
|
+
Editor.deleteFragment(editor);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
onKeydown(event);
|
|
223
|
+
return;
|
|
224
|
+
};
|
|
225
|
+
editor.setFragmentData = unit => {
|
|
226
|
+
const opts = new TableOptions();
|
|
227
|
+
if (!isSelectionInTable(opts, editor)) {
|
|
228
|
+
setFragmentData(unit);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const tablePosition = createTablePosition(editor);
|
|
232
|
+
const tableComponent = ELEMENT_TO_COMPONENT.get(tablePosition.table);
|
|
233
|
+
const selectedCellPositions = tableComponent.tableStore.getSelectedCellPositions();
|
|
234
|
+
let tableFragment = null;
|
|
235
|
+
if (tableComponent.tableStore.selectedRowsIndex.length > 0) {
|
|
236
|
+
const rows = tablePosition.table.children.slice(tableComponent.tableStore.selectedRowsIndex[0], tableComponent.tableStore.selectedRowsIndex[tableComponent.tableStore.selectedRowsIndex.length - 1] + 1);
|
|
237
|
+
tableFragment = {
|
|
238
|
+
...tablePosition.table,
|
|
239
|
+
children: rows
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
else if (selectedCellPositions.length > 0) {
|
|
243
|
+
const tempRows = {};
|
|
244
|
+
for (const cell of selectedCellPositions) {
|
|
245
|
+
const { row, col } = cell;
|
|
246
|
+
const cellPath = [...tablePosition.tableEntry[1], row, col];
|
|
247
|
+
const cellNode = Node.get(editor, cellPath);
|
|
248
|
+
if (!tempRows[row]) {
|
|
249
|
+
tempRows[row] = [];
|
|
250
|
+
}
|
|
251
|
+
tempRows[row].push(cellNode);
|
|
252
|
+
}
|
|
253
|
+
const rows = Object.values(tempRows).map((item) => {
|
|
254
|
+
return {
|
|
255
|
+
type: ElementKinds.tableRow,
|
|
256
|
+
children: item
|
|
257
|
+
};
|
|
258
|
+
});
|
|
259
|
+
tableFragment = {
|
|
260
|
+
type: ElementKinds.table,
|
|
261
|
+
children: rows
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
if (tableFragment) {
|
|
265
|
+
tableFragment = normalizeTable(cloneDeep(tableFragment));
|
|
266
|
+
const plainText = Node.string(tableFragment);
|
|
267
|
+
tableFragment = [tableFragment];
|
|
268
|
+
const stringObj = JSON.stringify(tableFragment);
|
|
269
|
+
const encoded = window.btoa(encodeURIComponent(stringObj));
|
|
270
|
+
unit.setData(`application/${CLIPBOARD_FORMAT_KEY}`, encoded);
|
|
271
|
+
unit.setData('text/plain', plainText);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
setFragmentData(unit);
|
|
275
|
+
};
|
|
276
|
+
editor.insertData = data => {
|
|
277
|
+
const fragment = extractFragment(data);
|
|
278
|
+
if (fragment) {
|
|
279
|
+
const opts = new TableOptions();
|
|
280
|
+
const { selection } = editor;
|
|
281
|
+
if (isSelectionInTable(opts, editor) &&
|
|
282
|
+
fragment.length === 1 &&
|
|
283
|
+
Element.isElement(fragment[0]) &&
|
|
284
|
+
fragment[0].type === ElementKinds.table) {
|
|
285
|
+
const tablePosition = createTablePosition(editor);
|
|
286
|
+
const clipboardTable = fragment[0].children;
|
|
287
|
+
const clipboardRow = clipboardTable[0].children;
|
|
288
|
+
const selectRowIndex = tablePosition.getRowIndex();
|
|
289
|
+
const selectColIndex = tablePosition.getColumnIndex();
|
|
290
|
+
const lastRowIndex = selectRowIndex + clipboardTable.length - 1;
|
|
291
|
+
const lastColIndex = selectColIndex + clipboardRow.length - 1;
|
|
292
|
+
for (let i = selectRowIndex; i <= lastRowIndex; i++) {
|
|
293
|
+
for (let j = selectColIndex; j <= lastColIndex; j++) {
|
|
294
|
+
const row = tablePosition.table.children[i];
|
|
295
|
+
if (row && row.children[j]) {
|
|
296
|
+
const originCell = getOriginCell(tablePosition.table, i, j);
|
|
297
|
+
if (originCell && (originCell.colspan || originCell.rowspan)) {
|
|
298
|
+
const path = TheEditor.findPath(editor, originCell).slice(-2);
|
|
299
|
+
resetTableCell(editor, tablePosition.table, originCell, path[0], path[1]);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
Editor.withoutNormalizing(editor, () => {
|
|
305
|
+
if (lastColIndex > tablePosition.getWidth() - 1) {
|
|
306
|
+
const addColCount = lastColIndex - (tablePosition.getWidth() - 1);
|
|
307
|
+
TableEditor.insertColumn(editor, addColCount, tablePosition.getWidth());
|
|
308
|
+
}
|
|
309
|
+
if (lastRowIndex > tablePosition.getHeight() - 1) {
|
|
310
|
+
const addRowCount = lastRowIndex - (tablePosition.getHeight() - 1);
|
|
311
|
+
TableEditor.insertRow(editor, addRowCount, tablePosition.getHeight());
|
|
312
|
+
}
|
|
313
|
+
clipboardTable.forEach((row, i) => {
|
|
314
|
+
row.children.forEach((col, j) => {
|
|
315
|
+
const at = [...tablePosition.tableEntry[1], selectRowIndex + i, selectColIndex + j];
|
|
316
|
+
Transforms.removeNodes(editor, { at });
|
|
317
|
+
Transforms.insertNodes(editor, col, { at });
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
const target = Editor.start(editor, [...tablePosition.tableEntry[1], selectRowIndex, selectColIndex]);
|
|
322
|
+
Transforms.select(editor, target);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
// when pasting data, the last one is a table, and the focus position is specially handled
|
|
326
|
+
// * this is to focus after withTrailingNode.normalizeNode() to avoid incorrect focus element.
|
|
327
|
+
// * if there is a node below, the focus will be on the left side of the node below.
|
|
328
|
+
// * if there is no node below, the focus will be on the right side of the current table.
|
|
329
|
+
const lastInsertNode = fragment[fragment.length - 1];
|
|
330
|
+
const isTable = lastInsertNode.type === ElementKinds.table;
|
|
331
|
+
if (isTable) {
|
|
332
|
+
setTimeout(() => {
|
|
333
|
+
Editor.withoutNormalizing(editor, () => {
|
|
334
|
+
const [, currentPath] = TheQueries.findNode(editor, {
|
|
335
|
+
match: (n) => Element.isElement(n) && n.type === ElementKinds.table
|
|
336
|
+
});
|
|
337
|
+
const nextPath = Path.next(currentPath);
|
|
338
|
+
const hasNextNode = Node.has(editor, nextPath);
|
|
339
|
+
const focusPath = hasNextNode ? nextPath : currentPath;
|
|
340
|
+
const focusNode = Node.get(editor, focusPath);
|
|
341
|
+
const isBlockCard = editor.isBlockCard(focusNode);
|
|
342
|
+
const cursorPath = {
|
|
343
|
+
path: focusPath,
|
|
344
|
+
offset: isBlockCard ? (hasNextNode ? -1 : -2) : 0
|
|
345
|
+
};
|
|
346
|
+
Transforms.select(editor, cursorPath);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
insertData(data);
|
|
352
|
+
};
|
|
353
|
+
editor.normalizeNode = ([node, path]) => {
|
|
354
|
+
if (Element.isElement(node) && node.type === ElementKinds.table) {
|
|
355
|
+
const table = node;
|
|
356
|
+
const maxWidth = Math.max(...table.children.map(row => row.children.length));
|
|
357
|
+
const invalidRows = table.children.filter(row => row.children.length < maxWidth);
|
|
358
|
+
if (invalidRows.length > 0) {
|
|
359
|
+
const opts = new TableOptions();
|
|
360
|
+
Editor.withoutNormalizing(editor, () => {
|
|
361
|
+
table.children.map((row, rowIndex) => {
|
|
362
|
+
row.children.map((cell, cellIndex) => {
|
|
363
|
+
if (cell.hidden || cell.colspan || cell.rowspan) {
|
|
364
|
+
Transforms.setNodes(editor, { hidden: null, colspan: null, rowspan: null }, { at: [...path, rowIndex, cellIndex] });
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
invalidRows.forEach(row => {
|
|
369
|
+
const count = maxWidth - row.children.length;
|
|
370
|
+
insertColumnAtRow(opts, editor, count, [node, path], table.children.indexOf(row), row.children.length);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
if (table.columns && table.columns.length !== maxWidth) {
|
|
375
|
+
const columns = table.columns.length > maxWidth ? removeColumns(table, maxWidth) : addColumns(table, maxWidth);
|
|
376
|
+
Transforms.setNodes(editor, { columns }, { at: path });
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// noramlize illegal cell and row to be paragraph
|
|
380
|
+
if (Element.isElement(node) && [ElementKinds.tableCell, ElementKinds.tableRow].includes(node.type)) {
|
|
381
|
+
if (!isLegalTable(editor, node, path)) {
|
|
382
|
+
try {
|
|
383
|
+
const rootPath = [path[0]];
|
|
384
|
+
const offset = editor.selection.focus.offset;
|
|
385
|
+
// find all tableCell and tableRow
|
|
386
|
+
const nodes = Editor.nodes(editor, {
|
|
387
|
+
at: rootPath,
|
|
388
|
+
mode: 'lowest',
|
|
389
|
+
match: (node) => {
|
|
390
|
+
return node.type === ElementKinds.tableCell;
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
let cursorPath = path[0];
|
|
394
|
+
if (nodes) {
|
|
395
|
+
let index = 0;
|
|
396
|
+
// noramlize to be paragraph
|
|
397
|
+
for (const [targetNode, targetPath] of nodes) {
|
|
398
|
+
index++;
|
|
399
|
+
const paragraph = createEmptyParagraph();
|
|
400
|
+
const text = Node.string(targetNode);
|
|
401
|
+
paragraph.children[0].text = text;
|
|
402
|
+
if (targetNode.key === node.key) {
|
|
403
|
+
cursorPath = rootPath[0] + index;
|
|
404
|
+
}
|
|
405
|
+
Transforms.insertNodes(editor, paragraph, { at: [rootPath[0] + index] });
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
const cursor = { path: [cursorPath, 0], offset: offset };
|
|
409
|
+
Transforms.select(editor, { anchor: cursor, focus: cursor });
|
|
410
|
+
// remove root node
|
|
411
|
+
Transforms.removeNodes(editor, {
|
|
412
|
+
at: rootPath
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
catch (error) { }
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// adjust selection when selection is in hidden cell
|
|
420
|
+
if (Element.isElement(node) && node.type === ElementKinds.tableCell) {
|
|
421
|
+
if (editor.selection &&
|
|
422
|
+
Range.isCollapsed(editor.selection) &&
|
|
423
|
+
Path.isAncestor(path, editor.selection.anchor.path) &&
|
|
424
|
+
node.hidden) {
|
|
425
|
+
setTimeout(() => {
|
|
426
|
+
const opts = new TableOptions();
|
|
427
|
+
const tablePosition = createTablePosition(editor);
|
|
428
|
+
const origin = getOriginCell(tablePosition.table, tablePosition.getRowIndex(), tablePosition.getColumnIndex());
|
|
429
|
+
if (origin) {
|
|
430
|
+
const path = AngularEditor.findPath(editor, origin);
|
|
431
|
+
Transforms.select(editor, Editor.end(editor, path));
|
|
432
|
+
}
|
|
433
|
+
}, 0);
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
normalizeNode([node, path]);
|
|
438
|
+
};
|
|
439
|
+
editor.isBlockCard = (element) => {
|
|
440
|
+
if (element && element.type === ElementKinds.table) {
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
return isBlockCard(element);
|
|
444
|
+
};
|
|
445
|
+
editor.renderElement = (element) => {
|
|
446
|
+
if (element.type === ElementKinds.table) {
|
|
447
|
+
return TheTableComponent;
|
|
448
|
+
}
|
|
449
|
+
if (element.type === ElementKinds.tableRow && isLegalTable(editor, element)) {
|
|
450
|
+
return TheTableRowComponent;
|
|
451
|
+
}
|
|
452
|
+
if (element.type === ElementKinds.tableCell && isLegalTable(editor, element)) {
|
|
453
|
+
return TheTdComponent;
|
|
454
|
+
}
|
|
455
|
+
return renderElement(element);
|
|
456
|
+
};
|
|
457
|
+
editor.deleteCutData = () => {
|
|
458
|
+
const opts = new TableOptions();
|
|
459
|
+
if (!isSelectionInTable(opts, editor)) {
|
|
460
|
+
deleteCutData();
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
const element = createTablePosition(editor);
|
|
464
|
+
const tableComponent = ELEMENT_TO_COMPONENT.get(element.table);
|
|
465
|
+
const selectedCellPositions = tableComponent.tableStore.getSelectedCellPositions();
|
|
466
|
+
if (selectedCellPositions.length > 0) {
|
|
467
|
+
Editor.withoutNormalizing(editor, () => {
|
|
468
|
+
if (tableComponent.tableStore.isSelectedTable) {
|
|
469
|
+
if (tableComponent.tableStore.isFullscreen) {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
TableEditor.removeTable(editor);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
tableComponent.tableStore.clearSelectedCellsContent();
|
|
476
|
+
}
|
|
477
|
+
tableComponent.tableService.closeToolbar();
|
|
478
|
+
});
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
deleteCutData();
|
|
482
|
+
};
|
|
483
|
+
editor.isContainer = (element) => {
|
|
484
|
+
return element.type === ElementKinds.tableCell ? true : isContainer(element);
|
|
485
|
+
};
|
|
486
|
+
editor.onChange = () => {
|
|
487
|
+
onChange();
|
|
488
|
+
// adujst selection when selection is in hidden cell
|
|
489
|
+
// just hook set_selection
|
|
490
|
+
try {
|
|
491
|
+
const isCollapsed = editor.selection && Range.isCollapsed(editor.selection);
|
|
492
|
+
const isSelectionOperation = editor.operations.every(op => Operation.isSelectionOperation(op));
|
|
493
|
+
if (isCollapsed && isSelectionOperation) {
|
|
494
|
+
const opts = new TableOptions();
|
|
495
|
+
const tablePosition = createTablePosition(editor);
|
|
496
|
+
if (tablePosition.isInTable() && tablePosition.cell.hidden) {
|
|
497
|
+
TableEditor.selectOriginCell(editor, tablePosition.table, tablePosition.getRowIndex(), tablePosition.getColumnIndex(), false);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
catch (error) { }
|
|
502
|
+
};
|
|
503
|
+
return editor;
|
|
504
|
+
};
|
|
505
|
+
export const createTablePlugin = createPluginFactory({
|
|
506
|
+
key: PluginKeys.table,
|
|
507
|
+
withOverrides: withTable,
|
|
508
|
+
nestedStructureByKey: {
|
|
509
|
+
[ElementKinds.table]: ElementKinds.tableRow,
|
|
510
|
+
[ElementKinds.tableRow]: ElementKinds.tableCell
|
|
511
|
+
},
|
|
512
|
+
toolbarItems: [
|
|
513
|
+
{
|
|
514
|
+
key: ElementKinds.table,
|
|
515
|
+
icon: 'table-border-all',
|
|
516
|
+
name: '表格',
|
|
517
|
+
iconComponent: TheTableToolbarItemComponent,
|
|
518
|
+
execute: editor => TableEditor.insertTable(editor),
|
|
519
|
+
active: editor => TableEditor.isActive(editor)
|
|
520
|
+
}
|
|
521
|
+
],
|
|
522
|
+
menuItems: [
|
|
523
|
+
{
|
|
524
|
+
key: ElementKinds.table,
|
|
525
|
+
keywords: 'biaoge,bg,table,表格',
|
|
526
|
+
execute: editor => TableEditor.insertTable(editor),
|
|
527
|
+
active: editor => TableEditor.isActive(editor),
|
|
528
|
+
name: '表格',
|
|
529
|
+
type: ThePluginMenuItemType.group,
|
|
530
|
+
menuIcon: PluginMenuIcons.table,
|
|
531
|
+
description: '支持插入表格',
|
|
532
|
+
displayKey: '/bg'
|
|
533
|
+
}
|
|
534
|
+
],
|
|
535
|
+
options: {
|
|
536
|
+
showFullscreen: false,
|
|
537
|
+
freezeColumnHeader: false,
|
|
538
|
+
freezeRowHeader: false,
|
|
539
|
+
setFullscreen: (editor, event, element) => {
|
|
540
|
+
event.preventDefault();
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvdGFibGUucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQVEsTUFBTSxPQUFPLENBQUM7QUFDMUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFB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Q0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNsRCxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxJQUFJLEVBQUUsSUFBSTtZQUNWLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxLQUFLO1lBQ2pDLFFBQVEsRUFBRSxlQUFlLENBQUMsS0FBSztZQUMvQixXQUFXLEVBQUUsUUFBUTtZQUNyQixVQUFVLEVBQUUsS0FBSztTQUNwQjtLQUNKO0lBQ0QsT0FBTyxFQUFFO1FBQ0wsY0FBYyxFQUFFLEtBQUs7UUFDckIsa0JBQWtCLEVBQUUsS0FBSztRQUN6QixlQUFlLEVBQUUsS0FBSztRQUN0QixhQUFhLEVBQUUsQ0FBQyxNQUFpQixFQUFFLEtBQWlCLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO1lBQ3RFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMzQixDQUFDO0tBQ0o7Q0FDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2Zvcm1zLCBQb2ludCwgTm9kZSwgUmFuZ2UsIEVkaXRvciwgTm9kZUVudHJ5LCBFbGVtZW50LCBQYXRoLCBPcGVyYXRpb24sIFRleHQgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yLCBFTEVNRU5UX1RPX0NPTVBPTkVOVCwgaG90a2V5cyB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgVGFibGVPcHRpb25zLCBUaGVQbHVnaW5UYWJsZU9wdGlvbiB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgaXNSYW5nZUluVGFibGUsIGlzU2VsZWN0aW9uSW5UYWJsZSwgVGFibGVQb3NpdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgUGx1Z2luS2V5cywgVGhlRWRpdG9yIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFbGVtZW50S2luZHMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbm9kZS10eXBlcyc7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50LCBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVFZGl0b3IgfSBmcm9tICcuL3RhYmxlLmVkaXRvcic7XG5pbXBvcnQgeyBjbGVhclRhYmxlTm9kZSB9IGZyb20gJy4vdHJhbnNmb3Jtcy9jbGVhci10YWJsZS1ub2RlJztcbmltcG9ydCB7IGlzVmlydHVhbEtleSB9IGZyb20gJy4vdXRpbHMvaXMtdmlydHVhbC1rZXknO1xuaW1wb3J0IHsgaW5zZXJ0Q29sdW1uQXRSb3cgfSBmcm9tICcuL3RyYW5zZm9ybXMvaW5zZXJ0LWNvbHVtbic7XG5pbXBvcnQgeyBjYWxjdWxhdGVBbmNob3JQb3NpdGlvbkluQ2VsbCB9IGZyb20gJy4vdXRpbHMvY2FsYy1hbmNob3ItcG9zaXRpb24nO1xuaW1wb3J0IHsgQ0xJUEJPQVJEX0ZPUk1BVF9LRVkgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBnZXRPcmlnaW5DZWxsIH0gZnJvbSAnLi91dGlscy9jYWxjLXNwYW4nO1xuaW1wb3J0IHsgcmVzZXRUYWJsZUNlbGwgfSBmcm9tICcuL3V0aWxzL3NwbGl0LWNlbGwnO1xuaW1wb3J0IHsgcmVtb3ZlQ29sdW1ucyB9IGZyb20gJy4vdXRpbHMvcmVtb3ZlLWNvbHVtbnMnO1xuaW1wb3J0IHsgYWRkQ29sdW1ucyB9IGZyb20gJy4vdXRpbHMvYWRkLWNvbHVtbnMnO1xuaW1wb3J0IHsgVGhlVGFibGVSb3dDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcm93L3Jvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGhlVGRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGQvdGQuY29tcG9uZW50JztcbmltcG9ydCB7IGV4dHJhY3RGcmFnbWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZyYWdtZW50JztcbmltcG9ydCAqIGFzIFRoZVF1ZXJpZXMgZnJvbSAnLi4vLi4vcXVlcmllcyc7XG5pbXBvcnQgeyBub3JtYWxpemVUYWJsZSB9IGZyb20gJy4vdXRpbHMvbm9ybWFsaXplLXRhYmxlJztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZGFzaCc7XG5pbXBvcnQgeyBjcmVhdGVQbHVnaW5GYWN0b3J5IH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBUaGVUYWJsZVRvb2xiYXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi90b29sYmFyLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IFBsdWdpbk1lbnVJY29ucywgVGhlUGx1Z2luTWVudUl0ZW1UeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3BsdWdpbi1tZW51JztcbmltcG9ydCB7IGlzU2VsZWN0ZWRDZWxsTWVyZ2VkIH0gZnJvbSAnLi91dGlscy9tZXJnZS1jZWxsJztcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc0xlZ2FsVGFibGUgfSBmcm9tICcuL3V0aWxzL2lzLWxlZ2FsLXRhYmxlJztcbmltcG9ydCB7IGNyZWF0ZUVtcHR5UGFyYWdyYXBoIH0gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlLWVtcHR5LXBhcmFncmFwaCc7XG5pbXBvcnQgeyBjcmVhdGVUYWJsZVBvc2l0aW9uIH0gZnJvbSAnLi91dGlscy9jcmVhdGUtdGFibGUtcG9zaXRpb24nO1xuXG5leHBvcnQgY29uc3Qgd2l0aFRhYmxlID0gPFQgZXh0ZW5kcyBUaGVFZGl0b3I+KGVkaXRvcjogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgZGVsZXRlQmFja3dhcmQsXG4gICAgICAgIGRlbGV0ZUZvcndhcmQsXG4gICAgICAgIG9uS2V5ZG93bixcbiAgICAgICAgc2V0RnJhZ21lbnREYXRhLFxuICAgICAgICBpbnNlcnREYXRhLFxuICAgICAgICBub3JtYWxpemVOb2RlLFxuICAgICAgICBpc0Jsb2NrQ2FyZCxcbiAgICAgICAgcmVuZGVyRWxlbWVudCxcbiAgICAgICAgZGVsZXRlQ3V0RGF0YSxcbiAgICAgICAgaXNDb250YWluZXIsXG4gICAgICAgIG9uQ2hhbmdlLFxuICAgICAgICBvbkNsaWNrXG4gICAgfSA9IGVkaXRvcjtcblxuICAgIGVkaXRvci5kZWxldGVCYWNrd2FyZCA9IHVuaXQgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICBpZiAoIWlzU2VsZWN0aW9uSW5UYWJsZShvcHRzLCBlZGl0b3IpKSB7XG4gICAgICAgICAgICBkZWxldGVCYWNrd2FyZCh1bml0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuXG4gICAgICAgIGNvbnN0IFssIHN0YXJ0QmxvY2tQYXRoXSA9IEVkaXRvci5hYm92ZTxFbGVtZW50PihlZGl0b3IsIHtcbiAgICAgICAgICAgIG1hdGNoOiAobjogQ3VzdG9tRWxlbWVudCkgPT4gRWRpdG9yLmlzQmxvY2soZWRpdG9yLCBuKVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3RhcnRCbG9ja1BhdGgubGVuZ3RoIDw9IHN0YXJ0UG9zaXRpb24uY2VsbEVudHJ5WzFdLmxlbmd0aCArIDEgJiZcbiAgICAgICAgICAgIHN0YXJ0QmxvY2tQYXRoLnBvcCgpID09PSAwICYmXG4gICAgICAgICAgICBzZWxlY3Rpb24uYW5jaG9yLm9mZnNldCA9PT0gMCAmJlxuICAgICAgICAgICAgVGhlUXVlcmllcy5pc1N0YXJ0KGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvciwgc3RhcnRCbG9ja1BhdGgpICYmXG4gICAgICAgICAgICAhRWRpdG9yLmlzVm9pZChlZGl0b3IsIFRoZVF1ZXJpZXMuYW5jaG9yQmxvY2soZWRpdG9yKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlQmFja3dhcmQodW5pdCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5kZWxldGVGb3J3YXJkID0gdW5pdCA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBFZGl0b3IuYWZ0ZXIoZWRpdG9yLCBlZGl0b3Iuc2VsZWN0aW9uKTtcbiAgICAgICAgaWYgKGFmdGVyUG9pbnQgJiYgaXNSYW5nZUluVGFibGUob3B0cywgZWRpdG9yLCB7IGFuY2hvcjogYWZ0ZXJQb2ludCwgZm9jdXM6IGFmdGVyUG9pbnQgfSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXJQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yLCBhZnRlclBvaW50LnBhdGgpO1xuICAgICAgICAgICAgaWYgKGJlZm9yZVBvc2l0aW9uLmNlbGwgJiYgYmVmb3JlUG9zaXRpb24uY2VsbCAhPT0gYWZ0ZXJQb3NpdGlvbi5jZWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZUZvcndhcmQodW5pdCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5vbkNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5kZXRhaWwgPT09IDMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTWVyZ2VkQ2VsbCA9IGlzU2VsZWN0ZWRDZWxsTWVyZ2VkKGVkaXRvcik7XG4gICAgICAgICAgICBjb25zdCBkb21TZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBpZiAoZG9tU2VsZWN0aW9uICYmICFkb21TZWxlY3Rpb24uaXNDb2xsYXBzZWQgJiYgZWRpdG9yLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsYXRlU2VsZWN0aW9uID0gQW5ndWxhckVkaXRvci50b1NsYXRlUmFuZ2UoZWRpdG9yLCBkb21TZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IFRhYmxlUG9zaXRpb24uY3JlYXRlKG9wdHMsIGVkaXRvciwgc2xhdGVTZWxlY3Rpb24uYW5jaG9yLnBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgZWRpdG9yLCBzbGF0ZVNlbGVjdGlvbi5mb2N1cy5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNNZXJnZWRDZWxsICYmIHN0YXJ0UG9zaXRpb24uY2VsbCAhPT0gZW5kUG9zaXRpb24uY2VsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lcig4MSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgc2xhdGVTZWxlY3Rpb24uYW5jaG9yLnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb25DbGljayhldmVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5vbktleWRvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgaXNNb3ZlVXAgPSBob3RrZXlzLmlzTW92ZVVwKGV2ZW50KTtcbiAgICAgICAgY29uc3QgaXNNb3ZlRG93biA9IGhvdGtleXMuaXNNb3ZlRG93bihldmVudCk7XG4gICAgICAgIGNvbnN0IGlzTW92ZUJhY2t3YXJkID0gaG90a2V5cy5pc01vdmVCYWNrd2FyZChldmVudCk7XG4gICAgICAgIGNvbnN0IGlzTW92ZUZvcndhcmQgPSBob3RrZXlzLmlzTW92ZUZvcndhcmQoZXZlbnQpO1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLmFuY2hvciB8fCAhc2VsZWN0aW9uLmZvY3VzKSB7XG4gICAgICAgICAgICBvbktleWRvd24oZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IsIHNlbGVjdGlvbi5mb2N1cy5wYXRoKTtcbiAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBSYW5nZS5pc0NvbGxhcHNlZChzZWxlY3Rpb24pO1xuICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbiAmJiBlbmRQb3NpdGlvbiAmJiBlbmRQb3NpdGlvbi5pc0luVGFibGUoKSkge1xuICAgICAgICAgICAgLy8gZm9yIGtleWJvYXJkIHVwIGFuZCBkb3duIGtleSBpbiB0aGUgdGFibGVcbiAgICAgICAgICAgIGlmIChpc01vdmVVcCB8fCBpc01vdmVEb3duKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbFBhdGggPSBlbmRQb3NpdGlvbi5jZWxsRW50cnlbMV07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRQYXRoID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgY2VsbFBhdGgpLnBhdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUGF0aCA9IEVkaXRvci5lbmQoZWRpdG9yLCBjZWxsUGF0aCkucGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGlzRmlyc3RMaW5lLCBpc0xhc3RMaW5lIH0gPSBjYWxjdWxhdGVBbmNob3JQb3NpdGlvbkluQ2VsbChlZGl0b3IpO1xuICAgICAgICAgICAgICAgIHN0YXJ0UGF0aC5wb3AoKTtcbiAgICAgICAgICAgICAgICBlbmRQYXRoLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChUaGVRdWVyaWVzLmFuY2hvckJsb2NrRW50cnkoZWRpdG9yKVsxXS50b1N0cmluZygpICE9PSBzdGFydFBhdGgudG9TdHJpbmcoKSB8fCAhaXNGaXJzdExpbmUpICYmIGlzTW92ZVVwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoKFRoZVF1ZXJpZXMuYW5jaG9yQmxvY2tFbnRyeShlZGl0b3IpWzFdLnRvU3RyaW5nKCkgIT09IGVuZFBhdGgudG9TdHJpbmcoKSB8fCAhaXNMYXN0TGluZSkgJiYgaXNNb3ZlRG93bikge1xuICAgICAgICAgICAgICAgICAgICBvbktleWRvd24oZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXQ6IFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChpc01vdmVVcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhYm92ZVJvdyA9IHN0YXJ0UG9zaXRpb24udGFibGUuY2hpbGRyZW5bc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFib3ZlQ2VsbCA9IGFib3ZlUm93ICYmIGFib3ZlUm93LmNoaWxkcmVuW3N0YXJ0UG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUNlbGwuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3Iuc2VsZWN0T3JpZ2luQ2VsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLmdldFJvd0luZGV4KCkgLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLmdldENvbHVtbkluZGV4KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIFRoZUVkaXRvci5maW5kUGF0aChlZGl0b3IsIGFib3ZlQ2VsbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlRW50cnkgPSBFZGl0b3IucHJldmlvdXMoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVQb2ludCA9IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLm5leHQoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c05vZGVFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIHByZXZpb3VzTm9kZUVudHJ5WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c05vZGVFbnRyeSAmJiBiZWZvcmVQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIGJlZm9yZVBvaW50LnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzTm9kZUVudHJ5ICYmICFiZWZvcmVQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIHN0YXJ0UG9zaXRpb24udGFibGVFbnRyeVswXSwgeyBkaXJlY3Rpb246ICdsZWZ0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlbG93Um93SW5kZXggPSBzdGFydFBvc2l0aW9uLmdldFJvd0luZGV4KCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbi5jZWxsLnJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWxvd1Jvd0luZGV4ID0gc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpICsgc3RhcnRQb3NpdGlvbi5jZWxsLnJvd3NwYW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVsb3dSb3cgPSBzdGFydFBvc2l0aW9uLnRhYmxlLmNoaWxkcmVuW2JlbG93Um93SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWxvd0NlbGwgPSBiZWxvd1JvdyAmJiBiZWxvd1Jvdy5jaGlsZHJlbltzdGFydFBvc2l0aW9uLmdldENvbHVtbkluZGV4KCldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3dDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3dDZWxsLmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLnNlbGVjdE9yaWdpbkNlbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi50YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgYmVsb3dDZWxsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZUVudHJ5ID0gRWRpdG9yLm5leHQoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb3ZlUGF0aCA9IG5leHROb2RlRW50cnkgPyBuZXh0Tm9kZUVudHJ5WzFdIDogRWRpdG9yLmFmdGVyKGVkaXRvciwgc3RhcnRQb3NpdGlvbi50YWJsZUVudHJ5WzFdKS5wYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBtb3ZlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTW92ZUJhY2t3YXJkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9pbnQgPSBFZGl0b3IuYmVmb3JlKGVkaXRvciwgZWRpdG9yLnNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9zaXRpb24gPSBiZWZvcmVQb2ludCAmJiBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvciwgYmVmb3JlUG9pbnQucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZVBvc2l0aW9uICYmIGJlZm9yZVBvc2l0aW9uLmNlbGwgJiYgYmVmb3JlUG9zaXRpb24uY2VsbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXQgPSBFZGl0b3IuZW5kKGVkaXRvciwgVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgYmVmb3JlUG9zaXRpb24uZmluZFByZXZpb3VzKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNNb3ZlRm9yd2FyZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBFZGl0b3IuYWZ0ZXIoZWRpdG9yLCBlZGl0b3Iuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlclBvc2l0aW9uID0gYWZ0ZXJQb2ludCAmJiBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvciwgYWZ0ZXJQb2ludC5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJQb3NpdGlvbi5jZWxsICYmIGFmdGVyUG9zaXRpb24uY2VsbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dENlbGwgPSBhZnRlclBvc2l0aW9uLmZpbmROZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBUaGVFZGl0b3IuZmluZFBhdGgoZWRpdG9yLCBhZnRlclBvc2l0aW9uLmZpbmROZXh0KCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIHN0YXJ0UG9zaXRpb24udGFibGVFbnRyeVswXSwgeyBkaXJlY3Rpb246ICdyaWdodCcgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByZXZlbnQgZGVsZXRpbmcgY2VsbHMgaW4gdGhlIHRhYmxlXG4gICAgICAgICAgICBpZiAoIWlzQ29sbGFwc2VkICYmICFzdGFydFBvc2l0aW9uLmlzSW5UYWJsZSgpICYmICFpc1ZpcnR1YWxLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgdGFibGVPdXRQYXRoOiBQb2ludDtcbiAgICAgICAgICAgICAgICBFZGl0b3Iud2l0aG91dE5vcm1hbGl6aW5nKGVkaXRvciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmFuZ2UuaXNGb3J3YXJkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlT3V0UGF0aCA9IEVkaXRvci5lbmQoZWRpdG9yLCBbc2VsZWN0aW9uLmZvY3VzLnBhdGhbMF0gLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRhYmxlTm9kZShvcHRzLCBlZGl0b3IsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVPdXRQYXRoID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgW3NlbGVjdGlvbi5mb2N1cy5wYXRoWzBdICsgMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUYWJsZU5vZGUob3B0cywgZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZU91dFJhbmdlID0gRWRpdG9yLnJhbmdlKGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvciwgdGFibGVPdXRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUoZWRpdG9yLCB7IGF0OiB0YWJsZU91dFJhbmdlIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIG5ldyByYW5nZVxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxSYW5nZSA9IEVkaXRvci5yYW5nZShlZGl0b3IsIGVkaXRvci5zZWxlY3Rpb24uZm9jdXMucGF0aC5zbGljZSgwLCAzKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9jdXNSYW5nZSA9IFJhbmdlLmludGVyc2VjdGlvbihlZGl0b3Iuc2VsZWN0aW9uLCBjZWxsUmFuZ2UpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgZm9jdXNSYW5nZSk7XG4gICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZyYWdtZW50KGVkaXRvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xuXG4gICAgZWRpdG9yLnNldEZyYWdtZW50RGF0YSA9IHVuaXQgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICBpZiAoIWlzU2VsZWN0aW9uSW5UYWJsZShvcHRzLCBlZGl0b3IpKSB7XG4gICAgICAgICAgICBzZXRGcmFnbWVudERhdGEodW5pdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSBFTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQodGFibGVQb3NpdGlvbi50YWJsZSkgYXMgVGhlVGFibGVDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbFBvc2l0aW9ucyA9IHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCk7XG4gICAgICAgIGxldCB0YWJsZUZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRhYmxlUG9zaXRpb24udGFibGUuY2hpbGRyZW4uc2xpY2UoXG4gICAgICAgICAgICAgICAgdGFibGVDb21wb25lbnQudGFibGVTdG9yZS5zZWxlY3RlZFJvd3NJbmRleFswXSxcbiAgICAgICAgICAgICAgICB0YWJsZUNvbXBvbmVudC50YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4W3RhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXgubGVuZ3RoIC0gMV0gKyAxXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGFibGVGcmFnbWVudCA9IHtcbiAgICAgICAgICAgICAgICAuLi50YWJsZVBvc2l0aW9uLnRhYmxlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiByb3dzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ2VsbFBvc2l0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wUm93cyA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHNlbGVjdGVkQ2VsbFBvc2l0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcm93LCBjb2wgfSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbFBhdGggPSBbLi4udGFibGVQb3NpdGlvbi50YWJsZUVudHJ5WzFdLCByb3csIGNvbF07XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbE5vZGUgPSBOb2RlLmdldChlZGl0b3IsIGNlbGxQYXRoKSBhcyBUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghdGVtcFJvd3Nbcm93XSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wUm93c1tyb3ddID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRlbXBSb3dzW3Jvd10ucHVzaChjZWxsTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3dzOiBUYWJsZVJvd0VsZW1lbnRbXSA9IE9iamVjdC52YWx1ZXModGVtcFJvd3MpLm1hcCgoaXRlbTogVGFibGVDZWxsRWxlbWVudFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRWxlbWVudEtpbmRzLnRhYmxlUm93LFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogaXRlbVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRhYmxlRnJhZ21lbnQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogRWxlbWVudEtpbmRzLnRhYmxlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiByb3dzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWJsZUZyYWdtZW50KSB7XG4gICAgICAgICAgICB0YWJsZUZyYWdtZW50ID0gbm9ybWFsaXplVGFibGUoY2xvbmVEZWVwKHRhYmxlRnJhZ21lbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IHBsYWluVGV4dCA9IE5vZGUuc3RyaW5nKHRhYmxlRnJhZ21lbnQpO1xuICAgICAgICAgICAgdGFibGVGcmFnbWVudCA9IFt0YWJsZUZyYWdtZW50XTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ09iaiA9IEpTT04uc3RyaW5naWZ5KHRhYmxlRnJhZ21lbnQpO1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlZCA9IHdpbmRvdy5idG9hKGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdPYmopKTtcbiAgICAgICAgICAgIHVuaXQuc2V0RGF0YShgYXBwbGljYXRpb24vJHtDTElQQk9BUkRfRk9STUFUX0tFWX1gLCBlbmNvZGVkKTtcbiAgICAgICAgICAgIHVuaXQuc2V0RGF0YSgndGV4dC9wbGFpbicsIHBsYWluVGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0RnJhZ21lbnREYXRhKHVuaXQpO1xuICAgIH07XG5cbiAgICBlZGl0b3IuaW5zZXJ0RGF0YSA9IGRhdGEgPT4ge1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGV4dHJhY3RGcmFnbWVudChkYXRhKTtcbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IGVkaXRvcjtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkluVGFibGUob3B0cywgZWRpdG9yKSAmJlxuICAgICAgICAgICAgICAgIGZyYWdtZW50Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIEVsZW1lbnQuaXNFbGVtZW50KGZyYWdtZW50WzBdKSAmJlxuICAgICAgICAgICAgICAgIChmcmFnbWVudFswXSBhcyBDdXN0b21FbGVtZW50KS50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xpcGJvYXJkVGFibGUgPSBmcmFnbWVudFswXS5jaGlsZHJlbiBhcyBOb2RlW107XG4gICAgICAgICAgICAgICAgY29uc3QgY2xpcGJvYXJkUm93ID0gKGNsaXBib2FyZFRhYmxlWzBdIGFzIEN1c3RvbUVsZW1lbnQpLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdFJvd0luZGV4ID0gdGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdENvbEluZGV4ID0gdGFibGVQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RSb3dJbmRleCA9IHNlbGVjdFJvd0luZGV4ICsgY2xpcGJvYXJkVGFibGUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q29sSW5kZXggPSBzZWxlY3RDb2xJbmRleCArIGNsaXBib2FyZFJvdy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlbGVjdFJvd0luZGV4OyBpIDw9IGxhc3RSb3dJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBzZWxlY3RDb2xJbmRleDsgaiA8PSBsYXN0Q29sSW5kZXg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGVQb3NpdGlvbi50YWJsZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3cgJiYgcm93LmNoaWxkcmVuW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luQ2VsbCA9IGdldE9yaWdpbkNlbGwodGFibGVQb3NpdGlvbi50YWJsZSwgaSwgaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbkNlbGwgJiYgKG9yaWdpbkNlbGwuY29sc3BhbiB8fCBvcmlnaW5DZWxsLnJvd3NwYW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBUaGVFZGl0b3IuZmluZFBhdGgoZWRpdG9yLCBvcmlnaW5DZWxsKS5zbGljZSgtMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0VGFibGVDZWxsKGVkaXRvciwgdGFibGVQb3NpdGlvbi50YWJsZSwgb3JpZ2luQ2VsbCwgcGF0aFswXSwgcGF0aFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgRWRpdG9yLndpdGhvdXROb3JtYWxpemluZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RDb2xJbmRleCA+IHRhYmxlUG9zaXRpb24uZ2V0V2lkdGgoKSAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZENvbENvdW50ID0gbGFzdENvbEluZGV4IC0gKHRhYmxlUG9zaXRpb24uZ2V0V2lkdGgoKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3IuaW5zZXJ0Q29sdW1uKGVkaXRvciwgYWRkQ29sQ291bnQsIHRhYmxlUG9zaXRpb24uZ2V0V2lkdGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RSb3dJbmRleCA+IHRhYmxlUG9zaXRpb24uZ2V0SGVpZ2h0KCkgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRSb3dDb3VudCA9IGxhc3RSb3dJbmRleCAtICh0YWJsZVBvc2l0aW9uLmdldEhlaWdodCgpIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUVkaXRvci5pbnNlcnRSb3coZWRpdG9yLCBhZGRSb3dDb3VudCwgdGFibGVQb3NpdGlvbi5nZXRIZWlnaHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkVGFibGUuZm9yRWFjaCgocm93OiBUYWJsZUVsZW1lbnQsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmNoaWxkcmVuLmZvckVhY2goKGNvbDogTm9kZSwgajogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXQgPSBbLi4udGFibGVQb3NpdGlvbi50YWJsZUVudHJ5WzFdLCBzZWxlY3RSb3dJbmRleCArIGksIHNlbGVjdENvbEluZGV4ICsgal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5yZW1vdmVOb2RlcyhlZGl0b3IsIHsgYXQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5pbnNlcnROb2RlcyhlZGl0b3IsIGNvbCwgeyBhdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBbLi4udGFibGVQb3NpdGlvbi50YWJsZUVudHJ5WzFdLCBzZWxlY3RSb3dJbmRleCwgc2VsZWN0Q29sSW5kZXhdKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3aGVuIHBhc3RpbmcgZGF0YSwgdGhlIGxhc3Qgb25lIGlzIGEgdGFibGUsIGFuZCB0aGUgZm9jdXMgcG9zaXRpb24gaXMgc3BlY2lhbGx5IGhhbmRsZWRcbiAgICAgICAgICAgIC8vICogdGhpcyBpcyB0byBmb2N1cyBhZnRlciB3aXRoVHJhaWxpbmdOb2RlLm5vcm1hbGl6ZU5vZGUoKSB0byBhdm9pZCBpbmNvcnJlY3QgZm9jdXMgZWxlbWVudC5cbiAgICAgICAgICAgIC8vICogaWYgdGhlcmUgaXMgYSBub2RlIGJlbG93LCB0aGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBub2RlIGJlbG93LlxuICAgICAgICAgICAgLy8gKiBpZiB0aGVyZSBpcyBubyBub2RlIGJlbG93LCB0aGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCB0YWJsZS5cbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbnNlcnROb2RlID0gZnJhZ21lbnRbZnJhZ21lbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBpc1RhYmxlID0gKGxhc3RJbnNlcnROb2RlIGFzIEN1c3RvbUVsZW1lbnQpLnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZTtcbiAgICAgICAgICAgIGlmIChpc1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbLCBjdXJyZW50UGF0aF0gPSBUaGVRdWVyaWVzLmZpbmROb2RlKGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiAobjogQ3VzdG9tRWxlbWVudCkgPT4gRWxlbWVudC5pc0VsZW1lbnQobikgJiYgbi50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFBhdGggPSBQYXRoLm5leHQoY3VycmVudFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzTmV4dE5vZGUgPSBOb2RlLmhhcyhlZGl0b3IsIG5leHRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzUGF0aCA9IGhhc05leHROb2RlID8gbmV4dFBhdGggOiBjdXJyZW50UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzTm9kZSA9IE5vZGUuZ2V0KGVkaXRvciwgZm9jdXNQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQmxvY2tDYXJkID0gZWRpdG9yLmlzQmxvY2tDYXJkKGZvY3VzTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQYXRoID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGZvY3VzUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGlzQmxvY2tDYXJkID8gKGhhc05leHROb2RlID8gLTEgOiAtMikgOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBjdXJzb3JQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0RGF0YShkYXRhKTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm5vcm1hbGl6ZU5vZGUgPSAoW25vZGUsIHBhdGhdOiBOb2RlRW50cnk8Tm9kZT4pID0+IHtcbiAgICAgICAgaWYgKEVsZW1lbnQuaXNFbGVtZW50KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IG5vZGUgYXMgVGFibGVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heCguLi50YWJsZS5jaGlsZHJlbi5tYXAocm93ID0+IHJvdy5jaGlsZHJlbi5sZW5ndGgpKTtcbiAgICAgICAgICAgIGNvbnN0IGludmFsaWRSb3dzID0gdGFibGUuY2hpbGRyZW4uZmlsdGVyKHJvdyA9PiByb3cuY2hpbGRyZW4ubGVuZ3RoIDwgbWF4V2lkdGgpO1xuICAgICAgICAgICAgaWYgKGludmFsaWRSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlLmNoaWxkcmVuLm1hcCgocm93LCByb3dJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmNoaWxkcmVuLm1hcCgoY2VsbCwgY2VsbEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwuaGlkZGVuIHx8IGNlbGwuY29sc3BhbiB8fCBjZWxsLnJvd3NwYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaGlkZGVuOiBudWxsLCBjb2xzcGFuOiBudWxsLCByb3dzcGFuOiBudWxsIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGF0OiBbLi4ucGF0aCwgcm93SW5kZXgsIGNlbGxJbmRleF0gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaW52YWxpZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBtYXhXaWR0aCAtIHJvdy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRDb2x1bW5BdFJvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbm9kZSwgcGF0aF0gYXMgTm9kZUVudHJ5PFRhYmxlRWxlbWVudD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuY2hpbGRyZW4uaW5kZXhPZihyb3cpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5jaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhYmxlLmNvbHVtbnMgJiYgdGFibGUuY29sdW1ucy5sZW5ndGggIT09IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRhYmxlLmNvbHVtbnMubGVuZ3RoID4gbWF4V2lkdGggPyByZW1vdmVDb2x1bW5zKHRhYmxlLCBtYXhXaWR0aCkgOiBhZGRDb2x1bW5zKHRhYmxlLCBtYXhXaWR0aCk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlcyhlZGl0b3IsIHsgY29sdW1ucyB9LCB7IGF0OiBwYXRoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9yYW1saXplIGlsbGVnYWwgY2VsbCBhbmQgcm93IHRvIGJlIHBhcmFncmFwaFxuICAgICAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQobm9kZSkgJiYgW0VsZW1lbnRLaW5kcy50YWJsZUNlbGwsIEVsZW1lbnRLaW5kcy50YWJsZVJvd10uaW5jbHVkZXMobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgaWYgKCFpc0xlZ2FsVGFibGUoZWRpdG9yLCBub2RlIGFzIFRhYmxlUm93RWxlbWVudCB8IFRhYmxlQ2VsbEVsZW1lbnQsIHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBbcGF0aFswXV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGVkaXRvci5zZWxlY3Rpb24uZm9jdXMub2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGFsbCB0YWJsZUNlbGwgYW5kIHRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gRWRpdG9yLm5vZGVzKGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXQ6IHJvb3RQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2xvd2VzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDogKG5vZGU6IEN1c3RvbUVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVDZWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnNvclBhdGggPSBwYXRoWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JhbWxpemUgdG8gYmUgcGFyYWdyYXBoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXROb2RlLCB0YXJnZXRQYXRoXSBvZiBub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gY3JlYXRlRW1wdHlQYXJhZ3JhcGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gTm9kZS5zdHJpbmcodGFyZ2V0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFncmFwaC5jaGlsZHJlblswXSBhcyBUZXh0KS50ZXh0ID0gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRhcmdldE5vZGUgYXMgQ3VzdG9tRWxlbWVudCkua2V5ID09PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JQYXRoID0gcm9vdFBhdGhbMF0gKyBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5pbnNlcnROb2RlcyhlZGl0b3IsIHBhcmFncmFwaCwgeyBhdDogW3Jvb3RQYXRoWzBdICsgaW5kZXhdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IHsgcGF0aDogW2N1cnNvclBhdGgsIDBdLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIHsgYW5jaG9yOiBjdXJzb3IsIGZvY3VzOiBjdXJzb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByb290IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5yZW1vdmVOb2RlcyhlZGl0b3IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0OiByb290UGF0aFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGp1c3Qgc2VsZWN0aW9uIHdoZW4gc2VsZWN0aW9uIGlzIGluIGhpZGRlbiBjZWxsXG4gICAgICAgIGlmIChFbGVtZW50LmlzRWxlbWVudChub2RlKSAmJiBub2RlLnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZUNlbGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgUmFuZ2UuaXNDb2xsYXBzZWQoZWRpdG9yLnNlbGVjdGlvbikgJiZcbiAgICAgICAgICAgICAgICBQYXRoLmlzQW5jZXN0b3IocGF0aCwgZWRpdG9yLnNlbGVjdGlvbi5hbmNob3IucGF0aCkgJiZcbiAgICAgICAgICAgICAgICBub2RlLmhpZGRlblxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IGdldE9yaWdpbkNlbGwodGFibGVQb3NpdGlvbi50YWJsZSwgdGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpLCB0YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gQW5ndWxhckVkaXRvci5maW5kUGF0aChlZGl0b3IsIG9yaWdpbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIEVkaXRvci5lbmQoZWRpdG9yLCBwYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBub3JtYWxpemVOb2RlKFtub2RlLCBwYXRoXSk7XG4gICAgfTtcblxuICAgIGVkaXRvci5pc0Jsb2NrQ2FyZCA9IChlbGVtZW50OiBDdXN0b21FbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNCbG9ja0NhcmQoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5yZW5kZXJFbGVtZW50ID0gKGVsZW1lbnQ6IEN1c3RvbUVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gVGhlVGFibGVDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlUm93ICYmIGlzTGVnYWxUYWJsZShlZGl0b3IsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gVGhlVGFibGVSb3dDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlQ2VsbCAmJiBpc0xlZ2FsVGFibGUoZWRpdG9yLCBlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFRoZVRkQ29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW5kZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgIH07XG5cbiAgICBlZGl0b3IuZGVsZXRlQ3V0RGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgaWYgKCFpc1NlbGVjdGlvbkluVGFibGUob3B0cywgZWRpdG9yKSkge1xuICAgICAgICAgICAgZGVsZXRlQ3V0RGF0YSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gRUxFTUVOVF9UT19DT01QT05FTlQuZ2V0KGVsZW1lbnQudGFibGUpIGFzIFRoZVRhYmxlQ29tcG9uZW50O1xuICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxQb3NpdGlvbnMgPSB0YWJsZUNvbXBvbmVudC50YWJsZVN0b3JlLmdldFNlbGVjdGVkQ2VsbFBvc2l0aW9ucygpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRDZWxsUG9zaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuaXNTZWxlY3RlZFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZUNvbXBvbmVudC50YWJsZVN0b3JlLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLnJlbW92ZVRhYmxlKGVkaXRvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFibGVDb21wb25lbnQudGFibGVTdG9yZS5jbGVhclNlbGVjdGVkQ2VsbHNDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhYmxlQ29tcG9uZW50LnRhYmxlU2VydmljZS5jbG9zZVRvb2xiYXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZUN1dERhdGEoKTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmlzQ29udGFpbmVyID0gKGVsZW1lbnQ6IEN1c3RvbUVsZW1lbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlQ2VsbCA/IHRydWUgOiBpc0NvbnRhaW5lcihlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICBvbkNoYW5nZSgpO1xuICAgICAgICAvLyBhZHVqc3Qgc2VsZWN0aW9uIHdoZW4gc2VsZWN0aW9uIGlzIGluIGhpZGRlbiBjZWxsXG4gICAgICAgIC8vIGp1c3QgaG9vayBzZXRfc2VsZWN0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpc0NvbGxhcHNlZCA9IGVkaXRvci5zZWxlY3Rpb24gJiYgUmFuZ2UuaXNDb2xsYXBzZWQoZWRpdG9yLnNlbGVjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGlvbk9wZXJhdGlvbiA9IGVkaXRvci5vcGVyYXRpb25zLmV2ZXJ5KG9wID0+IE9wZXJhdGlvbi5pc1NlbGVjdGlvbk9wZXJhdGlvbihvcCkpO1xuICAgICAgICAgICAgaWYgKGlzQ29sbGFwc2VkICYmIGlzU2VsZWN0aW9uT3BlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZVBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IpO1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZVBvc2l0aW9uLmlzSW5UYWJsZSgpICYmIHRhYmxlUG9zaXRpb24uY2VsbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3Iuc2VsZWN0T3JpZ2luQ2VsbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUG9zaXRpb24udGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVBvc2l0aW9uLmdldFJvd0luZGV4KCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgfTtcblxuICAgIHJldHVybiBlZGl0b3I7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlVGFibGVQbHVnaW4gPSBjcmVhdGVQbHVnaW5GYWN0b3J5PFRoZVBsdWdpblRhYmxlT3B0aW9uPih7XG4gICAga2V5OiBQbHVnaW5LZXlzLnRhYmxlLFxuICAgIHdpdGhPdmVycmlkZXM6IHdpdGhUYWJsZSxcbiAgICBuZXN0ZWRTdHJ1Y3R1cmVCeUtleToge1xuICAgICAgICBbRWxlbWVudEtpbmRzLnRhYmxlXTogRWxlbWVudEtpbmRzLnRhYmxlUm93LFxuICAgICAgICBbRWxlbWVudEtpbmRzLnRhYmxlUm93XTogRWxlbWVudEtpbmRzLnRhYmxlQ2VsbFxuICAgIH0sXG4gICAgdG9vbGJhckl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGtleTogRWxlbWVudEtpbmRzLnRhYmxlLFxuICAgICAgICAgICAgaWNvbjogJ3RhYmxlLWJvcmRlci1hbGwnLFxuICAgICAgICAgICAgbmFtZTogJ+ihqOagvCcsXG4gICAgICAgICAgICBpY29uQ29tcG9uZW50OiBUaGVUYWJsZVRvb2xiYXJJdGVtQ29tcG9uZW50LFxuICAgICAgICAgICAgZXhlY3V0ZTogZWRpdG9yID0+IFRhYmxlRWRpdG9yLmluc2VydFRhYmxlKGVkaXRvciksXG4gICAgICAgICAgICBhY3RpdmU6IGVkaXRvciA9PiBUYWJsZUVkaXRvci5pc0FjdGl2ZShlZGl0b3IpXG4gICAgICAgIH1cbiAgICBdLFxuICAgIG1lbnVJdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IEVsZW1lbnRLaW5kcy50YWJsZSxcbiAgICAgICAgICAgIGtleXdvcmRzOiAnYmlhb2dlLGJnLHRhYmxlLOihqOagvCcsXG4gICAgICAgICAgICBleGVjdXRlOiBlZGl0b3IgPT4gVGFibGVFZGl0b3IuaW5zZXJ0VGFibGUoZWRpdG9yKSxcbiAgICAgICAgICAgIGFjdGl2ZTogZWRpdG9yID0+IFRhYmxlRWRpdG9yLmlzQWN0aXZlKGVkaXRvciksXG4gICAgICAgICAgICBuYW1lOiAn6KGo5qC8JyxcbiAgICAgICAgICAgIHR5cGU6IFRoZVBsdWdpbk1lbnVJdGVtVHlwZS5ncm91cCxcbiAgICAgICAgICAgIG1lbnVJY29uOiBQbHVnaW5NZW51SWNvbnMudGFibGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ+aUr+aMgeaPkuWFpeihqOagvCcsXG4gICAgICAgICAgICBkaXNwbGF5S2V5OiAnL2JnJ1xuICAgICAgICB9XG4gICAgXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICAgIHNob3dGdWxsc2NyZWVuOiBmYWxzZSxcbiAgICAgICAgZnJlZXplQ29sdW1uSGVhZGVyOiBmYWxzZSxcbiAgICAgICAgZnJlZXplUm93SGVhZGVyOiBmYWxzZSxcbiAgICAgICAgc2V0RnVsbHNjcmVlbjogKGVkaXRvcjogVGhlRWRpdG9yLCBldmVudDogTW91c2VFdmVudCwgZWxlbWVudDogRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl19
|