@ardium-ui/ui 1.0.3 → 2.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 (445) hide show
  1. package/README.md +25 -25
  2. package/esm2022/lib/_internal/boolean-component.mjs +28 -42
  3. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +5 -5
  4. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +5 -5
  5. package/esm2022/lib/_internal/disablable-component.mjs +24 -22
  6. package/esm2022/lib/_internal/focusable-component.mjs +12 -25
  7. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +172 -169
  8. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +115 -120
  9. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +56 -53
  10. package/esm2022/lib/_internal/models/pagination.model.mjs +72 -106
  11. package/esm2022/lib/_internal/ngmodel-component.mjs +5 -5
  12. package/esm2022/lib/_internal/queue.mjs +1 -1
  13. package/esm2022/lib/_internal/selectable-list-component.mjs +74 -98
  14. package/esm2022/lib/badge/badge.directive.mjs +70 -99
  15. package/esm2022/lib/badge/badge.module.mjs +5 -5
  16. package/esm2022/lib/badge/badge.types.mjs +1 -1
  17. package/esm2022/lib/badge/index.mjs +4 -0
  18. package/esm2022/lib/buttons/_button-base.mjs +13 -35
  19. package/esm2022/lib/buttons/button/button.component.mjs +22 -37
  20. package/esm2022/lib/buttons/button/button.module.mjs +5 -5
  21. package/esm2022/lib/buttons/button/index.mjs +3 -0
  22. package/esm2022/lib/buttons/fab/fab.component.mjs +16 -28
  23. package/esm2022/lib/buttons/fab/fab.module.mjs +5 -5
  24. package/esm2022/lib/buttons/fab/index.mjs +3 -0
  25. package/esm2022/lib/buttons/general-button.types.mjs +1 -1
  26. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +17 -25
  27. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +5 -5
  28. package/esm2022/lib/buttons/icon-button/index.mjs +3 -0
  29. package/esm2022/lib/card/card.children.mjs +32 -33
  30. package/esm2022/lib/card/card.component.mjs +14 -17
  31. package/esm2022/lib/card/card.module.mjs +5 -5
  32. package/esm2022/lib/card/card.types.mjs +1 -1
  33. package/esm2022/lib/card/index.mjs +5 -0
  34. package/esm2022/lib/checkbox/checkbox.component.mjs +33 -46
  35. package/esm2022/lib/checkbox/checkbox.module.mjs +5 -5
  36. package/esm2022/lib/checkbox/checkbox.types.mjs +1 -1
  37. package/esm2022/lib/checkbox/index.mjs +4 -0
  38. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +31 -57
  39. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +5 -5
  40. package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +1 -1
  41. package/esm2022/lib/checkbox-list/index.mjs +4 -0
  42. package/esm2022/lib/chip/chip.component.mjs +22 -42
  43. package/esm2022/lib/chip/chip.module.mjs +5 -5
  44. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +28 -53
  45. package/esm2022/lib/chip/index.mjs +5 -0
  46. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +25 -49
  47. package/esm2022/lib/color/color-display/color-display.component.mjs +15 -32
  48. package/esm2022/lib/color/color-display/color-display.module.mjs +5 -5
  49. package/esm2022/lib/color/color-display/color-display.types.mjs +1 -1
  50. package/esm2022/lib/color/color-display/index.mjs +4 -0
  51. package/esm2022/lib/color/color-picker/color-picker.types.mjs +1 -1
  52. package/esm2022/lib/dialog/dialog.component.mjs +54 -130
  53. package/esm2022/lib/dialog/dialog.directives.mjs +4 -4
  54. package/esm2022/lib/dialog/dialog.module.mjs +5 -5
  55. package/esm2022/lib/dialog/dialog.types.mjs +1 -1
  56. package/esm2022/lib/dialog/index.mjs +5 -0
  57. package/esm2022/lib/divider/divider.component.mjs +9 -14
  58. package/esm2022/lib/divider/divider.module.mjs +5 -5
  59. package/esm2022/lib/divider/index.mjs +3 -0
  60. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +40 -59
  61. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +5 -5
  62. package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +1 -1
  63. package/esm2022/lib/dropdown-panel/index.mjs +4 -0
  64. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +12 -17
  65. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +10 -10
  66. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +6 -6
  67. package/esm2022/lib/file-inputs/file-drop-area/index.mjs +4 -0
  68. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +24 -50
  69. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +19 -19
  70. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +5 -5
  71. package/esm2022/lib/file-inputs/file-input/index.mjs +4 -0
  72. package/esm2022/lib/file-inputs/file-input-base.mjs +38 -72
  73. package/esm2022/lib/file-inputs/file-input-types.mjs +1 -1
  74. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +20 -47
  75. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +7 -7
  76. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +5 -5
  77. package/esm2022/lib/form-field-frame/index.mjs +4 -0
  78. package/esm2022/lib/icon/icon.component.mjs +32 -67
  79. package/esm2022/lib/icon/icon.module.mjs +5 -5
  80. package/esm2022/lib/icon/icon.pipe.mjs +4 -4
  81. package/esm2022/lib/icon/index.mjs +4 -0
  82. package/esm2022/lib/inputs/color-input/color-input.directives.mjs +25 -25
  83. package/esm2022/lib/inputs/color-input/color-input.types.mjs +1 -1
  84. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +65 -115
  85. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +83 -92
  86. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +5 -5
  87. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +1 -1
  88. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +1 -1
  89. package/esm2022/lib/inputs/digit-input/index.mjs +4 -0
  90. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +59 -122
  91. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +10 -10
  92. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +24 -8
  93. package/esm2022/lib/inputs/hex-input/index.mjs +4 -0
  94. package/esm2022/lib/inputs/hex-input.model.mjs +24 -33
  95. package/esm2022/lib/inputs/input/index.mjs +4 -0
  96. package/esm2022/lib/inputs/input/input.component.mjs +95 -154
  97. package/esm2022/lib/inputs/input/input.directives.mjs +16 -16
  98. package/esm2022/lib/inputs/input/input.module.mjs +21 -7
  99. package/esm2022/lib/inputs/input-transformers.mjs +6 -6
  100. package/esm2022/lib/inputs/input-types.mjs +1 -1
  101. package/esm2022/lib/inputs/input-utils.mjs +75 -94
  102. package/esm2022/lib/inputs/number-input/index.mjs +4 -0
  103. package/esm2022/lib/inputs/number-input/number-input.component.mjs +106 -170
  104. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +4 -4
  105. package/esm2022/lib/inputs/number-input/number-input.module.mjs +5 -5
  106. package/esm2022/lib/inputs/password-input/index.mjs +5 -0
  107. package/esm2022/lib/inputs/password-input/password-input.component.mjs +74 -144
  108. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +13 -13
  109. package/esm2022/lib/inputs/password-input/password-input.module.mjs +5 -5
  110. package/esm2022/lib/inputs/password-input/password-input.types.mjs +1 -1
  111. package/esm2022/lib/inputs/simple-input/index.mjs +4 -0
  112. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +57 -110
  113. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +10 -10
  114. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +5 -5
  115. package/esm2022/lib/kbd/index.mjs +4 -0
  116. package/esm2022/lib/kbd/kbd.component.mjs +15 -29
  117. package/esm2022/lib/kbd/kbd.module.mjs +5 -5
  118. package/esm2022/lib/kbd/kbd.pipe.mjs +4 -4
  119. package/esm2022/lib/kbd-shortcut/index.mjs +3 -0
  120. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +23 -40
  121. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +5 -5
  122. package/esm2022/lib/modal/index.mjs +3 -0
  123. package/esm2022/lib/modal/modal.component.mjs +42 -83
  124. package/esm2022/lib/modal/modal.module.mjs +5 -5
  125. package/esm2022/lib/option/index.mjs +3 -0
  126. package/esm2022/lib/option/option.component.mjs +24 -46
  127. package/esm2022/lib/option/option.module.mjs +5 -5
  128. package/esm2022/lib/progress-bar/index.mjs +5 -0
  129. package/esm2022/lib/progress-bar/progress-bar.component.mjs +43 -81
  130. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +4 -4
  131. package/esm2022/lib/progress-bar/progress-bar.module.mjs +5 -5
  132. package/esm2022/lib/progress-bar/progress-bar.types.mjs +1 -1
  133. package/esm2022/lib/progress-circle/index.mjs +5 -0
  134. package/esm2022/lib/progress-circle/progress-circle.component.mjs +33 -78
  135. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +4 -4
  136. package/esm2022/lib/progress-circle/progress-circle.module.mjs +5 -5
  137. package/esm2022/lib/progress-circle/progress-circle.types.mjs +1 -1
  138. package/esm2022/lib/radio/index.mjs +4 -0
  139. package/esm2022/lib/radio/radio/radio.component.mjs +16 -25
  140. package/esm2022/lib/radio/radio-group.component.mjs +71 -85
  141. package/esm2022/lib/radio/radio.module.mjs +5 -5
  142. package/esm2022/lib/search-functions.mjs +7 -7
  143. package/esm2022/lib/segment/index.mjs +5 -0
  144. package/esm2022/lib/segment/segment.component.mjs +70 -137
  145. package/esm2022/lib/segment/segment.directives.mjs +4 -4
  146. package/esm2022/lib/segment/segment.module.mjs +5 -5
  147. package/esm2022/lib/segment/segment.types.mjs +1 -1
  148. package/esm2022/lib/select/index.mjs +5 -0
  149. package/esm2022/lib/select/select.component.mjs +348 -655
  150. package/esm2022/lib/select/select.directive.mjs +46 -46
  151. package/esm2022/lib/select/select.module.mjs +5 -5
  152. package/esm2022/lib/select/select.types.mjs +1 -1
  153. package/esm2022/lib/slide-toggle/index.mjs +4 -0
  154. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +19 -24
  155. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +5 -5
  156. package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +5 -0
  157. package/esm2022/lib/slider/abstract-slider.mjs +111 -200
  158. package/esm2022/lib/slider/index.mjs +7 -0
  159. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +26 -23
  160. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +5 -5
  161. package/esm2022/lib/slider/slider.component.mjs +13 -10
  162. package/esm2022/lib/slider/slider.directive.mjs +4 -4
  163. package/esm2022/lib/slider/slider.module.mjs +7 -7
  164. package/esm2022/lib/slider/slider.types.mjs +1 -1
  165. package/esm2022/lib/snackbar/index.mjs +1 -1
  166. package/esm2022/lib/snackbar/snackbar-ref.mjs +1 -1
  167. package/esm2022/lib/snackbar/snackbar.component.mjs +8 -8
  168. package/esm2022/lib/snackbar/snackbar.service.mjs +13 -12
  169. package/esm2022/lib/snackbar/snackbar.token.mjs +1 -1
  170. package/esm2022/lib/snackbar/snackbar.types.mjs +1 -1
  171. package/esm2022/lib/spinner/index.mjs +3 -0
  172. package/esm2022/lib/spinner/spinner.component.mjs +9 -13
  173. package/esm2022/lib/spinner/spinner.module.mjs +5 -5
  174. package/esm2022/lib/star/index.mjs +4 -0
  175. package/esm2022/lib/star/star-button/index.mjs +3 -0
  176. package/esm2022/lib/star/star-button/star-button.component.mjs +17 -26
  177. package/esm2022/lib/star/star-button/star-button.module.mjs +5 -5
  178. package/esm2022/lib/star/star-display/index.mjs +3 -0
  179. package/esm2022/lib/star/star-display/star-display.component.mjs +48 -55
  180. package/esm2022/lib/star/star-display/star-display.module.mjs +5 -5
  181. package/esm2022/lib/star/star-input/index.mjs +3 -0
  182. package/esm2022/lib/star/star-input/star-input.component.mjs +70 -106
  183. package/esm2022/lib/star/star-input/star-input.module.mjs +5 -5
  184. package/esm2022/lib/star/star.component.mjs +12 -20
  185. package/esm2022/lib/star/star.module.mjs +5 -5
  186. package/esm2022/lib/star/star.types.mjs +1 -1
  187. package/esm2022/lib/statebox/index.mjs +3 -0
  188. package/esm2022/lib/statebox/statebox.component.mjs +64 -102
  189. package/esm2022/lib/statebox/statebox.module.mjs +5 -5
  190. package/esm2022/lib/statebox/statebox.types.mjs +1 -1
  191. package/esm2022/lib/tabber/index.mjs +4 -0
  192. package/esm2022/lib/tabber/tab/tab.component.mjs +42 -0
  193. package/esm2022/lib/tabber/tabber.component.mjs +83 -0
  194. package/esm2022/lib/tabber/tabber.module.mjs +19 -0
  195. package/esm2022/lib/table/index.mjs +5 -0
  196. package/esm2022/lib/table/table-item-storage.mjs +204 -200
  197. package/esm2022/lib/table/table.component.mjs +184 -304
  198. package/esm2022/lib/table/table.directives.mjs +19 -21
  199. package/esm2022/lib/table/table.module.mjs +5 -5
  200. package/esm2022/lib/table/table.types.mjs +1 -1
  201. package/esm2022/lib/table/utils.mjs +1 -1
  202. package/esm2022/lib/table-from-csv/index.mjs +3 -0
  203. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +85 -29
  204. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +5 -5
  205. package/esm2022/lib/table-pagination/index.mjs +4 -0
  206. package/esm2022/lib/table-pagination/table-pagination.component.mjs +46 -114
  207. package/esm2022/lib/table-pagination/table-pagination.module.mjs +5 -5
  208. package/esm2022/lib/table-pagination/table-pagination.types.mjs +1 -1
  209. package/esm2022/lib/types/alignment.types.mjs +1 -1
  210. package/esm2022/lib/types/colors.types.mjs +1 -1
  211. package/esm2022/lib/types/item-storage.types.mjs +1 -1
  212. package/esm2022/lib/types/theming.types.mjs +1 -1
  213. package/esm2022/lib/types/utility.types.mjs +2 -2
  214. package/esm2022/public-api.mjs +58 -182
  215. package/fesm2022/ardium-ui-ui.mjs +7847 -11692
  216. package/fesm2022/ardium-ui-ui.mjs.map +1 -1
  217. package/lib/_internal/boolean-component.d.ts +8 -9
  218. package/lib/_internal/clear-button/clear-button.component.d.ts +1 -1
  219. package/lib/_internal/disablable-component.d.ts +12 -7
  220. package/lib/_internal/focusable-component.d.ts +5 -7
  221. package/lib/_internal/item-storages/dropdown-item-storage.d.ts +43 -41
  222. package/lib/_internal/item-storages/simple-item-storage.d.ts +28 -25
  223. package/lib/_internal/item-storages/simplest-item-storage.d.ts +14 -9
  224. package/lib/_internal/models/pagination.model.d.ts +38 -42
  225. package/lib/_internal/ngmodel-component.d.ts +1 -1
  226. package/lib/_internal/selectable-list-component.d.ts +30 -30
  227. package/lib/badge/badge.directive.d.ts +15 -20
  228. package/lib/badge/index.d.ts +3 -0
  229. package/lib/buttons/_button-base.d.ts +9 -12
  230. package/lib/buttons/button/button.component.d.ts +6 -8
  231. package/lib/buttons/button/index.d.ts +2 -0
  232. package/lib/buttons/fab/fab.component.d.ts +4 -6
  233. package/lib/buttons/fab/index.d.ts +2 -0
  234. package/lib/buttons/icon-button/icon-button.component.d.ts +6 -7
  235. package/lib/buttons/icon-button/index.d.ts +2 -0
  236. package/lib/card/card.children.d.ts +4 -3
  237. package/lib/card/card.component.d.ts +5 -4
  238. package/lib/card/index.d.ts +4 -0
  239. package/lib/checkbox/checkbox.component.d.ts +8 -12
  240. package/lib/checkbox/index.d.ts +3 -0
  241. package/lib/checkbox-list/checkbox-list.component.d.ts +22 -21
  242. package/lib/checkbox-list/index.d.ts +3 -0
  243. package/lib/chip/chip.component.d.ts +8 -10
  244. package/lib/chip/deletable-chip/deletable-chip.component.d.ts +11 -14
  245. package/lib/chip/index.d.ts +4 -0
  246. package/lib/chip/selectable-chip/selectable-chip.component.d.ts +10 -12
  247. package/lib/color/color-display/color-display.component.d.ts +6 -9
  248. package/lib/color/color-display/index.d.ts +3 -0
  249. package/lib/color/color-picker/color-picker.types.d.ts +4 -4
  250. package/lib/dialog/dialog.component.d.ts +25 -35
  251. package/lib/dialog/dialog.types.d.ts +2 -2
  252. package/lib/dialog/index.d.ts +4 -0
  253. package/lib/divider/divider.component.d.ts +3 -4
  254. package/lib/divider/index.d.ts +2 -0
  255. package/lib/dropdown-panel/dropdown-panel.component.d.ts +17 -20
  256. package/lib/dropdown-panel/index.d.ts +3 -0
  257. package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +5 -4
  258. package/lib/file-inputs/file-drop-area/index.d.ts +3 -0
  259. package/lib/file-inputs/file-input/file-input.component.d.ts +13 -17
  260. package/lib/file-inputs/file-input/index.d.ts +3 -0
  261. package/lib/file-inputs/file-input-base.d.ts +13 -18
  262. package/lib/form-field-frame/form-field-frame.component.d.ts +12 -16
  263. package/lib/form-field-frame/index.d.ts +3 -0
  264. package/lib/icon/icon.component.d.ts +10 -19
  265. package/lib/icon/index.d.ts +3 -0
  266. package/lib/inputs/color-input/color-input.types.d.ts +2 -2
  267. package/lib/inputs/digit-input/digit-input.component.d.ts +22 -30
  268. package/lib/inputs/digit-input/digit-input.model.d.ts +8 -12
  269. package/lib/inputs/digit-input/digit-input.types.d.ts +4 -4
  270. package/lib/inputs/digit-input/digit-input.utils.d.ts +4 -5
  271. package/lib/inputs/digit-input/index.d.ts +3 -0
  272. package/lib/inputs/hex-input/hex-input.component.d.ts +32 -38
  273. package/lib/inputs/hex-input/index.d.ts +3 -0
  274. package/lib/inputs/hex-input.model.d.ts +10 -11
  275. package/lib/inputs/input/index.d.ts +3 -0
  276. package/lib/inputs/input/input.component.d.ts +34 -40
  277. package/lib/inputs/input/input.directives.d.ts +3 -3
  278. package/lib/inputs/input-utils.d.ts +24 -27
  279. package/lib/inputs/number-input/index.d.ts +3 -0
  280. package/lib/inputs/number-input/number-input.component.d.ts +38 -48
  281. package/lib/inputs/password-input/index.d.ts +4 -0
  282. package/lib/inputs/password-input/password-input.component.d.ts +28 -40
  283. package/lib/inputs/password-input/password-input.types.d.ts +2 -2
  284. package/lib/inputs/simple-input/index.d.ts +3 -0
  285. package/lib/inputs/simple-input/simple-input.component.d.ts +30 -35
  286. package/lib/kbd/index.d.ts +3 -0
  287. package/lib/kbd/kbd.component.d.ts +6 -8
  288. package/lib/kbd-shortcut/index.d.ts +2 -0
  289. package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +7 -10
  290. package/lib/modal/index.d.ts +2 -0
  291. package/lib/modal/modal.component.d.ts +22 -30
  292. package/lib/option/index.d.ts +2 -0
  293. package/lib/option/option.component.d.ts +11 -16
  294. package/lib/progress-bar/index.d.ts +4 -0
  295. package/lib/progress-bar/progress-bar.component.d.ts +14 -20
  296. package/lib/progress-bar/progress-bar.types.d.ts +2 -2
  297. package/lib/progress-circle/index.d.ts +4 -0
  298. package/lib/progress-circle/progress-circle.component.d.ts +12 -20
  299. package/lib/progress-circle/progress-circle.types.d.ts +2 -2
  300. package/lib/radio/index.d.ts +3 -0
  301. package/lib/radio/radio/radio.component.d.ts +7 -8
  302. package/lib/radio/radio-group.component.d.ts +13 -16
  303. package/lib/segment/index.d.ts +4 -0
  304. package/lib/segment/segment.component.d.ts +22 -34
  305. package/lib/segment/segment.directives.d.ts +2 -3
  306. package/lib/select/index.d.ts +4 -0
  307. package/lib/select/select.component.d.ts +114 -160
  308. package/lib/select/select.directive.d.ts +3 -3
  309. package/lib/select/select.types.d.ts +2 -76
  310. package/lib/slide-toggle/index.d.ts +3 -0
  311. package/lib/slide-toggle/slide-toggle.component.d.ts +9 -7
  312. package/lib/slide-toggle/slide-toggle.types.d.ts +5 -0
  313. package/lib/slider/abstract-slider.d.ts +38 -55
  314. package/lib/slider/index.d.ts +6 -0
  315. package/lib/slider/range-slider/range-slider.component.d.ts +3 -1
  316. package/lib/slider/slider.component.d.ts +2 -0
  317. package/lib/slider/slider.types.d.ts +8 -8
  318. package/lib/snackbar/snackbar-ref.d.ts +1 -2
  319. package/lib/snackbar/snackbar.component.d.ts +3 -3
  320. package/lib/snackbar/snackbar.service.d.ts +2 -2
  321. package/lib/snackbar/snackbar.types.d.ts +4 -4
  322. package/lib/spinner/index.d.ts +2 -0
  323. package/lib/spinner/spinner.component.d.ts +3 -3
  324. package/lib/star/index.d.ts +3 -0
  325. package/lib/star/star-button/index.d.ts +2 -0
  326. package/lib/star/star-button/star-button.component.d.ts +7 -7
  327. package/lib/star/star-display/index.d.ts +2 -0
  328. package/lib/star/star-display/star-display.component.d.ts +8 -12
  329. package/lib/star/star-input/index.d.ts +2 -0
  330. package/lib/star/star-input/star-input.component.d.ts +17 -22
  331. package/lib/star/star.component.d.ts +5 -5
  332. package/lib/statebox/index.d.ts +3 -0
  333. package/lib/statebox/statebox.component.d.ts +15 -21
  334. package/lib/statebox/statebox.types.d.ts +12 -8
  335. package/lib/tabber/index.d.ts +3 -0
  336. package/lib/tabber/tab/tab.component.d.ts +18 -0
  337. package/lib/tabber/tabber.component.d.ts +25 -0
  338. package/lib/tabber/tabber.module.d.ts +9 -0
  339. package/lib/table/index.d.ts +4 -0
  340. package/lib/table/table-item-storage.d.ts +70 -58
  341. package/lib/table/table.component.d.ts +59 -78
  342. package/lib/table/table.directives.d.ts +4 -3
  343. package/lib/table-from-csv/index.d.ts +2 -0
  344. package/lib/table-from-csv/table-from-csv.component.d.ts +46 -9
  345. package/lib/table-pagination/index.d.ts +3 -0
  346. package/lib/table-pagination/table-pagination.component.d.ts +21 -30
  347. package/lib/types/item-storage.types.d.ts +19 -18
  348. package/lib/types/utility.types.d.ts +2 -1
  349. package/package.json +8 -9
  350. package/prebuilt-themes/default/badge.css +5 -5
  351. package/prebuilt-themes/default/buttons/fab.css +4 -3
  352. package/prebuilt-themes/default/buttons/fab.css.map +1 -1
  353. package/prebuilt-themes/default/card.css +7 -7
  354. package/prebuilt-themes/default/chips.css +3 -8
  355. package/prebuilt-themes/default/chips.css.map +1 -1
  356. package/prebuilt-themes/default/core.css +6 -3
  357. package/prebuilt-themes/default/core.css.map +1 -1
  358. package/prebuilt-themes/default/inputs/color-input.css +1 -1
  359. package/prebuilt-themes/default/inputs/digit-input.css +1 -1
  360. package/prebuilt-themes/default/inputs/file-input.css +139 -2
  361. package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
  362. package/prebuilt-themes/default/inputs/hex-input.css +2 -2
  363. package/prebuilt-themes/default/inputs/input.css +1 -1
  364. package/prebuilt-themes/default/inputs/search-bar.css +1 -1
  365. package/prebuilt-themes/default/inputs/simple-input.css +1 -1
  366. package/prebuilt-themes/default/modal.css +1 -1
  367. package/prebuilt-themes/default/segment.css +2 -2
  368. package/prebuilt-themes/default/segment.css.map +1 -1
  369. package/prebuilt-themes/default/select.css +5 -3
  370. package/prebuilt-themes/default/select.css.map +1 -1
  371. package/prebuilt-themes/default/snackbar.css +0 -1
  372. package/prebuilt-themes/default/snackbar.css.map +1 -1
  373. package/prebuilt-themes/default/tabber.css +207 -0
  374. package/prebuilt-themes/default/tabber.css.map +1 -0
  375. package/public-api.d.ts +43 -136
  376. package/themes/_variables.scss +121 -121
  377. package/themes/default/_clear-button.scss +73 -73
  378. package/themes/default/_coloring.scss +137 -137
  379. package/themes/default/_dropdown-arrow.scss +12 -12
  380. package/themes/default/_mixins.scss +70 -70
  381. package/themes/default/badge.scss +94 -94
  382. package/themes/default/buttons/_button-mixins.scss +144 -144
  383. package/themes/default/buttons/button.scss +62 -62
  384. package/themes/default/buttons/fab.scss +74 -72
  385. package/themes/default/buttons/icon-button.scss +59 -59
  386. package/themes/default/calendar.scss +182 -182
  387. package/themes/default/card.scss +126 -126
  388. package/themes/default/checkbox-list.scss +83 -83
  389. package/themes/default/checkbox.scss +109 -109
  390. package/themes/default/chips.scss +200 -206
  391. package/themes/default/color-display.scss +41 -41
  392. package/themes/default/color-picker.scss +111 -111
  393. package/themes/default/core.scss +99 -96
  394. package/themes/default/dialog.scss +16 -16
  395. package/themes/default/divider.scss +13 -13
  396. package/themes/default/dropdown-panel.scss +45 -45
  397. package/themes/default/file-drop-area.scss +162 -162
  398. package/themes/default/form-field-frame.scss +78 -78
  399. package/themes/default/inputs/_shared.scss +46 -46
  400. package/themes/default/inputs/color-input.scss +46 -46
  401. package/themes/default/inputs/digit-input.scss +56 -56
  402. package/themes/default/inputs/file-input.scss +85 -78
  403. package/themes/default/inputs/hex-input.scss +27 -27
  404. package/themes/default/inputs/input.scss +52 -52
  405. package/themes/default/inputs/number-input.scss +121 -121
  406. package/themes/default/inputs/password-input.scss +43 -43
  407. package/themes/default/inputs/search-bar.scss +19 -19
  408. package/themes/default/inputs/simple-input.scss +19 -19
  409. package/themes/default/kbd-shortcut.scss +13 -13
  410. package/themes/default/kbd.scss +20 -20
  411. package/themes/default/modal.scss +93 -93
  412. package/themes/default/progress-bar.scss +166 -166
  413. package/themes/default/progress-circle.scss +56 -56
  414. package/themes/default/radio.scss +112 -112
  415. package/themes/default/segment.scss +340 -339
  416. package/themes/default/select.scss +255 -253
  417. package/themes/default/slide-toggle.scss +151 -151
  418. package/themes/default/slider.scss +224 -224
  419. package/themes/default/snackbar.scss +58 -60
  420. package/themes/default/spinner.scss +21 -21
  421. package/themes/default/stars.scss +122 -122
  422. package/themes/default/statebox.scss +109 -109
  423. package/themes/default/tabber.scss +86 -0
  424. package/themes/default/table-pagination.scss +56 -56
  425. package/themes/default/table.scss +403 -403
  426. package/esm2022/lib/calendar/calendar.component.mjs +0 -979
  427. package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
  428. package/esm2022/lib/calendar/calendar.helpers.mjs +0 -47
  429. package/esm2022/lib/calendar/calendar.module.mjs +0 -21
  430. package/esm2022/lib/calendar/calendar.types.mjs +0 -11
  431. package/esm2022/lib/color/color-picker/color-picker.component.mjs +0 -484
  432. package/esm2022/lib/color/color-picker/color-picker.directives.mjs +0 -55
  433. package/esm2022/lib/color/color-picker/color-picker.module.mjs +0 -43
  434. package/esm2022/lib/inputs/color-input/color-input.component.mjs +0 -421
  435. package/esm2022/lib/inputs/color-input/color-input.module.mjs +0 -85
  436. package/lib/calendar/calendar.component.d.ts +0 -155
  437. package/lib/calendar/calendar.directives.d.ts +0 -51
  438. package/lib/calendar/calendar.helpers.d.ts +0 -15
  439. package/lib/calendar/calendar.module.d.ts +0 -11
  440. package/lib/calendar/calendar.types.d.ts +0 -80
  441. package/lib/color/color-picker/color-picker.component.d.ts +0 -125
  442. package/lib/color/color-picker/color-picker.directives.d.ts +0 -27
  443. package/lib/color/color-picker/color-picker.module.d.ts +0 -13
  444. package/lib/inputs/color-input/color-input.component.d.ts +0 -147
  445. package/lib/inputs/color-input/color-input.module.d.ts +0 -16
@@ -1,138 +1,160 @@
1
+ import { computed, signal } from '@angular/core';
1
2
  import resolvePath from 'resolve-object-path';
2
3
  import { evaluate, isDefined, isNull } from 'simple-bool';
3
4
  import { SortType, TablePaginationStrategy } from './table.types';
4
5
  import { areAllDataColumns, isTableSubheader, merge2dArrays } from './utils';
6
+ export class ArdTableRow {
7
+ constructor(itemData, index, data, dataColumns, disabled, bold, isEmpty = false) {
8
+ this._itemData = signal(undefined);
9
+ this.itemData = this._itemData.asReadonly();
10
+ this._index = signal(-1);
11
+ this.index = this._index.asReadonly();
12
+ this._isEmpty = signal(false);
13
+ this.isEmpty = this._isEmpty.asReadonly();
14
+ this._data = signal([]);
15
+ this.data = this._data.asReadonly();
16
+ this._dataColumns = signal([]);
17
+ this.dataColumns = this._dataColumns.asReadonly();
18
+ this._class = signal('');
19
+ this.class = this._class.asReadonly();
20
+ this.disabled = signal(false);
21
+ this.bold = signal(false);
22
+ this.selected = signal(false);
23
+ this.highlighted = signal(false);
24
+ this._itemData.set(itemData);
25
+ this._index.set(index);
26
+ this._data.set(data);
27
+ this._dataColumns.set(dataColumns);
28
+ this.disabled.set(disabled);
29
+ this.bold.set(bold);
30
+ this._isEmpty.set(isEmpty);
31
+ }
32
+ static newEmptyCell(index) {
33
+ return new ArdTableRow(null, index, [], [], false, false, true);
34
+ }
35
+ }
5
36
  export class HeaderCell {
37
+ constructor(cell, colspan = 1, rowspan = 1) {
38
+ this.cell = signal(undefined);
39
+ this.colspan = signal(1);
40
+ this.rowspan = signal(1);
41
+ this.cell.set(cell);
42
+ this.colspan.set(colspan);
43
+ this.rowspan.set(rowspan);
44
+ }
6
45
  get width() {
7
- if (isTableSubheader(this.cell))
46
+ const cell = this.cell();
47
+ if (isTableSubheader(cell))
8
48
  return null;
9
- return this._getWidth(this.cell.width);
49
+ return this._getWidth(cell.width);
10
50
  }
11
51
  get minWidth() {
12
- if (isTableSubheader(this.cell))
52
+ const cell = this.cell();
53
+ if (isTableSubheader(cell))
13
54
  return null;
14
- return this._getWidth(this.cell.minWidth);
55
+ return this._getWidth(cell.minWidth);
15
56
  }
57
+ /**
58
+ * Thransforms a numeric width into a CSS string if needed. Pure function.
59
+ * @param width the width to be converted.
60
+ * @returns The width expressed as a CSS-compatible string or null.
61
+ */
16
62
  _getWidth(width) {
17
63
  if (!width)
18
64
  return null;
19
- if (typeof width == 'number')
65
+ if (typeof width === 'number')
20
66
  return `${width}px`;
21
67
  return width;
22
68
  }
23
- constructor(cell, colspan = 1, rowspan = 1) {
24
- this.cell = cell;
25
- this.colspan = colspan;
26
- this.rowspan = rowspan;
27
- }
28
69
  }
29
70
  export class TableItemStorage {
30
71
  constructor(_ardParentComp) {
31
72
  this._ardParentComp = _ardParentComp;
32
- this._items = [];
33
- this._sortedItems = [];
34
- this._highlightedItems = [];
35
- this._selectedItems = [];
36
- this._dataColumns = [];
37
- this._headerCells = [];
73
+ this._items = signal([]);
74
+ this._sortedItems = signal([]);
75
+ this._dataColumns = signal([]);
76
+ this._headerCells = signal([]);
77
+ /**
78
+ * Gets all items.
79
+ */
80
+ this.items = this._items.asReadonly();
81
+ this.sortedItems = this._sortedItems.asReadonly();
82
+ /**
83
+ * Gets items based on the current pagination state.
84
+ */
85
+ this.paginatedItems = computed(() => {
86
+ if (!this._ardParentComp.paginated() || this._ardParentComp.paginationStrategy() === TablePaginationStrategy.Noop) {
87
+ return this.sortedItems();
88
+ }
89
+ const page = this._ardParentComp.page();
90
+ const IPP = this._ardParentComp.itemsPerPage();
91
+ const itemsStart = (page - 1) * IPP;
92
+ const itemsEnd = page * IPP;
93
+ return this.sortedItems().slice(itemsStart, itemsEnd);
94
+ });
95
+ /**
96
+ * Gets all currently selected items.
97
+ */
98
+ this.selectedItems = computed(() => this.items().filter(item => item.selected()));
99
+ /**
100
+ * Gets all currently highlighted items.
101
+ */
102
+ this.highlightedItems = computed(() => this.items().filter(item => item.highlighted()));
103
+ /**
104
+ * Gets all highlightable items. An item is considered highlightable if it is **not** disabled.
105
+ */
106
+ this.highlightableItems = computed(() => this._items().filter(item => !item.disabled()));
107
+ /**
108
+ * Gets the values of the currently selected items.
109
+ */
110
+ this.value = computed(() => this._itemsToValue(this.selectedItems()));
111
+ /**
112
+ * Returns true if at least one item is highlighted, otherwise false.
113
+ */
114
+ this.isAnyItemHighlighted = computed(() => this.highlightedItems().length > 0);
115
+ /**
116
+ * Checks if any item in the table is selected.
117
+ * @returns A boolean value indicating if any item is selected.
118
+ */
119
+ this.isAnyItemSelected = computed(() => this.selectedItems().length > 0);
120
+ /**
121
+ * Checks if all items in the table are selected.
122
+ * @returns A boolean value indicating if all items are selected.
123
+ */
124
+ this.areAllSelected = computed(() => this.selectedItems().length === this._items().filter(item => !item.disabled()).length);
125
+ /**
126
+ * Returns true if the parent component defines the limit of concurrently selectable items and the amount of currently selected items matches that limit. Otherwise returns false.
127
+ *
128
+ * **TLDR**: true if `maxSelectedItems` is defined and the number of selected items matches that value.
129
+ */
130
+ this.isItemLimitReached = computed(() => {
131
+ const max = this._ardParentComp.maxSelectedItems();
132
+ if (!isDefined(max)) {
133
+ return false;
134
+ }
135
+ return max <= this.selectedItems().length;
136
+ });
137
+ /**
138
+ * Gets the header cells of the table.
139
+ * @returns a 2D array of header cells.
140
+ */
141
+ this.headerCells = this._headerCells.asReadonly();
142
+ /**
143
+ * Checks if the table has defined columns.
144
+ * @returns a boolean value indicating if the table has defined columns.
145
+ */
146
+ this.hasDefinedColumns = computed(() => this._dataColumns().length > 0);
38
147
  //! sorting
39
148
  this._currentSortColumn = null;
40
149
  this._currentSortType = null;
41
150
  }
42
- /**
43
- * Gets all items.
44
- */
45
- get items() {
46
- return this._items;
47
- }
48
- get sortedItems() {
49
- return this._sortedItems;
50
- }
51
- /**
52
- * Gets items based on the current pagination state.
53
- */
54
- get paginatedItems() {
55
- //prettier-ignore
56
- if (!this._ardParentComp.paginated
57
- || this._ardParentComp.paginationStrategy == TablePaginationStrategy.Noop) {
58
- return this.sortedItems;
59
- }
60
- const page = this._ardParentComp.page;
61
- const IPP = this._ardParentComp.itemsPerPage;
62
- const itemsStart = (page - 1) * IPP;
63
- const itemsEnd = page * IPP;
64
- return this.sortedItems.slice(itemsStart, itemsEnd);
65
- }
66
- /**
67
- * Gets all currently selected items.
68
- */
69
- get selectedItems() {
70
- return this._selectedItems;
71
- }
72
- /**
73
- * Gets all currently highlighted items.
74
- */
75
- get highlightedItems() {
76
- return this._highlightedItems;
77
- }
78
- /**
79
- * Gets the values of the currently selected items.
80
- */
81
- get value() {
82
- return this._itemsToValue(this.selectedItems);
83
- }
84
151
  /**
85
152
  * Maps an array of items into their values.
86
153
  * @param items The items to convert to value.
87
154
  * @returns An array of item values.
88
155
  */
89
156
  _itemsToValue(items) {
90
- return items.map(item => item.itemData);
91
- }
92
- /**
93
- * Returns true if at least one item is highlighted, otherwise false.
94
- */
95
- get isAnyItemHighlighted() {
96
- return this._highlightedItems.length > 0;
97
- }
98
- /**
99
- * Checks if any item in the table is selected.
100
- * @returns A boolean value indicating if any item is selected.
101
- */
102
- get isAnyItemSelected() {
103
- return this._selectedItems.length > 0;
104
- }
105
- /**
106
- * Checks if all items in the table are selected.
107
- * @returns A boolean value indicating if all items are selected.
108
- */
109
- get areAllSelected() {
110
- return this._selectedItems.length == this._items.filter(item => !item.disabled).length;
111
- }
112
- /**
113
- * Returns true if the parent component defines the limit of concurrently selectable items and the amount of currently selected items matches that limit. Otherwise returns false.
114
- *
115
- * **TLDR**: true if `maxSelectedItems` is defined and the number of selected items matches that value.
116
- */
117
- get isItemLimitReached() {
118
- if (!isDefined(this._ardParentComp.maxSelectedItems)) {
119
- return false;
120
- }
121
- return this._ardParentComp.maxSelectedItems <= this.selectedItems.length;
122
- }
123
- /**
124
- * Gets the header cells of the table.
125
- * @returns a 2D array of header cells.
126
- */
127
- get headerCells() {
128
- return this._headerCells;
129
- }
130
- /**
131
- * Checks if the table has defined columns.
132
- * @returns a boolean value indicating if the table has defined columns.
133
- */
134
- get hasDefinedColumns() {
135
- return this._dataColumns.length > 0;
157
+ return items.map(item => item.itemData());
136
158
  }
137
159
  //! setting columns
138
160
  /**
@@ -142,27 +164,27 @@ export class TableItemStorage {
142
164
  setColumns(cols) {
143
165
  const maxNestingLevel = this._getHeaderMaxNesting(cols);
144
166
  const headerCells = this._mapColumnsToArray(cols, maxNestingLevel, 0);
145
- this._headerCells = this._filterHeaderCells(headerCells);
146
- this._dataColumns = this._extractDataSources(cols);
167
+ this._headerCells.set(this._filterHeaderCells(headerCells));
168
+ this._dataColumns.set(this._extractDataSources(cols));
147
169
  }
148
170
  /**
149
- * Filters out null values from the header cells array.
171
+ * Filters out null values from the header cells array. Pure function.
150
172
  * @param cells a 2D array of header cells or null values.
151
173
  * @returns a 2D array of header cells without null values and empty arrays.
152
174
  */
153
175
  _filterHeaderCells(cells) {
154
176
  for (let i = 0; i < cells.length; i++) {
155
- cells[i] = cells[i].filter(v => v != null);
177
+ cells[i] = cells[i].filter(v => v !== null);
156
178
  }
157
179
  return cells.filter(row => row.length);
158
180
  }
159
181
  /**
160
- * Extracts the data sources from the columns array.
182
+ * Extracts the data sources from the columns array. Pure function.
161
183
  * @param cols an array of table data columns or table subheaders.
162
184
  * @returns an array of table data columns.
163
185
  */
164
186
  _extractDataSources(cols) {
165
- let dataColumns = [];
187
+ const dataColumns = [];
166
188
  for (const col of cols) {
167
189
  if (!isTableSubheader(col)) {
168
190
  dataColumns.push(col);
@@ -173,7 +195,7 @@ export class TableItemStorage {
173
195
  return dataColumns;
174
196
  }
175
197
  /**
176
- * Gets the maximum nesting level of the columns array.
198
+ * Gets the maximum nesting level of the columns array. Pure function.
177
199
  * @param cols an array of table data columns or table subheaders.
178
200
  * @returns the maximum nesting level as a number.
179
201
  */
@@ -189,7 +211,7 @@ export class TableItemStorage {
189
211
  return max;
190
212
  }
191
213
  /**
192
- * Maps the columns tree to a 2D array of header cells or null values.
214
+ * Maps the columns tree to a 2D array of header cells or null values. Pure function.
193
215
  * @param cols an array of table data columns or table subheaders.
194
216
  * @param maxNesting the maximum nesting level of the columns array.
195
217
  * @param currentNesting the current nesting level of the columns array.
@@ -225,12 +247,11 @@ export class TableItemStorage {
225
247
  * @param items An array of items to be set as the component's items.
226
248
  */
227
249
  setItems(items) {
228
- if (!this.hasDefinedColumns)
250
+ if (!this.hasDefinedColumns())
229
251
  return;
230
- this._items = items.map((item, index) => {
231
- return this._setItemsMapFn(item, index);
232
- });
233
- this._sortedItems = this._items;
252
+ const mappedItems = items.map((item, i) => this._setItemsMapFn(item, i));
253
+ this._items.set(mappedItems);
254
+ this._sortedItems.set(mappedItems);
234
255
  }
235
256
  /**
236
257
  * Maps raw item data to an {@link ArdTableRow} object.
@@ -244,26 +265,18 @@ export class TableItemStorage {
244
265
  //get data
245
266
  const [data, dataColumns] = this._getRowData(rawItemData, index);
246
267
  //get bold
247
- const rowBoldFromPath = this._ardParentComp.rowBoldFrom ?? this._ardParentComp.DEFAULTS.rowBoldFrom;
268
+ const rowBoldFromPath = this._ardParentComp.rowBoldFrom() ?? this._ardParentComp.DEFAULTS.rowBoldFrom;
248
269
  let bold = resolvePath(rawItemData, rowBoldFromPath);
249
- if (this._ardParentComp.invertRowBold) {
270
+ if (this._ardParentComp.invertRowBold()) {
250
271
  bold = !bold;
251
272
  }
252
273
  //get disabled
253
- const disabledPath = this._ardParentComp.rowDisabledFrom ?? this._ardParentComp.DEFAULTS.rowDisabledFrom;
274
+ const disabledPath = this._ardParentComp.rowDisabledFrom() ?? this._ardParentComp.DEFAULTS.rowDisabledFrom;
254
275
  let disabled = evaluate(resolvePath(rawItemData, disabledPath));
255
- if (this._ardParentComp.invertRowDisabled) {
276
+ if (this._ardParentComp.invertRowDisabled()) {
256
277
  disabled = !disabled;
257
278
  }
258
- //return
259
- return {
260
- itemData: rawItemData,
261
- index,
262
- data,
263
- dataColumns,
264
- disabled,
265
- bold,
266
- };
279
+ return new ArdTableRow(rawItemData, index, data, dataColumns, disabled, bold);
267
280
  }
268
281
  /**
269
282
  * Retrieves data for a row based on data columns configuration.
@@ -274,29 +287,31 @@ export class TableItemStorage {
274
287
  * @private
275
288
  */
276
289
  _getRowData(rawItemData, index) {
277
- let data = [];
278
- for (const dataColumn of this._dataColumns) {
290
+ const data = [];
291
+ const _cols = this._dataColumns();
292
+ for (let i = 0; i < _cols.length; i++) {
293
+ const dataColumn = _cols[i];
279
294
  const sourcePath = dataColumn.dataSource;
280
- if (typeof sourcePath == 'string') {
281
- if (this._ardParentComp.treatDataSourceAsString) {
295
+ if (typeof sourcePath === 'string') {
296
+ if (this._ardParentComp.treatDataSourceAsString()) {
282
297
  data.push(rawItemData[sourcePath]);
283
298
  continue;
284
299
  }
285
300
  data.push(resolvePath(rawItemData, sourcePath));
286
301
  continue;
287
302
  }
288
- if (sourcePath.type == 'autocount') {
303
+ if (sourcePath.type === 'autocount') {
289
304
  data.push(index + 1);
290
305
  continue;
291
306
  }
292
- if (sourcePath.type == 'checkbox') {
307
+ if (sourcePath.type === 'checkbox') {
293
308
  data.push({ _ardCheckbox: true, index });
294
309
  continue;
295
310
  }
296
- const sourceString = typeof sourcePath == 'object' ? JSON.stringify(sourcePath) : sourcePath;
297
- console.error(new Error(`Unexpected data source "${sourceString}".`));
311
+ const sourceString = typeof sourcePath === 'object' ? JSON.stringify(sourcePath) : sourcePath;
312
+ throw new Error(`ARD-FT5052: Unexpected data source "${sourceString}" at index ${i}.`);
298
313
  }
299
- return [data, this._dataColumns];
314
+ return [data, this._dataColumns()];
300
315
  }
301
316
  /**
302
317
  * Writes a new value to the item storage. Selects the correct items based on the provided values, warning the user if the value is not found.
@@ -314,7 +329,7 @@ export class TableItemStorage {
314
329
  * @returns {boolean} _true_ if the item is selected, otherwise _false_.
315
330
  */
316
331
  isItemSelected(index) {
317
- return this._selectedItems.some(item => item.index == index);
332
+ return this.selectedItems().some(item => item.index() === index);
318
333
  }
319
334
  /**
320
335
  * Selects all items.
@@ -325,7 +340,7 @@ export class TableItemStorage {
325
340
  * * An array of items failed to select.
326
341
  */
327
342
  selectAll() {
328
- return this.selectItem(...this._items.map(v => v.index));
343
+ return this.selectItem(...this._items().map(v => v.index()));
329
344
  }
330
345
  /**
331
346
  * Unselects all selected items.
@@ -334,24 +349,22 @@ export class TableItemStorage {
334
349
  * @returns An array of items cleared, mapped to only their values.
335
350
  */
336
351
  unselectAll() {
337
- for (const item of this._selectedItems) {
338
- item.selected = false;
352
+ const selected = this.selectedItems();
353
+ for (const item of selected) {
354
+ item.selected.set(false);
339
355
  }
340
- const ret = this._itemsToValue(this._selectedItems);
341
- this._selectedItems = [];
342
- return ret;
356
+ return this._itemsToValue(selected);
343
357
  }
344
358
  /**
345
359
  * Unselects all selected items, no matter what the component settings are.
346
360
  * @returns An array of items cleared, mapped to only their values.
347
361
  */
348
362
  _forceUnselectAll() {
349
- for (const item of this._selectedItems) {
350
- item.selected = false;
363
+ const selected = this.selectedItems();
364
+ for (const item of selected) {
365
+ item.selected.set(false);
351
366
  }
352
- const ret = this._itemsToValue(this._selectedItems);
353
- this._selectedItems = [];
354
- return ret;
367
+ return this._itemsToValue(selected);
355
368
  }
356
369
  /**
357
370
  * Selects one or multiple items.
@@ -360,25 +373,26 @@ export class TableItemStorage {
360
373
  *
361
374
  * @param indexes A rest operator array of item indexes to be selected.
362
375
  * @returns a tuple containing two arrays:
363
- * * An array of items selected.
364
- * * An array of items failed to select.
376
+ * - An array of items selected.
377
+ * - An array of items failed to select.
365
378
  */
366
379
  selectItem(...indexes) {
367
- const itemsToBeSelected = this._items.filter(item => !item.disabled && indexes.includes(item.index));
368
- if (this.isItemLimitReached) {
380
+ const itemsToBeSelected = this._items().filter(item => !item.disabled() && indexes.includes(item.index()));
381
+ if (this.isItemLimitReached()) {
369
382
  return [[], this._itemsToValue(itemsToBeSelected)];
370
383
  }
371
384
  let itemsSelectedCount = 0;
372
385
  const itemsSelected = [];
386
+ let itemsLeftUntilLimit = (this._ardParentComp.maxSelectedItems() ?? Infinity) - this.selectedItems().length;
373
387
  for (const item of itemsToBeSelected) {
374
388
  itemsSelectedCount++;
375
- if (item.selected)
389
+ if (item.selected())
376
390
  continue;
377
- if (this.isItemLimitReached) {
391
+ if (itemsLeftUntilLimit <= 0) {
378
392
  break;
379
393
  }
380
- item.selected = true;
381
- this._selectedItems.push(item);
394
+ itemsLeftUntilLimit--;
395
+ item.selected.set(true);
382
396
  itemsSelected.push(item);
383
397
  }
384
398
  const itemsFailedToSelect = itemsToBeSelected.slice(itemsSelectedCount - 1);
@@ -390,22 +404,21 @@ export class TableItemStorage {
390
404
  * @returns An array of items unselected, mapped to only their values.
391
405
  */
392
406
  unselectItem(...indexes) {
393
- const itemsToBeSelected = this._items.filter(item => indexes.includes(item.index));
394
- for (const item of itemsToBeSelected) {
395
- item.selected = false;
407
+ const itemsToBeUnselected = this._items().filter(item => indexes.includes(item.index()));
408
+ for (const item of itemsToBeUnselected) {
409
+ item.selected.set(false);
396
410
  }
397
- this._selectedItems = this._selectedItems.filter(v => v.selected);
398
- return this._itemsToValue(itemsToBeSelected);
411
+ return this._itemsToValue(itemsToBeUnselected);
399
412
  }
400
413
  //! highlighting items
401
414
  /**
402
415
  * Unhighlights all currently highlighted items.
403
416
  */
404
417
  unhighlightAll() {
405
- for (const item of this._highlightedItems) {
406
- item.highlighted = false;
418
+ const highlighted = this.highlightedItems();
419
+ for (const item of highlighted) {
420
+ item.highlighted.set(false);
407
421
  }
408
- this._highlightedItems = [];
409
422
  }
410
423
  /**
411
424
  * Highlights the given item, while unhighlighting all other items. Does nothing when the item is disabled.
@@ -422,11 +435,10 @@ export class TableItemStorage {
422
435
  * @returns The last highlighted item.
423
436
  */
424
437
  highlightItem(...indexes) {
425
- const items = this._items.filter(item => indexes.includes(item.index));
438
+ const items = this._items().filter(item => indexes.includes(item.index()));
426
439
  for (const item of items) {
427
- item.highlighted = true;
440
+ item.highlighted.set(true);
428
441
  }
429
- this._highlightedItems.push(...items);
430
442
  return items.last();
431
443
  }
432
444
  /**
@@ -434,13 +446,12 @@ export class TableItemStorage {
434
446
  * @param items A rest operator array of item indexes to be unhighlighted.
435
447
  */
436
448
  unhighlightItem(...indexes) {
437
- const items = this._items.filter(item => indexes.includes(item.index));
449
+ const items = this._items().filter(item => indexes.includes(item.index()));
438
450
  for (const item of items) {
439
- if (!item || !item.highlighted)
451
+ if (!item || !item.highlighted())
440
452
  return;
441
- item.highlighted = false;
453
+ item.highlighted.set(false);
442
454
  }
443
- this._highlightedItems = this._highlightedItems.filter(v => v.highlighted);
444
455
  }
445
456
  /**
446
457
  * Highlights the first item out of all items.
@@ -448,7 +459,7 @@ export class TableItemStorage {
448
459
  */
449
460
  highlightFirstItem() {
450
461
  this.unhighlightAll();
451
- let itemToHighlight = this._getHiglightableItems().first().index;
462
+ const itemToHighlight = this.highlightableItems().first().index();
452
463
  return this.highlightItem(itemToHighlight);
453
464
  }
454
465
  /**
@@ -457,14 +468,14 @@ export class TableItemStorage {
457
468
  */
458
469
  highlightLastItem() {
459
470
  this.unhighlightAll();
460
- let itemToHighlight = this._getHiglightableItems().last().index;
471
+ const itemToHighlight = this.highlightableItems().last().index();
461
472
  return this.highlightItem(itemToHighlight);
462
473
  }
463
474
  /**
464
475
  * Highlights all non-disabled items.
465
476
  */
466
477
  highlightAllItems() {
467
- let itemsToHighlight = this._getHiglightableItems().map(v => v.index);
478
+ const itemsToHighlight = this.highlightableItems().map(v => v.index());
468
479
  this.highlightItem(...itemsToHighlight);
469
480
  }
470
481
  /**
@@ -476,12 +487,12 @@ export class TableItemStorage {
476
487
  * @returns The item highlighted.
477
488
  */
478
489
  highlightNextItem(offset, hasShift) {
479
- if (!this.isAnyItemHighlighted) {
490
+ if (!this.isAnyItemHighlighted()) {
480
491
  return this.highlightFirstItem();
481
492
  }
482
- const currentItem = this.highlightedItems.last();
483
- const itemsWithoutDisabled = this._items.filter(item => !item.disabled && (!this.isItemLimitReached || item.selected));
484
- const currentIndexInItems = itemsWithoutDisabled.findIndex(item => item.index == currentItem.index);
493
+ const currentItem = this.highlightedItems().last();
494
+ const itemsWithoutDisabled = this._items().filter(item => !item.disabled() && (!this.isItemLimitReached() || item.selected()));
495
+ const currentIndexInItems = itemsWithoutDisabled.findIndex(item => item.index() === currentItem.index());
485
496
  let nextItemIndex = currentIndexInItems + offset;
486
497
  if (nextItemIndex >= itemsWithoutDisabled.length) {
487
498
  nextItemIndex -= itemsWithoutDisabled.length;
@@ -491,23 +502,16 @@ export class TableItemStorage {
491
502
  }
492
503
  const itemToHighlight = itemsWithoutDisabled[nextItemIndex];
493
504
  if (hasShift) {
494
- if (itemToHighlight.highlighted) {
505
+ if (itemToHighlight.highlighted()) {
495
506
  this.unhighlightItem(nextItemIndex);
496
507
  }
497
508
  return this.highlightItem(nextItemIndex);
498
509
  }
499
510
  return this.highlightSingleItem(nextItemIndex);
500
511
  }
501
- /**
502
- * Finds all highlightable items. An item is considered highlightable if it is **not** disabled.
503
- * @returns An array of all highlightable items.
504
- */
505
- _getHiglightableItems() {
506
- return this._items.filter(item => !item.disabled);
507
- }
508
512
  toggleCurrentSortColumn(column) {
509
- if (this._currentSortColumn == column) {
510
- if (this._currentSortType == SortType.Ascending) {
513
+ if (this._currentSortColumn === column) {
514
+ if (this._currentSortType === SortType.Ascending) {
511
515
  this._currentSortType = SortType.Descending;
512
516
  }
513
517
  else {
@@ -523,29 +527,29 @@ export class TableItemStorage {
523
527
  resetSort() {
524
528
  this._currentSortColumn = null;
525
529
  this._currentSortType = null;
526
- this._sortedItems = [...this.items];
530
+ this._sortedItems.set([...this.items()]);
527
531
  }
528
532
  getColumnSortType(column) {
529
- if (this._currentSortColumn == column) {
533
+ if (this._currentSortColumn === column) {
530
534
  return this._currentSortType;
531
535
  }
532
536
  return null;
533
537
  }
534
538
  _generateSortedRows(justReverse) {
535
539
  if (justReverse) {
536
- this._sortedItems.reverse();
540
+ this._sortedItems().reverse();
537
541
  return;
538
542
  }
539
543
  const sortColumnIndex = this._currentSortColumn;
540
544
  if (isNull(sortColumnIndex) || !this._currentSortType) {
541
- this._sortedItems = this.items;
545
+ this._sortedItems.set(this.items());
542
546
  return;
543
547
  }
544
- const sortColumn = this._dataColumns[sortColumnIndex];
548
+ const sortColumn = this._dataColumns()[sortColumnIndex];
545
549
  if (!sortColumn) {
546
- throw new Error(`Encountered an issue in <ard-table>: could not find the column with index ${sortColumnIndex}. This is most likely an Ardium bug, please report it on GitHub.`);
550
+ throw new Error(`ARD-IS5059: Encountered an issue in <ard-table>: could not find the column with index ${sortColumnIndex}. This is most likely an Ardium UI bug, please report it to the creators.`);
547
551
  }
548
- const direction = this._currentSortType == SortType.Ascending ? 1 : -1;
552
+ const direction = this._currentSortType === SortType.Ascending ? 1 : -1;
549
553
  const sortFn = sortColumn.sortFn ??
550
554
  ((a, b) => {
551
555
  if (a > b)
@@ -554,7 +558,7 @@ export class TableItemStorage {
554
558
  return -1 * direction;
555
559
  return 0;
556
560
  });
557
- this._sortedItems = [...this.items].sort((a, b) => sortFn(a.data[sortColumnIndex], b.data[sortColumnIndex]));
561
+ this._sortedItems.set([...this.items()].sort((a, b) => sortFn(a.data()[sortColumnIndex], b.data()[sortColumnIndex])));
558
562
  }
559
563
  }
560
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaXRlbS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS1pdGVtLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFELE9BQU8sRUFBRSxRQUFRLEVBQW1CLHVCQUF1QixFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBaUM3RSxNQUFNLE9BQU8sVUFBVTtJQUtyQixJQUFJLEtBQUs7UUFDUCxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNPLFNBQVMsQ0FBQyxLQUFrQztRQUNsRCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hCLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtZQUFFLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQztRQUNsRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxZQUFZLElBQXNDLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLFVBQWtC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QUNSLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0csQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlc29sdmVQYXRoIGZyb20gJ3Jlc29sdmUtb2JqZWN0LXBhdGgnO1xyXG5pbXBvcnQgeyBldmFsdWF0ZSwgaXNEZWZpbmVkLCBpc051bGwgfSBmcm9tICdzaW1wbGUtYm9vbCc7XHJcbmltcG9ydCB7IENvbXBhcmVXaXRoRm4gfSBmcm9tICcuLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xyXG5pbXBvcnQgeyBTb3J0VHlwZSwgVGFibGVEYXRhQ29sdW1uLCBUYWJsZVBhZ2luYXRpb25TdHJhdGVneSwgVGFibGVTdWJoZWFkZXIgfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcclxuaW1wb3J0IHsgYXJlQWxsRGF0YUNvbHVtbnMsIGlzVGFibGVTdWJoZWFkZXIsIG1lcmdlMmRBcnJheXMgfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXJkVGFibGVSb3cge1xyXG4gIHJlYWRvbmx5IGl0ZW1EYXRhOiBhbnk7XHJcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcclxuICByZWFkb25seSBpc0VtcHR5PzogYm9vbGVhbjtcclxuICBkYXRhOiBhbnlbXTtcclxuICBkYXRhQ29sdW1uczogVGFibGVEYXRhQ29sdW1uW107XHJcbiAgY2xhc3M/OiBzdHJpbmc7XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIGJvbGQ/OiBib29sZWFuO1xyXG4gIHNlbGVjdGVkPzogYm9vbGVhbjtcclxuICBoaWdobGlnaHRlZD86IGJvb2xlYW47XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUl0ZW1TdG9yYWdlSG9zdERlZmF1bHRzIHtcclxuICByb3dEaXNhYmxlZEZyb206IHN0cmluZztcclxuICByb3dCb2xkRnJvbTogc3RyaW5nO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVJdGVtU3RvcmFnZUhvc3Qge1xyXG4gIHJvd0Rpc2FibGVkRnJvbT86IHN0cmluZztcclxuICByb3dCb2xkRnJvbT86IHN0cmluZztcclxuICBpbnZlcnRSb3dEaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgaW52ZXJ0Um93Qm9sZD86IGJvb2xlYW47XHJcbiAgZGF0YT86IGFueVtdO1xyXG4gIHJlYWRvbmx5IERFRkFVTFRTOiBUYWJsZUl0ZW1TdG9yYWdlSG9zdERlZmF1bHRzO1xyXG4gIG1heFNlbGVjdGVkSXRlbXM/OiBudW1iZXI7XHJcbiAgdHJlYXREYXRhU291cmNlQXNTdHJpbmc/OiBib29sZWFuO1xyXG5cclxuICBwYWdpbmF0ZWQ6IGJvb2xlYW47XHJcbiAgcGFnaW5hdGlvblN0cmF0ZWd5OiBUYWJsZVBhZ2luYXRpb25TdHJhdGVneTtcclxuICBpdGVtc1BlclBhZ2U6IG51bWJlcjtcclxuICBwYWdlOiBudW1iZXI7XHJcbn1cclxuZXhwb3J0IGNsYXNzIEhlYWRlckNlbGwge1xyXG4gIGNvbHNwYW4hOiBudW1iZXI7XHJcbiAgcm93c3BhbiE6IG51bWJlcjtcclxuICBjZWxsITogVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXI7XHJcblxyXG4gIGdldCB3aWR0aCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmIChpc1RhYmxlU3ViaGVhZGVyKHRoaXMuY2VsbCkpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldFdpZHRoKHRoaXMuY2VsbC53aWR0aCk7XHJcbiAgfVxyXG4gIGdldCBtaW5XaWR0aCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmIChpc1RhYmxlU3ViaGVhZGVyKHRoaXMuY2VsbCkpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldFdpZHRoKHRoaXMuY2VsbC5taW5XaWR0aCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2dldFdpZHRoKHdpZHRoOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICghd2lkdGgpIHJldHVybiBudWxsO1xyXG4gICAgaWYgKHR5cGVvZiB3aWR0aCA9PSAnbnVtYmVyJykgcmV0dXJuIGAke3dpZHRofXB4YDtcclxuICAgIHJldHVybiB3aWR0aDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNlbGw6IFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyLCBjb2xzcGFuOiBudW1iZXIgPSAxLCByb3dzcGFuOiBudW1iZXIgPSAxKSB7XHJcbiAgICB0aGlzLmNlbGwgPSBjZWxsO1xyXG4gICAgdGhpcy5jb2xzcGFuID0gY29sc3BhbjtcclxuICAgIHRoaXMucm93c3BhbiA9IHJvd3NwYW47XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVGFibGVJdGVtU3RvcmFnZSB7XHJcbiAgcHJpdmF0ZSBfaXRlbXM6IEFyZFRhYmxlUm93W10gPSBbXTtcclxuICBwcml2YXRlIF9zb3J0ZWRJdGVtczogQXJkVGFibGVSb3dbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2hpZ2hsaWdodGVkSXRlbXM6IEFyZFRhYmxlUm93W10gPSBbXTtcclxuICBwcml2YXRlIF9zZWxlY3RlZEl0ZW1zOiBBcmRUYWJsZVJvd1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgX2RhdGFDb2x1bW5zOiBUYWJsZURhdGFDb2x1bW5bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2hlYWRlckNlbGxzOiBIZWFkZXJDZWxsW11bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hcmRQYXJlbnRDb21wOiBUYWJsZUl0ZW1TdG9yYWdlSG9zdCkge31cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBhbGwgaXRlbXMuXHJcbiAgICovXHJcbiAgZ2V0IGl0ZW1zKCk6IEFyZFRhYmxlUm93W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xyXG4gIH1cclxuICBnZXQgc29ydGVkSXRlbXMoKTogQXJkVGFibGVSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc29ydGVkSXRlbXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgaXRlbXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcGFnaW5hdGlvbiBzdGF0ZS5cclxuICAgKi9cclxuICBnZXQgcGFnaW5hdGVkSXRlbXMoKTogQXJkVGFibGVSb3dbXSB7XHJcbiAgICAvL3ByZXR0aWVyLWlnbm9yZVxyXG4gICAgaWYgKFxyXG4gICAgICAgICAgICAhdGhpcy5fYXJkUGFyZW50Q29tcC5wYWdpbmF0ZWRcclxuICAgICAgICAgICAgfHwgdGhpcy5fYXJkUGFyZW50Q29tcC5wYWdpbmF0aW9uU3RyYXRlZ3kgPT0gVGFibGVQYWdpbmF0aW9uU3RyYXRlZ3kuTm9vcFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3J0ZWRJdGVtcztcclxuICAgICAgICB9XHJcbiAgICBjb25zdCBwYWdlID0gdGhpcy5fYXJkUGFyZW50Q29tcC5wYWdlO1xyXG4gICAgY29uc3QgSVBQID0gdGhpcy5fYXJkUGFyZW50Q29tcC5pdGVtc1BlclBhZ2U7XHJcbiAgICBjb25zdCBpdGVtc1N0YXJ0ID0gKHBhZ2UgLSAxKSAqIElQUDtcclxuICAgIGNvbnN0IGl0ZW1zRW5kID0gcGFnZSAqIElQUDtcclxuICAgIHJldHVybiB0aGlzLnNvcnRlZEl0ZW1zLnNsaWNlKGl0ZW1zU3RhcnQsIGl0ZW1zRW5kKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBhbGwgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zLlxyXG4gICAqL1xyXG4gIGdldCBzZWxlY3RlZEl0ZW1zKCk6IEFyZFRhYmxlUm93W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgYWxsIGN1cnJlbnRseSBoaWdobGlnaHRlZCBpdGVtcy5cclxuICAgKi9cclxuICBnZXQgaGlnaGxpZ2h0ZWRJdGVtcygpOiBBcmRUYWJsZVJvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSB2YWx1ZXMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcy5cclxuICAgKi9cclxuICBnZXQgdmFsdWUoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zVG9WYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNYXBzIGFuIGFycmF5IG9mIGl0ZW1zIGludG8gdGhlaXIgdmFsdWVzLlxyXG4gICAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgdG8gY29udmVydCB0byB2YWx1ZS5cclxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBpdGVtIHZhbHVlcy5cclxuICAgKi9cclxuICBwcml2YXRlIF9pdGVtc1RvVmFsdWUoaXRlbXM6IEFyZFRhYmxlUm93W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gaXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5pdGVtRGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIGl0ZW0gaXMgaGlnaGxpZ2h0ZWQsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgKi9cclxuICBnZXQgaXNBbnlJdGVtSGlnaGxpZ2h0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWRJdGVtcy5sZW5ndGggPiAwO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgYW55IGl0ZW0gaW4gdGhlIHRhYmxlIGlzIHNlbGVjdGVkLlxyXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFueSBpdGVtIGlzIHNlbGVjdGVkLlxyXG4gICAqL1xyXG4gIGdldCBpc0FueUl0ZW1TZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBhbGwgaXRlbXMgaW4gdGhlIHRhYmxlIGFyZSBzZWxlY3RlZC5cclxuICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiBhbGwgaXRlbXMgYXJlIHNlbGVjdGVkLlxyXG4gICAqL1xyXG4gIGdldCBhcmVBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PSB0aGlzLl9pdGVtcy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCkubGVuZ3RoO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcmVudCBjb21wb25lbnQgZGVmaW5lcyB0aGUgbGltaXQgb2YgY29uY3VycmVudGx5IHNlbGVjdGFibGUgaXRlbXMgYW5kIHRoZSBhbW91bnQgb2YgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zIG1hdGNoZXMgdGhhdCBsaW1pdC4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXHJcbiAgICpcclxuICAgKiAqKlRMRFIqKjogdHJ1ZSBpZiBgbWF4U2VsZWN0ZWRJdGVtc2AgaXMgZGVmaW5lZCBhbmQgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcyBtYXRjaGVzIHRoYXQgdmFsdWUuXHJcbiAgICovXHJcbiAgZ2V0IGlzSXRlbUxpbWl0UmVhY2hlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuX2FyZFBhcmVudENvbXAubWF4U2VsZWN0ZWRJdGVtcykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2FyZFBhcmVudENvbXAubWF4U2VsZWN0ZWRJdGVtcyA8PSB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgaGVhZGVyIGNlbGxzIG9mIHRoZSB0YWJsZS5cclxuICAgKiBAcmV0dXJucyBhIDJEIGFycmF5IG9mIGhlYWRlciBjZWxscy5cclxuICAgKi9cclxuICBnZXQgaGVhZGVyQ2VsbHMoKTogSGVhZGVyQ2VsbFtdW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlckNlbGxzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgdGhlIHRhYmxlIGhhcyBkZWZpbmVkIGNvbHVtbnMuXHJcbiAgICogQHJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHRhYmxlIGhhcyBkZWZpbmVkIGNvbHVtbnMuXHJcbiAgICovXHJcbiAgZ2V0IGhhc0RlZmluZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFDb2x1bW5zLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICAvLyEgc2V0dGluZyBjb2x1bW5zXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgY29sdW1ucyBvZiB0aGUgdGFibGUuXHJcbiAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zIG9yIHRhYmxlIHN1YmhlYWRlcnMuXHJcbiAgICovXHJcbiAgc2V0Q29sdW1ucyhjb2xzOiAoVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXIpW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IG1heE5lc3RpbmdMZXZlbCA9IHRoaXMuX2dldEhlYWRlck1heE5lc3RpbmcoY29scyk7XHJcbiAgICBjb25zdCBoZWFkZXJDZWxscyA9IHRoaXMuX21hcENvbHVtbnNUb0FycmF5KGNvbHMsIG1heE5lc3RpbmdMZXZlbCwgMCk7XHJcbiAgICB0aGlzLl9oZWFkZXJDZWxscyA9IHRoaXMuX2ZpbHRlckhlYWRlckNlbGxzKGhlYWRlckNlbGxzKTtcclxuICAgIHRoaXMuX2RhdGFDb2x1bW5zID0gdGhpcy5fZXh0cmFjdERhdGFTb3VyY2VzKGNvbHMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGaWx0ZXJzIG91dCBudWxsIHZhbHVlcyBmcm9tIHRoZSBoZWFkZXIgY2VsbHMgYXJyYXkuXHJcbiAgICogQHBhcmFtIGNlbGxzIGEgMkQgYXJyYXkgb2YgaGVhZGVyIGNlbGxzIG9yIG51bGwgdmFsdWVzLlxyXG4gICAqIEByZXR1cm5zIGEgMkQgYXJyYXkgb2YgaGVhZGVyIGNlbGxzIHdpdGhvdXQgbnVsbCB2YWx1ZXMgYW5kIGVtcHR5IGFycmF5cy5cclxuICAgKi9cclxuICBwcml2YXRlIF9maWx0ZXJIZWFkZXJDZWxscyhjZWxsczogKEhlYWRlckNlbGwgfCBudWxsKVtdW10pOiBIZWFkZXJDZWxsW11bXSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNlbGxzW2ldID0gY2VsbHNbaV0uZmlsdGVyKHYgPT4gdiAhPSBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjZWxscy5maWx0ZXIocm93ID0+IHJvdy5sZW5ndGgpIGFzIEhlYWRlckNlbGxbXVtdO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBFeHRyYWN0cyB0aGUgZGF0YSBzb3VyY2VzIGZyb20gdGhlIGNvbHVtbnMgYXJyYXkuXHJcbiAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zIG9yIHRhYmxlIHN1YmhlYWRlcnMuXHJcbiAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2V4dHJhY3REYXRhU291cmNlcyhjb2xzOiAoVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXIpW10pOiBUYWJsZURhdGFDb2x1bW5bXSB7XHJcbiAgICBsZXQgZGF0YUNvbHVtbnM6IFRhYmxlRGF0YUNvbHVtbltdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xyXG4gICAgICBpZiAoIWlzVGFibGVTdWJoZWFkZXIoY29sKSkge1xyXG4gICAgICAgIGRhdGFDb2x1bW5zLnB1c2goY29sKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBkYXRhQ29sdW1ucy5wdXNoKC4uLnRoaXMuX2V4dHJhY3REYXRhU291cmNlcyhjb2wuY2hpbGRyZW4pKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0YUNvbHVtbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIG1heGltdW0gbmVzdGluZyBsZXZlbCBvZiB0aGUgY29sdW1ucyBhcnJheS5cclxuICAgKiBAcGFyYW0gY29scyBhbiBhcnJheSBvZiB0YWJsZSBkYXRhIGNvbHVtbnMgb3IgdGFibGUgc3ViaGVhZGVycy5cclxuICAgKiBAcmV0dXJucyB0aGUgbWF4aW11bSBuZXN0aW5nIGxldmVsIGFzIGEgbnVtYmVyLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldEhlYWRlck1heE5lc3RpbmcoY29sczogKFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyKVtdKTogbnVtYmVyIHtcclxuICAgIGlmIChhcmVBbGxEYXRhQ29sdW1ucyhjb2xzKSkgcmV0dXJuIDE7XHJcbiAgICBsZXQgbWF4ID0gMTtcclxuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHMuZmlsdGVyKHYgPT4gaXNUYWJsZVN1YmhlYWRlcih2KSkgYXMgVGFibGVTdWJoZWFkZXJbXSkge1xyXG4gICAgICBjb25zdCBoZWlnaHQgPSAxICsgdGhpcy5fZ2V0SGVhZGVyTWF4TmVzdGluZyhjb2wuY2hpbGRyZW4pO1xyXG4gICAgICBpZiAoaGVpZ2h0ID4gbWF4KSBtYXggPSBoZWlnaHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNYXBzIHRoZSBjb2x1bW5zIHRyZWUgdG8gYSAyRCBhcnJheSBvZiBoZWFkZXIgY2VsbHMgb3IgbnVsbCB2YWx1ZXMuXHJcbiAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zIG9yIHRhYmxlIHN1YmhlYWRlcnMuXHJcbiAgICogQHBhcmFtIG1heE5lc3RpbmcgdGhlIG1heGltdW0gbmVzdGluZyBsZXZlbCBvZiB0aGUgY29sdW1ucyBhcnJheS5cclxuICAgKiBAcGFyYW0gY3VycmVudE5lc3RpbmcgdGhlIGN1cnJlbnQgbmVzdGluZyBsZXZlbCBvZiB0aGUgY29sdW1ucyBhcnJheS5cclxuICAgKiBAcmV0dXJucyBhIDJEIGFycmF5IG9mIGhlYWRlciBjZWxscyBvciBudWxsIHZhbHVlcy5cclxuICAgKi9cclxuICBwcml2YXRlIF9tYXBDb2x1bW5zVG9BcnJheShjb2xzOiAoVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXIpW10sIG1heE5lc3Rpbmc6IG51bWJlciwgY3VycmVudE5lc3Rpbmc6IG51bWJlcik6IChIZWFkZXJDZWxsIHwgbnVsbClbXVtdIHtcclxuICAgIGlmIChhcmVBbGxEYXRhQ29sdW1ucyhjb2xzKSkge1xyXG4gICAgICByZXR1cm4gW2NvbHMubWFwKGNvbCA9PiBuZXcgSGVhZGVyQ2VsbChjb2wsIDEsIG1heE5lc3RpbmcgLSBjdXJyZW50TmVzdGluZykpXTtcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRlckNlbGxzOiAoSGVhZGVyQ2VsbCB8IG51bGwpW11bXSA9IFtbXV07XHJcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2xzKSB7XHJcbiAgICAgIGlmICghaXNUYWJsZVN1YmhlYWRlcihjb2wpKSB7XHJcbiAgICAgICAgaGVhZGVyQ2VsbHNbMF0ucHVzaChuZXcgSGVhZGVyQ2VsbChjb2wsIDEsIG1heE5lc3RpbmcgLSBjdXJyZW50TmVzdGluZykpO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNoaWxkQ2VsbHM6IChIZWFkZXJDZWxsIHwgbnVsbClbXVtdID0gW1tdLCAuLi50aGlzLl9tYXBDb2x1bW5zVG9BcnJheShjb2wuY2hpbGRyZW4sIG1heE5lc3RpbmcsIGN1cnJlbnROZXN0aW5nICsgMSldO1xyXG4gICAgICBjb25zdCBoZWlnaHQgPSBjaGlsZENlbGxzLmxlbmd0aCAtIDE7XHJcbiAgICAgIGNvbnN0IHdpZHRoID0gY2hpbGRDZWxsc1sxXS5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcclxuICAgICAgICBoZWFkZXJDZWxscy5wdXNoKFtudWxsXSk7XHJcbiAgICAgIH1cclxuICAgICAgaGVhZGVyQ2VsbHNbMF0ucHVzaChuZXcgSGVhZGVyQ2VsbChjb2wsIHdpZHRoLCAxKSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGggLSAxOyBpKyspIHtcclxuICAgICAgICBoZWFkZXJDZWxsc1swXS5wdXNoKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIG1lcmdlMmRBcnJheXMoaGVhZGVyQ2VsbHMsIGNoaWxkQ2VsbHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGhlYWRlckNlbGxzO1xyXG4gIH1cclxuXHJcbiAgLy8hIHNldHRpbmcgaXRlbXNcclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBjb21wb25lbnQncyBpdGVtcy4gVGFrZXMgaW50byBhY2NvdW50IHRoZSB2YWx1ZXMgZGVmaW5lZCBieSB0aGUgcGFyZW50IGNvbXBvbmVudCBmb3IgYHJvd0Rpc2FibGVkRnJvbWAsIGByb3dCb2xkRnJvbWAsIGFuZCBgcm93SGlnaGxpZ2h0ZWRGcm9tYC5cclxuICAgKiBAcGFyYW0gaXRlbXMgQW4gYXJyYXkgb2YgaXRlbXMgdG8gYmUgc2V0IGFzIHRoZSBjb21wb25lbnQncyBpdGVtcy5cclxuICAgKi9cclxuICBzZXRJdGVtcyhpdGVtczogYW55W10pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5oYXNEZWZpbmVkQ29sdW1ucykgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2V0SXRlbXNNYXBGbihpdGVtLCBpbmRleCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3NvcnRlZEl0ZW1zID0gdGhpcy5faXRlbXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1hcHMgcmF3IGl0ZW0gZGF0YSB0byBhbiB7QGxpbmsgQXJkVGFibGVSb3d9IG9iamVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55fSByYXdJdGVtRGF0YSAtIFRoZSByYXcgZGF0YSBvZiB0aGUgaXRlbS5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0uXHJcbiAgICogQHJldHVybnMge0FyZFRhYmxlUm93fSBSZXR1cm5zIGFuIEFyZFRhYmxlUm93IG9iamVjdCB3aXRoIG1hcHBlZCBwcm9wZXJ0aWVzLlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfc2V0SXRlbXNNYXBGbihyYXdJdGVtRGF0YTogYW55LCBpbmRleDogbnVtYmVyKTogQXJkVGFibGVSb3cge1xyXG4gICAgLy9nZXQgZGF0YVxyXG4gICAgY29uc3QgW2RhdGEsIGRhdGFDb2x1bW5zXSA9IHRoaXMuX2dldFJvd0RhdGEocmF3SXRlbURhdGEsIGluZGV4KTtcclxuXHJcbiAgICAvL2dldCBib2xkXHJcbiAgICBjb25zdCByb3dCb2xkRnJvbVBhdGggPSB0aGlzLl9hcmRQYXJlbnRDb21wLnJvd0JvbGRGcm9tID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMucm93Qm9sZEZyb207XHJcbiAgICBsZXQgYm9sZCA9IHJlc29sdmVQYXRoKHJhd0l0ZW1EYXRhLCByb3dCb2xkRnJvbVBhdGgpO1xyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaW52ZXJ0Um93Qm9sZCkge1xyXG4gICAgICBib2xkID0gIWJvbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXQgZGlzYWJsZWRcclxuICAgIGNvbnN0IGRpc2FibGVkUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAucm93RGlzYWJsZWRGcm9tID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMucm93RGlzYWJsZWRGcm9tO1xyXG4gICAgbGV0IGRpc2FibGVkID0gZXZhbHVhdGUocmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIGRpc2FibGVkUGF0aCkpO1xyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaW52ZXJ0Um93RGlzYWJsZWQpIHtcclxuICAgICAgZGlzYWJsZWQgPSAhZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy9yZXR1cm5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGl0ZW1EYXRhOiByYXdJdGVtRGF0YSxcclxuICAgICAgaW5kZXgsXHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIGRhdGFDb2x1bW5zLFxyXG4gICAgICBkaXNhYmxlZCxcclxuICAgICAgYm9sZCxcclxuICAgIH07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBkYXRhIGZvciBhIHJvdyBiYXNlZCBvbiBkYXRhIGNvbHVtbnMgY29uZmlndXJhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55fSByYXdJdGVtRGF0YSAtIFRoZSByYXcgZGF0YSBvZiB0aGUgaXRlbS5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0uXHJcbiAgICogQHJldHVybnMge2FueVtdfSBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJvdyBkYXRhLlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0Um93RGF0YShyYXdJdGVtRGF0YTogYW55LCBpbmRleDogbnVtYmVyKTogW2FueVtdLCBUYWJsZURhdGFDb2x1bW5bXV0ge1xyXG4gICAgbGV0IGRhdGE6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFDb2x1bW4gb2YgdGhpcy5fZGF0YUNvbHVtbnMpIHtcclxuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IGRhdGFDb2x1bW4uZGF0YVNvdXJjZTtcclxuXHJcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUGF0aCA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLnRyZWF0RGF0YVNvdXJjZUFzU3RyaW5nKSB7XHJcbiAgICAgICAgICBkYXRhLnB1c2gocmF3SXRlbURhdGFbc291cmNlUGF0aF0pO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGEucHVzaChyZXNvbHZlUGF0aChyYXdJdGVtRGF0YSwgc291cmNlUGF0aCkpO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzb3VyY2VQYXRoLnR5cGUgPT0gJ2F1dG9jb3VudCcpIHtcclxuICAgICAgICBkYXRhLnB1c2goaW5kZXggKyAxKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc291cmNlUGF0aC50eXBlID09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBkYXRhLnB1c2goeyBfYXJkQ2hlY2tib3g6IHRydWUsIGluZGV4IH0pO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNvdXJjZVN0cmluZyA9IHR5cGVvZiBzb3VyY2VQYXRoID09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoc291cmNlUGF0aCkgOiBzb3VyY2VQYXRoO1xyXG4gICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgVW5leHBlY3RlZCBkYXRhIHNvdXJjZSBcIiR7c291cmNlU3RyaW5nfVwiLmApKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbZGF0YSwgdGhpcy5fZGF0YUNvbHVtbnNdO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBXcml0ZXMgYSBuZXcgdmFsdWUgdG8gdGhlIGl0ZW0gc3RvcmFnZS4gU2VsZWN0cyB0aGUgY29ycmVjdCBpdGVtcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsdWVzLCB3YXJuaW5nIHRoZSB1c2VyIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuXHJcbiAgICogQHBhcmFtIGluZGV4ZXMgVGhlIHZhbHVlIG9mIHRoZSBuZ01vZGVsIHRvIHNldC5cclxuICAgKi9cclxuICB3cml0ZVZhbHVlKGluZGV4ZXM6IG51bWJlcltdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mb3JjZVVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLnNlbGVjdEl0ZW0oLi4uaW5kZXhlcyk7XHJcbiAgfVxyXG5cclxuICAvLyEgc2VsZWN0aW5nIGl0ZW1zXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIGFuIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaW5kZXggaXMgc2VsZWN0ZWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGNoZWNrLlxyXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBfdHJ1ZV8gaWYgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSBfZmFsc2VfLlxyXG4gICAqL1xyXG4gIGlzSXRlbVNlbGVjdGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLmluZGV4ID09IGluZGV4KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2VsZWN0cyBhbGwgaXRlbXMuXHJcbiAgICpcclxuICAgKiBBY2NvdW50cyBmb3IgdGhlIGxpbWl0IG9mIGNvbmN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcyBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50LlxyXG4gICAqIEByZXR1cm5zIGEgdHVwbGUgY29udGFpbmluZyB0d28gYXJyYXlzOlxyXG4gICAqICogQW4gYXJyYXkgb2YgaXRlbXMgc2VsZWN0ZWQuXHJcbiAgICogKiBBbiBhcnJheSBvZiBpdGVtcyBmYWlsZWQgdG8gc2VsZWN0LlxyXG4gICAqL1xyXG4gIHNlbGVjdEFsbCgpOiBbYW55W10sIGFueVtdXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuX2l0ZW1zLm1hcCh2ID0+IHYuaW5kZXgpKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVW5zZWxlY3RzIGFsbCBzZWxlY3RlZCBpdGVtcy5cclxuICAgKlxyXG4gICAqIElmIHRoZSBwYXJlbnQgY29tcG9uZW50IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZSB0byBiZSBzZWxlY3RlZCBhdCBhbGwgdGltZXMsIHRoZSBmaXJzdCBzZWxlY3RlZCBpdGVtcyBpcyBsZWZ0IHNlbGVjdGVkLlxyXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIGNsZWFyZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cclxuICAgKi9cclxuICB1bnNlbGVjdEFsbCgpOiBhbnlbXSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmV0ID0gdGhpcy5faXRlbXNUb1ZhbHVlKHRoaXMuX3NlbGVjdGVkSXRlbXMpO1xyXG5cclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMgPSBbXTtcclxuXHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVbnNlbGVjdHMgYWxsIHNlbGVjdGVkIGl0ZW1zLCBubyBtYXR0ZXIgd2hhdCB0aGUgY29tcG9uZW50IHNldHRpbmdzIGFyZS5cclxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBpdGVtcyBjbGVhcmVkLCBtYXBwZWQgdG8gb25seSB0aGVpciB2YWx1ZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZm9yY2VVbnNlbGVjdEFsbCgpOiBhbnlbXSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmV0ID0gdGhpcy5faXRlbXNUb1ZhbHVlKHRoaXMuX3NlbGVjdGVkSXRlbXMpO1xyXG5cclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMgPSBbXTtcclxuXHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZWxlY3RzIG9uZSBvciBtdWx0aXBsZSBpdGVtcy5cclxuICAgKlxyXG4gICAqIEFjY291bnRzIGZvciB0aGUgbGltaXQgb2YgY29uY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zIGRlZmluZWQgYnkgdGhlIHBhcmVudCBjb21wb25lbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaW5kZXhlcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIHNlbGVjdGVkLlxyXG4gICAqIEByZXR1cm5zIGEgdHVwbGUgY29udGFpbmluZyB0d28gYXJyYXlzOlxyXG4gICAqICogQW4gYXJyYXkgb2YgaXRlbXMgc2VsZWN0ZWQuXHJcbiAgICogKiBBbiBhcnJheSBvZiBpdGVtcyBmYWlsZWQgdG8gc2VsZWN0LlxyXG4gICAqL1xyXG4gIHNlbGVjdEl0ZW0oLi4uaW5kZXhlczogbnVtYmVyW10pOiBbYW55W10sIGFueVtdXSB7XHJcbiAgICBjb25zdCBpdGVtc1RvQmVTZWxlY3RlZCA9IHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkICYmIGluZGV4ZXMuaW5jbHVkZXMoaXRlbS5pbmRleCkpO1xyXG4gICAgaWYgKHRoaXMuaXNJdGVtTGltaXRSZWFjaGVkKSB7XHJcbiAgICAgIHJldHVybiBbW10sIHRoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1RvQmVTZWxlY3RlZCldO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpdGVtc1NlbGVjdGVkQ291bnQgPSAwO1xyXG4gICAgY29uc3QgaXRlbXNTZWxlY3RlZCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zVG9CZVNlbGVjdGVkKSB7XHJcbiAgICAgIGl0ZW1zU2VsZWN0ZWRDb3VudCsrO1xyXG4gICAgICBpZiAoaXRlbS5zZWxlY3RlZCkgY29udGludWU7XHJcbiAgICAgIGlmICh0aGlzLmlzSXRlbUxpbWl0UmVhY2hlZCkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgIGl0ZW1zU2VsZWN0ZWQucHVzaChpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpdGVtc0ZhaWxlZFRvU2VsZWN0ID0gaXRlbXNUb0JlU2VsZWN0ZWQuc2xpY2UoaXRlbXNTZWxlY3RlZENvdW50IC0gMSk7XHJcbiAgICByZXR1cm4gW3RoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1NlbGVjdGVkKSwgdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zRmFpbGVkVG9TZWxlY3QpXTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVW5zZWxlY3RzIG9uZSBvciBtdWx0aXBsZSBpdGVtcy5cclxuICAgKiBAcGFyYW0gaXRlbXMgQSByZXN0IG9wZXJhdG9yIGFycmF5IG9mIGl0ZW0gaW5kZXhlcyB0byBiZSB1bnNlbGVjdGVkLlxyXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIHVuc2VsZWN0ZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cclxuICAgKi9cclxuICB1bnNlbGVjdEl0ZW0oLi4uaW5kZXhlczogbnVtYmVyW10pOiBhbnlbXSB7XHJcbiAgICBjb25zdCBpdGVtc1RvQmVTZWxlY3RlZCA9IHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+IGluZGV4ZXMuaW5jbHVkZXMoaXRlbS5pbmRleCkpO1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zVG9CZVNlbGVjdGVkKSB7XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMgPSB0aGlzLl9zZWxlY3RlZEl0ZW1zLmZpbHRlcih2ID0+IHYuc2VsZWN0ZWQpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9pdGVtc1RvVmFsdWUoaXRlbXNUb0JlU2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLy8hIGhpZ2hsaWdodGluZyBpdGVtc1xyXG4gIC8qKlxyXG4gICAqIFVuaGlnaGxpZ2h0cyBhbGwgY3VycmVudGx5IGhpZ2hsaWdodGVkIGl0ZW1zLlxyXG4gICAqL1xyXG4gIHVuaGlnaGxpZ2h0QWxsKCk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMpIHtcclxuICAgICAgaXRlbS5oaWdobGlnaHRlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faGlnaGxpZ2h0ZWRJdGVtcyA9IFtdO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIaWdobGlnaHRzIHRoZSBnaXZlbiBpdGVtLCB3aGlsZSB1bmhpZ2hsaWdodGluZyBhbGwgb3RoZXIgaXRlbXMuIERvZXMgbm90aGluZyB3aGVuIHRoZSBpdGVtIGlzIGRpc2FibGVkLlxyXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSBoaWdobGlnaHRlZC5cclxuICAgKiBAcmV0dXJucyBUaGUgaGlnaGxpZ2h0ZWQgaXRlbS5cclxuICAgKi9cclxuICBoaWdobGlnaHRTaW5nbGVJdGVtKGluZGV4OiBudW1iZXIpOiBBcmRUYWJsZVJvdyB8IG51bGwge1xyXG4gICAgdGhpcy51bmhpZ2hsaWdodEFsbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpbmRleCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgYWxsIGdpdmVuIGl0ZW1zLlxyXG4gICAqIEBwYXJhbSBpdGVtcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIGhpZ2hsaWdodGVkLlxyXG4gICAqIEByZXR1cm5zIFRoZSBsYXN0IGhpZ2hsaWdodGVkIGl0ZW0uXHJcbiAgICovXHJcbiAgaGlnaGxpZ2h0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IEFyZFRhYmxlUm93IHtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5faXRlbXMuZmlsdGVyKGl0ZW0gPT4gaW5kZXhlcy5pbmNsdWRlcyhpdGVtLmluZGV4KSk7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaXRlbS5oaWdobGlnaHRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zLnB1c2goLi4uaXRlbXMpO1xyXG4gICAgcmV0dXJuIGl0ZW1zLmxhc3QoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVW5oaWdobGlnaHRzIGFsbCBnaXZlbiBpdGVtcy5cclxuICAgKiBAcGFyYW0gaXRlbXMgQSByZXN0IG9wZXJhdG9yIGFycmF5IG9mIGl0ZW0gaW5kZXhlcyB0byBiZSB1bmhpZ2hsaWdodGVkLlxyXG4gICAqL1xyXG4gIHVuaGlnaGxpZ2h0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9pdGVtcy5maWx0ZXIoaXRlbSA9PiBpbmRleGVzLmluY2x1ZGVzKGl0ZW0uaW5kZXgpKTtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uaGlnaGxpZ2h0ZWQpIHJldHVybjtcclxuXHJcbiAgICAgIGl0ZW0uaGlnaGxpZ2h0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMgPSB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zLmZpbHRlcih2ID0+IHYuaGlnaGxpZ2h0ZWQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIaWdobGlnaHRzIHRoZSBmaXJzdCBpdGVtIG91dCBvZiBhbGwgaXRlbXMuXHJcbiAgICogQHJldHVybnMgVGhlIGhpZ2hsaWdodGVkIGl0ZW0uXHJcbiAgICovXHJcbiAgaGlnaGxpZ2h0Rmlyc3RJdGVtKCk6IEFyZFRhYmxlUm93IHwgbnVsbCB7XHJcbiAgICB0aGlzLnVuaGlnaGxpZ2h0QWxsKCk7XHJcblxyXG4gICAgbGV0IGl0ZW1Ub0hpZ2hsaWdodCA9IHRoaXMuX2dldEhpZ2xpZ2h0YWJsZUl0ZW1zKCkuZmlyc3QoKS5pbmRleDtcclxuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbVRvSGlnaGxpZ2h0KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSGlnaGxpZ2h0cyB0aGUgbGFzdCBpdGVtIG91dCBvZiBhbGwgaXRlbXMuXHJcbiAgICogQHJldHVybnMgVGhlIGhpZ2hsaWdodGVkIGl0ZW0uXHJcbiAgICovXHJcbiAgaGlnaGxpZ2h0TGFzdEl0ZW0oKTogQXJkVGFibGVSb3cgfCBudWxsIHtcclxuICAgIHRoaXMudW5oaWdobGlnaHRBbGwoKTtcclxuXHJcbiAgICBsZXQgaXRlbVRvSGlnaGxpZ2h0ID0gdGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKS5sYXN0KCkuaW5kZXg7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKGl0ZW1Ub0hpZ2hsaWdodCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgYWxsIG5vbi1kaXNhYmxlZCBpdGVtcy5cclxuICAgKi9cclxuICBoaWdobGlnaHRBbGxJdGVtcygpOiB2b2lkIHtcclxuICAgIGxldCBpdGVtc1RvSGlnaGxpZ2h0ID0gdGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKS5tYXAodiA9PiB2LmluZGV4KTtcclxuXHJcbiAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oLi4uaXRlbXNUb0hpZ2hsaWdodCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgdGhlIG5leHQgbm9uLWRpc2FibGVkIGl0ZW0gZGVmaW5lZCBieSB0aGUgb2Zmc2V0IGFtb3VudC5cclxuICAgKlxyXG4gICAqIElmIGBoYXNTaGlmdGAgaXMgc2V0IHRvIHRydWUsIGFsbCBvcmlnaW5hbGx5IGhpZ2hsaWdodGVkIGl0ZW1zIGFyZSBrZXB0LiBPdGhlcndpc2UsIGFsbCBvcmlnaW5hbCBpdGVtcyBhcmUgdW5zZWxlY3RlZC5cclxuICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgb2YgaXRlbXMgdG8gb2Zmc2V0IHRoZSBoaWdobGlnaHQgYnkuXHJcbiAgICogQHBhcmFtIGhhc1NoaWZ0IFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBzaGlmdCBrZXkgcHJlc3NlZC5cclxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSBoaWdobGlnaHRlZC5cclxuICAgKi9cclxuICBoaWdobGlnaHROZXh0SXRlbShvZmZzZXQ6IG51bWJlciwgaGFzU2hpZnQ/OiBib29sZWFuKTogQXJkVGFibGVSb3cgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5pc0FueUl0ZW1IaWdobGlnaHRlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRGaXJzdEl0ZW0oKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gdGhpcy5oaWdobGlnaHRlZEl0ZW1zLmxhc3QoKTtcclxuICAgIGNvbnN0IGl0ZW1zV2l0aG91dERpc2FibGVkID0gdGhpcy5faXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQgJiYgKCF0aGlzLmlzSXRlbUxpbWl0UmVhY2hlZCB8fCBpdGVtLnNlbGVjdGVkKSk7XHJcbiAgICBjb25zdCBjdXJyZW50SW5kZXhJbkl0ZW1zID0gaXRlbXNXaXRob3V0RGlzYWJsZWQuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pbmRleCA9PSBjdXJyZW50SXRlbS5pbmRleCk7XHJcblxyXG4gICAgbGV0IG5leHRJdGVtSW5kZXggPSBjdXJyZW50SW5kZXhJbkl0ZW1zICsgb2Zmc2V0O1xyXG4gICAgaWYgKG5leHRJdGVtSW5kZXggPj0gaXRlbXNXaXRob3V0RGlzYWJsZWQubGVuZ3RoKSB7XHJcbiAgICAgIG5leHRJdGVtSW5kZXggLT0gaXRlbXNXaXRob3V0RGlzYWJsZWQubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgaWYgKG5leHRJdGVtSW5kZXggPCAwKSB7XHJcbiAgICAgIG5leHRJdGVtSW5kZXggKz0gaXRlbXNXaXRob3V0RGlzYWJsZWQubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXRlbVRvSGlnaGxpZ2h0ID0gaXRlbXNXaXRob3V0RGlzYWJsZWRbbmV4dEl0ZW1JbmRleF07XHJcblxyXG4gICAgaWYgKGhhc1NoaWZ0KSB7XHJcbiAgICAgIGlmIChpdGVtVG9IaWdobGlnaHQuaGlnaGxpZ2h0ZWQpIHtcclxuICAgICAgICB0aGlzLnVuaGlnaGxpZ2h0SXRlbShuZXh0SXRlbUluZGV4KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKG5leHRJdGVtSW5kZXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0U2luZ2xlSXRlbShuZXh0SXRlbUluZGV4KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRmluZHMgYWxsIGhpZ2hsaWdodGFibGUgaXRlbXMuIEFuIGl0ZW0gaXMgY29uc2lkZXJlZCBoaWdobGlnaHRhYmxlIGlmIGl0IGlzICoqbm90KiogZGlzYWJsZWQuXHJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYWxsIGhpZ2hsaWdodGFibGUgaXRlbXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKTogQXJkVGFibGVSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgLy8hIHNvcnRpbmdcclxuICBwcml2YXRlIF9jdXJyZW50U29ydENvbHVtbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VycmVudFNvcnRUeXBlOiBTb3J0VHlwZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICB0b2dnbGVDdXJyZW50U29ydENvbHVtbihjb2x1bW46IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTb3J0Q29sdW1uID09IGNvbHVtbikge1xyXG4gICAgICBpZiAodGhpcy5fY3VycmVudFNvcnRUeXBlID09IFNvcnRUeXBlLkFzY2VuZGluZykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9IFNvcnRUeXBlLkRlc2NlbmRpbmc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFNvcnRUeXBlID0gU29ydFR5cGUuQXNjZW5kaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2dlbmVyYXRlU29ydGVkUm93cyh0cnVlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY3VycmVudFNvcnRDb2x1bW4gPSBjb2x1bW47XHJcbiAgICB0aGlzLl9jdXJyZW50U29ydFR5cGUgPSBTb3J0VHlwZS5Bc2NlbmRpbmc7XHJcbiAgICB0aGlzLl9nZW5lcmF0ZVNvcnRlZFJvd3MoKTtcclxuICB9XHJcbiAgcmVzZXRTb3J0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VycmVudFNvcnRDb2x1bW4gPSBudWxsO1xyXG4gICAgdGhpcy5fY3VycmVudFNvcnRUeXBlID0gbnVsbDtcclxuICAgIHRoaXMuX3NvcnRlZEl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdO1xyXG4gIH1cclxuICBnZXRDb2x1bW5Tb3J0VHlwZShjb2x1bW46IG51bWJlcik6IFNvcnRUeXBlIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5fY3VycmVudFNvcnRDb2x1bW4gPT0gY29sdW1uKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50U29ydFR5cGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZ2VuZXJhdGVTb3J0ZWRSb3dzKGp1c3RSZXZlcnNlPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGp1c3RSZXZlcnNlKSB7XHJcbiAgICAgIHRoaXMuX3NvcnRlZEl0ZW1zLnJldmVyc2UoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc29ydENvbHVtbkluZGV4ID0gdGhpcy5fY3VycmVudFNvcnRDb2x1bW47XHJcbiAgICBpZiAoaXNOdWxsKHNvcnRDb2x1bW5JbmRleCkgfHwgIXRoaXMuX2N1cnJlbnRTb3J0VHlwZSkge1xyXG4gICAgICB0aGlzLl9zb3J0ZWRJdGVtcyA9IHRoaXMuaXRlbXM7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNvcnRDb2x1bW4gPSB0aGlzLl9kYXRhQ29sdW1uc1tzb3J0Q29sdW1uSW5kZXhdO1xyXG4gICAgaWYgKCFzb3J0Q29sdW1uKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgRW5jb3VudGVyZWQgYW4gaXNzdWUgaW4gPGFyZC10YWJsZT46IGNvdWxkIG5vdCBmaW5kIHRoZSBjb2x1bW4gd2l0aCBpbmRleCAke3NvcnRDb2x1bW5JbmRleH0uIFRoaXMgaXMgbW9zdCBsaWtlbHkgYW4gQXJkaXVtIGJ1ZywgcGxlYXNlIHJlcG9ydCBpdCBvbiBHaXRIdWIuYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9PSBTb3J0VHlwZS5Bc2NlbmRpbmcgPyAxIDogLTE7XHJcbiAgICBjb25zdCBzb3J0Rm4gPVxyXG4gICAgICBzb3J0Q29sdW1uLnNvcnRGbiA/P1xyXG4gICAgICAoKGEsIGIpID0+IHtcclxuICAgICAgICBpZiAoYSA+IGIpIHJldHVybiBkaXJlY3Rpb247XHJcbiAgICAgICAgaWYgKGEgPCBiKSByZXR1cm4gLTEgKiBkaXJlY3Rpb247XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3NvcnRlZEl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdLnNvcnQoKGEsIGIpID0+IHNvcnRGbihhLmRhdGFbc29ydENvbHVtbkluZGV4XSwgYi5kYXRhW3NvcnRDb2x1bW5JbmRleF0pKTtcclxuICB9XHJcbn1cclxuIl19
564
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaXRlbS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS1pdGVtLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFELE9BQU8sRUFBRSxRQUFRLEVBQW1CLHVCQUF1QixFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTdFLE1BQU0sT0FBTyxXQUFXO0lBd0J0QixZQUNFLFFBQWEsRUFDYixLQUFhLEVBQ2IsSUFBVyxFQUNYLFdBQThCLEVBQzlCLFFBQWlCLEVBQ2pCLElBQWEsRUFDYixPQUFPLEdBQUcsS0FBSztRQTlCQSxjQUFTLEdBQUcsTUFBTSxDQUFNLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9CLFdBQU0sR0FBRyxNQUFNLENBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxVQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV6QixhQUFRLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzFDLFlBQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTdCLFVBQUssR0FBRyxNQUFNLENBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEMsU0FBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxF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QUM7b0JBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEgsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2lnbmFsLCBjb21wdXRlZCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgcmVzb2x2ZVBhdGggZnJvbSAncmVzb2x2ZS1vYmplY3QtcGF0aCc7XG5pbXBvcnQgeyBldmFsdWF0ZSwgaXNEZWZpbmVkLCBpc051bGwgfSBmcm9tICdzaW1wbGUtYm9vbCc7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL3V0aWxpdHkudHlwZXMnO1xuaW1wb3J0IHsgU29ydFR5cGUsIFRhYmxlRGF0YUNvbHVtbiwgVGFibGVQYWdpbmF0aW9uU3RyYXRlZ3ksIFRhYmxlU3ViaGVhZGVyIH0gZnJvbSAnLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBhcmVBbGxEYXRhQ29sdW1ucywgaXNUYWJsZVN1YmhlYWRlciwgbWVyZ2UyZEFycmF5cyB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQXJkVGFibGVSb3cge1xuICBwcml2YXRlIHJlYWRvbmx5IF9pdGVtRGF0YSA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGl0ZW1EYXRhID0gdGhpcy5faXRlbURhdGEuYXNSZWFkb25seSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2luZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuICByZWFkb25seSBpbmRleCA9IHRoaXMuX2luZGV4LmFzUmVhZG9ubHkoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9pc0VtcHR5ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaXNFbXB0eSA9IHRoaXMuX2lzRW1wdHkuYXNSZWFkb25seSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGEgPSBzaWduYWw8YW55W10+KFtdKTtcbiAgcmVhZG9ubHkgZGF0YSA9IHRoaXMuX2RhdGEuYXNSZWFkb25seSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGFDb2x1bW5zID0gc2lnbmFsPFRhYmxlRGF0YUNvbHVtbltdPihbXSk7XG4gIHJlYWRvbmx5IGRhdGFDb2x1bW5zID0gdGhpcy5fZGF0YUNvbHVtbnMuYXNSZWFkb25seSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYXNzID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICByZWFkb25seSBjbGFzcyA9IHRoaXMuX2NsYXNzLmFzUmVhZG9ubHkoKTtcblxuICByZWFkb25seSBkaXNhYmxlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGJvbGQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzZWxlY3RlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGhpZ2hsaWdodGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpdGVtRGF0YTogYW55LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZGF0YTogYW55W10sXG4gICAgZGF0YUNvbHVtbnM6IFRhYmxlRGF0YUNvbHVtbltdLFxuICAgIGRpc2FibGVkOiBib29sZWFuLFxuICAgIGJvbGQ6IGJvb2xlYW4sXG4gICAgaXNFbXB0eSA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuX2l0ZW1EYXRhLnNldChpdGVtRGF0YSk7XG4gICAgdGhpcy5faW5kZXguc2V0KGluZGV4KTtcbiAgICB0aGlzLl9kYXRhLnNldChkYXRhKTtcbiAgICB0aGlzLl9kYXRhQ29sdW1ucy5zZXQoZGF0YUNvbHVtbnMpO1xuICAgIHRoaXMuZGlzYWJsZWQuc2V0KGRpc2FibGVkKTtcbiAgICB0aGlzLmJvbGQuc2V0KGJvbGQpO1xuICAgIHRoaXMuX2lzRW1wdHkuc2V0KGlzRW1wdHkpO1xuICB9XG4gIHN0YXRpYyBuZXdFbXB0eUNlbGwoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgQXJkVGFibGVSb3cobnVsbCwgaW5kZXgsIFtdLCBbXSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUl0ZW1TdG9yYWdlSG9zdERlZmF1bHRzIHtcbiAgcmVhZG9ubHkgcm93RGlzYWJsZWRGcm9tOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvd0JvbGRGcm9tOiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlSXRlbVN0b3JhZ2VIb3N0IHtcbiAgcmVhZG9ubHkgcm93RGlzYWJsZWRGcm9tOiBTaWduYWw8TnVsbGFibGU8c3RyaW5nPj47XG4gIHJlYWRvbmx5IHJvd0JvbGRGcm9tOiBTaWduYWw8TnVsbGFibGU8c3RyaW5nPj47XG4gIHJlYWRvbmx5IGludmVydFJvd0Rpc2FibGVkOiBTaWduYWw8TnVsbGFibGU8Ym9vbGVhbj4+O1xuICByZWFkb25seSBpbnZlcnRSb3dCb2xkOiBTaWduYWw8TnVsbGFibGU8Ym9vbGVhbj4+O1xuICByZWFkb25seSBkYXRhOiBTaWduYWw8TnVsbGFibGU8YW55Pj5bXTtcbiAgcmVhZG9ubHkgREVGQVVMVFM6IFRhYmxlSXRlbVN0b3JhZ2VIb3N0RGVmYXVsdHM7XG4gIHJlYWRvbmx5IG1heFNlbGVjdGVkSXRlbXM6IFNpZ25hbDxOdWxsYWJsZTxudW1iZXI+PjtcbiAgcmVhZG9ubHkgdHJlYXREYXRhU291cmNlQXNTdHJpbmc6IFNpZ25hbDxOdWxsYWJsZTxib29sZWFuPj47XG5cbiAgcmVhZG9ubHkgcGFnaW5hdGVkOiBTaWduYWw8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IHBhZ2luYXRpb25TdHJhdGVneTogU2lnbmFsPFRhYmxlUGFnaW5hdGlvblN0cmF0ZWd5PjtcbiAgcmVhZG9ubHkgaXRlbXNQZXJQYWdlOiBTaWduYWw8bnVtYmVyPjtcbiAgcmVhZG9ubHkgcGFnZTogU2lnbmFsPG51bWJlcj47XG59XG5leHBvcnQgY2xhc3MgSGVhZGVyQ2VsbCB7XG4gIHJlYWRvbmx5IGNlbGwgPSBzaWduYWw8VGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXI+KHVuZGVmaW5lZCBhcyBhbnkpO1xuICByZWFkb25seSBjb2xzcGFuID0gc2lnbmFsPG51bWJlcj4oMSk7XG4gIHJlYWRvbmx5IHJvd3NwYW4gPSBzaWduYWw8bnVtYmVyPigxKTtcblxuICBjb25zdHJ1Y3RvcihjZWxsOiBUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlciwgY29sc3BhbiA9IDEsIHJvd3NwYW4gPSAxKSB7XG4gICAgdGhpcy5jZWxsLnNldChjZWxsKTtcbiAgICB0aGlzLmNvbHNwYW4uc2V0KGNvbHNwYW4pO1xuICAgIHRoaXMucm93c3Bhbi5zZXQocm93c3Bhbik7XG4gIH1cblxuICBnZXQgd2lkdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY2VsbCA9IHRoaXMuY2VsbCgpO1xuICAgIGlmIChpc1RhYmxlU3ViaGVhZGVyKGNlbGwpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5fZ2V0V2lkdGgoY2VsbC53aWR0aCk7XG4gIH1cbiAgZ2V0IG1pbldpZHRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGNlbGwgPSB0aGlzLmNlbGwoKTtcbiAgICBpZiAoaXNUYWJsZVN1YmhlYWRlcihjZWxsKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuX2dldFdpZHRoKGNlbGwubWluV2lkdGgpO1xuICB9XG4gIC8qKlxuICAgKiBUaHJhbnNmb3JtcyBhIG51bWVyaWMgd2lkdGggaW50byBhIENTUyBzdHJpbmcgaWYgbmVlZGVkLiBQdXJlIGZ1bmN0aW9uLlxuICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIHRvIGJlIGNvbnZlcnRlZC5cbiAgICogQHJldHVybnMgVGhlIHdpZHRoIGV4cHJlc3NlZCBhcyBhIENTUy1jb21wYXRpYmxlIHN0cmluZyBvciBudWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0V2lkdGgod2lkdGg6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghd2lkdGgpIHJldHVybiBudWxsO1xuICAgIGlmICh0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInKSByZXR1cm4gYCR7d2lkdGh9cHhgO1xuICAgIHJldHVybiB3aWR0aDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVJdGVtU3RvcmFnZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2l0ZW1zID0gc2lnbmFsPEFyZFRhYmxlUm93W10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc29ydGVkSXRlbXMgPSBzaWduYWw8QXJkVGFibGVSb3dbXT4oW10pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGFDb2x1bW5zID0gc2lnbmFsPFRhYmxlRGF0YUNvbHVtbltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hlYWRlckNlbGxzID0gc2lnbmFsPEhlYWRlckNlbGxbXVtdPihbXSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfYXJkUGFyZW50Q29tcDogVGFibGVJdGVtU3RvcmFnZUhvc3QpIHt9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGl0ZW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgaXRlbXMgPSB0aGlzLl9pdGVtcy5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IHNvcnRlZEl0ZW1zID0gdGhpcy5fc29ydGVkSXRlbXMuYXNSZWFkb25seSgpO1xuICAvKipcbiAgICogR2V0cyBpdGVtcyBiYXNlZCBvbiB0aGUgY3VycmVudCBwYWdpbmF0aW9uIHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFnaW5hdGVkSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCF0aGlzLl9hcmRQYXJlbnRDb21wLnBhZ2luYXRlZCgpIHx8IHRoaXMuX2FyZFBhcmVudENvbXAucGFnaW5hdGlvblN0cmF0ZWd5KCkgPT09IFRhYmxlUGFnaW5hdGlvblN0cmF0ZWd5Lk5vb3ApIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRlZEl0ZW1zKCk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLl9hcmRQYXJlbnRDb21wLnBhZ2UoKTtcbiAgICBjb25zdCBJUFAgPSB0aGlzLl9hcmRQYXJlbnRDb21wLml0ZW1zUGVyUGFnZSgpO1xuICAgIGNvbnN0IGl0ZW1zU3RhcnQgPSAocGFnZSAtIDEpICogSVBQO1xuICAgIGNvbnN0IGl0ZW1zRW5kID0gcGFnZSAqIElQUDtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRJdGVtcygpLnNsaWNlKGl0ZW1zU3RhcnQsIGl0ZW1zRW5kKTtcbiAgfSk7XG4gIC8qKlxuICAgKiBHZXRzIGFsbCBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMuXG4gICAqL1xuICByZWFkb25seSBzZWxlY3RlZEl0ZW1zID0gY29tcHV0ZWQ8QXJkVGFibGVSb3dbXT4oKCkgPT4gdGhpcy5pdGVtcygpLmZpbHRlcihpdGVtID0+IGl0ZW0uc2VsZWN0ZWQoKSkpO1xuICAvKipcbiAgICogR2V0cyBhbGwgY3VycmVudGx5IGhpZ2hsaWdodGVkIGl0ZW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgaGlnaGxpZ2h0ZWRJdGVtcyA9IGNvbXB1dGVkPEFyZFRhYmxlUm93W10+KCgpID0+IHRoaXMuaXRlbXMoKS5maWx0ZXIoaXRlbSA9PiBpdGVtLmhpZ2hsaWdodGVkKCkpKTtcbiAgLyoqXG4gICAqIEdldHMgYWxsIGhpZ2hsaWdodGFibGUgaXRlbXMuIEFuIGl0ZW0gaXMgY29uc2lkZXJlZCBoaWdobGlnaHRhYmxlIGlmIGl0IGlzICoqbm90KiogZGlzYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBoaWdobGlnaHRhYmxlSXRlbXMgPSBjb21wdXRlZDxBcmRUYWJsZVJvd1tdPigoKSA9PiB0aGlzLl9pdGVtcygpLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkKCkpKTtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlcyBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9pdGVtc1RvVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zKCkpKTtcbiAgLyoqXG4gICAqIE1hcHMgYW4gYXJyYXkgb2YgaXRlbXMgaW50byB0aGVpciB2YWx1ZXMuXG4gICAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgdG8gY29udmVydCB0byB2YWx1ZS5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaXRlbSB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIF9pdGVtc1RvVmFsdWUoaXRlbXM6IEFyZFRhYmxlUm93W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+IGl0ZW0uaXRlbURhdGEoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBpdGVtIGlzIGhpZ2hsaWdodGVkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICByZWFkb25seSBpc0FueUl0ZW1IaWdobGlnaHRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlnaGxpZ2h0ZWRJdGVtcygpLmxlbmd0aCA+IDApO1xuICAvKipcbiAgICogQ2hlY2tzIGlmIGFueSBpdGVtIGluIHRoZSB0YWJsZSBpcyBzZWxlY3RlZC5cbiAgICogQHJldHVybnMgQSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgYW55IGl0ZW0gaXMgc2VsZWN0ZWQuXG4gICAqL1xuICByZWFkb25seSBpc0FueUl0ZW1TZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRJdGVtcygpLmxlbmd0aCA+IDApO1xuICAvKipcbiAgICogQ2hlY2tzIGlmIGFsbCBpdGVtcyBpbiB0aGUgdGFibGUgYXJlIHNlbGVjdGVkLlxuICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiBhbGwgaXRlbXMgYXJlIHNlbGVjdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJlQWxsU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlbGVjdGVkSXRlbXMoKS5sZW5ndGggPT09IHRoaXMuX2l0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQoKSkubGVuZ3RoKTtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyZW50IGNvbXBvbmVudCBkZWZpbmVzIHRoZSBsaW1pdCBvZiBjb25jdXJyZW50bHkgc2VsZWN0YWJsZSBpdGVtcyBhbmQgdGhlIGFtb3VudCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMgbWF0Y2hlcyB0aGF0IGxpbWl0LiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAgICpcbiAgICogKipUTERSKio6IHRydWUgaWYgYG1heFNlbGVjdGVkSXRlbXNgIGlzIGRlZmluZWQgYW5kIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMgbWF0Y2hlcyB0aGF0IHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNJdGVtTGltaXRSZWFjaGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1heCA9IHRoaXMuX2FyZFBhcmVudENvbXAubWF4U2VsZWN0ZWRJdGVtcygpO1xuICAgIGlmICghaXNEZWZpbmVkKG1heCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1heCA8PSB0aGlzLnNlbGVjdGVkSXRlbXMoKS5sZW5ndGg7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBoZWFkZXIgY2VsbHMgb2YgdGhlIHRhYmxlLlxuICAgKiBAcmV0dXJucyBhIDJEIGFycmF5IG9mIGhlYWRlciBjZWxscy5cbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlckNlbGxzID0gdGhpcy5faGVhZGVyQ2VsbHMuYXNSZWFkb25seSgpO1xuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB0YWJsZSBoYXMgZGVmaW5lZCBjb2x1bW5zLlxuICAgKiBAcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgdGFibGUgaGFzIGRlZmluZWQgY29sdW1ucy5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0RlZmluZWRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZGF0YUNvbHVtbnMoKS5sZW5ndGggPiAwKTtcblxuICAvLyEgc2V0dGluZyBjb2x1bW5zXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb2x1bW5zIG9mIHRoZSB0YWJsZS5cbiAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zIG9yIHRhYmxlIHN1YmhlYWRlcnMuXG4gICAqL1xuICBzZXRDb2x1bW5zKGNvbHM6IChUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlcilbXSk6IHZvaWQge1xuICAgIGNvbnN0IG1heE5lc3RpbmdMZXZlbCA9IHRoaXMuX2dldEhlYWRlck1heE5lc3RpbmcoY29scyk7XG4gICAgY29uc3QgaGVhZGVyQ2VsbHMgPSB0aGlzLl9tYXBDb2x1bW5zVG9BcnJheShjb2xzLCBtYXhOZXN0aW5nTGV2ZWwsIDApO1xuICAgIHRoaXMuX2hlYWRlckNlbGxzLnNldCh0aGlzLl9maWx0ZXJIZWFkZXJDZWxscyhoZWFkZXJDZWxscykpO1xuICAgIHRoaXMuX2RhdGFDb2x1bW5zLnNldCh0aGlzLl9leHRyYWN0RGF0YVNvdXJjZXMoY29scykpO1xuICB9XG4gIC8qKlxuICAgKiBGaWx0ZXJzIG91dCBudWxsIHZhbHVlcyBmcm9tIHRoZSBoZWFkZXIgY2VsbHMgYXJyYXkuIFB1cmUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBjZWxscyBhIDJEIGFycmF5IG9mIGhlYWRlciBjZWxscyBvciBudWxsIHZhbHVlcy5cbiAgICogQHJldHVybnMgYSAyRCBhcnJheSBvZiBoZWFkZXIgY2VsbHMgd2l0aG91dCBudWxsIHZhbHVlcyBhbmQgZW1wdHkgYXJyYXlzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmlsdGVySGVhZGVyQ2VsbHMoY2VsbHM6IChIZWFkZXJDZWxsIHwgbnVsbClbXVtdKTogSGVhZGVyQ2VsbFtdW10ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNlbGxzW2ldID0gY2VsbHNbaV0uZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBjZWxscy5maWx0ZXIocm93ID0+IHJvdy5sZW5ndGgpIGFzIEhlYWRlckNlbGxbXVtdO1xuICB9XG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgZGF0YSBzb3VyY2VzIGZyb20gdGhlIGNvbHVtbnMgYXJyYXkuIFB1cmUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBjb2xzIGFuIGFycmF5IG9mIHRhYmxlIGRhdGEgY29sdW1ucyBvciB0YWJsZSBzdWJoZWFkZXJzLlxuICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiB0YWJsZSBkYXRhIGNvbHVtbnMuXG4gICAqL1xuICBwcml2YXRlIF9leHRyYWN0RGF0YVNvdXJjZXMoY29sczogKFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyKVtdKTogVGFibGVEYXRhQ29sdW1uW10ge1xuICAgIGNvbnN0IGRhdGFDb2x1bW5zOiBUYWJsZURhdGFDb2x1bW5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xuICAgICAgaWYgKCFpc1RhYmxlU3ViaGVhZGVyKGNvbCkpIHtcbiAgICAgICAgZGF0YUNvbHVtbnMucHVzaChjb2wpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRhdGFDb2x1bW5zLnB1c2goLi4udGhpcy5fZXh0cmFjdERhdGFTb3VyY2VzKGNvbC5jaGlsZHJlbikpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhQ29sdW1ucztcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgbWF4aW11bSBuZXN0aW5nIGxldmVsIG9mIHRoZSBjb2x1bW5zIGFycmF5LiBQdXJlIGZ1bmN0aW9uLlxuICAgKiBAcGFyYW0gY29scyBhbiBhcnJheSBvZiB0YWJsZSBkYXRhIGNvbHVtbnMgb3IgdGFibGUgc3ViaGVhZGVycy5cbiAgICogQHJldHVybnMgdGhlIG1heGltdW0gbmVzdGluZyBsZXZlbCBhcyBhIG51bWJlci5cbiAgICovXG4gIHByaXZhdGUgX2dldEhlYWRlck1heE5lc3RpbmcoY29sczogKFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyKVtdKTogbnVtYmVyIHtcbiAgICBpZiAoYXJlQWxsRGF0YUNvbHVtbnMoY29scykpIHJldHVybiAxO1xuICAgIGxldCBtYXggPSAxO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHMuZmlsdGVyKHYgPT4gaXNUYWJsZVN1YmhlYWRlcih2KSkgYXMgVGFibGVTdWJoZWFkZXJbXSkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gMSArIHRoaXMuX2dldEhlYWRlck1heE5lc3RpbmcoY29sLmNoaWxkcmVuKTtcbiAgICAgIGlmIChoZWlnaHQgPiBtYXgpIG1heCA9IGhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIG1heDtcbiAgfVxuICAvKipcbiAgICogTWFwcyB0aGUgY29sdW1ucyB0cmVlIHRvIGEgMkQgYXJyYXkgb2YgaGVhZGVyIGNlbGxzIG9yIG51bGwgdmFsdWVzLiBQdXJlIGZ1bmN0aW9uLlxuICAgKiBAcGFyYW0gY29scyBhbiBhcnJheSBvZiB0YWJsZSBkYXRhIGNvbHVtbnMgb3IgdGFibGUgc3ViaGVhZGVycy5cbiAgICogQHBhcmFtIG1heE5lc3RpbmcgdGhlIG1heGltdW0gbmVzdGluZyBsZXZlbCBvZiB0aGUgY29sdW1ucyBhcnJheS5cbiAgICogQHBhcmFtIGN1cnJlbnROZXN0aW5nIHRoZSBjdXJyZW50IG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGNvbHVtbnMgYXJyYXkuXG4gICAqIEByZXR1cm5zIGEgMkQgYXJyYXkgb2YgaGVhZGVyIGNlbGxzIG9yIG51bGwgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfbWFwQ29sdW1uc1RvQXJyYXkoXG4gICAgY29sczogKFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyKVtdLFxuICAgIG1heE5lc3Rpbmc6IG51bWJlcixcbiAgICBjdXJyZW50TmVzdGluZzogbnVtYmVyXG4gICk6IChIZWFkZXJDZWxsIHwgbnVsbClbXVtdIHtcbiAgICBpZiAoYXJlQWxsRGF0YUNvbHVtbnMoY29scykpIHtcbiAgICAgIHJldHVybiBbY29scy5tYXAoY29sID0+IG5ldyBIZWFkZXJDZWxsKGNvbCwgMSwgbWF4TmVzdGluZyAtIGN1cnJlbnROZXN0aW5nKSldO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXJDZWxsczogKEhlYWRlckNlbGwgfCBudWxsKVtdW10gPSBbW11dO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHMpIHtcbiAgICAgIGlmICghaXNUYWJsZVN1YmhlYWRlcihjb2wpKSB7XG4gICAgICAgIGhlYWRlckNlbGxzWzBdLnB1c2gobmV3IEhlYWRlckNlbGwoY29sLCAxLCBtYXhOZXN0aW5nIC0gY3VycmVudE5lc3RpbmcpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZENlbGxzOiAoSGVhZGVyQ2VsbCB8IG51bGwpW11bXSA9IFtbXSwgLi4udGhpcy5fbWFwQ29sdW1uc1RvQXJyYXkoY29sLmNoaWxkcmVuLCBtYXhOZXN0aW5nLCBjdXJyZW50TmVzdGluZyArIDEpXTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNoaWxkQ2VsbHMubGVuZ3RoIC0gMTtcbiAgICAgIGNvbnN0IHdpZHRoID0gY2hpbGRDZWxsc1sxXS5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICAgIGhlYWRlckNlbGxzLnB1c2goW251bGxdKTtcbiAgICAgIH1cbiAgICAgIGhlYWRlckNlbGxzWzBdLnB1c2gobmV3IEhlYWRlckNlbGwoY29sLCB3aWR0aCwgMSkpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aCAtIDE7IGkrKykge1xuICAgICAgICBoZWFkZXJDZWxsc1swXS5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgICAgbWVyZ2UyZEFycmF5cyhoZWFkZXJDZWxscywgY2hpbGRDZWxscyk7XG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJDZWxscztcbiAgfVxuXG4gIC8vISBzZXR0aW5nIGl0ZW1zXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb21wb25lbnQncyBpdGVtcy4gVGFrZXMgaW50byBhY2NvdW50IHRoZSB2YWx1ZXMgZGVmaW5lZCBieSB0aGUgcGFyZW50IGNvbXBvbmVudCBmb3IgYHJvd0Rpc2FibGVkRnJvbWAsIGByb3dCb2xkRnJvbWAsIGFuZCBgcm93SGlnaGxpZ2h0ZWRGcm9tYC5cbiAgICogQHBhcmFtIGl0ZW1zIEFuIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHNldCBhcyB0aGUgY29tcG9uZW50J3MgaXRlbXMuXG4gICAqL1xuICBzZXRJdGVtcyhpdGVtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzRGVmaW5lZENvbHVtbnMoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWFwcGVkSXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0sIGkpID0+IHRoaXMuX3NldEl0ZW1zTWFwRm4oaXRlbSwgaSkpO1xuICAgIHRoaXMuX2l0ZW1zLnNldChtYXBwZWRJdGVtcyk7XG4gICAgdGhpcy5fc29ydGVkSXRlbXMuc2V0KG1hcHBlZEl0ZW1zKTtcbiAgfVxuICAvKipcbiAgICogTWFwcyByYXcgaXRlbSBkYXRhIHRvIGFuIHtAbGluayBBcmRUYWJsZVJvd30gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gcmF3SXRlbURhdGEgLSBUaGUgcmF3IGRhdGEgb2YgdGhlIGl0ZW0uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbS5cbiAgICogQHJldHVybnMge0FyZFRhYmxlUm93fSBSZXR1cm5zIGFuIEFyZFRhYmxlUm93IG9iamVjdCB3aXRoIG1hcHBlZCBwcm9wZXJ0aWVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0SXRlbXNNYXBGbihyYXdJdGVtRGF0YTogYW55LCBpbmRleDogbnVtYmVyKTogQXJkVGFibGVSb3cge1xuICAgIC8vZ2V0IGRhdGFcbiAgICBjb25zdCBbZGF0YSwgZGF0YUNvbHVtbnNdID0gdGhpcy5fZ2V0Um93RGF0YShyYXdJdGVtRGF0YSwgaW5kZXgpO1xuXG4gICAgLy9nZXQgYm9sZFxuICAgIGNvbnN0IHJvd0JvbGRGcm9tUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAucm93Qm9sZEZyb20oKSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLkRFRkFVTFRTLnJvd0JvbGRGcm9tO1xuICAgIGxldCBib2xkID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIHJvd0JvbGRGcm9tUGF0aCk7XG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaW52ZXJ0Um93Qm9sZCgpKSB7XG4gICAgICBib2xkID0gIWJvbGQ7XG4gICAgfVxuXG4gICAgLy9nZXQgZGlzYWJsZWRcbiAgICBjb25zdCBkaXNhYmxlZFBhdGggPSB0aGlzLl9hcmRQYXJlbnRDb21wLnJvd0Rpc2FibGVkRnJvbSgpID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMucm93RGlzYWJsZWRGcm9tO1xuICAgIGxldCBkaXNhYmxlZCA9IGV2YWx1YXRlKHJlc29sdmVQYXRoKHJhd0l0ZW1EYXRhLCBkaXNhYmxlZFBhdGgpKTtcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5pbnZlcnRSb3dEaXNhYmxlZCgpKSB7XG4gICAgICBkaXNhYmxlZCA9ICFkaXNhYmxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFyZFRhYmxlUm93KHJhd0l0ZW1EYXRhLCBpbmRleCwgZGF0YSwgZGF0YUNvbHVtbnMsIGRpc2FibGVkLCBib2xkKTtcbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIGRhdGEgZm9yIGEgcm93IGJhc2VkIG9uIGRhdGEgY29sdW1ucyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gcmF3SXRlbURhdGEgLSBUaGUgcmF3IGRhdGEgb2YgdGhlIGl0ZW0uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbS5cbiAgICogQHJldHVybnMge2FueVtdfSBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJvdyBkYXRhLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Um93RGF0YShyYXdJdGVtRGF0YTogYW55LCBpbmRleDogbnVtYmVyKTogW2FueVtdLCBUYWJsZURhdGFDb2x1bW5bXV0ge1xuICAgIGNvbnN0IGRhdGE6IGFueVtdID0gW107XG4gICAgY29uc3QgX2NvbHMgPSB0aGlzLl9kYXRhQ29sdW1ucygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgX2NvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGFDb2x1bW4gPSBfY29sc1tpXTtcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBkYXRhQ29sdW1uLmRhdGFTb3VyY2U7XG5cbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAudHJlYXREYXRhU291cmNlQXNTdHJpbmcoKSkge1xuICAgICAgICAgIGRhdGEucHVzaChyYXdJdGVtRGF0YVtzb3VyY2VQYXRoXSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5wdXNoKHJlc29sdmVQYXRoKHJhd0l0ZW1EYXRhLCBzb3VyY2VQYXRoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVBhdGgudHlwZSA9PT0gJ2F1dG9jb3VudCcpIHtcbiAgICAgICAgZGF0YS5wdXNoKGluZGV4ICsgMSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVBhdGgudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICBkYXRhLnB1c2goeyBfYXJkQ2hlY2tib3g6IHRydWUsIGluZGV4IH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNvdXJjZVN0cmluZyA9IHR5cGVvZiBzb3VyY2VQYXRoID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHNvdXJjZVBhdGgpIDogc291cmNlUGF0aDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQVJELUZUNTA1MjogVW5leHBlY3RlZCBkYXRhIHNvdXJjZSBcIiR7c291cmNlU3RyaW5nfVwiIGF0IGluZGV4ICR7aX0uYCk7XG4gICAgfVxuICAgIHJldHVybiBbZGF0YSwgdGhpcy5fZGF0YUNvbHVtbnMoKV07XG4gIH1cbiAgLyoqXG4gICAqIFdyaXRlcyBhIG5ldyB2YWx1ZSB0byB0aGUgaXRlbSBzdG9yYWdlLiBTZWxlY3RzIHRoZSBjb3JyZWN0IGl0ZW1zIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHdhcm5pbmcgdGhlIHVzZXIgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC5cbiAgICogQHBhcmFtIGluZGV4ZXMgVGhlIHZhbHVlIG9mIHRoZSBuZ01vZGVsIHRvIHNldC5cbiAgICovXG4gIHdyaXRlVmFsdWUoaW5kZXhlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLl9mb3JjZVVuc2VsZWN0QWxsKCk7XG4gICAgdGhpcy5zZWxlY3RJdGVtKC4uLmluZGV4ZXMpO1xuICB9XG5cbiAgLy8hIHNlbGVjdGluZyBpdGVtc1xuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaW5kZXggaXMgc2VsZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBfdHJ1ZV8gaWYgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSBfZmFsc2VfLlxuICAgKi9cbiAgaXNJdGVtU2VsZWN0ZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMoKS5zb21lKGl0ZW0gPT4gaXRlbS5pbmRleCgpID09PSBpbmRleCk7XG4gIH1cbiAgLyoqXG4gICAqIFNlbGVjdHMgYWxsIGl0ZW1zLlxuICAgKlxuICAgKiBBY2NvdW50cyBmb3IgdGhlIGxpbWl0IG9mIGNvbmN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcyBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgdHdvIGFycmF5czpcbiAgICogKiBBbiBhcnJheSBvZiBpdGVtcyBzZWxlY3RlZC5cbiAgICogKiBBbiBhcnJheSBvZiBpdGVtcyBmYWlsZWQgdG8gc2VsZWN0LlxuICAgKi9cbiAgc2VsZWN0QWxsKCk6IFthbnlbXSwgYW55W11dIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuX2l0ZW1zKCkubWFwKHYgPT4gdi5pbmRleCgpKSk7XG4gIH1cbiAgLyoqXG4gICAqIFVuc2VsZWN0cyBhbGwgc2VsZWN0ZWQgaXRlbXMuXG4gICAqXG4gICAqIElmIHRoZSBwYXJlbnQgY29tcG9uZW50IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZSB0byBiZSBzZWxlY3RlZCBhdCBhbGwgdGltZXMsIHRoZSBmaXJzdCBzZWxlY3RlZCBpdGVtcyBpcyBsZWZ0IHNlbGVjdGVkLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBpdGVtcyBjbGVhcmVkLCBtYXBwZWQgdG8gb25seSB0aGVpciB2YWx1ZXMuXG4gICAqL1xuICB1bnNlbGVjdEFsbCgpOiBhbnlbXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbXMoKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc2VsZWN0ZWQpIHtcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5faXRlbXNUb1ZhbHVlKHNlbGVjdGVkKTtcbiAgfVxuICAvKipcbiAgICogVW5zZWxlY3RzIGFsbCBzZWxlY3RlZCBpdGVtcywgbm8gbWF0dGVyIHdoYXQgdGhlIGNvbXBvbmVudCBzZXR0aW5ncyBhcmUuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIGNsZWFyZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX2ZvcmNlVW5zZWxlY3RBbGwoKTogYW55W10ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHNlbGVjdGVkKSB7XG4gICAgICBpdGVtLnNlbGVjdGVkLnNldChmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zVG9WYWx1ZShzZWxlY3RlZCk7XG4gIH1cbiAgLyoqXG4gICAqIFNlbGVjdHMgb25lIG9yIG11bHRpcGxlIGl0ZW1zLlxuICAgKlxuICAgKiBBY2NvdW50cyBmb3IgdGhlIGxpbWl0IG9mIGNvbmN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcyBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXhlcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIHNlbGVjdGVkLlxuICAgKiBAcmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgdHdvIGFycmF5czpcbiAgICogLSBBbiBhcnJheSBvZiBpdGVtcyBzZWxlY3RlZC5cbiAgICogLSBBbiBhcnJheSBvZiBpdGVtcyBmYWlsZWQgdG8gc2VsZWN0LlxuICAgKi9cbiAgc2VsZWN0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IFthbnlbXSwgYW55W11dIHtcbiAgICBjb25zdCBpdGVtc1RvQmVTZWxlY3RlZCA9IHRoaXMuX2l0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQoKSAmJiBpbmRleGVzLmluY2x1ZGVzKGl0ZW0uaW5kZXgoKSkpO1xuICAgIGlmICh0aGlzLmlzSXRlbUxpbWl0UmVhY2hlZCgpKSB7XG4gICAgICByZXR1cm4gW1tdLCB0aGlzLl9pdGVtc1RvVmFsdWUoaXRlbXNUb0JlU2VsZWN0ZWQpXTtcbiAgICB9XG5cbiAgICBsZXQgaXRlbXNTZWxlY3RlZENvdW50ID0gMDtcbiAgICBjb25zdCBpdGVtc1NlbGVjdGVkID0gW107XG4gICAgbGV0IGl0ZW1zTGVmdFVudGlsTGltaXQgPSAodGhpcy5fYXJkUGFyZW50Q29tcC5tYXhTZWxlY3RlZEl0ZW1zKCkgPz8gSW5maW5pdHkpIC0gdGhpcy5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtc1RvQmVTZWxlY3RlZCkge1xuICAgICAgaXRlbXNTZWxlY3RlZENvdW50Kys7XG4gICAgICBpZiAoaXRlbS5zZWxlY3RlZCgpKSBjb250aW51ZTtcbiAgICAgIGlmIChpdGVtc0xlZnRVbnRpbExpbWl0IDw9IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpdGVtc0xlZnRVbnRpbExpbWl0LS07XG4gICAgICBpdGVtLnNlbGVjdGVkLnNldCh0cnVlKTtcbiAgICAgIGl0ZW1zU2VsZWN0ZWQucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtc0ZhaWxlZFRvU2VsZWN0ID0gaXRlbXNUb0JlU2VsZWN0ZWQuc2xpY2UoaXRlbXNTZWxlY3RlZENvdW50IC0gMSk7XG4gICAgcmV0dXJuIFt0aGlzLl9pdGVtc1RvVmFsdWUoaXRlbXNTZWxlY3RlZCksIHRoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc0ZhaWxlZFRvU2VsZWN0KV07XG4gIH1cbiAgLyoqXG4gICAqIFVuc2VsZWN0cyBvbmUgb3IgbXVsdGlwbGUgaXRlbXMuXG4gICAqIEBwYXJhbSBpdGVtcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIHVuc2VsZWN0ZWQuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIHVuc2VsZWN0ZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cbiAgICovXG4gIHVuc2VsZWN0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IGFueVtdIHtcbiAgICBjb25zdCBpdGVtc1RvQmVVbnNlbGVjdGVkID0gdGhpcy5faXRlbXMoKS5maWx0ZXIoaXRlbSA9PiBpbmRleGVzLmluY2x1ZGVzKGl0ZW0uaW5kZXgoKSkpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtc1RvQmVVbnNlbGVjdGVkKSB7XG4gICAgICBpdGVtLnNlbGVjdGVkLnNldChmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1RvQmVVbnNlbGVjdGVkKTtcbiAgfVxuXG4gIC8vISBoaWdobGlnaHRpbmcgaXRlbXNcbiAgLyoqXG4gICAqIFVuaGlnaGxpZ2h0cyBhbGwgY3VycmVudGx5IGhpZ2hsaWdodGVkIGl0ZW1zLlxuICAgKi9cbiAgdW5oaWdobGlnaHRBbGwoKTogdm9pZCB7XG4gICAgY29uc3QgaGlnaGxpZ2h0ZWQgPSB0aGlzLmhpZ2hsaWdodGVkSXRlbXMoKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaGlnaGxpZ2h0ZWQpIHtcbiAgICAgIGl0ZW0uaGlnaGxpZ2h0ZWQuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEhpZ2hsaWdodHMgdGhlIGdpdmVuIGl0ZW0sIHdoaWxlIHVuaGlnaGxpZ2h0aW5nIGFsbCBvdGhlciBpdGVtcy4gRG9lcyBub3RoaW5nIHdoZW4gdGhlIGl0ZW0gaXMgZGlzYWJsZWQuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSBoaWdobGlnaHRlZC5cbiAgICogQHJldHVybnMgVGhlIGhpZ2hsaWdodGVkIGl0ZW0uXG4gICAqL1xuICBoaWdobGlnaHRTaW5nbGVJdGVtKGluZGV4OiBudW1iZXIpOiBBcmRUYWJsZVJvdyB8IG51bGwge1xuICAgIHRoaXMudW5oaWdobGlnaHRBbGwoKTtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogSGlnaGxpZ2h0cyBhbGwgZ2l2ZW4gaXRlbXMuXG4gICAqIEBwYXJhbSBpdGVtcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIGhpZ2hsaWdodGVkLlxuICAgKiBAcmV0dXJucyBUaGUgbGFzdCBoaWdobGlnaHRlZCBpdGVtLlxuICAgKi9cbiAgaGlnaGxpZ2h0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IEFyZFRhYmxlUm93IHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2l0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gaW5kZXhlcy5pbmNsdWRlcyhpdGVtLmluZGV4KCkpKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGl0ZW0uaGlnaGxpZ2h0ZWQuc2V0KHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXMubGFzdCgpO1xuICB9XG4gIC8qKlxuICAgKiBVbmhpZ2hsaWdodHMgYWxsIGdpdmVuIGl0ZW1zLlxuICAgKiBAcGFyYW0gaXRlbXMgQSByZXN0IG9wZXJhdG9yIGFycmF5IG9mIGl0ZW0gaW5kZXhlcyB0byBiZSB1bmhpZ2hsaWdodGVkLlxuICAgKi9cbiAgdW5oaWdobGlnaHRJdGVtKC4uLmluZGV4ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9pdGVtcygpLmZpbHRlcihpdGVtID0+IGluZGV4ZXMuaW5jbHVkZXMoaXRlbS5pbmRleCgpKSk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uaGlnaGxpZ2h0ZWQoKSkgcmV0dXJuO1xuXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIHRoZSBmaXJzdCBpdGVtIG91dCBvZiBhbGwgaXRlbXMuXG4gICAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHRlZCBpdGVtLlxuICAgKi9cbiAgaGlnaGxpZ2h0Rmlyc3RJdGVtKCk6IEFyZFRhYmxlUm93IHwgbnVsbCB7XG4gICAgdGhpcy51bmhpZ2hsaWdodEFsbCgpO1xuXG4gICAgY29uc3QgaXRlbVRvSGlnaGxpZ2h0ID0gdGhpcy5oaWdobGlnaHRhYmxlSXRlbXMoKS5maXJzdCgpLmluZGV4KCk7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtVG9IaWdobGlnaHQpO1xuICB9XG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIHRoZSBsYXN0IGl0ZW0gb3V0IG9mIGFsbCBpdGVtcy5cbiAgICogQHJldHVybnMgVGhlIGhpZ2hsaWdodGVkIGl0ZW0uXG4gICAqL1xuICBoaWdobGlnaHRMYXN0SXRlbSgpOiBBcmRUYWJsZVJvdyB8IG51bGwge1xuICAgIHRoaXMudW5oaWdobGlnaHRBbGwoKTtcblxuICAgIGNvbnN0IGl0ZW1Ub0hpZ2hsaWdodCA9IHRoaXMuaGlnaGxpZ2h0YWJsZUl0ZW1zKCkubGFzdCgpLmluZGV4KCk7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtVG9IaWdobGlnaHQpO1xuICB9XG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIGFsbCBub24tZGlzYWJsZWQgaXRlbXMuXG4gICAqL1xuICBoaWdobGlnaHRBbGxJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtc1RvSGlnaGxpZ2h0ID0gdGhpcy5oaWdobGlnaHRhYmxlSXRlbXMoKS5tYXAodiA9PiB2LmluZGV4KCkpO1xuICAgIHRoaXMuaGlnaGxpZ2h0SXRlbSguLi5pdGVtc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICAvKipcbiAgICogSGlnaGxpZ2h0cyB0aGUgbmV4dCBub24tZGlzYWJsZWQgaXRlbSBkZWZpbmVkIGJ5IHRoZSBvZmZzZXQgYW1vdW50LlxuICAgKlxuICAgKiBJZiBgaGFzU2hpZnRgIGlzIHNldCB0byB0cnVlLCBhbGwgb3JpZ2luYWxseSBoaWdobGlnaHRlZCBpdGVtcyBhcmUga2VwdC4gT3RoZXJ3aXNlLCBhbGwgb3JpZ2luYWwgaXRlbXMgYXJlIHVuc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBvZmZzZXQgVGhlIGFtb3VudCBvZiBpdGVtcyB0byBvZmZzZXQgdGhlIGhpZ2hsaWdodCBieS5cbiAgICogQHBhcmFtIGhhc1NoaWZ0IFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBzaGlmdCBrZXkgcHJlc3NlZC5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0gaGlnaGxpZ2h0ZWQuXG4gICAqL1xuICBoaWdobGlnaHROZXh0SXRlbShvZmZzZXQ6IG51bWJlciwgaGFzU2hpZnQ/OiBib29sZWFuKTogQXJkVGFibGVSb3cgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaXNBbnlJdGVtSGlnaGxpZ2h0ZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0Rmlyc3RJdGVtKCk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gdGhpcy5oaWdobGlnaHRlZEl0ZW1zKCkubGFzdCgpO1xuICAgIGNvbnN0IGl0ZW1zV2l0aG91dERpc2FibGVkID0gdGhpcy5faXRlbXMoKS5maWx0ZXIoXG4gICAgICBpdGVtID0+ICFpdGVtLmRpc2FibGVkKCkgJiYgKCF0aGlzLmlzSXRlbUxpbWl0UmVhY2hlZCgpIHx8IGl0ZW0uc2VsZWN0ZWQoKSlcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleEluSXRlbXMgPSBpdGVtc1dpdGhvdXREaXNhYmxlZC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmluZGV4KCkgPT09IGN1cnJlbnRJdGVtLmluZGV4KCkpO1xuXG4gICAgbGV0IG5leHRJdGVtSW5kZXggPSBjdXJyZW50SW5kZXhJbkl0ZW1zICsgb2Zmc2V0O1xuICAgIGlmIChuZXh0SXRlbUluZGV4ID49IGl0ZW1zV2l0aG91dERpc2FibGVkLmxlbmd0aCkge1xuICAgICAgbmV4dEl0ZW1JbmRleCAtPSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChuZXh0SXRlbUluZGV4IDwgMCkge1xuICAgICAgbmV4dEl0ZW1JbmRleCArPSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1Ub0hpZ2hsaWdodCA9IGl0ZW1zV2l0aG91dERpc2FibGVkW25leHRJdGVtSW5kZXhdO1xuXG4gICAgaWYgKGhhc1NoaWZ0KSB7XG4gICAgICBpZiAoaXRlbVRvSGlnaGxpZ2h0LmhpZ2hsaWdodGVkKCkpIHtcbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodEl0ZW0obmV4dEl0ZW1JbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKG5leHRJdGVtSW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRTaW5nbGVJdGVtKG5leHRJdGVtSW5kZXgpO1xuICB9XG5cbiAgLy8hIHNvcnRpbmdcbiAgcHJpdmF0ZSBfY3VycmVudFNvcnRDb2x1bW46IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9jdXJyZW50U29ydFR5cGU6IFNvcnRUeXBlIHwgbnVsbCA9IG51bGw7XG5cbiAgdG9nZ2xlQ3VycmVudFNvcnRDb2x1bW4oY29sdW1uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3VycmVudFNvcnRDb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9PT0gU29ydFR5cGUuQXNjZW5kaW5nKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9IFNvcnRUeXBlLkRlc2NlbmRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jdXJyZW50U29ydFR5cGUgPSBTb3J0VHlwZS5Bc2NlbmRpbmc7XG4gICAgICB9XG4gICAgICB0aGlzLl9nZW5lcmF0ZVNvcnRlZFJvd3ModHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2N1cnJlbnRTb3J0Q29sdW1uID0gY29sdW1uO1xuICAgIHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9IFNvcnRUeXBlLkFzY2VuZGluZztcbiAgICB0aGlzLl9nZW5lcmF0ZVNvcnRlZFJvd3MoKTtcbiAgfVxuICByZXNldFNvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFNvcnRDb2x1bW4gPSBudWxsO1xuICAgIHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9IG51bGw7XG4gICAgdGhpcy5fc29ydGVkSXRlbXMuc2V0KFsuLi50aGlzLml0ZW1zKCldKTtcbiAgfVxuICBnZXRDb2x1bW5Tb3J0VHlwZShjb2x1bW46IG51bWJlcik6IFNvcnRUeXBlIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTb3J0Q29sdW1uID09PSBjb2x1bW4pIHtcbiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50U29ydFR5cGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgX2dlbmVyYXRlU29ydGVkUm93cyhqdXN0UmV2ZXJzZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoanVzdFJldmVyc2UpIHtcbiAgICAgIHRoaXMuX3NvcnRlZEl0ZW1zKCkucmV2ZXJzZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzb3J0Q29sdW1uSW5kZXggPSB0aGlzLl9jdXJyZW50U29ydENvbHVtbjtcbiAgICBpZiAoaXNOdWxsKHNvcnRDb2x1bW5JbmRleCkgfHwgIXRoaXMuX2N1cnJlbnRTb3J0VHlwZSkge1xuICAgICAgdGhpcy5fc29ydGVkSXRlbXMuc2V0KHRoaXMuaXRlbXMoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNvcnRDb2x1bW4gPSB0aGlzLl9kYXRhQ29sdW1ucygpW3NvcnRDb2x1bW5JbmRleF07XG4gICAgaWYgKCFzb3J0Q29sdW1uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBUkQtSVM1MDU5OiBFbmNvdW50ZXJlZCBhbiBpc3N1ZSBpbiA8YXJkLXRhYmxlPjogY291bGQgbm90IGZpbmQgdGhlIGNvbHVtbiB3aXRoIGluZGV4ICR7c29ydENvbHVtbkluZGV4fS4gVGhpcyBpcyBtb3N0IGxpa2VseSBhbiBBcmRpdW0gVUkgYnVnLCBwbGVhc2UgcmVwb3J0IGl0IHRvIHRoZSBjcmVhdG9ycy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9PT0gU29ydFR5cGUuQXNjZW5kaW5nID8gMSA6IC0xO1xuICAgIGNvbnN0IHNvcnRGbiA9XG4gICAgICBzb3J0Q29sdW1uLnNvcnRGbiA/P1xuICAgICAgKChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhID4gYikgcmV0dXJuIGRpcmVjdGlvbjtcbiAgICAgICAgaWYgKGEgPCBiKSByZXR1cm4gLTEgKiBkaXJlY3Rpb247XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9zb3J0ZWRJdGVtcy5zZXQoWy4uLnRoaXMuaXRlbXMoKV0uc29ydCgoYSwgYikgPT4gc29ydEZuKGEuZGF0YSgpW3NvcnRDb2x1bW5JbmRleF0sIGIuZGF0YSgpW3NvcnRDb2x1bW5JbmRleF0pKSk7XG4gIH1cbn1cbiJdfQ==