@sebgroup/green-angular 5.1.2 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/esm2022/lib/shared/core-control/core-control.directive.mjs +3 -3
  2. package/esm2022/src/lib/shared/core-control/core-control.directive.mjs +3 -3
  3. package/esm2022/src/v-angular/account-number/account-number.module.mjs +15 -0
  4. package/esm2022/src/v-angular/account-number/account-number.pipe.mjs +55 -0
  5. package/esm2022/src/v-angular/account-number/index.mjs +3 -0
  6. package/esm2022/src/v-angular/account-number/sebgroup-green-angular-src-v-angular-account-number.mjs +5 -0
  7. package/esm2022/src/v-angular/alert/alert.component.mjs +47 -0
  8. package/esm2022/src/v-angular/alert/alert.models.mjs +8 -0
  9. package/esm2022/src/v-angular/alert/alert.module.mjs +18 -0
  10. package/esm2022/src/v-angular/alert/index.mjs +4 -0
  11. package/esm2022/src/v-angular/alert/sebgroup-green-angular-src-v-angular-alert.mjs +5 -0
  12. package/esm2022/src/v-angular/base-control-value-accessor/base-control-value-accessor.component.mjs +16 -6
  13. package/esm2022/src/v-angular/base-control-value-accessor/base-control-value-accessor.module.mjs +9 -9
  14. package/esm2022/src/v-angular/breadcrumbs/breadcrumbs.component.mjs +5 -5
  15. package/esm2022/src/v-angular/breadcrumbs/breadcrumbs.module.mjs +11 -11
  16. package/esm2022/src/v-angular/button/button.component.mjs +9 -9
  17. package/esm2022/src/v-angular/button/button.module.mjs +11 -11
  18. package/esm2022/src/v-angular/card/card.component.mjs +6 -6
  19. package/esm2022/src/v-angular/card/card.module.mjs +9 -9
  20. package/esm2022/src/v-angular/character-countdown/character-countdown.module.mjs +6 -6
  21. package/esm2022/src/v-angular/checkbox/checkbox.component.mjs +9 -7
  22. package/esm2022/src/v-angular/checkbox/checkbox.module.mjs +14 -12
  23. package/esm2022/src/v-angular/core/core.utils.mjs +35 -1
  24. package/esm2022/src/v-angular/datepicker/components/calendar/calendar.component.mjs +200 -0
  25. package/esm2022/src/v-angular/datepicker/components/calendar-control/calendar-control.component.mjs +115 -0
  26. package/esm2022/src/v-angular/datepicker/components/date-input/date-input.component.mjs +203 -0
  27. package/esm2022/src/v-angular/datepicker/components/datepicker/datepicker.component.mjs +135 -0
  28. package/esm2022/src/v-angular/datepicker/date-control-value-accessor/date-control-value-accessor.component.mjs +408 -0
  29. package/esm2022/src/v-angular/datepicker/datepicker.globals.mjs +20 -0
  30. package/esm2022/src/v-angular/datepicker/datepicker.models.mjs +56 -0
  31. package/esm2022/src/v-angular/datepicker/datepicker.module.mjs +63 -0
  32. package/esm2022/src/v-angular/datepicker/datepicker.utils.mjs +196 -0
  33. package/esm2022/src/v-angular/datepicker/directives/calendar-date.directive.mjs +47 -0
  34. package/esm2022/src/v-angular/datepicker/index.mjs +17 -0
  35. package/esm2022/src/v-angular/datepicker/models/dates.mjs +291 -0
  36. package/esm2022/src/v-angular/datepicker/pipes/date-thook.pipe.mjs +30 -0
  37. package/esm2022/src/v-angular/datepicker/pipes/is-disabled.pipe.mjs +37 -0
  38. package/esm2022/src/v-angular/datepicker/pipes/matches.pipe.mjs +17 -0
  39. package/esm2022/src/v-angular/datepicker/sebgroup-green-angular-src-v-angular-datepicker.mjs +5 -0
  40. package/esm2022/src/v-angular/drag-drop/drag-drop.component.mjs +497 -0
  41. package/esm2022/src/v-angular/drag-drop/drag-drop.models.mjs +2 -0
  42. package/esm2022/src/v-angular/drag-drop/drag-drop.module.mjs +49 -0
  43. package/esm2022/src/v-angular/drag-drop/drag-drop.pipes.mjs +70 -0
  44. package/esm2022/src/v-angular/drag-drop/drag-drop.utils.mjs +76 -0
  45. package/esm2022/src/v-angular/drag-drop/index.mjs +5 -0
  46. package/esm2022/src/v-angular/drag-drop/sebgroup-green-angular-src-v-angular-drag-drop.mjs +5 -0
  47. package/esm2022/src/v-angular/dropdown/dropdown-list/dropdown-list.component.mjs +24 -9
  48. package/esm2022/src/v-angular/dropdown/dropdown.component.mjs +16 -9
  49. package/esm2022/src/v-angular/dropdown/dropdown.module.mjs +31 -15
  50. package/esm2022/src/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.mjs +8 -8
  51. package/esm2022/src/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.mjs +5 -5
  52. package/esm2022/src/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.mjs +17 -10
  53. package/esm2022/src/v-angular/dropdown/typeahead/typeahead.directive.mjs +27 -20
  54. package/esm2022/src/v-angular/dropdown/typeahead/typeahead.module.mjs +21 -21
  55. package/esm2022/src/v-angular/external-link/external-link.directive.mjs +5 -5
  56. package/esm2022/src/v-angular/external-link/external-link.module.mjs +9 -9
  57. package/esm2022/src/v-angular/i18n/i18n.module.mjs +12 -12
  58. package/esm2022/src/v-angular/i18n/i18n.test.module.mjs +6 -6
  59. package/esm2022/src/v-angular/info-circle/info-circle.component.mjs +6 -6
  60. package/esm2022/src/v-angular/info-circle/info-circle.module.mjs +11 -11
  61. package/esm2022/src/v-angular/input/input.component.mjs +11 -15
  62. package/esm2022/src/v-angular/input/input.module.mjs +27 -22
  63. package/esm2022/src/v-angular/input-mask/input-mask.directive.mjs +6 -6
  64. package/esm2022/src/v-angular/input-mask/input-mask.module.mjs +10 -10
  65. package/esm2022/src/v-angular/modal/dialog/dialog.component.mjs +53 -31
  66. package/esm2022/src/v-angular/modal/fold-out/fold-out.component.mjs +116 -16
  67. package/esm2022/src/v-angular/modal/fold-out/fold-out.directive.mjs +5 -5
  68. package/esm2022/src/v-angular/modal/fold-out/keyboard-key.enum.mjs +9 -0
  69. package/esm2022/src/v-angular/modal/modal.module.mjs +38 -27
  70. package/esm2022/src/v-angular/modal/slide-out/slide-out.component.mjs +35 -12
  71. package/esm2022/src/v-angular/pagination/index.mjs +3 -0
  72. package/esm2022/src/v-angular/pagination/pagination.component.mjs +144 -0
  73. package/esm2022/src/v-angular/pagination/pagination.module.mjs +37 -0
  74. package/esm2022/src/v-angular/pagination/sebgroup-green-angular-src-v-angular-pagination.mjs +5 -0
  75. package/esm2022/src/v-angular/radio/radio.component.mjs +14 -12
  76. package/esm2022/src/v-angular/radio/radio.module.mjs +12 -11
  77. package/esm2022/src/v-angular/slug/slug.module.mjs +6 -6
  78. package/esm2022/src/v-angular/table/index.mjs +9 -0
  79. package/esm2022/src/v-angular/table/sebgroup-green-angular-src-v-angular-table.mjs +5 -0
  80. package/esm2022/src/v-angular/table/table.component.mjs +406 -0
  81. package/esm2022/src/v-angular/table/table.directive.mjs +110 -0
  82. package/esm2022/src/v-angular/table/table.models.mjs +2 -0
  83. package/esm2022/src/v-angular/table/table.module.mjs +40 -0
  84. package/esm2022/src/v-angular/table/table.tools.mjs +29 -0
  85. package/esm2022/src/v-angular/table/tr-thook.pipe.mjs +22 -0
  86. package/esm2022/src/v-angular/tabs/index.mjs +8 -0
  87. package/esm2022/src/v-angular/tabs/sebgroup-green-angular-src-v-angular-tabs.mjs +5 -0
  88. package/esm2022/src/v-angular/tabs/tab.directive.mjs +81 -0
  89. package/esm2022/src/v-angular/tabs/tabs.component.mjs +262 -0
  90. package/esm2022/src/v-angular/tabs/tabs.models.mjs +2 -0
  91. package/esm2022/src/v-angular/tabs/tabs.module.mjs +21 -0
  92. package/esm2022/src/v-angular/textarea/textarea.component.mjs +9 -7
  93. package/esm2022/src/v-angular/textarea/textarea.module.mjs +27 -13
  94. package/esm2022/src/v-angular/toast/index.mjs +8 -0
  95. package/esm2022/src/v-angular/toast/sebgroup-green-angular-src-v-angular-toast.mjs +5 -0
  96. package/esm2022/src/v-angular/toast/toast-message.service.mjs +63 -0
  97. package/esm2022/src/v-angular/toast/toast.component.mjs +70 -0
  98. package/esm2022/src/v-angular/toast/toast.models.mjs +8 -0
  99. package/esm2022/src/v-angular/toast/toast.module.mjs +21 -0
  100. package/esm2022/src/v-angular/tooltip/tooltip.directive.mjs +35 -15
  101. package/esm2022/src/v-angular/tooltip/tooltip.module.mjs +11 -11
  102. package/esm2022/src/v-angular/tooltip/tooltip.styles.mjs +60 -0
  103. package/esm2022/v-angular/account-number/account-number.module.mjs +15 -0
  104. package/esm2022/v-angular/account-number/account-number.pipe.mjs +55 -0
  105. package/esm2022/v-angular/account-number/index.mjs +3 -0
  106. package/esm2022/v-angular/alert/alert.component.mjs +47 -0
  107. package/esm2022/v-angular/alert/alert.models.mjs +8 -0
  108. package/esm2022/v-angular/alert/alert.module.mjs +18 -0
  109. package/esm2022/v-angular/alert/index.mjs +4 -0
  110. package/esm2022/v-angular/base-control-value-accessor/base-control-value-accessor.component.mjs +16 -6
  111. package/esm2022/v-angular/base-control-value-accessor/base-control-value-accessor.module.mjs +9 -9
  112. package/esm2022/v-angular/breadcrumbs/breadcrumbs.component.mjs +5 -5
  113. package/esm2022/v-angular/breadcrumbs/breadcrumbs.module.mjs +11 -11
  114. package/esm2022/v-angular/button/button.component.mjs +9 -9
  115. package/esm2022/v-angular/button/button.module.mjs +11 -11
  116. package/esm2022/v-angular/card/card.component.mjs +6 -6
  117. package/esm2022/v-angular/card/card.module.mjs +9 -9
  118. package/esm2022/v-angular/character-countdown/character-countdown.module.mjs +6 -6
  119. package/esm2022/v-angular/checkbox/checkbox.component.mjs +9 -7
  120. package/esm2022/v-angular/checkbox/checkbox.module.mjs +14 -12
  121. package/esm2022/v-angular/datepicker/components/calendar/calendar.component.mjs +200 -0
  122. package/esm2022/v-angular/datepicker/components/calendar-control/calendar-control.component.mjs +115 -0
  123. package/esm2022/v-angular/datepicker/components/date-input/date-input.component.mjs +203 -0
  124. package/esm2022/v-angular/datepicker/components/datepicker/datepicker.component.mjs +135 -0
  125. package/esm2022/v-angular/datepicker/date-control-value-accessor/date-control-value-accessor.component.mjs +408 -0
  126. package/esm2022/v-angular/datepicker/datepicker.globals.mjs +20 -0
  127. package/esm2022/v-angular/datepicker/datepicker.models.mjs +56 -0
  128. package/esm2022/v-angular/datepicker/datepicker.module.mjs +63 -0
  129. package/esm2022/v-angular/datepicker/datepicker.utils.mjs +196 -0
  130. package/esm2022/v-angular/datepicker/directives/calendar-date.directive.mjs +47 -0
  131. package/esm2022/v-angular/datepicker/index.mjs +17 -0
  132. package/esm2022/v-angular/datepicker/models/dates.mjs +291 -0
  133. package/esm2022/v-angular/datepicker/pipes/date-thook.pipe.mjs +30 -0
  134. package/esm2022/v-angular/datepicker/pipes/is-disabled.pipe.mjs +37 -0
  135. package/esm2022/v-angular/datepicker/pipes/matches.pipe.mjs +17 -0
  136. package/esm2022/v-angular/drag-drop/drag-drop.component.mjs +497 -0
  137. package/esm2022/v-angular/drag-drop/drag-drop.models.mjs +2 -0
  138. package/esm2022/v-angular/drag-drop/drag-drop.module.mjs +49 -0
  139. package/esm2022/v-angular/drag-drop/drag-drop.pipes.mjs +70 -0
  140. package/esm2022/v-angular/drag-drop/drag-drop.utils.mjs +76 -0
  141. package/esm2022/v-angular/drag-drop/index.mjs +5 -0
  142. package/esm2022/v-angular/dropdown/dropdown-list/dropdown-list.component.mjs +24 -9
  143. package/esm2022/v-angular/dropdown/dropdown.component.mjs +16 -9
  144. package/esm2022/v-angular/dropdown/dropdown.module.mjs +31 -15
  145. package/esm2022/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.mjs +8 -8
  146. package/esm2022/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.mjs +5 -5
  147. package/esm2022/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.mjs +17 -10
  148. package/esm2022/v-angular/dropdown/typeahead/typeahead.directive.mjs +27 -20
  149. package/esm2022/v-angular/dropdown/typeahead/typeahead.module.mjs +21 -21
  150. package/esm2022/v-angular/external-link/external-link.directive.mjs +37 -0
  151. package/esm2022/v-angular/external-link/external-link.module.mjs +18 -0
  152. package/esm2022/v-angular/external-link/index.mjs +3 -0
  153. package/esm2022/v-angular/i18n/i18n.module.mjs +12 -12
  154. package/esm2022/v-angular/i18n/i18n.test.module.mjs +6 -6
  155. package/esm2022/v-angular/index.mjs +11 -1
  156. package/esm2022/v-angular/info-circle/info-circle.component.mjs +6 -6
  157. package/esm2022/v-angular/info-circle/info-circle.module.mjs +11 -11
  158. package/esm2022/v-angular/input/input.component.mjs +11 -15
  159. package/esm2022/v-angular/input/input.module.mjs +27 -22
  160. package/esm2022/v-angular/input-mask/input-mask.directive.mjs +6 -6
  161. package/esm2022/v-angular/input-mask/input-mask.module.mjs +10 -10
  162. package/esm2022/v-angular/modal/dialog/dialog.component.mjs +53 -31
  163. package/esm2022/v-angular/modal/fold-out/fold-out.component.mjs +116 -16
  164. package/esm2022/v-angular/modal/fold-out/fold-out.directive.mjs +5 -5
  165. package/esm2022/v-angular/modal/fold-out/keyboard-key.enum.mjs +9 -0
  166. package/esm2022/v-angular/modal/modal.module.mjs +38 -27
  167. package/esm2022/v-angular/modal/slide-out/slide-out.component.mjs +35 -12
  168. package/esm2022/v-angular/pagination/index.mjs +3 -0
  169. package/esm2022/v-angular/pagination/pagination.component.mjs +144 -0
  170. package/esm2022/v-angular/pagination/pagination.module.mjs +37 -0
  171. package/esm2022/v-angular/radio/radio.component.mjs +14 -12
  172. package/esm2022/v-angular/radio/radio.module.mjs +12 -11
  173. package/esm2022/v-angular/slug/index.mjs +3 -0
  174. package/esm2022/v-angular/slug/slug.module.mjs +18 -0
  175. package/esm2022/v-angular/slug/slug.pipe.mjs +27 -0
  176. package/esm2022/v-angular/table/index.mjs +9 -0
  177. package/esm2022/v-angular/table/table.component.mjs +406 -0
  178. package/esm2022/v-angular/table/table.directive.mjs +110 -0
  179. package/esm2022/v-angular/table/table.models.mjs +2 -0
  180. package/esm2022/v-angular/table/table.module.mjs +40 -0
  181. package/esm2022/v-angular/table/table.tools.mjs +29 -0
  182. package/esm2022/v-angular/table/tr-thook.pipe.mjs +22 -0
  183. package/esm2022/v-angular/tabs/index.mjs +8 -0
  184. package/esm2022/v-angular/tabs/tab.directive.mjs +81 -0
  185. package/esm2022/v-angular/tabs/tabs.component.mjs +262 -0
  186. package/esm2022/v-angular/tabs/tabs.models.mjs +2 -0
  187. package/esm2022/v-angular/tabs/tabs.module.mjs +21 -0
  188. package/esm2022/v-angular/textarea/textarea.component.mjs +9 -7
  189. package/esm2022/v-angular/textarea/textarea.module.mjs +27 -13
  190. package/esm2022/v-angular/toast/index.mjs +8 -0
  191. package/esm2022/v-angular/toast/toast-message.service.mjs +63 -0
  192. package/esm2022/v-angular/toast/toast.component.mjs +70 -0
  193. package/esm2022/v-angular/toast/toast.models.mjs +8 -0
  194. package/esm2022/v-angular/toast/toast.module.mjs +21 -0
  195. package/esm2022/v-angular/tooltip/tooltip.directive.mjs +35 -15
  196. package/esm2022/v-angular/tooltip/tooltip.module.mjs +11 -11
  197. package/esm2022/v-angular/tooltip/tooltip.styles.mjs +60 -0
  198. package/esm2022/v-angular/v-angular.module.mjs +104 -68
  199. package/fesm2022/sebgroup-green-angular-src-lib-shared.mjs +2 -2
  200. package/fesm2022/sebgroup-green-angular-src-lib-shared.mjs.map +1 -1
  201. package/fesm2022/sebgroup-green-angular-src-v-angular-account-number.mjs +74 -0
  202. package/fesm2022/sebgroup-green-angular-src-v-angular-account-number.mjs.map +1 -0
  203. package/fesm2022/sebgroup-green-angular-src-v-angular-alert.mjs +76 -0
  204. package/fesm2022/sebgroup-green-angular-src-v-angular-alert.mjs.map +1 -0
  205. package/fesm2022/sebgroup-green-angular-src-v-angular-base-control-value-accessor.mjs +23 -13
  206. package/fesm2022/sebgroup-green-angular-src-v-angular-base-control-value-accessor.mjs.map +1 -1
  207. package/fesm2022/sebgroup-green-angular-src-v-angular-breadcrumbs.mjs +14 -14
  208. package/fesm2022/sebgroup-green-angular-src-v-angular-breadcrumbs.mjs.map +1 -1
  209. package/fesm2022/sebgroup-green-angular-src-v-angular-button.mjs +18 -18
  210. package/fesm2022/sebgroup-green-angular-src-v-angular-button.mjs.map +1 -1
  211. package/fesm2022/sebgroup-green-angular-src-v-angular-card.mjs +13 -13
  212. package/fesm2022/sebgroup-green-angular-src-v-angular-card.mjs.map +1 -1
  213. package/fesm2022/sebgroup-green-angular-src-v-angular-character-countdown.mjs +6 -6
  214. package/fesm2022/sebgroup-green-angular-src-v-angular-character-countdown.mjs.map +1 -1
  215. package/fesm2022/sebgroup-green-angular-src-v-angular-checkbox.mjs +21 -17
  216. package/fesm2022/sebgroup-green-angular-src-v-angular-checkbox.mjs.map +1 -1
  217. package/fesm2022/sebgroup-green-angular-src-v-angular-core.mjs +34 -0
  218. package/fesm2022/sebgroup-green-angular-src-v-angular-core.mjs.map +1 -1
  219. package/fesm2022/sebgroup-green-angular-src-v-angular-datepicker.mjs +1759 -0
  220. package/fesm2022/sebgroup-green-angular-src-v-angular-datepicker.mjs.map +1 -0
  221. package/fesm2022/sebgroup-green-angular-src-v-angular-drag-drop.mjs +687 -0
  222. package/fesm2022/sebgroup-green-angular-src-v-angular-drag-drop.mjs.map +1 -0
  223. package/fesm2022/sebgroup-green-angular-src-v-angular-dropdown.mjs +126 -74
  224. package/fesm2022/sebgroup-green-angular-src-v-angular-dropdown.mjs.map +1 -1
  225. package/fesm2022/sebgroup-green-angular-src-v-angular-external-link.mjs +12 -12
  226. package/fesm2022/sebgroup-green-angular-src-v-angular-external-link.mjs.map +1 -1
  227. package/fesm2022/sebgroup-green-angular-src-v-angular-i18n.mjs +17 -17
  228. package/fesm2022/sebgroup-green-angular-src-v-angular-i18n.mjs.map +1 -1
  229. package/fesm2022/sebgroup-green-angular-src-v-angular-info-circle.mjs +15 -15
  230. package/fesm2022/sebgroup-green-angular-src-v-angular-info-circle.mjs.map +1 -1
  231. package/fesm2022/sebgroup-green-angular-src-v-angular-input-mask.mjs +14 -14
  232. package/fesm2022/sebgroup-green-angular-src-v-angular-input-mask.mjs.map +1 -1
  233. package/fesm2022/sebgroup-green-angular-src-v-angular-input.mjs +36 -35
  234. package/fesm2022/sebgroup-green-angular-src-v-angular-input.mjs.map +1 -1
  235. package/fesm2022/sebgroup-green-angular-src-v-angular-modal.mjs +246 -81
  236. package/fesm2022/sebgroup-green-angular-src-v-angular-modal.mjs.map +1 -1
  237. package/fesm2022/sebgroup-green-angular-src-v-angular-pagination.mjs +185 -0
  238. package/fesm2022/sebgroup-green-angular-src-v-angular-pagination.mjs.map +1 -0
  239. package/fesm2022/sebgroup-green-angular-src-v-angular-radio.mjs +24 -21
  240. package/fesm2022/sebgroup-green-angular-src-v-angular-radio.mjs.map +1 -1
  241. package/fesm2022/sebgroup-green-angular-src-v-angular-slug.mjs +6 -6
  242. package/fesm2022/sebgroup-green-angular-src-v-angular-slug.mjs.map +1 -1
  243. package/fesm2022/sebgroup-green-angular-src-v-angular-table.mjs +604 -0
  244. package/fesm2022/sebgroup-green-angular-src-v-angular-table.mjs.map +1 -0
  245. package/fesm2022/sebgroup-green-angular-src-v-angular-tabs.mjs +367 -0
  246. package/fesm2022/sebgroup-green-angular-src-v-angular-tabs.mjs.map +1 -0
  247. package/fesm2022/sebgroup-green-angular-src-v-angular-textarea.mjs +33 -18
  248. package/fesm2022/sebgroup-green-angular-src-v-angular-textarea.mjs.map +1 -1
  249. package/fesm2022/sebgroup-green-angular-src-v-angular-toast.mjs +166 -0
  250. package/fesm2022/sebgroup-green-angular-src-v-angular-toast.mjs.map +1 -0
  251. package/fesm2022/sebgroup-green-angular-src-v-angular-tooltip.mjs +103 -24
  252. package/fesm2022/sebgroup-green-angular-src-v-angular-tooltip.mjs.map +1 -1
  253. package/fesm2022/sebgroup-green-angular-v-angular.mjs +6369 -2156
  254. package/fesm2022/sebgroup-green-angular-v-angular.mjs.map +1 -1
  255. package/fesm2022/sebgroup-green-angular.mjs +2 -2
  256. package/fesm2022/sebgroup-green-angular.mjs.map +1 -1
  257. package/lib/shared/core-control/core-control.directive.d.ts +1 -1
  258. package/package.json +51 -3
  259. package/src/lib/shared/core-control/core-control.directive.d.ts +1 -1
  260. package/src/v-angular/account-number/README.md +63 -0
  261. package/src/v-angular/account-number/account-number.module.d.ts +2 -0
  262. package/src/v-angular/account-number/account-number.pipe.d.ts +32 -0
  263. package/src/v-angular/account-number/index.d.ts +2 -0
  264. package/src/v-angular/alert/alert.component.d.ts +19 -0
  265. package/src/v-angular/alert/alert.models.d.ts +13 -0
  266. package/src/v-angular/alert/alert.module.d.ts +8 -0
  267. package/src/v-angular/alert/index.d.ts +3 -0
  268. package/src/v-angular/base-control-value-accessor/base-control-value-accessor.component.d.ts +10 -4
  269. package/src/v-angular/base-control-value-accessor/base-control-value-accessor.module.d.ts +4 -4
  270. package/src/v-angular/breadcrumbs/breadcrumbs.component.d.ts +4 -4
  271. package/src/v-angular/breadcrumbs/breadcrumbs.module.d.ts +4 -4
  272. package/src/v-angular/button/button.component.d.ts +5 -5
  273. package/src/v-angular/button/button.module.d.ts +4 -4
  274. package/src/v-angular/card/card.component.d.ts +3 -3
  275. package/src/v-angular/card/card.module.d.ts +4 -4
  276. package/src/v-angular/character-countdown/character-countdown.module.d.ts +4 -4
  277. package/src/v-angular/checkbox/checkbox.component.d.ts +6 -5
  278. package/src/v-angular/checkbox/checkbox.module.d.ts +5 -4
  279. package/src/v-angular/core/core.utils.d.ts +1 -0
  280. package/src/v-angular/datepicker/components/calendar/calendar.component.d.ts +36 -0
  281. package/src/v-angular/datepicker/components/calendar-control/calendar-control.component.d.ts +30 -0
  282. package/src/v-angular/datepicker/components/date-input/date-input.component.d.ts +102 -0
  283. package/src/v-angular/datepicker/components/datepicker/datepicker.component.d.ts +62 -0
  284. package/src/v-angular/datepicker/date-control-value-accessor/date-control-value-accessor.component.d.ts +165 -0
  285. package/src/v-angular/datepicker/datepicker.globals.d.ts +13 -0
  286. package/src/v-angular/datepicker/datepicker.models.d.ts +50 -0
  287. package/src/v-angular/datepicker/datepicker.module.d.ts +19 -0
  288. package/src/v-angular/datepicker/datepicker.utils.d.ts +39 -0
  289. package/src/v-angular/datepicker/directives/calendar-date.directive.d.ts +21 -0
  290. package/src/v-angular/datepicker/index.d.ts +13 -0
  291. package/src/v-angular/datepicker/models/dates.d.ts +15 -0
  292. package/src/v-angular/datepicker/pipes/date-thook.pipe.d.ts +8 -0
  293. package/src/v-angular/datepicker/pipes/is-disabled.pipe.d.ts +8 -0
  294. package/src/v-angular/datepicker/pipes/matches.pipe.d.ts +7 -0
  295. package/src/v-angular/drag-drop/drag-drop.component.d.ts +131 -0
  296. package/src/v-angular/drag-drop/drag-drop.models.d.ts +49 -0
  297. package/src/v-angular/drag-drop/drag-drop.module.d.ts +13 -0
  298. package/src/v-angular/drag-drop/drag-drop.pipes.d.ts +40 -0
  299. package/src/v-angular/drag-drop/drag-drop.utils.d.ts +33 -0
  300. package/src/v-angular/drag-drop/index.d.ts +4 -0
  301. package/src/v-angular/dropdown/dropdown-list/dropdown-list.component.d.ts +11 -4
  302. package/src/v-angular/dropdown/dropdown.component.d.ts +10 -6
  303. package/src/v-angular/dropdown/dropdown.module.d.ts +8 -7
  304. package/src/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.d.ts +6 -6
  305. package/src/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.d.ts +3 -3
  306. package/src/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.d.ts +8 -6
  307. package/src/v-angular/dropdown/typeahead/typeahead.directive.d.ts +14 -12
  308. package/src/v-angular/dropdown/typeahead/typeahead.module.d.ts +4 -4
  309. package/src/v-angular/external-link/external-link.directive.d.ts +3 -3
  310. package/src/v-angular/external-link/external-link.module.d.ts +4 -4
  311. package/src/v-angular/i18n/i18n.module.d.ts +7 -7
  312. package/src/v-angular/i18n/i18n.test.module.d.ts +4 -4
  313. package/src/v-angular/info-circle/info-circle.component.d.ts +4 -4
  314. package/src/v-angular/info-circle/info-circle.module.d.ts +4 -4
  315. package/src/v-angular/input/input.component.d.ts +5 -10
  316. package/src/v-angular/input/input.module.d.ts +5 -4
  317. package/src/v-angular/input-mask/input-mask.directive.d.ts +3 -3
  318. package/src/v-angular/input-mask/input-mask.module.d.ts +5 -5
  319. package/src/v-angular/modal/dialog/dialog.component.d.ts +16 -7
  320. package/src/v-angular/modal/fold-out/fold-out.component.d.ts +34 -11
  321. package/src/v-angular/modal/fold-out/fold-out.directive.d.ts +3 -3
  322. package/src/v-angular/modal/fold-out/keyboard-key.enum.d.ts +7 -0
  323. package/src/v-angular/modal/modal.module.d.ts +4 -4
  324. package/src/v-angular/modal/slide-out/slide-out.component.d.ts +13 -6
  325. package/src/v-angular/pagination/index.d.ts +2 -0
  326. package/src/v-angular/pagination/pagination.component.d.ts +64 -0
  327. package/src/v-angular/pagination/pagination.module.d.ts +12 -0
  328. package/src/v-angular/radio/radio.component.d.ts +14 -13
  329. package/src/v-angular/radio/radio.module.d.ts +5 -4
  330. package/src/v-angular/slug/slug.module.d.ts +4 -4
  331. package/src/v-angular/table/index.d.ts +5 -0
  332. package/src/v-angular/table/table.component.d.ts +239 -0
  333. package/src/v-angular/table/table.directive.d.ts +36 -0
  334. package/src/v-angular/table/table.models.d.ts +62 -0
  335. package/src/v-angular/table/table.module.d.ts +12 -0
  336. package/src/v-angular/table/table.tools.d.ts +5 -0
  337. package/src/v-angular/table/tr-thook.pipe.d.ts +7 -0
  338. package/src/v-angular/tabs/index.d.ts +4 -0
  339. package/src/v-angular/tabs/tab.directive.d.ts +37 -0
  340. package/src/v-angular/tabs/tabs.component.d.ts +65 -0
  341. package/src/v-angular/tabs/tabs.models.d.ts +25 -0
  342. package/src/v-angular/tabs/tabs.module.d.ts +11 -0
  343. package/src/v-angular/textarea/textarea.component.d.ts +6 -5
  344. package/src/v-angular/textarea/textarea.module.d.ts +6 -4
  345. package/src/v-angular/toast/index.d.ts +4 -0
  346. package/src/v-angular/toast/toast-message.service.d.ts +17 -0
  347. package/src/v-angular/toast/toast.component.d.ts +22 -0
  348. package/src/v-angular/toast/toast.models.d.ts +15 -0
  349. package/src/v-angular/toast/toast.module.d.ts +10 -0
  350. package/src/v-angular/tooltip/tooltip.directive.d.ts +5 -3
  351. package/src/v-angular/tooltip/tooltip.module.d.ts +4 -4
  352. package/src/v-angular/tooltip/tooltip.styles.d.ts +11 -0
  353. package/v-angular/account-number/account-number.module.d.ts +2 -0
  354. package/v-angular/account-number/account-number.pipe.d.ts +32 -0
  355. package/v-angular/account-number/index.d.ts +2 -0
  356. package/v-angular/alert/alert.component.d.ts +19 -0
  357. package/v-angular/alert/alert.models.d.ts +13 -0
  358. package/v-angular/alert/alert.module.d.ts +8 -0
  359. package/v-angular/alert/index.d.ts +3 -0
  360. package/v-angular/base-control-value-accessor/base-control-value-accessor.component.d.ts +10 -4
  361. package/v-angular/base-control-value-accessor/base-control-value-accessor.module.d.ts +4 -4
  362. package/v-angular/breadcrumbs/breadcrumbs.component.d.ts +4 -4
  363. package/v-angular/breadcrumbs/breadcrumbs.module.d.ts +4 -4
  364. package/v-angular/button/button.component.d.ts +5 -5
  365. package/v-angular/button/button.module.d.ts +4 -4
  366. package/v-angular/card/card.component.d.ts +3 -3
  367. package/v-angular/card/card.module.d.ts +4 -4
  368. package/v-angular/character-countdown/character-countdown.module.d.ts +4 -4
  369. package/v-angular/checkbox/checkbox.component.d.ts +6 -5
  370. package/v-angular/checkbox/checkbox.module.d.ts +5 -4
  371. package/v-angular/datepicker/components/calendar/calendar.component.d.ts +36 -0
  372. package/v-angular/datepicker/components/calendar-control/calendar-control.component.d.ts +30 -0
  373. package/v-angular/datepicker/components/date-input/date-input.component.d.ts +102 -0
  374. package/v-angular/datepicker/components/datepicker/datepicker.component.d.ts +62 -0
  375. package/v-angular/datepicker/date-control-value-accessor/date-control-value-accessor.component.d.ts +165 -0
  376. package/v-angular/datepicker/datepicker.globals.d.ts +13 -0
  377. package/v-angular/datepicker/datepicker.models.d.ts +50 -0
  378. package/v-angular/datepicker/datepicker.module.d.ts +19 -0
  379. package/v-angular/datepicker/datepicker.utils.d.ts +39 -0
  380. package/v-angular/datepicker/directives/calendar-date.directive.d.ts +21 -0
  381. package/v-angular/datepicker/index.d.ts +13 -0
  382. package/v-angular/datepicker/models/dates.d.ts +15 -0
  383. package/v-angular/datepicker/pipes/date-thook.pipe.d.ts +8 -0
  384. package/v-angular/datepicker/pipes/is-disabled.pipe.d.ts +8 -0
  385. package/v-angular/datepicker/pipes/matches.pipe.d.ts +7 -0
  386. package/v-angular/drag-drop/drag-drop.component.d.ts +131 -0
  387. package/v-angular/drag-drop/drag-drop.models.d.ts +49 -0
  388. package/v-angular/drag-drop/drag-drop.module.d.ts +13 -0
  389. package/v-angular/drag-drop/drag-drop.pipes.d.ts +40 -0
  390. package/v-angular/drag-drop/drag-drop.utils.d.ts +33 -0
  391. package/v-angular/drag-drop/index.d.ts +4 -0
  392. package/v-angular/dropdown/dropdown-list/dropdown-list.component.d.ts +11 -4
  393. package/v-angular/dropdown/dropdown.component.d.ts +10 -6
  394. package/v-angular/dropdown/dropdown.module.d.ts +8 -7
  395. package/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.d.ts +6 -6
  396. package/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.d.ts +3 -3
  397. package/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.d.ts +8 -6
  398. package/v-angular/dropdown/typeahead/typeahead.directive.d.ts +14 -12
  399. package/v-angular/dropdown/typeahead/typeahead.module.d.ts +4 -4
  400. package/v-angular/external-link/external-link.directive.d.ts +17 -0
  401. package/v-angular/external-link/external-link.module.d.ts +8 -0
  402. package/v-angular/external-link/index.d.ts +2 -0
  403. package/v-angular/i18n/i18n.module.d.ts +7 -7
  404. package/v-angular/i18n/i18n.test.module.d.ts +4 -4
  405. package/v-angular/index.d.ts +10 -0
  406. package/v-angular/info-circle/info-circle.component.d.ts +4 -4
  407. package/v-angular/info-circle/info-circle.module.d.ts +4 -4
  408. package/v-angular/input/input.component.d.ts +5 -10
  409. package/v-angular/input/input.module.d.ts +5 -4
  410. package/v-angular/input-mask/input-mask.directive.d.ts +3 -3
  411. package/v-angular/input-mask/input-mask.module.d.ts +5 -5
  412. package/v-angular/modal/dialog/dialog.component.d.ts +16 -7
  413. package/v-angular/modal/fold-out/fold-out.component.d.ts +34 -11
  414. package/v-angular/modal/fold-out/fold-out.directive.d.ts +3 -3
  415. package/v-angular/modal/fold-out/keyboard-key.enum.d.ts +7 -0
  416. package/v-angular/modal/modal.module.d.ts +4 -4
  417. package/v-angular/modal/slide-out/slide-out.component.d.ts +13 -6
  418. package/v-angular/pagination/index.d.ts +2 -0
  419. package/v-angular/pagination/pagination.component.d.ts +64 -0
  420. package/v-angular/pagination/pagination.module.d.ts +12 -0
  421. package/v-angular/radio/radio.component.d.ts +14 -13
  422. package/v-angular/radio/radio.module.d.ts +5 -4
  423. package/v-angular/slug/index.d.ts +2 -0
  424. package/v-angular/slug/slug.module.d.ts +8 -0
  425. package/v-angular/slug/slug.pipe.d.ts +12 -0
  426. package/v-angular/table/index.d.ts +5 -0
  427. package/v-angular/table/table.component.d.ts +239 -0
  428. package/v-angular/table/table.directive.d.ts +36 -0
  429. package/v-angular/table/table.models.d.ts +62 -0
  430. package/v-angular/table/table.module.d.ts +12 -0
  431. package/v-angular/table/table.tools.d.ts +5 -0
  432. package/v-angular/table/tr-thook.pipe.d.ts +7 -0
  433. package/v-angular/tabs/index.d.ts +4 -0
  434. package/v-angular/tabs/tab.directive.d.ts +37 -0
  435. package/v-angular/tabs/tabs.component.d.ts +65 -0
  436. package/v-angular/tabs/tabs.models.d.ts +25 -0
  437. package/v-angular/tabs/tabs.module.d.ts +11 -0
  438. package/v-angular/textarea/textarea.component.d.ts +6 -5
  439. package/v-angular/textarea/textarea.module.d.ts +6 -4
  440. package/v-angular/toast/index.d.ts +4 -0
  441. package/v-angular/toast/toast-message.service.d.ts +17 -0
  442. package/v-angular/toast/toast.component.d.ts +22 -0
  443. package/v-angular/toast/toast.models.d.ts +15 -0
  444. package/v-angular/toast/toast.module.d.ts +10 -0
  445. package/v-angular/tooltip/tooltip.directive.d.ts +5 -3
  446. package/v-angular/tooltip/tooltip.module.d.ts +4 -4
  447. package/v-angular/tooltip/tooltip.styles.d.ts +11 -0
  448. package/v-angular/v-angular.module.d.ts +27 -18
@@ -0,0 +1,406 @@
1
+ import { Component, ContentChild, ContentChildren, EventEmitter, Input, Output, QueryList, } from '@angular/core';
2
+ import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
3
+ import { debounceTime, map } from 'rxjs/operators';
4
+ import { TableAppendableRowsTemplateDirective, TableFooterTemplateDirective, TableTemplateDirective, } from './table.directive';
5
+ import { orderByAscending, orderByDescending, pick } from './table.tools';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "@jsverse/transloco";
10
+ import * as i4 from "./table.directive";
11
+ import * as i5 from "./tr-thook.pipe";
12
+ let staticInitId = 0;
13
+ function objectFromEntries(entryMap) {
14
+ const fromEntries = {};
15
+ for (const [key, value] of entryMap) {
16
+ fromEntries[key] = value;
17
+ }
18
+ return fromEntries;
19
+ }
20
+ /**
21
+ * A table component with built-in sorting and selecting functionality.
22
+ * By default, table cells (i.e. `<td>` elements) and table headers (i.e. `<th>` elements) are populated with text only values.
23
+ *
24
+ * To customize the contents of either the `<td>` or `<th>` elements (like adding color, icons, form fields, extra padding etc.), provide
25
+ * the customized content within a `<ng-template>`-tag, and place the ng-template in the html between the start and ending tag of
26
+ * the `<nggv-table>`. Add a `tableColumn`-attribute to the `<ng-template>`-element, and set the value to the specific column property.
27
+ * Set `tableColumnTarget` to either `th`, `td` or `both` (default) depending on target element type.
28
+ * The entire row from the `@Input() tableData` is available from the context `$implicit` variable.
29
+ *
30
+ * @example
31
+ * <!-- for table cells i.e. td-elements -->
32
+ * <ng-template tableColumn="status" tableColumnTarget="td" let-myDataVar="$implicit" let-status="$implicit.status">
33
+ * <!-- my custom status element -->
34
+ * </ng-template>
35
+ *
36
+ * @example
37
+ * <!-- for table headers i.e. th-elements -->
38
+ * <ng-template tableColumn="status" tableColumnTarget="th" let-myDataVar="$implicit" let-status="$implicit.status">
39
+ * <!-- my custom status element -->
40
+ * </ng-template>
41
+ *
42
+ * It is possible to add custom rows that are appended below data row. Use `<ng-template>`-tag and place the ng-template in the html between the start and ending tag of
43
+ * the `<nggv-table>`. Add a `tableAppendableRows`-attribute to the `<ng-template>`-element. Any `tr` elements that exist within `<ng-template tableAppendableRows>` and `</ng-template>` tags will be put below data row's `tr` element in the table.
44
+ *
45
+ * @example
46
+ * <!-- custom appended rows -->
47
+ * <ng-template tableAppendableRows let-myDataVar="$implicit" let-status="$implicit.status">
48
+ * <tr>
49
+ * <!-- first row's columns -->
50
+ * </tr>
51
+ * <!-- more rows if needed -->
52
+ * </ng-template>
53
+ *
54
+ * If custom styling is needed for data row that has appended rows, you can use data attribute `data-hasrowspan` to distinguish it from data row without appended rows.
55
+ * You can pass your own custom method with conditional logic to define what value will be passed to data-hasrowspan.
56
+ * In addition, hasRowSpan function accepts item from `@Input() tableData` as argument which is of the same type as value passed to context `$implicit` variable.
57
+ * IMPORTANT: use arrow function style for defining function inside component, i.e. `hasRowSpan = (value) => output;`. If regular function will be defined, i.e. `hasRowSpan(value) { return output; }`, binding will not work.
58
+ *
59
+ * @example
60
+ * <!-- inside component
61
+ * class CustomComponent {
62
+ * customHasRowSpanFunction = (item: CustomDataType) => item.appendedRowsData.length > 0 ? true : false;
63
+ * }
64
+ * -->
65
+ * <!-- inside stylesheets
66
+ * [data-hasrowspan="true"] {
67
+ * color: blue;
68
+ * }
69
+ * .appended-row {
70
+ * color: blue;
71
+ * }
72
+ * -->
73
+ * <nggv-table [hasRowSpan]="customHasRowSpanFunction">
74
+ * <!-- custom appended rows -->
75
+ * <ng-template tableAppendableRows let-appendedRowsData="$implicit.appendedRowsData">
76
+ * <tr *ngFor="let appendedRowItem of appendedRowsData" class="appended-row">
77
+ * <td>{{ appendedRowItem }}</td>
78
+ * <!-- other row's columns -->
79
+ * </tr>
80
+ * </ng-template>
81
+ * </nggv-table>
82
+ *
83
+ * In addition, it is possible to add footer for the table. Similarly to adding custom columns, use `<ng-template>`-tag and place the ng-template in the html between the start and ending tag of
84
+ * the `<nggv-table>`. Add a `tableFooter`-attribute to the `<ng-template>`-element. Any elements that exist within `<ng-template tableFooter>` and `</ng-template>` tags will be put to tfoot element inside the table.
85
+ *
86
+ * @example
87
+ * <!-- for table footer i.e. tfoot-element -->
88
+ * <ng-template tableFooter>
89
+ * <tr>
90
+ * <!-- first row's columns -->
91
+ * </tr>
92
+ * <!-- more rows if needed -->
93
+ * </ng-template>
94
+ *
95
+ */
96
+ export class TableComponent {
97
+ constructor() {
98
+ /** Emits the table row that was clicked. Works on all columns if not preventDefaultEmit is set for that column. */
99
+ this.ngvRowClick = new EventEmitter();
100
+ /**
101
+ * Emits currently selected and deselected items in the table as key-value pairs.
102
+ * Uses each item`s itemId as key, and a boolean value to describe selected status.
103
+ */
104
+ this.ngvRowSelect = new EventEmitter();
105
+ /**
106
+ * Emits event to signal that the table should be reordered.
107
+ */
108
+ this.ngvOrderBy = new EventEmitter();
109
+ /**
110
+ * Property name used to uniquely describe each item (i.e. row) in the data table.
111
+ * Defaults to \'id\'.
112
+ * Is required if selectable is true.
113
+ */
114
+ this.rowId = 'id';
115
+ /**
116
+ * Function's return value is used for data attribute \'data-hasrowspan\'.
117
+ * If custom hasRowSpan function is not passed to the table,
118
+ * then this function returns undefined value by default which results in \'data-hasrowspan\' attribute being omitted in html
119
+ * (angular omits attributes that contain null or undefined value).
120
+ * IMPORTANT: use arrow function style for defining function inside component, i.e. `hasRowSpan = (value) => output;`. If regular function will be defined, i.e. `hasRowSpan(value) { return output; }`, binding will not work.
121
+ */
122
+ this.hasRowSpan = (_) => undefined;
123
+ /**
124
+ * Used to enable/disable the left-side checkbox column.
125
+ * Defaults to true.
126
+ */
127
+ this.selectable = true;
128
+ /**
129
+ * Used to enable/disable expandable rows.
130
+ * Defaults to false.
131
+ */
132
+ this.expandable = false;
133
+ /**
134
+ * Property name used to describe the subItems in the data table.
135
+ */
136
+ this.subItemsProp = 'subItems';
137
+ /**
138
+ * Allow nggv-table to attempt sorting the data in the table. Not recommended if only a subset is loaded or if the dataset is very large.
139
+ * Disabled by default.
140
+ */
141
+ this.allowLocalSort = false;
142
+ /** Special property used for selecting DOM elements during automated UI testing. */
143
+ this.thook = 'table-select-all';
144
+ /**
145
+ * @internal
146
+ * Internal data structure used to keep track of added content templates used in td elements.
147
+ */
148
+ this.customRowTemplates = new Map();
149
+ /**
150
+ * @internal
151
+ * Internal data structure used to keep track of added content templates used in th elements.
152
+ */
153
+ this.customHeaderTemplates = new Map();
154
+ /**
155
+ * @internal
156
+ * FormGroup containing all row id\'s as controls, and whether these are selected or not as values.
157
+ */
158
+ this.rowSelectors = new UntypedFormGroup({});
159
+ /**
160
+ * @internal
161
+ * Master selector for selecting or deselecting all row selectors.
162
+ */
163
+ this.groupSelector = new UntypedFormControl(false);
164
+ this.selected = [];
165
+ this.subs = [];
166
+ }
167
+ ngOnChanges(changes) {
168
+ // Update selectable or expandable rows if table data or settings change
169
+ if ((this.selectable || this.expandable) && changes.tableData?.currentValue ||
170
+ (changes.selectable?.currentValue || changes.expandable?.currentValue) && this.tableData) {
171
+ const wasChanged = this.registerSelectableRows(changes.tableData.currentValue);
172
+ if (wasChanged && !this.subs.length) {
173
+ // first time this is run
174
+ const groupSelectorSub = this.groupValueSubscription;
175
+ const rowSelectorSub = this.rowValueSubscription;
176
+ this.subs.push(groupSelectorSub, rowSelectorSub);
177
+ }
178
+ else if (wasChanged) {
179
+ this.rowSelectors.updateValueAndValidity();
180
+ }
181
+ }
182
+ // sort any incoming data
183
+ if (this.allowLocalSort &&
184
+ (changes.tableData?.currentValue || changes.tableColumns?.currentValue)) {
185
+ const orderedByColumn = this.tableColumns?.find((el) => el.order !== undefined);
186
+ if (orderedByColumn)
187
+ this.sortItemsBy(orderedByColumn);
188
+ }
189
+ }
190
+ ngOnInit() {
191
+ this.initId = staticInitId++;
192
+ }
193
+ ngAfterContentInit() {
194
+ // if any custom templates were defined in the template
195
+ if (this.customTemplates.length) {
196
+ // for each template found
197
+ this.customTemplates.map((tableTemplate) => {
198
+ // if target is either 'td' or 'both'
199
+ if (['td', 'both'].includes(tableTemplate.tableColumnTarget)) {
200
+ // add to custom row templates
201
+ this.customRowTemplates.set(tableTemplate.tableColumn, tableTemplate.templateRef);
202
+ }
203
+ // if target is either 'th' or 'both'
204
+ if (['th', 'both'].includes(tableTemplate.tableColumnTarget)) {
205
+ // add to custom header templates
206
+ this.customHeaderTemplates.set(tableTemplate.tableColumn, tableTemplate.templateRef);
207
+ }
208
+ });
209
+ }
210
+ // if appended rows' template is defined in the template
211
+ if (this.appendedRowsTemplate) {
212
+ // set templateRef of appended rows' template to variable
213
+ this.appendedRowsTemplateRef = this.appendedRowsTemplate.templateRef;
214
+ }
215
+ // if custom footer template is defined in the template
216
+ if (this.customFooterTemplate) {
217
+ // set templateRef of table footer to variable
218
+ this.customFooterTemplateRef = this.customFooterTemplate.templateRef;
219
+ }
220
+ }
221
+ ngOnDestroy() {
222
+ this.subs.forEach((sub) => sub.unsubscribe());
223
+ }
224
+ /**
225
+ * @internal
226
+ * Returns a subscription to the master selector control that either selects or deselects all row controls.
227
+ */
228
+ get groupValueSubscription() {
229
+ return this.groupSelector.valueChanges.subscribe({
230
+ next: (value) => {
231
+ const selectMap = new Map(Object.entries(this.rowSelectorsValue));
232
+ selectMap.forEach((_, key) => selectMap.set(key, value));
233
+ const patchValue = objectFromEntries(selectMap);
234
+ this.rowSelectors.patchValue(patchValue);
235
+ },
236
+ });
237
+ }
238
+ /**
239
+ * @internal
240
+ * Returns a subscription to all individual row selectors and update the master selector if all are selected.
241
+ */
242
+ get rowValueSubscription() {
243
+ return this.rowSelectors.valueChanges
244
+ .pipe(debounceTime(0), // to limit the number of events and to wait for all sub controls to update
245
+ map((val) => {
246
+ // get a filtered array of keys for all rows that are selected
247
+ const selected = Object.keys(val).filter((key) => {
248
+ return val[key] === true && this.rowSelectors.get(key)?.enabled;
249
+ });
250
+ // returns an object containing only the filtered keys
251
+ return pick(selected, val);
252
+ }))
253
+ .subscribe({
254
+ next: (value) => {
255
+ // the number of selected keys compared to the total number of keys available
256
+ const numberOfSelected = Object.keys(value).length;
257
+ const allSelected = numberOfSelected > 0
258
+ ? numberOfSelected === Object.keys(this.rowSelectorsValue).length
259
+ : false;
260
+ // update the master selector control
261
+ this.groupSelector.setValue(allSelected, { emitEvent: false });
262
+ // update the array of currently selected id's
263
+ this.selected = Object.keys(value);
264
+ // and emit the updated value
265
+ this.ngvRowSelect.emit(this.selected);
266
+ },
267
+ });
268
+ }
269
+ /**
270
+ * @internal
271
+ * Registers or disables row controls for new or removed rows.
272
+ */
273
+ registerSelectableRows(tableData) {
274
+ if (!tableData)
275
+ return false;
276
+ // Array containing only the id's for each row
277
+ const dataRowIds = tableData.map((data) => data[this.rowId]);
278
+ // Array containing the id's that have registered controls
279
+ const currentIds = Object.keys(this.rowSelectorsValue);
280
+ // Array containing all ids that lacks a corresponding control (i.e. new rows)
281
+ const newIds = dataRowIds.filter((id) => currentIds.indexOf(id) === -1);
282
+ // Array containing all ids that has a control but is no longer in the data set (i.e. removed rows)
283
+ const removedIds = currentIds.filter((id) => dataRowIds.indexOf(id) === -1);
284
+ // Register new controls for added rows
285
+ if (newIds.length) {
286
+ newIds.forEach((id) => {
287
+ const ctrl = this.rowSelectors.registerControl(id, new UntypedFormControl(false));
288
+ if (ctrl.disabled)
289
+ ctrl.enable();
290
+ });
291
+ }
292
+ // Set already registered controls to disabled for removed rows
293
+ if (removedIds.length)
294
+ removedIds.forEach((id) => this.rowSelectors.get(id)?.disable());
295
+ return newIds.length > 0 || removedIds.length > 0;
296
+ }
297
+ /**
298
+ * @internal
299
+ * Returns all enabled values unless all rows are disabled.
300
+ */
301
+ get rowSelectorsValue() {
302
+ return this.rowSelectors.enabled ? this.rowSelectors.value : {};
303
+ }
304
+ toggleSortOrderWithSpace(event, column) {
305
+ if (column.sortable) {
306
+ event.preventDefault();
307
+ this.toggleSortOrder(column);
308
+ }
309
+ }
310
+ /**
311
+ * @internal
312
+ * Switches sorting order between ascending and descending order for a column.
313
+ * @param column the column to sort rows after.
314
+ */
315
+ toggleSortOrder(column) {
316
+ // check if the table is already sorted by another column than the one provided
317
+ const currentlyOrderedBy = this.tableColumns?.find((el) => el !== column && el.order !== undefined);
318
+ if (currentlyOrderedBy)
319
+ delete currentlyOrderedBy.order;
320
+ column.order = column.order === 'desc' ? 'asc' : 'desc';
321
+ this.sortItemsBy(column);
322
+ }
323
+ /** If sortable, reorders the table data using the specified column as ordering attribute. */
324
+ sortItemsBy(column) {
325
+ if (!column.sortable)
326
+ return;
327
+ // emit re-order event
328
+ this.ngvOrderBy.emit({ property: column.property, order: column.order });
329
+ // if local sort is allowed, reorder data
330
+ if (!this.allowLocalSort || !this.tableData)
331
+ return;
332
+ return this.tableData.sort(column.order === 'desc'
333
+ ? orderByDescending(column.property)
334
+ : orderByAscending(column.property));
335
+ }
336
+ /**
337
+ * @internal
338
+ * Emits row data for what row was clicked if defaultEmit is allowed.
339
+ */
340
+ propagateItemClick(item, preventDefaultEmit) {
341
+ if (!preventDefaultEmit)
342
+ this.ngvRowClick.emit(item);
343
+ if (this.expandable)
344
+ this.toggleRowToExpand(item[this.rowId]);
345
+ }
346
+ getAriaLabel(column) {
347
+ const sortOrder = column.order === 'asc'
348
+ ? this.ariaLabelsOrderBy?.desc
349
+ : this.ariaLabelsOrderBy?.asc;
350
+ if (!sortOrder)
351
+ return; // no aria labels defined
352
+ return column.ariaLabelSortable?.replace('{{sortOrder}}', sortOrder);
353
+ }
354
+ toggleRowToExpand(id) {
355
+ const row = this.rowSelectors.get(id);
356
+ row?.setValue(!row.value);
357
+ }
358
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
359
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TableComponent, selector: "nggv-table", inputs: { tableColumns: "tableColumns", tableData: "tableData", rowId: "rowId", hasRowSpan: "hasRowSpan", selectable: "selectable", expandable: "expandable", subItemsProp: "subItemsProp", allowLocalSort: "allowLocalSort", thook: "thook", trThookFn: "trThookFn", ariaLabelCheckboxTh: "ariaLabelCheckboxTh", ariaLabelCheckboxTr: "ariaLabelCheckboxTr", ariaLabelsOrderBy: "ariaLabelsOrderBy" }, outputs: { ngvRowClick: "ngvRowClick", ngvRowSelect: "ngvRowSelect", ngvOrderBy: "ngvOrderBy" }, queries: [{ propertyName: "appendedRowsTemplate", first: true, predicate: TableAppendableRowsTemplateDirective, descendants: true }, { propertyName: "customFooterTemplate", first: true, predicate: TableFooterTemplateDirective, descendants: true }, { propertyName: "customTemplates", predicate: TableTemplateDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #sortableThTemplate let-column>\n <button class=\"sg-table-sort\" *transloco=\"let t\">\n <ng-template #thButtonTemplate>\n {{ t(column.label ?? '') }}\n </ng-template>\n <ng-container\n *ngIf=\"\n customHeaderTemplates.get(column.property) as thTemplate;\n else thButtonTemplate\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n >\n </ng-template>\n </ng-container>\n </button>\n</ng-template>\n\n<ng-template #notSortableThTemplate let-column>\n <ng-template #defaultThTemplate>\n <ng-container *transloco=\"let t\">\n {{ t(column.label ?? '') }}\n </ng-container>\n </ng-template>\n <ng-container\n *ngIf=\"\n customHeaderTemplates.get(column.property) as thTemplate;\n else defaultThTemplate\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n >\n </ng-template>\n </ng-container>\n</ng-template>\n\n<table class=\"gds-table\" *transloco=\"let t\">\n <!-- Table header -->\n <thead>\n <tr>\n <!-- Checkbox column for header -->\n <th *ngIf=\"selectable\" class=\"column__check\">\n <div class=\"gds-field-checkbox-wrap\">\n <input\n type=\"checkbox\"\n [formControl]=\"groupSelector\"\n [attr.aria-label]=\"ariaLabelCheckboxTh\"\n [attr.id]=\"'cb_header__' + initId\"\n [attr.data-thook]=\"thook\"\n />\n <label [attr.for]=\"'cb_header__' + initId\"></label>\n </div>\n </th>\n\n <!-- Other columns -->\n <th\n *ngFor=\"let column of tableColumns\"\n [columnType]=\"column.valueType\"\n [sortable]=\"column.sortable\"\n [sortOrder]=\"column.order\"\n [thook]=\"'column-header-' + !!column.property\"\n (click)=\"toggleSortOrder(column)\"\n (keydown.space)=\"toggleSortOrderWithSpace($event, column)\"\n [attr.aria-label]=\"getAriaLabel(column)\"\n [attr.aria-sort]=\"column.order + 'ending'\"\n >\n <ng-container *ngIf=\"column.sortable\">\n <ng-container\n *ngTemplateOutlet=\"\n sortableThTemplate;\n context: { $implicit: column, column: column }\n \"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!column.sortable\">\n <ng-container\n *ngTemplateOutlet=\"\n notSortableThTemplate;\n context: { $implicit: column, column: column }\n \"\n >\n </ng-container>\n </ng-container>\n </th>\n </tr>\n </thead>\n\n <!-- Table body -->\n <tbody [formGroup]=\"rowSelectors\">\n <ng-container *ngFor=\"let item of tableData; let i = index\">\n <tr\n [class.row__expand]=\"expandable\"\n [attr.data-thook]=\"item | trThook: i : trThookFn\"\n [attr.data-hasrowspan]=\"hasRowSpan(item)\"\n >\n <!-- Checkbox column for row -->\n <td *ngIf=\"selectable\" class=\"column__check\">\n <div class=\"gds-field-checkbox-wrap\">\n <input\n *ngIf=\"rowSelectors.get(item[rowId])\"\n type=\"checkbox\"\n [formControlName]=\"item[rowId]\"\n [attr.aria-label]=\"ariaLabelCheckboxTr\"\n [attr.id]=\"'cb_row__' + initId + '_' + i\"\n [attr.data-thook]=\"'row-select-' + i\"\n />\n <label [attr.for]=\"'cb_row__' + initId + '_' + i\"></label>\n </div>\n </td>\n\n <!-- Other columns -->\n <td\n *ngFor=\"let column of tableColumns; let i = index\"\n [columnType]=\"column.valueType\"\n [value]=\"item[column.property]\"\n (click)=\"propagateItemClick(item, column.preventDefaultClickEvent)\"\n >\n <ng-container *ngIf=\"expandable && i === 0; else nonExpandableTemplate\">\n <div class=\"gds-item-field-wrap\">\n <span\n class=\"chevron-field\"\n [attr.aria-expanded]=\"rowSelectors.get(item[rowId]).value\">\n <svg\n *ngIf=\"item.subItems.length > 0\"\n width=\"18\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M20 9L12 17L4 9\"\n stroke=\"currentColor\"\n stroke-width=\"2.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n {{ item[column.property] }} ({{ item.subItems.length }})\n </div>\n </ng-container>\n\n <ng-template #nonExpandableTemplate>\n <ng-container *ngIf=\"customRowTemplates.get(column.property) as tdTemplate; else defaultTdTemplate\">\n <ng-template *ngTemplateOutlet=\"tdTemplate; context: { $implicit: item }\">\n </ng-template>\n </ng-container>\n <ng-template #defaultTdTemplate>\n {{ item[column.property] }}\n </ng-template>\n </ng-template>\n </td>\n </tr>\n\n <!-- Expanded Sub Items -->\n <ng-container *ngIf=\"expandable && rowSelectors.get(item[rowId]).value\">\n <tr *ngFor=\"let subItem of item[subItemsProp]\">\n <td\n *ngFor=\"let column of tableColumns\"\n [columnType]=\"column.valueType\"\n [value]=\"subItem[column.property]\"\n >\n <div class=\"gds-sub-item-field-wrap\">\n {{ subItem[column.property] }}\n </div>\n </td>\n </tr>\n </ng-container>\n\n <!-- Custom appended rows -->\n <ng-container *ngIf=\"appendedRowsTemplateRef as trTemplate\">\n <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n <ng-container\n *ngTemplateOutlet=\"trTemplate || null; context: { $implicit: item }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n\n <!-- Table footer -->\n <tfoot *ngIf=\"customFooterTemplateRef as trTemplate\">\n <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n <ng-container *ngTemplateOutlet=\"trTemplate || null\"> </ng-container>\n </tfoot>\n</table>\n", styles: ["::ng-deep .gds-table{--gds-ref-pallet-base100: #f8f8f8;--gds-ref-pallet-base600: hsl(0, 0%, 53%);--sg-table-header-background: #1a1a1a;--sg-table-header-color: #fff;--sg-table-cell-padding-x: .5rem;--sg-table-cell-padding-y: .6875rem;--sg-table-border-width: 1px;--sg-table-border-color: var(--gds-ref-pallet-base600);--sg-table-sort-icon-color: var(--gds-ref-pallet-base600);--gds-ref-pallet-base500: hsl(0, 0%, 68%);--sg-table-sort-icon-color-active: #fff;border-collapse:collapse;border-bottom:var(--sg-table-border-width) solid var(--sg-table-border-color);width:100%;border-bottom:none}::ng-deep .gds-table thead tr th{border-top:var(--sg-table-border-width) solid var(--sg-table-border-color);background:#333;color:var(--sg-table-header-color);padding:.3rem var(--sg-table-cell-padding-x);text-align:left;font-weight:500}::ng-deep .gds-table thead tr th.icon-invert.sg-sortable .sg-table-sort:after{margin-left:0;margin-right:.3rem;order:-1}::ng-deep .gds-table thead tr th .sg-table-sort{color:inherit;width:100%;text-align:left;display:flex;align-items:center;border-radius:.125rem;--gds-sys-color-focus-outline: $_header-color}::ng-deep .gds-table thead tr th .sg-table-sort:focus:not(:focus-visible){box-shadow:none;outline:0}::ng-deep .gds-table thead tr th .sg-table-sort:focus,::ng-deep .gds-table thead tr th .sg-table-sort:focus-visible{outline-color:var(--gds-sys-color-focus-outline);outline-style:solid;outline-width:.125rem;outline-offset:.125rem}::ng-deep .gds-table thead tr th[aria-sort] .sg-table-sort:after,::ng-deep .gds-table thead tr th.sg-sortable .sg-table-sort:after{content:\"\";background:var(--gds-ref-pallet-base500);-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%3E%3Cpath%20d='M11.107%205.86147L10.6429%205.39741C10.5328%205.28726%2010.3546%205.28726%2010.2445%205.39741L6.60933%209.03257V1.03101C6.60933%200.876318%206.48276%200.749756%206.32808%200.749756H5.67183C5.51714%200.749756%205.39058%200.876318%205.39058%201.03101V9.03257L1.75542%205.39741C1.64526%205.28726%201.46714%205.28726%201.35698%205.39741L0.89292%205.86147C0.782764%205.97163%200.782764%206.14976%200.89292%206.25991L5.80073%2011.1677C5.91089%2011.2779%206.08901%2011.2779%206.19917%2011.1677L11.107%206.25991C11.2171%206.14976%2011.2171%205.97163%2011.107%205.86147Z'%20fill='%23ADADAD'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%3E%3Cpath%20d='M11.107%205.86147L10.6429%205.39741C10.5328%205.28726%2010.3546%205.28726%2010.2445%205.39741L6.60933%209.03257V1.03101C6.60933%200.876318%206.48276%200.749756%206.32808%200.749756H5.67183C5.51714%200.749756%205.39058%200.876318%205.39058%201.03101V9.03257L1.75542%205.39741C1.64526%205.28726%201.46714%205.28726%201.35698%205.39741L0.89292%205.86147C0.782764%205.97163%200.782764%206.14976%200.89292%206.25991L5.80073%2011.1677C5.91089%2011.2779%206.08901%2011.2779%206.19917%2011.1677L11.107%206.25991C11.2171%206.14976%2011.2171%205.97163%2011.107%205.86147Z'%20fill='%23ADADAD'/%3E%3C/svg%3E\");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:right;mask-position:right;width:12px;height:12px;margin-left:.3rem}::ng-deep .gds-table thead tr th[aria-sort=ascending] .sg-table-sort:after{background:var(--sg-table-sort-icon-color-active);transform:rotate(180deg)}::ng-deep .gds-table thead tr th[aria-sort=descending] .sg-table-sort:after{background:var(--sg-table-sort-icon-color-active)}::ng-deep .gds-table tbody tr td,::ng-deep .gds-table tbody tr th{border-top:var(--sg-table-border-width) solid var(--sg-table-border-color);padding:var(--sg-table-cell-padding-y) var(--sg-table-cell-padding-x);vertical-align:top}::ng-deep .gds-table tbody tr.collapsible~.sub-row{display:none}::ng-deep .gds-table tbody tr.collapsible.expanded~.sub-row.show{display:table-row}::ng-deep .gds-table tbody tr td.collapse-control,::ng-deep .gds-table tbody tr td.select-control{width:15px}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn{min-height:unset;padding:0;background:transparent}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder{cursor:pointer;width:12px}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder svg{width:12px;fill:#868686}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder svg[name=angle-right]{width:9px}@media (max-width: 36em){::ng-deep .gds-table.table-mobile{width:100%;table-layout:fixed;border-bottom:none}::ng-deep .gds-table.table-mobile thead{position:sticky;top:0;display:block;background:#333}}@media (max-width: 36em) and (hover: none) and (pointer: coarse){::ng-deep .gds-table.table-mobile thead{display:table-header-group}}@media (max-width: 36em){::ng-deep .gds-table.table-mobile thead tr{display:flex;overflow:auto}::ng-deep .gds-table.table-mobile thead tr::-webkit-scrollbar{display:none}::ng-deep .gds-table.table-mobile thead tr th{flex:auto;text-align:left!important;white-space:nowrap}::ng-deep .gds-table.table-mobile tbody tr{display:flex;flex-direction:column;border-bottom:var(--sg-table-border-width) solid var(--sg-table-border-color)}::ng-deep .gds-table.table-mobile tbody tr td{display:flex;justify-content:space-between;align-items:center;border-top:none!important}::ng-deep .gds-table.table-mobile tbody tr td:before{content:attr(data-label);font-weight:700}}::ng-deep .gds-table tr:hover td{background-color:var(--gds-ref-pallet-base100)}::ng-deep .gds-table .gds-table__numeric-col{text-align:right}::ng-deep .gds-table thead tr th.gds-table__numeric-col .sg-table-sort{justify-content:end}::ng-deep .gds-table th.gds-table__numeric-col+:not(.gds-table__numeric-col),::ng-deep .gds-table td.gds-table__numeric-col+:not(.gds-table__numeric-col){padding-left:1rem}::ng-deep .gds-table th button{background-color:#0000;border:0;font-family:inherit;font-size:inherit;font-weight:inherit;padding:0;cursor:pointer}::ng-deep .gds-table td{cursor:pointer}::ng-deep .gds-table tfoot{border-top:1px solid;border-bottom:none;font-weight:500}::ng-deep .gds-table tfoot ::ng-deep td{padding:var(--sg-table-cell-padding-y) var(--sg-table-cell-padding-x)}::ng-deep .gds-table th.column__check{height:vanilla-px-to-rem(32px);width:vanilla-px-to-rem(40px)}::ng-deep .gds-table th.column__check div{min-height:100%}::ng-deep .gds-table th.column__check input:checked+label:after{top:.6rem;display:inline}::ng-deep .gds-table th.column__check label{display:inline;padding:0}::ng-deep .gds-table th.column__check label:before{top:.55rem}::ng-deep .gds-table td.column__check{width:vanilla-px-to-rem(40px)}::ng-deep .gds-table td.column__check div{min-height:unset}::ng-deep .gds-table td.column__check label{padding:0}::ng-deep .gds-table td.column__check label:before{margin:0}::ng-deep .gds-table tr.row__expand{background-color:var(--gds-ref-pallet-base100)}::ng-deep .gds-table tr.row__expand .gds-item-field-wrap{display:flex;flex-wrap:nowrap}::ng-deep .gds-table tr.row__expand .gds-item-field-wrap .chevron-field{width:1.5rem}::ng-deep .gds-table tr.row__expand .gds-item-field-wrap .chevron-field svg{transition:transform .3s ease}::ng-deep .gds-table tr.row__expand .gds-item-field-wrap .chevron-field[aria-expanded=true] svg{transform:rotate(-180deg)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "directive", type: i4.TableDirective, selector: "[columnType]", inputs: ["columnType", "sortable", "sortOrder", "value", "thook"] }, { kind: "pipe", type: i5.TrThookPipe, name: "trThook" }] }); }
360
+ }
361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, decorators: [{
362
+ type: Component,
363
+ args: [{ selector: 'nggv-table', template: "<ng-template #sortableThTemplate let-column>\n <button class=\"sg-table-sort\" *transloco=\"let t\">\n <ng-template #thButtonTemplate>\n {{ t(column.label ?? '') }}\n </ng-template>\n <ng-container\n *ngIf=\"\n customHeaderTemplates.get(column.property) as thTemplate;\n else thButtonTemplate\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n >\n </ng-template>\n </ng-container>\n </button>\n</ng-template>\n\n<ng-template #notSortableThTemplate let-column>\n <ng-template #defaultThTemplate>\n <ng-container *transloco=\"let t\">\n {{ t(column.label ?? '') }}\n </ng-container>\n </ng-template>\n <ng-container\n *ngIf=\"\n customHeaderTemplates.get(column.property) as thTemplate;\n else defaultThTemplate\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n >\n </ng-template>\n </ng-container>\n</ng-template>\n\n<table class=\"gds-table\" *transloco=\"let t\">\n <!-- Table header -->\n <thead>\n <tr>\n <!-- Checkbox column for header -->\n <th *ngIf=\"selectable\" class=\"column__check\">\n <div class=\"gds-field-checkbox-wrap\">\n <input\n type=\"checkbox\"\n [formControl]=\"groupSelector\"\n [attr.aria-label]=\"ariaLabelCheckboxTh\"\n [attr.id]=\"'cb_header__' + initId\"\n [attr.data-thook]=\"thook\"\n />\n <label [attr.for]=\"'cb_header__' + initId\"></label>\n </div>\n </th>\n\n <!-- Other columns -->\n <th\n *ngFor=\"let column of tableColumns\"\n [columnType]=\"column.valueType\"\n [sortable]=\"column.sortable\"\n [sortOrder]=\"column.order\"\n [thook]=\"'column-header-' + !!column.property\"\n (click)=\"toggleSortOrder(column)\"\n (keydown.space)=\"toggleSortOrderWithSpace($event, column)\"\n [attr.aria-label]=\"getAriaLabel(column)\"\n [attr.aria-sort]=\"column.order + 'ending'\"\n >\n <ng-container *ngIf=\"column.sortable\">\n <ng-container\n *ngTemplateOutlet=\"\n sortableThTemplate;\n context: { $implicit: column, column: column }\n \"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!column.sortable\">\n <ng-container\n *ngTemplateOutlet=\"\n notSortableThTemplate;\n context: { $implicit: column, column: column }\n \"\n >\n </ng-container>\n </ng-container>\n </th>\n </tr>\n </thead>\n\n <!-- Table body -->\n <tbody [formGroup]=\"rowSelectors\">\n <ng-container *ngFor=\"let item of tableData; let i = index\">\n <tr\n [class.row__expand]=\"expandable\"\n [attr.data-thook]=\"item | trThook: i : trThookFn\"\n [attr.data-hasrowspan]=\"hasRowSpan(item)\"\n >\n <!-- Checkbox column for row -->\n <td *ngIf=\"selectable\" class=\"column__check\">\n <div class=\"gds-field-checkbox-wrap\">\n <input\n *ngIf=\"rowSelectors.get(item[rowId])\"\n type=\"checkbox\"\n [formControlName]=\"item[rowId]\"\n [attr.aria-label]=\"ariaLabelCheckboxTr\"\n [attr.id]=\"'cb_row__' + initId + '_' + i\"\n [attr.data-thook]=\"'row-select-' + i\"\n />\n <label [attr.for]=\"'cb_row__' + initId + '_' + i\"></label>\n </div>\n </td>\n\n <!-- Other columns -->\n <td\n *ngFor=\"let column of tableColumns; let i = index\"\n [columnType]=\"column.valueType\"\n [value]=\"item[column.property]\"\n (click)=\"propagateItemClick(item, column.preventDefaultClickEvent)\"\n >\n <ng-container *ngIf=\"expandable && i === 0; else nonExpandableTemplate\">\n <div class=\"gds-item-field-wrap\">\n <span\n class=\"chevron-field\"\n [attr.aria-expanded]=\"rowSelectors.get(item[rowId]).value\">\n <svg\n *ngIf=\"item.subItems.length > 0\"\n width=\"18\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M20 9L12 17L4 9\"\n stroke=\"currentColor\"\n stroke-width=\"2.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n {{ item[column.property] }} ({{ item.subItems.length }})\n </div>\n </ng-container>\n\n <ng-template #nonExpandableTemplate>\n <ng-container *ngIf=\"customRowTemplates.get(column.property) as tdTemplate; else defaultTdTemplate\">\n <ng-template *ngTemplateOutlet=\"tdTemplate; context: { $implicit: item }\">\n </ng-template>\n </ng-container>\n <ng-template #defaultTdTemplate>\n {{ item[column.property] }}\n </ng-template>\n </ng-template>\n </td>\n </tr>\n\n <!-- Expanded Sub Items -->\n <ng-container *ngIf=\"expandable && rowSelectors.get(item[rowId]).value\">\n <tr *ngFor=\"let subItem of item[subItemsProp]\">\n <td\n *ngFor=\"let column of tableColumns\"\n [columnType]=\"column.valueType\"\n [value]=\"subItem[column.property]\"\n >\n <div class=\"gds-sub-item-field-wrap\">\n {{ subItem[column.property] }}\n </div>\n </td>\n </tr>\n </ng-container>\n\n <!-- Custom appended rows -->\n <ng-container *ngIf=\"appendedRowsTemplateRef as trTemplate\">\n <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n <ng-container\n *ngTemplateOutlet=\"trTemplate || null; context: { $implicit: item }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n\n <!-- Table footer -->\n <tfoot *ngIf=\"customFooterTemplateRef as trTemplate\">\n <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n <ng-container *ngTemplateOutlet=\"trTemplate || null\"> </ng-container>\n </tfoot>\n</table>\n", styles: ["::ng-deep .gds-table{--gds-ref-pallet-base100: #f8f8f8;--gds-ref-pallet-base600: hsl(0, 0%, 53%);--sg-table-header-background: #1a1a1a;--sg-table-header-color: #fff;--sg-table-cell-padding-x: .5rem;--sg-table-cell-padding-y: .6875rem;--sg-table-border-width: 1px;--sg-table-border-color: var(--gds-ref-pallet-base600);--sg-table-sort-icon-color: var(--gds-ref-pallet-base600);--gds-ref-pallet-base500: hsl(0, 0%, 68%);--sg-table-sort-icon-color-active: #fff;border-collapse:collapse;border-bottom:var(--sg-table-border-width) solid var(--sg-table-border-color);width:100%;border-bottom:none}::ng-deep .gds-table thead tr th{border-top:var(--sg-table-border-width) solid var(--sg-table-border-color);background:#333;color:var(--sg-table-header-color);padding:.3rem var(--sg-table-cell-padding-x);text-align:left;font-weight:500}::ng-deep .gds-table thead tr th.icon-invert.sg-sortable .sg-table-sort:after{margin-left:0;margin-right:.3rem;order:-1}::ng-deep .gds-table thead tr th .sg-table-sort{color:inherit;width:100%;text-align:left;display:flex;align-items:center;border-radius:.125rem;--gds-sys-color-focus-outline: $_header-color}::ng-deep .gds-table thead tr th .sg-table-sort:focus:not(:focus-visible){box-shadow:none;outline:0}::ng-deep .gds-table thead tr th .sg-table-sort:focus,::ng-deep .gds-table thead tr th .sg-table-sort:focus-visible{outline-color:var(--gds-sys-color-focus-outline);outline-style:solid;outline-width:.125rem;outline-offset:.125rem}::ng-deep .gds-table thead tr th[aria-sort] .sg-table-sort:after,::ng-deep .gds-table thead tr th.sg-sortable .sg-table-sort:after{content:\"\";background:var(--gds-ref-pallet-base500);-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%3E%3Cpath%20d='M11.107%205.86147L10.6429%205.39741C10.5328%205.28726%2010.3546%205.28726%2010.2445%205.39741L6.60933%209.03257V1.03101C6.60933%200.876318%206.48276%200.749756%206.32808%200.749756H5.67183C5.51714%200.749756%205.39058%200.876318%205.39058%201.03101V9.03257L1.75542%205.39741C1.64526%205.28726%201.46714%205.28726%201.35698%205.39741L0.89292%205.86147C0.782764%205.97163%200.782764%206.14976%200.89292%206.25991L5.80073%2011.1677C5.91089%2011.2779%206.08901%2011.2779%206.19917%2011.1677L11.107%206.25991C11.2171%206.14976%2011.2171%205.97163%2011.107%205.86147Z'%20fill='%23ADADAD'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%3E%3Cpath%20d='M11.107%205.86147L10.6429%205.39741C10.5328%205.28726%2010.3546%205.28726%2010.2445%205.39741L6.60933%209.03257V1.03101C6.60933%200.876318%206.48276%200.749756%206.32808%200.749756H5.67183C5.51714%200.749756%205.39058%200.876318%205.39058%201.03101V9.03257L1.75542%205.39741C1.64526%205.28726%201.46714%205.28726%201.35698%205.39741L0.89292%205.86147C0.782764%205.97163%200.782764%206.14976%200.89292%206.25991L5.80073%2011.1677C5.91089%2011.2779%206.08901%2011.2779%206.19917%2011.1677L11.107%206.25991C11.2171%206.14976%2011.2171%205.97163%2011.107%205.86147Z'%20fill='%23ADADAD'/%3E%3C/svg%3E\");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:right;mask-position:right;width:12px;height:12px;margin-left:.3rem}::ng-deep .gds-table thead tr th[aria-sort=ascending] .sg-table-sort:after{background:var(--sg-table-sort-icon-color-active);transform:rotate(180deg)}::ng-deep .gds-table thead tr th[aria-sort=descending] .sg-table-sort:after{background:var(--sg-table-sort-icon-color-active)}::ng-deep .gds-table tbody tr td,::ng-deep .gds-table tbody tr th{border-top:var(--sg-table-border-width) solid var(--sg-table-border-color);padding:var(--sg-table-cell-padding-y) var(--sg-table-cell-padding-x);vertical-align:top}::ng-deep .gds-table tbody tr.collapsible~.sub-row{display:none}::ng-deep .gds-table tbody tr.collapsible.expanded~.sub-row.show{display:table-row}::ng-deep .gds-table tbody tr td.collapse-control,::ng-deep .gds-table tbody tr td.select-control{width:15px}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn{min-height:unset;padding:0;background:transparent}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder{cursor:pointer;width:12px}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder svg{width:12px;fill:#868686}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder svg[name=angle-right]{width:9px}@media (max-width: 36em){::ng-deep .gds-table.table-mobile{width:100%;table-layout:fixed;border-bottom:none}::ng-deep .gds-table.table-mobile thead{position:sticky;top:0;display:block;background:#333}}@media (max-width: 36em) and (hover: none) and (pointer: coarse){::ng-deep .gds-table.table-mobile thead{display:table-header-group}}@media (max-width: 36em){::ng-deep .gds-table.table-mobile thead tr{display:flex;overflow:auto}::ng-deep .gds-table.table-mobile thead tr::-webkit-scrollbar{display:none}::ng-deep .gds-table.table-mobile thead tr th{flex:auto;text-align:left!important;white-space:nowrap}::ng-deep .gds-table.table-mobile tbody tr{display:flex;flex-direction:column;border-bottom:var(--sg-table-border-width) solid var(--sg-table-border-color)}::ng-deep .gds-table.table-mobile tbody tr td{display:flex;justify-content:space-between;align-items:center;border-top:none!important}::ng-deep .gds-table.table-mobile tbody tr td:before{content:attr(data-label);font-weight:700}}::ng-deep .gds-table tr:hover td{background-color:var(--gds-ref-pallet-base100)}::ng-deep .gds-table .gds-table__numeric-col{text-align:right}::ng-deep .gds-table thead tr th.gds-table__numeric-col .sg-table-sort{justify-content:end}::ng-deep .gds-table th.gds-table__numeric-col+:not(.gds-table__numeric-col),::ng-deep .gds-table td.gds-table__numeric-col+:not(.gds-table__numeric-col){padding-left:1rem}::ng-deep .gds-table th button{background-color:#0000;border:0;font-family:inherit;font-size:inherit;font-weight:inherit;padding:0;cursor:pointer}::ng-deep .gds-table td{cursor:pointer}::ng-deep .gds-table tfoot{border-top:1px solid;border-bottom:none;font-weight:500}::ng-deep .gds-table tfoot ::ng-deep td{padding:var(--sg-table-cell-padding-y) var(--sg-table-cell-padding-x)}::ng-deep .gds-table th.column__check{height:vanilla-px-to-rem(32px);width:vanilla-px-to-rem(40px)}::ng-deep .gds-table th.column__check div{min-height:100%}::ng-deep .gds-table th.column__check input:checked+label:after{top:.6rem;display:inline}::ng-deep .gds-table th.column__check label{display:inline;padding:0}::ng-deep .gds-table th.column__check label:before{top:.55rem}::ng-deep .gds-table td.column__check{width:vanilla-px-to-rem(40px)}::ng-deep .gds-table td.column__check div{min-height:unset}::ng-deep .gds-table td.column__check label{padding:0}::ng-deep .gds-table td.column__check label:before{margin:0}::ng-deep .gds-table tr.row__expand{background-color:var(--gds-ref-pallet-base100)}::ng-deep .gds-table tr.row__expand .gds-item-field-wrap{display:flex;flex-wrap:nowrap}::ng-deep .gds-table tr.row__expand .gds-item-field-wrap .chevron-field{width:1.5rem}::ng-deep .gds-table tr.row__expand .gds-item-field-wrap .chevron-field svg{transition:transform .3s ease}::ng-deep .gds-table tr.row__expand .gds-item-field-wrap .chevron-field[aria-expanded=true] svg{transform:rotate(-180deg)}\n"] }]
364
+ }], propDecorators: { customTemplates: [{
365
+ type: ContentChildren,
366
+ args: [TableTemplateDirective, { descendants: true }]
367
+ }], appendedRowsTemplate: [{
368
+ type: ContentChild,
369
+ args: [TableAppendableRowsTemplateDirective]
370
+ }], customFooterTemplate: [{
371
+ type: ContentChild,
372
+ args: [TableFooterTemplateDirective]
373
+ }], ngvRowClick: [{
374
+ type: Output
375
+ }], ngvRowSelect: [{
376
+ type: Output
377
+ }], ngvOrderBy: [{
378
+ type: Output
379
+ }], tableColumns: [{
380
+ type: Input
381
+ }], tableData: [{
382
+ type: Input
383
+ }], rowId: [{
384
+ type: Input
385
+ }], hasRowSpan: [{
386
+ type: Input
387
+ }], selectable: [{
388
+ type: Input
389
+ }], expandable: [{
390
+ type: Input
391
+ }], subItemsProp: [{
392
+ type: Input
393
+ }], allowLocalSort: [{
394
+ type: Input
395
+ }], thook: [{
396
+ type: Input
397
+ }], trThookFn: [{
398
+ type: Input
399
+ }], ariaLabelCheckboxTh: [{
400
+ type: Input
401
+ }], ariaLabelCheckboxTr: [{
402
+ type: Input
403
+ }], ariaLabelsOrderBy: [{
404
+ type: Input
405
+ }] } });
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy92LWFuZ3VsYXIvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy92LWFuZ3VsYXIvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRWxELE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMsNEJBQTRCLEVBQzVCLHNCQUFzQixHQUN2QixNQUFNLG1CQUFtQixDQUFBO0FBTzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUE7Ozs7Ozs7QUFFekUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFBO0FBRXBCLFNBQVMsaUJBQWlCLENBQUMsUUFBdUI7SUFDaEQsTUFBTSxXQUFXLEdBQTJCLEVBQUUsQ0FBQTtJQUM5QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDcEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUMxQixDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QkFDRSxZQUFZOzhCQVd0QixlQUFlO3NCQURkLGVBQWU7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQVE5RCxvQkFBb0I7c0JBRG5CLFlBQVk7dUJBQUMsb0NBQW9DO2dCQVFsRCxvQkFBb0I7c0JBRG5CLFlBQVk7dUJBQUMsNEJBQTRCO2dCQUloQyxXQUFXO3NCQUFwQixNQUFNO2dCQU1HLFlBQVk7c0JBQXJCLE1BQU07Z0JBS0csVUFBVTtzQkFBbkIsTUFBTTtnQkFNRSxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBT0csS0FBSztzQkFBYixLQUFLO2dCQVNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBTUcsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7XG4gIFRhYmxlQXBwZW5kYWJsZVJvd3NUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgVGFibGVGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgVGFibGVUZW1wbGF0ZURpcmVjdGl2ZSxcbn0gZnJvbSAnLi90YWJsZS5kaXJlY3RpdmUnXG5pbXBvcnQge1xuICBhcmlhTGFiZWxzT3JkZXJCeSxcbiAgT3JkZXJCeSxcbiAgVGFibGVDb2x1bW4sXG4gIFRhYmxlUm93LFxufSBmcm9tICcuL3RhYmxlLm1vZGVscydcbmltcG9ydCB7IG9yZGVyQnlBc2NlbmRpbmcsIG9yZGVyQnlEZXNjZW5kaW5nLCBwaWNrIH0gZnJvbSAnLi90YWJsZS50b29scydcblxubGV0IHN0YXRpY0luaXRJZCA9IDBcblxuZnVuY3Rpb24gb2JqZWN0RnJvbUVudHJpZXMoZW50cnlNYXA6IE1hcDxhbnksIGFueT4pOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgY29uc3QgZnJvbUVudHJpZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyeU1hcCkge1xuICAgIGZyb21FbnRyaWVzW2tleV0gPSB2YWx1ZVxuICB9XG4gIHJldHVybiBmcm9tRW50cmllc1xufVxuXG4vKipcbiAqIEEgdGFibGUgY29tcG9uZW50IHdpdGggYnVpbHQtaW4gc29ydGluZyBhbmQgc2VsZWN0aW5nIGZ1bmN0aW9uYWxpdHkuXG4gKiBCeSBkZWZhdWx0LCB0YWJsZSBjZWxscyAoaS5lLiBgPHRkPmAgZWxlbWVudHMpIGFuZCB0YWJsZSBoZWFkZXJzIChpLmUuIGA8dGg+YCBlbGVtZW50cykgYXJlIHBvcHVsYXRlZCB3aXRoIHRleHQgb25seSB2YWx1ZXMuXG4gKlxuICogVG8gY3VzdG9taXplIHRoZSBjb250ZW50cyBvZiBlaXRoZXIgdGhlIGA8dGQ+YCBvciBgPHRoPmAgZWxlbWVudHMgKGxpa2UgYWRkaW5nIGNvbG9yLCBpY29ucywgZm9ybSBmaWVsZHMsIGV4dHJhIHBhZGRpbmcgZXRjLiksIHByb3ZpZGVcbiAqIHRoZSBjdXN0b21pemVkIGNvbnRlbnQgd2l0aGluIGEgYDxuZy10ZW1wbGF0ZT5gLXRhZywgYW5kIHBsYWNlIHRoZSBuZy10ZW1wbGF0ZSBpbiB0aGUgaHRtbCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kaW5nIHRhZyBvZlxuICogdGhlIGA8bmdndi10YWJsZT5gLiBBZGQgYSBgdGFibGVDb2x1bW5gLWF0dHJpYnV0ZSB0byB0aGUgYDxuZy10ZW1wbGF0ZT5gLWVsZW1lbnQsIGFuZCBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpYyBjb2x1bW4gcHJvcGVydHkuXG4gKiBTZXQgYHRhYmxlQ29sdW1uVGFyZ2V0YCB0byBlaXRoZXIgYHRoYCwgYHRkYCBvciBgYm90aGAgKGRlZmF1bHQpIGRlcGVuZGluZyBvbiB0YXJnZXQgZWxlbWVudCB0eXBlLlxuICogVGhlIGVudGlyZSByb3cgZnJvbSB0aGUgYEBJbnB1dCgpIHRhYmxlRGF0YWAgaXMgYXZhaWxhYmxlIGZyb20gdGhlIGNvbnRleHQgYCRpbXBsaWNpdGAgdmFyaWFibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIDwhLS0gZm9yIHRhYmxlIGNlbGxzIGkuZS4gdGQtZWxlbWVudHMgLS0+XG4gKiA8bmctdGVtcGxhdGUgdGFibGVDb2x1bW49XCJzdGF0dXNcIiB0YWJsZUNvbHVtblRhcmdldD1cInRkXCIgbGV0LW15RGF0YVZhcj1cIiRpbXBsaWNpdFwiIGxldC1zdGF0dXM9XCIkaW1wbGljaXQuc3RhdHVzXCI+XG4gKiAgPCEtLSBteSBjdXN0b20gc3RhdHVzIGVsZW1lbnQgLS0+XG4gKiA8L25nLXRlbXBsYXRlPlxuICpcbiAqIEBleGFtcGxlXG4gKiA8IS0tIGZvciB0YWJsZSBoZWFkZXJzIGkuZS4gdGgtZWxlbWVudHMgLS0+XG4gKiA8bmctdGVtcGxhdGUgdGFibGVDb2x1bW49XCJzdGF0dXNcIiB0YWJsZUNvbHVtblRhcmdldD1cInRoXCIgbGV0LW15RGF0YVZhcj1cIiRpbXBsaWNpdFwiIGxldC1zdGF0dXM9XCIkaW1wbGljaXQuc3RhdHVzXCI+XG4gKiAgPCEtLSBteSBjdXN0b20gc3RhdHVzIGVsZW1lbnQgLS0+XG4gKiA8L25nLXRlbXBsYXRlPlxuICpcbiAqIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBjdXN0b20gcm93cyB0aGF0IGFyZSBhcHBlbmRlZCBiZWxvdyBkYXRhIHJvdy4gVXNlIGA8bmctdGVtcGxhdGU+YC10YWcgYW5kIHBsYWNlIHRoZSBuZy10ZW1wbGF0ZSBpbiB0aGUgaHRtbCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kaW5nIHRhZyBvZlxuICogdGhlIGA8bmdndi10YWJsZT5gLiBBZGQgYSBgdGFibGVBcHBlbmRhYmxlUm93c2AtYXR0cmlidXRlIHRvIHRoZSBgPG5nLXRlbXBsYXRlPmAtZWxlbWVudC4gQW55IGB0cmAgZWxlbWVudHMgdGhhdCBleGlzdCB3aXRoaW4gYDxuZy10ZW1wbGF0ZSB0YWJsZUFwcGVuZGFibGVSb3dzPmAgYW5kIGA8L25nLXRlbXBsYXRlPmAgdGFncyB3aWxsIGJlIHB1dCBiZWxvdyBkYXRhIHJvdydzIGB0cmAgZWxlbWVudCBpbiB0aGUgdGFibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIDwhLS0gY3VzdG9tIGFwcGVuZGVkIHJvd3MgLS0+XG4gKiA8bmctdGVtcGxhdGUgdGFibGVBcHBlbmRhYmxlUm93cyBsZXQtbXlEYXRhVmFyPVwiJGltcGxpY2l0XCIgbGV0LXN0YXR1cz1cIiRpbXBsaWNpdC5zdGF0dXNcIj5cbiAqICA8dHI+XG4gKiAgIDwhLS0gZmlyc3Qgcm93J3MgY29sdW1ucyAtLT5cbiAqICA8L3RyPlxuICogIDwhLS0gbW9yZSByb3dzIGlmIG5lZWRlZCAtLT5cbiAqIDwvbmctdGVtcGxhdGU+XG4gKlxuICogSWYgY3VzdG9tIHN0eWxpbmcgaXMgbmVlZGVkIGZvciBkYXRhIHJvdyB0aGF0IGhhcyBhcHBlbmRlZCByb3dzLCB5b3UgY2FuIHVzZSBkYXRhIGF0dHJpYnV0ZSBgZGF0YS1oYXNyb3dzcGFuYCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGRhdGEgcm93IHdpdGhvdXQgYXBwZW5kZWQgcm93cy5cbiAqIFlvdSBjYW4gcGFzcyB5b3VyIG93biBjdXN0b20gbWV0aG9kIHdpdGggY29uZGl0aW9uYWwgbG9naWMgdG8gZGVmaW5lIHdoYXQgdmFsdWUgd2lsbCBiZSBwYXNzZWQgdG8gZGF0YS1oYXNyb3dzcGFuLlxuICogSW4gYWRkaXRpb24sIGhhc1Jvd1NwYW4gZnVuY3Rpb24gYWNjZXB0cyBpdGVtIGZyb20gYEBJbnB1dCgpIHRhYmxlRGF0YWAgYXMgYXJndW1lbnQgd2hpY2ggaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB2YWx1ZSBwYXNzZWQgdG8gY29udGV4dCBgJGltcGxpY2l0YCB2YXJpYWJsZS5cbiAqIElNUE9SVEFOVDogdXNlIGFycm93IGZ1bmN0aW9uIHN0eWxlIGZvciBkZWZpbmluZyBmdW5jdGlvbiBpbnNpZGUgY29tcG9uZW50LCBpLmUuIGBoYXNSb3dTcGFuID0gKHZhbHVlKSA9PiBvdXRwdXQ7YC4gSWYgcmVndWxhciBmdW5jdGlvbiB3aWxsIGJlIGRlZmluZWQsIGkuZS4gYGhhc1Jvd1NwYW4odmFsdWUpIHsgcmV0dXJuIG91dHB1dDsgfWAsIGJpbmRpbmcgd2lsbCBub3Qgd29yay5cbiAqXG4gKiBAZXhhbXBsZVxuICogPCEtLSBpbnNpZGUgY29tcG9uZW50XG4gKiBjbGFzcyBDdXN0b21Db21wb25lbnQge1xuICogIGN1c3RvbUhhc1Jvd1NwYW5GdW5jdGlvbiA9IChpdGVtOiBDdXN0b21EYXRhVHlwZSkgPT4gaXRlbS5hcHBlbmRlZFJvd3NEYXRhLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XG4gKiB9XG4gKiAtLT5cbiAqIDwhLS0gaW5zaWRlIHN0eWxlc2hlZXRzXG4gKiBbZGF0YS1oYXNyb3dzcGFuPVwidHJ1ZVwiXSB7XG4gKiAgY29sb3I6IGJsdWU7XG4gKiB9XG4gKiAuYXBwZW5kZWQtcm93IHtcbiAqICBjb2xvcjogYmx1ZTtcbiAqIH1cbiAqIC0tPlxuICogPG5nZ3YtdGFibGUgW2hhc1Jvd1NwYW5dPVwiY3VzdG9tSGFzUm93U3BhbkZ1bmN0aW9uXCI+XG4gKiAgPCEtLSBjdXN0b20gYXBwZW5kZWQgcm93cyAtLT5cbiAqICA8bmctdGVtcGxhdGUgdGFibGVBcHBlbmRhYmxlUm93cyBsZXQtYXBwZW5kZWRSb3dzRGF0YT1cIiRpbXBsaWNpdC5hcHBlbmRlZFJvd3NEYXRhXCI+XG4gKiAgIDx0ciAqbmdGb3I9XCJsZXQgYXBwZW5kZWRSb3dJdGVtIG9mIGFwcGVuZGVkUm93c0RhdGFcIiBjbGFzcz1cImFwcGVuZGVkLXJvd1wiPlxuICogICAgPHRkPnt7IGFwcGVuZGVkUm93SXRlbSB9fTwvdGQ+XG4gKiAgICA8IS0tIG90aGVyIHJvdydzIGNvbHVtbnMgLS0+XG4gKiAgIDwvdHI+XG4gKiAgPC9uZy10ZW1wbGF0ZT5cbiAqIDwvbmdndi10YWJsZT5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgaXQgaXMgcG9zc2libGUgdG8gYWRkIGZvb3RlciBmb3IgdGhlIHRhYmxlLiBTaW1pbGFybHkgdG8gYWRkaW5nIGN1c3RvbSBjb2x1bW5zLCB1c2UgYDxuZy10ZW1wbGF0ZT5gLXRhZyBhbmQgcGxhY2UgdGhlIG5nLXRlbXBsYXRlIGluIHRoZSBodG1sIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmRpbmcgdGFnIG9mXG4gKiB0aGUgYDxuZ2d2LXRhYmxlPmAuIEFkZCBhIGB0YWJsZUZvb3RlcmAtYXR0cmlidXRlIHRvIHRoZSBgPG5nLXRlbXBsYXRlPmAtZWxlbWVudC4gQW55IGVsZW1lbnRzIHRoYXQgZXhpc3Qgd2l0aGluIGA8bmctdGVtcGxhdGUgdGFibGVGb290ZXI+YCBhbmQgYDwvbmctdGVtcGxhdGU+YCB0YWdzIHdpbGwgYmUgcHV0IHRvIHRmb290IGVsZW1lbnQgaW5zaWRlIHRoZSB0YWJsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogPCEtLSBmb3IgdGFibGUgZm9vdGVyIGkuZS4gdGZvb3QtZWxlbWVudCAtLT5cbiAqIDxuZy10ZW1wbGF0ZSB0YWJsZUZvb3Rlcj5cbiAqICA8dHI+XG4gKiAgIDwhLS0gZmlyc3Qgcm93J3MgY29sdW1ucyAtLT5cbiAqICA8L3RyPlxuICogIDwhLS0gbW9yZSByb3dzIGlmIG5lZWRlZCAtLT5cbiAqIDwvbmctdGVtcGxhdGU+XG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ2d2LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIFRhYmxlUm93PlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEN1c3RvbSB0ZW1wbGF0ZXMgZGVmaW5lZCBpbiB0aGUgaHRtbC5cbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFibGVUZW1wbGF0ZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBjdXN0b21UZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGFibGVUZW1wbGF0ZURpcmVjdGl2ZTxrZXlvZiBUPj5cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEN1c3RvbSBhcHBlbmRlZCByb3dzIHRlbXBsYXRlIGRlZmluZWQgaW4gdGhlIGh0bWwuXG4gICAqL1xuICBAQ29udGVudENoaWxkKFRhYmxlQXBwZW5kYWJsZVJvd3NUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgYXBwZW5kZWRSb3dzVGVtcGxhdGUhOiBUYWJsZUFwcGVuZGFibGVSb3dzVGVtcGxhdGVEaXJlY3RpdmVcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEN1c3RvbSBmb290ZXIgdGVtcGxhdGUgZGVmaW5lZCBpbiB0aGUgaHRtbC5cbiAgICovXG4gIEBDb250ZW50Q2hpbGQoVGFibGVGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgY3VzdG9tRm9vdGVyVGVtcGxhdGUhOiBUYWJsZUZvb3RlclRlbXBsYXRlRGlyZWN0aXZlXG5cbiAgLyoqIEVtaXRzIHRoZSB0YWJsZSByb3cgdGhhdCB3YXMgY2xpY2tlZC4gV29ya3Mgb24gYWxsIGNvbHVtbnMgaWYgbm90IHByZXZlbnREZWZhdWx0RW1pdCBpcyBzZXQgZm9yIHRoYXQgY29sdW1uLiAqL1xuICBAT3V0cHV0KCkgbmd2Um93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFQgfCBhbnk+KClcblxuICAvKipcbiAgICogRW1pdHMgY3VycmVudGx5IHNlbGVjdGVkIGFuZCBkZXNlbGVjdGVkIGl0ZW1zIGluIHRoZSB0YWJsZSBhcyBrZXktdmFsdWUgcGFpcnMuXG4gICAqIFVzZXMgZWFjaCBpdGVtYHMgaXRlbUlkIGFzIGtleSwgYW5kIGEgYm9vbGVhbiB2YWx1ZSB0byBkZXNjcmliZSBzZWxlY3RlZCBzdGF0dXMuXG4gICAqL1xuICBAT3V0cHV0KCkgbmd2Um93U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKVxuXG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCB0byBzaWduYWwgdGhhdCB0aGUgdGFibGUgc2hvdWxkIGJlIHJlb3JkZXJlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBuZ3ZPcmRlckJ5ID0gbmV3IEV2ZW50RW1pdHRlcjxPcmRlckJ5PFQ+PigpXG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGl0ZW1zIGRlc2NyaWJpbmcgaG93IHRoZSB0YWJsZSBoZWFkZXIgc2hvdWxkIGJlIHJlbmRlcmVkLFxuICAgKiB0b2dldGhlciB3aXRoIGluc3RydWN0aW9ucyBmb3IgaG93IGVhY2ggcm93IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhhdCBjb2x1bW4uXG4gICAqL1xuICBASW5wdXQoKSB0YWJsZUNvbHVtbnMhOiBUYWJsZUNvbHVtbjxUPltdXG5cbiAgLyoqIERhdGEgYXJyYXkgdG8gZGlzcGxheSBkYXRhIGluIHRoZSB0YWJsZS4gRWFjaCBpdGVtIDxUPiBpbiB0aGUgYXJyYXkgcmVwcmVzZW50cyBhIHJvdyBpbiB0aGUgdGFibGUuICovXG4gIEBJbnB1dCgpIHRhYmxlRGF0YSE6IFRbXVxuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBuYW1lIHVzZWQgdG8gdW5pcXVlbHkgZGVzY3JpYmUgZWFjaCBpdGVtIChpLmUuIHJvdykgaW4gdGhlIGRhdGEgdGFibGUuXG4gICAqIERlZmF1bHRzIHRvIFxcJ2lkXFwnLlxuICAgKiBJcyByZXF1aXJlZCBpZiBzZWxlY3RhYmxlIGlzIHRydWUuXG4gICAqL1xuICBASW5wdXQoKSByb3dJZCA9ICdpZCdcblxuICAvKipcbiAgICogRnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgaXMgdXNlZCBmb3IgZGF0YSBhdHRyaWJ1dGUgXFwnZGF0YS1oYXNyb3dzcGFuXFwnLlxuICAgKiBJZiBjdXN0b20gaGFzUm93U3BhbiBmdW5jdGlvbiBpcyBub3QgcGFzc2VkIHRvIHRoZSB0YWJsZSxcbiAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdW5kZWZpbmVkIHZhbHVlIGJ5IGRlZmF1bHQgd2hpY2ggcmVzdWx0cyBpbiBcXCdkYXRhLWhhc3Jvd3NwYW5cXCcgYXR0cmlidXRlIGJlaW5nIG9taXR0ZWQgaW4gaHRtbFxuICAgKiAoYW5ndWxhciBvbWl0cyBhdHRyaWJ1dGVzIHRoYXQgY29udGFpbiBudWxsIG9yIHVuZGVmaW5lZCB2YWx1ZSkuXG4gICAqIElNUE9SVEFOVDogdXNlIGFycm93IGZ1bmN0aW9uIHN0eWxlIGZvciBkZWZpbmluZyBmdW5jdGlvbiBpbnNpZGUgY29tcG9uZW50LCBpLmUuIGBoYXNSb3dTcGFuID0gKHZhbHVlKSA9PiBvdXRwdXQ7YC4gSWYgcmVndWxhciBmdW5jdGlvbiB3aWxsIGJlIGRlZmluZWQsIGkuZS4gYGhhc1Jvd1NwYW4odmFsdWUpIHsgcmV0dXJuIG91dHB1dDsgfWAsIGJpbmRpbmcgd2lsbCBub3Qgd29yay5cbiAgICovXG4gIEBJbnB1dCgpIGhhc1Jvd1NwYW46IChpdGVtOiBUKSA9PiBhbnkgPSAoXykgPT4gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIGxlZnQtc2lkZSBjaGVja2JveCBjb2x1bW4uXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RhYmxlID0gdHJ1ZVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGVuYWJsZS9kaXNhYmxlIGV4cGFuZGFibGUgcm93cy5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlID0gZmFsc2VcblxuICAvKipcbiAgKiBQcm9wZXJ0eSBuYW1lIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHN1Ykl0ZW1zIGluIHRoZSBkYXRhIHRhYmxlLlxuICAqL1xuICBASW5wdXQoKSBzdWJJdGVtc1Byb3AgPSAnc3ViSXRlbXMnXG5cbiAgLyoqXG4gICAqIEFsbG93IG5nZ3YtdGFibGUgdG8gYXR0ZW1wdCBzb3J0aW5nIHRoZSBkYXRhIGluIHRoZSB0YWJsZS4gTm90IHJlY29tbWVuZGVkIGlmIG9ubHkgYSBzdWJzZXQgaXMgbG9hZGVkIG9yIGlmIHRoZSBkYXRhc2V0IGlzIHZlcnkgbGFyZ2UuXG4gICAqIERpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd0xvY2FsU29ydCA9IGZhbHNlXG5cbiAgLyoqIFNwZWNpYWwgcHJvcGVydHkgdXNlZCBmb3Igc2VsZWN0aW5nIERPTSBlbGVtZW50cyBkdXJpbmcgYXV0b21hdGVkIFVJIHRlc3RpbmcuICovXG4gIEBJbnB1dCgpIHRob29rID0gJ3RhYmxlLXNlbGVjdC1hbGwnXG5cbiAgLyoqIEZ1bmN0aW9uIHRvIG92ZXJ3cml0ZSBnZW5lcmF0ZWQgdGhvb2sgZm9yIGVhY2ggcm93LiAqL1xuICBASW5wdXQoKSB0clRob29rRm4/OiAoaXRlbTogVCkgPT4gc3RyaW5nXG5cbiAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSBjaGVja2JveCBpbiB0aGUgdGFibGUgaGVhZGVyICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbENoZWNrYm94VGg/OiBzdHJpbmdcblxuICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlIGNoZWNrYm94IGluIHRoZSB0YWJsZSBoZWFkZXIgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsQ2hlY2tib3hUcj86IHN0cmluZ1xuXG4gIC8qKiBBcmlhIGxhYmVscyBmb3Igc29ydGluZyBpbiB0aGUgdGFibGUgaGVhZGVyICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbHNPcmRlckJ5PzogYXJpYUxhYmVsc09yZGVyQnlcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEludGVybmFsIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhZGRlZCBjb250ZW50IHRlbXBsYXRlcyB1c2VkIGluIHRkIGVsZW1lbnRzLlxuICAgKi9cbiAgY3VzdG9tUm93VGVtcGxhdGVzID0gbmV3IE1hcDxrZXlvZiBULCBUZW1wbGF0ZVJlZjxhbnk+PigpXG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYWRkZWQgY29udGVudCB0ZW1wbGF0ZXMgdXNlZCBpbiB0aCBlbGVtZW50cy5cbiAgICovXG4gIGN1c3RvbUhlYWRlclRlbXBsYXRlcyA9IG5ldyBNYXA8a2V5b2YgVCwgVGVtcGxhdGVSZWY8YW55Pj4oKVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGN1c3RvbSBhcHBlbmRlZCByb3dzIGkuZS4gdHIgZWxlbWVudHMgKHJvd3MpLlxuICAgKi9cbiAgYXBwZW5kZWRSb3dzVGVtcGxhdGVSZWYhOiBUZW1wbGF0ZVJlZjxhbnk+XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGZvb3QgZWxlbWVudCBjaGlsZHJlbiBpLmUuIHRyIGVsZW1lbnRzIChyb3dzKS5cbiAgICovXG4gIGN1c3RvbUZvb3RlclRlbXBsYXRlUmVmITogVGVtcGxhdGVSZWY8YW55PlxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogSW5jcmVtZW50YWwgaWQuXG4gICAqL1xuICBpbml0SWQhOiBudW1iZXJcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEZvcm1Hcm91cCBjb250YWluaW5nIGFsbCByb3cgaWRcXCdzIGFzIGNvbnRyb2xzLCBhbmQgd2hldGhlciB0aGVzZSBhcmUgc2VsZWN0ZWQgb3Igbm90IGFzIHZhbHVlcy5cbiAgICovXG4gIHJvd1NlbGVjdG9yczogVW50eXBlZEZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogTWFzdGVyIHNlbGVjdG9yIGZvciBzZWxlY3Rpbmcgb3IgZGVzZWxlY3RpbmcgYWxsIHJvdyBzZWxlY3RvcnMuXG4gICAqL1xuICBncm91cFNlbGVjdG9yOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKGZhbHNlKVxuXG4gIHByaXZhdGUgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gW11cbiAgcHJpdmF0ZSBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIFVwZGF0ZSBzZWxlY3RhYmxlIG9yIGV4cGFuZGFibGUgcm93cyBpZiB0YWJsZSBkYXRhIG9yIHNldHRpbmdzIGNoYW5nZVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbGVjdGFibGUgfHwgdGhpcy5leHBhbmRhYmxlKSAmJiBjaGFuZ2VzLnRhYmxlRGF0YT8uY3VycmVudFZhbHVlIHx8XG4gICAgICAoY2hhbmdlcy5zZWxlY3RhYmxlPy5jdXJyZW50VmFsdWUgfHwgY2hhbmdlcy5leHBhbmRhYmxlPy5jdXJyZW50VmFsdWUpICYmIHRoaXMudGFibGVEYXRhXG4gICAgKSB7XG4gICAgICBjb25zdCB3YXNDaGFuZ2VkID0gdGhpcy5yZWdpc3RlclNlbGVjdGFibGVSb3dzKFxuICAgICAgICBjaGFuZ2VzLnRhYmxlRGF0YS5jdXJyZW50VmFsdWUsXG4gICAgICApXG4gICAgICBpZiAod2FzQ2hhbmdlZCAmJiAhdGhpcy5zdWJzLmxlbmd0aCkge1xuICAgICAgICAvLyBmaXJzdCB0aW1lIHRoaXMgaXMgcnVuXG4gICAgICAgIGNvbnN0IGdyb3VwU2VsZWN0b3JTdWIgPSB0aGlzLmdyb3VwVmFsdWVTdWJzY3JpcHRpb25cbiAgICAgICAgY29uc3Qgcm93U2VsZWN0b3JTdWIgPSB0aGlzLnJvd1ZhbHVlU3Vic2NyaXB0aW9uXG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKGdyb3VwU2VsZWN0b3JTdWIsIHJvd1NlbGVjdG9yU3ViKVxuICAgICAgfSBlbHNlIGlmICh3YXNDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMucm93U2VsZWN0b3JzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNvcnQgYW55IGluY29taW5nIGRhdGFcbiAgICBpZiAoXG4gICAgICB0aGlzLmFsbG93TG9jYWxTb3J0ICYmXG4gICAgICAoY2hhbmdlcy50YWJsZURhdGE/LmN1cnJlbnRWYWx1ZSB8fCBjaGFuZ2VzLnRhYmxlQ29sdW1ucz8uY3VycmVudFZhbHVlKVxuICAgICkge1xuICAgICAgY29uc3Qgb3JkZXJlZEJ5Q29sdW1uOiBUYWJsZUNvbHVtbjxUPiB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRoaXMudGFibGVDb2x1bW5zPy5maW5kKChlbCkgPT4gZWwub3JkZXIgIT09IHVuZGVmaW5lZClcbiAgICAgIGlmIChvcmRlcmVkQnlDb2x1bW4pIHRoaXMuc29ydEl0ZW1zQnkob3JkZXJlZEJ5Q29sdW1uKVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdElkID0gc3RhdGljSW5pdElkKytcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAvLyBpZiBhbnkgY3VzdG9tIHRlbXBsYXRlcyB3ZXJlIGRlZmluZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAgaWYgKHRoaXMuY3VzdG9tVGVtcGxhdGVzLmxlbmd0aCkge1xuICAgICAgLy8gZm9yIGVhY2ggdGVtcGxhdGUgZm91bmRcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLm1hcCgodGFibGVUZW1wbGF0ZSkgPT4ge1xuICAgICAgICAvLyBpZiB0YXJnZXQgaXMgZWl0aGVyICd0ZCcgb3IgJ2JvdGgnXG4gICAgICAgIGlmIChcbiAgICAgICAgICBbJ3RkJywgJ2JvdGgnXS5pbmNsdWRlcyh0YWJsZVRlbXBsYXRlLnRhYmxlQ29sdW1uVGFyZ2V0IGFzIHN0cmluZylcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYWRkIHRvIGN1c3RvbSByb3cgdGVtcGxhdGVzXG4gICAgICAgICAgdGhpcy5jdXN0b21Sb3dUZW1wbGF0ZXMuc2V0KFxuICAgICAgICAgICAgdGFibGVUZW1wbGF0ZS50YWJsZUNvbHVtbixcbiAgICAgICAgICAgIHRhYmxlVGVtcGxhdGUudGVtcGxhdGVSZWYsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHRhcmdldCBpcyBlaXRoZXIgJ3RoJyBvciAnYm90aCdcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFsndGgnLCAnYm90aCddLmluY2x1ZGVzKHRhYmxlVGVtcGxhdGUudGFibGVDb2x1bW5UYXJnZXQgYXMgc3RyaW5nKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBhZGQgdG8gY3VzdG9tIGhlYWRlciB0ZW1wbGF0ZXNcbiAgICAgICAgICB0aGlzLmN1c3RvbUhlYWRlclRlbXBsYXRlcy5zZXQoXG4gICAgICAgICAgICB0YWJsZVRlbXBsYXRlLnRhYmxlQ29sdW1uLFxuICAgICAgICAgICAgdGFibGVUZW1wbGF0ZS50ZW1wbGF0ZVJlZixcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gaWYgYXBwZW5kZWQgcm93cycgdGVtcGxhdGUgaXMgZGVmaW5lZCBpbiB0aGUgdGVtcGxhdGVcbiAgICBpZiAodGhpcy5hcHBlbmRlZFJvd3NUZW1wbGF0ZSkge1xuICAgICAgLy8gc2V0IHRlbXBsYXRlUmVmIG9mIGFwcGVuZGVkIHJvd3MnIHRlbXBsYXRlIHRvIHZhcmlhYmxlXG4gICAgICB0aGlzLmFwcGVuZGVkUm93c1RlbXBsYXRlUmVmID0gdGhpcy5hcHBlbmRlZFJvd3NUZW1wbGF0ZS50ZW1wbGF0ZVJlZlxuICAgIH1cblxuICAgIC8vIGlmIGN1c3RvbSBmb290ZXIgdGVtcGxhdGUgaXMgZGVmaW5lZCBpbiB0aGUgdGVtcGxhdGVcbiAgICBpZiAodGhpcy5jdXN0b21Gb290ZXJUZW1wbGF0ZSkge1xuICAgICAgLy8gc2V0IHRlbXBsYXRlUmVmIG9mIHRhYmxlIGZvb3RlciB0byB2YXJpYWJsZVxuICAgICAgdGhpcy5jdXN0b21Gb290ZXJUZW1wbGF0ZVJlZiA9IHRoaXMuY3VzdG9tRm9vdGVyVGVtcGxhdGUudGVtcGxhdGVSZWZcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogUmV0dXJucyBhIHN1YnNjcmlwdGlvbiB0byB0aGUgbWFzdGVyIHNlbGVjdG9yIGNvbnRyb2wgdGhhdCBlaXRoZXIgc2VsZWN0cyBvciBkZXNlbGVjdHMgYWxsIHJvdyBjb250cm9scy5cbiAgICovXG4gIGdldCBncm91cFZhbHVlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBTZWxlY3Rvci52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RNYXAgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHRoaXMucm93U2VsZWN0b3JzVmFsdWUpKVxuICAgICAgICBzZWxlY3RNYXAuZm9yRWFjaCgoXywga2V5KSA9PiBzZWxlY3RNYXAuc2V0KGtleSwgdmFsdWUpKVxuICAgICAgICBjb25zdCBwYXRjaFZhbHVlID0gb2JqZWN0RnJvbUVudHJpZXMoc2VsZWN0TWFwKVxuICAgICAgICB0aGlzLnJvd1NlbGVjdG9ycy5wYXRjaFZhbHVlKHBhdGNoVmFsdWUpXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFJldHVybnMgYSBzdWJzY3JpcHRpb24gdG8gYWxsIGluZGl2aWR1YWwgcm93IHNlbGVjdG9ycyBhbmQgdXBkYXRlIHRoZSBtYXN0ZXIgc2VsZWN0b3IgaWYgYWxsIGFyZSBzZWxlY3RlZC5cbiAgICovXG4gIGdldCByb3dWYWx1ZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdG9ycy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCksIC8vIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZXZlbnRzIGFuZCB0byB3YWl0IGZvciBhbGwgc3ViIGNvbnRyb2xzIHRvIHVwZGF0ZVxuICAgICAgICBtYXAoKHZhbDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0pID0+IHtcbiAgICAgICAgICAvLyBnZXQgYSBmaWx0ZXJlZCBhcnJheSBvZiBrZXlzIGZvciBhbGwgcm93cyB0aGF0IGFyZSBzZWxlY3RlZFxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gT2JqZWN0LmtleXModmFsKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbFtrZXldID09PSB0cnVlICYmIHRoaXMucm93U2VsZWN0b3JzLmdldChrZXkpPy5lbmFibGVkXG4gICAgICAgICAgfSlcbiAgICAgICAgICAvLyByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIG9ubHkgdGhlIGZpbHRlcmVkIGtleXNcbiAgICAgICAgICByZXR1cm4gcGljayhzZWxlY3RlZCwgdmFsKVxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAodmFsdWU6IG9iamVjdCkgPT4ge1xuICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQga2V5cyBjb21wYXJlZCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGtleXMgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgbnVtYmVyT2ZTZWxlY3RlZCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGhcbiAgICAgICAgICBjb25zdCBhbGxTZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgICBudW1iZXJPZlNlbGVjdGVkID4gMFxuICAgICAgICAgICAgICA/IG51bWJlck9mU2VsZWN0ZWQgPT09IE9iamVjdC5rZXlzKHRoaXMucm93U2VsZWN0b3JzVmFsdWUpLmxlbmd0aFxuICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBtYXN0ZXIgc2VsZWN0b3IgY29udHJvbFxuICAgICAgICAgIHRoaXMuZ3JvdXBTZWxlY3Rvci5zZXRWYWx1ZShhbGxTZWxlY3RlZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaWQnc1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBPYmplY3Qua2V5cyh2YWx1ZSlcbiAgICAgICAgICAvLyBhbmQgZW1pdCB0aGUgdXBkYXRlZCB2YWx1ZVxuICAgICAgICAgIHRoaXMubmd2Um93U2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZClcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFJlZ2lzdGVycyBvciBkaXNhYmxlcyByb3cgY29udHJvbHMgZm9yIG5ldyBvciByZW1vdmVkIHJvd3MuXG4gICAqL1xuICByZWdpc3RlclNlbGVjdGFibGVSb3dzKHRhYmxlRGF0YTogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIXRhYmxlRGF0YSkgcmV0dXJuIGZhbHNlXG4gICAgLy8gQXJyYXkgY29udGFpbmluZyBvbmx5IHRoZSBpZCdzIGZvciBlYWNoIHJvd1xuICAgIGNvbnN0IGRhdGFSb3dJZHM6IHN0cmluZ1tdID0gdGFibGVEYXRhLm1hcCgoZGF0YTogYW55KSA9PiBkYXRhW3RoaXMucm93SWRdKVxuXG4gICAgLy8gQXJyYXkgY29udGFpbmluZyB0aGUgaWQncyB0aGF0IGhhdmUgcmVnaXN0ZXJlZCBjb250cm9sc1xuICAgIGNvbnN0IGN1cnJlbnRJZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy5yb3dTZWxlY3RvcnNWYWx1ZSlcblxuICAgIC8vIEFycmF5IGNvbnRhaW5pbmcgYWxsIGlkcyB0aGF0IGxhY2tzIGEgY29ycmVzcG9uZGluZyBjb250cm9sIChpLmUuIG5ldyByb3dzKVxuICAgIGNvbnN0IG5ld0lkczogc3RyaW5nW10gPSBkYXRhUm93SWRzLmZpbHRlcihcbiAgICAgIChpZCkgPT4gY3VycmVudElkcy5pbmRleE9mKGlkKSA9PT0gLTEsXG4gICAgKVxuXG4gICAgLy8gQXJyYXkgY29udGFpbmluZyBhbGwgaWRzIHRoYXQgaGFzIGEgY29udHJvbCBidXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBkYXRhIHNldCAoaS5lLiByZW1vdmVkIHJvd3MpXG4gICAgY29uc3QgcmVtb3ZlZElkczogc3RyaW5nW10gPSBjdXJyZW50SWRzLmZpbHRlcihcbiAgICAgIChpZCkgPT4gZGF0YVJvd0lkcy5pbmRleE9mKGlkKSA9PT0gLTEsXG4gICAgKVxuXG4gICAgLy8gUmVnaXN0ZXIgbmV3IGNvbnRyb2xzIGZvciBhZGRlZCByb3dzXG4gICAgaWYgKG5ld0lkcy5sZW5ndGgpIHtcbiAgICAgIG5ld0lkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCBjdHJsID0gdGhpcy5yb3dTZWxlY3RvcnMucmVnaXN0ZXJDb250cm9sKFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZmFsc2UpLFxuICAgICAgICApXG4gICAgICAgIGlmIChjdHJsLmRpc2FibGVkKSBjdHJsLmVuYWJsZSgpXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIFNldCBhbHJlYWR5IHJlZ2lzdGVyZWQgY29udHJvbHMgdG8gZGlzYWJsZWQgZm9yIHJlbW92ZWQgcm93c1xuICAgIGlmIChyZW1vdmVkSWRzLmxlbmd0aClcbiAgICAgIHJlbW92ZWRJZHMuZm9yRWFjaCgoaWQpID0+IHRoaXMucm93U2VsZWN0b3JzLmdldChpZCk/LmRpc2FibGUoKSlcblxuICAgIHJldHVybiBuZXdJZHMubGVuZ3RoID4gMCB8fCByZW1vdmVkSWRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogUmV0dXJucyBhbGwgZW5hYmxlZCB2YWx1ZXMgdW5sZXNzIGFsbCByb3dzIGFyZSBkaXNhYmxlZC5cbiAgICovXG4gIGdldCByb3dTZWxlY3RvcnNWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdG9ycy5lbmFibGVkID8gdGhpcy5yb3dTZWxlY3RvcnMudmFsdWUgOiB7fVxuICB9XG5cbiAgdG9nZ2xlU29ydE9yZGVyV2l0aFNwYWNlKGV2ZW50OiBhbnksIGNvbHVtbjogVGFibGVDb2x1bW48VD4pIHtcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB0aGlzLnRvZ2dsZVNvcnRPcmRlcihjb2x1bW4pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBTd2l0Y2hlcyBzb3J0aW5nIG9yZGVyIGJldHdlZW4gYXNjZW5kaW5nIGFuZCBkZXNjZW5kaW5nIG9yZGVyIGZvciBhIGNvbHVtbi5cbiAgICogQHBhcmFtIGNvbHVtbiB0aGUgY29sdW1uIHRvIHNvcnQgcm93cyBhZnRlci5cbiAgICovXG4gIHRvZ2dsZVNvcnRPcmRlcihjb2x1bW46IFRhYmxlQ29sdW1uPFQ+KSB7XG4gICAgLy8gY2hlY2sgaWYgdGhlIHRhYmxlIGlzIGFscmVhZHkgc29ydGVkIGJ5IGFub3RoZXIgY29sdW1uIHRoYW4gdGhlIG9uZSBwcm92aWRlZFxuICAgIGNvbnN0IGN1cnJlbnRseU9yZGVyZWRCeSA9IHRoaXMudGFibGVDb2x1bW5zPy5maW5kKFxuICAgICAgKGVsKSA9PiBlbCAhPT0gY29sdW1uICYmIGVsLm9yZGVyICE9PSB1bmRlZmluZWQsXG4gICAgKVxuICAgIGlmIChjdXJyZW50bHlPcmRlcmVkQnkpIGRlbGV0ZSBjdXJyZW50bHlPcmRlcmVkQnkub3JkZXJcbiAgICBjb2x1bW4ub3JkZXIgPSBjb2x1bW4ub3JkZXIgPT09ICdkZXNjJyA/ICdhc2MnIDogJ2Rlc2MnXG4gICAgdGhpcy5zb3J0SXRlbXNCeShjb2x1bW4pXG4gIH1cblxuICAvKiogSWYgc29ydGFibGUsIHJlb3JkZXJzIHRoZSB0YWJsZSBkYXRhIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29sdW1uIGFzIG9yZGVyaW5nIGF0dHJpYnV0ZS4gKi9cbiAgc29ydEl0ZW1zQnkoY29sdW1uOiBUYWJsZUNvbHVtbjxUPik6IFRhYmxlUm93W10gfCB1bmRlZmluZWQge1xuICAgIGlmICghY29sdW1uLnNvcnRhYmxlKSByZXR1cm5cbiAgICAvLyBlbWl0IHJlLW9yZGVyIGV2ZW50XG4gICAgdGhpcy5uZ3ZPcmRlckJ5LmVtaXQoeyBwcm9wZXJ0eTogY29sdW1uLnByb3BlcnR5LCBvcmRlcjogY29sdW1uLm9yZGVyIH0pXG4gICAgLy8gaWYgbG9jYWwgc29ydCBpcyBhbGxvd2VkLCByZW9yZGVyIGRhdGFcbiAgICBpZiAoIXRoaXMuYWxsb3dMb2NhbFNvcnQgfHwgIXRoaXMudGFibGVEYXRhKSByZXR1cm5cbiAgICByZXR1cm4gdGhpcy50YWJsZURhdGEuc29ydChcbiAgICAgIGNvbHVtbi5vcmRlciA9PT0gJ2Rlc2MnXG4gICAgICAgID8gb3JkZXJCeURlc2NlbmRpbmcoY29sdW1uLnByb3BlcnR5KVxuICAgICAgICA6IG9yZGVyQnlBc2NlbmRpbmcoY29sdW1uLnByb3BlcnR5KSxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEVtaXRzIHJvdyBkYXRhIGZvciB3aGF0IHJvdyB3YXMgY2xpY2tlZCBpZiBkZWZhdWx0RW1pdCBpcyBhbGxvd2VkLlxuICAgKi9cbiAgcHJvcGFnYXRlSXRlbUNsaWNrKGl0ZW06IGFueSwgcHJldmVudERlZmF1bHRFbWl0PzogYm9vbGVhbikge1xuICAgIGlmICghcHJldmVudERlZmF1bHRFbWl0KSB0aGlzLm5ndlJvd0NsaWNrLmVtaXQoaXRlbSlcbiAgICBpZiAodGhpcy5leHBhbmRhYmxlKSB0aGlzLnRvZ2dsZVJvd1RvRXhwYW5kKGl0ZW1bdGhpcy5yb3dJZF0pXG4gIH1cblxuICBnZXRBcmlhTGFiZWwoY29sdW1uOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc29ydE9yZGVyID1cbiAgICAgIGNvbHVtbi5vcmRlciA9PT0gJ2FzYydcbiAgICAgICAgPyB0aGlzLmFyaWFMYWJlbHNPcmRlckJ5Py5kZXNjXG4gICAgICAgIDogdGhpcy5hcmlhTGFiZWxzT3JkZXJCeT8uYXNjXG4gICAgaWYgKCFzb3J0T3JkZXIpIHJldHVybiAvLyBubyBhcmlhIGxhYmVscyBkZWZpbmVkXG4gICAgcmV0dXJuIGNvbHVtbi5hcmlhTGFiZWxTb3J0YWJsZT8ucmVwbGFjZSgne3tzb3J0T3JkZXJ9fScsIHNvcnRPcmRlcilcbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlUm93VG9FeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMucm93U2VsZWN0b3JzLmdldChpZClcbiAgICByb3c/LnNldFZhbHVlKCFyb3cudmFsdWUpXG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjc29ydGFibGVUaFRlbXBsYXRlIGxldC1jb2x1bW4+XG4gIDxidXR0b24gY2xhc3M9XCJzZy10YWJsZS1zb3J0XCIgKnRyYW5zbG9jbz1cImxldCB0XCI+XG4gICAgPG5nLXRlbXBsYXRlICN0aEJ1dHRvblRlbXBsYXRlPlxuICAgICAge3sgdChjb2x1bW4ubGFiZWwgPz8gJycpIH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBjdXN0b21IZWFkZXJUZW1wbGF0ZXMuZ2V0KGNvbHVtbi5wcm9wZXJ0eSkgYXMgdGhUZW1wbGF0ZTtcbiAgICAgICAgZWxzZSB0aEJ1dHRvblRlbXBsYXRlXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRoVGVtcGxhdGUgfHwgbnVsbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGNvbHVtbiB9XCJcbiAgICAgID5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub3RTb3J0YWJsZVRoVGVtcGxhdGUgbGV0LWNvbHVtbj5cbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGhUZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyICp0cmFuc2xvY289XCJsZXQgdFwiPlxuICAgICAge3sgdChjb2x1bW4ubGFiZWwgPz8gJycpIH19XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cIlxuICAgICAgY3VzdG9tSGVhZGVyVGVtcGxhdGVzLmdldChjb2x1bW4ucHJvcGVydHkpIGFzIHRoVGVtcGxhdGU7XG4gICAgICBlbHNlIGRlZmF1bHRUaFRlbXBsYXRlXG4gICAgXCJcbiAgPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aFRlbXBsYXRlIHx8IG51bGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4gfVwiXG4gICAgPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPHRhYmxlIGNsYXNzPVwiZ2RzLXRhYmxlXCIgKnRyYW5zbG9jbz1cImxldCB0XCI+XG4gIDwhLS0gVGFibGUgaGVhZGVyIC0tPlxuICA8dGhlYWQ+XG4gICAgPHRyPlxuICAgICAgPCEtLSBDaGVja2JveCBjb2x1bW4gZm9yIGhlYWRlciAtLT5cbiAgICAgIDx0aCAqbmdJZj1cInNlbGVjdGFibGVcIiBjbGFzcz1cImNvbHVtbl9fY2hlY2tcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdkcy1maWVsZC1jaGVja2JveC13cmFwXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdyb3VwU2VsZWN0b3JcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxDaGVja2JveFRoXCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cIidjYl9oZWFkZXJfXycgKyBpbml0SWRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10aG9va109XCJ0aG9va1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bGFiZWwgW2F0dHIuZm9yXT1cIidjYl9oZWFkZXJfXycgKyBpbml0SWRcIj48L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGg+XG5cbiAgICAgIDwhLS0gT3RoZXIgY29sdW1ucyAtLT5cbiAgICAgIDx0aFxuICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHRhYmxlQ29sdW1uc1wiXG4gICAgICAgIFtjb2x1bW5UeXBlXT1cImNvbHVtbi52YWx1ZVR5cGVcIlxuICAgICAgICBbc29ydGFibGVdPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgW3NvcnRPcmRlcl09XCJjb2x1bW4ub3JkZXJcIlxuICAgICAgICBbdGhvb2tdPVwiJ2NvbHVtbi1oZWFkZXItJyArICEhY29sdW1uLnByb3BlcnR5XCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNvcnRPcmRlcihjb2x1bW4pXCJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwidG9nZ2xlU29ydE9yZGVyV2l0aFNwYWNlKCRldmVudCwgY29sdW1uKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0QXJpYUxhYmVsKGNvbHVtbilcIlxuICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiY29sdW1uLm9yZGVyICsgJ2VuZGluZydcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgc29ydGFibGVUaFRlbXBsYXRlO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogY29sdW1uLCBjb2x1bW46IGNvbHVtbiB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLnNvcnRhYmxlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgbm90U29ydGFibGVUaFRlbXBsYXRlO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogY29sdW1uLCBjb2x1bW46IGNvbHVtbiB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RoPlxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG5cbiAgPCEtLSBUYWJsZSBib2R5IC0tPlxuICA8dGJvZHkgW2Zvcm1Hcm91cF09XCJyb3dTZWxlY3RvcnNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHRhYmxlRGF0YTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPHRyXG4gICAgICAgIFtjbGFzcy5yb3dfX2V4cGFuZF09XCJleHBhbmRhYmxlXCJcbiAgICAgICAgW2F0dHIuZGF0YS10aG9va109XCJpdGVtIHwgdHJUaG9vazogaSA6IHRyVGhvb2tGblwiXG4gICAgICAgIFthdHRyLmRhdGEtaGFzcm93c3Bhbl09XCJoYXNSb3dTcGFuKGl0ZW0pXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBDaGVja2JveCBjb2x1bW4gZm9yIHJvdyAtLT5cbiAgICAgICAgPHRkICpuZ0lmPVwic2VsZWN0YWJsZVwiIGNsYXNzPVwiY29sdW1uX19jaGVja1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZHMtZmllbGQtY2hlY2tib3gtd3JhcFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICpuZ0lmPVwicm93U2VsZWN0b3JzLmdldChpdGVtW3Jvd0lkXSlcIlxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW1bcm93SWRdXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxDaGVja2JveFRyXCJcbiAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2NiX3Jvd19fJyArIGluaXRJZCArICdfJyArIGlcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRob29rXT1cIidyb3ctc2VsZWN0LScgKyBpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWwgW2F0dHIuZm9yXT1cIidjYl9yb3dfXycgKyBpbml0SWQgKyAnXycgKyBpXCI+PC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cblxuICAgICAgICA8IS0tIE90aGVyIGNvbHVtbnMgLS0+XG4gICAgICAgIDx0ZFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdGFibGVDb2x1bW5zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2x1bW4udmFsdWVUeXBlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiaXRlbVtjb2x1bW4ucHJvcGVydHldXCJcbiAgICAgICAgICAoY2xpY2spPVwicHJvcGFnYXRlSXRlbUNsaWNrKGl0ZW0sIGNvbHVtbi5wcmV2ZW50RGVmYXVsdENsaWNrRXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleHBhbmRhYmxlICYmIGkgPT09IDA7IGVsc2Ugbm9uRXhwYW5kYWJsZVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2RzLWl0ZW0tZmllbGQtd3JhcFwiPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hldnJvbi1maWVsZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyb3dTZWxlY3RvcnMuZ2V0KGl0ZW1bcm93SWRdKS52YWx1ZVwiPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnN1Ykl0ZW1zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMjAgOUwxMiAxN0w0IDlcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMi42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbHVtbi5wcm9wZXJ0eV0gfX0gKHt7IGl0ZW0uc3ViSXRlbXMubGVuZ3RoIH19KVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkV4cGFuZGFibGVUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21Sb3dUZW1wbGF0ZXMuZ2V0KGNvbHVtbi5wcm9wZXJ0eSkgYXMgdGRUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0VGRUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRkVGVtcGxhdGU+XG4gICAgICAgICAgICAgIHt7IGl0ZW1bY29sdW1uLnByb3BlcnR5XSB9fVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cblxuICAgICAgPCEtLSBFeHBhbmRlZCBTdWIgSXRlbXMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhwYW5kYWJsZSAmJiByb3dTZWxlY3RvcnMuZ2V0KGl0ZW1bcm93SWRdKS52YWx1ZVwiPlxuICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHN1Ykl0ZW0gb2YgaXRlbVtzdWJJdGVtc1Byb3BdXCI+XG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHRhYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2x1bW4udmFsdWVUeXBlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzdWJJdGVtW2NvbHVtbi5wcm9wZXJ0eV1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZHMtc3ViLWl0ZW0tZmllbGQtd3JhcFwiPlxuICAgICAgICAgICAgICB7eyBzdWJJdGVtW2NvbHVtbi5wcm9wZXJ0eV0gfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBDdXN0b20gYXBwZW5kZWQgcm93cyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcHBlbmRlZFJvd3NUZW1wbGF0ZVJlZiBhcyB0clRlbXBsYXRlXCI+XG4gICAgICAgIDwhLS0gQ2Fubm90IGluZmVyIHRyVGVtcGxhdGUgYXMgVGVtcGxhdGVSZWYgdGhlcmVmb3JlIG51bGwgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRyVGVtcGxhdGUgfHwgbnVsbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90Ym9keT5cblxuICA8IS0tIFRhYmxlIGZvb3RlciAtLT5cbiAgPHRmb290ICpuZ0lmPVwiY3VzdG9tRm9vdGVyVGVtcGxhdGVSZWYgYXMgdHJUZW1wbGF0ZVwiPlxuICAgIDwhLS0gQ2Fubm90IGluZmVyIHRyVGVtcGxhdGUgYXMgVGVtcGxhdGVSZWYgdGhlcmVmb3JlIG51bGwgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRyVGVtcGxhdGUgfHwgbnVsbFwiPiA8L25nLWNvbnRhaW5lcj5cbiAgPC90Zm9vdD5cbjwvdGFibGU+XG4iXX0=