@worktile/theia 15.3.3 → 16.0.0

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