@worktile/theia 18.0.15 → 18.1.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 (370) hide show
  1. package/constants/node-types.d.ts +1 -0
  2. package/core/toolbar-item/base-toolbar-item.d.ts +2 -2
  3. package/fesm2022/worktile-theia.mjs +304 -311
  4. package/fesm2022/worktile-theia.mjs.map +1 -1
  5. package/interfaces/view-base.d.ts +1 -1
  6. package/package.json +2 -4
  7. package/plugins/code/code.component.scss +1 -2
  8. package/plugins/image/image.component.d.ts +1 -1
  9. package/plugins/link/link.component.d.ts +1 -1
  10. package/plugins/mention/suggestion.component.d.ts +1 -1
  11. package/plugins/vertical-align/toolbar-item.component.d.ts +3 -2
  12. package/esm2022/components/action/prevent-default.mjs +0 -21
  13. package/esm2022/components/column-resize/column-resize-notifier.mjs +0 -31
  14. package/esm2022/components/column-resize/column-resize.directive.mjs +0 -124
  15. package/esm2022/components/column-resize/event-dispatcher.mjs +0 -56
  16. package/esm2022/components/column-resize/overlay-handle.component.mjs +0 -144
  17. package/esm2022/components/column-resize/resize-ref.mjs +0 -26
  18. package/esm2022/components/column-resize/resizing.store.mjs +0 -92
  19. package/esm2022/components/column-resize/selectors.mjs +0 -4
  20. package/esm2022/components/contextmenu/contextmenu.component.mjs +0 -99
  21. package/esm2022/components/conversion-hint/conversion-hint.component.mjs +0 -56
  22. package/esm2022/components/element/element.component.mjs +0 -23
  23. package/esm2022/components/index.mjs +0 -24
  24. package/esm2022/components/inline-toolbar/inline-toolbar.component.mjs +0 -131
  25. package/esm2022/components/listbox/listbox.mjs +0 -380
  26. package/esm2022/components/listbox/listbox.type.mjs +0 -5
  27. package/esm2022/components/plugin-menu/plugin-menu.component.mjs +0 -272
  28. package/esm2022/components/table-select/table-select.component.mjs +0 -49
  29. package/esm2022/components/template/template.component.mjs +0 -62
  30. package/esm2022/components/text/text.component.mjs +0 -57
  31. package/esm2022/components/toolbar/toolbar.component.mjs +0 -262
  32. package/esm2022/components/toolbar-dropdown/toolbar-dropdown.component.mjs +0 -137
  33. package/esm2022/components/toolbar-group/toolbar-group.component.mjs +0 -125
  34. package/esm2022/components/toolbar-item/toolbar-item.component.mjs +0 -80
  35. package/esm2022/constants/auto-format-rules.mjs +0 -167
  36. package/esm2022/constants/code.mjs +0 -85
  37. package/esm2022/constants/color-select.mjs +0 -3
  38. package/esm2022/constants/default.mjs +0 -11
  39. package/esm2022/constants/error.mjs +0 -7
  40. package/esm2022/constants/index.mjs +0 -9
  41. package/esm2022/constants/node-types.mjs +0 -136
  42. package/esm2022/constants/plugin-menu.mjs +0 -311
  43. package/esm2022/constants/selector.mjs +0 -3
  44. package/esm2022/constants/toolbar.mjs +0 -53
  45. package/esm2022/core/create-plugin.mjs +0 -5
  46. package/esm2022/core/create-toolbar.mjs +0 -55
  47. package/esm2022/core/index.mjs +0 -6
  48. package/esm2022/core/toolbar-item/base-toolbar-item.mjs +0 -95
  49. package/esm2022/core/utils/combine-plugins.mjs +0 -10
  50. package/esm2022/core/utils/flatten-deep-plugins.mjs +0 -19
  51. package/esm2022/core/utils/get-plugin-options.mjs +0 -3
  52. package/esm2022/core/utils/get-plugin.mjs +0 -2
  53. package/esm2022/core/utils/get-plugins.mjs +0 -4
  54. package/esm2022/core/utils/index.mjs +0 -12
  55. package/esm2022/core/utils/merge-array.mjs +0 -18
  56. package/esm2022/core/utils/merge-deep-plugins.mjs +0 -14
  57. package/esm2022/core/utils/merge-options.mjs +0 -25
  58. package/esm2022/core/utils/nested-structure-by-key.mjs +0 -11
  59. package/esm2022/core/utils/plugin-menu.mjs +0 -63
  60. package/esm2022/core/utils/plugins-by-key.mjs +0 -10
  61. package/esm2022/core/with-theia.mjs +0 -25
  62. package/esm2022/custom-types.mjs +0 -2
  63. package/esm2022/editor.component.mjs +0 -488
  64. package/esm2022/editor.module.mjs +0 -18
  65. package/esm2022/i18n/i18n.mjs +0 -10
  66. package/esm2022/i18n/i18n.service.mjs +0 -46
  67. package/esm2022/i18n/i18n.token.mjs +0 -9
  68. package/esm2022/i18n/index.mjs +0 -10
  69. package/esm2022/i18n/locales/de-de.mjs +0 -102
  70. package/esm2022/i18n/locales/en-us.mjs +0 -102
  71. package/esm2022/i18n/locales/ja-jp.mjs +0 -102
  72. package/esm2022/i18n/locales/ru-ru.mjs +0 -102
  73. package/esm2022/i18n/locales/zh-hans.mjs +0 -102
  74. package/esm2022/i18n/locales/zh-hant.mjs +0 -102
  75. package/esm2022/interfaces/auto-format.mjs +0 -2
  76. package/esm2022/interfaces/editor.mjs +0 -26
  77. package/esm2022/interfaces/element.mjs +0 -2
  78. package/esm2022/interfaces/image.mjs +0 -3
  79. package/esm2022/interfaces/index.mjs +0 -11
  80. package/esm2022/interfaces/plugins/index.mjs +0 -6
  81. package/esm2022/interfaces/plugins/no-infer.mjs +0 -2
  82. package/esm2022/interfaces/plugins/plugin-key.mjs +0 -42
  83. package/esm2022/interfaces/plugins/plugin-menu.mjs +0 -19
  84. package/esm2022/interfaces/plugins/plugins.mjs +0 -2
  85. package/esm2022/interfaces/plugins/with-override.mjs +0 -2
  86. package/esm2022/interfaces/preset.mjs +0 -3
  87. package/esm2022/interfaces/reset-block-type-plugin-options.mjs +0 -2
  88. package/esm2022/interfaces/toolbar.mjs +0 -12
  89. package/esm2022/interfaces/upload.mjs +0 -2
  90. package/esm2022/interfaces/utility/index.mjs +0 -4
  91. package/esm2022/interfaces/utility/nested-structure-by-key.mjs +0 -2
  92. package/esm2022/interfaces/utility/override-by-key.mjs +0 -2
  93. package/esm2022/interfaces/utility/types.mjs +0 -2
  94. package/esm2022/interfaces/valid-children-types.mjs +0 -36
  95. package/esm2022/interfaces/view-base.mjs +0 -38
  96. package/esm2022/pipes.mjs +0 -61
  97. package/esm2022/plugins/align/align.editor.mjs +0 -41
  98. package/esm2022/plugins/align/align.plugin.mjs +0 -64
  99. package/esm2022/plugins/autoformat/autoformat.plugin.mjs +0 -109
  100. package/esm2022/plugins/autoformat/transforms/auto-format-block.mjs +0 -14
  101. package/esm2022/plugins/autoformat/transforms/auto-format-inline.mjs +0 -78
  102. package/esm2022/plugins/blockquote/blockquote.component.mjs +0 -16
  103. package/esm2022/plugins/blockquote/blockquote.editor.mjs +0 -20
  104. package/esm2022/plugins/blockquote/blockquote.plugin.mjs +0 -84
  105. package/esm2022/plugins/code/code.component.mjs +0 -255
  106. package/esm2022/plugins/code/code.editor.mjs +0 -59
  107. package/esm2022/plugins/code/code.plugin.mjs +0 -67
  108. package/esm2022/plugins/color/color.editor.mjs +0 -27
  109. package/esm2022/plugins/color/color.plugin.mjs +0 -32
  110. package/esm2022/plugins/color/toolbar-item.component.mjs +0 -99
  111. package/esm2022/plugins/common/block-card.plugin.mjs +0 -330
  112. package/esm2022/plugins/common/common.plugin.mjs +0 -49
  113. package/esm2022/plugins/common/get-fragment.plugin.mjs +0 -24
  114. package/esm2022/plugins/common/history.plugin.mjs +0 -31
  115. package/esm2022/plugins/common/insert-data-by-invalid-type.mjs +0 -23
  116. package/esm2022/plugins/common/move-selection.plugin.mjs +0 -105
  117. package/esm2022/plugins/common/remove-empty.plugin.mjs +0 -61
  118. package/esm2022/plugins/common/remove-void.plugin.mjs +0 -60
  119. package/esm2022/plugins/common/reset-type.plugin.mjs +0 -35
  120. package/esm2022/plugins/deserialize/deserialize-html.plugin.mjs +0 -61
  121. package/esm2022/plugins/deserialize/deserialize-md.plugin.mjs +0 -142
  122. package/esm2022/plugins/font-size/font-size.editor.mjs +0 -98
  123. package/esm2022/plugins/heading/heading.editor.mjs +0 -54
  124. package/esm2022/plugins/heading/heading.plugin.mjs +0 -136
  125. package/esm2022/plugins/hr/hr.component.mjs +0 -37
  126. package/esm2022/plugins/hr/hr.editor.mjs +0 -16
  127. package/esm2022/plugins/hr/hr.plugin.mjs +0 -56
  128. package/esm2022/plugins/image/image.component.mjs +0 -474
  129. package/esm2022/plugins/image/image.editor.mjs +0 -116
  130. package/esm2022/plugins/image/image.plugin.mjs +0 -90
  131. package/esm2022/plugins/indent/indent.editor.mjs +0 -78
  132. package/esm2022/plugins/indent/indent.plugin.mjs +0 -59
  133. package/esm2022/plugins/indent/on-keydown-indent.mjs +0 -59
  134. package/esm2022/plugins/index.mjs +0 -73
  135. package/esm2022/plugins/inline-code/inline-code.component.mjs +0 -28
  136. package/esm2022/plugins/inline-code/inline-code.editor.mjs +0 -49
  137. package/esm2022/plugins/inline-code/inline-code.plugin.mjs +0 -67
  138. package/esm2022/plugins/link/edit/link-edit.component.mjs +0 -104
  139. package/esm2022/plugins/link/hover/link-hover.component.mjs +0 -38
  140. package/esm2022/plugins/link/link.component.mjs +0 -170
  141. package/esm2022/plugins/link/link.editor.mjs +0 -87
  142. package/esm2022/plugins/link/link.plugin.mjs +0 -89
  143. package/esm2022/plugins/link/link.types.mjs +0 -12
  144. package/esm2022/plugins/list/components/bulleted-list.component.mjs +0 -28
  145. package/esm2022/plugins/list/components/list-item.component.mjs +0 -88
  146. package/esm2022/plugins/list/components/numbered-list.component.mjs +0 -37
  147. package/esm2022/plugins/list/list.editor.mjs +0 -128
  148. package/esm2022/plugins/list/list.plugin.mjs +0 -302
  149. package/esm2022/plugins/list/normalizers/get-list-normalizer.mjs +0 -39
  150. package/esm2022/plugins/list/normalizers/normalize-list-item.mjs +0 -18
  151. package/esm2022/plugins/list/normalizers/normalize-no.mjs +0 -43
  152. package/esm2022/plugins/list/on-key-down-list.mjs +0 -33
  153. package/esm2022/plugins/list/queries/get-list-item-entry.mjs +0 -28
  154. package/esm2022/plugins/list/queries/get-list-item-sublist.mjs +0 -12
  155. package/esm2022/plugins/list/queries/get-list-types.mjs +0 -5
  156. package/esm2022/plugins/list/queries/get-start-list-item.mjs +0 -27
  157. package/esm2022/plugins/list/queries/has-list-in-list-item.mjs +0 -27
  158. package/esm2022/plugins/list/queries/is-in-list.mjs +0 -6
  159. package/esm2022/plugins/list/queries/is-list-nested.mjs +0 -10
  160. package/esm2022/plugins/list/queries/is-list.mjs +0 -5
  161. package/esm2022/plugins/list/queries/is-node-type-list.mjs +0 -5
  162. package/esm2022/plugins/list/queries/is-selection-at-list-item-start.mjs +0 -13
  163. package/esm2022/plugins/list/queries/is-selection-in-same-list-item.mjs +0 -17
  164. package/esm2022/plugins/list/queries/is-single-list-item.mjs +0 -9
  165. package/esm2022/plugins/list/transforms/insert-list-data.mjs +0 -72
  166. package/esm2022/plugins/list/transforms/insert-list-item.mjs +0 -73
  167. package/esm2022/plugins/list/transforms/move-list-item-down.mjs +0 -41
  168. package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +0 -43
  169. package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +0 -30
  170. package/esm2022/plugins/list/transforms/move-list-item-up.mjs +0 -78
  171. package/esm2022/plugins/list/transforms/unwrap-list.mjs +0 -10
  172. package/esm2022/plugins/list/types.mjs +0 -2
  173. package/esm2022/plugins/mark/mark.editor.mjs +0 -28
  174. package/esm2022/plugins/mark/mark.plugin.mjs +0 -105
  175. package/esm2022/plugins/mention/index.mjs +0 -5
  176. package/esm2022/plugins/mention/mention.editor.mjs +0 -179
  177. package/esm2022/plugins/mention/mention.plugin.mjs +0 -92
  178. package/esm2022/plugins/mention/mention.type.mjs +0 -2
  179. package/esm2022/plugins/mention/suggestion.component.mjs +0 -22
  180. package/esm2022/plugins/node-id/node-id.plugin.mjs +0 -78
  181. package/esm2022/plugins/normalizers/insert-paragraph-nodes.mjs +0 -28
  182. package/esm2022/plugins/normalizers/remove-empty-nodes.mjs +0 -18
  183. package/esm2022/plugins/normalizers/trailing-node.plugin.mjs +0 -33
  184. package/esm2022/plugins/paint-format/paint-format.editor.mjs +0 -126
  185. package/esm2022/plugins/public-api.mjs +0 -20
  186. package/esm2022/plugins/quick-insert/components/quick-insert.component.mjs +0 -126
  187. package/esm2022/plugins/quick-insert/index.mjs +0 -4
  188. package/esm2022/plugins/quick-insert/quick-insert.editor.mjs +0 -70
  189. package/esm2022/plugins/quick-insert/quick-insert.plugin.mjs +0 -109
  190. package/esm2022/plugins/soft-break/soft-break.plugin.mjs +0 -36
  191. package/esm2022/plugins/soft-break/soft-break.types.mjs +0 -2
  192. package/esm2022/plugins/table/components/insert-mark/insert-mark.component.mjs +0 -132
  193. package/esm2022/plugins/table/components/row/row.component.mjs +0 -93
  194. package/esm2022/plugins/table/components/table.component.mjs +0 -887
  195. package/esm2022/plugins/table/components/td/td.component.mjs +0 -610
  196. package/esm2022/plugins/table/components/toolbar/table-options.component.mjs +0 -102
  197. package/esm2022/plugins/table/components/toolbar/table-toolbar.component.mjs +0 -179
  198. package/esm2022/plugins/table/table.editor.mjs +0 -301
  199. package/esm2022/plugins/table/table.pipe.mjs +0 -66
  200. package/esm2022/plugins/table/table.plugin.mjs +0 -556
  201. package/esm2022/plugins/table/table.service.mjs +0 -122
  202. package/esm2022/plugins/table/table.store.mjs +0 -417
  203. package/esm2022/plugins/table/table.types.mjs +0 -68
  204. package/esm2022/plugins/table/toolbar-item.component.mjs +0 -95
  205. package/esm2022/plugins/table/transforms/clear-cell.mjs +0 -14
  206. package/esm2022/plugins/table/transforms/clear-table-node.mjs +0 -27
  207. package/esm2022/plugins/table/transforms/index.mjs +0 -8
  208. package/esm2022/plugins/table/transforms/insert-column.mjs +0 -69
  209. package/esm2022/plugins/table/transforms/insert-row.mjs +0 -50
  210. package/esm2022/plugins/table/transforms/insert-table.mjs +0 -15
  211. package/esm2022/plugins/table/transforms/move-selection-from-cell.mjs +0 -91
  212. package/esm2022/plugins/table/transforms/remove-column.mjs +0 -51
  213. package/esm2022/plugins/table/transforms/remove-row.mjs +0 -48
  214. package/esm2022/plugins/table/transforms/remove-table.mjs +0 -49
  215. package/esm2022/plugins/table/utils/add-columns.mjs +0 -38
  216. package/esm2022/plugins/table/utils/calc-anchor-position.mjs +0 -26
  217. package/esm2022/plugins/table/utils/calc-span.mjs +0 -73
  218. package/esm2022/plugins/table/utils/calculate-table.mjs +0 -116
  219. package/esm2022/plugins/table/utils/cell-position.mjs +0 -57
  220. package/esm2022/plugins/table/utils/create-cell.mjs +0 -19
  221. package/esm2022/plugins/table/utils/create-row.mjs +0 -12
  222. package/esm2022/plugins/table/utils/create-table-position.mjs +0 -10
  223. package/esm2022/plugins/table/utils/create-table.mjs +0 -15
  224. package/esm2022/plugins/table/utils/get-grid-columns.mjs +0 -79
  225. package/esm2022/plugins/table/utils/get-min-max-cell-index.mjs +0 -69
  226. package/esm2022/plugins/table/utils/get-next-cell.mjs +0 -44
  227. package/esm2022/plugins/table/utils/get-select-cell-node.mjs +0 -16
  228. package/esm2022/plugins/table/utils/handle-cell.mjs +0 -25
  229. package/esm2022/plugins/table/utils/index.mjs +0 -16
  230. package/esm2022/plugins/table/utils/is-header-row.mjs +0 -15
  231. package/esm2022/plugins/table/utils/is-legal-table.mjs +0 -26
  232. package/esm2022/plugins/table/utils/is-range-in-table.mjs +0 -16
  233. package/esm2022/plugins/table/utils/is-selection-in-table.mjs +0 -51
  234. package/esm2022/plugins/table/utils/is-virtual-key.mjs +0 -13
  235. package/esm2022/plugins/table/utils/merge-cell.mjs +0 -110
  236. package/esm2022/plugins/table/utils/next-path.mjs +0 -5
  237. package/esm2022/plugins/table/utils/normalize-table.mjs +0 -31
  238. package/esm2022/plugins/table/utils/remove-columns.mjs +0 -23
  239. package/esm2022/plugins/table/utils/remove-row-column.mjs +0 -45
  240. package/esm2022/plugins/table/utils/set-menu-cell-invisibility.mjs +0 -45
  241. package/esm2022/plugins/table/utils/split-cell.mjs +0 -29
  242. package/esm2022/plugins/table/utils/table-entry.mjs +0 -21
  243. package/esm2022/plugins/table/utils/table-position.mjs +0 -251
  244. package/esm2022/plugins/table/utils/table-viewport.mjs +0 -41
  245. package/esm2022/plugins/todo-item/todo-item.component.mjs +0 -65
  246. package/esm2022/plugins/todo-item/todo-item.editor.mjs +0 -32
  247. package/esm2022/plugins/todo-item/todo-item.plugin.mjs +0 -93
  248. package/esm2022/plugins/vertical-align/toolbar-item.component.mjs +0 -89
  249. package/esm2022/plugins/vertical-align/vertical-align.editor.mjs +0 -59
  250. package/esm2022/public-api.mjs +0 -22
  251. package/esm2022/queries/anchor-block-entry.mjs +0 -13
  252. package/esm2022/queries/anchor-block.mjs +0 -6
  253. package/esm2022/queries/anchor-inline-entry.mjs +0 -10
  254. package/esm2022/queries/find-descendant.mjs +0 -47
  255. package/esm2022/queries/find-node.mjs +0 -45
  256. package/esm2022/queries/find-path.mjs +0 -28
  257. package/esm2022/queries/get-above-by-type.mjs +0 -14
  258. package/esm2022/queries/get-above.mjs +0 -9
  259. package/esm2022/queries/get-anchor-block-entry.mjs +0 -8
  260. package/esm2022/queries/get-block-above.mjs +0 -10
  261. package/esm2022/queries/get-block-card-above.mjs +0 -10
  262. package/esm2022/queries/get-block-card-cursor.mjs +0 -9
  263. package/esm2022/queries/get-container-blocks.mjs +0 -12
  264. package/esm2022/queries/get-directly-parent.mjs +0 -12
  265. package/esm2022/queries/get-insert-elements-path.mjs +0 -46
  266. package/esm2022/queries/get-last-child-path.mjs +0 -9
  267. package/esm2022/queries/get-last-node.mjs +0 -17
  268. package/esm2022/queries/get-next-sibling-nodes.mjs +0 -17
  269. package/esm2022/queries/get-node.mjs +0 -10
  270. package/esm2022/queries/get-nodes-by-type.mjs +0 -15
  271. package/esm2022/queries/get-nodes.mjs +0 -7
  272. package/esm2022/queries/get-parent.mjs +0 -12
  273. package/esm2022/queries/get-plain-text.mjs +0 -16
  274. package/esm2022/queries/get-plugin-by-toolbar.mjs +0 -13
  275. package/esm2022/queries/get-point-before.mjs +0 -62
  276. package/esm2022/queries/get-point-from-location.mjs +0 -15
  277. package/esm2022/queries/get-previous-path.mjs +0 -9
  278. package/esm2022/queries/get-rang-from-block-start.mjs +0 -16
  279. package/esm2022/queries/get-range-before.mjs +0 -17
  280. package/esm2022/queries/get-selection-marks.mjs +0 -18
  281. package/esm2022/queries/get-selection-nodes-by-type.mjs +0 -30
  282. package/esm2022/queries/get-text.mjs +0 -9
  283. package/esm2022/queries/get-toolbar-disabled.mjs +0 -13
  284. package/esm2022/queries/index.mjs +0 -62
  285. package/esm2022/queries/is-across-blocks.mjs +0 -7
  286. package/esm2022/queries/is-ancestor-empty.mjs +0 -6
  287. package/esm2022/queries/is-ancestor.mjs +0 -3
  288. package/esm2022/queries/is-block-above-empty.mjs +0 -11
  289. package/esm2022/queries/is-block-active.mjs +0 -8
  290. package/esm2022/queries/is-block-card-cursor.mjs +0 -16
  291. package/esm2022/queries/is-block-text-empty-after-selection.mjs +0 -31
  292. package/esm2022/queries/is-collapsed.mjs +0 -7
  293. package/esm2022/queries/is-contain-nested-type.mjs +0 -29
  294. package/esm2022/queries/is-container-type.mjs +0 -3
  295. package/esm2022/queries/is-descendant.mjs +0 -3
  296. package/esm2022/queries/is-empty-content-filter.mjs +0 -22
  297. package/esm2022/queries/is-empty-content.mjs +0 -15
  298. package/esm2022/queries/is-empty-paragraph-by-path.mjs +0 -7
  299. package/esm2022/queries/is-empty-paragraph.mjs +0 -28
  300. package/esm2022/queries/is-first-child.mjs +0 -5
  301. package/esm2022/queries/is-global-collapsed.mjs +0 -5
  302. package/esm2022/queries/is-include-types.mjs +0 -12
  303. package/esm2022/queries/is-node-type-in.mjs +0 -9
  304. package/esm2022/queries/is-node-type.mjs +0 -15
  305. package/esm2022/queries/is-paragraph.mjs +0 -9
  306. package/esm2022/queries/is-point-at-root.mjs +0 -2
  307. package/esm2022/queries/is-range-across-blocks.mjs +0 -22
  308. package/esm2022/queries/is-range-at-root.mjs +0 -3
  309. package/esm2022/queries/is-root-path.mjs +0 -2
  310. package/esm2022/queries/is-start.mjs +0 -6
  311. package/esm2022/queries/some-node.mjs +0 -9
  312. package/esm2022/services/context.service.mjs +0 -140
  313. package/esm2022/services/table-contextmenu.service.mjs +0 -288
  314. package/esm2022/services/toolbar.service.mjs +0 -47
  315. package/esm2022/shortcuts/index.mjs +0 -5
  316. package/esm2022/shortcuts/mark.mjs +0 -25
  317. package/esm2022/test/basic/basic.component.mjs +0 -61
  318. package/esm2022/test/faker/data-transfer-faker.mjs +0 -13
  319. package/esm2022/test/faker/tethys-icon-faker.mjs +0 -22
  320. package/esm2022/test/index.mjs +0 -7
  321. package/esm2022/test/utils/mock-plugins.mjs +0 -104
  322. package/esm2022/test/utils/preset-config.mjs +0 -17
  323. package/esm2022/test/utils/with-plugin.mjs +0 -11
  324. package/esm2022/transforms/apply-deep-to-nodes.mjs +0 -22
  325. package/esm2022/transforms/clear-marks.mjs +0 -23
  326. package/esm2022/transforms/delete-element.mjs +0 -12
  327. package/esm2022/transforms/delete-node-by-type.mjs +0 -10
  328. package/esm2022/transforms/handle-continual-delete-backward.mjs +0 -18
  329. package/esm2022/transforms/handle-continual-insert-break.mjs +0 -20
  330. package/esm2022/transforms/index.mjs +0 -19
  331. package/esm2022/transforms/insert-elements.mjs +0 -55
  332. package/esm2022/transforms/insert-paragraph.mjs +0 -6
  333. package/esm2022/transforms/merge-deep-to-nodes.mjs +0 -9
  334. package/esm2022/transforms/move-children.mjs +0 -22
  335. package/esm2022/transforms/on-keydown-reset-block-type.mjs +0 -23
  336. package/esm2022/transforms/set-end-selection.mjs +0 -10
  337. package/esm2022/transforms/set-marks.mjs +0 -9
  338. package/esm2022/transforms/set-node-by-type.mjs +0 -10
  339. package/esm2022/transforms/set-node.mjs +0 -6
  340. package/esm2022/transforms/un-hang-range.mjs +0 -11
  341. package/esm2022/transforms/un-wrap.mjs +0 -12
  342. package/esm2022/transforms/unwrap-nodes-by-type.mjs +0 -14
  343. package/esm2022/utils/auto-focus.mjs +0 -24
  344. package/esm2022/utils/blob.mjs +0 -16
  345. package/esm2022/utils/cast-array.mjs +0 -7
  346. package/esm2022/utils/color-picker.mjs +0 -15
  347. package/esm2022/utils/common.mjs +0 -11
  348. package/esm2022/utils/copy-node.mjs +0 -38
  349. package/esm2022/utils/create-empty-paragraph.mjs +0 -14
  350. package/esm2022/utils/data-transform.mjs +0 -48
  351. package/esm2022/utils/dom.mjs +0 -56
  352. package/esm2022/utils/editor-uuid.mjs +0 -8
  353. package/esm2022/utils/fragment.mjs +0 -82
  354. package/esm2022/utils/get-editable-element-height.mjs +0 -6
  355. package/esm2022/utils/get-mode.mjs +0 -14
  356. package/esm2022/utils/get-toolbar-class.mjs +0 -6
  357. package/esm2022/utils/id-creator.mjs +0 -11
  358. package/esm2022/utils/index.mjs +0 -23
  359. package/esm2022/utils/insert-data-by-invalid-type.mjs +0 -70
  360. package/esm2022/utils/is-clean-empty-paragraph.mjs +0 -37
  361. package/esm2022/utils/is-inline.mjs +0 -9
  362. package/esm2022/utils/lodash.mjs +0 -3
  363. package/esm2022/utils/match.mjs +0 -32
  364. package/esm2022/utils/merge-element-options.mjs +0 -19
  365. package/esm2022/utils/normalize.mjs +0 -61
  366. package/esm2022/utils/refocus.mjs +0 -47
  367. package/esm2022/utils/scrolling.mjs +0 -43
  368. package/esm2022/utils/update-popover-position.mjs +0 -26
  369. package/esm2022/utils/weak-maps.mjs +0 -9
  370. package/esm2022/worktile-theia.mjs +0 -5
@@ -1,887 +0,0 @@
1
- import { NgClass, NgFor, NgIf, NgStyle } from '@angular/common';
2
- import { Component, ElementRef, Inject, ViewChild, ViewChildren } from '@angular/core';
3
- import { isKeyHotkey } from 'is-hotkey';
4
- import { Subject, fromEvent, merge } from 'rxjs';
5
- import { debounceTime, distinctUntilChanged, filter, map, take, takeUntil } from 'rxjs/operators';
6
- import { Editor, Transforms } from 'slate';
7
- import { AngularEditor } from 'slate-angular';
8
- import { ColumnResizeNotifierSource, TableCellEventDispatcher } from '../../../components';
9
- import { TheColumnResizeDirective } from '../../../components/column-resize/column-resize.directive';
10
- import { DEFAULT_SCROLL_CONTAINER } from '../../../constants/default';
11
- import { ScrollDirection } from '../../../constants/node-types';
12
- import { SLA_TABLE_CELL_SELECTOR } from '../../../constants/selector';
13
- import { getPluginOptions } from '../../../core';
14
- import { PluginKeys, THE_MODE_TOKEN, TheBaseElement, TheEditor, TheMode } from '../../../interfaces';
15
- import { TheTableContextMenuService } from '../../../services/table-contextmenu.service';
16
- import * as TheTransforms from '../../../transforms';
17
- import { getElementHeight, getElementWidth, isColorInput, isColorPanel } from '../../../utils';
18
- import { isMobileMode } from '../../../utils/get-mode';
19
- import { TableEditor } from '../table.editor';
20
- import { TableFreezeColumnPipe, TableFreezeRowPipe, TableHasHeaderRowPipe } from '../table.pipe';
21
- import { TableService } from '../table.service';
22
- import { TableStore } from '../table.store';
23
- import { HEADER_CELL_CLASS, STICKY_CELL_CLASS, TABLE_CONTROL, TABLE_INSERT_MASK, TABLE_NUMBER_COLUMN, TABLE_PADDING, THE_TABLE_COMPONENT_TOKEN, TableWithStickyRowClass } from '../table.types';
24
- import { moveSelectionFromCell } from '../transforms/move-selection-from-cell';
25
- import { calcPrintColumnWidth, calculateHeaderRowHeight, calculateRowControls, createTablePosition, getColumnsWidth, getGridColumns, hasHeaderRow, isSelectedAllCell, isVirtualKey } from '../utils';
26
- import { TheInsertMark } from './insert-mark/insert-mark.component';
27
- import * as i0 from "@angular/core";
28
- import * as i1 from "../../../components";
29
- import * as i2 from "../table.store";
30
- import * as i3 from "../table.service";
31
- import * as i4 from "../../../services/table-contextmenu.service";
32
- import * as i5 from "../table.pipe";
33
- import * as i6 from "../../../services/context.service";
34
- import * as i7 from "../../../interfaces";
35
- export class TheTable extends TheBaseElement {
36
- get nativeElement() {
37
- return this.elementRef.nativeElement;
38
- }
39
- get tbodyNativeElement() {
40
- return this.tbodyElement?.nativeElement;
41
- }
42
- onContextChange() {
43
- super.onContextChange();
44
- if (this.initialized) {
45
- setTimeout(() => {
46
- this.afterChildrenViewUpdate();
47
- this.cdr.markForCheck();
48
- setTimeout(() => {
49
- this.afterRowControlsUpdate();
50
- }, 0);
51
- }, 0);
52
- this.isFreezeRow = this.freezeRowPipe.transform(this.element, this.tablePluginOptions);
53
- this.isFreezeColumn = this.freezeColumnPipe.transform(this.element, this.tablePluginOptions, this.tableWrapperWidth);
54
- this.getIsInTable();
55
- this.getColControls();
56
- this.columns = this.element.columns;
57
- // 右键菜单中有输入框,为了避免聚焦到输入框触发右键菜单关闭,需要增加 this.editor.selection 条件
58
- if (this.editor.selection && !this.isInTable && this.theTableContextMenuService.isOpened) {
59
- this.theTableContextMenuService.closeContextMenu();
60
- this.tableStore.isExistSelectedCell && this.tableStore.clearSelectedCells();
61
- }
62
- }
63
- }
64
- // 需要等待内容更新后,才可以执行 useRowControls,否则获取的高度可能不正确
65
- afterChildrenViewUpdate() {
66
- this.tableStore.emitTableChange();
67
- this.tableStore.setSelectedColumnsAndRowIndex();
68
- this.setTableScrollingShadow();
69
- this.useRowControls();
70
- }
71
- // 需要等等待 row controls 渲染后,标题行固定需要设置 first row control 的属性
72
- afterRowControlsUpdate() {
73
- this.setTableHeaderStyle();
74
- }
75
- constructor(eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theTableContextMenuService, freezeColumnPipe, freezeRowPipe, renderer, contextService, config) {
76
- super();
77
- this.eventDispatcher = eventDispatcher;
78
- this.resizeNotifier = resizeNotifier;
79
- this.tableStore = tableStore;
80
- this.cdr = cdr;
81
- this.ngZone = ngZone;
82
- this.tableService = tableService;
83
- this.theTableContextMenuService = theTableContextMenuService;
84
- this.freezeColumnPipe = freezeColumnPipe;
85
- this.freezeRowPipe = freezeRowPipe;
86
- this.renderer = renderer;
87
- this.contextService = contextService;
88
- this.config = config;
89
- this.headerRow = false;
90
- this.isSelectedAllCell = false;
91
- this.destroy$ = new Subject();
92
- this.rowControls = [];
93
- this.colControls = [];
94
- this.getOutletParent = () => {
95
- return this.tbodyElement.nativeElement;
96
- };
97
- this.getColControlButtonWidth = () => {
98
- let result = 0;
99
- result += this.element?.options?.numberedColumn ? TABLE_NUMBER_COLUMN : 0;
100
- return result;
101
- };
102
- }
103
- ngOnInit() {
104
- super.ngOnInit();
105
- this.isMobileMode = isMobileMode(this.editor);
106
- this.getColControls();
107
- this.getIsInTable();
108
- this.tablePluginOptions = getPluginOptions(this.editor, PluginKeys.table);
109
- if (this.tablePluginOptions.showFullscreen && this.tablePluginOptions.fullscreenAction) {
110
- this.tablePluginOptions
111
- .fullscreenAction(this.editor)
112
- .pipe(takeUntil(this.destroy$), filter(content => {
113
- return content.element === this.element;
114
- }), map(content => {
115
- return content.state === 'off' ? false : true;
116
- }))
117
- .subscribe(value => {
118
- this.tableStore.isFullscreen = value;
119
- if (this.tableStore.isFullscreen) {
120
- this.previousScrollContainer = this.editor.options.scrollContainer;
121
- this.editor.options.scrollContainer = DEFAULT_SCROLL_CONTAINER;
122
- }
123
- else {
124
- this.editor.options.scrollContainer = this.previousScrollContainer;
125
- }
126
- this.isStickyTop = false;
127
- this.setHeaderRowStyle();
128
- this.contextService.rebindContainerScroll();
129
- });
130
- }
131
- this.tableStore
132
- .selectedCellsChange()
133
- .pipe(takeUntil(this.destroy$))
134
- .subscribe(cells => {
135
- this.selectedCells = cells;
136
- if (!cells.length) {
137
- this.isSelectedAllCell = false;
138
- if (this.tablePluginOptions.deselect && typeof this.tablePluginOptions.deselect === 'function') {
139
- this.tablePluginOptions.deselect(this.editor);
140
- }
141
- if (this.tableService.isOpened) {
142
- this.tableService.closeToolbar();
143
- }
144
- }
145
- else {
146
- this.isSelectedAllCell = isSelectedAllCell(this.editor, this.tableStore.getSelectedCellPositions());
147
- }
148
- });
149
- if (this.config.mode !== TheMode.print) {
150
- this.columns = this.element.columns;
151
- }
152
- }
153
- getWrapperWidthAndLeft() {
154
- const { left, width } = this.nativeElement.getBoundingClientRect();
155
- this.tableWrapperWidth = width;
156
- this.tableWrapperLeft = left;
157
- }
158
- ngAfterViewInit() {
159
- this.tableStore.initEditor(this.editor);
160
- this.ngZone.onStable.pipe(take(1)).subscribe(async () => {
161
- const blockCardElement = this.nativeElement.closest('slate-block-card');
162
- if (blockCardElement) {
163
- blockCardElement.classList.add(`slate-block-card-${this.element.type}`);
164
- }
165
- this.setHeaderCellClass();
166
- if (!this.readonly) {
167
- if (this.element.options?.numberedColumn) {
168
- const loadImageDone = await this.resolveImage();
169
- // 等待序号列表格内图片加载完成后再去渲染表格行高度
170
- if (loadImageDone) {
171
- this.ngZone.run(() => {
172
- this.useRowControls();
173
- this.cdr.markForCheck();
174
- });
175
- }
176
- }
177
- else {
178
- if (this.isInTable) {
179
- this.ngZone.run(() => {
180
- this.useRowControls();
181
- this.cdr.markForCheck();
182
- });
183
- }
184
- }
185
- }
186
- });
187
- setTimeout(() => {
188
- const isPrintMode = this.config.mode === TheMode.print;
189
- this.getWrapperWidthAndLeft();
190
- if (isPrintMode) {
191
- this.columns = calcPrintColumnWidth(this.element);
192
- }
193
- this.isFreezeRow = this.freezeRowPipe.transform(this.element, this.tablePluginOptions);
194
- this.isFreezeColumn = this.freezeColumnPipe.transform(this.element, this.tablePluginOptions, this.tableWrapperWidth);
195
- this.setHeaderColumnStickyCellClass();
196
- this.setTableRightShadow();
197
- this.subscribeCellsChange();
198
- this.subscribeCellPositionChange();
199
- this.listenOnSelectedCells();
200
- this.listenKeydownEvent();
201
- this.listenSelectstartEvent();
202
- this.listenTableContextMenuEvent();
203
- this.listenTableWrapperScroll();
204
- this.subscribeScrollContainerScroll(this.tableWrapperLeft);
205
- if (isPrintMode) {
206
- this.cdr.markForCheck();
207
- }
208
- this.ngZone.runOutsideAngular(() => {
209
- merge(this.contextService.containerResized$, this.contextService.windowResized$)
210
- .pipe(takeUntil(this.destroy$))
211
- .subscribe(() => {
212
- this.getWrapperWidthAndLeft();
213
- this.setHeaderRowShadow();
214
- this.setStickyElementLeftStyle();
215
- });
216
- this.contextService.theEditorResized$.pipe(takeUntil(this.destroy$)).subscribe(result => {
217
- if (result.widthChanged) {
218
- this.getWrapperWidthAndLeft();
219
- this.setTableScrollingShadow();
220
- this.setGridColumnsStyle();
221
- this.setHeaderRowShadow();
222
- }
223
- });
224
- });
225
- }, 0);
226
- }
227
- /* 给标题行的左/右加阴影 */
228
- setHeaderRowShadow() {
229
- if (this.isFreezeRow) {
230
- // 固定标题行遮盖
231
- if (this.isLeftShadow || this.isRightShadow) {
232
- let { height, top } = this.calcHeaderRowShadow();
233
- if (this.isRightShadow && this.headerRowRightShadow) {
234
- const headerRowRightShadow = this.headerRowRightShadow.nativeElement;
235
- this.renderer.setStyle(headerRowRightShadow, 'height', `${height}px`);
236
- this.renderer.setStyle(headerRowRightShadow, 'top', `${top}px`);
237
- this.renderer.setStyle(headerRowRightShadow, 'left', `${this.tableWrapperLeft + this.tableWrapperWidth - 8}px`);
238
- }
239
- if (this.isLeftShadow && this.headerRowLeftShadow) {
240
- const headerRowLeftShadow = this.headerRowLeftShadow.nativeElement;
241
- this.renderer.setStyle(headerRowLeftShadow, 'height', `${height}px`);
242
- this.renderer.setStyle(headerRowLeftShadow, 'top', `${top}px`);
243
- this.renderer.setStyle(headerRowLeftShadow, 'left', `${this.tableWrapperLeft + this.getColControlButtonWidth()}px`);
244
- }
245
- }
246
- }
247
- }
248
- calcHeaderRowShadow() {
249
- const headerRowHeight = calculateHeaderRowHeight(this.editor, this.element);
250
- let height = headerRowHeight;
251
- // 默认(没有聚焦)的 top 值:滚动容器高度 + 表格的padding(8)
252
- let top = this.scrollContainerTop + TABLE_PADDING;
253
- // 聚焦在表格中: 高度 + control(11),top 加一个 mask(19)
254
- if (this.isInTable) {
255
- height = height + TABLE_CONTROL;
256
- top = top + TABLE_INSERT_MASK - 1;
257
- }
258
- return { height, top };
259
- }
260
- subscribeScrollContainerScroll(tableWrapperLeft) {
261
- this.ngZone.runOutsideAngular(() => {
262
- this.contextService.containerScrolled$
263
- .pipe(takeUntil(this.destroy$), map(entires => {
264
- const { event, direction } = entires;
265
- if (direction === ScrollDirection.X) {
266
- const { left } = this.nativeElement.getBoundingClientRect();
267
- this.isScrolledXOfScrollContainer = tableWrapperLeft !== left;
268
- this.tableWrapperLeft = left;
269
- this.setHeaderRowShadow();
270
- this.setStickyElementLeftStyle();
271
- }
272
- if (direction === ScrollDirection.Y) {
273
- this.scrollContainerTop = event.target.getBoundingClientRect().top;
274
- const clientRect = this.theTableElement.nativeElement.getBoundingClientRect();
275
- const headerTopHeight = this.isInTable ? -19 : 11;
276
- const headerRowHeight = calculateRowControls(this.editor, this.element)[0]?.height;
277
- const top = clientRect.top + headerTopHeight;
278
- this.isStickyTop =
279
- top <= this.scrollContainerTop + 8 &&
280
- clientRect.bottom - this.scrollContainerTop >= headerRowHeight &&
281
- this.isFreezeRow;
282
- // 标题行内容超过固定高度时移除冻结
283
- if (this.isStickyTop) {
284
- const maxHeaderRowHeight = (24 + 8) * 11; // 超出 11 行,取消冻结
285
- this.isStickyTop = headerRowHeight <= maxHeaderRowHeight;
286
- }
287
- }
288
- return this.isStickyTop;
289
- }), distinctUntilChanged())
290
- .subscribe(() => {
291
- this.setHeaderRowStyle();
292
- });
293
- });
294
- }
295
- applyHeaderCellClass(isHeaderCell, cell, className) {
296
- const nativeElement = AngularEditor.toDOMNode(this.editor, cell);
297
- if (isHeaderCell && !nativeElement.classList.contains(className)) {
298
- this.renderer.addClass(nativeElement, className);
299
- }
300
- else if (!isHeaderCell && nativeElement.classList.contains(className)) {
301
- this.renderer.removeClass(nativeElement, className);
302
- }
303
- }
304
- setTableHeaderStyle() {
305
- this.setHeaderCellClass();
306
- this.setHeaderColumnStickyCellClass();
307
- this.setHeaderRowStyle();
308
- }
309
- setHeaderCellClass() {
310
- const isHeaderColumn = this.element.options?.headerColumn || false;
311
- // header column cells
312
- this.element.children.forEach(item => {
313
- this.applyHeaderCellClass(isHeaderColumn, item.children[0], HEADER_CELL_CLASS);
314
- });
315
- // header row cells
316
- const isHeaderRow = hasHeaderRow(this.element);
317
- this.element.children[0].children.forEach((item, index) => {
318
- let isHeaderCell = index === 0 ? isHeaderRow || isHeaderColumn : isHeaderRow;
319
- this.applyHeaderCellClass(isHeaderCell, item, HEADER_CELL_CLASS);
320
- });
321
- }
322
- setHeaderColumnStickyCellClass() {
323
- this.element.children.forEach(item => {
324
- // sticky cell
325
- this.applyHeaderCellClass(this.isFreezeColumn, item.children[0], STICKY_CELL_CLASS);
326
- });
327
- }
328
- setHeaderRowStyle() {
329
- this.setGridColumnsStyle();
330
- this.setStickyRowStyle();
331
- this.setHeaderRowShadow();
332
- this.setStickyElementLeftStyle();
333
- }
334
- setGridColumnsStyle() {
335
- const colControl = this.columnControlsWrapper.nativeElement;
336
- if (this.isFreezeRow) {
337
- const headerRow = this.tbodyElement.nativeElement.childNodes[0];
338
- const hasColumns = this.element?.columns && this.colgroup?.nativeElement;
339
- let cellsWidth = [];
340
- let gridColumns = '';
341
- let colControlGridColumns = '';
342
- if (hasColumns) {
343
- cellsWidth = getColumnsWidth(this.colgroup.nativeElement);
344
- gridColumns = getGridColumns(headerRow, cellsWidth);
345
- colControlGridColumns = getGridColumns(colControl, this.element?.columns.map(item => item.width));
346
- }
347
- else {
348
- if (this.readonly) {
349
- cellsWidth = getColumnsWidth(headerRow);
350
- gridColumns = getGridColumns(headerRow, cellsWidth);
351
- }
352
- else {
353
- const columnCount = this.element.children[0].children.length;
354
- const percent = +(100 / columnCount).toFixed(4);
355
- cellsWidth = new Array(columnCount).fill(percent);
356
- gridColumns = getGridColumns(headerRow, cellsWidth, '%');
357
- colControlGridColumns = getGridColumns(colControl, getColumnsWidth(colControl));
358
- }
359
- }
360
- const tablePadding = 44;
361
- // 序号列存在时, 表格宽度加序号列宽度
362
- // 只读模式下, 表格宽度不变
363
- const tableWidth = !this.readonly && this.element?.options?.numberedColumn ? this.tableWrapperWidth - tablePadding : this.tableWrapperWidth;
364
- this.renderer.setStyle(headerRow, 'width', tableWidth + 'px');
365
- this.renderer.setStyle(headerRow, 'grid-template-columns', gridColumns);
366
- this.renderer.setStyle(colControl, 'width', tableWidth + 'px');
367
- this.renderer.setStyle(colControl, 'grid-template-columns', colControlGridColumns);
368
- }
369
- }
370
- getStickRowElements() {
371
- const firstHeaderRow = this.nativeElement.querySelector('tbody tr');
372
- const columnControlsWrapper = this.columnControlsWrapper.nativeElement;
373
- const tableCornerControl = this.cornerControl.nativeElement;
374
- const rowControlInner = this.rowControlsInner.nativeElement;
375
- const firstRowControlButton = this.rowControlsButtonWrapper.first
376
- ? this.rowControlsButtonWrapper.first.nativeElement
377
- : null;
378
- return { firstHeaderRow, columnControlsWrapper, tableCornerControl, rowControlInner, firstRowControlButton };
379
- }
380
- setStickyRowStyle() {
381
- if (this.isFreezeRow) {
382
- const { firstHeaderRow, columnControlsWrapper, tableCornerControl, rowControlInner, firstRowControlButton } = this.getStickRowElements();
383
- const numberedColumn = this.element?.options?.numberedColumn;
384
- if (this.isStickyTop) {
385
- const headerRowHeight = calculateHeaderRowHeight(this.editor, this.element);
386
- this.renderer.addClass(this.nativeElement, TableWithStickyRowClass);
387
- this.updateStickyRowScrollLeft();
388
- const top = this.isInTable ? this.scrollContainerTop + 36 : this.scrollContainerTop;
389
- this.renderer.setStyle(firstHeaderRow, 'top', top + 'px');
390
- this.renderer.setStyle(firstHeaderRow, 'height', `${headerRowHeight}px`);
391
- if (this.isInTable || numberedColumn) {
392
- [columnControlsWrapper, tableCornerControl].map(item => {
393
- item && this.renderer.setStyle(item, 'top', this.scrollContainerTop + 'px');
394
- });
395
- firstRowControlButton && this.renderer.setStyle(firstRowControlButton, 'top', this.scrollContainerTop + 'px');
396
- }
397
- // 优化:table 的 padding-top 应该动态变化(与阴影同变)
398
- const tablePaddingTop = headerRowHeight + 11; // 标题行高 + ctrl btn(11px)高度
399
- this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', tablePaddingTop + 'px');
400
- this.renderer.setStyle(rowControlInner, 'padding-top', tablePaddingTop + 'px');
401
- }
402
- else {
403
- this.renderer.removeClass(this.nativeElement, TableWithStickyRowClass);
404
- [firstHeaderRow, columnControlsWrapper, tableCornerControl].map(item => {
405
- item && this.renderer.setStyle(item, 'top', null);
406
- });
407
- this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', null);
408
- this.renderer.setStyle(rowControlInner, 'padding-top', null);
409
- firstRowControlButton && this.renderer.setStyle(firstRowControlButton, 'top', null);
410
- }
411
- }
412
- else {
413
- const hadStickRowClass = this.nativeElement.classList.contains(TableWithStickyRowClass);
414
- if (hadStickRowClass) {
415
- const { firstHeaderRow, columnControlsWrapper, tableCornerControl, rowControlInner, firstRowControlButton } = this.getStickRowElements();
416
- this.renderer.removeClass(this.nativeElement, TableWithStickyRowClass);
417
- [firstHeaderRow, columnControlsWrapper, tableCornerControl].map(item => {
418
- item && this.renderer.setStyle(item, 'top', null);
419
- });
420
- this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', null);
421
- this.renderer.setStyle(rowControlInner, 'padding-top', null);
422
- firstRowControlButton && this.renderer.setStyle(firstRowControlButton, 'top', null);
423
- }
424
- }
425
- }
426
- setTableScrollingShadow() {
427
- const scrollLeft = this.tableWrapper.nativeElement.scrollLeft;
428
- this.setTableLeftShadow(scrollLeft);
429
- this.setTableRightShadow(scrollLeft);
430
- }
431
- setTableLeftShadow(scrollLeft = 0) {
432
- this.isLeftShadow = scrollLeft > 0;
433
- let elements = [this.tableWrapper.nativeElement.parentElement];
434
- if (this.isFreezeColumn) {
435
- const rows = this.tableWrapper.nativeElement.querySelectorAll(`tr`);
436
- const stickyCells = Array.from(rows).map(item => item.querySelector('th.the-table-col-control') || item.querySelector('td.slate-element-table-cell'));
437
- elements = stickyCells;
438
- }
439
- if (this.isLeftShadow) {
440
- elements.forEach(element => {
441
- element.classList.add('the-table-left-shadow');
442
- });
443
- }
444
- else {
445
- elements.forEach(item => {
446
- item.classList.remove('the-table-left-shadow');
447
- });
448
- }
449
- }
450
- setTableRightShadow(scrollLeft = 0) {
451
- const nativeElement = this.tableWrapper.nativeElement;
452
- const scrollWidth = nativeElement.scrollWidth;
453
- const clientWidth = nativeElement.clientWidth;
454
- this.isRightShadow = scrollLeft + clientWidth < scrollWidth;
455
- if (this.isRightShadow) {
456
- nativeElement.parentElement.classList.add('the-table-right-shadow');
457
- }
458
- else {
459
- nativeElement.parentElement.classList.remove('the-table-right-shadow');
460
- }
461
- }
462
- subscribeCellPositionChange() {
463
- this.tableStore
464
- .cellsPositionChange()
465
- .pipe(debounceTime(100), takeUntil(this.destroy$))
466
- .subscribe(() => {
467
- this.cdr.detectChanges();
468
- });
469
- }
470
- subscribeCellsChange() {
471
- this.tableStore
472
- .dangerousOrSelectedCellsChange()
473
- .pipe(takeUntil(this.destroy$))
474
- .subscribe(() => {
475
- this.cdr.detectChanges();
476
- });
477
- }
478
- useRowControls() {
479
- if ((this.selection && !this.readonly) ||
480
- this.element?.options?.numberedColumn ||
481
- this.tableStore.isRightClicking ||
482
- this.tableStore.isFocusedInput) {
483
- this.rowControls = calculateRowControls(this.editor, this.element);
484
- }
485
- }
486
- detectChanges() {
487
- this.cdr.detectChanges();
488
- }
489
- resolveImage() {
490
- const imageElements = this.nativeElement.querySelectorAll('img');
491
- if (imageElements.length) {
492
- const imageResolves = [];
493
- imageElements.forEach(item => {
494
- const image = new Image();
495
- const imageLoad = new Promise(resolve => {
496
- image.onload = () => {
497
- resolve(true);
498
- };
499
- image.onerror = () => {
500
- resolve(true);
501
- };
502
- image.src = item.getAttribute('src');
503
- });
504
- imageResolves.push(imageLoad);
505
- });
506
- return Promise.all(imageResolves);
507
- }
508
- return Promise.resolve(true);
509
- }
510
- getColControls() {
511
- this.colControls = this.element?.children[0]?.children || [];
512
- }
513
- getIsInTable() {
514
- if (this.selection && !this.readonly) {
515
- const selection = this.editor.selection;
516
- const startPosition = createTablePosition(this.editor);
517
- const endPosition = createTablePosition(this.editor, selection.focus.path);
518
- this.isInTable = startPosition.isInTable() && endPosition.isInTable();
519
- }
520
- else {
521
- this.isInTable = false;
522
- }
523
- }
524
- initializeColumns() {
525
- if (this.element.columns) {
526
- const columns = [];
527
- this.tableWrapper.nativeElement.querySelectorAll('col').forEach((ele) => {
528
- columns.push({ width: ele.offsetWidth });
529
- });
530
- // Editor container width changes, resulting in column widths no longer valid #WIK-6766
531
- const warning = this.element.columns.some((col, index) => col.width !== columns[index]?.width);
532
- if (warning) {
533
- TheTransforms.setNode(this.editor, { columns }, this.element);
534
- }
535
- }
536
- else {
537
- const tr = this.element.children[0];
538
- const columns = tr.children.map(cell => {
539
- return {
540
- width: this.tableWrapperWidth / tr.children.length
541
- };
542
- });
543
- TheTransforms.setNode(this.editor, { columns }, this.element);
544
- }
545
- }
546
- initializeRows() {
547
- this.element.children.map((row, index) => {
548
- if (!row.height) {
549
- const element = TheEditor.toDOMNode(this.editor, row);
550
- const height = getElementHeight(element);
551
- TheTransforms.setNode(this.editor, { height }, row);
552
- }
553
- });
554
- }
555
- transformRowHeight(rowIndex) {
556
- const rowElements = this.nativeElement.querySelector('tbody').children;
557
- if (rowElements) {
558
- const elements = [...rowElements];
559
- const operateRow = elements[rowIndex];
560
- if (operateRow) {
561
- const height = getElementHeight(operateRow);
562
- TheTransforms.setNode(this.editor, { height }, this.element.children[rowIndex]);
563
- }
564
- }
565
- }
566
- transformColumnsWidth() {
567
- const cols = [...this.nativeElement.querySelector('colgroup').children];
568
- const columns = cols.map(col => {
569
- return { width: getElementWidth(col) };
570
- });
571
- TheTransforms.setNode(this.editor, { columns }, this.element);
572
- }
573
- onColMousedown(event, index) {
574
- event.stopPropagation();
575
- event.preventDefault();
576
- if (!!this.selection && this.isInTable) {
577
- this.tableStore.clearDangerousCells();
578
- this.tableStore.selectColumn(this.editor, index, event);
579
- if (this.tablePluginOptions.colSelect && typeof this.tablePluginOptions.colSelect === 'function') {
580
- this.tablePluginOptions.colSelect(this.editor, {
581
- index,
582
- cells: this.selectedCells
583
- });
584
- }
585
- this.tableService.afterSelectedCells(event.target, this.element, this.isMobileMode);
586
- }
587
- }
588
- onRowMousedown(event, index) {
589
- if (this.readonly)
590
- return;
591
- event.stopPropagation();
592
- event.preventDefault();
593
- if (!this.isInTable) {
594
- const path = TheEditor.findPath(this.editor, this.element);
595
- Transforms.select(this.editor, path);
596
- }
597
- this.tableStore.selectRow(this.editor, index, event);
598
- if (this.tablePluginOptions.rowSelect && typeof this.tablePluginOptions.rowSelect === 'function') {
599
- this.tablePluginOptions.rowSelect(this.editor, {
600
- index,
601
- cells: this.selectedCells
602
- });
603
- }
604
- this.tableService.afterSelectedCells(event.target, this.element, this.isMobileMode);
605
- }
606
- onSelectTable(event) {
607
- event.stopPropagation();
608
- event.preventDefault();
609
- this.tableStore.selectTable(this.editor, event.metaKey);
610
- if (this.tablePluginOptions.tableSelect && typeof this.tablePluginOptions.tableSelect === 'function') {
611
- this.tablePluginOptions.tableSelect(this.editor, { table: this.element });
612
- }
613
- this.tableService.afterSelectedCells(event.target, this.element, this.isMobileMode);
614
- }
615
- listenTableContextMenuEvent() {
616
- this.ngZone.runOutsideAngular(() => {
617
- fromEvent(this.theTableElement.nativeElement, 'contextmenu')
618
- .pipe(takeUntil(this.destroy$))
619
- .subscribe(event => {
620
- if (this.readonly) {
621
- return;
622
- }
623
- event.preventDefault();
624
- this.tableStore.isRightClicking = true;
625
- const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
626
- if (!cell) {
627
- return;
628
- }
629
- else {
630
- if (!this.isInTable) {
631
- const node = AngularEditor.toSlateNode(this.editor, cell);
632
- const path = AngularEditor.findPath(this.editor, node);
633
- Transforms.select(this.editor, Editor.start(this.editor, path));
634
- }
635
- if (!cell.classList.contains('selected-cell')) {
636
- this.tableStore.selectCell(cell, this.editor, event.metaKey);
637
- }
638
- }
639
- if (!this.isMobileMode) {
640
- if (this.theTableContextMenuService.isOpened) {
641
- this.theTableContextMenuService
642
- .closeContextMenu()
643
- .pipe(take(1))
644
- .subscribe(() => {
645
- this.theTableContextMenuService.openMenuList(event);
646
- });
647
- }
648
- else if (this.tableService.isOpened) {
649
- this.tableService
650
- .closeToolbar()
651
- .pipe(take(1))
652
- .subscribe(() => {
653
- this.theTableContextMenuService.openMenuList(event);
654
- });
655
- }
656
- else {
657
- this.theTableContextMenuService.openMenuList(event);
658
- }
659
- }
660
- // patch for right click select next cell
661
- setTimeout(() => {
662
- Transforms.select(this.editor, Editor.start(this.editor, this.editor.selection));
663
- });
664
- });
665
- });
666
- }
667
- listenOnSelectedCells() {
668
- merge(fromEvent(document, 'mousedown').pipe(filter((e) => e.button !== 2)), fromEvent(document, 'keydown').pipe(filter((e) => {
669
- return !isVirtualKey(e);
670
- })))
671
- .pipe(filter((event) => {
672
- if (isColorInput(event.target)) {
673
- this.tableStore.isFocusedInput = true;
674
- return false;
675
- }
676
- if (isColorPanel(event.target)) {
677
- return false;
678
- }
679
- if (this.editor.selection) {
680
- const selectedCellPositions = this.tableStore.getSelectedCellPositions();
681
- return selectedCellPositions?.length > 0;
682
- }
683
- else {
684
- if (event.type === 'keydown' && this.theTableContextMenuService.isOpened) {
685
- return false;
686
- }
687
- }
688
- return true;
689
- }), takeUntil(this.destroy$))
690
- .subscribe((e) => {
691
- if (e.type === 'keydown') {
692
- TableEditor.clearCellsContent(this.editor);
693
- }
694
- const isCurrentTableElement = this.nativeElement.contains(e.target);
695
- if (!isCurrentTableElement || (!e.metaKey && !e.shiftKey)) {
696
- this.tableStore.clearSelectedCells();
697
- }
698
- if (!isCurrentTableElement) {
699
- this.tableStore.clearLastFocusPath();
700
- }
701
- this.theTableContextMenuService.closeContextMenu();
702
- });
703
- }
704
- listenKeydownEvent() {
705
- this.ngZone.runOutsideAngular(() => {
706
- fromEvent(document, 'keydown')
707
- .pipe(takeUntil(this.destroy$), filter((e) => !!e && !this.readonly))
708
- .subscribe((e) => {
709
- if (this.isInTable) {
710
- if (isKeyHotkey('mod', e)) {
711
- this.tableService.handleKeydownForPointerSelection(e, this.tbodyNativeElement);
712
- }
713
- if (isKeyHotkey('shift', e)) {
714
- this.tableService.handleKeydownForAreaSelection(e, this.tbodyNativeElement);
715
- }
716
- // 处理单元格内 shift + up/down/left/right 行为
717
- moveSelectionFromCell(this.editor, e);
718
- // 触发上下左右键时,清除选中的单元格
719
- if (isKeyHotkey(['up', 'down', 'left', 'right'], e) && this.tableStore.selectCells?.length > 0) {
720
- this.tableStore.clearSelectedCells();
721
- }
722
- }
723
- });
724
- });
725
- }
726
- listenSelectstartEvent() {
727
- this.ngZone.runOutsideAngular(() => {
728
- fromEvent(document, 'selectstart')
729
- .pipe(takeUntil(this.destroy$))
730
- .subscribe((event) => {
731
- this.tableService.selectStartPreventDefault(event);
732
- });
733
- });
734
- }
735
- setStickyRowPointerEvents(pointerEventsStyle) {
736
- if (!this.isFreezeRow) {
737
- return;
738
- }
739
- const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
740
- for (const stiRow of stickyRows) {
741
- this.renderer.setStyle(stiRow, 'pointer-events', pointerEventsStyle);
742
- }
743
- }
744
- listenTableWrapperScroll() {
745
- let timer;
746
- fromEvent(this.tableWrapper.nativeElement, 'wheel', { passive: true })
747
- .pipe(takeUntil(this.destroy$))
748
- .subscribe(() => {
749
- // 处理标题行固定时的滚动跟随
750
- this.setStickyRowPointerEvents('none');
751
- timer && clearTimeout(timer);
752
- timer = setTimeout(() => {
753
- this.setStickyRowPointerEvents('auto');
754
- timer = null;
755
- }, 200);
756
- });
757
- fromEvent(this.tableWrapper.nativeElement, 'scroll')
758
- .pipe(takeUntil(this.destroy$))
759
- .subscribe(() => {
760
- this.setTableScrollingShadow();
761
- this.updateStickyRowScrollLeft();
762
- this.setHeaderRowShadow();
763
- });
764
- }
765
- updateStickyRowScrollLeft() {
766
- // 判断是否出现固定标题行
767
- if (this.isStickyTop) {
768
- const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
769
- for (const stiRow of stickyRows) {
770
- // 修复获取 scrollLeft 属性引起的浏览器重绘,导致跳动问题 #WIK-11038
771
- requestAnimationFrame(() => {
772
- // 同步滚动状态到 .the-sticky-row
773
- stiRow.scrollLeft = this.tableWrapper.nativeElement.scrollLeft;
774
- });
775
- }
776
- }
777
- }
778
- /*
779
- * 编辑器滚动容器出现左右滚动时
780
- */
781
- setStickyElementLeftStyle() {
782
- if (this.isFreezeRow) {
783
- const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
784
- const cornerControl = this.cornerControl.nativeElement;
785
- const rowControl = this.rowControlsButtonWrapper.first?.nativeElement;
786
- const buffer = this.isInTable ? -TABLE_CONTROL : 0;
787
- if (this.isStickyTop && this.isScrolledXOfScrollContainer) {
788
- stickyRows.forEach((element) => {
789
- this.renderer.setStyle(element, 'left', `${this.tableWrapperLeft + this.getColControlButtonWidth()}px`);
790
- });
791
- this.renderer.setStyle(cornerControl, 'left', `${this.tableWrapperLeft + buffer}px`);
792
- rowControl && this.renderer.setStyle(rowControl, 'left', `${this.tableWrapperLeft + buffer}px`);
793
- }
794
- else {
795
- const stickyElements = [...stickyRows, cornerControl, rowControl];
796
- stickyElements.forEach((element) => {
797
- element && this.renderer.setStyle(element, 'left', null);
798
- });
799
- }
800
- }
801
- }
802
- trackByFnRowControls(index) {
803
- return index;
804
- }
805
- trackByFnColControls(index) {
806
- return index;
807
- }
808
- ngOnDestroy() {
809
- super.ngOnDestroy();
810
- this.tableService.closeToolbar();
811
- this.theTableContextMenuService.closeContextMenu();
812
- this.destroy$.next();
813
- this.destroy$.complete();
814
- }
815
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TheTable, deps: [{ token: i1.TableCellEventDispatcher }, { token: i1.ColumnResizeNotifierSource }, { token: i2.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.TableService }, { token: i4.TheTableContextMenuService }, { token: i5.TableFreezeColumnPipe }, { token: i5.TableFreezeRowPipe }, { token: i0.Renderer2 }, { token: i6.TheContextService }, { token: THE_MODE_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
816
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TheTable, isStandalone: true, selector: "ng-component", host: { properties: { "class.the-table-with-controls": "isInTable || tableStore.isRightClicking || tableStore.isFocusedInput", "class.the-table-with-sticky-column": "isFreezeColumn", "class.the-numbered-table": "element?.options?.numberedColumn", "class.the-table-selection-hide": "tableStore.isCellSelecting || tableStore.isRightClicking || tableStore.isFocusedInput" } }, providers: [
817
- TableStore,
818
- TableService,
819
- TheTableContextMenuService,
820
- TableCellEventDispatcher,
821
- ColumnResizeNotifierSource,
822
- TableFreezeColumnPipe,
823
- TableFreezeRowPipe,
824
- {
825
- provide: THE_TABLE_COMPONENT_TOKEN,
826
- useExisting: TheTable
827
- }
828
- ], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "tableRowControlsWrapper", first: true, predicate: ["tableRowControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsInner", first: true, predicate: ["rowControlsInner"], descendants: true, read: ElementRef }, { propertyName: "headerRowLeftShadow", first: true, predicate: ["headerRowLeftShadow"], descendants: true, read: ElementRef }, { propertyName: "headerRowRightShadow", first: true, predicate: ["headerRowRightShadow"], descendants: true, read: ElementRef }, { propertyName: "colgroup", first: true, predicate: ["colgroup"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div #tableRowControlsWrapper class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls\"\n #cornerControl\n contenteditable=\"false\"\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (pointerdown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!(element | hasHeaderRow) && !isMobileMode\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element?.options?.headerColumn && !isMobileMode\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-control-button-wrap\"\n #rowControlsButtonWrapper\n contenteditable=\"false\"\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container\n *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput) && !element?.options?.numberedColumn\"\n >\n <button\n (pointerdown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n contenteditable=\"false\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n contenteditable=\"false\"\n (pointerdown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">\n {{ (element | hasHeaderRow) && i === 0 ? '' : (element | hasHeaderRow) ? i : i + 1 }}\n </p>\n </div>\n </ng-container>\n <the-table-insert-mark *ngIf=\"!isMobileMode\" type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\">\n </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup>\n <!--\u63A7\u5236\u5E8F\u53F7\u5217\u5BBD\u5EA6-->\n <col *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\" />\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\"></th>\n <th\n #colControl\n class=\"the-table-col-control\"\n contenteditable=\"false\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0,\n 'the-sticky-cell': i === 0 && isFreezeColumn\n }\"\n (pointerdown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"(isInTable || tableStore.isRightClicking || tableStore.isFocusedInput) && !isMobileMode\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody></tbody>\n <div\n *ngIf=\"!element?.options?.headerColumn\"\n #headerRowLeftShadow\n class=\"header-row-shadow header-row-left-shadow\"\n contenteditable=\"false\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: TheInsertMark, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore", "parentElement"] }, { kind: "directive", type: TheColumnResizeDirective, selector: "div[theColumnResize]" }, { kind: "pipe", type: TableHasHeaderRowPipe, name: "hasHeaderRow" }] }); }
829
- }
830
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TheTable, decorators: [{
831
- type: Component,
832
- args: [{ providers: [
833
- TableStore,
834
- TableService,
835
- TheTableContextMenuService,
836
- TableCellEventDispatcher,
837
- ColumnResizeNotifierSource,
838
- TableFreezeColumnPipe,
839
- TableFreezeRowPipe,
840
- {
841
- provide: THE_TABLE_COMPONENT_TOKEN,
842
- useExisting: TheTable
843
- }
844
- ], host: {
845
- '[class.the-table-with-controls]': 'isInTable || tableStore.isRightClicking || tableStore.isFocusedInput',
846
- '[class.the-table-with-sticky-column]': 'isFreezeColumn',
847
- '[class.the-numbered-table]': 'element?.options?.numberedColumn',
848
- '[class.the-table-selection-hide]': 'tableStore.isCellSelecting || tableStore.isRightClicking || tableStore.isFocusedInput'
849
- }, standalone: true, imports: [NgClass, NgIf, NgFor, NgStyle, TheInsertMark, TheColumnResizeDirective, TableHasHeaderRowPipe], template: "<div class=\"the-table-container\" theColumnResize>\n <div #tableRowControlsWrapper class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls\"\n #cornerControl\n contenteditable=\"false\"\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (pointerdown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!(element | hasHeaderRow) && !isMobileMode\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element?.options?.headerColumn && !isMobileMode\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-control-button-wrap\"\n #rowControlsButtonWrapper\n contenteditable=\"false\"\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container\n *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput) && !element?.options?.numberedColumn\"\n >\n <button\n (pointerdown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n contenteditable=\"false\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n contenteditable=\"false\"\n (pointerdown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">\n {{ (element | hasHeaderRow) && i === 0 ? '' : (element | hasHeaderRow) ? i : i + 1 }}\n </p>\n </div>\n </ng-container>\n <the-table-insert-mark *ngIf=\"!isMobileMode\" type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\">\n </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup>\n <!--\u63A7\u5236\u5E8F\u53F7\u5217\u5BBD\u5EA6-->\n <col *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\" />\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\"></th>\n <th\n #colControl\n class=\"the-table-col-control\"\n contenteditable=\"false\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0,\n 'the-sticky-cell': i === 0 && isFreezeColumn\n }\"\n (pointerdown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"(isInTable || tableStore.isRightClicking || tableStore.isFocusedInput) && !isMobileMode\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody></tbody>\n <div\n *ngIf=\"!element?.options?.headerColumn\"\n #headerRowLeftShadow\n class=\"header-row-shadow header-row-left-shadow\"\n contenteditable=\"false\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n" }]
850
- }], ctorParameters: () => [{ type: i1.TableCellEventDispatcher }, { type: i1.ColumnResizeNotifierSource }, { type: i2.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.TableService }, { type: i4.TheTableContextMenuService }, { type: i5.TableFreezeColumnPipe }, { type: i5.TableFreezeRowPipe }, { type: i0.Renderer2 }, { type: i6.TheContextService }, { type: i7.TheModeConfig, decorators: [{
851
- type: Inject,
852
- args: [THE_MODE_TOKEN]
853
- }] }], propDecorators: { tableWrapper: [{
854
- type: ViewChild,
855
- args: ['tableWrapper', { read: ElementRef, static: true }]
856
- }], theTableElement: [{
857
- type: ViewChild,
858
- args: ['theTable', { read: ElementRef, static: true }]
859
- }], tbodyElement: [{
860
- type: ViewChild,
861
- args: ['tbody', { read: ElementRef, static: true }]
862
- }], tableRowControlsWrapper: [{
863
- type: ViewChild,
864
- args: ['tableRowControlsWrapper', { read: ElementRef, static: false }]
865
- }], columnControlsWrapper: [{
866
- type: ViewChild,
867
- args: ['columnControlsWrapper', { read: ElementRef, static: false }]
868
- }], cornerControl: [{
869
- type: ViewChild,
870
- args: ['cornerControl', { read: ElementRef, static: false }]
871
- }], rowControlsInner: [{
872
- type: ViewChild,
873
- args: ['rowControlsInner', { read: ElementRef, static: false }]
874
- }], headerRowLeftShadow: [{
875
- type: ViewChild,
876
- args: ['headerRowLeftShadow', { read: ElementRef, static: false }]
877
- }], headerRowRightShadow: [{
878
- type: ViewChild,
879
- args: ['headerRowRightShadow', { read: ElementRef, static: false }]
880
- }], colgroup: [{
881
- type: ViewChild,
882
- args: ['colgroup', { read: ElementRef, static: false }]
883
- }], rowControlsButtonWrapper: [{
884
- type: ViewChildren,
885
- args: ['rowControlsButtonWrapper', { read: ElementRef }]
886
- }] } });
887
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBTU4sU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDckcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx1QkFB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RSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJckUsb0JBQW9CO3NCQURuQixTQUFTO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUl0RSxRQUFRO3NCQURQLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUkxRCx3QkFBd0I7c0JBRHZCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcywgTmdGb3IsIE5nSWYsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBRdWVyeUxpc3QsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0tleUhvdGtleSB9IGZyb20gJ2lzLWhvdGtleSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRWRpdG9yLCBUcmFuc2Zvcm1zIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGhlQ29sdW1uUmVzaXplRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL2NvbHVtbi1yZXNpemUuZGlyZWN0aXZlJztcbmltcG9ydCB7IERFRkFVTFRfU0NST0xMX0NPTlRBSU5FUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IFNjcm9sbERpcmVjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9ub2RlLXR5cGVzJztcbmltcG9ydCB7IFNMQV9UQUJMRV9DRUxMX1NFTEVDVE9SIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL3NlbGVjdG9yJztcbmltcG9ydCB7IGdldFBsdWdpbk9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IFRhYmxlQ2VsbEVsZW1lbnQsIFRhYmxlRWxlbWVudCwgVGFibGVSb3dFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY3VzdG9tLXR5cGVzJztcbmltcG9ydCB7IFBsdWdpbktleXMsIFRIRV9NT0RFX1RPS0VOLCBUaGVCYXNlRWxlbWVudCwgVGhlRWRpdG9yLCBUaGVNb2RlLCBUaGVNb2RlQ29uZmlnLCBUaGVQbHVnaW5PcHRpb24gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRoZUNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IFRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdGFibGUtY29udGV4dG1lbnUuc2VydmljZSc7XG5pbXBvcnQgKiBhcyBUaGVUcmFuc2Zvcm1zIGZyb20gJy4uLy4uLy4uL3RyYW5zZm9ybXMnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoLCBpc0NvbG9ySW5wdXQsIGlzQ29sb3JQYW5lbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGlzTW9iaWxlTW9kZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2dldC1tb2RlJztcbmltcG9ydCB7IFRhYmxlRWRpdG9yIH0gZnJvbSAnLi4vdGFibGUuZWRpdG9yJztcbmltcG9ydCB7IFRhYmxlRnJlZXplQ29sdW1uUGlwZSwgVGFibGVGcmVlemVSb3dQaXBlLCBUYWJsZUhhc0hlYWRlclJvd1BpcGUgfSBmcm9tICcuLi90YWJsZS5waXBlJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4uL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVTdG9yZSB9IGZyb20gJy4uL3RhYmxlLnN0b3JlJztcbmltcG9ydCB7XG4gICAgSEVBREVSX0NFTExfQ0xBU1MsXG4gICAgU1RJQ0tZX0NFTExfQ0xBU1MsXG4gICAgVEFCTEVfQ09OVFJPTCxcbiAgICBUQUJMRV9JTlNFUlRfTUFTSyxcbiAgICBUQUJMRV9OVU1CRVJfQ09MVU1OLFxuICAgIFRBQkxFX1BBRERJTkcsXG4gICAgVEhFX1RBQkxFX0NPTVBPTkVOVF9UT0tFTixcbiAgICBUYWJsZVdpdGhTdGlja3lSb3dDbGFzcyxcbiAgICBUaGVQbHVnaW5UYWJsZU9wdGlvbixcbiAgICBUaGVUYWJsZUNvbHVtblxufSBmcm9tICcuLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBtb3ZlU2VsZWN0aW9uRnJvbUNlbGwgfSBmcm9tICcuLi90cmFuc2Zvcm1zL21vdmUtc2VsZWN0aW9uLWZyb20tY2VsbCc7XG5pbXBvcnQge1xuICAgIGNhbGNQcmludENvbHVtbldpZHRoLFxuICAgIGNhbGN1bGF0ZUhlYWRlclJvd0hlaWdodCxcbiAgICBjYWxjdWxhdGVSb3dDb250cm9scyxcbiAgICBjcmVhdGVUYWJsZVBvc2l0aW9uLFxuICAgIGdldENvbHVtbnNXaWR0aCxcbiAgICBnZXRHcmlkQ29sdW1ucyxcbiAgICBoYXNIZWFkZXJSb3csXG4gICAgaXNTZWxlY3RlZEFsbENlbGwsXG4gICAgaXNWaXJ0dWFsS2V5XG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFRoZUluc2VydE1hcmsgfSBmcm9tICcuL2luc2VydC1tYXJrL2luc2VydC1tYXJrLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFRhYmxlU3RvcmUsXG4gICAgICAgIFRhYmxlU2VydmljZSxcbiAgICAgICAgVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UsXG4gICAgICAgIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsXG4gICAgICAgIFRhYmxlRnJlZXplQ29sdW1uUGlwZSxcbiAgICAgICAgVGFibGVGcmVlemVSb3dQaXBlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUSEVfVEFCTEVfQ09NUE9ORU5UX1RPS0VOLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFRoZVRhYmxlXG4gICAgICAgIH1cbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtd2l0aC1jb250cm9sc10nOiAnaXNJblRhYmxlIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nIHx8IHRhYmxlU3RvcmUuaXNGb2N1c2VkSW5wdXQnLFxuICAgICAgICAnW2NsYXNzLnRoZS10YWJsZS13aXRoLXN0aWNreS1jb2x1bW5dJzogJ2lzRnJlZXplQ29sdW1uJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtbnVtYmVyZWQtdGFibGVdJzogJ2VsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtc2VsZWN0aW9uLWhpZGVdJzogJ3RhYmxlU3RvcmUuaXNDZWxsU2VsZWN0aW5nIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nIHx8IHRhYmxlU3RvcmUuaXNGb2N1c2VkSW5wdXQnXG4gICAgfSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0NsYXNzLCBOZ0lmLCBOZ0ZvciwgTmdTdHlsZSwgVGhlSW5zZXJ0TWFyaywgVGhlQ29sdW1uUmVzaXplRGlyZWN0aXZlLCBUYWJsZUhhc0hlYWRlclJvd1BpcGVdXG59KVxuZXhwb3J0IGNsYXNzIFRoZVRhYmxlIGV4dGVuZHMgVGhlQmFzZUVsZW1lbnQ8VGFibGVFbGVtZW50LCBFZGl0b3I+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIGhlYWRlclJvdyA9IGZhbHNlO1xuXG4gICAgaXNTZWxlY3RlZEFsbENlbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIHJvd0NvbnRyb2xzOiB7IGhlaWdodDogbnVtYmVyOyByb3dJbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgY29sQ29udHJvbHMgPSBbXTtcblxuICAgIGlzSW5UYWJsZTogYm9vbGVhbjtcblxuICAgIHRhYmxlUGx1Z2luT3B0aW9uczogVGhlUGx1Z2luT3B0aW9uPFRoZVBsdWdpblRhYmxlT3B0aW9uPjtcblxuICAgIGlzU3RpY2t5VG9wOiBib29sZWFuO1xuXG4gICAgaXNTY3JvbGxlZFhPZlNjcm9sbENvbnRhaW5lcjogYm9vbGVhbjtcblxuICAgIHNjcm9sbENvbnRhaW5lclRvcDogbnVtYmVyO1xuXG4gICAgaXNSaWdodFNoYWRvdzogYm9vbGVhbjtcblxuICAgIGlzTGVmdFNoYWRvdzogYm9vbGVhbjtcblxuICAgIHByZXZpb3VzU2Nyb2xsQ29udGFpbmVyOiBzdHJpbmc7XG5cbiAgICBjb2x1bW5zOiBUaGVUYWJsZUNvbHVtbltdO1xuXG4gICAgaXNNb2JpbGVNb2RlOiBib29sZWFuO1xuXG4gICAgc2VsZWN0ZWRDZWxsczogVGFibGVDZWxsRWxlbWVudFtdO1xuXG4gICAgdGFibGVXcmFwcGVyV2lkdGg6IG51bWJlcjtcblxuICAgIHRhYmxlV3JhcHBlckxlZnQ6IG51bWJlcjtcblxuICAgIGlzRnJlZXplUm93OiBib29sZWFuO1xuXG4gICAgaXNGcmVlemVDb2x1bW46IGJvb2xlYW47XG5cbiAgICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgdGJvZHlOYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGJvZHlFbGVtZW50Py5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ3RhYmxlV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgdGFibGVXcmFwcGVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ3RoZVRhYmxlJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0aGVUYWJsZUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCd0Ym9keScsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgdGJvZHlFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgndGFibGVSb3dDb250cm9sc1dyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICB0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb2x1bW5Db250cm9sc1dyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBjb2x1bW5Db250cm9sc1dyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29ybmVyQ29udHJvbCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvcm5lckNvbnRyb2w6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgncm93Q29udHJvbHNJbm5lcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHJvd0NvbnRyb2xzSW5uZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyUm93TGVmdFNoYWRvdycsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGhlYWRlclJvd0xlZnRTaGFkb3c6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyUm93UmlnaHRTaGFkb3cnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBoZWFkZXJSb3dSaWdodFNoYWRvdzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb2xncm91cCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvbGdyb3VwOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3Jvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcjogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICAgIGdldE91dGxldFBhcmVudCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfTtcblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyQ2hpbGRyZW5WaWV3VXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJSb3dDb250cm9sc1VwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB0aGlzLmlzRnJlZXplUm93ID0gdGhpcy5mcmVlemVSb3dQaXBlLnRyYW5zZm9ybSh0aGlzLmVsZW1lbnQsIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuaXNGcmVlemVDb2x1bW4gPSB0aGlzLmZyZWV6ZUNvbHVtblBpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMsIHRoaXMudGFibGVXcmFwcGVyV2lkdGgpO1xuICAgICAgICAgICAgdGhpcy5nZXRJc0luVGFibGUoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29sQ29udHJvbHMoKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuZWxlbWVudC5jb2x1bW5zO1xuICAgICAgICAgICAgLy8g5Y+z6ZSu6I+c5Y2V5Lit5pyJ6L6T5YWl5qGG77yM5Li65LqG6YG/5YWN6IGa54Sm5Yiw6L6T5YWl5qGG6Kem5Y+R5Y+z6ZSu6I+c5Y2V5YWz6Zet77yM6ZyA6KaB5aKe5YqgIHRoaXMuZWRpdG9yLnNlbGVjdGlvbiDmnaHku7ZcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvci5zZWxlY3Rpb24gJiYgIXRoaXMuaXNJblRhYmxlICYmIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNFeGlzdFNlbGVjdGVkQ2VsbCAmJiB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDpnIDopoHnrYnlvoXlhoXlrrnmm7TmlrDlkI7vvIzmiY3lj6/ku6XmiafooYwgdXNlUm93Q29udHJvbHPvvIzlkKbliJnojrflj5bnmoTpq5jluqblj6/og73kuI3mraPnoa5cbiAgICBhZnRlckNoaWxkcmVuVmlld1VwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLmVtaXRUYWJsZUNoYW5nZSgpO1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2V0U2VsZWN0ZWRDb2x1bW5zQW5kUm93SW5kZXgoKTtcbiAgICAgICAgdGhpcy5zZXRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgfVxuXG4gICAgLy8g6ZyA6KaB562J562J5b6FIHJvdyBjb250cm9scyDmuLLmn5PlkI7vvIzmoIfpopjooYzlm7rlrprpnIDopoHorr7nva4gZmlyc3Qgcm93IGNvbnRyb2wg55qE5bGe5oCnXG4gICAgYWZ0ZXJSb3dDb250cm9sc1VwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zZXRUYWJsZUhlYWRlclN0eWxlKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBldmVudERpc3BhdGNoZXI6IFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgcHVibGljIHJlc2l6ZU5vdGlmaWVyOiBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSxcbiAgICAgICAgcHVibGljIHRhYmxlU3RvcmU6IFRhYmxlU3RvcmUsXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyB0YWJsZVNlcnZpY2U6IFRhYmxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0aGVUYWJsZUNvbnRleHRNZW51U2VydmljZTogVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZnJlZXplQ29sdW1uUGlwZTogVGFibGVGcmVlemVDb2x1bW5QaXBlLFxuICAgICAgICBwdWJsaWMgZnJlZXplUm93UGlwZTogVGFibGVGcmVlemVSb3dQaXBlLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IFRoZUNvbnRleHRTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFRIRV9NT0RFX1RPS0VOKVxuICAgICAgICBwcml2YXRlIGNvbmZpZzogVGhlTW9kZUNvbmZpZ1xuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmlzTW9iaWxlTW9kZSA9IGlzTW9iaWxlTW9kZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMuZ2V0Q29sQ29udHJvbHMoKTtcbiAgICAgICAgdGhpcy5nZXRJc0luVGFibGUoKTtcbiAgICAgICAgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMgPSBnZXRQbHVnaW5PcHRpb25zPFRoZVBsdWdpblRhYmxlT3B0aW9uPih0aGlzLmVkaXRvciwgUGx1Z2luS2V5cy50YWJsZSk7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5zaG93RnVsbHNjcmVlbiAmJiB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5mdWxsc2NyZWVuQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9uc1xuICAgICAgICAgICAgICAgIC5mdWxsc2NyZWVuQWN0aW9uKHRoaXMuZWRpdG9yKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LmVsZW1lbnQgPT09IHRoaXMuZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIG1hcChjb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LnN0YXRlID09PSAnb2ZmJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNTY3JvbGxDb250YWluZXIgPSB0aGlzLmVkaXRvci5vcHRpb25zLnNjcm9sbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyID0gREVGQVVMVF9TQ1JPTExfQ09OVEFJTkVSO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3Iub3B0aW9ucy5zY3JvbGxDb250YWluZXIgPSB0aGlzLnByZXZpb3VzU2Nyb2xsQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnJlYmluZENvbnRhaW5lclNjcm9sbCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLnNlbGVjdGVkQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShjZWxscyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzID0gY2VsbHM7XG4gICAgICAgICAgICAgICAgaWYgKCFjZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGVkQWxsQ2VsbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YWJsZVBsdWdpbk9wdGlvbnMuZGVzZWxlY3QgJiYgdHlwZW9mIHRoaXMudGFibGVQbHVnaW5PcHRpb25zLmRlc2VsZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5kZXNlbGVjdCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTZXJ2aWNlLmlzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5jbG9zZVRvb2xiYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZWxlY3RlZEFsbENlbGwgPSBpc1NlbGVjdGVkQWxsQ2VsbCh0aGlzLmVkaXRvciwgdGhpcy50YWJsZVN0b3JlLmdldFNlbGVjdGVkQ2VsbFBvc2l0aW9ucygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgIT09IFRoZU1vZGUucHJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuZWxlbWVudC5jb2x1bW5zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0V3JhcHBlcldpZHRoQW5kTGVmdCgpIHtcbiAgICAgICAgY29uc3QgeyBsZWZ0LCB3aWR0aCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLnRhYmxlV3JhcHBlcldpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMudGFibGVXcmFwcGVyTGVmdCA9IGxlZnQ7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaW5pdEVkaXRvcih0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrQ2FyZEVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnc2xhdGUtYmxvY2stY2FyZCcpO1xuICAgICAgICAgICAgaWYgKGJsb2NrQ2FyZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBibG9ja0NhcmRFbGVtZW50LmNsYXNzTGlzdC5hZGQoYHNsYXRlLWJsb2NrLWNhcmQtJHt0aGlzLmVsZW1lbnQudHlwZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyQ2VsbENsYXNzKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRJbWFnZURvbmUgPSBhd2FpdCB0aGlzLnJlc29sdmVJbWFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyDnrYnlvoXluo/lj7fliJfooajmoLzlhoXlm77niYfliqDovb3lrozmiJDlkI7lho3ljrvmuLLmn5PooajmoLzooYzpq5jluqZcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRJbWFnZURvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzUHJpbnRNb2RlID0gdGhpcy5jb25maWcubW9kZSA9PT0gVGhlTW9kZS5wcmludDtcbiAgICAgICAgICAgIHRoaXMuZ2V0V3JhcHBlcldpZHRoQW5kTGVmdCgpO1xuICAgICAgICAgICAgaWYgKGlzUHJpbnRNb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gY2FsY1ByaW50Q29sdW1uV2lkdGgodGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNGcmVlemVSb3cgPSB0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5pc0ZyZWV6ZUNvbHVtbiA9IHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucywgdGhpcy50YWJsZVdyYXBwZXJXaWR0aCk7XG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlckNvbHVtblN0aWNreUNlbGxDbGFzcygpO1xuICAgICAgICAgICAgdGhpcy5zZXRUYWJsZVJpZ2h0U2hhZG93KCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxQb3NpdGlvbkNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5PblNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuS2V5ZG93bkV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblNlbGVjdHN0YXJ0RXZlbnQoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuVGFibGVDb250ZXh0TWVudUV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblRhYmxlV3JhcHBlclNjcm9sbCgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVTY3JvbGxDb250YWluZXJTY3JvbGwodGhpcy50YWJsZVdyYXBwZXJMZWZ0KTtcblxuICAgICAgICAgICAgaWYgKGlzUHJpbnRNb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2UodGhpcy5jb250ZXh0U2VydmljZS5jb250YWluZXJSZXNpemVkJCwgdGhpcy5jb250ZXh0U2VydmljZS53aW5kb3dSZXNpemVkJClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0V3JhcHBlcldpZHRoQW5kTGVmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RpY2t5RWxlbWVudExlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnRoZUVkaXRvclJlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC53aWR0aENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0V3JhcHBlcldpZHRoQW5kTGVmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHcmlkQ29sdW1uc1N0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgLyog57uZ5qCH6aKY6KGM55qE5bemL+WPs+WKoOmYtOW9sSAqL1xuICAgIHNldEhlYWRlclJvd1NoYWRvdygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGcmVlemVSb3cpIHtcbiAgICAgICAgICAgIC8vIOWbuuWumuagh+mimOihjOmBruebllxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWZ0U2hhZG93IHx8IHRoaXMuaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgICAgIGxldCB7IGhlaWdodCwgdG9wIH0gPSB0aGlzLmNhbGNIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JpZ2h0U2hhZG93ICYmIHRoaXMuaGVhZGVyUm93UmlnaHRTaGFkb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93UmlnaHRTaGFkb3cgPSB0aGlzLmhlYWRlclJvd1JpZ2h0U2hhZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93UmlnaHRTaGFkb3csICdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dSaWdodFNoYWRvdywgJ3RvcCcsIGAke3RvcH1weGApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvd1JpZ2h0U2hhZG93LCAnbGVmdCcsIGAke3RoaXMudGFibGVXcmFwcGVyTGVmdCArIHRoaXMudGFibGVXcmFwcGVyV2lkdGggLSA4fXB4YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTGVmdFNoYWRvdyAmJiB0aGlzLmhlYWRlclJvd0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93TGVmdFNoYWRvdyA9IHRoaXMuaGVhZGVyUm93TGVmdFNoYWRvdy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvd0xlZnRTaGFkb3csICdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93TGVmdFNoYWRvdywgJ2xlZnQnLCBgJHt0aGlzLnRhYmxlV3JhcHBlckxlZnQgKyB0aGlzLmdldENvbENvbnRyb2xCdXR0b25XaWR0aCgpfXB4YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FsY0hlYWRlclJvd1NoYWRvdygpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gY2FsY3VsYXRlSGVhZGVyUm93SGVpZ2h0KHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gaGVhZGVyUm93SGVpZ2h0O1xuICAgICAgICAvLyDpu5jorqTvvIjmsqHmnInogZrnhKbvvInnmoQgdG9wIOWAvO+8mua7muWKqOWuueWZqOmrmOW6piArIOihqOagvOeahHBhZGRpbmfvvIg477yJXG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArIFRBQkxFX1BBRERJTkc7XG4gICAgICAgIC8vIOiBmueEpuWcqOihqOagvOS4re+8miDpq5jluqYgKyBjb250cm9s77yIMTHvvInvvIx0b3Ag5Yqg5LiA5LiqIG1hc2vvvIgxOe+8iVxuICAgICAgICBpZiAodGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodCArIFRBQkxFX0NPTlRST0w7XG4gICAgICAgICAgICB0b3AgPSB0b3AgKyBUQUJMRV9JTlNFUlRfTUFTSyAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaGVpZ2h0LCB0b3AgfTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVTY3JvbGxDb250YWluZXJTY3JvbGwodGFibGVXcmFwcGVyTGVmdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY29udGFpbmVyU2Nyb2xsZWQkXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGVudGlyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBldmVudCwgZGlyZWN0aW9uIH0gPSBlbnRpcmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLlgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsZWRYT2ZTY3JvbGxDb250YWluZXIgPSB0YWJsZVdyYXBwZXJMZWZ0ICE9PSBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVXcmFwcGVyTGVmdCA9IGxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0aWNreUVsZW1lbnRMZWZ0U3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5ZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJUb3AgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50UmVjdCA9ICh0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJUb3BIZWlnaHQgPSB0aGlzLmlzSW5UYWJsZSA/IC0xOSA6IDExO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvd0hlaWdodCA9IGNhbGN1bGF0ZVJvd0NvbnRyb2xzKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpWzBdPy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wID0gY2xpZW50UmVjdC50b3AgKyBoZWFkZXJUb3BIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreVRvcCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA8PSB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArIDggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UmVjdC5ib3R0b20gLSB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCA+PSBoZWFkZXJSb3dIZWlnaHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0ZyZWV6ZVJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmoIfpopjooYzlhoXlrrnotoXov4flm7rlrprpq5jluqbml7bnp7vpmaTlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhIZWFkZXJSb3dIZWlnaHQgPSAoMjQgKyA4KSAqIDExOyAvLyDotoXlh7ogMTEg6KGM77yM5Y+W5raI5Ya757uTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBoZWFkZXJSb3dIZWlnaHQgPD0gbWF4SGVhZGVyUm93SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RpY2t5VG9wO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhcHBseUhlYWRlckNlbGxDbGFzcyhpc0hlYWRlckNlbGw6IGJvb2xlYW4sIGNlbGw6IFRhYmxlQ2VsbEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgY2VsbCk7XG4gICAgICAgIGlmIChpc0hlYWRlckNlbGwgJiYgIW5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNIZWFkZXJDZWxsICYmIG5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MobmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFRhYmxlSGVhZGVyU3R5bGUoKSB7XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ2VsbENsYXNzKCk7XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ29sdW1uU3RpY2t5Q2VsbENsYXNzKCk7XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U3R5bGUoKTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJDZWxsQ2xhc3MoKSB7XG4gICAgICAgIGNvbnN0IGlzSGVhZGVyQ29sdW1uID0gdGhpcy5lbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtbiB8fCBmYWxzZTtcbiAgICAgICAgLy8gaGVhZGVyIGNvbHVtbiBjZWxsc1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlIZWFkZXJDZWxsQ2xhc3MoaXNIZWFkZXJDb2x1bW4sIGl0ZW0uY2hpbGRyZW5bMF0sIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGhlYWRlciByb3cgY2VsbHNcbiAgICAgICAgY29uc3QgaXNIZWFkZXJSb3cgPSBoYXNIZWFkZXJSb3codGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgaXNIZWFkZXJDZWxsID0gaW5kZXggPT09IDAgPyBpc0hlYWRlclJvdyB8fCBpc0hlYWRlckNvbHVtbiA6IGlzSGVhZGVyUm93O1xuICAgICAgICAgICAgdGhpcy5hcHBseUhlYWRlckNlbGxDbGFzcyhpc0hlYWRlckNlbGwsIGl0ZW0sIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyQ29sdW1uU3RpY2t5Q2VsbENsYXNzKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIHN0aWNreSBjZWxsXG4gICAgICAgICAgICB0aGlzLmFwcGx5SGVhZGVyQ2VsbENsYXNzKHRoaXMuaXNGcmVlemVDb2x1bW4sIGl0ZW0uY2hpbGRyZW5bMF0sIFNUSUNLWV9DRUxMX0NMQVNTKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyUm93U3R5bGUoKSB7XG4gICAgICAgIHRoaXMuc2V0R3JpZENvbHVtbnNTdHlsZSgpO1xuICAgICAgICB0aGlzLnNldFN0aWNreVJvd1N0eWxlKCk7XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgIHRoaXMuc2V0U3RpY2t5RWxlbWVudExlZnRTdHlsZSgpO1xuICAgIH1cblxuICAgIHNldEdyaWRDb2x1bW5zU3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5pc0ZyZWV6ZVJvdykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gKHRoaXMudGJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBoYXNDb2x1bW5zID0gdGhpcy5lbGVtZW50Py5jb2x1bW5zICYmIHRoaXMuY29sZ3JvdXA/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgY2VsbHNXaWR0aCA9IFtdO1xuICAgICAgICAgICAgbGV0IGdyaWRDb2x1bW5zID0gJyc7XG4gICAgICAgICAgICBsZXQgY29sQ29udHJvbEdyaWRDb2x1bW5zID0gJyc7XG4gICAgICAgICAgICBpZiAoaGFzQ29sdW1ucykge1xuICAgICAgICAgICAgICAgIGNlbGxzV2lkdGggPSBnZXRDb2x1bW5zV2lkdGgodGhpcy5jb2xncm91cC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBncmlkQ29sdW1ucyA9IGdldEdyaWRDb2x1bW5zKGhlYWRlclJvdywgY2VsbHNXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29sQ29udHJvbEdyaWRDb2x1bW5zID0gZ2V0R3JpZENvbHVtbnMoXG4gICAgICAgICAgICAgICAgICAgIGNvbENvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudD8uY29sdW1ucy5tYXAoaXRlbSA9PiBpdGVtLndpZHRoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGxzV2lkdGggPSBnZXRDb2x1bW5zV2lkdGgoaGVhZGVyUm93KTtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZENvbHVtbnMgPSBnZXRHcmlkQ29sdW1ucyhoZWFkZXJSb3csIGNlbGxzV2lkdGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkNvdW50ID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyY2VudCA9ICsoMTAwIC8gY29sdW1uQ291bnQpLnRvRml4ZWQoNCk7XG4gICAgICAgICAgICAgICAgICAgIGNlbGxzV2lkdGggPSBuZXcgQXJyYXkoY29sdW1uQ291bnQpLmZpbGwocGVyY2VudCk7XG4gICAgICAgICAgICAgICAgICAgIGdyaWRDb2x1bW5zID0gZ2V0R3JpZENvbHVtbnMoaGVhZGVyUm93LCBjZWxsc1dpZHRoLCAnJScpO1xuICAgICAgICAgICAgICAgICAgICBjb2xDb250cm9sR3JpZENvbHVtbnMgPSBnZXRHcmlkQ29sdW1ucyhjb2xDb250cm9sLCBnZXRDb2x1bW5zV2lkdGgoY29sQ29udHJvbCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUGFkZGluZyA9IDQ0O1xuICAgICAgICAgICAgLy8g5bqP5Y+35YiX5a2Y5Zyo5pe2LCDooajmoLzlrr3luqbliqDluo/lj7fliJflrr3luqZcbiAgICAgICAgICAgIC8vIOWPquivu+aooeW8j+S4iywg6KGo5qC85a695bqm5LiN5Y+YXG4gICAgICAgICAgICBjb25zdCB0YWJsZVdpZHRoID1cbiAgICAgICAgICAgICAgICAhdGhpcy5yZWFkb25seSAmJiB0aGlzLmVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uID8gdGhpcy50YWJsZVdyYXBwZXJXaWR0aCAtIHRhYmxlUGFkZGluZyA6IHRoaXMudGFibGVXcmFwcGVyV2lkdGg7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvdywgJ3dpZHRoJywgdGFibGVXaWR0aCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3csICdncmlkLXRlbXBsYXRlLWNvbHVtbnMnLCBncmlkQ29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbENvbnRyb2wsICd3aWR0aCcsIHRhYmxlV2lkdGggKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29sQ29udHJvbCwgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsIGNvbENvbnRyb2xHcmlkQ29sdW1ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTdGlja1Jvd0VsZW1lbnRzKCkge1xuICAgICAgICBjb25zdCBmaXJzdEhlYWRlclJvdyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keSB0cicpO1xuICAgICAgICBjb25zdCBjb2x1bW5Db250cm9sc1dyYXBwZXIgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB0YWJsZUNvcm5lckNvbnRyb2wgPSB0aGlzLmNvcm5lckNvbnRyb2wubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbElubmVyID0gdGhpcy5yb3dDb250cm9sc0lubmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGZpcnN0Um93Q29udHJvbEJ1dHRvbjogbnVsbCB8IEhUTUxFbGVtZW50ID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3RcbiAgICAgICAgICAgID8gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3QubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICByZXR1cm4geyBmaXJzdEhlYWRlclJvdywgY29sdW1uQ29udHJvbHNXcmFwcGVyLCB0YWJsZUNvcm5lckNvbnRyb2wsIHJvd0NvbnRyb2xJbm5lciwgZmlyc3RSb3dDb250cm9sQnV0dG9uIH07XG4gICAgfVxuXG4gICAgc2V0U3RpY2t5Um93U3R5bGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnJlZXplUm93KSB7XG4gICAgICAgICAgICBjb25zdCB7IGZpcnN0SGVhZGVyUm93LCBjb2x1bW5Db250cm9sc1dyYXBwZXIsIHRhYmxlQ29ybmVyQ29udHJvbCwgcm93Q29udHJvbElubmVyLCBmaXJzdFJvd0NvbnRyb2xCdXR0b24gfSA9XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTdGlja1Jvd0VsZW1lbnRzKCk7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJlZENvbHVtbiA9IHRoaXMuZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW47XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvd0hlaWdodCA9IGNhbGN1bGF0ZUhlYWRlclJvd0hlaWdodCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgVGFibGVXaXRoU3RpY2t5Um93Q2xhc3MpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Um93U2Nyb2xsTGVmdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuaXNJblRhYmxlID8gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAzNiA6IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZmlyc3RIZWFkZXJSb3csICd0b3AnLCB0b3AgKyAncHgnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGZpcnN0SGVhZGVyUm93LCAnaGVpZ2h0JywgYCR7aGVhZGVyUm93SGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJblRhYmxlIHx8IG51bWJlcmVkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5Db250cm9sc1dyYXBwZXIsIHRhYmxlQ29ybmVyQ29udHJvbF0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RSb3dDb250cm9sQnV0dG9uICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZmlyc3RSb3dDb250cm9sQnV0dG9uLCAndG9wJywgdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAncHgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5LyY5YyW77yadGFibGUg55qEIHBhZGRpbmctdG9wIOW6lOivpeWKqOaAgeWPmOWMlu+8iOS4jumYtOW9seWQjOWPmO+8iVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlUGFkZGluZ1RvcCA9IGhlYWRlclJvd0hlaWdodCArIDExOyAvLyDmoIfpopjooYzpq5ggKyBjdHJsIGJ0bu+8iDExcHjvvInpq5jluqZcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdwYWRkaW5nLXRvcCcsIHRhYmxlUGFkZGluZ1RvcCArICdweCcpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbElubmVyLCAncGFkZGluZy10b3AnLCB0YWJsZVBhZGRpbmdUb3AgKyAncHgnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsIFRhYmxlV2l0aFN0aWNreVJvd0NsYXNzKTtcbiAgICAgICAgICAgICAgICBbZmlyc3RIZWFkZXJSb3csIGNvbHVtbkNvbnRyb2xzV3JhcHBlciwgdGFibGVDb3JuZXJDb250cm9sXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAndG9wJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAncGFkZGluZy10b3AnLCBudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xJbm5lciwgJ3BhZGRpbmctdG9wJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgZmlyc3RSb3dDb250cm9sQnV0dG9uICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZmlyc3RSb3dDb250cm9sQnV0dG9uLCAndG9wJywgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoYWRTdGlja1Jvd0NsYXNzID0gdGhpcy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhUYWJsZVdpdGhTdGlja3lSb3dDbGFzcyk7XG4gICAgICAgICAgICBpZiAoaGFkU3RpY2tSb3dDbGFzcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlyc3RIZWFkZXJSb3csIGNvbHVtbkNvbnRyb2xzV3JhcHBlciwgdGFibGVDb3JuZXJDb250cm9sLCByb3dDb250cm9sSW5uZXIsIGZpcnN0Um93Q29udHJvbEJ1dHRvbiB9ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTdGlja1Jvd0VsZW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsIFRhYmxlV2l0aFN0aWNreVJvd0NsYXNzKTtcbiAgICAgICAgICAgICAgICBbZmlyc3RIZWFkZXJSb3csIGNvbHVtbkNvbnRyb2xzV3JhcHBlciwgdGFibGVDb3JuZXJDb250cm9sXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAndG9wJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAncGFkZGluZy10b3AnLCBudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xJbm5lciwgJ3BhZGRpbmctdG9wJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgZmlyc3RSb3dDb250cm9sQnV0dG9uICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZmlyc3RSb3dDb250cm9sQnV0dG9uLCAndG9wJywgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUYWJsZVNjcm9sbGluZ1NoYWRvdygpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5zZXRUYWJsZUxlZnRTaGFkb3coc2Nyb2xsTGVmdCk7XG4gICAgICAgIHRoaXMuc2V0VGFibGVSaWdodFNoYWRvdyhzY3JvbGxMZWZ0KTtcbiAgICB9XG5cbiAgICBzZXRUYWJsZUxlZnRTaGFkb3coc2Nyb2xsTGVmdCA9IDApIHtcbiAgICAgICAgdGhpcy5pc0xlZnRTaGFkb3cgPSBzY3JvbGxMZWZ0ID4gMDtcbiAgICAgICAgbGV0IGVsZW1lbnRzOiBFbGVtZW50W10gPSBbdGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50XTtcbiAgICAgICAgaWYgKHRoaXMuaXNGcmVlemVDb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYHRyYCk7XG4gICAgICAgICAgICBjb25zdCBzdGlja3lDZWxscyA9IEFycmF5LmZyb20ocm93cykubWFwKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5xdWVyeVNlbGVjdG9yKCd0aC50aGUtdGFibGUtY29sLWNvbnRyb2wnKSB8fCBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3RkLnNsYXRlLWVsZW1lbnQtdGFibGUtY2VsbCcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZWxlbWVudHMgPSBzdGlja3lDZWxscztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aGUtdGFibGUtbGVmdC1zaGFkb3cnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3RoZS10YWJsZS1sZWZ0LXNoYWRvdycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUYWJsZVJpZ2h0U2hhZG93KHNjcm9sbExlZnQgPSAwKSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzY3JvbGxXaWR0aCA9IG5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IGNsaWVudFdpZHRoID0gbmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgdGhpcy5pc1JpZ2h0U2hhZG93ID0gc2Nyb2xsTGVmdCArIGNsaWVudFdpZHRoIDwgc2Nyb2xsV2lkdGg7XG4gICAgICAgIGlmICh0aGlzLmlzUmlnaHRTaGFkb3cpIHtcbiAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aGUtdGFibGUtcmlnaHQtc2hhZG93Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndGhlLXRhYmxlLXJpZ2h0LXNoYWRvdycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlQ2VsbFBvc2l0aW9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5jZWxsc1Bvc2l0aW9uQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuZGFuZ2Vyb3VzT3JTZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVzZVJvd0NvbnRyb2xzKCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5zZWxlY3Rpb24gJiYgIXRoaXMucmVhZG9ubHkpIHx8XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIHx8XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nIHx8XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNGb2N1c2VkSW5wdXRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJvd0NvbnRyb2xzID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXRlY3RDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZUltYWdlKCkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgICAgICBpZiAoaW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUmVzb2x2ZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUxvYWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbWFnZVJlc29sdmVzLnB1c2goaW1hZ2VMb2FkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGltYWdlUmVzb2x2ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbHMoKSB7XG4gICAgICAgIHRoaXMuY29sQ29udHJvbHMgPSB0aGlzLmVsZW1lbnQ/LmNoaWxkcmVuWzBdPy5jaGlsZHJlbiB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXRJc0luVGFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5lZGl0b3Iuc2VsZWN0aW9uO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24odGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKHRoaXMuZWRpdG9yLCBzZWxlY3Rpb24uZm9jdXMucGF0aCk7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IHN0YXJ0UG9zaXRpb24uaXNJblRhYmxlKCkgJiYgZW5kUG9zaXRpb24uaXNJblRhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY29sdW1ucykge1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IFtdO1xuICAgICAgICAgICAgdGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdjb2wnKS5mb3JFYWNoKChlbGU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKHsgd2lkdGg6IGVsZS5vZmZzZXRXaWR0aCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRWRpdG9yIGNvbnRhaW5lciB3aWR0aCBjaGFuZ2VzLCByZXN1bHRpbmcgaW4gY29sdW1uIHdpZHRocyBubyBsb25nZXIgdmFsaWQgI1dJSy02NzY2XG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nID0gdGhpcy5lbGVtZW50LmNvbHVtbnMuc29tZSgoY29sLCBpbmRleCkgPT4gY29sLndpZHRoICE9PSBjb2x1bW5zW2luZGV4XT8ud2lkdGgpO1xuICAgICAgICAgICAgaWYgKHdhcm5pbmcpIHtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdHIgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW5bMF0gYXMgVGFibGVSb3dFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRyLmNoaWxkcmVuLm1hcChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy50YWJsZVdyYXBwZXJXaWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0aWFsaXplUm93cygpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHJvdyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybVJvd0hlaWdodChyb3dJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJvd0VsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuY2hpbGRyZW47XG4gICAgICAgIGlmIChyb3dFbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbLi4ucm93RWxlbWVudHNdIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRbXTtcbiAgICAgICAgICAgIGNvbnN0IG9wZXJhdGVSb3cgPSBlbGVtZW50c1tyb3dJbmRleF07XG5cbiAgICAgICAgICAgIGlmIChvcGVyYXRlUm93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChvcGVyYXRlUm93KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHRoaXMuZWxlbWVudC5jaGlsZHJlbltyb3dJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtQ29sdW1uc1dpZHRoKCkge1xuICAgICAgICBjb25zdCBjb2xzID0gWy4uLnRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdjb2xncm91cCcpLmNoaWxkcmVuXSBhcyBIVE1MVGFibGVDb2xFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IFRoZVRhYmxlQ29sdW1uW10gPSBjb2xzLm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IGdldEVsZW1lbnRXaWR0aChjb2wpIH07XG4gICAgICAgIH0pO1xuICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIG9uQ29sTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoISF0aGlzLnNlbGVjdGlvbiAmJiB0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyRGFuZ2Vyb3VzQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDb2x1bW4odGhpcy5lZGl0b3IsIGluZGV4LCBldmVudCk7XG4gICAgICAgICAgICBpZiAodGhpcy50YWJsZVBsdWdpbk9wdGlvbnMuY29sU2VsZWN0ICYmIHR5cGVvZiB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5jb2xTZWxlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5jb2xTZWxlY3QodGhpcy5lZGl0b3IsIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzOiB0aGlzLnNlbGVjdGVkQ2VsbHNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCwgdGhpcy5pc01vYmlsZU1vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Sb3dNb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghdGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBUaGVFZGl0b3IuZmluZFBhdGgodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdFJvdyh0aGlzLmVkaXRvciwgaW5kZXgsIGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMudGFibGVQbHVnaW5PcHRpb25zLnJvd1NlbGVjdCAmJiB0eXBlb2YgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMucm93U2VsZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5yb3dTZWxlY3QodGhpcy5lZGl0b3IsIHtcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBjZWxsczogdGhpcy5zZWxlY3RlZENlbGxzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5hZnRlclNlbGVjdGVkQ2VsbHMoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLmVsZW1lbnQsIHRoaXMuaXNNb2JpbGVNb2RlKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdFRhYmxlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0VGFibGUodGhpcy5lZGl0b3IsIGV2ZW50Lm1ldGFLZXkpO1xuICAgICAgICBpZiAodGhpcy50YWJsZVBsdWdpbk9wdGlvbnMudGFibGVTZWxlY3QgJiYgdHlwZW9mIHRoaXMudGFibGVQbHVnaW5PcHRpb25zLnRhYmxlU2VsZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy50YWJsZVNlbGVjdCh0aGlzLmVkaXRvciwgeyB0YWJsZTogdGhpcy5lbGVtZW50IH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCwgdGhpcy5pc01vYmlsZU1vZGUpO1xuICAgIH1cblxuICAgIGxpc3RlblRhYmxlQ29udGV4dE1lbnVFdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdjb250ZXh0bWVudScpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVOb2RlKHRoaXMuZWRpdG9yLCBjZWxsKSBhcyBUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKHRoaXMuZWRpdG9yLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgRWRpdG9yLnN0YXJ0KHRoaXMuZWRpdG9yLCBwYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZC1jZWxsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbChjZWxsLCB0aGlzLmVkaXRvciwgZXZlbnQubWV0YUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTW9iaWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZUNvbnRleHRNZW51KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRhYmxlU2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZVRvb2xiYXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhdGNoIGZvciByaWdodCBjbGljayBzZWxlY3QgbmV4dCBjZWxsXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QodGhpcy5lZGl0b3IsIEVkaXRvci5zdGFydCh0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5PblNlbGVjdGVkQ2VsbHMoKSB7XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2Vkb3duJykucGlwZShmaWx0ZXIoKGU6IE1vdXNlRXZlbnQpID0+IGUuYnV0dG9uICE9PSAyKSksXG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJykucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc1ZpcnR1YWxLZXkoZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29sb3JJbnB1dChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNGb2N1c2VkSW5wdXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbG9yUGFuZWwoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxsUG9zaXRpb25zID0gdGhpcy50YWJsZVN0b3JlLmdldFNlbGVjdGVkQ2VsbFBvc2l0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkQ2VsbFBvc2l0aW9ucz8ubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgJiYgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3IuY2xlYXJDZWxsc0NvbnRlbnQodGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRUYWJsZUVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50IHx8ICghZS5tZXRhS2V5ICYmICFlLnNoaWZ0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhckxhc3RGb2N1c1BhdGgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5jbG9zZUNvbnRleHRNZW51KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5LZXlkb3duRXZlbnQoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gISFlICYmICF0aGlzLnJlYWRvbmx5KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5SG90a2V5KCdtb2QnLCBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmhhbmRsZUtleWRvd25Gb3JQb2ludGVyU2VsZWN0aW9uKGUsIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0tleUhvdGtleSgnc2hpZnQnLCBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmhhbmRsZUtleWRvd25Gb3JBcmVhU2VsZWN0aW9uKGUsIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWkhOeQhuWNleWFg+agvOWGhSBzaGlmdCArIHVwL2Rvd24vbGVmdC9yaWdodCDooYzkuLpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVTZWxlY3Rpb25Gcm9tQ2VsbCh0aGlzLmVkaXRvciwgZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOinpuWPkeS4iuS4i+W3puWPs+mUruaXtu+8jOa4hemZpOmAieS4reeahOWNleWFg+agvFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5SG90a2V5KFsndXAnLCAnZG93bicsICdsZWZ0JywgJ3JpZ2h0J10sIGUpICYmIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxscz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhclNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxpc3RlblNlbGVjdHN0YXJ0RXZlbnQoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudDxFdmVudD4oZG9jdW1lbnQsICdzZWxlY3RzdGFydCcpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLnNlbGVjdFN0YXJ0UHJldmVudERlZmF1bHQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRTdGlja3lSb3dQb2ludGVyRXZlbnRzKHBvaW50ZXJFdmVudHNTdHlsZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZyZWV6ZVJvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcbiAgICAgICAgZm9yIChjb25zdCBzdGlSb3cgb2Ygc3RpY2t5Um93cykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShzdGlSb3csICdwb2ludGVyLWV2ZW50cycsIHBvaW50ZXJFdmVudHNTdHlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0ZW5UYWJsZVdyYXBwZXJTY3JvbGwoKSB7XG4gICAgICAgIGxldCB0aW1lcjtcbiAgICAgICAgZnJvbUV2ZW50KHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICd3aGVlbCcsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8g5aSE55CG5qCH6aKY6KGM5Zu65a6a5pe255qE5rua5Yqo6Lef6ZqPXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dQb2ludGVyRXZlbnRzKCdub25lJyk7XG4gICAgICAgICAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMoJ2F1dG8nKTtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBmcm9tRXZlbnQodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRhYmxlU2Nyb2xsaW5nU2hhZG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGlja3lSb3dTY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZVN0aWNreVJvd1Njcm9sbExlZnQoKSB7XG4gICAgICAgIC8vIOWIpOaWreaYr+WQpuWHuueOsOWbuuWumuagh+mimOihjFxuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGUtc3RpY2t5LXJvdycpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdGlSb3cgb2Ygc3RpY2t5Um93cykge1xuICAgICAgICAgICAgICAgIC8vIOS/ruWkjeiOt+WPliBzY3JvbGxMZWZ0IOWxnuaAp+W8lei1t+eahOa1j+iniOWZqOmHjee7mO+8jOWvvOiHtOi3s+WKqOmXrumimCAjV0lLLTExMDM4XG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8g5ZCM5q2l5rua5Yqo54q25oCB5YiwIC50aGUtc3RpY2t5LXJvd1xuICAgICAgICAgICAgICAgICAgICBzdGlSb3cuc2Nyb2xsTGVmdCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICog57yW6L6R5Zmo5rua5Yqo5a655Zmo5Ye6546w5bem5Y+z5rua5Yqo5pe2XG4gICAgICovXG4gICAgc2V0U3RpY2t5RWxlbWVudExlZnRTdHlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGcmVlemVSb3cpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvcm5lckNvbnRyb2wgPSB0aGlzLmNvcm5lckNvbnRyb2wubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0NvbnRyb2wgPSB0aGlzLnJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlci5maXJzdD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuaXNJblRhYmxlID8gLVRBQkxFX0NPTlRST0wgOiAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3AgJiYgdGhpcy5pc1Njcm9sbGVkWE9mU2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgc3RpY2t5Um93cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdsZWZ0JywgYCR7dGhpcy50YWJsZVdyYXBwZXJMZWZ0ICsgdGhpcy5nZXRDb2xDb250cm9sQnV0dG9uV2lkdGgoKX1weGApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29ybmVyQ29udHJvbCwgJ2xlZnQnLCBgJHt0aGlzLnRhYmxlV3JhcHBlckxlZnQgKyBidWZmZXJ9cHhgKTtcbiAgICAgICAgICAgICAgICByb3dDb250cm9sICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbCwgJ2xlZnQnLCBgJHt0aGlzLnRhYmxlV3JhcHBlckxlZnQgKyBidWZmZXJ9cHhgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5RWxlbWVudHMgPSBbLi4uc3RpY2t5Um93cywgY29ybmVyQ29udHJvbCwgcm93Q29udHJvbF07XG4gICAgICAgICAgICAgICAgc3RpY2t5RWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdsZWZ0JywgbnVsbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDb2xDb250cm9sQnV0dG9uV2lkdGggPSAoKSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgICByZXN1bHQgKz0gdGhpcy5lbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbiA/IFRBQkxFX05VTUJFUl9DT0xVTU4gOiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB0cmFja0J5Rm5Sb3dDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICB0cmFja0J5Rm5Db2xDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuY2xvc2VUb29sYmFyKCk7XG4gICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29udGFpbmVyXCIgdGhlQ29sdW1uUmVzaXplPlxuICA8ZGl2ICN0YWJsZVJvd0NvbnRyb2xzV3JhcHBlciBjbGFzcz1cInRoZS10YWJsZS1yb3ctY29udHJvbHMtd3JhcHBlclwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9sc1wiXG4gICAgICAjY29ybmVyQ29udHJvbFxuICAgICAgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICB2aXNpYmxlOiAhcmVhZG9ubHkgJiYgKGlzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZyB8fCB0YWJsZVN0b3JlLmlzRm9jdXNlZElucHV0KSxcbiAgICAgICAgJ2NvbnRyb2wtYWN0aXZlJzogaXNTZWxlY3RlZEFsbENlbGwsXG4gICAgICAgIGRhbmdlcm91czogdGFibGVTdG9yZS5pc1NlbGVjdGVkVGFibGUgJiYgdGFibGVTdG9yZS5kYW5nZXJvdXNDZWxscy5sZW5ndGggPiAwXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1idXR0b25cIiAocG9pbnRlcmRvd24pPVwib25TZWxlY3RUYWJsZSgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtcm93LW1hcmtlclwiICpuZ0lmPVwiIShlbGVtZW50IHwgaGFzSGVhZGVyUm93KSAmJiAhaXNNb2JpbGVNb2RlXCI+XG4gICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCIwXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPjwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtY29sdW1uLW1hcmtlclwiICpuZ0lmPVwiIWVsZW1lbnQ/Lm9wdGlvbnM/LmhlYWRlckNvbHVtbiAmJiAhaXNNb2JpbGVNb2RlXCI+XG4gICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cImNvbHVtblwiIFthdF09XCIwXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPjwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1yb3ctY29udHJvbHNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWlubmVyXCIgI3Jvd0NvbnRyb2xzSW5uZXI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInRoZS10YWJsZS1yb3ctY29udHJvbC1idXR0b24td3JhcFwiXG4gICAgICAgICAgI3Jvd0NvbnRyb2xzQnV0dG9uV3JhcHBlclxuICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiByb3dDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuUm93Q29udHJvbHNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdjb250cm9sLWFjdGl2ZSc6IHRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXguaW5jbHVkZXMoY29udHJvbC5yb3dJbmRleCksXG4gICAgICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuZGFuZ2Vyb3VzUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCIhcmVhZG9ubHkgJiYgKGlzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZyB8fCB0YWJsZVN0b3JlLmlzRm9jdXNlZElucHV0KSAmJiAhZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUm93TW91c2Vkb3duKCRldmVudCwgY29udHJvbC5yb3dJbmRleClcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbiB0aGUtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLW51bWJlcmVkLWNvbnRyb2xzLWJ1dHRvblwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgaGVpZ2h0OiBjb250cm9sLmhlaWdodCArIDEgKyAncHgnIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInJvdy1udW1iZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIHt7IChlbGVtZW50IHwgaGFzSGVhZGVyUm93KSAmJiBpID09PSAwID8gJycgOiAoZWxlbWVudCB8IGhhc0hlYWRlclJvdykgPyBpIDogaSArIDEgfX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPHRoZS10YWJsZS1pbnNlcnQtbWFyayAqbmdJZj1cIiFpc01vYmlsZU1vZGVcIiB0eXBlPVwicm93XCIgW2F0XT1cImNvbnRyb2wucm93SW5kZXggKyAxXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPlxuICAgICAgICAgIDwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS13cmFwcGVyXCIgI3RhYmxlV3JhcHBlciBbbmdDbGFzc109XCJ7ICd0aGUtdGFibGUtbnVtYmVyZWQnOiBlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbiB9XCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGhlLXRhYmxlXCIgI3RoZVRhYmxlPlxuICAgICAgPGNvbGdyb3VwICNjb2xncm91cD5cbiAgICAgICAgPCEtLeaOp+WItuW6j+WPt+WIl+WuveW6pi0tPlxuICAgICAgICA8Y29sICpuZ0lmPVwicmVhZG9ubHkgJiYgZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIiBjbGFzcz1cInRoZS10YWJsZS1udW1iZXItY29sXCIgLz5cbiAgICAgICAgPGNvbCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIiBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2wud2lkdGggKyAncHgnIH1cIiAvPlxuICAgICAgPC9jb2xncm91cD5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9scy13cmFwcGVyIHRoZS1zdGlja3ktcm93XCIgI2NvbHVtbkNvbnRyb2xzV3JhcHBlcj5cbiAgICAgICAgICA8dGggKm5nSWY9XCJyZWFkb25seSAmJiBlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtblwiIGNsYXNzPVwidGhlLXRhYmxlLW51bWJlci1jb2xcIj48L3RoPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgI2NvbENvbnRyb2xcbiAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9sXCJcbiAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb250cm9sIG9mIGNvbENvbnRyb2xzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5Db2xDb250cm9sc1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdjb250cm9sLWFjdGl2ZSc6IHRhYmxlU3RvcmUuc2VsZWN0ZWRDb2x1bW5zSW5kZXguaW5jbHVkZXMoaSksXG4gICAgICAgICAgICAgIGRhbmdlcm91czogdGFibGVTdG9yZS5kYW5nZXJvdXNDb2x1bW5zSW5kZXguaW5jbHVkZXMoaSkgJiYgdGFibGVTdG9yZS5kYW5nZXJvdXNDZWxscy5sZW5ndGggPiAwLFxuICAgICAgICAgICAgICAndGhlLXN0aWNreS1jZWxsJzogaSA9PT0gMCAmJiBpc0ZyZWV6ZUNvbHVtblxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25Db2xNb3VzZWRvd24oJGV2ZW50LCBpKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRoZS10YWJsZS1pbnNlcnQtbWFya1xuICAgICAgICAgICAgICAqbmdJZj1cIihpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dCkgJiYgIWlzTW9iaWxlTW9kZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJjb2x1bW5cIlxuICAgICAgICAgICAgICBbYXRdPVwiaSArIDFcIlxuICAgICAgICAgICAgICBbdGFibGVTdG9yZV09XCJ0YWJsZVN0b3JlXCJcbiAgICAgICAgICAgICAgW3BhcmVudEVsZW1lbnRdPVwiY29sQ29udHJvbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSAjdGJvZHk+PC90Ym9keT5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCIhZWxlbWVudD8ub3B0aW9ucz8uaGVhZGVyQ29sdW1uXCJcbiAgICAgICAgI2hlYWRlclJvd0xlZnRTaGFkb3dcbiAgICAgICAgY2xhc3M9XCJoZWFkZXItcm93LXNoYWRvdyBoZWFkZXItcm93LWxlZnQtc2hhZG93XCJcbiAgICAgICAgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yb3ctc2hhZG93IGhlYWRlci1yb3ctcmlnaHQtc2hhZG93XCIgI2hlYWRlclJvd1JpZ2h0U2hhZG93IGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCI+PC9kaXY+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==