@talrace/ngx-noder 0.0.6 → 0.0.8
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/README.md +5 -4
- package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +61 -0
- package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +7 -0
- package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +47 -0
- package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +32 -0
- package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +64 -0
- package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +89 -0
- package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +22 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +111 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +37 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +49 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +90 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +81 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +28 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.mjs +22 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +53 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +18 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +27 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +71 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +94 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +24 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +65 -0
- package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +84 -0
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +90 -0
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +117 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +8 -0
- package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/numbering-templates.const.mjs +6 -6
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +157 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +8 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +11 -0
- package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.mjs +1 -1
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +6 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +34 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +26 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +60 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +55 -0
- package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +54 -0
- package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +84 -0
- package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +123 -0
- package/esm2022/lib/editor/components/edges/edge-element.model.mjs +9 -0
- package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +6 -0
- package/esm2022/lib/editor/components/edges/edge.component.mjs +99 -0
- package/esm2022/lib/editor/components/edges/edges.mjs +108 -0
- package/esm2022/lib/editor/components/edges/page-type.enum.mjs +7 -0
- package/esm2022/lib/editor/components/editor.component.mjs +112 -0
- package/esm2022/lib/editor/components/external-element/external-element.service.mjs +6 -0
- package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +4 -0
- package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +2 -0
- package/esm2022/lib/editor/components/external-element/external.component.mjs +41 -0
- package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +9 -0
- package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +11 -0
- package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +15 -0
- package/esm2022/lib/editor/components/image/components/image.component.mjs +88 -0
- package/esm2022/lib/editor/components/image/image-api.service.mjs +36 -0
- package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +38 -0
- package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +2 -0
- package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +19 -0
- package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +12 -0
- package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +106 -0
- package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +2 -0
- package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +52 -0
- package/esm2022/lib/editor/components/image/size.mjs +2 -0
- package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +59 -0
- package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +18 -0
- package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +43 -0
- package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +2 -0
- package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +3 -0
- package/esm2022/lib/editor/components/shared/custom-content.mjs +2 -0
- package/esm2022/lib/editor/components/shared/services/component.service.mjs +64 -0
- package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +163 -0
- package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +55 -0
- package/esm2022/lib/editor/components/tab/tab.component.mjs +44 -0
- package/esm2022/lib/editor/components/tab/tab.helper.mjs +6 -0
- package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +118 -0
- package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +97 -0
- package/esm2022/lib/editor/components/table/components/table.component.mjs +401 -0
- package/esm2022/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.mjs +1 -1
- package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +8 -0
- package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +6 -0
- package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +18 -0
- package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +9 -0
- package/esm2022/lib/editor/components/table/models/row-data.model.mjs +8 -0
- package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +7 -0
- package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +74 -0
- package/esm2022/lib/editor/components/table/selection/table-selection.mjs +366 -0
- package/esm2022/lib/editor/content/constants/display-values.const.mjs +8 -0
- package/esm2022/lib/editor/content/constants/document-info.const.mjs +13 -0
- package/esm2022/lib/editor/content/constants/editor.const.mjs +62 -0
- package/esm2022/lib/editor/content/contents.interface.mjs +2 -0
- package/esm2022/lib/editor/content/display-data/display-token.model.mjs +12 -0
- package/esm2022/lib/editor/content/display-data/document.mjs +134 -0
- package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +10 -0
- package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +11 -0
- package/esm2022/lib/editor/content/display-data/indent.model.mjs +9 -0
- package/esm2022/lib/editor/content/display-data/line-info.model.mjs +9 -0
- package/esm2022/lib/editor/content/display-data/lines.mjs +96 -0
- package/esm2022/lib/editor/content/display-data/pages.wrap.mjs +226 -0
- package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +2 -0
- package/esm2022/lib/editor/content/display-data/paragraph.mjs +52 -0
- package/esm2022/lib/editor/content/display-data/text-line-info.mjs +34 -0
- package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +2 -0
- package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +96 -0
- package/esm2022/lib/{+shared/editor → editor/content}/helpers/format.helper.mjs +1 -1
- package/esm2022/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.mjs +1 -1
- package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +9 -0
- package/esm2022/lib/editor/content/margin.model.mjs +16 -0
- package/esm2022/lib/editor/content/page-vertical-data.model.mjs +9 -0
- package/esm2022/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.mjs +1 -1
- package/esm2022/lib/editor/core/event-emitting.mjs +56 -0
- package/esm2022/lib/editor/display/cell.interface.mjs +2 -0
- package/esm2022/lib/editor/display/event.helper.mjs +18 -0
- package/esm2022/lib/editor/display/layers/cursor.layer.mjs +101 -0
- package/esm2022/lib/editor/display/layers/layer.config.mjs +2 -0
- package/esm2022/lib/editor/display/layers/pages.layer.mjs +97 -0
- package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +7 -0
- package/esm2022/lib/editor/display/layers/print.text.layer.mjs +7 -0
- package/esm2022/lib/editor/display/layers/selection.layer.mjs +113 -0
- package/esm2022/lib/editor/display/layers/text.layer.mjs +203 -0
- package/esm2022/lib/editor/display/print/print.helper.mjs +40 -0
- package/esm2022/lib/editor/display/print/print.renderer.mjs +67 -0
- package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +7 -0
- package/esm2022/lib/editor/display/render-changes.interface.mjs +2 -0
- package/esm2022/lib/editor/display/render-changes.model.mjs +25 -0
- package/esm2022/lib/editor/display/renderer.mjs +206 -0
- package/esm2022/lib/editor/display/rendering.helper.mjs +187 -0
- package/esm2022/lib/editor/display/renderloop.mjs +26 -0
- package/esm2022/lib/editor/display/virtual.renderer.mjs +317 -0
- package/esm2022/lib/editor/display/visible-range.interface.mjs +2 -0
- package/esm2022/lib/editor/editor.module.mjs +67 -0
- package/esm2022/lib/editor/execution/distance.model.mjs +10 -0
- package/esm2022/lib/editor/execution/edit.session.mjs +1117 -0
- package/esm2022/lib/editor/execution/editor.mjs +1346 -0
- package/esm2022/lib/editor/execution/helpers/delta.helper.mjs +18 -0
- package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +42 -0
- package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +64 -0
- package/esm2022/lib/editor/execution/helpers/page.helper.mjs +12 -0
- package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +41 -0
- package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +169 -0
- package/esm2022/lib/editor/execution/regulator.service.mjs +198 -0
- package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +19 -0
- package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +15 -0
- package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +8 -0
- package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +3 -0
- package/esm2022/lib/editor/execution/targeting/session.model.mjs +10 -0
- package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +2 -0
- package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +2 -0
- package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +88 -0
- package/esm2022/lib/editor/gadgets/history/operation-history.mjs +206 -0
- package/esm2022/lib/editor/gadgets/history/operation.type.mjs +2 -0
- package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +7 -0
- package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +9 -0
- package/esm2022/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.mjs +1 -1
- package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +82 -0
- package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +7 -0
- package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +18 -0
- package/esm2022/lib/editor/gadgets/scrollbar.mjs +81 -0
- package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +2 -0
- package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +2 -0
- package/esm2022/lib/editor/gadgets/search/search.mjs +231 -0
- package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +5 -0
- package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +20 -0
- package/esm2022/lib/editor/interaction/base.handler.mjs +19 -0
- package/esm2022/lib/editor/interaction/document.handler.mjs +27 -0
- package/esm2022/lib/editor/interaction/editor.service.mjs +325 -0
- package/esm2022/lib/editor/interaction/input.handler.mjs +149 -0
- package/esm2022/lib/{+shared/enums → editor/interaction}/mode.enum.mjs +1 -1
- package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +7 -0
- package/esm2022/lib/editor/interaction/mouse.handler.mjs +49 -0
- package/esm2022/lib/editor/interaction/text-input.mjs +53 -0
- package/esm2022/lib/editor/operations/commands.service.mjs +20 -0
- package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +32 -0
- package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +7 -0
- package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +9 -0
- package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +15 -0
- package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +55 -0
- package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +19 -0
- package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +43 -0
- package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +28 -0
- package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +55 -0
- package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +114 -0
- package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +16 -0
- package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +374 -0
- package/esm2022/lib/editor/operations/operations-helper.helper.mjs +432 -0
- package/esm2022/lib/editor/operations/save-commands.helper.mjs +127 -0
- package/esm2022/lib/editor/operations/target-operations.helper.mjs +23 -0
- package/esm2022/lib/editor/positioning/alignments.const.mjs +8 -0
- package/esm2022/lib/editor/positioning/content.helper.mjs +36 -0
- package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +13 -0
- package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +2 -0
- package/esm2022/lib/editor/positioning/insert-index.interface.mjs +2 -0
- package/esm2022/lib/editor/positioning/line-width.helper.mjs +13 -0
- package/esm2022/lib/editor/positioning/position.helper.mjs +194 -0
- package/esm2022/lib/editor/positioning/range.mjs +94 -0
- package/esm2022/lib/editor/positioning/selection.mjs +307 -0
- package/esm2022/lib/editor/revision.helper.mjs +91 -0
- package/esm2022/lib/models/generated/command.model.mjs +5 -1
- package/esm2022/lib/models/generated/insert-paragraph.model.mjs +20 -0
- package/esm2022/lib/models/generated/replace.model.mjs +5 -1
- package/esm2022/public-api.mjs +36 -33
- package/fesm2022/talrace-ngx-noder.mjs +3583 -3278
- package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
- package/lib/{+shared → apart-components}/add-link-dialog/add-link-dialog.component.d.ts +1 -1
- package/lib/apart-components/add-link-mobile/add-link-mobile.component.d.ts +19 -0
- package/lib/{+shared → apart-components}/confirm-dialog/confirm-dialog.component.d.ts +1 -1
- package/lib/{+shared → apart-components}/editor-search/editor-search-dialog.component.d.ts +6 -7
- package/lib/{+shared → apart-components}/editor-title/editor-title.component.d.ts +4 -3
- package/lib/apart-components/editor-title-mobile/editor-title-mobile.component.d.ts +6 -0
- package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +49 -0
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/color-picker/color-picker.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font/font.component.d.ts +2 -2
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-size/font-size.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-style/font-style.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/format/format.component.d.ts +2 -2
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/heading/heading.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/numbering/numbering.component.d.ts +3 -3
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/print/print.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/undo-redo/undo-redo.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/zoom/zoom.component.d.ts +1 -1
- package/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.d.ts +36 -0
- package/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.d.ts +14 -0
- package/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.d.ts +23 -0
- package/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.d.ts +26 -0
- package/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.d.ts +40 -0
- package/lib/apart-components/editor-toolbar/editor-toolbar.module.d.ts +32 -0
- package/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.d.ts +2 -0
- package/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.d.ts +6 -0
- package/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.d.ts +9 -0
- package/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.d.ts +14 -0
- package/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.d.ts +38 -0
- package/lib/{+shared/editor-toolbar/helpers → apart-components/editor-toolbar/shared}/toolbar-styles.helper.d.ts +2 -2
- package/lib/{+shared → apart-components}/insert-table/insert-table.component.d.ts +1 -1
- package/lib/apart-components/insert-table-mobile/insert-table-mobile.component.d.ts +30 -0
- package/lib/apart-components/text-format-mobile/text-format-mobile.component.d.ts +35 -0
- package/lib/{+shared/editor/core/models → editor/components/edges}/edge-element.model.d.ts +1 -1
- package/lib/editor/components/edges/edge.component.d.ts +44 -0
- package/lib/{+shared/editor/core → editor}/components/edges/edges.d.ts +7 -7
- package/lib/{+shared/editor → editor/components}/editor.component.d.ts +10 -7
- package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-sidenav.interface.d.ts +1 -1
- package/lib/{+shared/editor/custom-components → editor/components}/external-element/external.component.d.ts +4 -4
- package/lib/{+shared/editor/custom-components → editor/components}/image/components/image.component.d.ts +4 -4
- package/lib/editor/components/image/image-api.service.d.ts +17 -0
- package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/resizer.component.d.ts +2 -2
- package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-wrapper.d.ts +1 -1
- package/lib/{+shared/editor/custom-components → editor/components}/shared/abstract/base.component.d.ts +4 -4
- package/lib/editor/components/shared/abstract/destroy.component.d.ts +9 -0
- package/lib/{+shared/editor/custom-components/shared/helpers → editor/components/shared}/custom-component.hepler.d.ts +3 -3
- package/lib/editor/components/shared/custom-components.interface.d.ts +13 -0
- package/lib/editor/components/shared/custom-content.d.ts +5 -0
- package/lib/{+shared/editor/custom-components/shared/services/component → editor/components/shared/services}/component.service.d.ts +1 -1
- package/lib/{+shared/editor/custom-components/shared/services/custom-content → editor/components/shared/services}/custom-content.service.d.ts +14 -12
- package/lib/{+shared/editor/custom-components → editor/components}/tab/tab.component.d.ts +2 -2
- package/lib/{+shared/editor/custom-components → editor/components}/table/cell-resizer/cell-resizer.d.ts +1 -1
- package/lib/{+shared/editor/custom-components → editor/components}/table/components/table-cell.component.d.ts +10 -10
- package/lib/{+shared/editor/custom-components → editor/components}/table/components/table.component.d.ts +8 -8
- package/lib/{+shared/editor/custom-components → editor/components}/table/overlay-menu/overlay-menu.component.d.ts +2 -2
- package/lib/{+shared/editor/custom-components → editor/components}/table/selection/table-selection.d.ts +3 -3
- package/lib/{+shared/editor/core → editor/content}/constants/editor.const.d.ts +3 -3
- package/lib/editor/content/contents.interface.d.ts +22 -0
- package/lib/{+shared/editor/core/models → editor/content/display-data}/display-token.model.d.ts +1 -1
- package/lib/{+shared/editor/core → editor/content/display-data}/document.d.ts +9 -9
- package/lib/{+shared/editor/core/models → editor/content/display-data}/format-ext.model.d.ts +1 -1
- package/lib/{+shared/editor/execution/models → editor/content/display-data}/general-properties.model.d.ts +1 -1
- package/lib/{+shared/editor/core/layers → editor/content/display-data}/lines.d.ts +1 -1
- package/lib/{+shared/editor/core/paging → editor/content/display-data}/pages.wrap.d.ts +13 -13
- package/lib/{+shared/editor/core/paging → editor/content/display-data}/paragraph.d.ts +4 -4
- package/lib/{+shared/editor/core/paging → editor/content/display-data}/text-line-info.d.ts +2 -2
- package/lib/editor/content/helpers/content-style.helper.d.ts +11 -0
- package/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.d.ts +1 -1
- package/lib/{+shared/editor/core/paging → editor/content}/page-vertical-data.model.d.ts +1 -1
- package/lib/{+shared/editor/core/base → editor/core}/event-emitting.d.ts +0 -5
- package/lib/{+shared/editor/core → editor/display}/layers/cursor.layer.d.ts +7 -8
- package/lib/{+shared/editor/core/interfaces → editor/display/layers}/layer.config.d.ts +2 -2
- package/lib/{+shared/editor/core → editor/display}/layers/pages.layer.d.ts +5 -6
- package/lib/editor/display/layers/print.text.layer.d.ts +4 -0
- package/lib/{+shared/editor/core → editor/display}/layers/selection.layer.d.ts +5 -6
- package/lib/editor/display/layers/text.layer.d.ts +34 -0
- package/lib/{+shared/helpers → editor/display/print}/print.helper.d.ts +3 -3
- package/lib/editor/display/print/print.renderer.d.ts +23 -0
- package/lib/{+shared/editor/core/helpers → editor/display/print}/print.rendering.helper.d.ts +2 -2
- package/lib/{+shared/editor/core/models → editor/display}/render-changes.model.d.ts +1 -1
- package/lib/{+shared/editor/core → editor/display}/renderer.d.ts +10 -13
- package/lib/{+shared/editor/core/helpers → editor/display}/rendering.helper.d.ts +7 -7
- package/lib/{+shared/editor/core/layers → editor/display}/renderloop.d.ts +2 -2
- package/lib/{+shared/editor/core → editor/display}/virtual.renderer.d.ts +14 -29
- package/lib/{+shared/editor → editor}/editor.module.d.ts +12 -10
- package/lib/{+shared/editor/core → editor/execution}/edit.session.d.ts +65 -63
- package/lib/{+shared/editor/core → editor/execution}/editor.d.ts +48 -43
- package/lib/editor/execution/helpers/delta.helper.d.ts +6 -0
- package/lib/{+shared/editor/core → editor/execution}/helpers/format-style.helper.d.ts +3 -5
- package/lib/{+shared/editor/core → editor/execution}/helpers/page.helper.d.ts +1 -1
- package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph-style.helper.d.ts +1 -1
- package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph.helper.d.ts +11 -8
- package/lib/{+shared/editor → editor}/execution/regulator.service.d.ts +15 -14
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/cell-session-source.model.d.ts +3 -3
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/edge-session-source.model.d.ts +3 -3
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/main-session-source.model.d.ts +1 -1
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session-source.model.d.ts +1 -1
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session.model.d.ts +3 -3
- package/lib/{+shared/editor/core/helpers → editor/gadgets/font-metrics}/font-metrics.helper.d.ts +1 -1
- package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation-history.d.ts +9 -7
- package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation.type.d.ts +2 -1
- package/lib/{+shared/editor/core/models → editor/gadgets/numbering}/numbering-data.model.d.ts +1 -1
- package/lib/{+shared/editor/core/helpers → editor/gadgets/numbering}/numbering.helper.d.ts +8 -8
- package/lib/{+shared/editor/helpers → editor/gadgets/page-break}/break.helper.d.ts +2 -2
- package/lib/{+shared/editor/core/layers → editor/gadgets}/scrollbar.d.ts +9 -18
- package/lib/{+shared/editor/core → editor/gadgets/search}/search.d.ts +4 -4
- package/lib/editor/interaction/base.handler.d.ts +9 -0
- package/lib/editor/interaction/document.handler.d.ts +10 -0
- package/lib/{+shared/editor → editor}/interaction/editor.service.d.ts +24 -18
- package/lib/{+shared/editor → editor}/interaction/input.handler.d.ts +4 -5
- package/lib/{+shared/editor → editor}/interaction/mouse.handler.d.ts +1 -1
- package/lib/{+shared/editor → editor}/operations/enums/command-type.enum.d.ts +11 -10
- package/lib/{+shared/editor → editor}/operations/helpers/break-operations.helper.d.ts +2 -2
- package/lib/{+shared/editor → editor}/operations/helpers/format-operations.helper.d.ts +2 -2
- package/lib/editor/operations/helpers/image-operations.helper.d.ts +7 -0
- package/lib/{+shared/editor → editor}/operations/helpers/indexed-element-operations.helper.d.ts +1 -1
- package/lib/{+shared/editor → editor}/operations/helpers/link-operations.helper.d.ts +1 -1
- package/lib/{+shared/editor → editor}/operations/helpers/numbering-operations.helper.d.ts +3 -3
- package/lib/{+shared/editor → editor}/operations/helpers/paragraph-operations.helper.d.ts +3 -2
- package/lib/{+shared/editor → editor}/operations/helpers/tab-operations.helper.d.ts +1 -1
- package/lib/{+shared/editor → editor}/operations/helpers/table-operations.helper.d.ts +6 -6
- package/lib/{+shared/editor/operations/helpers → editor/operations}/operations-helper.helper.d.ts +21 -19
- package/lib/{+shared/editor/operations/helpers → editor/operations}/save-commands.helper.d.ts +28 -22
- package/lib/editor/operations/target-operations.helper.d.ts +6 -0
- package/lib/{+shared/editor/helpers → editor/positioning}/content.helper.d.ts +10 -5
- package/lib/editor/positioning/cursor-paragraph.d.ts +7 -0
- package/lib/{+shared/editor/core/interfaces → editor/positioning}/cursor-position.interface.d.ts +1 -1
- package/lib/{+shared/editor/core/helpers → editor/positioning}/line-width.helper.d.ts +2 -2
- package/lib/{+shared/editor/core/helpers → editor/positioning}/position.helper.d.ts +9 -9
- package/lib/{+shared/editor/core → editor/positioning}/range.d.ts +12 -12
- package/lib/{+shared/editor → editor}/positioning/selection.d.ts +10 -10
- package/lib/editor/revision.helper.d.ts +15 -0
- package/lib/models/generated/command.model.d.ts +2 -0
- package/lib/models/generated/insert-paragraph.model.d.ts +10 -0
- package/lib/models/generated/replace.model.d.ts +2 -0
- package/package.json +1 -1
- package/public-api.d.ts +35 -32
- package/src/_ngx-noder.theme.scss +14 -9
- package/src/assets/fonts/nc-iconfont.css +112 -106
- package/src/assets/fonts/nc-iconfont.eot +0 -0
- package/src/assets/fonts/nc-iconfont.svg +4 -1
- package/src/assets/fonts/nc-iconfont.ttf +0 -0
- package/src/assets/fonts/nc-iconfont.woff +0 -0
- package/src/lib/{+shared → apart-components}/add-link-dialog/_add-link-dialog.theme.scss +1 -1
- package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +25 -0
- package/src/lib/{+shared → apart-components}/confirm-dialog/_theme.scss +1 -1
- package/src/lib/{+shared → apart-components}/editor-title/_editor-title.theme.scss +1 -1
- package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +42 -0
- package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +27 -0
- package/src/lib/apart-components/editor-toolbar/_theme.scss +25 -0
- package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +12 -0
- package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font/_font.theme.scss +1 -1
- package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-size/_font-size.theme.scss +1 -1
- package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-style/_font-style.theme.scss +1 -1
- package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/format/_format.theme.scss +1 -1
- package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/numbering/_numbering.theme.scss +1 -1
- package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/undo-redo/_undo-redo.theme.scss +1 -1
- package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components}/menu-dropdowns/_menu-dropdowns.theme.scss +1 -1
- package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +33 -0
- package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components}/toolbar-actions/_toolbar-actions.theme.scss +2 -1
- package/src/lib/{+shared → apart-components}/insert-table/_insert-table.theme.scss +1 -1
- package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +54 -0
- package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +86 -0
- package/src/lib/{+shared/editor → editor}/_theme.scss +1 -1
- package/src/lib/{+shared/editor → editor/components}/_editor.theme.scss +10 -2
- package/src/scss/base-editor.scss +329 -0
- package/src/styles.scss +3 -58
- package/esm2022/lib/+shared/abstract/base-api.service.mjs +0 -99
- package/esm2022/lib/+shared/abstract/observer.component.mjs +0 -24
- package/esm2022/lib/+shared/add-link-dialog/add-link-dialog.component.mjs +0 -71
- package/esm2022/lib/+shared/confirm-dialog/confirm-dialog.component.mjs +0 -32
- package/esm2022/lib/+shared/constants/default-file-name.const.mjs +0 -2
- package/esm2022/lib/+shared/constants/paginator-sizes.const.mjs +0 -3
- package/esm2022/lib/+shared/editor/core/base/event-emitting.mjs +0 -71
- package/esm2022/lib/+shared/editor/core/components/edges/edge-type.enum.mjs +0 -6
- package/esm2022/lib/+shared/editor/core/components/edges/edge.component.mjs +0 -100
- package/esm2022/lib/+shared/editor/core/components/edges/edges.mjs +0 -104
- package/esm2022/lib/+shared/editor/core/constants/alignments.const.mjs +0 -8
- package/esm2022/lib/+shared/editor/core/constants/clipboardEventTypes.const.mjs +0 -6
- package/esm2022/lib/+shared/editor/core/constants/content-style-change.const.mjs +0 -15
- package/esm2022/lib/+shared/editor/core/constants/display-values.const.mjs +0 -8
- package/esm2022/lib/+shared/editor/core/constants/document-info.const.mjs +0 -13
- package/esm2022/lib/+shared/editor/core/constants/editor-version.const.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/constants/editor.const.mjs +0 -62
- package/esm2022/lib/+shared/editor/core/constants/unicode-chars.const.mjs +0 -5
- package/esm2022/lib/+shared/editor/core/document.mjs +0 -134
- package/esm2022/lib/+shared/editor/core/edit.session.mjs +0 -1099
- package/esm2022/lib/+shared/editor/core/editor.mjs +0 -1274
- package/esm2022/lib/+shared/editor/core/enums/break-types.enum.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/enums/mouse-button.enum.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/enums/page-type.enum.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/helpers/content-style.helper.mjs +0 -156
- package/esm2022/lib/+shared/editor/core/helpers/delta.helper.mjs +0 -18
- package/esm2022/lib/+shared/editor/core/helpers/dom.helper.mjs +0 -42
- package/esm2022/lib/+shared/editor/core/helpers/event.helper.mjs +0 -18
- package/esm2022/lib/+shared/editor/core/helpers/font-metrics.helper.mjs +0 -88
- package/esm2022/lib/+shared/editor/core/helpers/format-style.helper.mjs +0 -72
- package/esm2022/lib/+shared/editor/core/helpers/line-width.helper.mjs +0 -13
- package/esm2022/lib/+shared/editor/core/helpers/numbering.helper.mjs +0 -83
- package/esm2022/lib/+shared/editor/core/helpers/page.helper.mjs +0 -12
- package/esm2022/lib/+shared/editor/core/helpers/paragraph-style.helper.mjs +0 -41
- package/esm2022/lib/+shared/editor/core/helpers/paragraph.helper.mjs +0 -169
- package/esm2022/lib/+shared/editor/core/helpers/position.helper.mjs +0 -194
- package/esm2022/lib/+shared/editor/core/helpers/print.rendering.helper.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/helpers/rendering.helper.mjs +0 -187
- package/esm2022/lib/+shared/editor/core/helpers/unicode.helper.mjs +0 -20
- package/esm2022/lib/+shared/editor/core/interfaces/cell.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/cursor-position.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/font-metric-size.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/layer.config.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/paragraph-info.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/render-changes.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/replace.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/search-iteration.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/toolbar-styles.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/visible-line-info.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/visible-range.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/keyboard/text-input.mjs +0 -53
- package/esm2022/lib/+shared/editor/core/layers/cursor.layer.mjs +0 -103
- package/esm2022/lib/+shared/editor/core/layers/edges.layer.mjs +0 -99
- package/esm2022/lib/+shared/editor/core/layers/lines.mjs +0 -96
- package/esm2022/lib/+shared/editor/core/layers/pages.layer.mjs +0 -106
- package/esm2022/lib/+shared/editor/core/layers/print.edges.layer.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/layers/print.pages.layer.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/layers/print.text.layer.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/layers/renderloop.mjs +0 -26
- package/esm2022/lib/+shared/editor/core/layers/scrollbar.mjs +0 -100
- package/esm2022/lib/+shared/editor/core/layers/selection.layer.mjs +0 -115
- package/esm2022/lib/+shared/editor/core/layers/text.layer.mjs +0 -124
- package/esm2022/lib/+shared/editor/core/models/display-token.model.mjs +0 -12
- package/esm2022/lib/+shared/editor/core/models/distance.model.mjs +0 -10
- package/esm2022/lib/+shared/editor/core/models/edge-element.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/models/format-ext.model.mjs +0 -10
- package/esm2022/lib/+shared/editor/core/models/indent.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/models/line-info.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/models/margin.model.mjs +0 -16
- package/esm2022/lib/+shared/editor/core/models/numbering-data.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/models/render-changes.model.mjs +0 -25
- package/esm2022/lib/+shared/editor/core/paging/page-vertical-data.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/paging/pages.wrap.mjs +0 -226
- package/esm2022/lib/+shared/editor/core/paging/paragraph.mjs +0 -52
- package/esm2022/lib/+shared/editor/core/paging/text-line-info.mjs +0 -34
- package/esm2022/lib/+shared/editor/core/point.mjs +0 -13
- package/esm2022/lib/+shared/editor/core/print.renderer.mjs +0 -72
- package/esm2022/lib/+shared/editor/core/range.mjs +0 -94
- package/esm2022/lib/+shared/editor/core/renderer.mjs +0 -217
- package/esm2022/lib/+shared/editor/core/search.mjs +0 -231
- package/esm2022/lib/+shared/editor/core/virtual.renderer.mjs +0 -356
- package/esm2022/lib/+shared/editor/custom-components/external-element/external-element.service.mjs +0 -6
- package/esm2022/lib/+shared/editor/custom-components/external-element/external-elements.const.mjs +0 -4
- package/esm2022/lib/+shared/editor/custom-components/external-element/external-sidenav.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/external-element/external.component.mjs +0 -41
- package/esm2022/lib/+shared/editor/custom-components/external-element/models/element-data.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-element.model.mjs +0 -11
- package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-sidenav.model.mjs +0 -15
- package/esm2022/lib/+shared/editor/custom-components/image/components/image.component.mjs +0 -88
- package/esm2022/lib/+shared/editor/custom-components/image/input-handler/image-input.handler.mjs +0 -38
- package/esm2022/lib/+shared/editor/custom-components/image/interfaces/size.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/coordinate.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction-wrapper.mjs +0 -19
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction.enum.mjs +0 -12
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/resizer.component.mjs +0 -106
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-delta.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-wrapper.mjs +0 -52
- package/esm2022/lib/+shared/editor/custom-components/image/services/image-api.service.mjs +0 -14
- package/esm2022/lib/+shared/editor/custom-components/shared/abstract/base.component.mjs +0 -59
- package/esm2022/lib/+shared/editor/custom-components/shared/constants/custom-content-markers.const.mjs +0 -3
- package/esm2022/lib/+shared/editor/custom-components/shared/helpers/custom-component.hepler.mjs +0 -43
- package/esm2022/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/shared/services/component/component.service.mjs +0 -64
- package/esm2022/lib/+shared/editor/custom-components/shared/services/custom-content/custom-content.service.mjs +0 -115
- package/esm2022/lib/+shared/editor/custom-components/shared/services/overlay/overlay.service.mjs +0 -55
- package/esm2022/lib/+shared/editor/custom-components/shared/types/custom-content.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/tab/tab.component.mjs +0 -44
- package/esm2022/lib/+shared/editor/custom-components/table/cell-resizer/cell-resizer.mjs +0 -118
- package/esm2022/lib/+shared/editor/custom-components/table/components/table-cell.component.mjs +0 -97
- package/esm2022/lib/+shared/editor/custom-components/table/components/table.component.mjs +0 -401
- package/esm2022/lib/+shared/editor/custom-components/table/enums/reisizer-side.enum.mjs +0 -8
- package/esm2022/lib/+shared/editor/custom-components/table/enums/vertical-merge.enum.mjs +0 -6
- package/esm2022/lib/+shared/editor/custom-components/table/models/cell-data.model.mjs +0 -18
- package/esm2022/lib/+shared/editor/custom-components/table/models/cell-resizer-parameters.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/custom-components/table/models/row-data.model.mjs +0 -8
- package/esm2022/lib/+shared/editor/custom-components/table/models/selection-range.model.mjs +0 -7
- package/esm2022/lib/+shared/editor/custom-components/table/overlay-menu/overlay-menu.component.mjs +0 -74
- package/esm2022/lib/+shared/editor/custom-components/table/selection/table-selection.mjs +0 -364
- package/esm2022/lib/+shared/editor/editor.component.mjs +0 -98
- package/esm2022/lib/+shared/editor/editor.module.mjs +0 -82
- package/esm2022/lib/+shared/editor/execution/models/cell-session-source.model.mjs +0 -19
- package/esm2022/lib/+shared/editor/execution/models/edge-session-source.model.mjs +0 -15
- package/esm2022/lib/+shared/editor/execution/models/general-properties.model.mjs +0 -11
- package/esm2022/lib/+shared/editor/execution/models/main-session-source.model.mjs +0 -8
- package/esm2022/lib/+shared/editor/execution/models/session-source.model.mjs +0 -3
- package/esm2022/lib/+shared/editor/execution/models/session.model.mjs +0 -10
- package/esm2022/lib/+shared/editor/execution/regulator.service.mjs +0 -203
- package/esm2022/lib/+shared/editor/helpers/break.helper.mjs +0 -18
- package/esm2022/lib/+shared/editor/helpers/content.helper.mjs +0 -30
- package/esm2022/lib/+shared/editor/helpers/tab.helper.mjs +0 -6
- package/esm2022/lib/+shared/editor/interaction/editor.service.mjs +0 -309
- package/esm2022/lib/+shared/editor/interaction/input.handler.mjs +0 -160
- package/esm2022/lib/+shared/editor/interaction/mouse.handler.mjs +0 -49
- package/esm2022/lib/+shared/editor/interfaces/contents.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/interfaces/insert-index.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/operation-history/operation-history.mjs +0 -184
- package/esm2022/lib/+shared/editor/operation-history/operation.type.mjs +0 -2
- package/esm2022/lib/+shared/editor/operation-history/operations-history-info.model.mjs +0 -7
- package/esm2022/lib/+shared/editor/operations/enums/command-type.enum.mjs +0 -31
- package/esm2022/lib/+shared/editor/operations/enums/target-type.enum.mjs +0 -7
- package/esm2022/lib/+shared/editor/operations/helpers/break-operations.helper.mjs +0 -9
- package/esm2022/lib/+shared/editor/operations/helpers/content-operations.helper.mjs +0 -15
- package/esm2022/lib/+shared/editor/operations/helpers/format-operations.helper.mjs +0 -56
- package/esm2022/lib/+shared/editor/operations/helpers/image-operations.helper.mjs +0 -19
- package/esm2022/lib/+shared/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
- package/esm2022/lib/+shared/editor/operations/helpers/link-operations.helper.mjs +0 -28
- package/esm2022/lib/+shared/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
- package/esm2022/lib/+shared/editor/operations/helpers/operations-helper.helper.mjs +0 -394
- package/esm2022/lib/+shared/editor/operations/helpers/paragraph-operations.helper.mjs +0 -83
- package/esm2022/lib/+shared/editor/operations/helpers/save-commands.helper.mjs +0 -118
- package/esm2022/lib/+shared/editor/operations/helpers/tab-operations.helper.mjs +0 -16
- package/esm2022/lib/+shared/editor/operations/helpers/table-operations.helper.mjs +0 -374
- package/esm2022/lib/+shared/editor/operations/helpers/target-operations.helper.mjs +0 -23
- package/esm2022/lib/+shared/editor/positioning/selection.mjs +0 -307
- package/esm2022/lib/+shared/editor/store/editor.actions.mjs +0 -13
- package/esm2022/lib/+shared/editor-search/editor-search-dialog.component.mjs +0 -71
- package/esm2022/lib/+shared/editor-title/editor-title.component.mjs +0 -83
- package/esm2022/lib/+shared/editor-toolbar/color-picker/color-picker.component.mjs +0 -32
- package/esm2022/lib/+shared/editor-toolbar/constants/svg-icons.const.mjs +0 -157
- package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.component.mjs +0 -101
- package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.module.mjs +0 -117
- package/esm2022/lib/+shared/editor-toolbar/enums/alignment.enum.mjs +0 -8
- package/esm2022/lib/+shared/editor-toolbar/enums/numbering-type.enum.mjs +0 -6
- package/esm2022/lib/+shared/editor-toolbar/font/font.component.mjs +0 -45
- package/esm2022/lib/+shared/editor-toolbar/font-size/font-size.component.mjs +0 -85
- package/esm2022/lib/+shared/editor-toolbar/font-style/font-style.component.mjs +0 -80
- package/esm2022/lib/+shared/editor-toolbar/format/format.component.mjs +0 -28
- package/esm2022/lib/+shared/editor-toolbar/heading/heading.component.mjs +0 -23
- package/esm2022/lib/+shared/editor-toolbar/helpers/toolbar-styles.helper.mjs +0 -55
- package/esm2022/lib/+shared/editor-toolbar/menu-dropdowns/menu-dropdowns.component.mjs +0 -194
- package/esm2022/lib/+shared/editor-toolbar/numbering/numbering.component.mjs +0 -53
- package/esm2022/lib/+shared/editor-toolbar/print/print.component.mjs +0 -18
- package/esm2022/lib/+shared/editor-toolbar/toolbar-actions/toolbar-actions.component.mjs +0 -126
- package/esm2022/lib/+shared/editor-toolbar/undo-redo/undo-redo.component.mjs +0 -27
- package/esm2022/lib/+shared/editor-toolbar/zoom/zoom.component.mjs +0 -74
- package/esm2022/lib/+shared/helpers/print.helper.mjs +0 -40
- package/esm2022/lib/+shared/helpers/revision.helper.mjs +0 -91
- package/esm2022/lib/+shared/helpers/scaling.helper.mjs +0 -9
- package/esm2022/lib/+shared/helpers/validation.helper.mjs +0 -7
- package/esm2022/lib/+shared/insert-table/insert-table.component.mjs +0 -54
- package/esm2022/lib/+shared/services/commands.service.mjs +0 -20
- package/esm2022/lib/+shared/services/custom-icon.service.mjs +0 -34
- package/lib/+shared/abstract/base-api.service.d.ts +0 -23
- package/lib/+shared/abstract/observer.component.d.ts +0 -10
- package/lib/+shared/constants/default-file-name.const.d.ts +0 -1
- package/lib/+shared/constants/paginator-sizes.const.d.ts +0 -2
- package/lib/+shared/editor/core/components/edges/edge.component.d.ts +0 -45
- package/lib/+shared/editor/core/constants/clipboardEventTypes.const.d.ts +0 -5
- package/lib/+shared/editor/core/constants/content-style-change.const.d.ts +0 -14
- package/lib/+shared/editor/core/helpers/content-style.helper.d.ts +0 -16
- package/lib/+shared/editor/core/helpers/delta.helper.d.ts +0 -6
- package/lib/+shared/editor/core/interfaces/visible-line-info.interface.d.ts +0 -5
- package/lib/+shared/editor/core/layers/edges.layer.d.ts +0 -24
- package/lib/+shared/editor/core/layers/print.edges.layer.d.ts +0 -4
- package/lib/+shared/editor/core/layers/print.text.layer.d.ts +0 -5
- package/lib/+shared/editor/core/layers/text.layer.d.ts +0 -22
- package/lib/+shared/editor/core/point.d.ts +0 -7
- package/lib/+shared/editor/core/print.renderer.d.ts +0 -25
- package/lib/+shared/editor/custom-components/image/services/image-api.service.d.ts +0 -8
- package/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.d.ts +0 -13
- package/lib/+shared/editor/custom-components/shared/types/custom-content.d.ts +0 -5
- package/lib/+shared/editor/interfaces/contents.interface.d.ts +0 -22
- package/lib/+shared/editor/operations/helpers/image-operations.helper.d.ts +0 -7
- package/lib/+shared/editor/operations/helpers/target-operations.helper.d.ts +0 -6
- package/lib/+shared/editor/store/editor.actions.d.ts +0 -11
- package/lib/+shared/editor-toolbar/constants/numbering-templates.const.d.ts +0 -6
- package/lib/+shared/editor-toolbar/editor-toolbar.component.d.ts +0 -45
- package/lib/+shared/editor-toolbar/editor-toolbar.module.d.ts +0 -31
- package/lib/+shared/editor-toolbar/menu-dropdowns/menu-dropdowns.component.d.ts +0 -73
- package/lib/+shared/editor-toolbar/toolbar-actions/toolbar-actions.component.d.ts +0 -49
- package/lib/+shared/helpers/revision.helper.d.ts +0 -15
- package/src/lib/+shared/editor-toolbar/_editor-toolbar.theme.scss +0 -10
- package/src/lib/+shared/editor-toolbar/_theme.scss +0 -21
- package/src/scss/_mixins.scss +0 -14
- package/src/scss/_variables.scss +0 -1
- /package/lib/{+shared/helpers → apart-components/add-link-dialog}/validation.helper.d.ts +0 -0
- /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/svg-icons.const.d.ts +0 -0
- /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/alignment.enum.d.ts +0 -0
- /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-type.enum.d.ts +0 -0
- /package/lib/{+shared → apart-components/editor-toolbar/shared}/services/custom-icon.service.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor}/components/edges/edge-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/components/edges}/page-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-element.service.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-elements.const.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/element-data.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-element.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-sidenav.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/input-handler/image-input.handler.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/coordinate.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction-wrapper.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-delta.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components/image/interfaces → editor/components/image}/size.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components/shared/constants → editor/components/shared}/custom-content-markers.const.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components/shared/services/overlay → editor/components/shared/services}/overlay.service.d.ts +0 -0
- /package/lib/{+shared/editor/helpers → editor/components/tab}/tab.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/reisizer-side.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/vertical-merge.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-data.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-resizer-parameters.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/models/row-data.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/models/selection-range.model.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/content}/constants/display-values.const.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/content}/constants/document-info.const.d.ts +0 -0
- /package/lib/{+shared/editor/core/models → editor/content/display-data}/indent.model.d.ts +0 -0
- /package/lib/{+shared/editor/core/models → editor/content/display-data}/line-info.model.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/paragraph-info.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/toolbar-styles.interface.d.ts +0 -0
- /package/lib/{+shared/editor → editor/content}/helpers/format.helper.d.ts +0 -0
- /package/lib/{+shared → editor/content}/helpers/scaling.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core/models → editor/content}/margin.model.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/display}/cell.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/helpers → editor/display}/event.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/display}/layers/print.pages.layer.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/display}/render-changes.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/display}/visible-range.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/models → editor/execution}/distance.model.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/execution}/helpers/dom.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core/constants → editor/gadgets/font-metrics}/editor-version.const.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/gadgets/font-metrics}/font-metric-size.interface.d.ts +0 -0
- /package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operations-history-info.model.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/gadgets/page-break}/break-types.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/replace.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/search-iteration.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/constants → editor/gadgets/unicode}/unicode-chars.const.d.ts +0 -0
- /package/lib/{+shared/editor/core/helpers → editor/gadgets/unicode}/unicode.helper.d.ts +0 -0
- /package/lib/{+shared/enums → editor/interaction}/mode.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/interaction}/mouse-button.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/keyboard → editor/interaction}/text-input.d.ts +0 -0
- /package/lib/{+shared/services → editor/operations}/commands.service.d.ts +0 -0
- /package/lib/{+shared/editor → editor}/operations/enums/target-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor → editor}/operations/helpers/content-operations.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core/constants → editor/positioning}/alignments.const.d.ts +0 -0
- /package/lib/{+shared/editor/interfaces → editor/positioning}/insert-index.interface.d.ts +0 -0
|
@@ -0,0 +1,1117 @@
|
|
|
1
|
+
import { Alignment } from '../positioning/alignments.const';
|
|
2
|
+
import { BreakHelper } from '../gadgets/page-break/break.helper';
|
|
3
|
+
import { BreakTypes } from '../gadgets/page-break/break-types.enum';
|
|
4
|
+
import { ContentHelper } from '../positioning/content.helper';
|
|
5
|
+
import { ContentStyleHelper } from '../content/helpers/content-style.helper';
|
|
6
|
+
import { CursorParagraph } from '../positioning/cursor-paragraph';
|
|
7
|
+
import { CUSTOM_ELEMENT_MARKER } from '../components/shared/custom-content-markers.const';
|
|
8
|
+
import { CustomComponentHelper } from '../components/shared/custom-component.hepler';
|
|
9
|
+
import { DEFAULT_BACKGROUND_COLOR, DEFAULT_FONT_COLOR, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_PARAGRAPH_STYLE, HYPERLINK_HEADING_STYLE_ID, NEW_LINE_MARKUP } from '../content/constants/editor.const';
|
|
10
|
+
import { DisplayToken } from '../content/display-data/display-token.model';
|
|
11
|
+
import { DisplayValue } from '../content/constants/display-values.const';
|
|
12
|
+
import { DocxModel } from '../../models/generated/docx.model';
|
|
13
|
+
import { Edges } from '../components/edges/edges';
|
|
14
|
+
import { ElementModel } from '../../models/generated/element.model';
|
|
15
|
+
import { EventEmitting } from '../core/event-emitting';
|
|
16
|
+
import { FontMetrics } from '../gadgets/font-metrics/font-metrics.helper';
|
|
17
|
+
import { FormatStyleHelper } from './helpers/format-style.helper';
|
|
18
|
+
import { ImageDataModel } from '../../models/generated/image-data.model';
|
|
19
|
+
import { IndentModel } from '../content/display-data/indent.model';
|
|
20
|
+
import { InsertElementModel } from '../../models/generated/insert-element.model';
|
|
21
|
+
import { LineInfoModel } from '../content/display-data/line-info.model';
|
|
22
|
+
import { NoderImageComponent } from '../components/image/components/image.component';
|
|
23
|
+
import { NoderTabComponent } from '../components/tab/tab.component';
|
|
24
|
+
import { NoderTableComponent } from '../components/table/components/table.component';
|
|
25
|
+
import { NumberingHelper } from '../gadgets/numbering/numbering.helper';
|
|
26
|
+
import { NumberingMarkerType } from '../gadgets/numbering/numbering-marker-type.enum';
|
|
27
|
+
import { OperationsHelper } from '../operations/operations-helper.helper';
|
|
28
|
+
import { PagesWrap } from '../content/display-data/pages.wrap';
|
|
29
|
+
import { ParagraphHelper } from './helpers/paragraph.helper';
|
|
30
|
+
import { ParagraphStyleHelper } from './helpers/paragraph-style.helper';
|
|
31
|
+
import { Range } from '../positioning/range';
|
|
32
|
+
import { TabHelper } from '../components/tab/tab.helper';
|
|
33
|
+
import { TextStyleModel } from '../../models/generated/text-style.model';
|
|
34
|
+
import { UnicodeHelper } from '../gadgets/unicode/unicode.helper';
|
|
35
|
+
export class EditSession extends EventEmitting {
|
|
36
|
+
get scrollTop() {
|
|
37
|
+
return this.scrollBar?.scrollTop ?? 0; // only main session is scrollable
|
|
38
|
+
}
|
|
39
|
+
get stylesMap() {
|
|
40
|
+
return this._stylesMap;
|
|
41
|
+
}
|
|
42
|
+
set contentWidth(value) {
|
|
43
|
+
if (!value) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this._contentWidth = value;
|
|
47
|
+
this.updateWrapData(0, this.document.lines.length - 1);
|
|
48
|
+
}
|
|
49
|
+
get contentWidth() {
|
|
50
|
+
return this._contentWidth;
|
|
51
|
+
}
|
|
52
|
+
constructor(document, sessionId, customContentService, model, selection, generalProperties, componentService, scrollBar) {
|
|
53
|
+
super();
|
|
54
|
+
this.document = document;
|
|
55
|
+
this.sessionId = sessionId;
|
|
56
|
+
this.customContentService = customContentService;
|
|
57
|
+
this.model = model;
|
|
58
|
+
this.selection = selection;
|
|
59
|
+
this.generalProperties = generalProperties;
|
|
60
|
+
this.scrollBar = scrollBar;
|
|
61
|
+
this.tokenRe = new RegExp('^[' + UnicodeHelper.wordChars + '\\$_]+', 'g');
|
|
62
|
+
this.nonTokenRe = new RegExp('^(?:[^' + UnicodeHelper.wordChars + '\\$_]|\\s])+', 'g');
|
|
63
|
+
this.wrapData = [[]]; // Wrap indexes for document rows
|
|
64
|
+
this.wrapParagraphLine = []; // line numbers that begin the paragraphs
|
|
65
|
+
this.wrapParagraphIndex = []; // symbol indexes that begin the paragraphs
|
|
66
|
+
this._stylesMap = {
|
|
67
|
+
fontFamily: DEFAULT_FONT_FAMILY,
|
|
68
|
+
fontSize: DEFAULT_FONT_SIZE,
|
|
69
|
+
fontColor: DEFAULT_FONT_COLOR,
|
|
70
|
+
alignment: Alignment.left,
|
|
71
|
+
backgroundColor: DEFAULT_BACKGROUND_COLOR,
|
|
72
|
+
highlightColor: DEFAULT_BACKGROUND_COLOR
|
|
73
|
+
};
|
|
74
|
+
const edges = model instanceof DocxModel
|
|
75
|
+
? new Edges(componentService, model.headers, model.footers, document.pageMargin, document.pageWidth, sessionId, generalProperties)
|
|
76
|
+
: null;
|
|
77
|
+
this.customComponents = { images: [], tables: [], tabs: [], customElements: [], edges: edges };
|
|
78
|
+
this.setDocument();
|
|
79
|
+
}
|
|
80
|
+
destroy() {
|
|
81
|
+
this.pagesWrap.destroy();
|
|
82
|
+
}
|
|
83
|
+
getRowLength(row) {
|
|
84
|
+
if (!this.wrapData[row]) {
|
|
85
|
+
return 1;
|
|
86
|
+
}
|
|
87
|
+
return this.wrapData[row].length + 1;
|
|
88
|
+
}
|
|
89
|
+
updateWrapParagraphIndex(first) {
|
|
90
|
+
const count = this.document.lines.length;
|
|
91
|
+
if (first === 0) {
|
|
92
|
+
this.wrapParagraphIndex[first] = 0;
|
|
93
|
+
first++;
|
|
94
|
+
}
|
|
95
|
+
for (let i = first; i < count; i++) {
|
|
96
|
+
this.wrapParagraphIndex[i] = this.wrapParagraphIndex[i - 1] + this.document.lines[i - 1].length + 1;
|
|
97
|
+
}
|
|
98
|
+
this.wrapParagraphIndex.splice(count);
|
|
99
|
+
}
|
|
100
|
+
updateWrapParagraphLine(first) {
|
|
101
|
+
const count = this.document.lines.length;
|
|
102
|
+
if (first === 0) {
|
|
103
|
+
this.wrapParagraphLine[first] = 0;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
this.wrapParagraphLine[first] = this.wrapParagraphLine[first - 1] + this.wrapData[first - 1].length + 1;
|
|
107
|
+
}
|
|
108
|
+
for (let i = first + 1; i < count; i++) {
|
|
109
|
+
this.wrapParagraphLine[i] = this.wrapParagraphLine[i - 1] + this.wrapData[i - 1].length + 1;
|
|
110
|
+
}
|
|
111
|
+
this.wrapParagraphLine.splice(count);
|
|
112
|
+
}
|
|
113
|
+
updateParagraphNumberingData(index) {
|
|
114
|
+
if (this.pagesWrap.paragraphs[index].numberingData.numberingId !== this.model.paragraphs[index].paragraphStyle.numberingId) {
|
|
115
|
+
this.pagesWrap.paragraphs[index].numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, index);
|
|
116
|
+
}
|
|
117
|
+
if (this.pagesWrap.paragraphs[index].numberingData.numberingId !== null) {
|
|
118
|
+
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[index].insertIndex);
|
|
119
|
+
NumberingHelper.updateMarkerData(this.generalProperties, this.pagesWrap.paragraphs[index], paragraphFormat.textStyle, this.model.paragraphs[index].paragraphStyle);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
updateWrapData(firstParagraph, lastParagraph) {
|
|
123
|
+
this.updateWrapParagraphIndex(firstParagraph);
|
|
124
|
+
let indexOfParagraphAfterPageBreak = this.pagesWrap.paragraphs[firstParagraph - 1]?.isEndedByPageBreak ? firstParagraph : -1;
|
|
125
|
+
let firstUsedTabIndex = this.model.tabs.findIndex(x => x.insertIndex >= this.wrapParagraphIndex[firstParagraph]);
|
|
126
|
+
for (let i = firstParagraph; i <= lastParagraph; i++) {
|
|
127
|
+
this.pagesWrap.tabTokens = [];
|
|
128
|
+
const currentLine = this.document.getLine(this.document.lines, i);
|
|
129
|
+
const isNextLineExists = this.document.lines.length > i + 1;
|
|
130
|
+
const { splits, rowInfos } = this.getSplits(this.model, currentLine, this.wrapParagraphIndex[i], i, isNextLineExists);
|
|
131
|
+
this.wrapData[i] = splits;
|
|
132
|
+
if (indexOfParagraphAfterPageBreak === i) {
|
|
133
|
+
rowInfos[0].isAfterPageBreak = true;
|
|
134
|
+
}
|
|
135
|
+
indexOfParagraphAfterPageBreak = rowInfos[rowInfos.length - 1].isEndedByPageBreak ? i + 1 : -1;
|
|
136
|
+
this.pagesWrap.set(i, rowInfos, this.generalProperties.numberings, this.model.paragraphs);
|
|
137
|
+
this.updateParagraphNumberingData(i);
|
|
138
|
+
this.updateWrapParagraphIndex(firstParagraph);
|
|
139
|
+
firstUsedTabIndex = this.updateParagraphTabs(firstUsedTabIndex, i, currentLine.length);
|
|
140
|
+
}
|
|
141
|
+
this.pagesWrap.paragraphs[lastParagraph + 1]?.setIsAfterPageBreak(indexOfParagraphAfterPageBreak > -1);
|
|
142
|
+
const count = this.document.lines.length;
|
|
143
|
+
this.pagesWrap.paragraphs.splice(count);
|
|
144
|
+
this.wrapData.splice(count);
|
|
145
|
+
this.updateWrapParagraphLine(firstParagraph);
|
|
146
|
+
this.pagesWrap.processParagraphsProperties(firstParagraph, this.wrapParagraphIndex);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Given a string, returns an array of the display characters, including tabs and spaces.
|
|
150
|
+
*/
|
|
151
|
+
getDisplayTokens(model, str, startIndex) {
|
|
152
|
+
if (!str.length) {
|
|
153
|
+
return this.getEmptyLineTokens(startIndex);
|
|
154
|
+
}
|
|
155
|
+
return this.getFilledLineTokens(startIndex, str, model);
|
|
156
|
+
}
|
|
157
|
+
getRowCacheIndex(cacheArray, value) {
|
|
158
|
+
let start = 0;
|
|
159
|
+
let end = cacheArray.length - 1;
|
|
160
|
+
while (start <= end) {
|
|
161
|
+
const mid = (start + end) >> 1;
|
|
162
|
+
const center = cacheArray[mid];
|
|
163
|
+
if (value > center) {
|
|
164
|
+
start = mid + 1;
|
|
165
|
+
}
|
|
166
|
+
else if (value < center) {
|
|
167
|
+
end = mid - 1;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
return mid;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return start - 1;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Calculates the width of the string `str` on the screen while assuming that the string starts at the first column on the screen.
|
|
177
|
+
* The first position indicates the number of columns for `str` on screen.
|
|
178
|
+
* The second value contains the position of the document column that this function read until.
|
|
179
|
+
*/
|
|
180
|
+
getStringScreenWidth(str, maxScreenColumn) {
|
|
181
|
+
let screenColumn = 0;
|
|
182
|
+
let column;
|
|
183
|
+
for (column = 0; column < str.length; column++) {
|
|
184
|
+
screenColumn += 1;
|
|
185
|
+
if (screenColumn > maxScreenColumn) {
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return [screenColumn, column];
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Given a starting row and column, this method returns the `Range` of the first word boundary it finds.
|
|
193
|
+
*/
|
|
194
|
+
getWordRange(row, column) {
|
|
195
|
+
const line = this.document.getLine(this.document.lines, row);
|
|
196
|
+
let inToken = false;
|
|
197
|
+
if (column > 0) {
|
|
198
|
+
inToken = !!line.charAt(column - 1).match(this.tokenRe);
|
|
199
|
+
}
|
|
200
|
+
if (!inToken) {
|
|
201
|
+
inToken = !!line.charAt(column).match(this.tokenRe);
|
|
202
|
+
}
|
|
203
|
+
let regexp;
|
|
204
|
+
if (inToken) {
|
|
205
|
+
regexp = this.tokenRe;
|
|
206
|
+
}
|
|
207
|
+
else if (/^\s+$/.test(line.slice(column - 1, column + 1))) {
|
|
208
|
+
regexp = /\s/;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
regexp = this.nonTokenRe;
|
|
212
|
+
}
|
|
213
|
+
let start = column;
|
|
214
|
+
if (start > 0) {
|
|
215
|
+
do {
|
|
216
|
+
start--;
|
|
217
|
+
} while (start >= 0 && line.charAt(start).match(regexp));
|
|
218
|
+
start++;
|
|
219
|
+
}
|
|
220
|
+
let end = column;
|
|
221
|
+
while (end < line.length && line.charAt(end).match(regexp)) {
|
|
222
|
+
end++;
|
|
223
|
+
}
|
|
224
|
+
return new Range(new CursorParagraph(row, start), new CursorParagraph(row, end));
|
|
225
|
+
}
|
|
226
|
+
getDisplayLine(row, endColumn, startColumn) {
|
|
227
|
+
const line = this.document.getLine(this.document.lines, row);
|
|
228
|
+
return line.substring(startColumn || 0, endColumn || line.length);
|
|
229
|
+
}
|
|
230
|
+
removeByDocumentIndexes(startIndex, endIndex) {
|
|
231
|
+
const startParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex);
|
|
232
|
+
const endParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex);
|
|
233
|
+
this.remove(new Range(startParagraphPosition, endParagraphPosition));
|
|
234
|
+
}
|
|
235
|
+
insertTextByDocumentIndex(index, text, style) {
|
|
236
|
+
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, index);
|
|
237
|
+
return this.insertText(paragraphPosition, text, style);
|
|
238
|
+
}
|
|
239
|
+
insertElementByDocumentIndex(insertElement) {
|
|
240
|
+
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.element.insertIndex);
|
|
241
|
+
return this.insertElement(elementPosition, insertElement.element);
|
|
242
|
+
}
|
|
243
|
+
insertBreakByDocumentIndex(insertElement) {
|
|
244
|
+
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
245
|
+
return this.insertBreak(elementPosition, insertElement.breakType);
|
|
246
|
+
}
|
|
247
|
+
insertTabByDocumentIndex(insertElement) {
|
|
248
|
+
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
249
|
+
return this.insertTab(elementPosition);
|
|
250
|
+
}
|
|
251
|
+
insertImageByDocumentIndex(insertElement) {
|
|
252
|
+
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
253
|
+
return this.insertImage(elementPosition, insertElement.imageData);
|
|
254
|
+
}
|
|
255
|
+
insertTableByDocumentIndex(insertElement) {
|
|
256
|
+
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
257
|
+
return this.insertTable(elementPosition, insertElement);
|
|
258
|
+
}
|
|
259
|
+
insertParagraphByDocumentIndex(insertElement) {
|
|
260
|
+
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
261
|
+
return this.insertParagraph(elementPosition, insertElement);
|
|
262
|
+
}
|
|
263
|
+
applyTextStyle(startIndex, endIndex, textStyle) {
|
|
264
|
+
this.cursorStyle = new TextStyleModel(textStyle);
|
|
265
|
+
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
266
|
+
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
|
|
267
|
+
OperationsHelper.applyTextStyle(this.model, startIndex, endIndex, textStyle);
|
|
268
|
+
this.updateWrapData(startParagraph, endParagraph);
|
|
269
|
+
this.setStyle(textStyle);
|
|
270
|
+
}
|
|
271
|
+
applyParagraphStyle(startIndex, endIndex, paragraphStyle) {
|
|
272
|
+
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
273
|
+
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
|
|
274
|
+
OperationsHelper.applyParagraphStyle(this.model, startIndex, endIndex, paragraphStyle);
|
|
275
|
+
this.updateWrapData(startParagraph, endParagraph);
|
|
276
|
+
this.setStyle(paragraphStyle);
|
|
277
|
+
}
|
|
278
|
+
applyElementStyle(model) {
|
|
279
|
+
OperationsHelper.applyElementStyle(this.model, model);
|
|
280
|
+
const imageComponentRef = this.customComponents.customElements.find(x => x.instance.insertIndex === model.insertIndex);
|
|
281
|
+
imageComponentRef.instance.initialize();
|
|
282
|
+
const paragraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, model.insertIndex).row;
|
|
283
|
+
this.updateWrapData(paragraph, paragraph);
|
|
284
|
+
}
|
|
285
|
+
addNumbering(levels, startIndex, endIndex) {
|
|
286
|
+
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
287
|
+
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
|
|
288
|
+
OperationsHelper.addNumbering(this.model, this.generalProperties.numberings, startIndex, endIndex, levels);
|
|
289
|
+
for (let i = startParagraph; i <= endParagraph; i++) {
|
|
290
|
+
if (this.pagesWrap.paragraphs[i].numberingData.numberingId !== null) {
|
|
291
|
+
this.updateNumberingsDataOnChange(endParagraph);
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
this.updateWrapData(startParagraph, endParagraph);
|
|
296
|
+
this.setNumberingStyle(startIndex, endIndex);
|
|
297
|
+
}
|
|
298
|
+
removeNumberings(startIndex, endIndex) {
|
|
299
|
+
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
300
|
+
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
|
|
301
|
+
OperationsHelper.removeNumberings(this.model, this.generalProperties.numberings, startIndex, endIndex);
|
|
302
|
+
for (let i = startParagraph; i <= endParagraph; i++) {
|
|
303
|
+
if (this.pagesWrap.paragraphs[i].numberingData.numberingId !== null) {
|
|
304
|
+
this.updateNumberingsDataOnChange(endParagraph);
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
this.updateWrapData(startParagraph, endParagraph);
|
|
309
|
+
this.setNumberingStyle(startIndex, endIndex);
|
|
310
|
+
}
|
|
311
|
+
restoreNumberings(paragraphs, numberings) {
|
|
312
|
+
const startIndex = paragraphs[0].insertIndex;
|
|
313
|
+
const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
|
|
314
|
+
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
315
|
+
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
|
|
316
|
+
OperationsHelper.restoreNumberings(this.model, this.generalProperties.numberings, paragraphs, numberings);
|
|
317
|
+
for (const paragraph of paragraphs) {
|
|
318
|
+
if (paragraph.paragraphStyle.numberingId !== null) {
|
|
319
|
+
this.updateNumberingsDataOnChange(endPosition.row);
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
this.updateWrapData(startParagraph, endPosition.row);
|
|
324
|
+
this.selection.placeCursor(endPosition);
|
|
325
|
+
this.setNumberingStyle(startIndex, endIndex);
|
|
326
|
+
}
|
|
327
|
+
applyImageStyle(applyImage) {
|
|
328
|
+
const imageComponentRef = this.customComponents.images.find(x => x.instance.insertIndex === applyImage.insertIndex);
|
|
329
|
+
imageComponentRef.instance.resize({ width: applyImage.width, height: applyImage.height });
|
|
330
|
+
OperationsHelper.applyImageStyle(this.model, applyImage);
|
|
331
|
+
const start = this.document.indexToPosition(applyImage.insertIndex, 0);
|
|
332
|
+
this.updateWrapData(start.row, this.document.lines.length - 1);
|
|
333
|
+
}
|
|
334
|
+
restoreTextStyles(formats) {
|
|
335
|
+
const startIndex = formats[0].startIndex;
|
|
336
|
+
const endIndex = formats[formats.length - 1].endIndex;
|
|
337
|
+
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
338
|
+
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
|
|
339
|
+
OperationsHelper.restoreTextStyles(this.model, formats);
|
|
340
|
+
this.updateWrapData(startParagraph, endPosition.row);
|
|
341
|
+
this.selection.placeCursor(endPosition);
|
|
342
|
+
this.processSelectionStyles();
|
|
343
|
+
}
|
|
344
|
+
restoreParagraphStyles(paragraphs) {
|
|
345
|
+
const startIndex = paragraphs[0].insertIndex;
|
|
346
|
+
const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
|
|
347
|
+
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
348
|
+
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
|
|
349
|
+
OperationsHelper.restoreParagraphStyles(this.model, paragraphs);
|
|
350
|
+
this.updateWrapData(startParagraph, endPosition.row);
|
|
351
|
+
this.selection.placeCursor(endPosition);
|
|
352
|
+
this.processSelectionStyles();
|
|
353
|
+
}
|
|
354
|
+
setTextStyle(textStyle) {
|
|
355
|
+
this.cursorStyle = new TextStyleModel(textStyle);
|
|
356
|
+
this.setStyle(textStyle);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Removes the `range` from the document.
|
|
360
|
+
* If `range` is empty, this function returns the unmodified value of `range.start`.
|
|
361
|
+
*/
|
|
362
|
+
remove(range) {
|
|
363
|
+
const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.wrapParagraphIndex, range);
|
|
364
|
+
this.document.removeRange(range);
|
|
365
|
+
CustomComponentHelper.applyRemovingComponents(this.customComponents.tables, partIndexes.startIndex, partIndexes.endIndex);
|
|
366
|
+
CustomComponentHelper.applyRemovingComponents(this.customComponents.images, partIndexes.startIndex, partIndexes.endIndex);
|
|
367
|
+
CustomComponentHelper.applyRemovingComponents(this.customComponents.customElements, partIndexes.startIndex, partIndexes.endIndex);
|
|
368
|
+
CustomComponentHelper.applyRemovingComponents(this.customComponents.tabs, partIndexes.startIndex, partIndexes.endIndex);
|
|
369
|
+
OperationsHelper.delete(this.model, partIndexes.startIndex, partIndexes.endIndex);
|
|
370
|
+
this.selection.placeCursor(range.start);
|
|
371
|
+
this.updateInternalDataOnDeleteText(range.start.row, range.end.row);
|
|
372
|
+
this.processSelectionStyles();
|
|
373
|
+
}
|
|
374
|
+
replace(model) {
|
|
375
|
+
this.removeByDocumentIndexes(model.delete.startIndex, model.delete.endIndex + 1);
|
|
376
|
+
let endPoint;
|
|
377
|
+
if (model.insertText) {
|
|
378
|
+
endPoint = this.insertTextByDocumentIndex(model.insertText.insertIndex, model.insertText.text);
|
|
379
|
+
}
|
|
380
|
+
else if (model.insertParagraph) {
|
|
381
|
+
endPoint = this.insertParagraphByDocumentIndex(model.insertParagraph);
|
|
382
|
+
}
|
|
383
|
+
else if (model.insertElement) {
|
|
384
|
+
endPoint = this.insertElementByDocumentIndex(model.insertElement);
|
|
385
|
+
}
|
|
386
|
+
else if (model.insertBreak) {
|
|
387
|
+
endPoint = this.insertBreakByDocumentIndex(model.insertBreak);
|
|
388
|
+
}
|
|
389
|
+
else if (model.insertTab) {
|
|
390
|
+
endPoint = this.insertTabByDocumentIndex(model.insertTab);
|
|
391
|
+
}
|
|
392
|
+
else if (model.insertImage) {
|
|
393
|
+
endPoint = this.insertImageByDocumentIndex(model.insertImage);
|
|
394
|
+
}
|
|
395
|
+
else if (model.insertTable) {
|
|
396
|
+
endPoint = this.insertTableByDocumentIndex(model.insertTable);
|
|
397
|
+
}
|
|
398
|
+
return endPoint;
|
|
399
|
+
}
|
|
400
|
+
insertText(position, text, cursorStyle) {
|
|
401
|
+
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
402
|
+
if (cursorStyle) {
|
|
403
|
+
OperationsHelper.insertStyledText(this.model, text, insertIndex, cursorStyle);
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
OperationsHelper.insertText(this.model, text, insertIndex);
|
|
407
|
+
}
|
|
408
|
+
const endPosition = this.document.insertText(position, text);
|
|
409
|
+
this.updateInternalDataOnInsertText(position.row, endPosition.row);
|
|
410
|
+
this.selection.placeCursor(endPosition);
|
|
411
|
+
return endPosition;
|
|
412
|
+
}
|
|
413
|
+
insertElement(position, element) {
|
|
414
|
+
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
415
|
+
const insertElement = new InsertElementModel({ element: new ElementModel({ insertIndex, ...element }) });
|
|
416
|
+
OperationsHelper.insertElement(this.model, insertElement);
|
|
417
|
+
const model = this.model.elements.find(x => x.insertIndex === insertIndex);
|
|
418
|
+
const type = this.customContentService.findComponentType(model.type);
|
|
419
|
+
this.addComponent(this.customComponents.customElements, model, type);
|
|
420
|
+
const endPosition = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
421
|
+
this.updateWrapData(position.row, endPosition.row);
|
|
422
|
+
this.selection.placeCursor(endPosition);
|
|
423
|
+
return endPosition;
|
|
424
|
+
}
|
|
425
|
+
insertBreak(position, breakType) {
|
|
426
|
+
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
427
|
+
const isOnNewParagraph = breakType === BreakTypes.Page &&
|
|
428
|
+
BreakHelper.getBreakType(this.model, CUSTOM_ELEMENT_MARKER, insertIndex - 1) !== BreakTypes.Page;
|
|
429
|
+
const text = isOnNewParagraph ? `${NEW_LINE_MARKUP}${CUSTOM_ELEMENT_MARKER}` : CUSTOM_ELEMENT_MARKER;
|
|
430
|
+
OperationsHelper.insertBreak(this.model, text, insertIndex, breakType);
|
|
431
|
+
const endPosition = this.document.insertText(position, text);
|
|
432
|
+
if (isOnNewParagraph) {
|
|
433
|
+
this.updateInternalDataOnInsertText(position.row, endPosition.row);
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
this.updateWrapData(position.row, endPosition.row);
|
|
437
|
+
}
|
|
438
|
+
const cursorPosition = this.document.getPositionAfterBreak(endPosition, breakType);
|
|
439
|
+
this.selection.placeCursor(cursorPosition);
|
|
440
|
+
return endPosition;
|
|
441
|
+
}
|
|
442
|
+
insertTab(position) {
|
|
443
|
+
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
444
|
+
OperationsHelper.insertTab(this.model, insertIndex);
|
|
445
|
+
const model = this.model.tabs.find(x => x.insertIndex === insertIndex);
|
|
446
|
+
this.addComponent(this.customComponents.tabs, model, NoderTabComponent);
|
|
447
|
+
const endPosition = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
448
|
+
this.updateWrapData(position.row, position.row);
|
|
449
|
+
this.selection.placeCursor(endPosition);
|
|
450
|
+
return endPosition;
|
|
451
|
+
}
|
|
452
|
+
insertImage(position, imageData) {
|
|
453
|
+
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
454
|
+
const adjustedImage = this.getImageWithAllowedSize(imageData, this.contentWidth);
|
|
455
|
+
OperationsHelper.insertImage(this.model, insertIndex, adjustedImage);
|
|
456
|
+
const model = this.model.images.find(x => x.insertIndex === insertIndex);
|
|
457
|
+
this.addComponent(this.customComponents.images, model, NoderImageComponent);
|
|
458
|
+
const endPosition = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
459
|
+
this.updateWrapData(position.row, position.row);
|
|
460
|
+
this.selection.placeCursor(endPosition);
|
|
461
|
+
return endPosition;
|
|
462
|
+
}
|
|
463
|
+
insertLink(position, linkData) {
|
|
464
|
+
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
465
|
+
const linkStyle = new TextStyleModel({ headingStyleId: HYPERLINK_HEADING_STYLE_ID, underline: true });
|
|
466
|
+
OperationsHelper.insertLink(this.model, linkData.text, linkData.link, insertIndex, linkStyle);
|
|
467
|
+
const endPosition = this.document.insertText(position, linkData.text);
|
|
468
|
+
this.updateWrapData(position.row, position.row);
|
|
469
|
+
this.selection.placeCursor(endPosition);
|
|
470
|
+
return endPosition;
|
|
471
|
+
}
|
|
472
|
+
insertTable(position, tableModel) {
|
|
473
|
+
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
474
|
+
OperationsHelper.insertTable(this.model, insertIndex, tableModel, this.pagesWrap.contentWidth);
|
|
475
|
+
const model = this.model.tables.find(x => x.insertIndex === tableModel.insertTableIndex);
|
|
476
|
+
this.addComponent(this.customComponents.tables, model, NoderTableComponent);
|
|
477
|
+
const endPosition = this.document.insertText(position, tableModel.content);
|
|
478
|
+
this.updateInternalDataOnInsertText(position.row, endPosition.row);
|
|
479
|
+
this.selection.placeCursor(endPosition);
|
|
480
|
+
return endPosition;
|
|
481
|
+
}
|
|
482
|
+
insertParagraph(position, paragraphModel) {
|
|
483
|
+
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
484
|
+
const text = OperationsHelper.insertParagraph(this.model, insertIndex, paragraphModel, this.pagesWrap.contentWidth);
|
|
485
|
+
const endPosition = this.document.insertText(position, text);
|
|
486
|
+
this.updateInternalDataOnInsertText(position.row, endPosition.row);
|
|
487
|
+
let endPoint;
|
|
488
|
+
if (paragraphModel.insertText) {
|
|
489
|
+
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, paragraphModel.insertText.insertIndex);
|
|
490
|
+
endPoint = this.document.insertText(paragraphPosition, text);
|
|
491
|
+
this.updateInternalDataOnInsertText(paragraphPosition.row, endPoint.row);
|
|
492
|
+
this.selection.placeCursor(endPoint);
|
|
493
|
+
}
|
|
494
|
+
else if (paragraphModel.insertImage) {
|
|
495
|
+
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, paragraphModel.insertImage.insertIndex);
|
|
496
|
+
const imageInsertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
497
|
+
const model = this.model.images.find(x => x.insertIndex === imageInsertIndex);
|
|
498
|
+
this.addComponent(this.customComponents.images, model, NoderImageComponent);
|
|
499
|
+
endPoint = this.document.insertText(paragraphPosition, CUSTOM_ELEMENT_MARKER);
|
|
500
|
+
this.updateWrapData(paragraphPosition.row, paragraphPosition.row);
|
|
501
|
+
this.selection.placeCursor(endPoint);
|
|
502
|
+
}
|
|
503
|
+
else if (paragraphModel.insertTable) {
|
|
504
|
+
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, paragraphModel.insertTable.insertIndex);
|
|
505
|
+
const model = this.model.tables.find(x => x.insertIndex === paragraphModel.insertTable.insertTableIndex);
|
|
506
|
+
this.addComponent(this.customComponents.tables, model, NoderTableComponent);
|
|
507
|
+
endPoint = this.document.insertText(paragraphPosition, paragraphModel.insertTable.content);
|
|
508
|
+
this.updateInternalDataOnInsertText(paragraphPosition.row, endPoint.row);
|
|
509
|
+
this.selection.placeCursor(endPoint);
|
|
510
|
+
}
|
|
511
|
+
return endPoint;
|
|
512
|
+
}
|
|
513
|
+
addComponent(customElements, model, componentType) {
|
|
514
|
+
const customElement = this.customContentService.componentService.generateComponent(componentType, {
|
|
515
|
+
content: model,
|
|
516
|
+
sessionId: this.sessionId,
|
|
517
|
+
generalProperties: this.generalProperties,
|
|
518
|
+
contentWidth: this.contentWidth
|
|
519
|
+
});
|
|
520
|
+
const newElementPosition = customElements.findIndex(x => x.instance.insertIndex > model.insertIndex);
|
|
521
|
+
if (newElementPosition >= 0) {
|
|
522
|
+
customElements.splice(newElementPosition, 0, customElement);
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
customElements.push(customElement);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
setStyle(style) {
|
|
529
|
+
for (const key of Object.keys(style)) {
|
|
530
|
+
this._stylesMap[key] = style[key];
|
|
531
|
+
}
|
|
532
|
+
this.signal('setStyles', this._stylesMap);
|
|
533
|
+
}
|
|
534
|
+
setStyles(styles) {
|
|
535
|
+
for (let key of Object.keys(styles)) {
|
|
536
|
+
if (styles[key].length === 0) {
|
|
537
|
+
this._stylesMap[key] = ContentStyleHelper.getDefaultStyleValueByKey(key);
|
|
538
|
+
continue;
|
|
539
|
+
}
|
|
540
|
+
else if (styles[key].length > 1 && !styles[key].every(x => x === styles[key][0])) {
|
|
541
|
+
this._stylesMap[key] = typeof styles[key][0] === 'boolean' && key !== 'isBulletMarker' ? false : null;
|
|
542
|
+
continue;
|
|
543
|
+
}
|
|
544
|
+
this._stylesMap[key] = styles[key][0];
|
|
545
|
+
}
|
|
546
|
+
this.signal('setStyles', this._stylesMap);
|
|
547
|
+
}
|
|
548
|
+
setNumberingStyle(startIndex, endIndex) {
|
|
549
|
+
const styles = {
|
|
550
|
+
alignment: [this._stylesMap.alignment],
|
|
551
|
+
backgroundColor: [this._stylesMap.backgroundColor],
|
|
552
|
+
highlightColor: [this._stylesMap.highlightColor],
|
|
553
|
+
fontColor: [this._stylesMap.fontColor],
|
|
554
|
+
fontFamily: [this._stylesMap.fontFamily],
|
|
555
|
+
fontSize: [this._stylesMap.fontSize],
|
|
556
|
+
italic: [this._stylesMap.italic],
|
|
557
|
+
bold: [this._stylesMap.bold],
|
|
558
|
+
strikethrough: [this._stylesMap.strikethrough],
|
|
559
|
+
underline: [this._stylesMap.underline],
|
|
560
|
+
spaceBefore: [this._stylesMap.spaceBefore],
|
|
561
|
+
spaceAfter: [this._stylesMap.spaceAfter],
|
|
562
|
+
indentLeft: [this._stylesMap.indentLeft],
|
|
563
|
+
indentRight: [this._stylesMap.indentRight],
|
|
564
|
+
isBulletMarker: [],
|
|
565
|
+
numberingLevelsStyles: []
|
|
566
|
+
};
|
|
567
|
+
this.updateNumberingStyles(styles, startIndex, endIndex);
|
|
568
|
+
this.setStyles(styles);
|
|
569
|
+
}
|
|
570
|
+
restore(model) {
|
|
571
|
+
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, model.startIndex);
|
|
572
|
+
if (model.startIndex !== model.endIndex) {
|
|
573
|
+
this.removeByDocumentIndexes(model.startIndex, model.endIndex);
|
|
574
|
+
}
|
|
575
|
+
OperationsHelper.restore(this.model, model);
|
|
576
|
+
const restoreEndIndex = model.startIndex + model.text.length;
|
|
577
|
+
this.restoreComponents(this.model.tables, this.customComponents.tables, NoderTableComponent, model.startIndex, restoreEndIndex);
|
|
578
|
+
this.restoreComponents(this.model.images, this.customComponents.images, NoderImageComponent, model.startIndex, restoreEndIndex);
|
|
579
|
+
this.restoreComponents(this.model.tabs, this.customComponents.tabs, NoderTabComponent, model.startIndex, restoreEndIndex);
|
|
580
|
+
this.restoreElementComponents(this.model.elements, model.startIndex, restoreEndIndex);
|
|
581
|
+
const endPoint = this.document.insertText(paragraphPosition, model.text);
|
|
582
|
+
this.updateInternalDataOnInsertText(paragraphPosition.row, endPoint.row);
|
|
583
|
+
this.selection.placeCursor(endPoint);
|
|
584
|
+
this.processSelectionStyles();
|
|
585
|
+
}
|
|
586
|
+
restoreComponents(models, components, componentType, restoreIndex, restoreEndIndex) {
|
|
587
|
+
for (const model of models) {
|
|
588
|
+
if (model.insertIndex < restoreIndex) {
|
|
589
|
+
continue;
|
|
590
|
+
}
|
|
591
|
+
else if (model.insertIndex >= restoreEndIndex) {
|
|
592
|
+
break;
|
|
593
|
+
}
|
|
594
|
+
this.addComponent(components, model, componentType);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
restoreElementComponents(elements, restoreIndex, restoreEndIndex) {
|
|
598
|
+
for (const model of elements) {
|
|
599
|
+
if (model.insertIndex < restoreIndex) {
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
else if (model.insertIndex >= restoreEndIndex) {
|
|
603
|
+
break;
|
|
604
|
+
}
|
|
605
|
+
const type = this.customContentService.findComponentType(model.type);
|
|
606
|
+
this.addComponent(this.customComponents.customElements, model, type);
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
processSelectionStyles() {
|
|
610
|
+
const { startIndex, endIndex } = this.getRangeIndexes(this.selection.range);
|
|
611
|
+
const styles = {
|
|
612
|
+
alignment: [],
|
|
613
|
+
backgroundColor: [],
|
|
614
|
+
highlightColor: [],
|
|
615
|
+
fontColor: [],
|
|
616
|
+
fontFamily: [],
|
|
617
|
+
fontSize: [],
|
|
618
|
+
italic: [],
|
|
619
|
+
bold: [],
|
|
620
|
+
strikethrough: [],
|
|
621
|
+
underline: [],
|
|
622
|
+
spaceBefore: [],
|
|
623
|
+
spaceAfter: [],
|
|
624
|
+
indentLeft: [],
|
|
625
|
+
indentRight: [],
|
|
626
|
+
isBulletMarker: [],
|
|
627
|
+
numberingLevelsStyles: []
|
|
628
|
+
};
|
|
629
|
+
this.updateParagraphStyles(styles, startIndex, endIndex);
|
|
630
|
+
this.updateNumberingStyles(styles, startIndex, endIndex);
|
|
631
|
+
const format = this.updateTextStyles(styles, startIndex, endIndex);
|
|
632
|
+
this.setStyles(styles);
|
|
633
|
+
if (format) {
|
|
634
|
+
this.cursorStyle = Object.assign({}, format.textStyle, this.cursorStyle);
|
|
635
|
+
this.setStyle(this.cursorStyle);
|
|
636
|
+
}
|
|
637
|
+
else {
|
|
638
|
+
this.cursorStyle = null;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
getLinkModel(cursor) {
|
|
642
|
+
const { startIndex, endIndex } = this.getRangeIndexes(new Range(cursor, cursor));
|
|
643
|
+
return this.model.links.find(x => x.insertIndex <= startIndex + 1 && x.endIndex > endIndex);
|
|
644
|
+
}
|
|
645
|
+
insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex) {
|
|
646
|
+
OperationsHelper.insertTableRows(this.model, insertIndex, rowsCount, targetIndex, inheritIndex);
|
|
647
|
+
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
648
|
+
tableComponent.instance.updateTable();
|
|
649
|
+
}
|
|
650
|
+
insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex) {
|
|
651
|
+
OperationsHelper.insertTableColumns(this.model, insertIndex, columnsCount, targetIndex, inheritIndex, this.pagesWrap.contentWidth);
|
|
652
|
+
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
653
|
+
tableComponent.instance.updateTable();
|
|
654
|
+
}
|
|
655
|
+
removeTableRows(insertIndex, startIndex, endIndex) {
|
|
656
|
+
OperationsHelper.removeTableRows(this.model, insertIndex, startIndex, endIndex);
|
|
657
|
+
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
658
|
+
tableComponent.instance.updateTable();
|
|
659
|
+
}
|
|
660
|
+
removeTableColumns(insertIndex, startIndex, endIndex) {
|
|
661
|
+
OperationsHelper.removeTableColumns(this.model, insertIndex, startIndex, endIndex, this.pagesWrap.contentWidth);
|
|
662
|
+
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
663
|
+
tableComponent.instance.updateTable();
|
|
664
|
+
}
|
|
665
|
+
resizeTableColumns(resizeTableColumns) {
|
|
666
|
+
OperationsHelper.resizeTableColumns(this.model, resizeTableColumns);
|
|
667
|
+
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === resizeTableColumns.insertIndex);
|
|
668
|
+
tableComponent.instance.updateTable();
|
|
669
|
+
}
|
|
670
|
+
restoreTable(insertIndex, table) {
|
|
671
|
+
const oldTable = JSON.parse(JSON.stringify(table));
|
|
672
|
+
OperationsHelper.restoreTable(this.model, insertIndex, oldTable);
|
|
673
|
+
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
674
|
+
tableComponent.instance.updateTable();
|
|
675
|
+
}
|
|
676
|
+
updateParagraphTabs(tabIndex, paragraphIndex, length) {
|
|
677
|
+
const paragraphLastIndex = this.wrapParagraphIndex[paragraphIndex] + length;
|
|
678
|
+
if (tabIndex === -1 ||
|
|
679
|
+
tabIndex >= this.customComponents.tabs.length ||
|
|
680
|
+
this.customComponents.tabs[tabIndex].instance.insertIndex > paragraphLastIndex) {
|
|
681
|
+
return tabIndex;
|
|
682
|
+
}
|
|
683
|
+
const startIndex = tabIndex;
|
|
684
|
+
while (this.customComponents.tabs[tabIndex] && this.customComponents.tabs[tabIndex].instance.insertIndex <= paragraphLastIndex) {
|
|
685
|
+
this.customComponents.tabs[tabIndex].instance.width = this.pagesWrap.tabTokens[tabIndex - startIndex].width;
|
|
686
|
+
this.customComponents.tabs[tabIndex].instance.height = this.pagesWrap.tabTokens[tabIndex - startIndex].font;
|
|
687
|
+
tabIndex++;
|
|
688
|
+
}
|
|
689
|
+
return tabIndex;
|
|
690
|
+
}
|
|
691
|
+
getRangeIndexes(range) {
|
|
692
|
+
let partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.wrapParagraphIndex, range);
|
|
693
|
+
const prevNewLineSymbol = this.document.isNewLineSymbol(partIndexes.endIndex - 1);
|
|
694
|
+
if (!prevNewLineSymbol) {
|
|
695
|
+
if (partIndexes.endIndex > partIndexes.startIndex) {
|
|
696
|
+
partIndexes.endIndex--;
|
|
697
|
+
}
|
|
698
|
+
else if (partIndexes.startIndex === partIndexes.endIndex && partIndexes.startIndex > 0) {
|
|
699
|
+
partIndexes.startIndex--;
|
|
700
|
+
partIndexes.endIndex--;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
return partIndexes;
|
|
704
|
+
}
|
|
705
|
+
updateInternalDataOnInsertText(startRow, endRow) {
|
|
706
|
+
const length = endRow - startRow;
|
|
707
|
+
const newParagraphs = Array(length);
|
|
708
|
+
const newWrapData = Array(length);
|
|
709
|
+
for (let i = 0; i < length; i++) {
|
|
710
|
+
newWrapData[i] = [];
|
|
711
|
+
}
|
|
712
|
+
this.wrapData.splice(startRow, 0, ...newWrapData);
|
|
713
|
+
this.pagesWrap.paragraphs.splice(startRow, 0, ...newParagraphs);
|
|
714
|
+
if (length) {
|
|
715
|
+
this.updateNumberingsDataOnChange(endRow);
|
|
716
|
+
}
|
|
717
|
+
this.updateWrapData(startRow, endRow);
|
|
718
|
+
}
|
|
719
|
+
updateInternalDataOnDeleteText(startRow, endRow) {
|
|
720
|
+
const length = endRow - startRow;
|
|
721
|
+
this.wrapData.splice(startRow, length);
|
|
722
|
+
this.pagesWrap.remove(startRow, length);
|
|
723
|
+
if (length) {
|
|
724
|
+
this.updateNumberingsDataOnChange(startRow);
|
|
725
|
+
}
|
|
726
|
+
this.updateWrapData(startRow, startRow);
|
|
727
|
+
}
|
|
728
|
+
updateNumberingsDataOnChange(index) {
|
|
729
|
+
for (let i = index; i < this.pagesWrap.paragraphs.length; i++) {
|
|
730
|
+
if (this.model.paragraphs[i].paragraphStyle.numberingId !== null) {
|
|
731
|
+
this.pagesWrap.paragraphs[i].numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i);
|
|
732
|
+
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[i].insertIndex);
|
|
733
|
+
NumberingHelper.updateMarkerData(this.generalProperties, this.pagesWrap.paragraphs[i], paragraphFormat.textStyle, this.model.paragraphs[i].paragraphStyle);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* Computes wrap index based on max row width
|
|
739
|
+
*/
|
|
740
|
+
computeWrapIndex(displayTokens) {
|
|
741
|
+
if (!displayTokens[0]) {
|
|
742
|
+
return 0;
|
|
743
|
+
}
|
|
744
|
+
if (displayTokens[0].isTable || (displayTokens[0].breaksLine && displayTokens.length === 1)) {
|
|
745
|
+
return 1;
|
|
746
|
+
}
|
|
747
|
+
const indent = displayTokens[0].indentLeft +
|
|
748
|
+
displayTokens[0].indentRight +
|
|
749
|
+
displayTokens[0].indentFirstLine -
|
|
750
|
+
displayTokens[0].indentHanging || 0;
|
|
751
|
+
const maxRowWidth = (this.pagesWrap.contentWidth || this.contentWidth) - indent;
|
|
752
|
+
let sum = 0;
|
|
753
|
+
for (let i = 0; i < displayTokens.length; i++) {
|
|
754
|
+
if (displayTokens[i].isTab) {
|
|
755
|
+
displayTokens[i].width = TabHelper.calculateTabWidth(sum, this.generalProperties.defaultTabWidth);
|
|
756
|
+
}
|
|
757
|
+
sum += displayTokens[i].width;
|
|
758
|
+
if ((i > 0 && (sum >= maxRowWidth || displayTokens[i - 1].breaksLine)) || displayTokens[i].isTable) {
|
|
759
|
+
return i;
|
|
760
|
+
}
|
|
761
|
+
if (displayTokens[i].isLineBreak || (i === displayTokens.length - 1 && displayTokens[i].isPageBreak)) {
|
|
762
|
+
return i + 1;
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
return 0;
|
|
766
|
+
}
|
|
767
|
+
computeWrapSplit(tokens, wrapLimit) {
|
|
768
|
+
if (!tokens.length || tokens.length <= wrapLimit) {
|
|
769
|
+
return null;
|
|
770
|
+
}
|
|
771
|
+
// If there is a space or tab at this split position, then making
|
|
772
|
+
// a split is simple.
|
|
773
|
+
if (wrapLimit === 0 ||
|
|
774
|
+
tokens[wrapLimit].displayValue === DisplayValue.customContent ||
|
|
775
|
+
(this.isWhiteSpace(tokens[wrapLimit - 1]) && this.isWhiteSpace(tokens[wrapLimit]))) {
|
|
776
|
+
return wrapLimit;
|
|
777
|
+
}
|
|
778
|
+
return this.calculateSplit(wrapLimit, tokens);
|
|
779
|
+
}
|
|
780
|
+
getSplits(model, line, startIndex, paragraphIndex, isNextLineExists) {
|
|
781
|
+
const strTokens = this.getDisplayTokens(model, line, startIndex);
|
|
782
|
+
if (!strTokens.length) {
|
|
783
|
+
const defaultRowInfo = new LineInfoModel({
|
|
784
|
+
height: (this.stylesMap.fontSize * 4) / 3,
|
|
785
|
+
width: 0,
|
|
786
|
+
align: DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
787
|
+
indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
788
|
+
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
789
|
+
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
790
|
+
lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing,
|
|
791
|
+
isAfterPageBreak: false,
|
|
792
|
+
isEndedByPageBreak: false,
|
|
793
|
+
backgroundColor: DEFAULT_PARAGRAPH_STYLE.backgroundColor
|
|
794
|
+
});
|
|
795
|
+
return { splits: [], rowInfos: [defaultRowInfo] };
|
|
796
|
+
}
|
|
797
|
+
const splits = [];
|
|
798
|
+
const rowInfos = [];
|
|
799
|
+
let prevToken;
|
|
800
|
+
let index = -1;
|
|
801
|
+
let initial = line;
|
|
802
|
+
while (index) {
|
|
803
|
+
initial = initial.slice(index > 0 ? index : 0);
|
|
804
|
+
const tokens = strTokens.slice(line.length - initial.length);
|
|
805
|
+
if (!tokens.length) {
|
|
806
|
+
tokens.push(...this.getEmptyLineTokens(startIndex + index));
|
|
807
|
+
}
|
|
808
|
+
let wrapLimit = this.computeWrapIndex(tokens);
|
|
809
|
+
if (tokens[tokens.length - 1].isPageBreak && wrapLimit === tokens.length && isNextLineExists) {
|
|
810
|
+
wrapLimit = 0;
|
|
811
|
+
}
|
|
812
|
+
const wrapSplit = tokens[wrapLimit - 1]?.breaksLine || tokens[wrapLimit - 1]?.isTable ? wrapLimit : this.computeWrapSplit(tokens, wrapLimit);
|
|
813
|
+
const wrapTokens = tokens.slice(0, wrapSplit || undefined);
|
|
814
|
+
if (wrapTokens.length) {
|
|
815
|
+
prevToken = wrapTokens[wrapTokens.length - 1];
|
|
816
|
+
}
|
|
817
|
+
const isAfterPageBreak = !rowInfos.length ? false : rowInfos[rowInfos.length - 1].isEndedByPageBreak;
|
|
818
|
+
const lineInfo = this.getLineInfoFromToken(prevToken, wrapTokens[0], wrapTokens, isAfterPageBreak);
|
|
819
|
+
lineInfo.backgroundColor = model.paragraphs[paragraphIndex].paragraphStyle.backgroundColor;
|
|
820
|
+
rowInfos.push(lineInfo);
|
|
821
|
+
if (!wrapLimit) {
|
|
822
|
+
break;
|
|
823
|
+
}
|
|
824
|
+
index = wrapSplit;
|
|
825
|
+
const splitsLength = splits.length;
|
|
826
|
+
const splitIndex = splitsLength ? index + splits[splitsLength - 1] : index;
|
|
827
|
+
splits.push(splitIndex);
|
|
828
|
+
}
|
|
829
|
+
this.pagesWrap.tabTokens.push(...strTokens.filter(x => x.isTab));
|
|
830
|
+
ParagraphHelper.applyParagraphIndentsToLines(rowInfos, paragraphIndex, model.paragraphs);
|
|
831
|
+
return { splits, rowInfos };
|
|
832
|
+
}
|
|
833
|
+
setDocument() {
|
|
834
|
+
const pageMargin = this.document.pageMargin;
|
|
835
|
+
this.pagesWrap = new PagesWrap(this.document.pagesSpace, pageMargin, this.document.pageWidth, this.document.pageHeight, this.customComponents);
|
|
836
|
+
}
|
|
837
|
+
getEmptyLineTokens(startIndex) {
|
|
838
|
+
const storedFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, startIndex);
|
|
839
|
+
if (!storedFormat) {
|
|
840
|
+
return [];
|
|
841
|
+
}
|
|
842
|
+
const lineInfo = this.getLineInfoByBreakModifier(startIndex);
|
|
843
|
+
const size = FontMetrics.measureCharSize('EMPTY_LINE', ContentStyleHelper.getFontStylesString(storedFormat.textStyle));
|
|
844
|
+
size.width = 3;
|
|
845
|
+
return [
|
|
846
|
+
new DisplayToken({
|
|
847
|
+
...size,
|
|
848
|
+
displayValue: DisplayValue.emptyLine,
|
|
849
|
+
align: lineInfo.align,
|
|
850
|
+
indentFirstLine: lineInfo.indent.firstLine,
|
|
851
|
+
indentHanging: lineInfo.indent.hanging,
|
|
852
|
+
indentLeft: lineInfo.indent.left,
|
|
853
|
+
indentRight: lineInfo.indent.right,
|
|
854
|
+
indentBefore: lineInfo.offsetBefore,
|
|
855
|
+
indentAfter: lineInfo.offsetAfter,
|
|
856
|
+
isPageBreak: false,
|
|
857
|
+
isLineBreak: false,
|
|
858
|
+
isTab: false,
|
|
859
|
+
lineSpacing: lineInfo.lineSpacing
|
|
860
|
+
})
|
|
861
|
+
];
|
|
862
|
+
}
|
|
863
|
+
getFilledLineTokens(startIndex, line, model) {
|
|
864
|
+
const lineInfo = this.getLineInfoByBreakModifier(startIndex + line.length);
|
|
865
|
+
const tokens = [];
|
|
866
|
+
let characters = [];
|
|
867
|
+
let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
868
|
+
let prevFormat = null;
|
|
869
|
+
let prevCharCode = null;
|
|
870
|
+
let prevFontString = null;
|
|
871
|
+
let prevChar = null;
|
|
872
|
+
let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
|
|
873
|
+
let symbolChange = false;
|
|
874
|
+
for (let i = 0; i < line.length; i++) {
|
|
875
|
+
const char = line[i];
|
|
876
|
+
const size = FontMetrics.measureCharSize(char, fontString);
|
|
877
|
+
const customComponent = this.customContentService.getOrGenerateComponent(this.model, this.customComponents, this.sessionId, this.generalProperties, this.contentWidth, startIndex, char);
|
|
878
|
+
const breakType = BreakHelper.getBreakType(model, char, startIndex);
|
|
879
|
+
if (customComponent && !breakType) {
|
|
880
|
+
this.customContentService.addToCustomComponents(this.customComponents, customComponent, char, startIndex);
|
|
881
|
+
const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
|
|
882
|
+
tokens.push(token);
|
|
883
|
+
prevCharCode = -1;
|
|
884
|
+
prevChar = '';
|
|
885
|
+
characters = [];
|
|
886
|
+
}
|
|
887
|
+
else {
|
|
888
|
+
const charCode = char.charCodeAt(0);
|
|
889
|
+
const displayValue = this.getDisplayValue(charCode);
|
|
890
|
+
const isFirstCharacter = i === 0;
|
|
891
|
+
const token = new DisplayToken({
|
|
892
|
+
...size,
|
|
893
|
+
displayValue,
|
|
894
|
+
align: lineInfo.align,
|
|
895
|
+
indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
|
|
896
|
+
indentHanging: isFirstCharacter ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
|
|
897
|
+
indentLeft: lineInfo.indent.left,
|
|
898
|
+
indentRight: lineInfo.indent.right,
|
|
899
|
+
indentBefore: lineInfo.offsetBefore,
|
|
900
|
+
indentAfter: lineInfo.offsetAfter,
|
|
901
|
+
lineSpacing: lineInfo.lineSpacing,
|
|
902
|
+
isPageBreak: breakType === BreakTypes.Page,
|
|
903
|
+
isLineBreak: breakType === BreakTypes.TextWrapping,
|
|
904
|
+
isTab: false
|
|
905
|
+
});
|
|
906
|
+
tokens.push(token);
|
|
907
|
+
if (charCode !== prevCharCode ||
|
|
908
|
+
!prevFormat ||
|
|
909
|
+
!ContentStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
|
|
910
|
+
symbolChange = true;
|
|
911
|
+
}
|
|
912
|
+
else if (i === line.length - 1) {
|
|
913
|
+
characters.push(token);
|
|
914
|
+
symbolChange = true;
|
|
915
|
+
}
|
|
916
|
+
else {
|
|
917
|
+
characters.push(token);
|
|
918
|
+
}
|
|
919
|
+
if (characters.length > 1 && symbolChange) {
|
|
920
|
+
this.processCharSizes(prevChar, prevFontString, characters);
|
|
921
|
+
characters = [token];
|
|
922
|
+
symbolChange = false;
|
|
923
|
+
}
|
|
924
|
+
else if (symbolChange) {
|
|
925
|
+
characters = [token];
|
|
926
|
+
}
|
|
927
|
+
prevCharCode = charCode;
|
|
928
|
+
prevChar = char;
|
|
929
|
+
}
|
|
930
|
+
prevFormat = format;
|
|
931
|
+
prevFontString = fontString;
|
|
932
|
+
startIndex++;
|
|
933
|
+
if (startIndex > format?.endIndex) {
|
|
934
|
+
format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
935
|
+
fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
return tokens;
|
|
939
|
+
}
|
|
940
|
+
processCharSizes(prevChar, prevFontString, characters) {
|
|
941
|
+
const newSize = FontMetrics.measureCharSize(prevChar, prevFontString);
|
|
942
|
+
for (let item of characters) {
|
|
943
|
+
Object.assign(item, newSize);
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
calculateSplit(index, tokens) {
|
|
947
|
+
for (let i = index; i >= 0; i--) {
|
|
948
|
+
if (this.isWhiteSpace(tokens[i]) || tokens[i].displayValue === DisplayValue.customContent) {
|
|
949
|
+
return i + 1;
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
return index;
|
|
953
|
+
}
|
|
954
|
+
isWhiteSpace(token) {
|
|
955
|
+
return [DisplayValue.space, DisplayValue.emptyLine].includes(token.displayValue);
|
|
956
|
+
}
|
|
957
|
+
getLineInfoFromToken(prevToken, firstWrapToken, wrapTokens, isAfterPageBreak) {
|
|
958
|
+
const info = new LineInfoModel({
|
|
959
|
+
width: 0,
|
|
960
|
+
height: 0,
|
|
961
|
+
align: prevToken.align,
|
|
962
|
+
indent: new IndentModel(prevToken.indentFirstLine, prevToken.indentHanging, prevToken.indentLeft, prevToken.indentRight),
|
|
963
|
+
offsetBefore: prevToken.indentBefore,
|
|
964
|
+
offsetAfter: prevToken.indentAfter,
|
|
965
|
+
lineSpacing: prevToken.lineSpacing,
|
|
966
|
+
isAfterPageBreak,
|
|
967
|
+
isEndedByPageBreak: prevToken.isPageBreak
|
|
968
|
+
});
|
|
969
|
+
if (firstWrapToken) {
|
|
970
|
+
info.align = firstWrapToken.align;
|
|
971
|
+
info.indent.firstLine = firstWrapToken.indentFirstLine;
|
|
972
|
+
info.indent.hanging = firstWrapToken.indentHanging;
|
|
973
|
+
info.indent.left = firstWrapToken.indentLeft;
|
|
974
|
+
info.indent.right = firstWrapToken.indentRight;
|
|
975
|
+
info.offsetBefore = firstWrapToken.indentBefore;
|
|
976
|
+
info.offsetAfter = firstWrapToken.indentAfter;
|
|
977
|
+
info.lineSpacing = firstWrapToken.lineSpacing;
|
|
978
|
+
info.hasTable = firstWrapToken.isTable;
|
|
979
|
+
}
|
|
980
|
+
let fontSize = 0;
|
|
981
|
+
let ascent = 0;
|
|
982
|
+
let descent = 0;
|
|
983
|
+
const tokens = isAfterPageBreak && !wrapTokens.length ? [prevToken] : wrapTokens;
|
|
984
|
+
for (const wrapToken of tokens) {
|
|
985
|
+
if (info.height < wrapToken.height) {
|
|
986
|
+
info.height = wrapToken.height;
|
|
987
|
+
}
|
|
988
|
+
if (fontSize < wrapToken.font && wrapToken.displayValue !== DisplayValue.customContent) {
|
|
989
|
+
fontSize = wrapToken.font;
|
|
990
|
+
ascent = wrapToken.ascent;
|
|
991
|
+
descent = wrapToken.descent;
|
|
992
|
+
}
|
|
993
|
+
info.width += wrapToken.width;
|
|
994
|
+
}
|
|
995
|
+
info.height = info.height || 18;
|
|
996
|
+
if (info.lineSpacing > 1) {
|
|
997
|
+
info.offsetAfter = (ascent + descent) * (info.lineSpacing - 1);
|
|
998
|
+
}
|
|
999
|
+
else if (ascent + descent === info.height) {
|
|
1000
|
+
info.height = info.height * info.lineSpacing;
|
|
1001
|
+
}
|
|
1002
|
+
return info;
|
|
1003
|
+
}
|
|
1004
|
+
getDisplayValue(charCode) {
|
|
1005
|
+
if (charCode === 32) {
|
|
1006
|
+
return DisplayValue.space;
|
|
1007
|
+
}
|
|
1008
|
+
if ((charCode > 39 && charCode < 48) || (charCode > 57 && charCode < 64)) {
|
|
1009
|
+
return DisplayValue.punctuation;
|
|
1010
|
+
}
|
|
1011
|
+
return DisplayValue.char;
|
|
1012
|
+
}
|
|
1013
|
+
getLineInfoByBreakModifier(index) {
|
|
1014
|
+
const paragraph = ParagraphStyleHelper.getParagraphAtIndex(this.model.paragraphs, index);
|
|
1015
|
+
if (!paragraph) {
|
|
1016
|
+
return new LineInfoModel({
|
|
1017
|
+
align: DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
1018
|
+
indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
1019
|
+
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
1020
|
+
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
1021
|
+
lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
const indentLeft = this.getParagraphIndentLeft(paragraph);
|
|
1025
|
+
const indentHanging = paragraph.paragraphStyle.numberingId === null ? paragraph.paragraphStyle.indentHanging : 0;
|
|
1026
|
+
return new LineInfoModel({
|
|
1027
|
+
align: paragraph.paragraphStyle.alignment ?? DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
1028
|
+
indent: new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, indentHanging ?? DEFAULT_PARAGRAPH_STYLE.indentHanging, indentLeft ?? DEFAULT_PARAGRAPH_STYLE.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
1029
|
+
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
1030
|
+
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
1031
|
+
lineSpacing: paragraph.paragraphStyle.lineSpacing ?? DEFAULT_PARAGRAPH_STYLE.lineSpacing
|
|
1032
|
+
});
|
|
1033
|
+
}
|
|
1034
|
+
getParagraphIndentLeft(paragraph) {
|
|
1035
|
+
let paragraphIndent = paragraph.paragraphStyle.indentLeft;
|
|
1036
|
+
const numberingId = paragraph.paragraphStyle.numberingId;
|
|
1037
|
+
if (numberingId !== null) {
|
|
1038
|
+
const level = paragraph.paragraphStyle.numberingLevel;
|
|
1039
|
+
const paragraphIndex = this.model.paragraphs.indexOf(paragraph);
|
|
1040
|
+
const levelModel = NumberingHelper.find(this.generalProperties.numberings, numberingId, level);
|
|
1041
|
+
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, paragraph.insertIndex);
|
|
1042
|
+
const markerTextStyle = ContentStyleHelper.combineTextStyles(levelModel.markerStyle, paragraphFormat.textStyle);
|
|
1043
|
+
let markerWidth = this.pagesWrap.paragraphs[paragraphIndex]?.numberingData?.width;
|
|
1044
|
+
if (!this.pagesWrap.paragraphs[paragraphIndex]?.numberingData.markerTextStyle ||
|
|
1045
|
+
!ContentStyleHelper.areSameTextStyles(markerTextStyle, this.pagesWrap.paragraphs[paragraphIndex].numberingData.markerTextStyle) ||
|
|
1046
|
+
this.pagesWrap.paragraphs[paragraphIndex].numberingData.numberingId !== numberingId) {
|
|
1047
|
+
const marker = NumberingHelper.getMarker(levelModel, numberingId, this.model.paragraphs, paragraphIndex);
|
|
1048
|
+
const markerSizes = NumberingHelper.getMarkerSizes(marker, markerTextStyle);
|
|
1049
|
+
markerWidth = markerSizes.width;
|
|
1050
|
+
}
|
|
1051
|
+
const hangingIndent = paragraph.paragraphStyle.indentHanging
|
|
1052
|
+
? paragraph.paragraphStyle.indentHanging
|
|
1053
|
+
: levelModel.indentHanging;
|
|
1054
|
+
paragraphIndent = levelModel.indentLeft;
|
|
1055
|
+
if (markerWidth >= hangingIndent) {
|
|
1056
|
+
const markerOverflow = markerWidth - hangingIndent;
|
|
1057
|
+
const additionalMarkerIndent = TabHelper.calculateTabWidth(levelModel.indentLeft + markerOverflow, this.generalProperties.defaultTabWidth);
|
|
1058
|
+
paragraphIndent += markerOverflow + additionalMarkerIndent;
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
return paragraphIndent;
|
|
1062
|
+
}
|
|
1063
|
+
updateTextStyles(styles, startIndex, endIndex) {
|
|
1064
|
+
let textStyles = FormatStyleHelper.getFormatsAtRange(this.model.formats, startIndex, endIndex).map(format => format.textStyle);
|
|
1065
|
+
let prevFormat;
|
|
1066
|
+
if (!textStyles.length) {
|
|
1067
|
+
prevFormat = FormatStyleHelper.getPrevFormatAtIndex(this.model.formats, startIndex);
|
|
1068
|
+
if (prevFormat) {
|
|
1069
|
+
textStyles = [prevFormat.textStyle];
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
for (const textStyle of textStyles) {
|
|
1073
|
+
for (const key of Object.keys(textStyle)) {
|
|
1074
|
+
if (styles[key]) {
|
|
1075
|
+
styles[key].push(textStyle[key]);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
return prevFormat;
|
|
1080
|
+
}
|
|
1081
|
+
updateParagraphStyles(styles, startIndex, endIndex) {
|
|
1082
|
+
const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(paragraph => paragraph.paragraphStyle);
|
|
1083
|
+
for (const paragraphStyle of paragraphStyles) {
|
|
1084
|
+
for (const key of Object.keys(paragraphStyle)) {
|
|
1085
|
+
if (styles[key]) {
|
|
1086
|
+
styles[key].push(paragraphStyle[key]);
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
updateNumberingStyles(styles, startIndex, endIndex) {
|
|
1092
|
+
const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(paragraph => paragraph.paragraphStyle);
|
|
1093
|
+
for (const paragraphStyle of paragraphStyles) {
|
|
1094
|
+
if (paragraphStyle.numberingId !== null) {
|
|
1095
|
+
const numberingLevels = this.generalProperties.numberings.find(x => x.numberingId === paragraphStyle.numberingId).levels;
|
|
1096
|
+
const levelsMarkerStyles = numberingLevels.reduce((prev, next) => `${prev}${next.marker}${next.markerType}`, '');
|
|
1097
|
+
const level = numberingLevels.find(x => x.level === paragraphStyle.numberingLevel);
|
|
1098
|
+
const isBulletMarker = level.markerType === NumberingMarkerType.Bullet;
|
|
1099
|
+
styles['isBulletMarker'].push(isBulletMarker);
|
|
1100
|
+
styles['numberingLevelsStyles'].push(levelsMarkerStyles);
|
|
1101
|
+
}
|
|
1102
|
+
else {
|
|
1103
|
+
styles['isBulletMarker'].push(null);
|
|
1104
|
+
styles['numberingLevelsStyles'].push('');
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
getImageWithAllowedSize(imageData, maxWidth) {
|
|
1109
|
+
if (imageData.width <= maxWidth) {
|
|
1110
|
+
return imageData;
|
|
1111
|
+
}
|
|
1112
|
+
const aspectRatio = imageData.width / imageData.height;
|
|
1113
|
+
const height = maxWidth / aspectRatio;
|
|
1114
|
+
return new ImageDataModel({ width: Math.round(maxWidth), height: Math.round(height), content: imageData.content });
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2V4ZWN1dGlvbi9lZGl0LnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUMxRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUdyRixPQUFPLEVBQ0gsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QiwwQkFBMEIsRUFDMUIsZUFBZSxFQUNsQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FB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Z0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM1QztTQUNKO0lBQ0wsQ0FBQztJQUVPLHVCQUF1QixDQUFDLFNBQXlCLEVBQUUsUUFBZ0I7UUFDdkUsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTtZQUM3QixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkgsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFsaWdubWVudCB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL2FsaWdubWVudHMuY29uc3QnO1xuaW1wb3J0IHsgQXBwbHlFbGVtZW50U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktZWxlbWVudC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBseUltYWdlU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktaW1hZ2Utc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQmFzZU5vZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvYWJzdHJhY3QvYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJlYWtIZWxwZXIgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWsuaGVscGVyJztcbmltcG9ydCB7IEJyZWFrVHlwZXMgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWstdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvc2VydmljZXMvY29tcG9uZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGVudEhlbHBlciB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL2NvbnRlbnQuaGVscGVyJztcbmltcG9ydCB7IENvbnRlbnRzSW50ZXJmYWNlIH0gZnJvbSAnLi4vY29udGVudC9jb250ZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29udGVudFN0eWxlSGVscGVyIH0gZnJvbSAnLi4vY29udGVudC9oZWxwZXJzL2NvbnRlbnQtc3R5bGUuaGVscGVyJztcbmltcG9ydCB7IEN1cnNvclBhcmFncmFwaCB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL2N1cnNvci1wYXJhZ3JhcGgnO1xuaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbnRlbnQtbWFya2Vycy5jb25zdCc7XG5pbXBvcnQgeyBDdXN0b21Db21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9jdXN0b20tY29tcG9uZW50LmhlcGxlcic7XG5pbXBvcnQgeyBDdXN0b21Db250ZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbnRlbnQnO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9zZXJ2aWNlcy9jdXN0b20tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SLFxuICAgIERFRkFVTFRfRk9OVF9DT0xPUixcbiAgICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgIERFRkFVTFRfRk9OVF9TSVpFLFxuICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLFxuICAgIEhZUEVSTElOS19IRUFESU5HX1NUWUxFX0lELFxuICAgIE5FV19MSU5FX01BUktVUFxufSBmcm9tICcuLi9jb250ZW50L2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgRGlzcGxheVRva2VuIH0gZnJvbSAnLi4vY29udGVudC9kaXNwbGF5LWRhdGEvZGlzcGxheS10b2tlbi5tb2RlbCc7XG5pbXBvcnQgeyBEaXNwbGF5VmFsdWUgfSBmcm9tICcuLi9jb250ZW50L2NvbnN0YW50cy9kaXNwbGF5LXZhbHVlcy5jb25zdCc7XG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL2RvY3VtZW50JztcbmltcG9ydCB7IERvY3hNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZG9jeC5tb2RlbCc7XG5pbXBvcnQgeyBFZGdlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvZWRnZXMvZWRnZXMnO1xuaW1wb3J0IHsgRWxlbWVudERhdGFNb2RlbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZXh0ZXJuYWwtZWxlbWVudC9tb2RlbHMvZWxlbWVudC1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0aW5nIH0gZnJvbSAnLi4vY29yZS9ldmVudC1lbWl0dGluZyc7XG5pbXBvcnQgeyBGb250TWV0cmljcyB9IGZyb20gJy4uL2dhZGdldHMvZm9udC1tZXRyaWNzL2ZvbnQtbWV0cmljcy5oZWxwZXInO1xuaW1wb3J0IHsgRm9ybWF0TW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2Zvcm1hdC5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtYXRTdHlsZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9mb3JtYXQtc3R5bGUuaGVscGVyJztcbmltcG9ydCB7IEdlbmVyYWxQcm9wZXJ0aWVzTW9kZWwgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS9nZW5lcmFsLXByb3BlcnRpZXMubW9kZWwnO1xuaW1wb3J0IHsgSUN1c3RvbUNvbXBvbmVudHMgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9jdXN0b20tY29tcG9uZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW1hZ2VEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2ltYWdlLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgSW5kZW50TW9kZWwgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS9pbmRlbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0QnJlYWtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWJyZWFrLm1vZGVsJztcbmltcG9ydCB7IEluc2VydEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWVsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0SW1hZ2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWltYWdlLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFBhcmFncmFwaE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYi5tb2RlbCc7XG5pbXBvcnQgeyBJVG9vbGJhclN0eWxlcyB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL3Rvb2xiYXItc3R5bGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaW5lSW5mb01vZGVsIH0gZnJvbSAnLi4vY29udGVudC9kaXNwbGF5LWRhdGEvbGluZS1pbmZvLm1vZGVsJztcbmltcG9ydCB7IExpbmtEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2xpbmstZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBMaW5rTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2xpbmsubW9kZWwnO1xuaW1wb3J0IHsgTm9kZXJJbWFnZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvaW1hZ2UvY29tcG9uZW50cy9pbWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZXJUYWJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVyVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL2NvbXBvbmVudHMvdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlcmluZ0hlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy5oZWxwZXInO1xuaW1wb3J0IHsgTnVtYmVyaW5nTGV2ZWxNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbnVtYmVyaW5nLWxldmVsLm1vZGVsJztcbmltcG9ydCB7IE51bWJlcmluZ01hcmtlclR5cGUgfSBmcm9tICcuLi9nYWRnZXRzL251bWJlcmluZy9udW1iZXJpbmctbWFya2VyLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBOdW1iZXJpbmdNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbnVtYmVyaW5nLm1vZGVsJztcbmltcG9ydCB7IE9wZXJhdGlvbnNIZWxwZXIgfSBmcm9tICcuLi9vcGVyYXRpb25zL29wZXJhdGlvbnMtaGVscGVyLmhlbHBlcic7XG5pbXBvcnQgeyBQYWdlc1dyYXAgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS9wYWdlcy53cmFwJztcbmltcG9ydCB7IFBhcmFncmFwaCB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL3BhcmFncmFwaCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvcGFyYWdyYXBoLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBhcmFncmFwaFN0eWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL3BhcmFncmFwaC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvcmFuZ2UnO1xuaW1wb3J0IHsgUmVwbGFjZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXBsYWNlLm1vZGVsJztcbmltcG9ydCB7IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXNpemUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUubW9kZWwnO1xuaW1wb3J0IHsgU2Nyb2xsQmFyIH0gZnJvbSAnLi4vZ2FkZ2V0cy9zY3JvbGxiYXInO1xuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvc2VsZWN0aW9uJztcbmltcG9ydCB7IFRhYkhlbHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvdGFiL3RhYi5oZWxwZXInO1xuaW1wb3J0IHsgVGFibGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgVGV4dFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RleHQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgVW5pY29kZUhlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvdW5pY29kZS91bmljb2RlLmhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBFZGl0U2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRpbmcge1xuICAgIHJlYWRvbmx5IGN1c3RvbUNvbXBvbmVudHM6IElDdXN0b21Db21wb25lbnRzO1xuXG4gICAgdG9rZW5SZSA9IG5ldyBSZWdFeHAoJ15bJyArIFVuaWNvZGVIZWxwZXIud29yZENoYXJzICsgJ1xcXFwkX10rJywgJ2cnKTtcblxuICAgIG5vblRva2VuUmUgPSBuZXcgUmVnRXhwKCdeKD86W14nICsgVW5pY29kZUhlbHBlci53b3JkQ2hhcnMgKyAnXFxcXCRfXXxcXFxcc10pKycsICdnJyk7XG5cbiAgICBwYWdlc1dyYXA6IFBhZ2VzV3JhcDtcblxuICAgIHdyYXBEYXRhOiBudW1iZXJbXVtdID0gW1tdXTsgLy8gV3JhcCBpbmRleGVzIGZvciBkb2N1bWVudCByb3dzXG5cbiAgICB3cmFwUGFyYWdyYXBoTGluZTogbnVtYmVyW10gPSBbXTsgLy8gbGluZSBudW1iZXJzIHRoYXQgYmVnaW4gdGhlIHBhcmFncmFwaHNcblxuICAgIHdyYXBQYXJhZ3JhcGhJbmRleDogbnVtYmVyW10gPSBbXTsgLy8gc3ltYm9sIGluZGV4ZXMgdGhhdCBiZWdpbiB0aGUgcGFyYWdyYXBoc1xuXG4gICAgZ2V0IHNjcm9sbFRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQmFyPy5zY3JvbGxUb3AgPz8gMDsgLy8gb25seSBtYWluIHNlc3Npb24gaXMgc2Nyb2xsYWJsZVxuICAgIH1cblxuICAgIGdldCBzdHlsZXNNYXAoKTogSVRvb2xiYXJTdHlsZXMge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVzTWFwO1xuICAgIH1cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdHlsZXNNYXA6IElUb29sYmFyU3R5bGVzID0ge1xuICAgICAgICBmb250RmFtaWx5OiBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgICAgICBmb250U2l6ZTogREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgIGZvbnRDb2xvcjogREVGQVVMVF9GT05UX0NPTE9SLFxuICAgICAgICBhbGlnbm1lbnQ6IEFsaWdubWVudC5sZWZ0LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUixcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUlxuICAgIH07XG5cbiAgICBzZXQgY29udGVudFdpZHRoKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29udGVudFdpZHRoID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoMCwgdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudFdpZHRoO1xuICAgIH1cbiAgICBwcml2YXRlIF9jb250ZW50V2lkdGg6IG51bWJlcjtcblxuICAgIGN1cnNvclN0eWxlOiBUZXh0U3R5bGVNb2RlbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICAgICBwdWJsaWMgc2Vzc2lvbklkOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBjdXN0b21Db250ZW50U2VydmljZTogQ3VzdG9tQ29udGVudFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb246IFNlbGVjdGlvbixcbiAgICAgICAgcHVibGljIGdlbmVyYWxQcm9wZXJ0aWVzOiBHZW5lcmFsUHJvcGVydGllc01vZGVsLFxuICAgICAgICBjb21wb25lbnRTZXJ2aWNlOiBDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNjcm9sbEJhcj86IFNjcm9sbEJhclxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBjb25zdCBlZGdlcyA9XG4gICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIERvY3hNb2RlbFxuICAgICAgICAgICAgICAgID8gbmV3IEVkZ2VzKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgbW9kZWwuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5mb290ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnBhZ2VNYXJnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucGFnZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICBnZW5lcmFsUHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRzID0geyBpbWFnZXM6IFtdLCB0YWJsZXM6IFtdLCB0YWJzOiBbXSwgY3VzdG9tRWxlbWVudHM6IFtdLCBlZGdlczogZWRnZXMgfTtcbiAgICAgICAgdGhpcy5zZXREb2N1bWVudCgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnZXNXcmFwLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBnZXRSb3dMZW5ndGgocm93OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMud3JhcERhdGFbcm93XSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53cmFwRGF0YVtyb3ddLmxlbmd0aCArIDE7XG4gICAgfVxuXG4gICAgdXBkYXRlV3JhcFBhcmFncmFwaEluZGV4KGZpcnN0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aDtcbiAgICAgICAgaWYgKGZpcnN0ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtmaXJzdF0gPSAwO1xuICAgICAgICAgICAgZmlyc3QrKztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtpXSA9IHRoaXMud3JhcFBhcmFncmFwaEluZGV4W2kgLSAxXSArIHRoaXMuZG9jdW1lbnQubGluZXNbaSAtIDFdLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXguc3BsaWNlKGNvdW50KTtcbiAgICB9XG5cbiAgICB1cGRhdGVXcmFwUGFyYWdyYXBoTGluZShmaXJzdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGg7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtmaXJzdF0gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtmaXJzdF0gPSB0aGlzLndyYXBQYXJhZ3JhcGhMaW5lW2ZpcnN0IC0gMV0gKyB0aGlzLndyYXBEYXRhW2ZpcnN0IC0gMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3QgKyAxOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtpXSA9IHRoaXMud3JhcFBhcmFncmFwaExpbmVbaSAtIDFdICsgdGhpcy53cmFwRGF0YVtpIC0gMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhMaW5lLnNwbGljZShjb3VudCk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFyYWdyYXBoTnVtYmVyaW5nRGF0YShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2luZGV4XS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2luZGV4XS5udW1iZXJpbmdEYXRhID0gTnVtYmVyaW5nSGVscGVyLmNyZWF0ZURhdGFNb2RlbChcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaW5kZXhdLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLmluc2VydEluZGV4KTtcbiAgICAgICAgICAgIE51bWJlcmluZ0hlbHBlci51cGRhdGVNYXJrZXJEYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpbmRleF0sXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFN0eWxlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlV3JhcERhdGEoZmlyc3RQYXJhZ3JhcGg6IG51bWJlciwgbGFzdFBhcmFncmFwaDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcFBhcmFncmFwaEluZGV4KGZpcnN0UGFyYWdyYXBoKTtcbiAgICAgICAgbGV0IGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA9IHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbZmlyc3RQYXJhZ3JhcGggLSAxXT8uaXNFbmRlZEJ5UGFnZUJyZWFrID8gZmlyc3RQYXJhZ3JhcGggOiAtMTtcbiAgICAgICAgbGV0IGZpcnN0VXNlZFRhYkluZGV4ID0gdGhpcy5tb2RlbC50YWJzLmZpbmRJbmRleCh4ID0+IHguaW5zZXJ0SW5kZXggPj0gdGhpcy53cmFwUGFyYWdyYXBoSW5kZXhbZmlyc3RQYXJhZ3JhcGhdKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZpcnN0UGFyYWdyYXBoOyBpIDw9IGxhc3RQYXJhZ3JhcGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAudGFiVG9rZW5zID0gW107XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50TGluZSA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZSh0aGlzLmRvY3VtZW50LmxpbmVzLCBpKTtcbiAgICAgICAgICAgIGNvbnN0IGlzTmV4dExpbmVFeGlzdHMgPSB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aCA+IGkgKyAxO1xuICAgICAgICAgICAgY29uc3QgeyBzcGxpdHMsIHJvd0luZm9zIH0gPSB0aGlzLmdldFNwbGl0cyh0aGlzLm1vZGVsLCBjdXJyZW50TGluZSwgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXhbaV0sIGksIGlzTmV4dExpbmVFeGlzdHMpO1xuICAgICAgICAgICAgdGhpcy53cmFwRGF0YVtpXSA9IHNwbGl0cztcbiAgICAgICAgICAgIGlmIChpbmRleE9mUGFyYWdyYXBoQWZ0ZXJQYWdlQnJlYWsgPT09IGkpIHtcbiAgICAgICAgICAgICAgICByb3dJbmZvc1swXS5pc0FmdGVyUGFnZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA9IHJvd0luZm9zW3Jvd0luZm9zLmxlbmd0aCAtIDFdLmlzRW5kZWRCeVBhZ2VCcmVhayA/IGkgKyAxIDogLTE7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5zZXQoaSwgcm93SW5mb3MsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUGFyYWdyYXBoTnVtYmVyaW5nRGF0YShpKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV3JhcFBhcmFncmFwaEluZGV4KGZpcnN0UGFyYWdyYXBoKTtcbiAgICAgICAgICAgIGZpcnN0VXNlZFRhYkluZGV4ID0gdGhpcy51cGRhdGVQYXJhZ3JhcGhUYWJzKGZpcnN0VXNlZFRhYkluZGV4LCBpLCBjdXJyZW50TGluZS5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tsYXN0UGFyYWdyYXBoICsgMV0/LnNldElzQWZ0ZXJQYWdlQnJlYWsoaW5kZXhPZlBhcmFncmFwaEFmdGVyUGFnZUJyZWFrID4gLTEpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuZG9jdW1lbnQubGluZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzLnNwbGljZShjb3VudCk7XG4gICAgICAgIHRoaXMud3JhcERhdGEuc3BsaWNlKGNvdW50KTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwUGFyYWdyYXBoTGluZShmaXJzdFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMucGFnZXNXcmFwLnByb2Nlc3NQYXJhZ3JhcGhzUHJvcGVydGllcyhmaXJzdFBhcmFncmFwaCwgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc3RyaW5nLCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBkaXNwbGF5IGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0YWJzIGFuZCBzcGFjZXMuXG4gICAgICovXG4gICAgZ2V0RGlzcGxheVRva2Vucyhtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsIHN0cjogc3RyaW5nLCBzdGFydEluZGV4OiBudW1iZXIpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGlmICghc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RW1wdHlMaW5lVG9rZW5zKHN0YXJ0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsbGVkTGluZVRva2VucyhzdGFydEluZGV4LCBzdHIsIG1vZGVsKTtcbiAgICB9XG5cbiAgICBnZXRSb3dDYWNoZUluZGV4KGNhY2hlQXJyYXk6IG51bWJlcltdLCB2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgbGV0IGVuZCA9IGNhY2hlQXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgbWlkID0gKHN0YXJ0ICsgZW5kKSA+PiAxO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gY2FjaGVBcnJheVttaWRdO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUgPiBjZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgY2VudGVyKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGFydCAtIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgd2lkdGggb2YgdGhlIHN0cmluZyBgc3RyYCBvbiB0aGUgc2NyZWVuIHdoaWxlIGFzc3VtaW5nIHRoYXQgdGhlIHN0cmluZyBzdGFydHMgYXQgdGhlIGZpcnN0IGNvbHVtbiBvbiB0aGUgc2NyZWVuLlxuICAgICAqIFRoZSBmaXJzdCBwb3NpdGlvbiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGZvciBgc3RyYCBvbiBzY3JlZW4uXG4gICAgICogVGhlIHNlY29uZCB2YWx1ZSBjb250YWlucyB0aGUgcG9zaXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbHVtbiB0aGF0IHRoaXMgZnVuY3Rpb24gcmVhZCB1bnRpbC5cbiAgICAgKi9cbiAgICBnZXRTdHJpbmdTY3JlZW5XaWR0aChzdHI6IHN0cmluZywgbWF4U2NyZWVuQ29sdW1uPzogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgc2NyZWVuQ29sdW1uID0gMDtcbiAgICAgICAgbGV0IGNvbHVtbjogbnVtYmVyO1xuICAgICAgICBmb3IgKGNvbHVtbiA9IDA7IGNvbHVtbiA8IHN0ci5sZW5ndGg7IGNvbHVtbisrKSB7XG4gICAgICAgICAgICBzY3JlZW5Db2x1bW4gKz0gMTtcblxuICAgICAgICAgICAgaWYgKHNjcmVlbkNvbHVtbiA+IG1heFNjcmVlbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtzY3JlZW5Db2x1bW4sIGNvbHVtbl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBzdGFydGluZyByb3cgYW5kIGNvbHVtbiwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYFJhbmdlYCBvZiB0aGUgZmlyc3Qgd29yZCBib3VuZGFyeSBpdCBmaW5kcy5cbiAgICAgKi9cbiAgICBnZXRXb3JkUmFuZ2Uocm93OiBudW1iZXIsIGNvbHVtbjogbnVtYmVyKTogUmFuZ2Uge1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHRoaXMuZG9jdW1lbnQubGluZXMsIHJvdyk7XG4gICAgICAgIGxldCBpblRva2VuID0gZmFsc2U7XG4gICAgICAgIGlmIChjb2x1bW4gPiAwKSB7XG4gICAgICAgICAgICBpblRva2VuID0gISFsaW5lLmNoYXJBdChjb2x1bW4gLSAxKS5tYXRjaCh0aGlzLnRva2VuUmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpblRva2VuKSB7XG4gICAgICAgICAgICBpblRva2VuID0gISFsaW5lLmNoYXJBdChjb2x1bW4pLm1hdGNoKHRoaXMudG9rZW5SZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVnZXhwOiBSZWdFeHA7XG4gICAgICAgIGlmIChpblRva2VuKSB7XG4gICAgICAgICAgICByZWdleHAgPSB0aGlzLnRva2VuUmU7XG4gICAgICAgIH0gZWxzZSBpZiAoL15cXHMrJC8udGVzdChsaW5lLnNsaWNlKGNvbHVtbiAtIDEsIGNvbHVtbiArIDEpKSkge1xuICAgICAgICAgICAgcmVnZXhwID0gL1xccy87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWdleHAgPSB0aGlzLm5vblRva2VuUmU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhcnQgPSBjb2x1bW47XG4gICAgICAgIGlmIChzdGFydCA+IDApIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBzdGFydC0tO1xuICAgICAgICAgICAgfSB3aGlsZSAoc3RhcnQgPj0gMCAmJiBsaW5lLmNoYXJBdChzdGFydCkubWF0Y2gocmVnZXhwKSk7XG5cbiAgICAgICAgICAgIHN0YXJ0Kys7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW5kID0gY29sdW1uO1xuICAgICAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgbGluZS5jaGFyQXQoZW5kKS5tYXRjaChyZWdleHApKSB7XG4gICAgICAgICAgICBlbmQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UobmV3IEN1cnNvclBhcmFncmFwaChyb3csIHN0YXJ0KSwgbmV3IEN1cnNvclBhcmFncmFwaChyb3csIGVuZCkpO1xuICAgIH1cblxuICAgIGdldERpc3BsYXlMaW5lKHJvdzogbnVtYmVyLCBlbmRDb2x1bW46IG51bWJlciwgc3RhcnRDb2x1bW4/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHRoaXMuZG9jdW1lbnQubGluZXMsIHJvdyk7XG5cbiAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uIHx8IDAsIGVuZENvbHVtbiB8fCBsaW5lLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZShzdGFydFBhcmFncmFwaFBvc2l0aW9uLCBlbmRQYXJhZ3JhcGhQb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGluc2VydFRleHRCeURvY3VtZW50SW5kZXgoaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzdHlsZT86IFRleHRTdHlsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIHRleHQsIHN0eWxlKTtcbiAgICB9XG5cbiAgICBpbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydEVsZW1lbnRNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEVsZW1lbnQuZWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydEVsZW1lbnQoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmVsZW1lbnQpO1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydEJyZWFrTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnJlYWsoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmJyZWFrVHlwZSBhcyBCcmVha1R5cGVzKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0VGFiTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGFiKGVsZW1lbnRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0SW1hZ2VNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRJbWFnZShlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQuaW1hZ2VEYXRhKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZUJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRUYWJsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRhYmxlKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0UGFyYWdyYXBoQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydFBhcmFncmFwaE1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFBhcmFncmFwaChlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQpO1xuICAgIH1cblxuICAgIGFwcGx5VGV4dFN0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgdGV4dFN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnNvclN0eWxlID0gbmV3IFRleHRTdHlsZU1vZGVsKHRleHRTdHlsZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5VGV4dFN0eWxlKHRoaXMubW9kZWwsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKHRleHRTdHlsZSk7XG4gICAgfVxuXG4gICAgYXBwbHlQYXJhZ3JhcGhTdHlsZShzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIHBhcmFncmFwaFN0eWxlOiBQYXJhZ3JhcGhTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5UGFyYWdyYXBoU3R5bGUodGhpcy5tb2RlbCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlKTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShwYXJhZ3JhcGhTdHlsZSk7XG4gICAgfVxuXG4gICAgYXBwbHlFbGVtZW50U3R5bGUobW9kZWw6IEFwcGx5RWxlbWVudFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseUVsZW1lbnRTdHlsZSh0aGlzLm1vZGVsLCBtb2RlbCk7XG4gICAgICAgIGNvbnN0IGltYWdlQ29tcG9uZW50UmVmID0gdGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGltYWdlQ29tcG9uZW50UmVmLmluc3RhbmNlLmluaXRpYWxpemUoKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgbW9kZWwuaW5zZXJ0SW5kZXgpLnJvdztcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwYXJhZ3JhcGgsIHBhcmFncmFwaCk7XG4gICAgfVxuXG4gICAgYWRkTnVtYmVyaW5nKGxldmVsczogTnVtYmVyaW5nTGV2ZWxNb2RlbFtdLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYWRkTnVtYmVyaW5nKHRoaXMubW9kZWwsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgc3RhcnRJbmRleCwgZW5kSW5kZXgsIGxldmVscyk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydFBhcmFncmFwaDsgaSA8PSBlbmRQYXJhZ3JhcGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaV0ubnVtYmVyaW5nRGF0YS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQYXJhZ3JhcGgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5zZXROdW1iZXJpbmdTdHlsZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnVtYmVyaW5ncyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlTnVtYmVyaW5ncyh0aGlzLm1vZGVsLCB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0UGFyYWdyYXBoOyBpIDw9IGVuZFBhcmFncmFwaDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpXS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBhcmFncmFwaCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9XG5cbiAgICByZXN0b3JlTnVtYmVyaW5ncyhwYXJhZ3JhcGhzOiBQYXJhZ3JhcGhNb2RlbFtdLCBudW1iZXJpbmdzOiBOdW1iZXJpbmdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYXJhZ3JhcGhzWzBdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhcmFncmFwaHNbcGFyYWdyYXBocy5sZW5ndGggLSAxXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhXaXRoT2Zmc2V0KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCB0aGlzLmRvY3VtZW50LmxpbmVzLCBlbmRJbmRleCk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZU51bWJlcmluZ3ModGhpcy5tb2RlbCwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLCBwYXJhZ3JhcGhzLCBudW1iZXJpbmdzKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgcGFyYWdyYXBocykge1xuICAgICAgICAgICAgaWYgKHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFBhcmFncmFwaCwgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICB0aGlzLnNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9XG5cbiAgICBhcHBseUltYWdlU3R5bGUoYXBwbHlJbWFnZTogQXBwbHlJbWFnZVN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW1hZ2VDb21wb25lbnRSZWYgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBhcHBseUltYWdlLmluc2VydEluZGV4KTtcbiAgICAgICAgaW1hZ2VDb21wb25lbnRSZWYuaW5zdGFuY2UucmVzaXplKHsgd2lkdGg6IGFwcGx5SW1hZ2Uud2lkdGgsIGhlaWdodDogYXBwbHlJbWFnZS5oZWlnaHQgfSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlJbWFnZVN0eWxlKHRoaXMubW9kZWwsIGFwcGx5SW1hZ2UpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuZG9jdW1lbnQuaW5kZXhUb1Bvc2l0aW9uKGFwcGx5SW1hZ2UuaW5zZXJ0SW5kZXgsIDApO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0LnJvdywgdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICByZXN0b3JlVGV4dFN0eWxlcyhmb3JtYXRzOiBGb3JtYXRNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBmb3JtYXRzWzBdLnN0YXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gZm9ybWF0c1tmb3JtYXRzLmxlbmd0aCAtIDFdLmVuZEluZGV4O1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaFdpdGhPZmZzZXQodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHRoaXMuZG9jdW1lbnQubGluZXMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlVGV4dFN0eWxlcyh0aGlzLm1vZGVsLCBmb3JtYXRzKTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFBhcmFncmFwaCwgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb25TdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlUGFyYWdyYXBoU3R5bGVzKHBhcmFncmFwaHM6IFBhcmFncmFwaE1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHBhcmFncmFwaHNbMF0uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gcGFyYWdyYXBoc1twYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaFdpdGhPZmZzZXQodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHRoaXMuZG9jdW1lbnQubGluZXMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlUGFyYWdyYXBoU3R5bGVzKHRoaXMubW9kZWwsIHBhcmFncmFwaHMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHNldFRleHRTdHlsZSh0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3Vyc29yU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwodGV4dFN0eWxlKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZSh0ZXh0U3R5bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGByYW5nZWAgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogSWYgYHJhbmdlYCBpcyBlbXB0eSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIHZhbHVlIG9mIGByYW5nZS5zdGFydGAuXG4gICAgICovXG4gICAgcmVtb3ZlKHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJ0SW5kZXhlcyA9IENvbnRlbnRIZWxwZXIuZ2V0U2VsZWN0ZWRQYXJ0RG9jdW1lbnRJbmRleGVzKHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCByYW5nZSk7XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVSYW5nZShyYW5nZSk7XG5cbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cywgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcblxuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmRlbGV0ZSh0aGlzLm1vZGVsLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocmFuZ2Uuc3RhcnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YU9uRGVsZXRlVGV4dChyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cpO1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlcGxhY2UobW9kZWw6IFJlcGxhY2VNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIHRoaXMucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMobW9kZWwuZGVsZXRlLnN0YXJ0SW5kZXgsIG1vZGVsLmRlbGV0ZS5lbmRJbmRleCArIDEpO1xuICAgICAgICBsZXQgZW5kUG9pbnQ6IEN1cnNvclBhcmFncmFwaDtcbiAgICAgICAgaWYgKG1vZGVsLmluc2VydFRleHQpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRUZXh0QnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydFRleHQuaW5zZXJ0SW5kZXgsIG1vZGVsLmluc2VydFRleHQudGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0UGFyYWdyYXBoKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0UGFyYWdyYXBoQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydFBhcmFncmFwaCk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0RWxlbWVudCkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydEVsZW1lbnRCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0RWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0QnJlYWspIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRCcmVha0J5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRCcmVhayk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0VGFiKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGFiQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydFRhYik7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0SW1hZ2UpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRJbWFnZUJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRJbWFnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0VGFibGUpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRUYWJsZUJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGV4dChwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCB0ZXh0OiBzdHJpbmcsIGN1cnNvclN0eWxlPzogVGV4dFN0eWxlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGN1cnNvclN0eWxlKSB7XG4gICAgICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFN0eWxlZFRleHQodGhpcy5tb2RlbCwgdGV4dCwgaW5zZXJ0SW5kZXgsIGN1cnNvclN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGV4dCh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocG9zaXRpb24sIHRleHQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YU9uSW5zZXJ0VGV4dChwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnQocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgZWxlbWVudDogRWxlbWVudERhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCBpbnNlcnRFbGVtZW50ID0gbmV3IEluc2VydEVsZW1lbnRNb2RlbCh7IGVsZW1lbnQ6IG5ldyBFbGVtZW50TW9kZWwoeyBpbnNlcnRJbmRleCwgLi4uZWxlbWVudCB9KSB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRFbGVtZW50KHRoaXMubW9kZWwsIGluc2VydEVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC5lbGVtZW50cy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5maW5kQ29tcG9uZW50VHlwZShtb2RlbC50eXBlKTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLCBtb2RlbCwgdHlwZSk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVhayhwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBicmVha1R5cGU6IEJyZWFrVHlwZXMpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaXNPbk5ld1BhcmFncmFwaCA9XG4gICAgICAgICAgICBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSAmJlxuICAgICAgICAgICAgQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKHRoaXMubW9kZWwsIENVU1RPTV9FTEVNRU5UX01BUktFUiwgaW5zZXJ0SW5kZXggLSAxKSAhPT0gQnJlYWtUeXBlcy5QYWdlO1xuICAgICAgICBjb25zdCB0ZXh0ID0gaXNPbk5ld1BhcmFncmFwaCA/IGAke05FV19MSU5FX01BUktVUH0ke0NVU1RPTV9FTEVNRU5UX01BUktFUn1gIDogQ1VTVE9NX0VMRU1FTlRfTUFSS0VSO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEJyZWFrKHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4LCBicmVha1R5cGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgaWYgKGlzT25OZXdQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0aGlzLmRvY3VtZW50LmdldFBvc2l0aW9uQWZ0ZXJCcmVhayhlbmRQb3NpdGlvbiwgYnJlYWtUeXBlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoY3Vyc29yUG9zaXRpb24pO1xuXG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWIocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYih0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLnRhYnMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIG1vZGVsLCBOb2RlclRhYkNvbXBvbmVudCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEocG9zaXRpb24ucm93LCBwb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZShwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBpbWFnZURhdGE6IEltYWdlRGF0YU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkSW1hZ2UgPSB0aGlzLmdldEltYWdlV2l0aEFsbG93ZWRTaXplKGltYWdlRGF0YSwgdGhpcy5jb250ZW50V2lkdGgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEltYWdlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBhZGp1c3RlZEltYWdlKTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIG1vZGVsLCBOb2RlckltYWdlQ29tcG9uZW50KTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZG9jdW1lbnQuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0TGluayhwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBsaW5rRGF0YTogTGlua0RhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCBsaW5rU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwoeyBoZWFkaW5nU3R5bGVJZDogSFlQRVJMSU5LX0hFQURJTkdfU1RZTEVfSUQsIHVuZGVybGluZTogdHJ1ZSB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRMaW5rKHRoaXMubW9kZWwsIGxpbmtEYXRhLnRleHQsIGxpbmtEYXRhLmxpbmssIGluc2VydEluZGV4LCBsaW5rU3R5bGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCBsaW5rRGF0YS50ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIHRhYmxlTW9kZWw6IEluc2VydFRhYmxlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWJsZSh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgdGFibGVNb2RlbCwgdGhpcy5wYWdlc1dyYXAuY29udGVudFdpZHRoKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLnRhYmxlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gdGFibGVNb2RlbC5pbnNlcnRUYWJsZUluZGV4KTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcywgbW9kZWwsIE5vZGVyVGFibGVDb21wb25lbnQpO1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZG9jdW1lbnQuaW5zZXJ0VGV4dChwb3NpdGlvbiwgdGFibGVNb2RlbC5jb250ZW50KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRQYXJhZ3JhcGgocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgcGFyYWdyYXBoTW9kZWw6IEluc2VydFBhcmFncmFwaE1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHRleHQgPSBPcGVyYXRpb25zSGVscGVyLmluc2VydFBhcmFncmFwaCh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcGFyYWdyYXBoTW9kZWwsIHRoaXMucGFnZXNXcmFwLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICBsZXQgZW5kUG9pbnQ6IEN1cnNvclBhcmFncmFwaDtcbiAgICAgICAgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydFRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUZXh0Lmluc2VydEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIHRleHQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24ucm93LCBlbmRQb2ludC5yb3cpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydEltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0SW1hZ2UuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbWFnZUluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLmltYWdlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW1hZ2VJbnNlcnRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBtb2RlbCwgTm9kZXJJbWFnZUNvbXBvbmVudCk7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuZG9jdW1lbnQuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEocGFyYWdyYXBoUG9zaXRpb24ucm93LCBwYXJhZ3JhcGhQb3NpdGlvbi5yb3cpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUYWJsZS5pbnNlcnRUYWJsZUluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIG1vZGVsLCBOb2RlclRhYmxlQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUYWJsZS5jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgYWRkQ29tcG9uZW50PFQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQ+KGN1c3RvbUVsZW1lbnRzOiBDb21wb25lbnRSZWY8VD5bXSwgbW9kZWw6IEN1c3RvbUNvbnRlbnQsIGNvbXBvbmVudFR5cGU6IFR5cGU8VD4pIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuY29tcG9uZW50U2VydmljZS5nZW5lcmF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlLCB7XG4gICAgICAgICAgICBjb250ZW50OiBtb2RlbCxcbiAgICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICBnZW5lcmFsUHJvcGVydGllczogdGhpcy5nZW5lcmFsUHJvcGVydGllcyxcbiAgICAgICAgICAgIGNvbnRlbnRXaWR0aDogdGhpcy5jb250ZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnRQb3NpdGlvbiA9IGN1c3RvbUVsZW1lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPiBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGlmIChuZXdFbGVtZW50UG9zaXRpb24gPj0gMCkge1xuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHMuc3BsaWNlKG5ld0VsZW1lbnRQb3NpdGlvbiwgMCwgY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXN0b21FbGVtZW50cy5wdXNoKGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGU6IFRleHRTdHlsZU1vZGVsIHwgUGFyYWdyYXBoU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzdHlsZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlc01hcFtrZXldID0gc3R5bGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsKCdzZXRTdHlsZXMnLCB0aGlzLl9zdHlsZXNNYXApO1xuICAgIH1cblxuICAgIHNldFN0eWxlcyhzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55W10gfSk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoc3R5bGVzKSkge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1trZXldLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlc01hcFtrZXldID0gQ29udGVudFN0eWxlSGVscGVyLmdldERlZmF1bHRTdHlsZVZhbHVlQnlLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVzW2tleV0ubGVuZ3RoID4gMSAmJiAhc3R5bGVzW2tleV0uZXZlcnkoeCA9PiB4ID09PSBzdHlsZXNba2V5XVswXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZXNNYXBba2V5XSA9IHR5cGVvZiBzdHlsZXNba2V5XVswXSA9PT0gJ2Jvb2xlYW4nICYmIGtleSAhPT0gJ2lzQnVsbGV0TWFya2VyJyA/IGZhbHNlIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc3R5bGVzTWFwW2tleV0gPSBzdHlsZXNba2V5XVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsKCdzZXRTdHlsZXMnLCB0aGlzLl9zdHlsZXNNYXApO1xuICAgIH1cblxuICAgIHNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFt0aGlzLl9zdHlsZXNNYXAuYWxpZ25tZW50XSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogW3RoaXMuX3N0eWxlc01hcC5iYWNrZ3JvdW5kQ29sb3JdLFxuICAgICAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IFt0aGlzLl9zdHlsZXNNYXAuaGlnaGxpZ2h0Q29sb3JdLFxuICAgICAgICAgICAgZm9udENvbG9yOiBbdGhpcy5fc3R5bGVzTWFwLmZvbnRDb2xvcl0sXG4gICAgICAgICAgICBmb250RmFtaWx5OiBbdGhpcy5fc3R5bGVzTWFwLmZvbnRGYW1pbHldLFxuICAgICAgICAgICAgZm9udFNpemU6IFt0aGlzLl9zdHlsZXNNYXAuZm9udFNpemVdLFxuICAgICAgICAgICAgaXRhbGljOiBbdGhpcy5fc3R5bGVzTWFwLml0YWxpY10sXG4gICAgICAgICAgICBib2xkOiBbdGhpcy5fc3R5bGVzTWFwLmJvbGRdLFxuICAgICAgICAgICAgc3RyaWtldGhyb3VnaDogW3RoaXMuX3N0eWxlc01hcC5zdHJpa2V0aHJvdWdoXSxcbiAgICAgICAgICAgIHVuZGVybGluZTogW3RoaXMuX3N0eWxlc01hcC51bmRlcmxpbmVdLFxuICAgICAgICAgICAgc3BhY2VCZWZvcmU6IFt0aGlzLl9zdHlsZXNNYXAuc3BhY2VCZWZvcmVdLFxuICAgICAgICAgICAgc3BhY2VBZnRlcjogW3RoaXMuX3N0eWxlc01hcC5zcGFjZUFmdGVyXSxcbiAgICAgICAgICAgIGluZGVudExlZnQ6IFt0aGlzLl9zdHlsZXNNYXAuaW5kZW50TGVmdF0sXG4gICAgICAgICAgICBpbmRlbnRSaWdodDogW3RoaXMuX3N0eWxlc01hcC5pbmRlbnRSaWdodF0sXG4gICAgICAgICAgICBpc0J1bGxldE1hcmtlcjogW10sXG4gICAgICAgICAgICBudW1iZXJpbmdMZXZlbHNTdHlsZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nU3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnNldFN0eWxlcyhzdHlsZXMpO1xuICAgIH1cblxuICAgIHJlc3RvcmUobW9kZWw6IFJlc3RvcmVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIG1vZGVsLnN0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAobW9kZWwuc3RhcnRJbmRleCAhPT0gbW9kZWwuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMobW9kZWwuc3RhcnRJbmRleCwgbW9kZWwuZW5kSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlKHRoaXMubW9kZWwsIG1vZGVsKTtcblxuICAgICAgICBjb25zdCByZXN0b3JlRW5kSW5kZXggPSBtb2RlbC5zdGFydEluZGV4ICsgbW9kZWwudGV4dC5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC50YWJsZXMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIE5vZGVyVGFibGVDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC5pbWFnZXMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIE5vZGVySW1hZ2VDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC50YWJzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicywgTm9kZXJUYWJDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUVsZW1lbnRDb21wb25lbnRzKHRoaXMubW9kZWwuZWxlbWVudHMsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIG1vZGVsLnRleHQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YU9uSW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZUNvbXBvbmVudHM8VCBleHRlbmRzIEJhc2VOb2RlckNvbXBvbmVudD4oXG4gICAgICAgIG1vZGVsczogQ3VzdG9tQ29udGVudFtdLFxuICAgICAgICBjb21wb25lbnRzOiBDb21wb25lbnRSZWY8QmFzZU5vZGVyQ29tcG9uZW50PltdLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBUeXBlPFQ+LFxuICAgICAgICByZXN0b3JlSW5kZXg6IG51bWJlcixcbiAgICAgICAgcmVzdG9yZUVuZEluZGV4OiBudW1iZXJcbiAgICApOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHMpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbC5pbnNlcnRJbmRleCA8IHJlc3RvcmVJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRJbmRleCA+PSByZXN0b3JlRW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KGNvbXBvbmVudHMsIG1vZGVsLCBjb21wb25lbnRUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc3RvcmVFbGVtZW50Q29tcG9uZW50cyhlbGVtZW50czogRWxlbWVudE1vZGVsW10sIHJlc3RvcmVJbmRleDogbnVtYmVyLCByZXN0b3JlRW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPCByZXN0b3JlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPj0gcmVzdG9yZUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5maW5kQ29tcG9uZW50VHlwZShtb2RlbC50eXBlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cywgbW9kZWwsIHR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gdGhpcy5nZXRSYW5nZUluZGV4ZXModGhpcy5zZWxlY3Rpb24ucmFuZ2UpO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IHtcbiAgICAgICAgICAgIGFsaWdubWVudDogW10sXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFtdLFxuICAgICAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IFtdLFxuICAgICAgICAgICAgZm9udENvbG9yOiBbXSxcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFtdLFxuICAgICAgICAgICAgZm9udFNpemU6IFtdLFxuICAgICAgICAgICAgaXRhbGljOiBbXSxcbiAgICAgICAgICAgIGJvbGQ6IFtdLFxuICAgICAgICAgICAgc3RyaWtldGhyb3VnaDogW10sXG4gICAgICAgICAgICB1bmRlcmxpbmU6IFtdLFxuICAgICAgICAgICAgc3BhY2VCZWZvcmU6IFtdLFxuICAgICAgICAgICAgc3BhY2VBZnRlcjogW10sXG4gICAgICAgICAgICBpbmRlbnRMZWZ0OiBbXSxcbiAgICAgICAgICAgIGluZGVudFJpZ2h0OiBbXSxcbiAgICAgICAgICAgIGlzQnVsbGV0TWFya2VyOiBbXSxcbiAgICAgICAgICAgIG51bWJlcmluZ0xldmVsc1N0eWxlczogW11cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51cGRhdGVQYXJhZ3JhcGhTdHlsZXMoc3R5bGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nU3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnVwZGF0ZVRleHRTdHlsZXMoc3R5bGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGVzKHN0eWxlcyk7XG5cbiAgICAgICAgaWYgKGZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5jdXJzb3JTdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIGZvcm1hdC50ZXh0U3R5bGUsIHRoaXMuY3Vyc29yU3R5bGUpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLmN1cnNvclN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yU3R5bGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TGlua01vZGVsKGN1cnNvcjogQ3Vyc29yUGFyYWdyYXBoKTogTGlua01vZGVsIHtcbiAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gdGhpcy5nZXRSYW5nZUluZGV4ZXMobmV3IFJhbmdlKGN1cnNvciwgY3Vyc29yKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmxpbmtzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4IDw9IHN0YXJ0SW5kZXggKyAxICYmIHguZW5kSW5kZXggPiBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlUm93cyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcm93c0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIGNvbHVtbnNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlQ29sdW1ucyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgY29sdW1uc0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4LCB0aGlzLnBhZ2VzV3JhcC5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGVDb21wb25lbnQuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlVGFibGVSb3dzKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleDogbnVtYmVyLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnBhZ2VzV3JhcC5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGVDb21wb25lbnQuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZXNpemVUYWJsZUNvbHVtbnMocmVzaXplVGFibGVDb2x1bW5zOiBSZXNpemVUYWJsZUNvbHVtbnNNb2RlbCk6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc2l6ZVRhYmxlQ29sdW1ucyh0aGlzLm1vZGVsLCByZXNpemVUYWJsZUNvbHVtbnMpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IHJlc2l6ZVRhYmxlQ29sdW1ucy5pbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZVRhYmxlKGluc2VydEluZGV4OiBudW1iZXIsIHRhYmxlOiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZFRhYmxlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0YWJsZSkpIGFzIFRhYmxlTW9kZWw7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZVRhYmxlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBvbGRUYWJsZSk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGFyYWdyYXBoVGFicyh0YWJJbmRleDogbnVtYmVyLCBwYXJhZ3JhcGhJbmRleDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaExhc3RJbmRleCA9IHRoaXMud3JhcFBhcmFncmFwaEluZGV4W3BhcmFncmFwaEluZGV4XSArIGxlbmd0aDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFiSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgICB0YWJJbmRleCA+PSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicy5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5pbnNlcnRJbmRleCA+IHBhcmFncmFwaExhc3RJbmRleFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0YWJJbmRleDtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XSAmJiB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2UuaW5zZXJ0SW5kZXggPD0gcGFyYWdyYXBoTGFzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2Uud2lkdGggPSB0aGlzLnBhZ2VzV3JhcC50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5oZWlnaHQgPSB0aGlzLnBhZ2VzV3JhcC50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS5mb250O1xuICAgICAgICAgICAgdGFiSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJhbmdlSW5kZXhlcyhyYW5nZTogUmFuZ2UpOiB7IHN0YXJ0SW5kZXg6IG51bWJlcjsgZW5kSW5kZXg6IG51bWJlciB9IHtcbiAgICAgICAgbGV0IHBhcnRJbmRleGVzID0gQ29udGVudEhlbHBlci5nZXRTZWxlY3RlZFBhcnREb2N1bWVudEluZGV4ZXModGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHJhbmdlKTtcbiAgICAgICAgY29uc3QgcHJldk5ld0xpbmVTeW1ib2wgPSB0aGlzLmRvY3VtZW50LmlzTmV3TGluZVN5bWJvbChwYXJ0SW5kZXhlcy5lbmRJbmRleCAtIDEpO1xuICAgICAgICBpZiAoIXByZXZOZXdMaW5lU3ltYm9sKSB7XG4gICAgICAgICAgICBpZiAocGFydEluZGV4ZXMuZW5kSW5kZXggPiBwYXJ0SW5kZXhlcy5zdGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgcGFydEluZGV4ZXMuZW5kSW5kZXgtLTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydEluZGV4ZXMuc3RhcnRJbmRleCA9PT0gcGFydEluZGV4ZXMuZW5kSW5kZXggJiYgcGFydEluZGV4ZXMuc3RhcnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LS07XG4gICAgICAgICAgICAgICAgcGFydEluZGV4ZXMuZW5kSW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJ0SW5kZXhlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUludGVybmFsRGF0YU9uSW5zZXJ0VGV4dChzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBlbmRSb3cgLSBzdGFydFJvdztcbiAgICAgICAgY29uc3QgbmV3UGFyYWdyYXBoczogUGFyYWdyYXBoW10gPSBBcnJheShsZW5ndGgpO1xuICAgICAgICBjb25zdCBuZXdXcmFwRGF0YTogbnVtYmVyW11bXSA9IEFycmF5KGxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld1dyYXBEYXRhW2ldID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyYXBEYXRhLnNwbGljZShzdGFydFJvdywgMCwgLi4ubmV3V3JhcERhdGEpO1xuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzLnNwbGljZShzdGFydFJvdywgMCwgLi4ubmV3UGFyYWdyYXBocyk7XG4gICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRSb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFJvdywgZW5kUm93KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUludGVybmFsRGF0YU9uRGVsZXRlVGV4dChzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBlbmRSb3cgLSBzdGFydFJvdztcblxuICAgICAgICB0aGlzLndyYXBEYXRhLnNwbGljZShzdGFydFJvdywgbGVuZ3RoKTtcbiAgICAgICAgdGhpcy5wYWdlc1dyYXAucmVtb3ZlKHN0YXJ0Um93LCBsZW5ndGgpO1xuICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2Uoc3RhcnRSb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFJvdywgc3RhcnRSb3cpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLnBhcmFncmFwaHNbaV0ucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2ldLm51bWJlcmluZ0RhdGEgPSBOdW1iZXJpbmdIZWxwZXIuY3JlYXRlRGF0YU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgaVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoRm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleCh0aGlzLm1vZGVsLmZvcm1hdHMsIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5pbnNlcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgTnVtYmVyaW5nSGVscGVyLnVwZGF0ZU1hcmtlckRhdGEoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaEZvcm1hdC50ZXh0U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB3cmFwIGluZGV4IGJhc2VkIG9uIG1heCByb3cgd2lkdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbXB1dGVXcmFwSW5kZXgoZGlzcGxheVRva2VuczogRGlzcGxheVRva2VuW10pOiBudW1iZXIge1xuICAgICAgICBpZiAoIWRpc3BsYXlUb2tlbnNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc3BsYXlUb2tlbnNbMF0uaXNUYWJsZSB8fCAoZGlzcGxheVRva2Vuc1swXS5icmVha3NMaW5lICYmIGRpc3BsYXlUb2tlbnMubGVuZ3RoID09PSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRlbnQgPVxuICAgICAgICAgICAgZGlzcGxheVRva2Vuc1swXS5pbmRlbnRMZWZ0ICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudFJpZ2h0ICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudEZpcnN0TGluZSAtXG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1swXS5pbmRlbnRIYW5naW5nIHx8IDA7XG4gICAgICAgIGNvbnN0IG1heFJvd1dpZHRoID0gKHRoaXMucGFnZXNXcmFwLmNvbnRlbnRXaWR0aCB8fCB0aGlzLmNvbnRlbnRXaWR0aCkgLSBpbmRlbnQ7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXlUb2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5VG9rZW5zW2ldLmlzVGFiKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1tpXS53aWR0aCA9IFRhYkhlbHBlci5jYWxjdWxhdGVUYWJXaWR0aChzdW0sIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuZGVmYXVsdFRhYldpZHRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3VtICs9IGRpc3BsYXlUb2tlbnNbaV0ud2lkdGg7XG4gICAgICAgICAgICBpZiAoKGkgPiAwICYmIChzdW0gPj0gbWF4Um93V2lkdGggfHwgZGlzcGxheVRva2Vuc1tpIC0gMV0uYnJlYWtzTGluZSkpIHx8IGRpc3BsYXlUb2tlbnNbaV0uaXNUYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGlzcGxheVRva2Vuc1tpXS5pc0xpbmVCcmVhayB8fCAoaSA9PT0gZGlzcGxheVRva2Vucy5sZW5ndGggLSAxICYmIGRpc3BsYXlUb2tlbnNbaV0uaXNQYWdlQnJlYWspKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlV3JhcFNwbGl0KHRva2VuczogRGlzcGxheVRva2VuW10sIHdyYXBMaW1pdDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdG9rZW5zLmxlbmd0aCB8fCB0b2tlbnMubGVuZ3RoIDw9IHdyYXBMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNlIG9yIHRhYiBhdCB0aGlzIHNwbGl0IHBvc2l0aW9uLCB0aGVuIG1ha2luZ1xuICAgICAgICAvLyBhIHNwbGl0IGlzIHNpbXBsZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgd3JhcExpbWl0ID09PSAwIHx8XG4gICAgICAgICAgICB0b2tlbnNbd3JhcExpbWl0XS5kaXNwbGF5VmFsdWUgPT09IERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50IHx8XG4gICAgICAgICAgICAodGhpcy5pc1doaXRlU3BhY2UodG9rZW5zW3dyYXBMaW1pdCAtIDFdKSAmJiB0aGlzLmlzV2hpdGVTcGFjZSh0b2tlbnNbd3JhcExpbWl0XSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBMaW1pdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVNwbGl0KHdyYXBMaW1pdCwgdG9rZW5zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNwbGl0cyhcbiAgICAgICAgbW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLFxuICAgICAgICBsaW5lOiBzdHJpbmcsXG4gICAgICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICAgICAgcGFyYWdyYXBoSW5kZXg6IG51bWJlcixcbiAgICAgICAgaXNOZXh0TGluZUV4aXN0czogYm9vbGVhblxuICAgICk6IHsgc3BsaXRzOiBudW1iZXJbXTsgcm93SW5mb3M6IExpbmVJbmZvTW9kZWxbXSB9IHtcbiAgICAgICAgY29uc3Qgc3RyVG9rZW5zID0gdGhpcy5nZXREaXNwbGF5VG9rZW5zKG1vZGVsLCBsaW5lLCBzdGFydEluZGV4KTtcbiAgICAgICAgaWYgKCFzdHJUb2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Um93SW5mbyA9IG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICh0aGlzLnN0eWxlc01hcC5mb250U2l6ZSAqIDQpIC8gMyxcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBhbGlnbjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBvZmZzZXRBZnRlcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VBZnRlcixcbiAgICAgICAgICAgICAgICBvZmZzZXRCZWZvcmU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQmVmb3JlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZyxcbiAgICAgICAgICAgICAgICBpc0FmdGVyUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0VuZGVkQnlQYWdlQnJlYWs6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYmFja2dyb3VuZENvbG9yXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgc3BsaXRzOiBbXSwgcm93SW5mb3M6IFtkZWZhdWx0Um93SW5mb10gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwbGl0czogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgY29uc3Qgcm93SW5mb3M6IExpbmVJbmZvTW9kZWxbXSA9IFtdO1xuXG4gICAgICAgIGxldCBwcmV2VG9rZW46IERpc3BsYXlUb2tlbjtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIGxldCBpbml0aWFsID0gbGluZTtcbiAgICAgICAgd2hpbGUgKGluZGV4KSB7XG4gICAgICAgICAgICBpbml0aWFsID0gaW5pdGlhbC5zbGljZShpbmRleCA+IDAgPyBpbmRleCA6IDApO1xuICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gc3RyVG9rZW5zLnNsaWNlKGxpbmUubGVuZ3RoIC0gaW5pdGlhbC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goLi4udGhpcy5nZXRFbXB0eUxpbmVUb2tlbnMoc3RhcnRJbmRleCArIGluZGV4KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3cmFwTGltaXQgPSB0aGlzLmNvbXB1dGVXcmFwSW5kZXgodG9rZW5zKTtcbiAgICAgICAgICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmlzUGFnZUJyZWFrICYmIHdyYXBMaW1pdCA9PT0gdG9rZW5zLmxlbmd0aCAmJiBpc05leHRMaW5lRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgd3JhcExpbWl0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdyYXBTcGxpdCA9XG4gICAgICAgICAgICAgICAgdG9rZW5zW3dyYXBMaW1pdCAtIDFdPy5icmVha3NMaW5lIHx8IHRva2Vuc1t3cmFwTGltaXQgLSAxXT8uaXNUYWJsZSA/IHdyYXBMaW1pdCA6IHRoaXMuY29tcHV0ZVdyYXBTcGxpdCh0b2tlbnMsIHdyYXBMaW1pdCk7XG4gICAgICAgICAgICBjb25zdCB3cmFwVG9rZW5zID0gdG9rZW5zLnNsaWNlKDAsIHdyYXBTcGxpdCB8fCB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgICBpZiAod3JhcFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcmV2VG9rZW4gPSB3cmFwVG9rZW5zW3dyYXBUb2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQWZ0ZXJQYWdlQnJlYWsgPSAhcm93SW5mb3MubGVuZ3RoID8gZmFsc2UgOiByb3dJbmZvc1tyb3dJbmZvcy5sZW5ndGggLSAxXS5pc0VuZGVkQnlQYWdlQnJlYWs7XG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mbyA9IHRoaXMuZ2V0TGluZUluZm9Gcm9tVG9rZW4ocHJldlRva2VuLCB3cmFwVG9rZW5zWzBdLCB3cmFwVG9rZW5zLCBpc0FmdGVyUGFnZUJyZWFrKTtcbiAgICAgICAgICAgIGxpbmVJbmZvLmJhY2tncm91bmRDb2xvciA9IG1vZGVsLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnBhcmFncmFwaFN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIHJvd0luZm9zLnB1c2gobGluZUluZm8pO1xuXG4gICAgICAgICAgICBpZiAoIXdyYXBMaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleCA9IHdyYXBTcGxpdDtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0c0xlbmd0aCA9IHNwbGl0cy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEluZGV4ID0gc3BsaXRzTGVuZ3RoID8gaW5kZXggKyBzcGxpdHNbc3BsaXRzTGVuZ3RoIC0gMV0gOiBpbmRleDtcbiAgICAgICAgICAgIHNwbGl0cy5wdXNoKHNwbGl0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWdlc1dyYXAudGFiVG9rZW5zLnB1c2goLi4uc3RyVG9rZW5zLmZpbHRlcih4ID0+IHguaXNUYWIpKTtcblxuICAgICAgICBQYXJhZ3JhcGhIZWxwZXIuYXBwbHlQYXJhZ3JhcGhJbmRlbnRzVG9MaW5lcyhyb3dJbmZvcywgcGFyYWdyYXBoSW5kZXgsIG1vZGVsLnBhcmFncmFwaHMpO1xuICAgICAgICByZXR1cm4geyBzcGxpdHMsIHJvd0luZm9zIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREb2N1bWVudCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFnZU1hcmdpbiA9IHRoaXMuZG9jdW1lbnQucGFnZU1hcmdpbjtcblxuICAgICAgICB0aGlzLnBhZ2VzV3JhcCA9IG5ldyBQYWdlc1dyYXAoXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LnBhZ2VzU3BhY2UsXG4gICAgICAgICAgICBwYWdlTWFyZ2luLFxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5wYWdlV2lkdGgsXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LnBhZ2VIZWlnaHQsXG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEVtcHR5TGluZVRva2VucyhzdGFydEluZGV4OiBudW1iZXIpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGNvbnN0IHN0b3JlZEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcbiAgICAgICAgaWYgKCFzdG9yZWRGb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVJbmZvID0gdGhpcy5nZXRMaW5lSW5mb0J5QnJlYWtNb2RpZmllcihzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZSgnRU1QVFlfTElORScsIENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKHN0b3JlZEZvcm1hdC50ZXh0U3R5bGUpKTtcbiAgICAgICAgc2l6ZS53aWR0aCA9IDM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAuLi5zaXplLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogRGlzcGxheVZhbHVlLmVtcHR5TGluZSxcbiAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgaW5kZW50Rmlyc3RMaW5lOiBsaW5lSW5mby5pbmRlbnQuZmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGxpbmVJbmZvLmluZGVudC5oYW5naW5nLFxuICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgIGluZGVudFJpZ2h0OiBsaW5lSW5mby5pbmRlbnQucmlnaHQsXG4gICAgICAgICAgICAgICAgaW5kZW50QmVmb3JlOiBsaW5lSW5mby5vZmZzZXRCZWZvcmUsXG4gICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0xpbmVCcmVhazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNUYWI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lSW5mby5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbGxlZExpbmVUb2tlbnMoc3RhcnRJbmRleDogbnVtYmVyLCBsaW5lOiBzdHJpbmcsIG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSk6IERpc3BsYXlUb2tlbltdIHtcbiAgICAgICAgY29uc3QgbGluZUluZm8gPSB0aGlzLmdldExpbmVJbmZvQnlCcmVha01vZGlmaWVyKHN0YXJ0SW5kZXggKyBsaW5lLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRva2VuczogRGlzcGxheVRva2VuW10gPSBbXTtcbiAgICAgICAgbGV0IGNoYXJhY3RlcnM6IERpc3BsYXlUb2tlbltdID0gW107XG4gICAgICAgIGxldCBmb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KG1vZGVsLmZvcm1hdHMsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBsZXQgcHJldkZvcm1hdDogRm9ybWF0TW9kZWwgPSBudWxsO1xuICAgICAgICBsZXQgcHJldkNoYXJDb2RlOiBudW1iZXIgPSBudWxsO1xuICAgICAgICBsZXQgcHJldkZvbnRTdHJpbmc6IHN0cmluZyA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Q2hhcjogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgbGV0IGZvbnRTdHJpbmcgPSBDb250ZW50U3R5bGVIZWxwZXIuZ2V0Rm9udFN0eWxlc1N0cmluZyhmb3JtYXQ/LnRleHRTdHlsZSk7XG4gICAgICAgIGxldCBzeW1ib2xDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gbGluZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBGb250TWV0cmljcy5tZWFzdXJlQ2hhclNpemUoY2hhciwgZm9udFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Db21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldE9yR2VuZXJhdGVDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRXaWR0aCxcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGNoYXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBicmVha1R5cGUgPSBCcmVha0hlbHBlci5nZXRCcmVha1R5cGUobW9kZWwsIGNoYXIsIHN0YXJ0SW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50ICYmICFicmVha1R5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmFkZFRvQ3VzdG9tQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMsIGN1c3RvbUNvbXBvbmVudCwgY2hhciwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldFRva2VuRnJvbUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGkgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IC0xO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gJyc7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmdldERpc3BsYXlWYWx1ZShjaGFyQ29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdENoYXJhY3RlciA9IGkgPT09IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEZpcnN0TGluZTogaXNGaXJzdENoYXJhY3RlciA/IGxpbmVJbmZvLmluZGVudC5maXJzdExpbmUgOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGlzRmlyc3RDaGFyYWN0ZXIgPyBsaW5lSW5mby5pbmRlbnQuaGFuZ2luZyA6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRSaWdodDogbGluZUluZm8uaW5kZW50LnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRCZWZvcmU6IGxpbmVJbmZvLm9mZnNldEJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogbGluZUluZm8ubGluZVNwYWNpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSxcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lQnJlYWs6IGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5UZXh0V3JhcHBpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzVGFiOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSAhPT0gcHJldkNoYXJDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFwcmV2Rm9ybWF0IHx8XG4gICAgICAgICAgICAgICAgICAgICFDb250ZW50U3R5bGVIZWxwZXIuYXJlU2FtZVRleHRTdHlsZXMoZm9ybWF0Py50ZXh0U3R5bGUsIHByZXZGb3JtYXQ/LnRleHRTdHlsZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IGxpbmUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID4gMSAmJiBzeW1ib2xDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2hhclNpemVzKHByZXZDaGFyLCBwcmV2Rm9udFN0cmluZywgY2hhcmFjdGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbdG9rZW5dO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbENoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzID0gW3Rva2VuXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcmV2Q2hhckNvZGUgPSBjaGFyQ29kZTtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhciA9IGNoYXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXZGb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgICBwcmV2Rm9udFN0cmluZyA9IGZvbnRTdHJpbmc7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG5cbiAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID4gZm9ybWF0Py5lbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgobW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgZm9udFN0cmluZyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKGZvcm1hdD8udGV4dFN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ2hhclNpemVzKHByZXZDaGFyOiBzdHJpbmcsIHByZXZGb250U3RyaW5nOiBzdHJpbmcsIGNoYXJhY3RlcnM6IERpc3BsYXlUb2tlbltdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld1NpemUgPSBGb250TWV0cmljcy5tZWFzdXJlQ2hhclNpemUocHJldkNoYXIsIHByZXZGb250U3RyaW5nKTtcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBjaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIG5ld1NpemUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVTcGxpdChpbmRleDogbnVtYmVyLCB0b2tlbnM6IERpc3BsYXlUb2tlbltdKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNXaGl0ZVNwYWNlKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmRpc3BsYXlWYWx1ZSA9PT0gRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNXaGl0ZVNwYWNlKHRva2VuOiBEaXNwbGF5VG9rZW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFtEaXNwbGF5VmFsdWUuc3BhY2UsIERpc3BsYXlWYWx1ZS5lbXB0eUxpbmVdLmluY2x1ZGVzKHRva2VuLmRpc3BsYXlWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMaW5lSW5mb0Zyb21Ub2tlbihcbiAgICAgICAgcHJldlRva2VuOiBEaXNwbGF5VG9rZW4sXG4gICAgICAgIGZpcnN0V3JhcFRva2VuOiBEaXNwbGF5VG9rZW4sXG4gICAgICAgIHdyYXBUb2tlbnM6IERpc3BsYXlUb2tlbltdLFxuICAgICAgICBpc0FmdGVyUGFnZUJyZWFrOiBib29sZWFuXG4gICAgKTogTGluZUluZm9Nb2RlbCB7XG4gICAgICAgIGNvbnN0IGluZm8gPSBuZXcgTGluZUluZm9Nb2RlbCh7XG4gICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgIGFsaWduOiBwcmV2VG9rZW4uYWxpZ24sXG4gICAgICAgICAgICBpbmRlbnQ6IG5ldyBJbmRlbnRNb2RlbChwcmV2VG9rZW4uaW5kZW50Rmlyc3RMaW5lLCBwcmV2VG9rZW4uaW5kZW50SGFuZ2luZywgcHJldlRva2VuLmluZGVudExlZnQsIHByZXZUb2tlbi5pbmRlbnRSaWdodCksXG4gICAgICAgICAgICBvZmZzZXRCZWZvcmU6IHByZXZUb2tlbi5pbmRlbnRCZWZvcmUsXG4gICAgICAgICAgICBvZmZzZXRBZnRlcjogcHJldlRva2VuLmluZGVudEFmdGVyLFxuICAgICAgICAgICAgbGluZVNwYWNpbmc6IHByZXZUb2tlbi5saW5lU3BhY2luZyxcbiAgICAgICAgICAgIGlzQWZ0ZXJQYWdlQnJlYWssXG4gICAgICAgICAgICBpc0VuZGVkQnlQYWdlQnJlYWs6IHByZXZUb2tlbi5pc1BhZ2VCcmVha1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZmlyc3RXcmFwVG9rZW4pIHtcbiAgICAgICAgICAgIGluZm8uYWxpZ24gPSBmaXJzdFdyYXBUb2tlbi5hbGlnbjtcbiAgICAgICAgICAgIGluZm8uaW5kZW50LmZpcnN0TGluZSA9IGZpcnN0V3JhcFRva2VuLmluZGVudEZpcnN0TGluZTtcbiAgICAgICAgICAgIGluZm8uaW5kZW50LmhhbmdpbmcgPSBmaXJzdFdyYXBUb2tlbi5pbmRlbnRIYW5naW5nO1xuICAgICAgICAgICAgaW5mby5pbmRlbnQubGVmdCA9IGZpcnN0V3JhcFRva2VuLmluZGVudExlZnQ7XG4gICAgICAgICAgICBpbmZvLmluZGVudC5yaWdodCA9IGZpcnN0V3JhcFRva2VuLmluZGVudFJpZ2h0O1xuICAgICAgICAgICAgaW5mby5vZmZzZXRCZWZvcmUgPSBmaXJzdFdyYXBUb2tlbi5pbmRlbnRCZWZvcmU7XG4gICAgICAgICAgICBpbmZvLm9mZnNldEFmdGVyID0gZmlyc3RXcmFwVG9rZW4uaW5kZW50QWZ0ZXI7XG4gICAgICAgICAgICBpbmZvLmxpbmVTcGFjaW5nID0gZmlyc3RXcmFwVG9rZW4ubGluZVNwYWNpbmc7XG4gICAgICAgICAgICBpbmZvLmhhc1RhYmxlID0gZmlyc3RXcmFwVG9rZW4uaXNUYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb250U2l6ZSA9IDA7XG4gICAgICAgIGxldCBhc2NlbnQgPSAwO1xuICAgICAgICBsZXQgZGVzY2VudCA9IDA7XG4gICAgICAgIGNvbnN0IHRva2VucyA9IGlzQWZ0ZXJQYWdlQnJlYWsgJiYgIXdyYXBUb2tlbnMubGVuZ3RoID8gW3ByZXZUb2tlbl0gOiB3cmFwVG9rZW5zO1xuICAgICAgICBmb3IgKGNvbnN0IHdyYXBUb2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmhlaWdodCA8IHdyYXBUb2tlbi5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpbmZvLmhlaWdodCA9IHdyYXBUb2tlbi5oZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb250U2l6ZSA8IHdyYXBUb2tlbi5mb250ICYmIHdyYXBUb2tlbi5kaXNwbGF5VmFsdWUgIT09IERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgZm9udFNpemUgPSB3cmFwVG9rZW4uZm9udDtcbiAgICAgICAgICAgICAgICBhc2NlbnQgPSB3cmFwVG9rZW4uYXNjZW50O1xuICAgICAgICAgICAgICAgIGRlc2NlbnQgPSB3cmFwVG9rZW4uZGVzY2VudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5mby53aWR0aCArPSB3cmFwVG9rZW4ud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpbmZvLmhlaWdodCA9IGluZm8uaGVpZ2h0IHx8IDE4O1xuICAgICAgICBpZiAoaW5mby5saW5lU3BhY2luZyA+IDEpIHtcbiAgICAgICAgICAgIGluZm8ub2Zmc2V0QWZ0ZXIgPSAoYXNjZW50ICsgZGVzY2VudCkgKiAoaW5mby5saW5lU3BhY2luZyAtIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKGFzY2VudCArIGRlc2NlbnQgPT09IGluZm8uaGVpZ2h0KSB7XG4gICAgICAgICAgICBpbmZvLmhlaWdodCA9IGluZm8uaGVpZ2h0ICogaW5mby5saW5lU3BhY2luZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGlzcGxheVZhbHVlKGNoYXJDb2RlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoY2hhckNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlzcGxheVZhbHVlLnNwYWNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChjaGFyQ29kZSA+IDM5ICYmIGNoYXJDb2RlIDwgNDgpIHx8IChjaGFyQ29kZSA+IDU3ICYmIGNoYXJDb2RlIDwgNjQpKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlzcGxheVZhbHVlLnB1bmN0dWF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIERpc3BsYXlWYWx1ZS5jaGFyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TGluZUluZm9CeUJyZWFrTW9kaWZpZXIoaW5kZXg6IG51bWJlcik6IExpbmVJbmZvTW9kZWwge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBQYXJhZ3JhcGhTdHlsZUhlbHBlci5nZXRQYXJhZ3JhcGhBdEluZGV4KHRoaXMubW9kZWwucGFyYWdyYXBocywgaW5kZXgpO1xuICAgICAgICBpZiAoIXBhcmFncmFwaCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgICAgICBhbGlnbjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBvZmZzZXRCZWZvcmU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQmVmb3JlLFxuICAgICAgICAgICAgICAgIG9mZnNldEFmdGVyOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUFmdGVyLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRlbnRMZWZ0ID0gdGhpcy5nZXRQYXJhZ3JhcGhJbmRlbnRMZWZ0KHBhcmFncmFwaCk7XG4gICAgICAgIGNvbnN0IGluZGVudEhhbmdpbmcgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgPT09IG51bGwgPyBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50SGFuZ2luZyA6IDA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgIGFsaWduOiBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuYWxpZ25tZW50ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmFsaWdubWVudCxcbiAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRGaXJzdExpbmUgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50Rmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmcgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50SGFuZ2luZyxcbiAgICAgICAgICAgICAgICBpbmRlbnRMZWZ0ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudFJpZ2h0ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgb2Zmc2V0QmVmb3JlOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUJlZm9yZSxcbiAgICAgICAgICAgIG9mZnNldEFmdGVyOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUFmdGVyLFxuICAgICAgICAgICAgbGluZVNwYWNpbmc6IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5saW5lU3BhY2luZyA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmFncmFwaEluZGVudExlZnQocGFyYWdyYXBoOiBQYXJhZ3JhcGhNb2RlbCk6IG51bWJlciB7XG4gICAgICAgIGxldCBwYXJhZ3JhcGhJbmRlbnQgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50TGVmdDtcbiAgICAgICAgY29uc3QgbnVtYmVyaW5nSWQgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQ7XG4gICAgICAgIGlmIChudW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbGV2ZWwgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nTGV2ZWw7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhJbmRleCA9IHRoaXMubW9kZWwucGFyYWdyYXBocy5pbmRleE9mKHBhcmFncmFwaCk7XG4gICAgICAgICAgICBjb25zdCBsZXZlbE1vZGVsID0gTnVtYmVyaW5nSGVscGVyLmZpbmQodGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLCBudW1iZXJpbmdJZCwgbGV2ZWwpO1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoRm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleCh0aGlzLm1vZGVsLmZvcm1hdHMsIHBhcmFncmFwaC5pbnNlcnRJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBtYXJrZXJUZXh0U3R5bGUgPSBDb250ZW50U3R5bGVIZWxwZXIuY29tYmluZVRleHRTdHlsZXMobGV2ZWxNb2RlbC5tYXJrZXJTdHlsZSwgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSk7XG4gICAgICAgICAgICBsZXQgbWFya2VyV2lkdGggPSB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW3BhcmFncmFwaEluZGV4XT8ubnVtYmVyaW5nRGF0YT8ud2lkdGg7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdPy5udW1iZXJpbmdEYXRhLm1hcmtlclRleHRTdHlsZSB8fFxuICAgICAgICAgICAgICAgICFDb250ZW50U3R5bGVIZWxwZXIuYXJlU2FtZVRleHRTdHlsZXMoXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlclRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ubnVtYmVyaW5nRGF0YS5tYXJrZXJUZXh0U3R5bGVcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ubnVtYmVyaW5nRGF0YS5udW1iZXJpbmdJZCAhPT0gbnVtYmVyaW5nSWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IE51bWJlcmluZ0hlbHBlci5nZXRNYXJrZXIobGV2ZWxNb2RlbCwgbnVtYmVyaW5nSWQsIHRoaXMubW9kZWwucGFyYWdyYXBocywgcGFyYWdyYXBoSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlclNpemVzID0gTnVtYmVyaW5nSGVscGVyLmdldE1hcmtlclNpemVzKG1hcmtlciwgbWFya2VyVGV4dFN0eWxlKTtcbiAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aCA9IG1hcmtlclNpemVzLndpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBoYW5naW5nSW5kZW50ID0gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudEhhbmdpbmdcbiAgICAgICAgICAgICAgICA/IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRIYW5naW5nXG4gICAgICAgICAgICAgICAgOiBsZXZlbE1vZGVsLmluZGVudEhhbmdpbmc7XG4gICAgICAgICAgICBwYXJhZ3JhcGhJbmRlbnQgPSBsZXZlbE1vZGVsLmluZGVudExlZnQ7XG4gICAgICAgICAgICBpZiAobWFya2VyV2lkdGggPj0gaGFuZ2luZ0luZGVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlck92ZXJmbG93ID0gbWFya2VyV2lkdGggLSBoYW5naW5nSW5kZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxNYXJrZXJJbmRlbnQgPSBUYWJIZWxwZXIuY2FsY3VsYXRlVGFiV2lkdGgoXG4gICAgICAgICAgICAgICAgICAgIGxldmVsTW9kZWwuaW5kZW50TGVmdCArIG1hcmtlck92ZXJmbG93LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLmRlZmF1bHRUYWJXaWR0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoSW5kZW50ICs9IG1hcmtlck92ZXJmbG93ICsgYWRkaXRpb25hbE1hcmtlckluZGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJhZ3JhcGhJbmRlbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUZXh0U3R5bGVzKHN0eWxlczogeyBba2V5OiBzdHJpbmddOiBhbnlbXSB9LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiBGb3JtYXRNb2RlbCB7XG4gICAgICAgIGxldCB0ZXh0U3R5bGVzID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0c0F0UmFuZ2UodGhpcy5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4LCBlbmRJbmRleCkubWFwKGZvcm1hdCA9PiBmb3JtYXQudGV4dFN0eWxlKTtcbiAgICAgICAgbGV0IHByZXZGb3JtYXQ6IEZvcm1hdE1vZGVsO1xuICAgICAgICBpZiAoIXRleHRTdHlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmV2Rm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0UHJldkZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcblxuICAgICAgICAgICAgaWYgKHByZXZGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0U3R5bGVzID0gW3ByZXZGb3JtYXQudGV4dFN0eWxlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdGV4dFN0eWxlIG9mIHRleHRTdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRleHRTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzW2tleV0ucHVzaCh0ZXh0U3R5bGVba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXZGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQYXJhZ3JhcGhTdHlsZXMoc3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IGFueVtdIH0sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhTdHlsZXMgPSBQYXJhZ3JhcGhTdHlsZUhlbHBlci5nZXRQYXJhZ3JhcGhzQXRSYW5nZSh0aGlzLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoXG4gICAgICAgICAgICBwYXJhZ3JhcGggPT4gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYWdyYXBoU3R5bGUgb2YgcGFyYWdyYXBoU3R5bGVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJhZ3JhcGhTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzW2tleV0ucHVzaChwYXJhZ3JhcGhTdHlsZVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU51bWJlcmluZ1N0eWxlcyhzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55W10gfSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFN0eWxlcyA9IFBhcmFncmFwaFN0eWxlSGVscGVyLmdldFBhcmFncmFwaHNBdFJhbmdlKHRoaXMubW9kZWwucGFyYWdyYXBocywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcChcbiAgICAgICAgICAgIHBhcmFncmFwaCA9PiBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGVcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhZ3JhcGhTdHlsZSBvZiBwYXJhZ3JhcGhTdHlsZXMpIHtcbiAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlcmluZ0xldmVscyA9IHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncy5maW5kKHggPT4geC5udW1iZXJpbmdJZCA9PT0gcGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQpLmxldmVscztcbiAgICAgICAgICAgICAgICBjb25zdCBsZXZlbHNNYXJrZXJTdHlsZXMgPSBudW1iZXJpbmdMZXZlbHMucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBgJHtwcmV2fSR7bmV4dC5tYXJrZXJ9JHtuZXh0Lm1hcmtlclR5cGV9YCwgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldmVsID0gbnVtYmVyaW5nTGV2ZWxzLmZpbmQoeCA9PiB4LmxldmVsID09PSBwYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdMZXZlbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNCdWxsZXRNYXJrZXIgPSBsZXZlbC5tYXJrZXJUeXBlID09PSBOdW1iZXJpbmdNYXJrZXJUeXBlLkJ1bGxldDtcbiAgICAgICAgICAgICAgICBzdHlsZXNbJ2lzQnVsbGV0TWFya2VyJ10ucHVzaChpc0J1bGxldE1hcmtlcik7XG4gICAgICAgICAgICAgICAgc3R5bGVzWydudW1iZXJpbmdMZXZlbHNTdHlsZXMnXS5wdXNoKGxldmVsc01hcmtlclN0eWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlc1snaXNCdWxsZXRNYXJrZXInXS5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIHN0eWxlc1snbnVtYmVyaW5nTGV2ZWxzU3R5bGVzJ10ucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEltYWdlV2l0aEFsbG93ZWRTaXplKGltYWdlRGF0YTogSW1hZ2VEYXRhTW9kZWwsIG1heFdpZHRoOiBudW1iZXIpOiBJbWFnZURhdGFNb2RlbCB7XG4gICAgICAgIGlmIChpbWFnZURhdGEud2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbWFnZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGltYWdlRGF0YS53aWR0aCAvIGltYWdlRGF0YS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG1heFdpZHRoIC8gYXNwZWN0UmF0aW87XG4gICAgICAgIHJldHVybiBuZXcgSW1hZ2VEYXRhTW9kZWwoeyB3aWR0aDogTWF0aC5yb3VuZChtYXhXaWR0aCksIGhlaWdodDogTWF0aC5yb3VuZChoZWlnaHQpLCBjb250ZW50OiBpbWFnZURhdGEuY29udGVudCB9KTtcbiAgICB9XG59XG4iXX0=
|