@guiexpert/table 0.0.2 → 1.0.2

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 (350) hide show
  1. package/.eslintrc.json +42 -0
  2. package/LICENSE +35 -0
  3. package/README.md +102 -0
  4. package/jest.config.ts +18 -0
  5. package/ng-package.json +7 -0
  6. package/package.json +10 -20
  7. package/project.json +47 -0
  8. package/{index.d.ts → src/index.ts} +72 -20
  9. package/src/lib/table/action/action-id.type.ts +24 -0
  10. package/{lib/table/action/on-action-triggered.if.d.ts → src/lib/table/action/on-action-triggered.if.ts} +4 -1
  11. package/src/lib/table/action/osx-shortcut-actionId-mapping.ts +29 -0
  12. package/src/lib/table/action/shortcut-actionid-mapping.type.ts +3 -0
  13. package/src/lib/table/action/shortcut.service.ts +134 -0
  14. package/src/lib/table/action/windows-shortcut-actionId-mapping.ts +27 -0
  15. package/src/lib/table/checkbox/checkbox-model.if.ts +16 -0
  16. package/src/lib/table/checkbox/checkbox-model.ts +62 -0
  17. package/src/lib/table/checkbox/tree-checkbox-model.ts +123 -0
  18. package/src/lib/table/color/color-rgb.if.ts +7 -0
  19. package/src/lib/table/color/color-rgb.ts +10 -0
  20. package/src/lib/table/color/ge-css-color-util.ts +43 -0
  21. package/src/lib/table/color/three-color-gradient-arg.if.ts +10 -0
  22. package/src/lib/table/color/three-color-gradient-arg.ts +14 -0
  23. package/src/lib/table/color/two-color-gradient-arg.if.ts +8 -0
  24. package/src/lib/table/color/two-color-gradient-arg.ts +12 -0
  25. package/src/lib/table/css-vars.ts +243 -0
  26. package/src/lib/table/data/common/aligns.ts +19 -0
  27. package/src/lib/table/data/common/area-map-factory.ts +14 -0
  28. package/src/lib/table/data/common/area-map.ts +11 -0
  29. package/src/lib/table/data/common/area-map.type.ts +5 -0
  30. package/{lib/table/data/common/args-adjust-columns-to-row-parent-params.d.ts → src/lib/table/data/common/args-adjust-columns-to-row-parent-params.ts} +11 -9
  31. package/src/lib/table/data/common/args-render-cell-div.ts +18 -0
  32. package/src/lib/table/data/common/boolean-function.ts +4 -0
  33. package/src/lib/table/data/common/cell-range.ts +57 -0
  34. package/src/lib/table/data/common/checkbox-column-def.ts +25 -0
  35. package/src/lib/table/data/common/checked-type.ts +1 -0
  36. package/src/lib/table/data/common/event/ge-cell-indices.ts +9 -0
  37. package/src/lib/table/data/common/event/ge-key-event.ts +10 -0
  38. package/src/lib/table/data/common/event/ge-model-change-event.ts +13 -0
  39. package/src/lib/table/data/common/event/ge-mouse-event.ts +38 -0
  40. package/src/lib/table/data/common/event/input/table-cell-update-event.if.ts +10 -0
  41. package/src/lib/table/data/common/event/input/table-cell-update-event.ts +14 -0
  42. package/src/lib/table/data/common/index-and-px.ts +9 -0
  43. package/src/lib/table/data/common/size.if.ts +4 -0
  44. package/src/lib/table/data/common/size.ts +9 -0
  45. package/src/lib/table/data/common/sizes.ts +35 -0
  46. package/src/lib/table/data/common/sort-item.ts +11 -0
  47. package/src/lib/table/data/common/tree-row-if.ts +11 -0
  48. package/src/lib/table/data/common/tree-row.ts +16 -0
  49. package/src/lib/table/data/common/value-label.if.ts +6 -0
  50. package/src/lib/table/data/common/value-label.ts +13 -0
  51. package/src/lib/table/data/div-scope.type.ts +5 -0
  52. package/src/lib/table/data/event/mouse-target-data.ts +45 -0
  53. package/src/lib/table/data/geo-data.ts +13 -0
  54. package/src/lib/table/data/options/auto-restore-options.if.ts +21 -0
  55. package/src/lib/table/data/options/auto-restore-options.ts +50 -0
  56. package/src/lib/table/data/options/default-row-heights.if.ts +5 -0
  57. package/src/lib/table/data/options/default-row-heights.ts +10 -0
  58. package/src/lib/table/data/options/icon.if.ts +7 -0
  59. package/src/lib/table/data/options/icon.ts +10 -0
  60. package/{lib/table/data/options/sorted-options.if.d.ts → src/lib/table/data/options/sorted-options.if.ts} +6 -3
  61. package/src/lib/table/data/options/sorted-options.ts +15 -0
  62. package/src/lib/table/data/options/table-options.if.ts +54 -0
  63. package/src/lib/table/data/options/table-options.ts +66 -0
  64. package/src/lib/table/data/options/tree-options.if.ts +10 -0
  65. package/src/lib/table/data/options/tree-options.ts +32 -0
  66. package/src/lib/table/data/table-model-and-options.if.ts +8 -0
  67. package/src/lib/table/data/table-model-and-options.ts +13 -0
  68. package/src/lib/table/data/tablemodel/area-ident.type.ts +18 -0
  69. package/src/lib/table/data/tablemodel/areamodel/abstract-area-model.ts +183 -0
  70. package/src/lib/table/data/tablemodel/areamodel/area-model-array-of-arrays.ts +59 -0
  71. package/src/lib/table/data/tablemodel/areamodel/area-model-cell-groups.ts +210 -0
  72. package/src/lib/table/data/tablemodel/areamodel/area-model-hidden.ts +120 -0
  73. package/src/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.ts +23 -0
  74. package/src/lib/table/data/tablemodel/areamodel/area-model-object-array.ts +105 -0
  75. package/src/lib/table/data/tablemodel/areamodel/area-model-tree.ts +215 -0
  76. package/src/lib/table/data/tablemodel/areamodel/area-model.if.ts +186 -0
  77. package/src/lib/table/data/tablemodel/areamodel/area-model.ts +110 -0
  78. package/src/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.ts +61 -0
  79. package/src/lib/table/data/tablemodel/areamodel/has-default-row-height-if.ts +3 -0
  80. package/src/lib/table/data/tablemodel/cellgroup/cell-group-ext.ts +167 -0
  81. package/src/lib/table/data/tablemodel/cellgroup/cell-group.if.ts +12 -0
  82. package/src/lib/table/data/tablemodel/cellgroup/cell-group.ts +18 -0
  83. package/src/lib/table/data/tablemodel/cellgroup/cellgroup-factory.ts +148 -0
  84. package/src/lib/table/data/tablemodel/column/column-def.if.ts +28 -0
  85. package/src/lib/table/data/tablemodel/column/column-def.ts +104 -0
  86. package/src/lib/table/data/tablemodel/padding.ts +9 -0
  87. package/src/lib/table/data/tablemodel/table-model.if.ts +90 -0
  88. package/src/lib/table/data/tablemodel/table-model.ts +352 -0
  89. package/src/lib/table/ele-scope.ts +283 -0
  90. package/src/lib/table/event-adapter.ts +28 -0
  91. package/src/lib/table/event-listener.if.ts +19 -0
  92. package/src/lib/table/factory/table-factory.ts +378 -0
  93. package/src/lib/table/factory/tree-factory.ts +51 -0
  94. package/src/lib/table/focus/focus-model.if.ts +14 -0
  95. package/src/lib/table/focus/focus-model.ts +48 -0
  96. package/{lib/table/focus/focus.type.d.ts → src/lib/table/focus/focus.type.ts} +3 -0
  97. package/src/lib/table/input-handler.ts +34 -0
  98. package/src/lib/table/mouse-handler.ts +236 -0
  99. package/src/lib/table/render-scope.ts +936 -0
  100. package/src/lib/table/renderer/cell-group-ext-cell-renderer.ts +27 -0
  101. package/{lib/table/renderer/cell-render.if.d.ts → src/lib/table/renderer/cell-render.if.ts} +10 -1
  102. package/src/lib/table/renderer/checkbox-boolean-property-cell-renderer.ts +63 -0
  103. package/src/lib/table/renderer/checkbox-cell-renderer.ts +39 -0
  104. package/src/lib/table/renderer/date-to-int-date-cell-renderer.ts +39 -0
  105. package/src/lib/table/renderer/date-to-iso-cell-renderer.ts +25 -0
  106. package/src/lib/table/renderer/date-to-locale-date-cell-renderer.ts +24 -0
  107. package/src/lib/table/renderer/date-to-tec-cell-renderer.ts +28 -0
  108. package/{lib/table/renderer/edit/edit-cell-renderer.type.d.ts → src/lib/table/renderer/edit/edit-cell-renderer.type.ts} +1 -0
  109. package/src/lib/table/renderer/edit/edit-input-pipe-for-number.ts +6 -0
  110. package/src/lib/table/renderer/edit/edit-input-pipe.if.ts +7 -0
  111. package/src/lib/table/renderer/edit/input-cell-renderer.ts +41 -0
  112. package/src/lib/table/renderer/edit/select-cell-renderer.ts +60 -0
  113. package/src/lib/table/renderer/male-female-to-icon-cell-renderer.ts +26 -0
  114. package/src/lib/table/renderer/number-cell-renderer.ts +38 -0
  115. package/src/lib/table/renderer/progress-bar-cell-renderer.ts +60 -0
  116. package/src/lib/table/renderer/renderer.ts +11 -0
  117. package/src/lib/table/renderer/star-rating-cell-renderer.ts +45 -0
  118. package/src/lib/table/renderer/true-false-cell-renderer.ts +28 -0
  119. package/src/lib/table/selection/selection-model.if.ts +20 -0
  120. package/src/lib/table/selection/selection-model.ts +109 -0
  121. package/src/lib/table/selection/selection-service.ts +120 -0
  122. package/{lib/table/selection/selection.type.d.ts → src/lib/table/selection/selection.type.ts} +3 -0
  123. package/src/lib/table/service/abstract-store-state.service.ts +105 -0
  124. package/src/lib/table/service/convenience-dom.service.ts +548 -0
  125. package/src/lib/table/service/data/collapsed-expanded.data.ts +11 -0
  126. package/src/lib/table/service/data/html-style.type.ts +1 -0
  127. package/src/lib/table/service/dom-service.if.ts +16 -0
  128. package/src/lib/table/service/ge-filter.service.ts +123 -0
  129. package/src/lib/table/service/simple-dom-service.ts +46 -0
  130. package/src/lib/table/service/sorter.service.ts +30 -0
  131. package/src/lib/table/service/store-state-collapsed-expand.service.ts +76 -0
  132. package/src/lib/table/service/store-state-scroll-pos.service.ts +40 -0
  133. package/src/lib/table/service/store-state-sorting.service.ts +41 -0
  134. package/src/lib/table/service/tree-row.service.ts +31 -0
  135. package/src/lib/table/table-api.ts +61 -0
  136. package/src/lib/table/table-scope.ts +433 -0
  137. package/src/test-setup.ts +1 -0
  138. package/tsconfig.json +22 -0
  139. package/tsconfig.lib.json +19 -0
  140. package/tsconfig.lib.prod.json +7 -0
  141. package/tsconfig.spec.json +20 -0
  142. package/esm2020/guiexpert-table.mjs +0 -5
  143. package/esm2020/index.mjs +0 -108
  144. package/esm2020/lib/table/action/action-id.type.mjs +0 -20
  145. package/esm2020/lib/table/action/on-action-triggered.if.mjs +0 -2
  146. package/esm2020/lib/table/action/osx-shortcut-actionId-mapping.mjs +0 -17
  147. package/esm2020/lib/table/action/shortcut-actionid-mapping.type.mjs +0 -2
  148. package/esm2020/lib/table/action/shortcut.service.mjs +0 -105
  149. package/esm2020/lib/table/action/windows-shortcut-actionId-mapping.mjs +0 -15
  150. package/esm2020/lib/table/checkbox/checkbox-model.if.mjs +0 -2
  151. package/esm2020/lib/table/checkbox/checkbox-model.mjs +0 -52
  152. package/esm2020/lib/table/checkbox/tree-checkbox-model.mjs +0 -106
  153. package/esm2020/lib/table/data/common/aligns.mjs +0 -19
  154. package/esm2020/lib/table/data/common/area-map-factory.mjs +0 -7
  155. package/esm2020/lib/table/data/common/area-map.mjs +0 -8
  156. package/esm2020/lib/table/data/common/area-map.type.mjs +0 -2
  157. package/esm2020/lib/table/data/common/args-adjust-columns-to-row-parent-params.mjs +0 -2
  158. package/esm2020/lib/table/data/common/args-render-cell-div.mjs +0 -2
  159. package/esm2020/lib/table/data/common/boolean-function.mjs +0 -3
  160. package/esm2020/lib/table/data/common/cell-range.mjs +0 -27
  161. package/esm2020/lib/table/data/common/checkbox-column.mjs +0 -15
  162. package/esm2020/lib/table/data/common/checked-type.mjs +0 -2
  163. package/esm2020/lib/table/data/common/event/ge-cell-indices.mjs +0 -7
  164. package/esm2020/lib/table/data/common/event/ge-key-event.mjs +0 -7
  165. package/esm2020/lib/table/data/common/event/ge-model-change-event.mjs +0 -10
  166. package/esm2020/lib/table/data/common/event/ge-mouse-event.mjs +0 -19
  167. package/esm2020/lib/table/data/common/filter-function.mjs +0 -2
  168. package/esm2020/lib/table/data/common/get-t.mjs +0 -2
  169. package/esm2020/lib/table/data/common/index-and-px.mjs +0 -7
  170. package/esm2020/lib/table/data/common/size.if.mjs +0 -2
  171. package/esm2020/lib/table/data/common/size.mjs +0 -7
  172. package/esm2020/lib/table/data/common/sizes.mjs +0 -33
  173. package/esm2020/lib/table/data/common/sort-item.mjs +0 -7
  174. package/esm2020/lib/table/data/common/sort-state.type.mjs +0 -2
  175. package/esm2020/lib/table/data/common/tree-arrow.type.mjs +0 -2
  176. package/esm2020/lib/table/data/common/tree-row-if.mjs +0 -2
  177. package/esm2020/lib/table/data/common/tree-row.mjs +0 -12
  178. package/esm2020/lib/table/data/common/value-label.if.mjs +0 -2
  179. package/esm2020/lib/table/data/common/value-label.mjs +0 -7
  180. package/esm2020/lib/table/data/div-scope.type.mjs +0 -2
  181. package/esm2020/lib/table/data/geo-data.mjs +0 -10
  182. package/esm2020/lib/table/data/options/auto-restore-options.if.mjs +0 -2
  183. package/esm2020/lib/table/data/options/auto-restore-options.mjs +0 -42
  184. package/esm2020/lib/table/data/options/default-row-heights.if.mjs +0 -2
  185. package/esm2020/lib/table/data/options/default-row-heights.mjs +0 -8
  186. package/esm2020/lib/table/data/options/icon.if.mjs +0 -2
  187. package/esm2020/lib/table/data/options/icon.mjs +0 -8
  188. package/esm2020/lib/table/data/options/sorted-options.if.mjs +0 -2
  189. package/esm2020/lib/table/data/options/sorted-options.mjs +0 -9
  190. package/esm2020/lib/table/data/options/table-options.if.mjs +0 -2
  191. package/esm2020/lib/table/data/options/table-options.mjs +0 -37
  192. package/esm2020/lib/table/data/options/tree-options.if.mjs +0 -2
  193. package/esm2020/lib/table/data/options/tree-options.mjs +0 -10
  194. package/esm2020/lib/table/data/side-ident.type.mjs +0 -2
  195. package/esm2020/lib/table/data/tablemodel/area-ident.type.mjs +0 -10
  196. package/esm2020/lib/table/data/tablemodel/areamodel/abstract-area-model.mjs +0 -108
  197. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-array-array.mjs +0 -34
  198. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-hidden.mjs +0 -80
  199. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.mjs +0 -11
  200. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-object-array.mjs +0 -79
  201. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-tree.mjs +0 -166
  202. package/esm2020/lib/table/data/tablemodel/areamodel/area-model.if.mjs +0 -2
  203. package/esm2020/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.mjs +0 -48
  204. package/esm2020/lib/table/data/tablemodel/column/column-def.if.mjs +0 -2
  205. package/esm2020/lib/table/data/tablemodel/column/column-def.mjs +0 -32
  206. package/esm2020/lib/table/data/tablemodel/padding.mjs +0 -9
  207. package/esm2020/lib/table/data/tablemodel/table-model.if.mjs +0 -2
  208. package/esm2020/lib/table/data/tablemodel/table-model.mjs +0 -268
  209. package/esm2020/lib/table/ele-scope.mjs +0 -173
  210. package/esm2020/lib/table/event-adapter.mjs +0 -17
  211. package/esm2020/lib/table/event-listener.if.mjs +0 -2
  212. package/esm2020/lib/table/focus/focus-model.if.mjs +0 -2
  213. package/esm2020/lib/table/focus/focus-model.mjs +0 -22
  214. package/esm2020/lib/table/focus/focus.type.mjs +0 -2
  215. package/esm2020/lib/table/input-handler.mjs +0 -24
  216. package/esm2020/lib/table/mouse-handler.mjs +0 -191
  217. package/esm2020/lib/table/render-scope.mjs +0 -595
  218. package/esm2020/lib/table/renderer/cell-render.if.mjs +0 -2
  219. package/esm2020/lib/table/renderer/checkbox-cell-renderer.mjs +0 -22
  220. package/esm2020/lib/table/renderer/date-to-int-date-cell-renderer.mjs +0 -21
  221. package/esm2020/lib/table/renderer/date-to-iso-cell-renderer.mjs +0 -9
  222. package/esm2020/lib/table/renderer/date-to-locale-date-cell-renderer.mjs +0 -9
  223. package/esm2020/lib/table/renderer/date-to-tec-cell-renderer.mjs +0 -12
  224. package/esm2020/lib/table/renderer/edit/edit-cell-renderer.type.mjs +0 -2
  225. package/esm2020/lib/table/renderer/edit/input-cell-renderer.mjs +0 -23
  226. package/esm2020/lib/table/renderer/edit/select-cell-renderer.mjs +0 -35
  227. package/esm2020/lib/table/renderer/male-female-to-icon-cell-renderer.mjs +0 -12
  228. package/esm2020/lib/table/renderer/number-cell-renderer.mjs +0 -19
  229. package/esm2020/lib/table/renderer/renderer-cleanup-fn.type.mjs +0 -2
  230. package/esm2020/lib/table/renderer/renderer.mjs +0 -7
  231. package/esm2020/lib/table/renderer/true-false-cell-renderer.mjs +0 -15
  232. package/esm2020/lib/table/selection/selection-model.if.mjs +0 -2
  233. package/esm2020/lib/table/selection/selection-model.mjs +0 -97
  234. package/esm2020/lib/table/selection/selection-service.mjs +0 -97
  235. package/esm2020/lib/table/selection/selection.type.mjs +0 -2
  236. package/esm2020/lib/table/service/abstract-store-state.service.mjs +0 -49
  237. package/esm2020/lib/table/service/convenience-dom.service.mjs +0 -394
  238. package/esm2020/lib/table/service/data/collapsed-expanded.data.mjs +0 -9
  239. package/esm2020/lib/table/service/data/html-style.type.mjs +0 -2
  240. package/esm2020/lib/table/service/dom-service.if.mjs +0 -2
  241. package/esm2020/lib/table/service/ge-filter.service.mjs +0 -98
  242. package/esm2020/lib/table/service/simple-dom-service.mjs +0 -34
  243. package/esm2020/lib/table/service/sorter.service.mjs +0 -27
  244. package/esm2020/lib/table/service/store-state-collapsed-expand.service.mjs +0 -57
  245. package/esm2020/lib/table/service/store-state-scroll-pos.service.mjs +0 -29
  246. package/esm2020/lib/table/service/store-state-sorting.service.mjs +0 -29
  247. package/esm2020/lib/table/service/tree-row.service.mjs +0 -23
  248. package/esm2020/lib/table/table-api.mjs +0 -38
  249. package/esm2020/lib/table/table-model-factory.mjs +0 -124
  250. package/esm2020/lib/table/table-scope.mjs +0 -313
  251. package/lib/table/action/action-id.type.d.ts +0 -2
  252. package/lib/table/action/osx-shortcut-actionId-mapping.d.ts +0 -6
  253. package/lib/table/action/shortcut-actionid-mapping.type.d.ts +0 -4
  254. package/lib/table/action/shortcut.service.d.ts +0 -17
  255. package/lib/table/action/windows-shortcut-actionId-mapping.d.ts +0 -6
  256. package/lib/table/checkbox/checkbox-model.d.ts +0 -12
  257. package/lib/table/checkbox/checkbox-model.if.d.ts +0 -9
  258. package/lib/table/checkbox/tree-checkbox-model.d.ts +0 -17
  259. package/lib/table/data/common/aligns.d.ts +0 -24
  260. package/lib/table/data/common/area-map-factory.d.ts +0 -5
  261. package/lib/table/data/common/area-map.d.ts +0 -7
  262. package/lib/table/data/common/area-map.type.d.ts +0 -5
  263. package/lib/table/data/common/args-render-cell-div.d.ts +0 -13
  264. package/lib/table/data/common/boolean-function.d.ts +0 -3
  265. package/lib/table/data/common/cell-range.d.ts +0 -17
  266. package/lib/table/data/common/checkbox-column.d.ts +0 -13
  267. package/lib/table/data/common/checked-type.d.ts +0 -1
  268. package/lib/table/data/common/event/ge-cell-indices.d.ts +0 -5
  269. package/lib/table/data/common/event/ge-key-event.d.ts +0 -5
  270. package/lib/table/data/common/event/ge-model-change-event.d.ts +0 -6
  271. package/lib/table/data/common/event/ge-mouse-event.d.ts +0 -17
  272. package/lib/table/data/common/index-and-px.d.ts +0 -5
  273. package/lib/table/data/common/size.d.ts +0 -6
  274. package/lib/table/data/common/size.if.d.ts +0 -4
  275. package/lib/table/data/common/sizes.d.ts +0 -32
  276. package/lib/table/data/common/sort-item.d.ts +0 -6
  277. package/lib/table/data/common/tree-row-if.d.ts +0 -10
  278. package/lib/table/data/common/tree-row.d.ts +0 -11
  279. package/lib/table/data/common/value-label.d.ts +0 -6
  280. package/lib/table/data/common/value-label.if.d.ts +0 -4
  281. package/lib/table/data/div-scope.type.d.ts +0 -7
  282. package/lib/table/data/geo-data.d.ts +0 -8
  283. package/lib/table/data/options/auto-restore-options.d.ts +0 -11
  284. package/lib/table/data/options/auto-restore-options.if.d.ts +0 -16
  285. package/lib/table/data/options/default-row-heights.d.ts +0 -7
  286. package/lib/table/data/options/default-row-heights.if.d.ts +0 -5
  287. package/lib/table/data/options/icon.d.ts +0 -7
  288. package/lib/table/data/options/icon.if.d.ts +0 -5
  289. package/lib/table/data/options/sorted-options.d.ts +0 -8
  290. package/lib/table/data/options/table-options.d.ts +0 -35
  291. package/lib/table/data/options/table-options.if.d.ts +0 -36
  292. package/lib/table/data/options/tree-options.d.ts +0 -9
  293. package/lib/table/data/options/tree-options.if.d.ts +0 -7
  294. package/lib/table/data/tablemodel/area-ident.type.d.ts +0 -2
  295. package/lib/table/data/tablemodel/areamodel/abstract-area-model.d.ts +0 -43
  296. package/lib/table/data/tablemodel/areamodel/area-model-array-array.d.ts +0 -18
  297. package/lib/table/data/tablemodel/areamodel/area-model-hidden.d.ts +0 -37
  298. package/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.d.ts +0 -10
  299. package/lib/table/data/tablemodel/areamodel/area-model-object-array.d.ts +0 -27
  300. package/lib/table/data/tablemodel/areamodel/area-model-tree.d.ts +0 -39
  301. package/lib/table/data/tablemodel/areamodel/area-model.if.d.ts +0 -146
  302. package/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.d.ts +0 -12
  303. package/lib/table/data/tablemodel/column/column-def.d.ts +0 -46
  304. package/lib/table/data/tablemodel/column/column-def.if.d.ts +0 -22
  305. package/lib/table/data/tablemodel/padding.d.ts +0 -7
  306. package/lib/table/data/tablemodel/table-model.d.ts +0 -61
  307. package/lib/table/data/tablemodel/table-model.if.d.ts +0 -35
  308. package/lib/table/ele-scope.d.ts +0 -37
  309. package/lib/table/event-adapter.d.ts +0 -12
  310. package/lib/table/event-listener.if.d.ts +0 -11
  311. package/lib/table/focus/focus-model.d.ts +0 -12
  312. package/lib/table/focus/focus-model.if.d.ts +0 -6
  313. package/lib/table/input-handler.d.ts +0 -6
  314. package/lib/table/mouse-handler.d.ts +0 -25
  315. package/lib/table/render-scope.d.ts +0 -82
  316. package/lib/table/renderer/checkbox-cell-renderer.d.ts +0 -8
  317. package/lib/table/renderer/date-to-int-date-cell-renderer.d.ts +0 -9
  318. package/lib/table/renderer/date-to-iso-cell-renderer.d.ts +0 -8
  319. package/lib/table/renderer/date-to-locale-date-cell-renderer.d.ts +0 -8
  320. package/lib/table/renderer/date-to-tec-cell-renderer.d.ts +0 -8
  321. package/lib/table/renderer/edit/input-cell-renderer.d.ts +0 -8
  322. package/lib/table/renderer/edit/select-cell-renderer.d.ts +0 -12
  323. package/lib/table/renderer/male-female-to-icon-cell-renderer.d.ts +0 -8
  324. package/lib/table/renderer/number-cell-renderer.d.ts +0 -11
  325. package/lib/table/renderer/renderer.d.ts +0 -5
  326. package/lib/table/renderer/true-false-cell-renderer.d.ts +0 -8
  327. package/lib/table/selection/selection-model.d.ts +0 -21
  328. package/lib/table/selection/selection-model.if.d.ts +0 -11
  329. package/lib/table/selection/selection-service.d.ts +0 -17
  330. package/lib/table/service/abstract-store-state.service.d.ts +0 -10
  331. package/lib/table/service/convenience-dom.service.d.ts +0 -46
  332. package/lib/table/service/data/collapsed-expanded.data.d.ts +0 -7
  333. package/lib/table/service/data/html-style.type.d.ts +0 -3
  334. package/lib/table/service/dom-service.if.d.ts +0 -9
  335. package/lib/table/service/ge-filter.service.d.ts +0 -5
  336. package/lib/table/service/simple-dom-service.d.ts +0 -10
  337. package/lib/table/service/sorter.service.d.ts +0 -3
  338. package/lib/table/service/store-state-collapsed-expand.service.d.ts +0 -15
  339. package/lib/table/service/store-state-scroll-pos.service.d.ts +0 -10
  340. package/lib/table/service/store-state-sorting.service.d.ts +0 -11
  341. package/lib/table/service/tree-row.service.d.ts +0 -5
  342. package/lib/table/table-api.d.ts +0 -16
  343. package/lib/table/table-model-factory.d.ts +0 -60
  344. package/lib/table/table-scope.d.ts +0 -56
  345. /package/{lib/table/data/common/filter-function.d.ts → src/lib/table/data/common/filter-function.ts} +0 -0
  346. /package/{lib/table/data/common/get-t.d.ts → src/lib/table/data/common/get-t.ts} +0 -0
  347. /package/{lib/table/data/common/sort-state.type.d.ts → src/lib/table/data/common/sort-state.type.ts} +0 -0
  348. /package/{lib/table/data/common/tree-arrow.type.d.ts → src/lib/table/data/common/tree-arrow.type.ts} +0 -0
  349. /package/{lib/table/data/side-ident.type.d.ts → src/lib/table/data/side-ident.type.ts} +0 -0
  350. /package/{lib/table/renderer/renderer-cleanup-fn.type.d.ts → src/lib/table/renderer/renderer-cleanup-fn.type.ts} +0 -0
@@ -1,595 +0,0 @@
1
- import { EleScope } from "./ele-scope";
2
- import { TreeRow } from "./data/common/tree-row";
3
- import { AreaModelTree } from "./data/tablemodel/areamodel/area-model-tree";
4
- import { GeoData } from "./data/geo-data";
5
- import { ColAndRowspanModel } from "./data/tablemodel/areamodel/col-and-rowspan-model";
6
- import { AreaObjectMap } from "./data/common/area-map";
7
- export class RenderScope extends EleScope {
8
- constructor(hostElement, tableModel, dom, tableOptions) {
9
- super(hostElement, tableModel, dom, tableOptions);
10
- this.scrollLeft = 0;
11
- this.scrollViewportLeft = 0;
12
- this.scrollFactorY = 0;
13
- this.scrollFactorX = 0;
14
- this.cleanupFunctions = {
15
- header: [],
16
- body: [],
17
- footer: []
18
- };
19
- this.tree = false;
20
- this.rangeEles = [];
21
- this.colAndRowspanModels = new AreaObjectMap();
22
- this.firstVisibleRowIndex = -1;
23
- this.draggingTargetColumnIndex = -1;
24
- this.removables = [];
25
- if (this.tableOptions?.getSelectionModel) {
26
- this.getSelectionModel = this.tableOptions.getSelectionModel;
27
- }
28
- if (this.tableOptions?.getFocusModel) {
29
- this.getFocusModel = this.tableOptions.getFocusModel;
30
- }
31
- if (tableModel.getAreaModel("body") instanceof AreaModelTree) {
32
- this.tree = true;
33
- }
34
- const aereaIds = ["header", "body", "footer"];
35
- aereaIds.forEach(areaIdent => {
36
- this.colAndRowspanModels[areaIdent] = new ColAndRowspanModel(tableModel, tableModel.getAreaModel(areaIdent));
37
- this.colAndRowspanModels[areaIdent]?.init();
38
- });
39
- }
40
- resetEditorRenderer() {
41
- this.editorRenderer = undefined;
42
- this.editorRendererRow = -1;
43
- this.editorRendererColumn = -1;
44
- }
45
- clearSelection() {
46
- if (this.getSelectionModel) {
47
- const sm = this.getSelectionModel();
48
- sm?.clear();
49
- }
50
- }
51
- initRenderEditor(rowIdx, colIdx) {
52
- let rnFn = this.tableModel.getColumnDef(colIdx)?.getEditRenderer;
53
- if (!rnFn) {
54
- rnFn = this.tableOptions.getEditRenderer;
55
- }
56
- if (rnFn) {
57
- this.editorRenderer = rnFn(rowIdx, colIdx);
58
- if (this.editorRenderer) {
59
- this.editorRendererRow = rowIdx;
60
- this.editorRendererColumn = colIdx;
61
- this.repaint();
62
- // request focus:
63
- const input = document.querySelector("input.ge-table-cell-editor-input");
64
- if (input) {
65
- input.focus();
66
- }
67
- }
68
- else {
69
- this.editorRendererRow = -1;
70
- this.editorRendererColumn = -1;
71
- }
72
- }
73
- }
74
- repaint() {
75
- this.adjustAfterScrolling();
76
- }
77
- adjustAfterScrolling() {
78
- for (const cleaning of this.removables) {
79
- cleaning.remove();
80
- }
81
- this.hideHoverRow();
82
- this.hideHoverColumn();
83
- this.scrollTop = this.scrollViewport.scrollTop;
84
- this.scrollLeft = this.scrollViewport.scrollLeft;
85
- this.debounce(this.checkForScrollPosSaving.bind(this));
86
- this.scrollFactorY = this.scrollTop / (this.scrollViewport.scrollHeight - this.scrollViewport.clientHeight);
87
- this.scrollFactorX = this.scrollLeft / (this.scrollViewport.scrollWidth - this.scrollViewport.clientWidth);
88
- if (isNaN(this.scrollFactorY)) {
89
- this.scrollFactorY = 0;
90
- }
91
- if (isNaN(this.scrollFactorX)) {
92
- this.scrollFactorX = 0;
93
- }
94
- this.adjustBody();
95
- this.adjustArea("footer");
96
- this.adjustArea("header");
97
- if (this.tableOptions.tableTopBorderVisible) {
98
- this.removables.push(this.dom.addHorizontalBorder(new GeoData(0, this.hostElement.clientWidth, 1, 0), this.hostElement, "ge-table-row-border"));
99
- }
100
- if (this.tableOptions.tableBottomBorderVisible) {
101
- this.removables.push(this.dom.addHorizontalBorder(new GeoData(0, this.hostElement.clientWidth, 1, this.hostElement.clientHeight - 1), this.hostElement, "ge-table-row-border"));
102
- }
103
- }
104
- checkForScrollPosSaving() {
105
- if (this.storeScrollPosStateService
106
- && this.tableOptions?.autoRestoreOptions?.autoRestoreScrollPosition) {
107
- this.storeScrollPosStateService.updateScrollOffset([this.scrollLeft, this.scrollTop]);
108
- }
109
- }
110
- getAreaAndSideIdentByAttr(srcElement) {
111
- if (srcElement) {
112
- const dataArea = this.getStringByAttr(srcElement, "data-area");
113
- const dataSide = this.getStringByAttr(srcElement, "data-side");
114
- // footer geht nicht console.info(dataArea, srcElement)
115
- if (dataSide && dataArea) {
116
- return [dataArea, dataSide];
117
- }
118
- }
119
- return [undefined, undefined];
120
- }
121
- getArea(rowIdent, sideIdent) {
122
- if (rowIdent === "header") {
123
- if (sideIdent === "west")
124
- return this.areaHeaderWest;
125
- if (sideIdent === "center")
126
- return this.areaHeaderCenter;
127
- if (sideIdent === "east")
128
- return this.areaHeaderEast;
129
- }
130
- else if (rowIdent === "body") {
131
- if (sideIdent === "west")
132
- return this.areaBodyWest;
133
- if (sideIdent === "center")
134
- return this.areaBodyCenter;
135
- if (sideIdent === "east")
136
- return this.areaBodyEast;
137
- }
138
- else if (rowIdent === "footer") {
139
- if (sideIdent === "west")
140
- return this.areaFooterWest;
141
- if (sideIdent === "center")
142
- return this.areaFooterCenter;
143
- if (sideIdent === "east")
144
- return this.areaFooterEast;
145
- }
146
- throw Error(`Wrong area identifier: row:${rowIdent}, col:${sideIdent}`);
147
- }
148
- adjustBody() {
149
- const virtualRowDivTopF1 = this.areaBodyCenterGeo.height - this.tableModel.getContentHeightInPixel();
150
- const virtualRowDivTop = this.scrollFactorY * virtualRowDivTopF1;
151
- this.dom.setStyle(this.contentDiv, "top", `${this.scrollTop}px`);
152
- this.dom.setStyle(this.contentDiv, "left", `${this.scrollViewport.scrollLeft}px`);
153
- this.adjustArea("body", virtualRowDivTop);
154
- }
155
- getNumberByAttr(srcElement, key) {
156
- if (srcElement) {
157
- const attr = srcElement.closest("[" + key + "]")?.getAttribute(key);
158
- if (attr)
159
- return Number(attr);
160
- }
161
- return -1;
162
- }
163
- getStringByAttr(srcElement, key) {
164
- if (srcElement) {
165
- const attr = srcElement.closest("[" + key + "]")?.getAttribute(key);
166
- if (attr)
167
- return attr;
168
- }
169
- return "";
170
- }
171
- adjustArea(areaIdent, yStart = 0) {
172
- const westArea = this.getArea(areaIdent, "west");
173
- const centerArea = this.getArea(areaIdent, "center");
174
- const eastArea = this.getArea(areaIdent, "east");
175
- const divHeight = centerArea.child.clientHeight;
176
- westArea.child.innerText = "";
177
- centerArea.child.innerText = "";
178
- eastArea.child.innerText = "";
179
- const left = 0;
180
- const width = this.areaBodyCenterGeo.width;
181
- const padding = this.tableModel.getPadding();
182
- const areaModel = this.tableModel.getAreaModel(areaIdent);
183
- const rowCount = areaModel.getRowCount();
184
- const bodyArea = areaIdent === "body";
185
- const headerArea = areaIdent === "header";
186
- while (this.cleanupFunctions[areaIdent].length) {
187
- const fn = this.cleanupFunctions[areaIdent].shift();
188
- if (fn) {
189
- fn();
190
- }
191
- }
192
- let y = yStart;
193
- const columnCount = this.tableModel.getColumnCount();
194
- const fixedRightColumnCount = this.tableModel.getFixedRightColumnCount();
195
- const fixedLeftColumnCount = this.tableModel.getFixedLeftColumnCount();
196
- for (let index = 0; index < rowCount; index++) {
197
- const top = y;
198
- const height = this.tableModel.getRowHeight(areaIdent, index);
199
- if (top + height > 0) {
200
- // Visible!
201
- this.firstVisibleRowIndex = index;
202
- // center -------------------------------------------
203
- let geo = { left, width, height, top, index };
204
- let rowDiv = this.dom.addRowDiv(centerArea, geo, index, areaIdent);
205
- const centerStartCol = fixedLeftColumnCount;
206
- this.adjustColumnsToRowParent({
207
- areaIdent,
208
- sideIdent: "center",
209
- areaModel,
210
- geo,
211
- parent: rowDiv,
212
- rowIndex: index,
213
- columnIndexStart: centerStartCol,
214
- columnIndexEnd: columnCount - fixedRightColumnCount - 1,
215
- verticalFixed: false
216
- });
217
- // west -------------------------------------------
218
- if (padding.left > 0) {
219
- geo = { left, width: this.areaBodyWestGeo.width, height, top, index };
220
- rowDiv = this.dom.addRowDiv(westArea, geo, index, areaIdent);
221
- this.adjustColumnsToRowParent({
222
- areaIdent,
223
- sideIdent: "west",
224
- areaModel,
225
- geo,
226
- parent: rowDiv,
227
- rowIndex: index,
228
- columnIndexStart: 0,
229
- columnIndexEnd: centerStartCol - 1,
230
- verticalFixed: true
231
- });
232
- }
233
- // east -------------------------------------------
234
- if (padding.right > 0) {
235
- geo = { left, width: this.areaBodyEastGeo.width, height, top, index };
236
- rowDiv = this.dom.addRowDiv(eastArea, geo, index, areaIdent);
237
- this.adjustColumnsToRowParent({
238
- areaIdent,
239
- sideIdent: "east",
240
- areaModel,
241
- geo,
242
- parent: rowDiv,
243
- rowIndex: index,
244
- columnIndexStart: columnCount - fixedRightColumnCount,
245
- columnIndexEnd: columnCount - 1,
246
- verticalFixed: true
247
- });
248
- }
249
- // collapse / expand all:
250
- if (areaIdent === "header" && this.tree && index === rowCount - 1) {
251
- const div = this.dom.applyStyle(this.dom.setAttribute(this.dom.addDiv(rowDiv, new GeoData(16, 20, 20, 8)), "data-ge-action", "toggleExpandCollapseAll"), { "cursor": "pointer" });
252
- const treeOptionsArrow = this.tableOptions.treeOptions.arrowExpandCollapseAll;
253
- if (treeOptionsArrow) {
254
- const textElement = this.dom.domService.createText(treeOptionsArrow.content);
255
- this.dom.domService.appendChild(div, textElement);
256
- if (treeOptionsArrow.style) {
257
- this.dom.applyStyleString(div, treeOptionsArrow.style);
258
- }
259
- }
260
- }
261
- }
262
- y = y + height;
263
- // lastVisibleRowIndex = index;
264
- if (y > divHeight) {
265
- break;
266
- }
267
- } // for
268
- // We draw the big colspan and rowspan cells at the end.
269
- // This fixes the 'half cutted big cell' problem:
270
- if (this.colAndRowspanModels && this.colAndRowspanModels[areaIdent]) {
271
- // draw col/rowspan cells again:
272
- const ranges = this.colAndRowspanModels[areaIdent]?.getRanges() ?? [];
273
- if (ranges.length) {
274
- for (const range of ranges) {
275
- let xStart = 0;
276
- let child = centerArea.child;
277
- if (range.c1 < fixedLeftColumnCount) {
278
- // West:
279
- child = westArea.child;
280
- }
281
- else if (fixedRightColumnCount > 0 && range.c1 >= columnCount - fixedRightColumnCount) {
282
- // East:
283
- child = eastArea.child;
284
- }
285
- else {
286
- // Center:
287
- const virtualRowDivLeftF1 = this.areaBodyCenterGeo.width - this.tableModel.getContentWidthInPixel();
288
- xStart = (this.scrollFactorX * virtualRowDivLeftF1) - this.areaBodyWestGeo.width;
289
- }
290
- this.drawBigCell(range, xStart, yStart, areaModel, child);
291
- }
292
- }
293
- }
294
- }
295
- /**
296
- * Draws big cells (rowspan and or colspan) in body/center
297
- * @param range:CellRange
298
- * @param xStart X position in pixel for top left corner
299
- * @param yStart Y position in pixel for top left corner
300
- * @param areaModel AreaModelIf
301
- * @param parentDiv Parent div as HTMLDivElement
302
- * @protected
303
- */
304
- drawBigCell(range, xStart, yStart, areaModel, parentDiv) {
305
- const y1 = yStart + this.getRowHeights(0, range.r1 - 1, areaModel).reduce((a, b) => a + b, 0);
306
- const columnCount = this.tableModel.getColumnCount();
307
- const fixedRightColumnCount = this.tableModel.getFixedRightColumnCount();
308
- let firstColIdx = 0;
309
- if (fixedRightColumnCount > 0 && range.c1 >= columnCount - fixedRightColumnCount) {
310
- // We are on the (fixed) east side, so we have to fix firstColIdx:
311
- firstColIdx = columnCount - fixedRightColumnCount;
312
- }
313
- const x1 = xStart + this.getColumnWidths(firstColIdx, range.c1 - 1).reduce((a, b) => a + b, 0);
314
- const h = this.getRowHeights(range.r1, range.r2, areaModel).reduce((a, b) => a + b, 0);
315
- const w = this.getColumnWidths(range.c1, range.c2).reduce((a, b) => a + b, 0);
316
- let cellSelected = false;
317
- const selectionModel = this.getSelectionModel ? this.getSelectionModel() : undefined;
318
- if (selectionModel) {
319
- const count = selectionModel.getSelectionCount(range.r1, range.c1);
320
- cellSelected = count > 0;
321
- }
322
- this.renderCell(areaModel, areaModel.areaIdent, range.r1, range.c1, x1, y1, w, h, parentDiv, cellSelected);
323
- if (areaModel.areaIdent === "header" && this.tableOptions.columnsResizable) {
324
- this.renderHeaderCellResizeHandle(range.r1, range.c1, x1, y1, w, h, parentDiv);
325
- }
326
- }
327
- findRowOfImportantRowspanCell(areaModel, rowIndex, colIndex) {
328
- const maxRowspan = areaModel.getMaxRowspan();
329
- for (let r = rowIndex - 1; r > -1; r--) {
330
- const rowspan = areaModel.getRowspanAt(r, colIndex);
331
- if (rowspan > 1 && r + rowspan + 1 >= rowIndex) {
332
- return r;
333
- }
334
- if (rowIndex - r > maxRowspan) {
335
- return -1;
336
- }
337
- }
338
- return -1;
339
- }
340
- // TODO skip cols in header because of colspan
341
- adjustColumnsToRowParent({ areaIdent, sideIdent, areaModel, geo, parent, rowIndex, columnIndexStart, columnIndexEnd, verticalFixed = false }) {
342
- this.scrollViewportLeft = this.scrollViewport.scrollLeft;
343
- let virtualRowDivLeft = 0;
344
- if (!verticalFixed) {
345
- const virtualRowDivLeftF1 = (this.areaBodyCenterGeo.width) - this.tableModel.getContentWidthInPixel();
346
- virtualRowDivLeft = this.scrollFactorX * virtualRowDivLeftF1;
347
- }
348
- const top = 0;
349
- const renderSelection = !!(areaIdent === "body" && sideIdent);
350
- let x = virtualRowDivLeft;
351
- for (let index = columnIndexStart; index <= columnIndexEnd; index++) {
352
- const left = x;
353
- const w = this.tableModel.getColumnWidth(index);
354
- if (left + w > 0) {
355
- // Visible! Render cell div:
356
- // calc height:
357
- let height = geo.height;
358
- let rowspan = areaModel.getRowspanAt(rowIndex, index);
359
- let colspan = areaModel.getColspanAt(rowIndex, index);
360
- if (rowspan > 1) {
361
- height = this.getRowHeights(rowIndex, rowIndex + rowspan - 1, areaModel).reduce((a, b) => a + b, 0);
362
- }
363
- let width = w;
364
- if (colspan > 1) {
365
- width = this.getColumnWidths(index, index + colspan - 1).reduce((a, b) => a + b, 0);
366
- }
367
- let skip = false;
368
- if (this.colAndRowspanModels && this.colAndRowspanModels[areaIdent]) {
369
- if (this.colAndRowspanModels[areaIdent]?.isInRange(rowIndex, index)) {
370
- skip = true; // for the body area we don't want to to render the small single cells
371
- }
372
- }
373
- if (this.draggingTargetColumnIndex === index && areaIdent !== "header") {
374
- this.renderDragTargetDiv(parent, left, top, width, height);
375
- this.dom.addColumnBorderDivs(parent, { left, top, width, height });
376
- }
377
- else {
378
- let cellSelected = this.renderSelectedBackgroundDiv(skip, renderSelection, areaModel, rowIndex, index, parent, left, top, width, height);
379
- if (!skip) {
380
- this.renderCell(areaModel, areaIdent, rowIndex, index, left, top, width, height, parent, cellSelected);
381
- }
382
- if (areaIdent === "header" && this.tableOptions.columnsResizable) {
383
- this.renderHeaderCellResizeHandle(rowIndex, index, left, top, width, height, parent);
384
- }
385
- }
386
- }
387
- x = x + w;
388
- if (x > this.areaBodyCenterGeo.width) {
389
- break;
390
- }
391
- }
392
- // Right vertical border:
393
- this.dom.addVerticalBorder(new GeoData(x - 1, 1, geo.height, 0), parent);
394
- }
395
- getTreeArrowColumnIndex() {
396
- if (this.tableOptions.showCheckboxWihoutExtraColumn) {
397
- return 0;
398
- }
399
- if (this.tableModel.isRowCheckboxVisible()) {
400
- return 1;
401
- }
402
- return 0;
403
- }
404
- addAndRenderCellDiv({ areaModel, areaIdent, rowIndex, index, left, width, height, top, parent }) {
405
- const editor = this.editorRenderer && this.editorRendererRow === rowIndex && this.editorRendererColumn === index;
406
- const cellRenderer = (editor) ? this.editorRenderer : areaModel.getCellRenderer(rowIndex, index);
407
- const geo = { left, width, height, top, index };
408
- const rowObject = areaModel.getRowByIndex(rowIndex);
409
- let treeArrow = "none";
410
- const arrowIndexOk = index === this.getTreeArrowColumnIndex();
411
- if (arrowIndexOk && rowObject instanceof TreeRow) {
412
- const tr = rowObject;
413
- if (tr.children?.length) {
414
- if (tr.expanded) {
415
- treeArrow = "expanded";
416
- }
417
- else {
418
- treeArrow = "collapsed";
419
- }
420
- }
421
- else {
422
- treeArrow = "hidden";
423
- }
424
- }
425
- let sortState = undefined;
426
- if (areaIdent === "header") {
427
- const columnDef = this.tableModel.getColumnDef(index);
428
- if (!columnDef?.sortIconVisible || columnDef?.sortIconVisible()) {
429
- sortState = columnDef?.sortState;
430
- }
431
- }
432
- const val = areaModel.getValueAt(rowIndex, index);
433
- const text = cellRenderer ? "" : `${val}`;
434
- const checkedType = areaModel.isRowChecked(rowIndex);
435
- const cell = this.dom.addColumnDiv(parent, geo, rowIndex, index, areaIdent, text, treeArrow, this.tableOptions, checkedType, sortState);
436
- const tooltip = areaModel.getTooltipAt(rowIndex, index);
437
- if (tooltip) {
438
- this.dom.setAttribute(cell, "title", tooltip);
439
- }
440
- const columnDef = this.tableModel.getColumnDef(index);
441
- if (columnDef && columnDef.classes[areaIdent]) {
442
- this.dom.addClasses(columnDef.classes[areaIdent], cell);
443
- }
444
- let fn = undefined;
445
- if (cellRenderer) {
446
- fn = cellRenderer.render(cell, rowIndex, index, areaIdent, areaModel, val, this.dom.domService);
447
- }
448
- const classes = areaModel.getCustomClassesAt(rowIndex, index);
449
- if (classes.length) {
450
- this.dom.addClasses(classes, cell);
451
- }
452
- this.dom.addColumnBorderDivs(parent, geo);
453
- if (this.getFocusModel && areaIdent === "body") {
454
- const fm = this.getFocusModel();
455
- if (fm?.hasFocus(rowIndex, index)) {
456
- this.dom.addFocusBorderDivs(parent, geo, {});
457
- }
458
- }
459
- if (areaIdent === "header") {
460
- this.dom.setAttribute(cell, "data-ge-action", "drag-column");
461
- }
462
- return [cell, fn];
463
- }
464
- getColumnWidths(startIndex, endIndex) {
465
- const ret = [];
466
- for (let i = startIndex; i <= endIndex; i++) {
467
- ret.push(this.tableModel.getColumnWidth(i));
468
- }
469
- return ret;
470
- }
471
- getRowHeights(startIndex, endIndex, areaModel) {
472
- const ret = [];
473
- for (let i = startIndex; i <= endIndex; i++) {
474
- ret.push(areaModel.getRowHeight(i));
475
- }
476
- return ret;
477
- }
478
- adjustHoverRows(mouseMoveEvent) {
479
- if (this.tableOptions.hoverRowVisible && mouseMoveEvent.rowIndex > -1) {
480
- const width = this.hostElement.clientWidth;
481
- const rowHeight = this.tableModel.getAreaModel("body").getRowHeight(mouseMoveEvent.rowIndex);
482
- const top = mouseMoveEvent.rowTop + this.areaHeaderCenter.parent.clientHeight - this.scrollTop;
483
- this.dom.applyStyle(this.hoverRow, {
484
- "left": "0",
485
- "top": top + "px",
486
- "width": width + "px",
487
- "height": rowHeight + "px",
488
- "display": "block"
489
- });
490
- }
491
- else {
492
- this.hideHoverRow();
493
- }
494
- }
495
- hideHoverRow() {
496
- this.dom.applyStyle(this.hoverRow, {
497
- "display": "none"
498
- });
499
- }
500
- adjustHoverColumns(mouseMoveEvent) {
501
- if (this.tableOptions.hoverColumnVisible && mouseMoveEvent.rowIndex > -1) {
502
- const height = this.hostElement.clientHeight;
503
- const width = this.tableModel.getColumnWidth(mouseMoveEvent.columnIndex);
504
- const left = mouseMoveEvent.columnLeft + this.tableModel.getPadding().left - this.scrollLeft;
505
- this.dom.applyStyle(this.hoverColumn, {
506
- "left": (left) + "px",
507
- "top": "0px",
508
- "width": width + "px",
509
- "height": height + "px",
510
- "display": "block"
511
- });
512
- }
513
- else {
514
- this.hideHoverColumn();
515
- }
516
- }
517
- hideHoverColumn() {
518
- this.dom.applyStyle(this.hoverColumn, {
519
- "display": "none"
520
- });
521
- }
522
- debounce(fn, delay = 1000) {
523
- if (this.debounceTimeout) {
524
- clearTimeout(this.debounceTimeout);
525
- }
526
- this.debounceTimeout = setTimeout(fn.bind(this), delay);
527
- }
528
- renderDragTargetDiv(parent, left, top, width, height) {
529
- const div = this.dom.applyStylePosistionAbsolute(this.dom.createDivWithClass("ge-table-drop-zone", parent));
530
- this.dom.setStyle(div, "left", `${left}px`);
531
- this.dom.setStyle(div, "top", `${top}px`);
532
- this.dom.setStyle(div, "width", `${width}px`);
533
- this.dom.setStyle(div, "height", `${height}px`);
534
- return div;
535
- }
536
- renderSelectedBackgroundDiv(skip, renderSelection, areaModel, rowIndex, index, parent, left, top, width, height) {
537
- let cellSelected = false;
538
- if (!skip && renderSelection && areaModel.isSelectable(rowIndex, index)) {
539
- if (this.getSelectionModel) {
540
- const selectionModel = this.getSelectionModel();
541
- if (selectionModel) {
542
- const count = selectionModel.getSelectionCount(rowIndex, index);
543
- cellSelected = count > 0;
544
- for (let i = 0; i < count; i++) {
545
- const div = this.dom.applyStylePosistionAbsolute(this.dom.createDivWithClass("ge-table-selected-range", parent));
546
- this.dom.setStyle(div, "left", `${left}px`);
547
- this.dom.setStyle(div, "top", `${top}px`);
548
- this.dom.setStyle(div, "width", `${width}px`);
549
- this.dom.setStyle(div, "height", `${height}px`);
550
- }
551
- }
552
- }
553
- }
554
- return cellSelected;
555
- }
556
- renderCell(areaModel, areaIdent, rowIndex, columnIndex, left, top, width, height, parent, cellSelected) {
557
- const [div, fn] = this.addAndRenderCellDiv({
558
- areaModel,
559
- areaIdent,
560
- rowIndex,
561
- index: columnIndex,
562
- left,
563
- width,
564
- height,
565
- top,
566
- parent
567
- });
568
- if (cellSelected) {
569
- this.dom.addClass("ge-cell-selected", div);
570
- }
571
- if (fn) {
572
- this.cleanupFunctions[areaIdent].push(fn);
573
- }
574
- }
575
- renderHeaderCellResizeHandle(rowIndex, columnIndex, cellLeft, cellTop, cellWidth, cellHeight, parent) {
576
- const domService = this.dom.domService;
577
- const handleWidth = this.tableOptions.columnResizeHandleWidthInPx ?? 3;
578
- const div = domService.createElement("div");
579
- domService.setAttribute(div, "data-col-index", `${columnIndex}`);
580
- domService.setAttribute(div, "data-row-index", `${rowIndex}`);
581
- domService.setAttribute(div, "data-area", "header");
582
- domService.setAttribute(div, "data-ge-action", "resize-column");
583
- // domService.setAttribute(div, 'data-ge-action', 'column-resize');
584
- domService.addClass(div, `ge-table-col-resize-handle`);
585
- domService.setStyle(div, "display", "clip");
586
- domService.setStyle(div, "position", "absolute");
587
- domService.setStyle(div, "cursor", "col-resize");
588
- domService.setStyle(div, "left", `${(cellLeft + cellWidth - handleWidth)}px`);
589
- domService.setStyle(div, "top", `${cellTop}px`);
590
- domService.setStyle(div, "width", `${handleWidth}px`);
591
- domService.setStyle(div, "height", `${cellHeight}px`);
592
- domService.appendChild(parent, div);
593
- }
594
- }
595
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXNjb3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90YWJsZS9zcmMvbGliL3RhYmxlL3JlbmRlci1zY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBYXZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRXZGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxNQUFNLE9BQU8sV0FBWSxTQUFRLFFBQVE7SUErQnZDLFlBQ0UsV0FBMkIsRUFDM0IsVUFBd0IsRUFDeEIsR0FBMEIsRUFDMUIsWUFBNEI7UUFFNUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBaEMxQyxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRVQscUJBQWdCLEdBSS9CO1lBQ0YsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUNRLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQUNqQyx3QkFBbUIsR0FBMEMsSUFBSSxhQUFhLEVBQXNCLENBQUM7UUFDckcseUJBQW9CLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUIsOEJBQXlCLEdBQUcsQ0FBQyxDQUFD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QUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2hELFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDdEQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUN0RCxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVTY29wZSB9IGZyb20gXCIuL2VsZS1zY29wZVwiO1xuaW1wb3J0IHsgVGFibGVNb2RlbElmIH0gZnJvbSBcIi4vZGF0YS90YWJsZW1vZGVsL3RhYmxlLW1vZGVsLmlmXCI7XG5pbXBvcnQgeyBDb252ZW5pZW5jZURvbVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlL2NvbnZlbmllbmNlLWRvbS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUYWJsZU9wdGlvbnNJZiB9IGZyb20gXCIuL2RhdGEvb3B0aW9ucy90YWJsZS1vcHRpb25zLmlmXCI7XG5pbXBvcnQgeyBDZWxsUmFuZ2UgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9jZWxsLXJhbmdlXCI7XG5pbXBvcnQgeyBSZW5kZXJlckNsZWFudXBGblR5cGUgfSBmcm9tIFwiLi9yZW5kZXJlci9yZW5kZXJlci1jbGVhbnVwLWZuLnR5cGVcIjtcbmltcG9ydCB7IEFyZWFJZGVudCB9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhLWlkZW50LnR5cGVcIjtcbmltcG9ydCB7IFNpZGVJZGVudCB9IGZyb20gXCIuL2RhdGEvc2lkZS1pZGVudC50eXBlXCI7XG5pbXBvcnQgeyBEaXZTY29wZSB9IGZyb20gXCIuL2RhdGEvZGl2LXNjb3BlLnR5cGVcIjtcbmltcG9ydCB7IEFyZWFNb2RlbElmIH0gZnJvbSBcIi4vZGF0YS90YWJsZW1vZGVsL2FyZWFtb2RlbC9hcmVhLW1vZGVsLmlmXCI7XG5pbXBvcnQgeyBBcmdzQWRqdXN0Q29sdW1uc1RvUm93UGFyZW50UGFyYW1zIH0gZnJvbSBcIi4vZGF0YS9jb21tb24vYXJncy1hZGp1c3QtY29sdW1ucy10by1yb3ctcGFyZW50LXBhcmFtc1wiO1xuaW1wb3J0IHsgQXJnc1JlbmRlckNlbGxEaXYgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9hcmdzLXJlbmRlci1jZWxsLWRpdlwiO1xuaW1wb3J0IHsgVHJlZUFycm93VHlwZSB9IGZyb20gXCIuL2RhdGEvY29tbW9uL3RyZWUtYXJyb3cudHlwZVwiO1xuaW1wb3J0IHsgVHJlZVJvdyB9IGZyb20gXCIuL2RhdGEvY29tbW9uL3RyZWUtcm93XCI7XG5pbXBvcnQgeyBTdG9yZVN0YXRlU2Nyb2xsUG9zU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2Uvc3RvcmUtc3RhdGUtc2Nyb2xsLXBvcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBHZU1vdXNlRXZlbnQgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9ldmVudC9nZS1tb3VzZS1ldmVudFwiO1xuaW1wb3J0IHsgQXJlYU1vZGVsVHJlZSB9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhbW9kZWwvYXJlYS1tb2RlbC10cmVlXCI7XG5pbXBvcnQgeyBHZW9EYXRhIH0gZnJvbSBcIi4vZGF0YS9nZW8tZGF0YVwiO1xuaW1wb3J0IHsgQ2VsbFJlbmRlcmVySWYgfSBmcm9tIFwiLi9yZW5kZXJlci9jZWxsLXJlbmRlci5pZlwiO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWxJZiB9IGZyb20gXCIuL3NlbGVjdGlvbi9zZWxlY3Rpb24tbW9kZWwuaWZcIjtcbmltcG9ydCB7IEdldFQgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9nZXQtdFwiO1xuaW1wb3J0IHsgRm9jdXNNb2RlbElmIH0gZnJvbSBcIi4vZm9jdXMvZm9jdXMtbW9kZWwuaWZcIjtcbmltcG9ydCB7IENvbEFuZFJvd3NwYW5Nb2RlbCB9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhbW9kZWwvY29sLWFuZC1yb3dzcGFuLW1vZGVsXCI7XG5pbXBvcnQgeyBBcmVhT2JqZWN0TWFwVHlwZSB9IGZyb20gXCIuL2RhdGEvY29tbW9uL2FyZWEtbWFwLnR5cGVcIjtcbmltcG9ydCB7IEFyZWFPYmplY3RNYXAgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9hcmVhLW1hcFwiO1xuXG5leHBvcnQgY2xhc3MgUmVuZGVyU2NvcGUgZXh0ZW5kcyBFbGVTY29wZSB7XG5cbiAgcHJvdGVjdGVkIHN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlPzogU3RvcmVTdGF0ZVNjcm9sbFBvc1NlcnZpY2U7XG4gIHByb3RlY3RlZCBnZXRTZWxlY3Rpb25Nb2RlbD86IEdldFQ8U2VsZWN0aW9uTW9kZWxJZj47XG4gIHByb3RlY3RlZCBnZXRGb2N1c01vZGVsPzogR2V0VDxGb2N1c01vZGVsSWY+OyAvLyBUT0RPIHVzZSBpdCFcbiAgcHJvdGVjdGVkIHNjcm9sbExlZnQgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsVmlld3BvcnRMZWZ0ID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbEZhY3RvclkgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsRmFjdG9yWCA9IDA7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsZWFudXBGdW5jdGlvbnM6IHtcbiAgICBoZWFkZXI6IChSZW5kZXJlckNsZWFudXBGblR5cGUpW10sXG4gICAgYm9keTogKFJlbmRlcmVyQ2xlYW51cEZuVHlwZSlbXSxcbiAgICBmb290ZXI6IChSZW5kZXJlckNsZWFudXBGblR5cGUpW10sXG4gIH0gPSB7XG4gICAgaGVhZGVyOiBbXSxcbiAgICBib2R5OiBbXSxcbiAgICBmb290ZXI6IFtdXG4gIH07XG4gIHByb3RlY3RlZCB0cmVlID0gZmFsc2U7XG4gIHByb3RlY3RlZCByYW5nZUVsZXM6IEhUTUxEaXZFbGVtZW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIGNvbEFuZFJvd3NwYW5Nb2RlbHM6IEFyZWFPYmplY3RNYXBUeXBlPENvbEFuZFJvd3NwYW5Nb2RlbD4gPSBuZXcgQXJlYU9iamVjdE1hcDxDb2xBbmRSb3dzcGFuTW9kZWw+KCk7XG4gIHByb3RlY3RlZCBmaXJzdFZpc2libGVSb3dJbmRleCA9IC0xO1xuXG4gIHByb3RlY3RlZCBkcmFnZ2luZ1RhcmdldENvbHVtbkluZGV4ID0gLTE7XG4gIHByb3RlY3RlZCBtb3VzZUV2ZW50PzogR2VNb3VzZUV2ZW50O1xuICBwcml2YXRlIGRlYm91bmNlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbDtcbiAgcHJpdmF0ZSBlZGl0b3JSZW5kZXJlcj86IENlbGxSZW5kZXJlcklmO1xuICBwcml2YXRlIGVkaXRvclJlbmRlcmVyQ29sdW1uPzogbnVtYmVyO1xuICBwcml2YXRlIGVkaXRvclJlbmRlcmVyUm93PzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3RFbGVtZW50OiBIVE1MRGl2RWxlbWVudCxcbiAgICB0YWJsZU1vZGVsOiBUYWJsZU1vZGVsSWYsXG4gICAgZG9tOiBDb252ZW5pZW5jZURvbVNlcnZpY2UsXG4gICAgdGFibGVPcHRpb25zOiBUYWJsZU9wdGlvbnNJZlxuICApIHtcbiAgICBzdXBlcihob3N0RWxlbWVudCwgdGFibGVNb2RlbCwgZG9tLCB0YWJsZU9wdGlvbnMpO1xuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucz8uZ2V0U2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwgPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVPcHRpb25zPy5nZXRGb2N1c01vZGVsKSB7XG4gICAgICB0aGlzLmdldEZvY3VzTW9kZWwgPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRGb2N1c01vZGVsO1xuICAgIH1cbiAgICBpZiAodGFibGVNb2RlbC5nZXRBcmVhTW9kZWwoXCJib2R5XCIpIGluc3RhbmNlb2YgQXJlYU1vZGVsVHJlZSkge1xuICAgICAgdGhpcy50cmVlID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYWVyZWFJZHM6IEFyZWFJZGVudFtdID0gW1wiaGVhZGVyXCIsIFwiYm9keVwiLCBcImZvb3RlclwiXTtcbiAgICBhZXJlYUlkcy5mb3JFYWNoKFxuICAgICAgYXJlYUlkZW50ID0+IHtcbiAgICAgICAgdGhpcy5jb2xBbmRSb3dzcGFuTW9kZWxzW2FyZWFJZGVudF0gPSBuZXcgQ29sQW5kUm93c3Bhbk1vZGVsKHRhYmxlTW9kZWwsIHRhYmxlTW9kZWwuZ2V0QXJlYU1vZGVsKGFyZWFJZGVudCkpO1xuICAgICAgICB0aGlzLmNvbEFuZFJvd3NwYW5Nb2RlbHNbYXJlYUlkZW50XT8uaW5pdCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByZXNldEVkaXRvclJlbmRlcmVyKCkge1xuICAgIHRoaXMuZWRpdG9yUmVuZGVyZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0b3JSZW5kZXJlclJvdyA9IC0xO1xuICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPSAtMTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICBjb25zdCBzbSA9IHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHNtPy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRSZW5kZXJFZGl0b3Iocm93SWR4OiBudW1iZXIsIGNvbElkeDogbnVtYmVyKSB7XG4gICAgbGV0IHJuRm4gPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGNvbElkeCk/LmdldEVkaXRSZW5kZXJlcjtcbiAgICBpZiAoIXJuRm4pIHtcbiAgICAgIHJuRm4gPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRFZGl0UmVuZGVyZXI7XG4gICAgfVxuICAgIGlmIChybkZuKSB7XG4gICAgICB0aGlzLmVkaXRvclJlbmRlcmVyID0gcm5Gbihyb3dJZHgsIGNvbElkeCk7XG5cbiAgICAgIGlmICh0aGlzLmVkaXRvclJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJSb3cgPSByb3dJZHg7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPSBjb2xJZHg7XG4gICAgICAgIHRoaXMucmVwYWludCgpO1xuICAgICAgICAvLyByZXF1ZXN0IGZvY3VzOlxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dC5nZS10YWJsZS1jZWxsLWVkaXRvci1pbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJSb3cgPSAtMTtcbiAgICAgICAgdGhpcy5lZGl0b3JSZW5kZXJlckNvbHVtbiA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlcGFpbnQoKSB7XG4gICAgdGhpcy5hZGp1c3RBZnRlclNjcm9sbGluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmFibGVzOiBIVE1MRGl2RWxlbWVudFtdID0gW107XG5cbiAgb3ZlcnJpZGUgYWRqdXN0QWZ0ZXJTY3JvbGxpbmcoKSB7XG4gICAgZm9yIChjb25zdCBjbGVhbmluZyBvZiB0aGlzLnJlbW92YWJsZXMpIHtcbiAgICAgIGNsZWFuaW5nLnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVIb3ZlclJvdygpO1xuICAgIHRoaXMuaGlkZUhvdmVyQ29sdW1uKCk7XG5cbiAgICB0aGlzLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9wO1xuICAgIHRoaXMuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsTGVmdDtcbiAgICB0aGlzLmRlYm91bmNlKHRoaXMuY2hlY2tGb3JTY3JvbGxQb3NTYXZpbmcuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnNjcm9sbEZhY3RvclkgPSB0aGlzLnNjcm9sbFRvcCAvICh0aGlzLnNjcm9sbFZpZXdwb3J0LnNjcm9sbEhlaWdodCAtIHRoaXMuc2Nyb2xsVmlld3BvcnQuY2xpZW50SGVpZ2h0KTtcbiAgICB0aGlzLnNjcm9sbEZhY3RvclggPSB0aGlzLnNjcm9sbExlZnQgLyAodGhpcy5zY3JvbGxWaWV3cG9ydC5zY3JvbGxXaWR0aCAtIHRoaXMuc2Nyb2xsVmlld3BvcnQuY2xpZW50V2lkdGgpO1xuXG4gICAgaWYgKGlzTmFOKHRoaXMuc2Nyb2xsRmFjdG9yWSkpIHtcbiAgICAgIHRoaXMuc2Nyb2xsRmFjdG9yWSA9IDA7XG4gICAgfVxuICAgIGlmIChpc05hTih0aGlzLnNjcm9sbEZhY3RvclgpKSB7XG4gICAgICB0aGlzLnNjcm9sbEZhY3RvclggPSAwO1xuICAgIH1cblxuICAgIHRoaXMuYWRqdXN0Qm9keSgpO1xuICAgIHRoaXMuYWRqdXN0QXJlYShcImZvb3RlclwiKTtcbiAgICB0aGlzLmFkanVzdEFyZWEoXCJoZWFkZXJcIik7XG5cblxuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucy50YWJsZVRvcEJvcmRlclZpc2libGUpIHtcbiAgICAgIHRoaXMucmVtb3ZhYmxlcy5wdXNoKHRoaXMuZG9tLmFkZEhvcml6b250YWxCb3JkZXIoXG4gICAgICAgIG5ldyBHZW9EYXRhKDAsIHRoaXMuaG9zdEVsZW1lbnQuY2xpZW50V2lkdGgsIDEsIDApLFxuICAgICAgICB0aGlzLmhvc3RFbGVtZW50LFxuICAgICAgICBcImdlLXRhYmxlLXJvdy1ib3JkZXJcIikpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YWJsZU9wdGlvbnMudGFibGVCb3R0b21Cb3JkZXJWaXNpYmxlKSB7XG4gICAgICB0aGlzLnJlbW92YWJsZXMucHVzaCh0aGlzLmRvbS5hZGRIb3Jpem9udGFsQm9yZGVyKFxuICAgICAgICBuZXcgR2VvRGF0YSgwLCB0aGlzLmhvc3RFbGVtZW50LmNsaWVudFdpZHRoLCAxLCB0aGlzLmhvc3RFbGVtZW50LmNsaWVudEhlaWdodCAtIDEpLFxuICAgICAgICB0aGlzLmhvc3RFbGVtZW50LFxuICAgICAgICBcImdlLXRhYmxlLXJvdy1ib3JkZXJcIikpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRm9yU2Nyb2xsUG9zU2F2aW5nKCkge1xuICAgIGlmICh0aGlzLnN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlXG4gICAgICAmJiB0aGlzLnRhYmxlT3B0aW9ucz8uYXV0b1Jlc3RvcmVPcHRpb25zPy5hdXRvUmVzdG9yZVNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlLnVwZGF0ZVNjcm9sbE9mZnNldChbdGhpcy5zY3JvbGxMZWZ0LCB0aGlzLnNjcm9sbFRvcF0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBcmVhQW5kU2lkZUlkZW50QnlBdHRyKHNyY0VsZW1lbnQ6IEhUTUxFbGVtZW50KTogW0FyZWFJZGVudCB8IHVuZGVmaW5lZCwgU2lkZUlkZW50IHwgdW5kZWZpbmVkXSB7XG4gICAgaWYgKHNyY0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGRhdGFBcmVhID0gdGhpcy5nZXRTdHJpbmdCeUF0dHIoc3JjRWxlbWVudCwgXCJkYXRhLWFyZWFcIik7XG4gICAgICBjb25zdCBkYXRhU2lkZSA9IHRoaXMuZ2V0U3RyaW5nQnlBdHRyKHNyY0VsZW1lbnQsIFwiZGF0YS1zaWRlXCIpO1xuICAgICAgLy8gZm9vdGVyIGdlaHQgbmljaHQgIGNvbnNvbGUuaW5mbyhkYXRhQXJlYSwgc3JjRWxlbWVudClcbiAgICAgIGlmIChkYXRhU2lkZSAmJiBkYXRhQXJlYSkge1xuICAgICAgICByZXR1cm4gW2RhdGFBcmVhLCBkYXRhU2lkZV0gYXMgW0FyZWFJZGVudCwgU2lkZUlkZW50XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXJlYShyb3dJZGVudDogQXJlYUlkZW50LCBzaWRlSWRlbnQ6IFNpZGVJZGVudCk6IERpdlNjb3BlIHtcbiAgICBpZiAocm93SWRlbnQgPT09IFwiaGVhZGVyXCIpIHtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwid2VzdFwiKSByZXR1cm4gdGhpcy5hcmVhSGVhZGVyV2VzdDtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwiY2VudGVyXCIpIHJldHVybiB0aGlzLmFyZWFIZWFkZXJDZW50ZXI7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSBcImVhc3RcIikgcmV0dXJuIHRoaXMuYXJlYUhlYWRlckVhc3Q7XG4gICAgfSBlbHNlIGlmIChyb3dJZGVudCA9PT0gXCJib2R5XCIpIHtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwid2VzdFwiKSByZXR1cm4gdGhpcy5hcmVhQm9keVdlc3Q7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSBcImNlbnRlclwiKSByZXR1cm4gdGhpcy5hcmVhQm9keUNlbnRlcjtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwiZWFzdFwiKSByZXR1cm4gdGhpcy5hcmVhQm9keUVhc3Q7XG4gICAgfSBlbHNlIGlmIChyb3dJZGVudCA9PT0gXCJmb290ZXJcIikge1xuICAgICAgaWYgKHNpZGVJZGVudCA9PT0gXCJ3ZXN0XCIpIHJldHVybiB0aGlzLmFyZWFGb290ZXJXZXN0O1xuICAgICAgaWYgKHNpZGVJZGVudCA9PT0gXCJjZW50ZXJcIikgcmV0dXJuIHRoaXMuYXJlYUZvb3RlckNlbnRlcjtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwiZWFzdFwiKSByZXR1cm4gdGhpcy5hcmVhRm9vdGVyRWFzdDtcbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoYFdyb25nIGFyZWEgaWRlbnRpZmllcjogcm93OiR7cm93SWRlbnR9LCBjb2w6JHtzaWRlSWRlbnR9YCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRqdXN0Qm9keSgpIHtcbiAgICBjb25zdCB2aXJ0dWFsUm93RGl2VG9wRjEgPSB0aGlzLmFyZWFCb2R5Q2VudGVyR2VvLmhlaWdodCAtIHRoaXMudGFibGVNb2RlbC5nZXRDb250ZW50SGVpZ2h0SW5QaXhlbCgpO1xuICAgIGNvbnN0IHZpcnR1YWxSb3dEaXZUb3AgPSB0aGlzLnNjcm9sbEZhY3RvclkgKiB2aXJ0dWFsUm93RGl2VG9wRjE7XG5cbiAgICB0aGlzLmRvbS5zZXRTdHlsZSh0aGlzLmNvbnRlbnREaXYsIFwidG9wXCIsIGAke3RoaXMuc2Nyb2xsVG9wfXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUodGhpcy5jb250ZW50RGl2LCBcImxlZnRcIiwgYCR7dGhpcy5zY3JvbGxWaWV3cG9ydC5zY3JvbGxMZWZ0fXB4YCk7XG5cbiAgICB0aGlzLmFkanVzdEFyZWEoXCJib2R5XCIsIHZpcnR1YWxSb3dEaXZUb3ApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE51bWJlckJ5QXR0cihzcmNFbGVtZW50OiBIVE1MRWxlbWVudCwga2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChzcmNFbGVtZW50KSB7XG4gICAgICBjb25zdCBhdHRyID0gc3JjRWxlbWVudC5jbG9zZXN0KFwiW1wiICsga2V5ICsgXCJdXCIpPy5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIGlmIChhdHRyKSByZXR1cm4gTnVtYmVyKGF0dHIpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U3RyaW5nQnlBdHRyKHNyY0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNyY0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBzcmNFbGVtZW50LmNsb3Nlc3QoXCJbXCIgKyBrZXkgKyBcIl1cIik/LmdldEF0dHJpYnV0ZShrZXkpO1xuICAgICAgaWYgKGF0dHIpIHJldHVybiBhdHRyO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGp1c3RBcmVhKGFyZWFJZGVudDogQXJlYUlkZW50LCB5U3RhcnQ6IG51bWJlciA9IDApIHtcbiAgICBjb25zdCB3ZXN0QXJlYSA9IHRoaXMuZ2V0QXJlYShhcmVhSWRlbnQsIFwid2VzdFwiKTtcbiAgICBjb25zdCBjZW50ZXJBcmVhID0gdGhpcy5nZXRBcmVhKGFyZWFJZGVudCwgXCJjZW50ZXJcIik7XG4gICAgY29uc3QgZWFzdEFyZWEgPSB0aGlzLmdldEFyZWEoYXJlYUlkZW50LCBcImVhc3RcIik7XG4gICAgY29uc3QgZGl2SGVpZ2h0ID0gY2VudGVyQXJlYS5jaGlsZC5jbGllbnRIZWlnaHQ7XG5cbiAgICB3ZXN0QXJlYS5jaGlsZC5pbm5lclRleHQgPSBcIlwiO1xuICAgIGNlbnRlckFyZWEuY2hpbGQuaW5uZXJUZXh0ID0gXCJcIjtcbiAgICBlYXN0QXJlYS5jaGlsZC5pbm5lclRleHQgPSBcIlwiO1xuICAgIGNvbnN0IGxlZnQgPSAwO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aDtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy50YWJsZU1vZGVsLmdldFBhZGRpbmcoKTtcbiAgICBjb25zdCBhcmVhTW9kZWwgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0QXJlYU1vZGVsKGFyZWFJZGVudCk7XG4gICAgY29uc3Qgcm93Q291bnQgPSBhcmVhTW9kZWwuZ2V0Um93Q291bnQoKTtcbiAgICBjb25zdCBib2R5QXJlYSA9IGFyZWFJZGVudCA9PT0gXCJib2R5XCI7XG4gICAgY29uc3QgaGVhZGVyQXJlYSA9IGFyZWFJZGVudCA9PT0gXCJoZWFkZXJcIjtcblxuICAgIHdoaWxlICh0aGlzLmNsZWFudXBGdW5jdGlvbnNbYXJlYUlkZW50XS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZuID0gdGhpcy5jbGVhbnVwRnVuY3Rpb25zW2FyZWFJZGVudF0uc2hpZnQoKTtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgeSA9IHlTdGFydDtcblxuICAgIGNvbnN0IGNvbHVtbkNvdW50ID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbkNvdW50KCk7XG4gICAgY29uc3QgZml4ZWRSaWdodENvbHVtbkNvdW50ID0gdGhpcy50YWJsZU1vZGVsLmdldEZpeGVkUmlnaHRDb2x1bW5Db3VudCgpO1xuICAgIGNvbnN0IGZpeGVkTGVmdENvbHVtbkNvdW50ID0gdGhpcy50YWJsZU1vZGVsLmdldEZpeGVkTGVmdENvbHVtbkNvdW50KCk7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm93Q291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRvcCA9IHk7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Um93SGVpZ2h0KGFyZWFJZGVudCwgaW5kZXgpO1xuICAgICAgaWYgKHRvcCArIGhlaWdodCA+IDApIHtcbiAgICAgICAgLy8gVmlzaWJsZSFcbiAgICAgICAgdGhpcy5maXJzdFZpc2libGVSb3dJbmRleCA9IGluZGV4O1xuXG4gICAgICAgIC8vIGNlbnRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGxldCBnZW8gPSB7IGxlZnQsIHdpZHRoLCBoZWlnaHQsIHRvcCwgaW5kZXggfTtcbiAgICAgICAgbGV0IHJvd0RpdiA9IHRoaXMuZG9tLmFkZFJvd0RpdihjZW50ZXJBcmVhLCBnZW8sIGluZGV4LCBhcmVhSWRlbnQpO1xuICAgICAgICBjb25zdCBjZW50ZXJTdGFydENvbCA9IGZpeGVkTGVmdENvbHVtbkNvdW50O1xuXG4gICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1RvUm93UGFyZW50KHtcbiAgICAgICAgICBhcmVhSWRlbnQsXG4gICAgICAgICAgc2lkZUlkZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgIGFyZWFNb2RlbCxcbiAgICAgICAgICBnZW8sXG4gICAgICAgICAgcGFyZW50OiByb3dEaXYsXG4gICAgICAgICAgcm93SW5kZXg6IGluZGV4LFxuICAgICAgICAgIGNvbHVtbkluZGV4U3RhcnQ6IGNlbnRlclN0YXJ0Q29sLFxuICAgICAgICAgIGNvbHVtbkluZGV4RW5kOiBjb2x1bW5Db3VudCAtIGZpeGVkUmlnaHRDb2x1bW5Db3VudCAtIDEsXG4gICAgICAgICAgdmVydGljYWxGaXhlZDogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gd2VzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGlmIChwYWRkaW5nLmxlZnQgPiAwKSB7XG4gICAgICAgICAgZ2VvID0geyBsZWZ0LCB3aWR0aDogdGhpcy5hcmVhQm9keVdlc3RHZW8ud2lkdGgsIGhlaWdodCwgdG9wLCBpbmRleCB9O1xuICAgICAgICAgIHJvd0RpdiA9IHRoaXMuZG9tLmFkZFJvd0Rpdih3ZXN0QXJlYSwgZ2VvLCBpbmRleCwgYXJlYUlkZW50KTtcbiAgICAgICAgICB0aGlzLmFkanVzdENvbHVtbnNUb1Jvd1BhcmVudCh7XG4gICAgICAgICAgICBhcmVhSWRlbnQsXG4gICAgICAgICAgICBzaWRlSWRlbnQ6IFwid2VzdFwiLFxuICAgICAgICAgICAgYXJlYU1vZGVsLFxuICAgICAgICAgICAgZ2VvLFxuICAgICAgICAgICAgcGFyZW50OiByb3dEaXYsXG4gICAgICAgICAgICByb3dJbmRleDogaW5kZXgsXG4gICAgICAgICAgICBjb2x1bW5JbmRleFN0YXJ0OiAwLFxuICAgICAgICAgICAgY29sdW1uSW5kZXhFbmQ6IGNlbnRlclN0YXJ0Q29sIC0gMSxcbiAgICAgICAgICAgIHZlcnRpY2FsRml4ZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVhc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBpZiAocGFkZGluZy5yaWdodCA+IDApIHtcbiAgICAgICAgICBnZW8gPSB7IGxlZnQsIHdpZHRoOiB0aGlzLmFyZWFCb2R5RWFzdEdlby53aWR0aCwgaGVpZ2h0LCB0b3AsIGluZGV4IH07XG4gICAgICAgICAgcm93RGl2ID0gdGhpcy5kb20uYWRkUm93RGl2KGVhc3RBcmVhLCBnZW8sIGluZGV4LCBhcmVhSWRlbnQpO1xuICAgICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1RvUm93UGFyZW50KHtcbiAgICAgICAgICAgIGFyZWFJZGVudCxcbiAgICAgICAgICAgIHNpZGVJZGVudDogXCJlYXN0XCIsXG4gICAgICAgICAgICBhcmVhTW9kZWwsXG4gICAgICAgICAgICBnZW8sXG4gICAgICAgICAgICBwYXJlbnQ6IHJvd0RpdixcbiAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGNvbHVtbkluZGV4U3RhcnQ6IGNvbHVtbkNvdW50IC0gZml4ZWRSaWdodENvbHVtbkNvdW50LFxuICAgICAgICAgICAgY29sdW1uSW5kZXhFbmQ6IGNvbHVtbkNvdW50IC0gMSxcbiAgICAgICAgICAgIHZlcnRpY2FsRml4ZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbGxhcHNlIC8gZXhwYW5kIGFsbDpcbiAgICAgICAgaWYgKGFyZWFJZGVudCA9PT0gXCJoZWFkZXJcIiAmJiB0aGlzLnRyZWUgJiYgaW5kZXggPT09IHJvd0NvdW50IC0gMSkge1xuICAgICAgICAgIGNvbnN0IGRpdiA9XG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBseVN0eWxlKFxuICAgICAgICAgICAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uYWRkRGl2KHJvd0RpdiwgbmV3IEdlb0RhdGEoMTYsIDIwLCAyMCwgOCkpLFxuICAgICAgICAgICAgICAgIFwiZGF0YS1nZS1hY3Rpb25cIiwgXCJ0b2dnbGVFeHBhbmRDb2xsYXBzZUFsbFwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHsgXCJjdXJzb3JcIjogXCJwb2ludGVyXCIgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB0cmVlT3B0aW9uc0Fycm93ID0gdGhpcy50YWJsZU9wdGlvbnMudHJlZU9wdGlvbnMuYXJyb3dFeHBhbmRDb2xsYXBzZUFsbDtcbiAgICAgICAgICBpZiAodHJlZU9wdGlvbnNBcnJvdykge1xuICAgICAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLmRvbS5kb21TZXJ2aWNlLmNyZWF0ZVRleHQodHJlZU9wdGlvbnNBcnJvdy5jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmRvbVNlcnZpY2UuYXBwZW5kQ2hpbGQoZGl2LCB0ZXh0RWxlbWVudCk7XG4gICAgICAgICAgICBpZiAodHJlZU9wdGlvbnNBcnJvdy5zdHlsZSkge1xuICAgICAgICAgICAgICB0aGlzLmRvbS5hcHBseVN0eWxlU3RyaW5nKGRpdiwgdHJlZU9wdGlvbnNBcnJvdy5zdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICAgIHkgPSB5ICsgaGVpZ2h0O1xuICAgICAgLy8gbGFzdFZpc2libGVSb3dJbmRleCA9IGluZGV4O1xuICAgICAgaWYgKHkgPiBkaXZIZWlnaHQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBmb3JcblxuICAgIC8vIFdlIGRyYXcgdGhlIGJpZyBjb2xzcGFuIGFuZCByb3dzcGFuIGNlbGxzIGF0IHRoZSBlbmQuXG4gICAgLy8gVGhpcyBmaXhlcyB0aGUgJ2hhbGYgY3V0dGVkIGJpZyBjZWxsJyBwcm9ibGVtOlxuICAgIGlmICh0aGlzLmNvbEFuZFJvd3NwYW5Nb2RlbHMgJiYgdGhpcy5jb2xBbmRSb3dzcGFuTW9kZWxzW2FyZWFJZGVudF0pIHtcbiAgICAgIC8vIGRyYXcgY29sL3Jvd3NwYW4gY2VsbHMgYWdhaW46XG4gICAgICBjb25zdCByYW5nZXMgPSB0aGlzLmNvbEFuZFJvd3NwYW5Nb2RlbHNbYXJlYUlkZW50XT8uZ2V0UmFuZ2VzKCkgPz8gW107XG4gICAgICBpZiAocmFuZ2VzLmxlbmd0aCkge1xuXG4gICAgICAgIGZvciAoY29uc3QgcmFuZ2Ugb2YgcmFuZ2VzKSB7XG4gICAgICAgICAgbGV0IHhTdGFydCA9IDA7XG4gICAgICAgICAgbGV0IGNoaWxkOiBIVE1MRGl2RWxlbWVudCA9IGNlbnRlckFyZWEuY2hpbGQ7XG4gICAgICAgICAgaWYgKHJhbmdlLmMxIDwgZml4ZWRMZWZ0Q29sdW1uQ291bnQpIHtcbiAgICAgICAgICAgIC8vIFdlc3Q6XG4gICAgICAgICAgICBjaGlsZCA9IHdlc3RBcmVhLmNoaWxkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZml4ZWRSaWdodENvbHVtbkNvdW50ID4gMCAmJiByYW5nZS5jMSA+PSBjb2x1bW5Db3VudCAtIGZpeGVkUmlnaHRDb2x1bW5Db3VudCkge1xuICAgICAgICAgICAgLy8gRWFzdDpcbiAgICAgICAgICAgIGNoaWxkID0gZWFzdEFyZWEuY2hpbGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENlbnRlcjpcbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxSb3dEaXZMZWZ0RjEgPSB0aGlzLmFyZWFCb2R5Q2VudGVyR2VvLndpZHRoIC0gdGhpcy50YWJsZU1vZGVsLmdldENvbnRlbnRXaWR0aEluUGl4ZWwoKTtcbiAgICAgICAgICAgIHhTdGFydCA9ICh0aGlzLnNjcm9sbEZhY3RvclggKiB2aXJ0dWFsUm93RGl2TGVmdEYxKSAtIHRoaXMuYXJlYUJvZHlXZXN0R2VvLndpZHRoO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRyYXdCaWdDZWxsKHJhbmdlLCB4U3RhcnQsIHlTdGFydCwgYXJlYU1vZGVsLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYmlnIGNlbGxzIChyb3dzcGFuIGFuZCBvciBjb2xzcGFuKSBpbiBib2R5L2NlbnRlclxuICAgKiBAcGFyYW0gcmFuZ2U6Q2VsbFJhbmdlXG4gICAqIEBwYXJhbSB4U3RhcnQgWCBwb3NpdGlvbiBpbiBwaXhlbCBmb3IgdG9wIGxlZnQgY29ybmVyXG4gICAqIEBwYXJhbSB5U3RhcnQgWSBwb3NpdGlvbiBpbiBwaXhlbCBmb3IgdG9wIGxlZnQgY29ybmVyXG4gICAqIEBwYXJhbSBhcmVhTW9kZWwgQXJlYU1vZGVsSWZcbiAgICogQHBhcmFtIHBhcmVudERpdiBQYXJlbnQgZGl2IGFzIEhUTUxEaXZFbGVtZW50XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBkcmF3QmlnQ2VsbChcbiAgICByYW5nZTogQ2VsbFJhbmdlLFxuICAgIHhTdGFydDogbnVtYmVyLFxuICAgIHlTdGFydDogbnVtYmVyLFxuICAgIGFyZWFNb2RlbDogQXJlYU1vZGVsSWYsXG4gICAgcGFyZW50RGl2OiBIVE1MRGl2RWxlbWVudCkge1xuXG4gICAgY29uc3QgeTEgPSB5U3RhcnQgKyB0aGlzLmdldFJvd0hlaWdodHMoMCwgcmFuZ2UucjEgLSAxLCBhcmVhTW9kZWwpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuXG4gICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uQ291bnQoKTtcbiAgICBjb25zdCBmaXhlZFJpZ2h0Q29sdW1uQ291bnQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Rml4ZWRSaWdodENvbHVtbkNvdW50KCk7XG4gICAgbGV0IGZpcnN0Q29sSWR4ID0gMDtcbiAgICBpZiAoZml4ZWRSaWdodENvbHVtbkNvdW50ID4gMCAmJiByYW5nZS5jMSA+PSBjb2x1bW5Db3VudCAtIGZpeGVkUmlnaHRDb2x1bW5Db3VudCkge1xuICAgICAgLy8gV2UgYXJlIG9uIHRoZSAoZml4ZWQpIGVhc3Qgc2lkZSwgc28gd2UgaGF2ZSB0byBmaXggZmlyc3RDb2xJZHg6XG4gICAgICBmaXJzdENvbElkeCA9IGNvbHVtbkNvdW50IC0gZml4ZWRSaWdodENvbHVtbkNvdW50O1xuICAgIH1cbiAgICBjb25zdCB4MSA9IHhTdGFydCArIHRoaXMuZ2V0Q29sdW1uV2lkdGhzKGZpcnN0Q29sSWR4LCByYW5nZS5jMSAtIDEpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuXG4gICAgY29uc3QgaCA9IHRoaXMuZ2V0Um93SGVpZ2h0cyhyYW5nZS5yMSwgcmFuZ2UucjIsIGFyZWFNb2RlbCkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgY29uc3QgdyA9IHRoaXMuZ2V0Q29sdW1uV2lkdGhzKHJhbmdlLmMxLCByYW5nZS5jMikucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG5cbiAgICBsZXQgY2VsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWwgPSB0aGlzLmdldFNlbGVjdGlvbk1vZGVsID8gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWxlY3Rpb25Nb2RlbCkge1xuICAgICAgY29uc3QgY291bnQgPSBzZWxlY3Rpb25Nb2RlbC5nZXRTZWxlY3Rpb25Db3VudChyYW5nZS5yMSwgcmFuZ2UuYzEpO1xuICAgICAgY2VsbFNlbGVjdGVkID0gY291bnQgPiAwO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckNlbGwoYXJlYU1vZGVsLCBhcmVhTW9kZWwuYXJlYUlkZW50LCByYW5nZS5yMSwgcmFuZ2UuYzEsIHgxLCB5MSwgdywgaCwgcGFyZW50RGl2LCBjZWxsU2VsZWN0ZWQpO1xuXG4gICAgaWYgKGFyZWFNb2RlbC5hcmVhSWRlbnQgPT09IFwiaGVhZGVyXCIgJiYgdGhpcy50YWJsZU9wdGlvbnMuY29sdW1uc1Jlc2l6YWJsZSkge1xuICAgICAgdGhpcy5yZW5kZXJIZWFkZXJDZWxsUmVzaXplSGFuZGxlKHJhbmdlLnIxLCByYW5nZS5jMSwgeDEsIHkxLCB3LCBoLCBwYXJlbnREaXYpO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGZpbmRSb3dPZkltcG9ydGFudFJvd3NwYW5DZWxsKGFyZWFNb2RlbDogQXJlYU1vZGVsSWYsIHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1heFJvd3NwYW4gPSBhcmVhTW9kZWwuZ2V0TWF4Um93c3BhbigpO1xuICAgIGZvciAobGV0IHIgPSByb3dJbmRleCAtIDE7IHIgPiAtMTsgci0tKSB7XG4gICAgICBjb25zdCByb3dzcGFuID0gYXJlYU1vZGVsLmdldFJvd3NwYW5BdChyLCBjb2xJbmRleCk7XG4gICAgICBpZiAocm93c3BhbiA+IDEgJiYgciArIHJvd3NwYW4gKyAxID49IHJvd0luZGV4KSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuICAgICAgaWYgKHJvd0luZGV4IC0gciA+IG1heFJvd3NwYW4pIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBUT0RPIHNraXAgY29scyBpbiBoZWFkZXIgYmVjYXVzZSBvZiBjb2xzcGFuXG4gIHByb3RlY3RlZCBhZGp1c3RDb2x1bW5zVG9Sb3dQYXJlbnQoXG4gICAge1xuICAgICAgYXJlYUlkZW50LFxuICAgICAgc2lkZUlkZW50LFxuICAgICAgYXJlYU1vZGVsLFxuICAgICAgZ2VvLFxuICAgICAgcGFyZW50LFxuICAgICAgcm93SW5kZXgsXG4gICAgICBjb2x1bW5JbmRleFN0YXJ0LFxuICAgICAgY29sdW1uSW5kZXhFbmQsXG4gICAgICB2ZXJ0aWNhbEZpeGVkID0gZmFsc2VcbiAgICB9OiBBcmdzQWRqdXN0Q29sdW1uc1RvUm93UGFyZW50UGFyYW1zXG4gICk6IHZvaWQge1xuXG4gICAgdGhpcy5zY3JvbGxWaWV3cG9ydExlZnQgPSB0aGlzLnNjcm9sbFZpZXdwb3J0LnNjcm9sbExlZnQ7XG4gICAgbGV0IHZpcnR1YWxSb3dEaXZMZWZ0ID0gMDtcbiAgICBpZiAoIXZlcnRpY2FsRml4ZWQpIHtcbiAgICAgIGNvbnN0IHZpcnR1YWxSb3dEaXZMZWZ0RjEgPSAodGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aCkgLSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29udGVudFdpZHRoSW5QaXhlbCgpO1xuICAgICAgdmlydHVhbFJvd0RpdkxlZnQgPSB0aGlzLnNjcm9sbEZhY3RvclggKiB2aXJ0dWFsUm93RGl2TGVmdEYxO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcCA9IDA7XG4gICAgY29uc3QgcmVuZGVyU2VsZWN0aW9uID0gISEoYXJlYUlkZW50ID09PSBcImJvZHlcIiAmJiBzaWRlSWRlbnQpO1xuXG4gICAgbGV0IHggPSB2aXJ0dWFsUm93RGl2TGVmdDtcbiAgICBmb3IgKGxldCBpbmRleCA9IGNvbHVtbkluZGV4U3RhcnQ7IGluZGV4IDw9IGNvbHVtbkluZGV4RW5kOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBsZWZ0ID0geDtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uV2lkdGgoaW5kZXgpO1xuICAgICAgaWYgKGxlZnQgKyB3ID4gMCkge1xuICAgICAgICAvLyBWaXNpYmxlISBSZW5kZXIgY2VsbCBkaXY6XG5cbiAgICAgICAgLy8gY2FsYyBoZWlnaHQ6XG4gICAgICAgIGxldCBoZWlnaHQgPSBnZW8uaGVpZ2h0O1xuICAgICAgICBsZXQgcm93c3BhbiA9IGFyZWFNb2RlbC5nZXRSb3dzcGFuQXQocm93SW5kZXgsIGluZGV4KTtcbiAgICAgICAgbGV0IGNvbHNwYW4gPSBhcmVhTW9kZWwuZ2V0Q29sc3BhbkF0KHJvd0luZGV4LCBpbmRleCk7XG5cbiAgICAgICAgaWYgKHJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgaGVpZ2h0ID0gdGhpcy5nZXRSb3dIZWlnaHRzKHJvd0luZGV4LCByb3dJbmRleCArIHJvd3NwYW4gLSAxLCBhcmVhTW9kZWwpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHdpZHRoID0gdztcbiAgICAgICAgaWYgKGNvbHNwYW4gPiAxKSB7XG4gICAgICAgICAgd2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRocyhpbmRleCwgaW5kZXggKyBjb2xzcGFuIC0gMSkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2tpcCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jb2xBbmRSb3dzcGFuTW9kZWxzICYmIHRoaXMuY29sQW5kUm93c3Bhbk1vZGVsc1thcmVhSWRlbnRdKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29sQW5kUm93c3Bhbk1vZGVsc1thcmVhSWRlbnRdPy5pc0luUmFuZ2Uocm93SW5kZXgsIGluZGV4KSkge1xuICAgICAgICAgICAgc2tpcCA9IHRydWU7IC8vIGZvciB0aGUgYm9keSBhcmVhIHdlIGRvbid0IHdhbnQgdG8gdG8gcmVuZGVyIHRoZSBzbWFsbCBzaW5nbGUgY2VsbHNcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZ1RhcmdldENvbHVtbkluZGV4ID09PSBpbmRleCAmJiBhcmVhSWRlbnQgIT09IFwiaGVhZGVyXCIpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlckRyYWdUYXJnZXREaXYocGFyZW50LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgIHRoaXMuZG9tLmFkZENvbHVtbkJvcmRlckRpdnMocGFyZW50LCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBjZWxsU2VsZWN0ZWQgPSB0aGlzLnJlbmRlclNlbGVjdGVkQmFja2dyb3VuZERpdihza2lwLCByZW5kZXJTZWxlY3Rpb24sIGFyZWFNb2RlbCwgcm93SW5kZXgsIGluZGV4LCBwYXJlbnQsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgICBpZiAoIXNraXApIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ2VsbChhcmVhTW9kZWwsIGFyZWFJZGVudCwgcm93SW5kZXgsIGluZGV4LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIHBhcmVudCwgY2VsbFNlbGVjdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFyZWFJZGVudCA9PT0gXCJoZWFkZXJcIiAmJiB0aGlzLnRhYmxlT3B0aW9ucy5jb2x1bW5zUmVzaXphYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckhlYWRlckNlbGxSZXNpemVIYW5kbGUocm93SW5kZXgsIGluZGV4LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIHBhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHggPSB4ICsgdztcbiAgICAgIGlmICh4ID4gdGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmlnaHQgdmVydGljYWwgYm9yZGVyOlxuICAgIHRoaXMuZG9tLmFkZFZlcnRpY2FsQm9yZGVyKG5ldyBHZW9EYXRhKHggLSAxLCAxLCBnZW8uaGVpZ2h0LCAwKSwgcGFyZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUcmVlQXJyb3dDb2x1bW5JbmRleCgpOiAwIHwgMSB7XG4gICAgaWYgKHRoaXMudGFibGVPcHRpb25zLnNob3dDaGVja2JveFdpaG91dEV4dHJhQ29sdW1uKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVNb2RlbC5pc1Jvd0NoZWNrYm94VmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkQW5kUmVuZGVyQ2VsbERpdihcbiAgICB7XG4gICAgICBhcmVhTW9kZWwsXG4gICAgICBhcmVhSWRlbnQsXG4gICAgICByb3dJbmRleCxcbiAgICAgIGluZGV4LFxuICAgICAgbGVmdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdG9wLFxuICAgICAgcGFyZW50XG4gICAgfTogQXJnc1JlbmRlckNlbGxEaXYpOiBbSFRNTERpdkVsZW1lbnQsIFJlbmRlcmVyQ2xlYW51cEZuVHlwZSB8IHVuZGVmaW5lZF0ge1xuXG5cbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlbmRlcmVyICYmIHRoaXMuZWRpdG9yUmVuZGVyZXJSb3cgPT09IHJvd0luZGV4ICYmIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPT09IGluZGV4O1xuICAgIGNvbnN0IGNlbGxSZW5kZXJlciA9IChlZGl0b3IpID8gdGhpcy5lZGl0b3JSZW5kZXJlciA6IGFyZWFNb2RlbC5nZXRDZWxsUmVuZGVyZXIocm93SW5kZXgsIGluZGV4KTtcbiAgICBjb25zdCBnZW8gPSB7IGxlZnQsIHdpZHRoLCBoZWlnaHQsIHRvcCwgaW5kZXggfTtcbiAgICBjb25zdCByb3dPYmplY3QgPSBhcmVhTW9kZWwuZ2V0Um93QnlJbmRleChyb3dJbmRleCk7XG4gICAgbGV0IHRyZWVBcnJvdzogVHJlZUFycm93VHlwZSA9IFwibm9uZVwiO1xuXG4gICAgY29uc3QgYXJyb3dJbmRleE9rID0gaW5kZXggPT09IHRoaXMuZ2V0VHJlZUFycm93Q29sdW1uSW5kZXgoKTtcblxuICAgIGlmIChhcnJvd0luZGV4T2sgJiYgcm93T2JqZWN0IGluc3RhbmNlb2YgVHJlZVJvdykge1xuICAgICAgY29uc3QgdHIgPSByb3dPYmplY3QgYXMgVHJlZVJvdzxhbnk+O1xuICAgICAgaWYgKHRyLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRyLmV4cGFuZGVkKSB7XG4gICAgICAgICAgdHJlZUFycm93ID0gXCJleHBhbmRlZFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyZWVBcnJvdyA9IFwiY29sbGFwc2VkXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyZWVBcnJvdyA9IFwiaGlkZGVuXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNvcnRTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJlYUlkZW50ID09PSBcImhlYWRlclwiKSB7XG4gICAgICBjb25zdCBjb2x1bW5EZWYgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGluZGV4KTtcbiAgICAgIGlmICghY29sdW1uRGVmPy5zb3J0SWNvblZpc2libGUgfHwgY29sdW1uRGVmPy5zb3J0SWNvblZpc2libGUoKSkge1xuICAgICAgICBzb3J0U3RhdGUgPSBjb2x1bW5EZWY/LnNvcnRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB2YWwgPSBhcmVhTW9kZWwuZ2V0VmFsdWVBdChyb3dJbmRleCwgaW5kZXgpO1xuICAgIGNvbnN0IHRleHQgPSBjZWxsUmVuZGVyZXIgPyBcIlwiIDogYCR7dmFsfWA7XG4gICAgY29uc3QgY2hlY2tlZFR5cGUgPSBhcmVhTW9kZWwuaXNSb3dDaGVja2VkKHJvd0luZGV4KTtcbiAgICBjb25zdCBjZWxsID0gdGhpcy5kb20uYWRkQ29sdW1uRGl2KHBhcmVudCwgZ2VvLCByb3dJbmRleCwgaW5kZXgsIGFyZWFJZGVudCwgdGV4dCwgdHJlZUFycm93LCB0aGlzLnRhYmxlT3B0aW9ucywgY2hlY2tlZFR5cGUsIHNvcnRTdGF0ZSk7XG5cbiAgICBjb25zdCB0b29sdGlwID0gYXJlYU1vZGVsLmdldFRvb2x0aXBBdChyb3dJbmRleCwgaW5kZXgpO1xuICAgIGlmICh0b29sdGlwKSB7XG4gICAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUoY2VsbCwgXCJ0aXRsZVwiLCB0b29sdGlwKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5EZWYgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGluZGV4KTtcbiAgICBpZiAoY29sdW1uRGVmICYmIGNvbHVtbkRlZi5jbGFzc2VzW2FyZWFJZGVudF0pIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzZXMoY29sdW1uRGVmLmNsYXNzZXNbYXJlYUlkZW50XSwgY2VsbCk7XG4gICAgfVxuXG4gICAgbGV0IGZuOiBSZW5kZXJlckNsZWFudXBGblR5cGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNlbGxSZW5kZXJlcikge1xuICAgICAgZm4gPSBjZWxsUmVuZGVyZXIucmVuZGVyKGNlbGwsIHJvd0luZGV4LCBpbmRleCwgYXJlYUlkZW50LCBhcmVhTW9kZWwsIHZhbCwgdGhpcy5kb20uZG9tU2VydmljZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NlcyA9IGFyZWFNb2RlbC5nZXRDdXN0b21DbGFzc2VzQXQocm93SW5kZXgsIGluZGV4KTtcbiAgICBpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzZXMoY2xhc3NlcywgY2VsbCk7XG4gICAgfVxuICAgIHRoaXMuZG9tLmFkZENvbHVtbkJvcmRlckRpdnMocGFyZW50LCBnZW8pO1xuICAgIGlmICh0aGlzLmdldEZvY3VzTW9kZWwgJiYgYXJlYUlkZW50ID09PSBcImJvZHlcIikge1xuICAgICAgY29uc3QgZm0gPSB0aGlzLmdldEZvY3VzTW9kZWwoKTtcbiAgICAgIGlmIChmbT8uaGFzRm9jdXMocm93SW5kZXgsIGluZGV4KSkge1xuICAgICAgICB0aGlzLmRvbS5hZGRGb2N1c0JvcmRlckRpdnMocGFyZW50LCBnZW8sIHt9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFyZWFJZGVudCA9PT0gXCJoZWFkZXJcIikge1xuICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKGNlbGwsIFwiZGF0YS1nZS1hY3Rpb25cIiwgXCJkcmFnLWNvbHVtblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFtjZWxsLCBmbl07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uV2lkdGhzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICBjb25zdCByZXQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgcmV0LnB1c2godGhpcy50YWJsZU1vZGVsLmdldENvbHVtbldpZHRoKGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dIZWlnaHRzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgYXJlYU1vZGVsOiBBcmVhTW9kZWxJZik6IG51bWJlcltdIHtcbiAgICBjb25zdCByZXQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgcmV0LnB1c2goYXJlYU1vZGVsLmdldFJvd0hlaWdodChpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRqdXN0SG92ZXJSb3dzKG1vdXNlTW92ZUV2ZW50OiBHZU1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy50YWJsZU9wdGlvbnMuaG92ZXJSb3dWaXNpYmxlICYmIG1vdXNlTW92ZUV2ZW50LnJvd0luZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5ob3N0RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMudGFibGVNb2RlbC5nZXRBcmVhTW9kZWwoXCJib2R5XCIpLmdldFJvd0hlaWdodChtb3VzZU1vdmVFdmVudC5yb3dJbmRleCk7XG4gICAgICBjb25zdCB0b3AgPSBtb3VzZU1vdmVFdmVudC5yb3dUb3AgKyB0aGlzLmFyZWFIZWFkZXJDZW50ZXIucGFyZW50LmNsaWVudEhlaWdodCAtIHRoaXMuc2Nyb2xsVG9wO1xuICAgICAgdGhpcy5kb20uYXBwbHlTdHlsZSh0aGlzLmhvdmVyUm93LCB7XG4gICAgICAgIFwibGVmdFwiOiBcIjBcIixcbiAgICAgICAgXCJ0b3BcIjogdG9wICsgXCJweFwiLFxuICAgICAgICBcIndpZHRoXCI6IHdpZHRoICsgXCJweFwiLFxuICAgICAgICBcImhlaWdodFwiOiByb3dIZWlnaHQgKyBcInB4XCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiBcImJsb2NrXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGVIb3ZlclJvdygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlSG92ZXJSb3coKSB7XG4gICAgdGhpcy5kb20uYXBwbHlTdHlsZSh0aGlzLmhvdmVyUm93LCB7XG4gICAgICBcImRpc3BsYXlcIjogXCJub25lXCJcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGp1c3RIb3ZlckNvbHVtbnMobW91c2VNb3ZlRXZlbnQ6IEdlTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucy5ob3ZlckNvbHVtblZpc2libGUgJiYgbW91c2VNb3ZlRXZlbnQucm93SW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5ob3N0RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMudGFibGVNb2RlbC5nZXRDb2x1bW5XaWR0aChtb3VzZU1vdmVFdmVudC5jb2x1bW5JbmRleCk7XG4gICAgICBjb25zdCBsZWZ0ID0gbW91c2VNb3ZlRXZlbnQuY29sdW1uTGVmdCArIHRoaXMudGFibGVNb2RlbC5nZXRQYWRkaW5nKCkubGVmdCAtIHRoaXMuc2Nyb2xsTGVmdDtcbiAgICAgIHRoaXMuZG9tLmFwcGx5U3R5bGUodGhpcy5ob3ZlckNvbHVtbiwge1xuICAgICAgICBcImxlZnRcIjogKGxlZnQpICsgXCJweFwiLFxuICAgICAgICBcInRvcFwiOiBcIjBweFwiLFxuICAgICAgICBcIndpZHRoXCI6IHdpZHRoICsgXCJweFwiLFxuICAgICAgICBcImhlaWdodFwiOiBoZWlnaHQgKyBcInB4XCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiBcImJsb2NrXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGVIb3ZlckNvbHVtbigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlSG92ZXJDb2x1bW4oKSB7XG4gICAgdGhpcy5kb20uYXBwbHlTdHlsZSh0aGlzLmhvdmVyQ29sdW1uLCB7XG4gICAgICBcImRpc3BsYXlcIjogXCJub25lXCJcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWJvdW5jZShmbjogRnVuY3Rpb24sIGRlbGF5OiBudW1iZXIgPSAxMDAwKSB7XG4gICAgaWYgKHRoaXMuZGVib3VuY2VUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWJvdW5jZVRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoZm4uYmluZCh0aGlzKSwgZGVsYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJEcmFnVGFyZ2V0RGl2KHBhcmVudDogSFRNTERpdkVsZW1lbnQsIGxlZnQ6IG51bWJlciwgdG9wOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSFRNTERpdkVsZW1lbnQge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuZG9tLmFwcGx5U3R5bGVQb3Npc3Rpb25BYnNvbHV0ZShcbiAgICAgIHRoaXMuZG9tLmNyZWF0ZURpdldpdGhDbGFzcyhcImdlLXRhYmxlLWRyb3Atem9uZVwiLCBwYXJlbnQpXG4gICAgKTtcbiAgICB0aGlzLmRvbS5zZXRTdHlsZShkaXYsIFwibGVmdFwiLCBgJHtsZWZ0fXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCBcInRvcFwiLCBgJHt0b3B9cHhgKTtcbiAgICB0aGlzLmRvbS5zZXRTdHlsZShkaXYsIFwid2lkdGhcIiwgYCR7d2lkdGh9cHhgKTtcbiAgICB0aGlzLmRvbS5zZXRTdHlsZShkaXYsIFwiaGVpZ2h0XCIsIGAke2hlaWdodH1weGApO1xuICAgIHJldHVybiBkaXY7XG4gIH1cblxuXG4gIHByaXZhdGUgcmVuZGVyU2VsZWN0ZWRCYWNrZ3JvdW5kRGl2KHNraXA6IGJvb2xlYW4sIHJlbmRlclNlbGVjdGlvbjogYm9vbGVhbiwgYXJlYU1vZGVsOiBBcmVhTW9kZWxJZiwgcm93SW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlciwgcGFyZW50OiBIVE1MRGl2RWxlbWVudCwgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBsZXQgY2VsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKCFza2lwICYmIHJlbmRlclNlbGVjdGlvbiAmJiBhcmVhTW9kZWwuaXNTZWxlY3RhYmxlKHJvd0luZGV4LCBpbmRleCkpIHtcbiAgICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsID0gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgICAgICBjb25zdCBjb3VudCA9IHNlbGVjdGlvbk1vZGVsLmdldFNlbGVjdGlvbkNvdW50KHJvd0luZGV4LCBpbmRleCk7XG4gICAgICAgICAgY2VsbFNlbGVjdGVkID0gY291bnQgPiAwO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGl2ID0gdGhpcy5kb20uYXBwbHlTdHlsZVBvc2lzdGlvbkFic29sdXRlKFxuICAgICAgICAgICAgICB0aGlzLmRvbS5jcmVhdGVEaXZXaXRoQ2xhc3MoXCJnZS10YWJsZS1zZWxlY3RlZC1yYW5nZVwiLCBwYXJlbnQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCBcImxlZnRcIiwgYCR7bGVmdH1weGApO1xuICAgICAgICAgICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCBcInRvcFwiLCBgJHt0b3B9cHhgKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgXCJ3aWR0aFwiLCBgJHt3aWR0aH1weGApO1xuICAgICAgICAgICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCBcImhlaWdodFwiLCBgJHtoZWlnaHR9cHhgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNlbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ2VsbChcbiAgICBhcmVhTW9kZWw6IEFyZWFNb2RlbElmLFxuICAgIGFyZWFJZGVudDogQXJlYUlkZW50LFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBsZWZ0OiBudW1iZXIsXG4gICAgdG9wOiBudW1iZXIsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBwYXJlbnQ6IEhUTUxEaXZFbGVtZW50LFxuICAgIGNlbGxTZWxlY3RlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IFtkaXYsIGZuXSA9IHRoaXMuYWRkQW5kUmVuZGVyQ2VsbERpdih7XG4gICAgICBhcmVhTW9kZWwsXG4gICAgICBhcmVhSWRlbnQsXG4gICAgICByb3dJbmRleCxcbiAgICAgIGluZGV4OiBjb2x1bW5JbmRleCxcbiAgICAgIGxlZnQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRvcCxcbiAgICAgIHBhcmVudFxuICAgIH0pO1xuICAgIGlmIChjZWxsU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzKFwiZ2UtY2VsbC1zZWxlY3RlZFwiLCBkaXYpO1xuICAgIH1cbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuY2xlYW51cEZ1bmN0aW9uc1thcmVhSWRlbnRdLnB1c2goZm4pO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJpdmF0ZSByZW5kZXJIZWFkZXJDZWxsUmVzaXplSGFuZGxlKFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBjZWxsTGVmdDogbnVtYmVyLFxuICAgIGNlbGxUb3A6IG51bWJlcixcbiAgICBjZWxsV2lkdGg6IG51bWJlcixcbiAgICBjZWxsSGVpZ2h0OiBudW1iZXIsXG4gICAgcGFyZW50OiBIVE1MRGl2RWxlbWVudCkge1xuXG4gICAgY29uc3QgZG9tU2VydmljZSA9IHRoaXMuZG9tLmRvbVNlcnZpY2U7XG4gICAgY29uc3QgaGFuZGxlV2lkdGggPSB0aGlzLnRhYmxlT3B0aW9ucy5jb2x1bW5SZXNpemVIYW5kbGVXaWR0aEluUHggPz8gMztcblxuICAgIGNvbnN0IGRpdiA9IGRvbVNlcnZpY2UuY3JlYXRlRWxlbWVudDxIVE1MRGl2RWxlbWVudD4oXCJkaXZcIik7XG4gICAgZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCBcImRhdGEtY29sLWluZGV4XCIsIGAke2NvbHVtbkluZGV4fWApO1xuICAgIGRvbVNlcnZpY2Uuc2V0QXR0cmlidXRlKGRpdiwgXCJkYXRhLXJvdy1pbmRleFwiLCBgJHtyb3dJbmRleH1gKTtcbiAgICBkb21TZXJ2aWNlLnNldEF0dHJpYnV0ZShkaXYsIFwiZGF0YS1hcmVhXCIsIFwiaGVhZGVyXCIpO1xuICAgIGRvbVNlcnZpY2Uuc2V0QXR0cmlidXRlKGRpdiwgXCJkYXRhLWdlLWFjdGlvblwiLCBcInJlc2l6ZS1jb2x1bW5cIik7XG4gICAgLy8gZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCAnZGF0YS1nZS1hY3Rpb24nLCAnY29sdW1uLXJlc2l6ZScpO1xuICAgIGRvbVNlcnZpY2UuYWRkQ2xhc3MoZGl2LCBgZ2UtdGFibGUtY29sLXJlc2l6ZS1oYW5kbGVgKTtcbiAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgXCJkaXNwbGF5XCIsIFwiY2xpcFwiKTtcbiAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCBcImN1cnNvclwiLCBcImNvbC1yZXNpemVcIik7XG4gICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsIFwibGVmdFwiLCBgJHsoY2VsbExlZnQgKyBjZWxsV2lkdGggLSBoYW5kbGVXaWR0aCl9cHhgKTtcbiAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgXCJ0b3BcIiwgYCR7Y2VsbFRvcH1weGApO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCBcIndpZHRoXCIsIGAke2hhbmRsZVdpZHRofXB4YCk7XG4gICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsIFwiaGVpZ2h0XCIsIGAke2NlbGxIZWlnaHR9cHhgKTtcbiAgICBkb21TZXJ2aWNlLmFwcGVuZENoaWxkKHBhcmVudCwgZGl2KTtcbiAgfVxuXG5cbn1cblxuIl19