@coreui/angular-pro 5.2.25 → 5.3.3

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 (393) hide show
  1. package/README.md +11 -11
  2. package/fesm2022/coreui-angular-pro.mjs +1082 -1180
  3. package/fesm2022/coreui-angular-pro.mjs.map +1 -1
  4. package/lib/accordion/accordion-item/accordion-item.component.d.ts +6 -5
  5. package/lib/grid/col.directive.d.ts +26 -26
  6. package/lib/smart-table/smart-table-head/smart-table-head.component.d.ts +2 -2
  7. package/lib/tabs-2/tab/tab.directive.d.ts +4 -3
  8. package/lib/tabs-2/tabs-list/tabs-list.component.d.ts +1 -1
  9. package/package.json +9 -11
  10. package/esm2022/coreui-angular-pro.mjs +0 -5
  11. package/esm2022/lib/accordion/accordion/accordion.component.mjs +0 -34
  12. package/esm2022/lib/accordion/accordion-button/accordion-button.directive.mjs +0 -35
  13. package/esm2022/lib/accordion/accordion-item/accordion-item.component.mjs +0 -59
  14. package/esm2022/lib/accordion/accordion.module.mjs +0 -36
  15. package/esm2022/lib/accordion/accordion.service.mjs +0 -36
  16. package/esm2022/lib/accordion/index.mjs +0 -2
  17. package/esm2022/lib/accordion/public_api.mjs +0 -5
  18. package/esm2022/lib/alert/alert-heading.directive.mjs +0 -15
  19. package/esm2022/lib/alert/alert-link.directive.mjs +0 -15
  20. package/esm2022/lib/alert/alert.component.mjs +0 -173
  21. package/esm2022/lib/alert/alert.module.mjs +0 -30
  22. package/esm2022/lib/alert/index.mjs +0 -2
  23. package/esm2022/lib/alert/public_api.mjs +0 -5
  24. package/esm2022/lib/avatar/avatar.component.mjs +0 -71
  25. package/esm2022/lib/avatar/avatar.module.mjs +0 -20
  26. package/esm2022/lib/avatar/index.mjs +0 -2
  27. package/esm2022/lib/avatar/public_api.mjs +0 -3
  28. package/esm2022/lib/backdrop/backdrop.service.mjs +0 -82
  29. package/esm2022/lib/backdrop/index.mjs +0 -2
  30. package/esm2022/lib/backdrop/public_api.mjs +0 -2
  31. package/esm2022/lib/badge/badge.component.mjs +0 -77
  32. package/esm2022/lib/badge/badge.module.mjs +0 -20
  33. package/esm2022/lib/badge/index.mjs +0 -2
  34. package/esm2022/lib/badge/public_api.mjs +0 -3
  35. package/esm2022/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +0 -40
  36. package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +0 -39
  37. package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.mjs +0 -2
  38. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +0 -41
  39. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +0 -52
  40. package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +0 -34
  41. package/esm2022/lib/breadcrumb/index.mjs +0 -2
  42. package/esm2022/lib/breadcrumb/public_api.mjs +0 -6
  43. package/esm2022/lib/button/button-close.directive.mjs +0 -46
  44. package/esm2022/lib/button/button.directive.mjs +0 -88
  45. package/esm2022/lib/button/button.module.mjs +0 -25
  46. package/esm2022/lib/button/index.mjs +0 -2
  47. package/esm2022/lib/button/public_api.mjs +0 -4
  48. package/esm2022/lib/button-group/button-group/button-group.component.mjs +0 -41
  49. package/esm2022/lib/button-group/button-group.module.mjs +0 -17
  50. package/esm2022/lib/button-group/button-toolbar/button-toolbar.component.mjs +0 -24
  51. package/esm2022/lib/button-group/index.mjs +0 -2
  52. package/esm2022/lib/button-group/public_api.mjs +0 -4
  53. package/esm2022/lib/calendar/calendar/calendar-class-view.pipe.mjs +0 -20
  54. package/esm2022/lib/calendar/calendar/calendar.component.mjs +0 -380
  55. package/esm2022/lib/calendar/calendar-month/calendar-class-day.pipe.mjs +0 -30
  56. package/esm2022/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +0 -24
  57. package/esm2022/lib/calendar/calendar-month/calendar-class-row.pipe.mjs +0 -24
  58. package/esm2022/lib/calendar/calendar-month/calendar-class-year.pipe.mjs +0 -22
  59. package/esm2022/lib/calendar/calendar-month/calendar-day-title.pipe.mjs +0 -17
  60. package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +0 -138
  61. package/esm2022/lib/calendar/calendar-month/calendar-day.pipe.mjs +0 -19
  62. package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +0 -448
  63. package/esm2022/lib/calendar/calendar-month/calendar-row.directive.mjs +0 -123
  64. package/esm2022/lib/calendar/calendar-month/calendar-weekday.pipe.mjs +0 -21
  65. package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +0 -87
  66. package/esm2022/lib/calendar/calendar.module.mjs +0 -57
  67. package/esm2022/lib/calendar/calendar.service.mjs +0 -66
  68. package/esm2022/lib/calendar/calendar.utils.mjs +0 -393
  69. package/esm2022/lib/calendar/index.mjs +0 -2
  70. package/esm2022/lib/calendar/public_api.mjs +0 -5
  71. package/esm2022/lib/callout/callout.component.mjs +0 -25
  72. package/esm2022/lib/callout/callout.module.mjs +0 -16
  73. package/esm2022/lib/callout/index.mjs +0 -2
  74. package/esm2022/lib/callout/public_api.mjs +0 -3
  75. package/esm2022/lib/card/card-body.component.mjs +0 -16
  76. package/esm2022/lib/card/card-footer.component.mjs +0 -16
  77. package/esm2022/lib/card/card-group.component.mjs +0 -16
  78. package/esm2022/lib/card/card-header-actions.component.mjs +0 -16
  79. package/esm2022/lib/card/card-header.component.mjs +0 -16
  80. package/esm2022/lib/card/card-img-overlay/card-img-overlay.component.mjs +0 -11
  81. package/esm2022/lib/card/card-img.directive.mjs +0 -32
  82. package/esm2022/lib/card/card-link.directive.mjs +0 -15
  83. package/esm2022/lib/card/card-subtitle.directive.mjs +0 -15
  84. package/esm2022/lib/card/card-text.directive.mjs +0 -15
  85. package/esm2022/lib/card/card-title.directive.mjs +0 -15
  86. package/esm2022/lib/card/card.component.mjs +0 -50
  87. package/esm2022/lib/card/card.module.mjs +0 -75
  88. package/esm2022/lib/card/index.mjs +0 -2
  89. package/esm2022/lib/card/public_api.mjs +0 -14
  90. package/esm2022/lib/carousel/carousel/carousel.component.mjs +0 -212
  91. package/esm2022/lib/carousel/carousel-caption/carousel-caption.component.mjs +0 -17
  92. package/esm2022/lib/carousel/carousel-control/carousel-control.component.mjs +0 -82
  93. package/esm2022/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +0 -44
  94. package/esm2022/lib/carousel/carousel-inner/carousel-inner.component.mjs +0 -47
  95. package/esm2022/lib/carousel/carousel-item/carousel-item.component.mjs +0 -67
  96. package/esm2022/lib/carousel/carousel-state.mjs +0 -77
  97. package/esm2022/lib/carousel/carousel-state.type.mjs +0 -2
  98. package/esm2022/lib/carousel/carousel.animation.mjs +0 -70
  99. package/esm2022/lib/carousel/carousel.config.mjs +0 -22
  100. package/esm2022/lib/carousel/carousel.module.mjs +0 -52
  101. package/esm2022/lib/carousel/carousel.service.mjs +0 -18
  102. package/esm2022/lib/carousel/index.mjs +0 -2
  103. package/esm2022/lib/carousel/public_api.mjs +0 -9
  104. package/esm2022/lib/collapse/collapse.animations.mjs +0 -9
  105. package/esm2022/lib/collapse/collapse.directive.mjs +0 -145
  106. package/esm2022/lib/collapse/collapse.module.mjs +0 -19
  107. package/esm2022/lib/collapse/index.mjs +0 -2
  108. package/esm2022/lib/collapse/public_api.mjs +0 -3
  109. package/esm2022/lib/coreui.types.mjs +0 -10
  110. package/esm2022/lib/date-picker/date-picker.component.mjs +0 -80
  111. package/esm2022/lib/date-picker/date-picker.module.mjs +0 -16
  112. package/esm2022/lib/date-picker/index.mjs +0 -2
  113. package/esm2022/lib/date-picker/public_api.mjs +0 -3
  114. package/esm2022/lib/date-range-picker/date-range-picker/custom-range-key.pipe.mjs +0 -17
  115. package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +0 -599
  116. package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +0 -16
  117. package/esm2022/lib/date-range-picker/index.mjs +0 -2
  118. package/esm2022/lib/date-range-picker/public_api.mjs +0 -3
  119. package/esm2022/lib/dropdown/dropdown/dropdown.component.mjs +0 -371
  120. package/esm2022/lib/dropdown/dropdown-close/dropdown-close.directive.mjs +0 -73
  121. package/esm2022/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +0 -15
  122. package/esm2022/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +0 -15
  123. package/esm2022/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +0 -15
  124. package/esm2022/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +0 -96
  125. package/esm2022/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +0 -119
  126. package/esm2022/lib/dropdown/dropdown.module.mjs +0 -56
  127. package/esm2022/lib/dropdown/dropdown.service.mjs +0 -18
  128. package/esm2022/lib/dropdown/index.mjs +0 -2
  129. package/esm2022/lib/dropdown/public_api.mjs +0 -10
  130. package/esm2022/lib/element-cover/element-cover.component.mjs +0 -79
  131. package/esm2022/lib/element-cover/element-cover.module.mjs +0 -16
  132. package/esm2022/lib/element-cover/index.mjs +0 -2
  133. package/esm2022/lib/element-cover/public_api.mjs +0 -3
  134. package/esm2022/lib/footer/footer.component.mjs +0 -39
  135. package/esm2022/lib/footer/footer.module.mjs +0 -16
  136. package/esm2022/lib/footer/index.mjs +0 -2
  137. package/esm2022/lib/footer/public_api.mjs +0 -3
  138. package/esm2022/lib/form/form/form.directive.mjs +0 -33
  139. package/esm2022/lib/form/form-check/form-check-input.directive.mjs +0 -78
  140. package/esm2022/lib/form/form-check/form-check-label.directive.mjs +0 -15
  141. package/esm2022/lib/form/form-check/form-check.component.mjs +0 -77
  142. package/esm2022/lib/form/form-control/form-control.directive.mjs +0 -66
  143. package/esm2022/lib/form/form-feedback/form-feedback.component.mjs +0 -38
  144. package/esm2022/lib/form/form-floating/form-floating.directive.mjs +0 -32
  145. package/esm2022/lib/form/form-label/form-label.directive.mjs +0 -41
  146. package/esm2022/lib/form/form-select/form-select.directive.mjs +0 -36
  147. package/esm2022/lib/form/form-text/form-text.directive.mjs +0 -15
  148. package/esm2022/lib/form/form.module.mjs +0 -75
  149. package/esm2022/lib/form/index.mjs +0 -2
  150. package/esm2022/lib/form/input-group/input-group.component.mjs +0 -29
  151. package/esm2022/lib/form/input-group-text/input-group-text.directive.mjs +0 -15
  152. package/esm2022/lib/form/public_api.mjs +0 -14
  153. package/esm2022/lib/grid/col.component.mjs +0 -12
  154. package/esm2022/lib/grid/col.directive.mjs +0 -157
  155. package/esm2022/lib/grid/col.type.mjs +0 -2
  156. package/esm2022/lib/grid/container.component.mjs +0 -33
  157. package/esm2022/lib/grid/container.type.mjs +0 -2
  158. package/esm2022/lib/grid/grid.module.mjs +0 -45
  159. package/esm2022/lib/grid/gutter.directive.mjs +0 -57
  160. package/esm2022/lib/grid/gutter.type.mjs +0 -2
  161. package/esm2022/lib/grid/index.mjs +0 -2
  162. package/esm2022/lib/grid/public_api.mjs +0 -8
  163. package/esm2022/lib/grid/row.component.mjs +0 -16
  164. package/esm2022/lib/grid/row.directive.mjs +0 -47
  165. package/esm2022/lib/grid/row.type.mjs +0 -2
  166. package/esm2022/lib/header/header/header.component.mjs +0 -45
  167. package/esm2022/lib/header/header-brand/header-brand.component.mjs +0 -32
  168. package/esm2022/lib/header/header-divider/header-divider.component.mjs +0 -21
  169. package/esm2022/lib/header/header-nav/header-nav.component.mjs +0 -28
  170. package/esm2022/lib/header/header-text/header-text.component.mjs +0 -21
  171. package/esm2022/lib/header/header-toggler/header-toggler.directive.mjs +0 -55
  172. package/esm2022/lib/header/header.module.mjs +0 -45
  173. package/esm2022/lib/header/index.mjs +0 -2
  174. package/esm2022/lib/header/public_api.mjs +0 -8
  175. package/esm2022/lib/image/img.directive.mjs +0 -58
  176. package/esm2022/lib/image/img.module.mjs +0 -16
  177. package/esm2022/lib/image/index.mjs +0 -2
  178. package/esm2022/lib/image/public_api.mjs +0 -3
  179. package/esm2022/lib/list-group/index.mjs +0 -2
  180. package/esm2022/lib/list-group/list-group-item.directive.mjs +0 -63
  181. package/esm2022/lib/list-group/list-group.directive.mjs +0 -38
  182. package/esm2022/lib/list-group/list-group.module.mjs +0 -17
  183. package/esm2022/lib/list-group/public_api.mjs +0 -4
  184. package/esm2022/lib/loading-button/index.mjs +0 -2
  185. package/esm2022/lib/loading-button/loading-button.animations.mjs +0 -26
  186. package/esm2022/lib/loading-button/loading-button.component.mjs +0 -65
  187. package/esm2022/lib/loading-button/loading-button.module.mjs +0 -16
  188. package/esm2022/lib/loading-button/public_api.mjs +0 -3
  189. package/esm2022/lib/modal/index.mjs +0 -2
  190. package/esm2022/lib/modal/modal/modal.component.mjs +0 -334
  191. package/esm2022/lib/modal/modal-body/modal-body.component.mjs +0 -11
  192. package/esm2022/lib/modal/modal-content/modal-content.component.mjs +0 -16
  193. package/esm2022/lib/modal/modal-dialog/modal-dialog.component.mjs +0 -32
  194. package/esm2022/lib/modal/modal-dismiss/modal-toggle.directive.mjs +0 -28
  195. package/esm2022/lib/modal/modal-footer/modal-footer.component.mjs +0 -16
  196. package/esm2022/lib/modal/modal-header/modal-header.component.mjs +0 -16
  197. package/esm2022/lib/modal/modal-title/modal-title.directive.mjs +0 -15
  198. package/esm2022/lib/modal/modal.module.mjs +0 -57
  199. package/esm2022/lib/modal/modal.service.mjs +0 -21
  200. package/esm2022/lib/modal/public_api.mjs +0 -11
  201. package/esm2022/lib/multi-select/index.mjs +0 -2
  202. package/esm2022/lib/multi-select/multi-select/multi-select-search.directive.mjs +0 -65
  203. package/esm2022/lib/multi-select/multi-select/multi-select.component.mjs +0 -1296
  204. package/esm2022/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +0 -30
  205. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +0 -11
  206. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +0 -59
  207. package/esm2022/lib/multi-select/multi-select-option/multi-select-option.component.mjs +0 -302
  208. package/esm2022/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +0 -44
  209. package/esm2022/lib/multi-select/multi-select.module.mjs +0 -37
  210. package/esm2022/lib/multi-select/multi-select.service.mjs +0 -50
  211. package/esm2022/lib/multi-select/multi-select.type.mjs +0 -2
  212. package/esm2022/lib/multi-select/public_api.mjs +0 -6
  213. package/esm2022/lib/nav/index.mjs +0 -2
  214. package/esm2022/lib/nav/nav-item.component.mjs +0 -11
  215. package/esm2022/lib/nav/nav-link.directive.mjs +0 -76
  216. package/esm2022/lib/nav/nav.component.mjs +0 -25
  217. package/esm2022/lib/nav/nav.module.mjs +0 -30
  218. package/esm2022/lib/nav/public_api.mjs +0 -5
  219. package/esm2022/lib/navbar/index.mjs +0 -2
  220. package/esm2022/lib/navbar/navbar-brand/navbar-brand.directive.mjs +0 -18
  221. package/esm2022/lib/navbar/navbar-nav/navbar-nav.component.mjs +0 -29
  222. package/esm2022/lib/navbar/navbar-text/navbar-text.component.mjs +0 -16
  223. package/esm2022/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +0 -63
  224. package/esm2022/lib/navbar/navbar.component.mjs +0 -107
  225. package/esm2022/lib/navbar/navbar.module.mjs +0 -40
  226. package/esm2022/lib/navbar/public_api.mjs +0 -7
  227. package/esm2022/lib/offcanvas/index.mjs +0 -2
  228. package/esm2022/lib/offcanvas/offcanvas/offcanvas.component.mjs +0 -309
  229. package/esm2022/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +0 -11
  230. package/esm2022/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +0 -16
  231. package/esm2022/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +0 -15
  232. package/esm2022/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +0 -28
  233. package/esm2022/lib/offcanvas/offcanvas.module.mjs +0 -49
  234. package/esm2022/lib/offcanvas/offcanvas.service.mjs +0 -21
  235. package/esm2022/lib/offcanvas/public_api.mjs +0 -8
  236. package/esm2022/lib/pagination/index.mjs +0 -2
  237. package/esm2022/lib/pagination/page-item/page-item.component.mjs +0 -12
  238. package/esm2022/lib/pagination/page-item/page-item.directive.mjs +0 -64
  239. package/esm2022/lib/pagination/page-link/page-link.directive.mjs +0 -15
  240. package/esm2022/lib/pagination/pagination/pagination.component.mjs +0 -41
  241. package/esm2022/lib/pagination/pagination.module.mjs +0 -35
  242. package/esm2022/lib/pagination/public_api.mjs +0 -6
  243. package/esm2022/lib/placeholder/index.mjs +0 -2
  244. package/esm2022/lib/placeholder/placeholder-animation.directive.mjs +0 -34
  245. package/esm2022/lib/placeholder/placeholder.directive.mjs +0 -43
  246. package/esm2022/lib/placeholder/placeholder.module.mjs +0 -25
  247. package/esm2022/lib/placeholder/public_api.mjs +0 -4
  248. package/esm2022/lib/popover/index.mjs +0 -2
  249. package/esm2022/lib/popover/popover/popover.component.mjs +0 -70
  250. package/esm2022/lib/popover/popover.directive.mjs +0 -204
  251. package/esm2022/lib/popover/popover.module.mjs +0 -25
  252. package/esm2022/lib/popover/public_api.mjs +0 -4
  253. package/esm2022/lib/progress/index.mjs +0 -2
  254. package/esm2022/lib/progress/progress-bar.component.mjs +0 -40
  255. package/esm2022/lib/progress/progress-bar.directive.mjs +0 -113
  256. package/esm2022/lib/progress/progress-stacked.component.mjs +0 -19
  257. package/esm2022/lib/progress/progress.component.mjs +0 -74
  258. package/esm2022/lib/progress/progress.module.mjs +0 -35
  259. package/esm2022/lib/progress/progress.type.mjs +0 -2
  260. package/esm2022/lib/progress/public_api.mjs +0 -6
  261. package/esm2022/lib/rating/index.mjs +0 -2
  262. package/esm2022/lib/rating/public_api.mjs +0 -3
  263. package/esm2022/lib/rating/rating-item-label/rating-item-label.component.mjs +0 -40
  264. package/esm2022/lib/rating/rating.component.mjs +0 -355
  265. package/esm2022/lib/rating/rating.module.mjs +0 -16
  266. package/esm2022/lib/services/class-toggle.service.mjs +0 -30
  267. package/esm2022/lib/services/color-mode.service.mjs +0 -78
  268. package/esm2022/lib/services/in-memory-storage.service.mjs +0 -32
  269. package/esm2022/lib/services/index.mjs +0 -2
  270. package/esm2022/lib/services/intersection.service.mjs +0 -51
  271. package/esm2022/lib/services/listeners.service.mjs +0 -52
  272. package/esm2022/lib/services/local-storage.service.mjs +0 -45
  273. package/esm2022/lib/services/public_api.mjs +0 -7
  274. package/esm2022/lib/shared/element-ref.directive.mjs +0 -18
  275. package/esm2022/lib/shared/html-attr.directive.mjs +0 -56
  276. package/esm2022/lib/shared/index.mjs +0 -2
  277. package/esm2022/lib/shared/public_api.mjs +0 -6
  278. package/esm2022/lib/shared/shared.module.mjs +0 -24
  279. package/esm2022/lib/shared/template-id.directive.mjs +0 -20
  280. package/esm2022/lib/shared/theme.directive.mjs +0 -45
  281. package/esm2022/lib/sidebar/index.mjs +0 -2
  282. package/esm2022/lib/sidebar/public_api.mjs +0 -10
  283. package/esm2022/lib/sidebar/sidebar/sidebar.component.mjs +0 -241
  284. package/esm2022/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +0 -62
  285. package/esm2022/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +0 -30
  286. package/esm2022/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +0 -16
  287. package/esm2022/lib/sidebar/sidebar-header/sidebar-header.component.mjs +0 -16
  288. package/esm2022/lib/sidebar/sidebar-nav/index.mjs +0 -2
  289. package/esm2022/lib/sidebar/sidebar-nav/public_api.mjs +0 -14
  290. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +0 -25
  291. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +0 -17
  292. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-group.service.mjs +0 -18
  293. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +0 -21
  294. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +0 -34
  295. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +0 -43
  296. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +0 -111
  297. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +0 -23
  298. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +0 -71
  299. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +0 -230
  300. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.mjs +0 -2
  301. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +0 -54
  302. package/esm2022/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +0 -41
  303. package/esm2022/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.mjs +0 -39
  304. package/esm2022/lib/sidebar/sidebar.module.mjs +0 -83
  305. package/esm2022/lib/sidebar/sidebar.service.mjs +0 -21
  306. package/esm2022/lib/smart-pagination/index.mjs +0 -2
  307. package/esm2022/lib/smart-pagination/public_api.mjs +0 -3
  308. package/esm2022/lib/smart-pagination/smart-pagination.component.mjs +0 -191
  309. package/esm2022/lib/smart-pagination/smart-pagination.module.mjs +0 -16
  310. package/esm2022/lib/smart-pagination/smart-pagination.type.mjs +0 -2
  311. package/esm2022/lib/smart-table/index.mjs +0 -2
  312. package/esm2022/lib/smart-table/public_api.mjs +0 -5
  313. package/esm2022/lib/smart-table/smart-table/smart-table.component.mjs +0 -526
  314. package/esm2022/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.mjs +0 -27
  315. package/esm2022/lib/smart-table/smart-table-filter/filter-input.directive.mjs +0 -69
  316. package/esm2022/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +0 -42
  317. package/esm2022/lib/smart-table/smart-table-head/smart-table-column-label.pipe.mjs +0 -18
  318. package/esm2022/lib/smart-table/smart-table-head/smart-table-head.component.mjs +0 -229
  319. package/esm2022/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +0 -46
  320. package/esm2022/lib/smart-table/smart-table.module.mjs +0 -17
  321. package/esm2022/lib/smart-table/smart-table.type.mjs +0 -2
  322. package/esm2022/lib/smart-table/smart-table.utils.mjs +0 -181
  323. package/esm2022/lib/spinner/index.mjs +0 -2
  324. package/esm2022/lib/spinner/public_api.mjs +0 -3
  325. package/esm2022/lib/spinner/spinner.component.mjs +0 -52
  326. package/esm2022/lib/spinner/spinner.module.mjs +0 -20
  327. package/esm2022/lib/table/index.mjs +0 -2
  328. package/esm2022/lib/table/public_api.mjs +0 -5
  329. package/esm2022/lib/table/table-active.directive.mjs +0 -32
  330. package/esm2022/lib/table/table-color.directive.mjs +0 -25
  331. package/esm2022/lib/table/table.directive.mjs +0 -112
  332. package/esm2022/lib/table/table.module.mjs +0 -30
  333. package/esm2022/lib/table/table.type.mjs +0 -2
  334. package/esm2022/lib/tabs/index.mjs +0 -2
  335. package/esm2022/lib/tabs/public_api.mjs +0 -6
  336. package/esm2022/lib/tabs/tab-content/tab-content.component.mjs +0 -83
  337. package/esm2022/lib/tabs/tab-content-ref.directive.mjs +0 -141
  338. package/esm2022/lib/tabs/tab-pane/tab-pane.component.mjs +0 -60
  339. package/esm2022/lib/tabs/tab.service.mjs +0 -21
  340. package/esm2022/lib/tabs/tabs.module.mjs +0 -36
  341. package/esm2022/lib/tabs-2/index.mjs +0 -2
  342. package/esm2022/lib/tabs-2/public_api.mjs +0 -8
  343. package/esm2022/lib/tabs-2/tab/tab.directive.mjs +0 -96
  344. package/esm2022/lib/tabs-2/tab-panel/tab-panel.component.mjs +0 -113
  345. package/esm2022/lib/tabs-2/tabs-content/tabs-content.component.mjs +0 -19
  346. package/esm2022/lib/tabs-2/tabs-list/tabs-list.component.mjs +0 -93
  347. package/esm2022/lib/tabs-2/tabs.component.mjs +0 -37
  348. package/esm2022/lib/tabs-2/tabs.service.mjs +0 -15
  349. package/esm2022/lib/tabs-2/tabs2.module.mjs +0 -22
  350. package/esm2022/lib/time-picker/index.mjs +0 -2
  351. package/esm2022/lib/time-picker/public_api.mjs +0 -3
  352. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.mjs +0 -110
  353. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.mjs +0 -114
  354. package/esm2022/lib/time-picker/time-picker.component.mjs +0 -517
  355. package/esm2022/lib/time-picker/time-picker.module.mjs +0 -16
  356. package/esm2022/lib/time-picker/time.utils.mjs +0 -645
  357. package/esm2022/lib/toast/index.mjs +0 -2
  358. package/esm2022/lib/toast/public_api.mjs +0 -9
  359. package/esm2022/lib/toast/toast/toast.component.mjs +0 -204
  360. package/esm2022/lib/toast/toast-body/toast-body.component.mjs +0 -21
  361. package/esm2022/lib/toast/toast-close.directive.mjs +0 -29
  362. package/esm2022/lib/toast/toast-header/toast-header.component.mjs +0 -30
  363. package/esm2022/lib/toast/toast.module.mjs +0 -47
  364. package/esm2022/lib/toast/toaster/toaster-host.directive.mjs +0 -18
  365. package/esm2022/lib/toast/toaster/toaster.component.mjs +0 -123
  366. package/esm2022/lib/toast/toaster/toaster.service.mjs +0 -22
  367. package/esm2022/lib/tooltip/index.mjs +0 -2
  368. package/esm2022/lib/tooltip/public_api.mjs +0 -4
  369. package/esm2022/lib/tooltip/tooltip/tooltip.component.mjs +0 -66
  370. package/esm2022/lib/tooltip/tooltip.directive.mjs +0 -204
  371. package/esm2022/lib/tooltip/tooltip.module.mjs +0 -25
  372. package/esm2022/lib/utilities/align.directive.mjs +0 -25
  373. package/esm2022/lib/utilities/bg-color.directive.mjs +0 -34
  374. package/esm2022/lib/utilities/border.directive.mjs +0 -67
  375. package/esm2022/lib/utilities/border.type.mjs +0 -2
  376. package/esm2022/lib/utilities/index.mjs +0 -2
  377. package/esm2022/lib/utilities/public_api.mjs +0 -9
  378. package/esm2022/lib/utilities/rounded.directive.mjs +0 -66
  379. package/esm2022/lib/utilities/rounded.type.mjs +0 -2
  380. package/esm2022/lib/utilities/shadow-on-scroll.directive.mjs +0 -48
  381. package/esm2022/lib/utilities/text-bg-color.directive.mjs +0 -30
  382. package/esm2022/lib/utilities/text-color.directive.mjs +0 -30
  383. package/esm2022/lib/utilities/utilities.module.mjs +0 -16
  384. package/esm2022/lib/widget/index.mjs +0 -2
  385. package/esm2022/lib/widget/public_api.mjs +0 -8
  386. package/esm2022/lib/widget/widget-stat-a/widget-stat-a.component.mjs +0 -55
  387. package/esm2022/lib/widget/widget-stat-b/widget-stat-b.component.mjs +0 -57
  388. package/esm2022/lib/widget/widget-stat-c/widget-stat-c.component.mjs +0 -71
  389. package/esm2022/lib/widget/widget-stat-d/widget-stat-d.component.mjs +0 -36
  390. package/esm2022/lib/widget/widget-stat-e/widget-stat-e.component.mjs +0 -36
  391. package/esm2022/lib/widget/widget-stat-f/widget-stat-f.component.mjs +0 -96
  392. package/esm2022/lib/widget/widget.module.mjs +0 -45
  393. package/esm2022/public-api.mjs +0 -53
@@ -1,526 +0,0 @@
1
- import { booleanAttribute, Component, computed, ContentChildren, EventEmitter, input, Input, numberAttribute, Output, signal } from '@angular/core';
2
- import { AsyncPipe, JsonPipe, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
3
- import { BehaviorSubject } from 'rxjs';
4
- import { getClickedColumnName, getColumnGroups, getColumnKey, getColumnNames, getColumnNamesFromItems, getColumns, getTableDataCellClass, getTableDataCellProps, getTableDataCellStyles } from '../smart-table.utils';
5
- import { ButtonDirective } from '../../button';
6
- import { FormCheckInputDirective } from '../../form';
7
- import { ElementCoverComponent } from '../../element-cover';
8
- import { HtmlAttributesDirective, TemplateIdDirective } from '../../shared';
9
- import { SmartPaginationComponent } from '../../smart-pagination';
10
- import { TableActiveDirective, TableColorDirective, TableDirective } from '../../table';
11
- import { AlignDirective } from '../../utilities';
12
- import { SmartTableFilterComponent } from '../smart-table-filter/smart-table-filter.component';
13
- import { FilterInputDirective } from '../smart-table-filter/filter-input.directive';
14
- import { SmartTableHeadComponent } from '../smart-table-head/smart-table-head.component';
15
- import { SmartTableItemsPerPageSelectorComponent } from '../smart-table-items-per-page-selector/smart-table-items-per-page-selector.component';
16
- import * as i0 from "@angular/core";
17
- export class SmartTableComponent {
18
- constructor(iterableDiffers, keyValueDiffers) {
19
- this.iterableDiffers = iterableDiffers;
20
- this.keyValueDiffers = keyValueDiffers;
21
- this.getColumnKey = getColumnKey;
22
- this.getTableDataCellClass = getTableDataCellClass;
23
- this.getTableDataCellProps = getTableDataCellProps;
24
- this.getTableDataCellStyles = getTableDataCellStyles;
25
- this.selectedAllSubject = new BehaviorSubject(false);
26
- this._activePage = 1;
27
- this.cleaner = false;
28
- this.clickableRows = false;
29
- this.columns$ = signal([]);
30
- this.columnGroups$ = signal([]);
31
- this.showGroups$ = computed(() => !!this.columnGroups$().length);
32
- this._columnFilterValue = {};
33
- this.columnSorter = input(false);
34
- this.footer = false;
35
- this.header = false;
36
- this.items$ = signal([]);
37
- this._items = [];
38
- this._itemsPerPage = 10;
39
- this.itemsPerPageLabel = 'Items per page:';
40
- this.itemsPerPageOptions = [5, 10, 20, 50];
41
- this.noItemsLabel = 'No items found';
42
- this.pagination = false;
43
- this._selectable = false;
44
- this.selectAll = true;
45
- this._sorterValue = {};
46
- this.tableFilterLabel = 'Filter:';
47
- this.tableFilterPlaceholder = 'type string...';
48
- this._tableFilterValue = '';
49
- this.tableBodyProps = {};
50
- this.tableFootProps = {};
51
- this.tableHeadProps = {};
52
- this.tableProps = {};
53
- this.selectedItemsChange = new EventEmitter();
54
- this.sorterValueChange = new EventEmitter();
55
- this.activePageChange = new EventEmitter();
56
- this.itemsPerPageChange = new EventEmitter();
57
- this.rowClick = new EventEmitter();
58
- this.columnFilterValueChange = new EventEmitter();
59
- this.filteredItemsChange = new EventEmitter();
60
- this.tableFilterValueChange = new EventEmitter();
61
- this.templates = { tableDetails: null, tableData: null };
62
- this.columnFilterTemplates = {};
63
- this.columnLabelTemplates = {};
64
- this.summaryRowTemplate = null;
65
- this.rawColumnNames$ = computed(() => {
66
- return getColumnNames(this.columns$(), this.items$());
67
- });
68
- this.itemsDataColumns$ = computed(() => this.rawColumnNames$().filter((name) => getColumnNamesFromItems(this.items$()).includes(name)));
69
- this._columnFiltered = [];
70
- this.itemsDiffer = this.iterableDiffers.find(this.items).create();
71
- this.itemsFilteredDiffer = this.iterableDiffers.find(this._columnFiltered).create();
72
- this.columFilterValueDiffer = this.keyValueDiffers.find(this.columnFilterValue).create();
73
- this.sorterValueDiffer = this.keyValueDiffers.find(this.sorterValue).create();
74
- setTimeout(() => {
75
- this.selectedAllSubject.next(this.selectedAll);
76
- }, 0);
77
- }
78
- set activePage(value) {
79
- this._activePage = value || 1;
80
- this.activePageChange.emit(this._activePage);
81
- }
82
- get activePage() {
83
- return this._activePage;
84
- }
85
- set columns(value) {
86
- const colObjects = value.map((column) => (typeof column === 'string' ? { key: column } : { ...column }));
87
- const columns = getColumns(colObjects);
88
- this.columns$.set(columns);
89
- // todo: Input columnGroups - separation?
90
- // console.log(getColumnGroups(colObjects ?? []));
91
- const groups = getColumnGroups(value ?? []);
92
- this.columnGroups$.set(groups);
93
- }
94
- get columns() {
95
- return this.columns$();
96
- }
97
- set columnFilterValue(value) {
98
- if (this.columFilterValueDiffer) {
99
- const changes = this.columFilterValueDiffer.diff(value);
100
- if (changes) {
101
- this._columnFilterValue = { ...value };
102
- this.columnFilterValueChange.emit({ ...this._columnFilterValue });
103
- this.tableFiltered; // emits tableFiltered change
104
- }
105
- }
106
- }
107
- get columnFilterValue() {
108
- return this._columnFilterValue;
109
- }
110
- set items(value) {
111
- if (this.itemsDiffer) {
112
- const changes = this.itemsDiffer.diff(value);
113
- if (changes) {
114
- this._items = this.setItems(value);
115
- this.items$.set(this._items);
116
- if (!this.columns.length) {
117
- this.columns = getColumnNamesFromItems(this.items$());
118
- }
119
- }
120
- }
121
- }
122
- get items() {
123
- return this._items;
124
- }
125
- set itemsPerPage(value) {
126
- this._itemsPerPage = value;
127
- }
128
- get itemsPerPage() {
129
- return this._itemsPerPage;
130
- }
131
- set selectable(value) {
132
- this._selectable = value;
133
- }
134
- get selectable() {
135
- return this._selectable;
136
- }
137
- set sorterValue(value) {
138
- if (this.sorterValueDiffer) {
139
- const changes = this.sorterValueDiffer.diff(value);
140
- if (changes) {
141
- this._sorterValue = value;
142
- this.sorterValueChange.emit({ ...value });
143
- }
144
- }
145
- }
146
- get sorterValue() {
147
- return this._sorterValue;
148
- }
149
- set tableFilter(filter) {
150
- this._tableFilter = filter;
151
- if (typeof filter === 'object') {
152
- this.tableFilterLabel = typeof filter.label === 'string' ? filter.label : this.tableFilterLabel;
153
- this.tableFilterPlaceholder =
154
- typeof filter.placeholder === 'string' ? filter.placeholder : this.tableFilterPlaceholder;
155
- this.tableFilterValue = typeof filter.value === 'string' ? filter.value : this.tableFilterValue;
156
- }
157
- }
158
- get tableFilter() {
159
- return this._tableFilter;
160
- }
161
- set tableFilterValue(value) {
162
- if (this._tableFilterValue !== value) {
163
- this._tableFilterValue = value;
164
- this.tableFilterValueChange.emit(value);
165
- this.tableFiltered; // emits tableFiltered change
166
- }
167
- }
168
- get tableFilterValue() {
169
- return this._tableFilterValue;
170
- }
171
- ngAfterContentInit() {
172
- this.columnTemplates.forEach((child) => {
173
- if (child.id.startsWith('columnFilter_')) {
174
- this.columnFilterTemplates[child.id] = child.templateRef;
175
- return;
176
- }
177
- if (child.id.startsWith('columnLabel_')) {
178
- this.columnLabelTemplates[child.id] = child.templateRef;
179
- return;
180
- }
181
- if (child.id === 'tableSummaryRow') {
182
- this.summaryRowTemplate = child.templateRef;
183
- return;
184
- }
185
- this.templates[child.id] = child.templateRef;
186
- });
187
- this.columnFilterTemplates = { ...this.columnFilterTemplates };
188
- this.columnLabelTemplates = { ...this.columnLabelTemplates };
189
- }
190
- get selectedAll() {
191
- const selected = this.items.some((item) => item._selected === true);
192
- const unselected = this.items.some((item) => item._selected === false);
193
- return selected && unselected ? 'indeterminate' : selected;
194
- }
195
- get tableFilterState() {
196
- return this.tableFilterValue ? this.tableFilterValue : '';
197
- }
198
- get columnFilterState() {
199
- return this.columnFilterValue ? this.columnFilterValue : {};
200
- }
201
- get numberOfPages() {
202
- return this._itemsPerPage ? Math.ceil(this.sortedItems.length / this._itemsPerPage) : 1;
203
- }
204
- get colspan() {
205
- return this._selectable ? this.rawColumnNames$().length + 1 : this.rawColumnNames$().length;
206
- }
207
- get firstItemOnActivePageIndex() {
208
- return this._activePage ? (this._activePage - 1) * this._itemsPerPage : 0;
209
- }
210
- get itemsOnActivePage() {
211
- return this.sortedItems.slice(this.firstItemOnActivePageIndex, this.firstItemOnActivePageIndex + this._itemsPerPage);
212
- }
213
- get currentItems() {
214
- return this._activePage ? this.itemsOnActivePage : (this.sortedItems ?? []);
215
- }
216
- get sortedItems() {
217
- const columnKey = this.sorterValue.column;
218
- const currentColumn = this.columns.find((column) => column.key === columnKey);
219
- const columnSorter = this.columnSorter();
220
- if (!columnKey ||
221
- (!this.itemsDataColumns$().includes(columnKey) && typeof currentColumn?.sorter !== 'function') ||
222
- (typeof columnSorter === 'object' && columnSorter.external)) {
223
- return this.tableFiltered;
224
- }
225
- const tableFiltered = [...this.tableFiltered];
226
- // if values in column are to be sorted by numeric value they all have to be a type of number
227
- const flip = this.sorterValue.state === 'asc' ? 1 : this.sorterValue.state === 'desc' ? -1 : 0;
228
- if (flip === 0) {
229
- return tableFiltered;
230
- }
231
- if (typeof currentColumn?.sorter === 'function') {
232
- const sorted = tableFiltered.slice().sort(currentColumn.sorter);
233
- return flip < 0 ? sorted.reverse() : sorted;
234
- }
235
- const compareFn = (item1, item2) => {
236
- const value1 = item1[columnKey];
237
- const value2 = item2[columnKey];
238
- const a = typeof value1 === 'number' ? value1 : String(value1).toLowerCase();
239
- const b = typeof value2 === 'number' ? value2 : String(value2).toLowerCase();
240
- return a > b ? 1 * flip : b > a ? -1 * flip : 0;
241
- };
242
- return tableFiltered.slice().sort(compareFn);
243
- }
244
- get tableFilterEvent() {
245
- return typeof this.tableFilter === 'object' && this.tableFilter.lazy ? 'change' : 'input';
246
- }
247
- get columnFiltered() {
248
- let _items = this._items;
249
- if (this.columnFilter && typeof this.columnFilter === 'object' && this.columnFilter.external) {
250
- this._columnFiltered = _items;
251
- return _items;
252
- }
253
- Object.entries(this.columnFilterState).forEach(([key, value]) => {
254
- if (value instanceof Function) {
255
- _items = _items.filter((item) => value(item[key]));
256
- return;
257
- }
258
- const currentColumn = this.columns.find((column) => column.key === key);
259
- if (typeof currentColumn?.filter === 'function') {
260
- _items = _items.filter((item) => (typeof currentColumn.filter === 'function' && currentColumn.filter(item, value)) ?? !value);
261
- return;
262
- }
263
- const columnFilter = String(value).toLowerCase();
264
- if (columnFilter && this.itemsDataColumns$().includes(key)) {
265
- _items = _items.filter((item) => String(item[key]).toLowerCase().includes(columnFilter));
266
- }
267
- });
268
- this._columnFiltered = _items;
269
- return _items;
270
- }
271
- get tableFiltered() {
272
- let items = this.columnFiltered;
273
- if (!this.tableFilterState ||
274
- (this.tableFilter && typeof this.tableFilter === 'object' && this.tableFilter.external)) {
275
- if (this.itemsFilteredDiffer) {
276
- const changes = this.itemsFilteredDiffer.diff(items);
277
- if (changes) {
278
- this.filteredItemsChange.emit(items);
279
- }
280
- }
281
- return items;
282
- }
283
- const filter = this.tableFilterState.toLowerCase();
284
- const valueContainFilter = (val) => String(val).toLowerCase().includes(filter);
285
- // @ts-ignore
286
- items = items.filter((item) => {
287
- return !!this.itemsDataColumns$().find((key) => valueContainFilter(item[key]));
288
- });
289
- if (this.itemsFilteredDiffer) {
290
- const changes = this.itemsFilteredDiffer.diff(items);
291
- if (changes) {
292
- this.filteredItemsChange.emit(items);
293
- }
294
- }
295
- return items;
296
- }
297
- get isFiltered() {
298
- return this.tableFilterState || this.sorterValue?.column || Object.values(this.columnFilterState).join('');
299
- }
300
- setItems(items) {
301
- if (Array.isArray(items)) {
302
- return items.map((item, index) => {
303
- return { ...item, ___id: item['___id'] ?? index };
304
- });
305
- }
306
- return [];
307
- }
308
- handleSortChange($event) {
309
- this.handleSorterChange($event.columnKey, $event.index, $event.order);
310
- }
311
- isSortable(i) {
312
- const columnSorter = this.columnSorter();
313
- if (!columnSorter) {
314
- return false;
315
- }
316
- const columnKey = this.rawColumnNames$()[i];
317
- const isDataColumn = this.itemsDataColumns$().includes(columnKey);
318
- const column = this.columns[i];
319
- const isColumnSortable = !this.columns.length || typeof column !== 'object' || column.sorter !== false;
320
- const isExternalSorter = typeof columnSorter === 'object' && columnSorter.external;
321
- return (isColumnSortable && (isDataColumn || typeof column?.sorter === 'function')) || isExternalSorter;
322
- }
323
- handleSorterChange(column, index, order) {
324
- if (!this.isSortable(index)) {
325
- return;
326
- }
327
- //if column changed or sort was descending change asc to true
328
- const sorterState = { ...this.sorterValue };
329
- if (sorterState.column === column) {
330
- const columnSorter = this.columnSorter();
331
- const resettable = columnSorter === true ||
332
- (typeof columnSorter === 'object' && columnSorter.resetable !== false && columnSorter.resettable !== false);
333
- const state = sorterState.state;
334
- if (order === undefined) {
335
- sorterState.state = state === 0 ? 'asc' : state === 'asc' ? 'desc' : resettable ? 0 : 'asc';
336
- }
337
- else {
338
- sorterState.state = order === 0 && !resettable ? state : order;
339
- }
340
- }
341
- else {
342
- sorterState.column = column;
343
- sorterState.state = 'asc';
344
- }
345
- this.sorterValue = { ...sorterState };
346
- }
347
- setActivePage($event) {
348
- this.activePage = $event;
349
- }
350
- handleColumnFilterChange($event) {
351
- const { column, value, type } = $event;
352
- this.setActivePage(1);
353
- this.columnFilterValue = { ...this.columnFilterValue, [`${column}`]: value };
354
- }
355
- handleTableFilterChange($event) {
356
- const { value, type } = $event;
357
- const isLazy = typeof this.tableFilter === 'object' && this.tableFilter.lazy === true;
358
- if (((isLazy && type === 'input') || (!isLazy && type === 'change')) && value.length !== 0) {
359
- return;
360
- }
361
- this.setActivePage(1);
362
- this.tableFilterValue = value;
363
- }
364
- clean($event) {
365
- this.columnFilterValue = {};
366
- this.tableFilterValue = '';
367
- this.sorterValue = {};
368
- this.tableFiltered; //emits tableFiltered change
369
- }
370
- handleItemsPerPageChange(value) {
371
- if (value !== this._itemsPerPage) {
372
- this.setActivePage(1);
373
- this._itemsPerPage = value;
374
- this.itemsPerPageChange.emit(value);
375
- }
376
- }
377
- handleRowChecked($event, item) {
378
- item._selected = item._selectable !== false && $event.target.checked;
379
- this.selectedItemsChange.emit(this.items.filter((item) => item._selected === true));
380
- setTimeout(() => {
381
- this.selectedAllSubject.next(this.selectedAll);
382
- }, 0);
383
- }
384
- handleSelectAllChange($event) {
385
- this._items = this.items.map((item) => {
386
- return { ...item, _selected: item._selectable !== false ? $event : !!item._selected };
387
- });
388
- this.selectedAllSubject.next($event);
389
- setTimeout(() => {
390
- this.selectedItemsChange.emit(this.items.filter((item) => item._selected === true));
391
- this.selectedAllSubject.next(this.selectedAll);
392
- }, 0);
393
- }
394
- handleRowClick(param) {
395
- const { $event, item, i } = { ...param };
396
- const target = $event.target;
397
- const columnNames = this.rawColumnNames$();
398
- const selectable = this._selectable;
399
- const columnName = getClickedColumnName(target, columnNames, selectable);
400
- this.rowClick.emit({ item: item, index: i + this.firstItemOnActivePageIndex, columnName, event: $event });
401
- }
402
- ngOnChanges(changes) {
403
- if (changes['columnFilterValue']) {
404
- const columnFilterValueChange = changes['columnFilterValue'];
405
- const currentValue = columnFilterValueChange.currentValue;
406
- if (typeof currentValue === 'object' && Object.keys(currentValue ?? {}).length) {
407
- this.setActivePage(1);
408
- }
409
- }
410
- if (changes['tableFilterValue']) {
411
- const tableFilterValueChange = changes['tableFilterValue'];
412
- const currentValue = tableFilterValueChange.currentValue;
413
- if (currentValue.length) {
414
- this.setActivePage(1);
415
- }
416
- }
417
- }
418
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SmartTableComponent, deps: [{ token: i0.IterableDiffers }, { token: i0.KeyValueDiffers }], target: i0.ɵɵFactoryTarget.Component }); }
419
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: SmartTableComponent, isStandalone: true, selector: "c-smart-table", inputs: { activePage: { classPropertyName: "activePage", publicName: "activePage", isSignal: false, isRequired: false, transformFunction: numberAttribute }, cleaner: { classPropertyName: "cleaner", publicName: "cleaner", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, clickableRows: { classPropertyName: "clickableRows", publicName: "clickableRows", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: false, isRequired: false, transformFunction: null }, columnFilter: { classPropertyName: "columnFilter", publicName: "columnFilter", isSignal: false, isRequired: false, transformFunction: null }, columnFilterValue: { classPropertyName: "columnFilterValue", publicName: "columnFilterValue", isSignal: false, isRequired: false, transformFunction: null }, columnSorter: { classPropertyName: "columnSorter", publicName: "columnSorter", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "footer", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, header: { classPropertyName: "header", publicName: "header", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, items: { classPropertyName: "items", publicName: "items", isSignal: false, isRequired: false, transformFunction: null }, itemsPerPage: { classPropertyName: "itemsPerPage", publicName: "itemsPerPage", isSignal: false, isRequired: false, transformFunction: numberAttribute }, itemsPerPageLabel: { classPropertyName: "itemsPerPageLabel", publicName: "itemsPerPageLabel", isSignal: false, isRequired: false, transformFunction: null }, itemsPerPageOptions: { classPropertyName: "itemsPerPageOptions", publicName: "itemsPerPageOptions", isSignal: false, isRequired: false, transformFunction: null }, itemsPerPageSelect: { classPropertyName: "itemsPerPageSelect", publicName: "itemsPerPageSelect", isSignal: false, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: false, isRequired: false, transformFunction: null }, noItemsLabel: { classPropertyName: "noItemsLabel", publicName: "noItemsLabel", isSignal: false, isRequired: false, transformFunction: null }, pagination: { classPropertyName: "pagination", publicName: "pagination", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, sorterValue: { classPropertyName: "sorterValue", publicName: "sorterValue", isSignal: false, isRequired: false, transformFunction: null }, tableFilter: { classPropertyName: "tableFilter", publicName: "tableFilter", isSignal: false, isRequired: false, transformFunction: null }, tableFilterLabel: { classPropertyName: "tableFilterLabel", publicName: "tableFilterLabel", isSignal: false, isRequired: false, transformFunction: null }, tableFilterPlaceholder: { classPropertyName: "tableFilterPlaceholder", publicName: "tableFilterPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, tableFilterValue: { classPropertyName: "tableFilterValue", publicName: "tableFilterValue", isSignal: false, isRequired: false, transformFunction: null }, tableBodyProps: { classPropertyName: "tableBodyProps", publicName: "tableBodyProps", isSignal: false, isRequired: false, transformFunction: null }, tableFootProps: { classPropertyName: "tableFootProps", publicName: "tableFootProps", isSignal: false, isRequired: false, transformFunction: null }, tableHeadProps: { classPropertyName: "tableHeadProps", publicName: "tableHeadProps", isSignal: false, isRequired: false, transformFunction: null }, tableProps: { classPropertyName: "tableProps", publicName: "tableProps", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { selectedItemsChange: "selectedItemsChange", sorterValueChange: "sorterValueChange", activePageChange: "activePageChange", itemsPerPageChange: "itemsPerPageChange", rowClick: "rowClick", columnFilterValueChange: "columnFilterValueChange", filteredItemsChange: "filteredItemsChange", tableFilterValueChange: "tableFilterValueChange" }, queries: [{ propertyName: "columnTemplates", predicate: TemplateIdDirective }], exportAs: ["cSmartTable"], usesOnChanges: true, ngImport: i0, template: "@if (itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']) {\n <div class=\"row my-2 mx-0\">\n @if (tableFilter) {\n <div class=\"col-auto p-0\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\" />\n </div>\n }\n @if (cleaner) {\n <div class=\"col-auto p-0\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\" />\n </div>\n }\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\" />\n\n <ng-template #tableFilterTemplate>\n @if (tableFilter) {\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n />\n }\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n @if (cleaner) {\n <button\n (click)=\"clean($event)\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n cButton\n color=\"transparent\"\n tabindex=\"0\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\" />\n </button>\n }\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\" />\n </div>\n </ng-template>\n </div>\n}\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n cTable\n >\n @if (header) {\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n [cAlign]=\"tableHeadProps?.align\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnFilter]=\"columnFilter\"\n [columnGroups]=\"columnGroups$()\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter()\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [showGroups]=\"showGroups$()\"\n [sorterValue]=\"sorterValue\"\n />\n }\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\" />\n\n @if (summaryRowTemplate && !footer) {\n <tfoot>\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\" />\n </tfoot>\n }\n @if (footer) {\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n [cAlign]=\"tableFootProps?.align\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter()\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [sorterValue]=\"sorterValue\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n component=\"tfoot\"\n />\n }\n\n </table>\n @if (loading) {\n <c-element-cover\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n />\n }\n</div>\n@if (pagination || itemsPerPageSelect) {\n <div class=\"row\">\n <div class=\"col\">\n @if (pagination && numberOfPages > 1) {\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\"\n />\n }\n </div>\n <div class=\"col-auto ms-auto\">\n @if (itemsPerPageSelect) {\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n />\n }\n </div>\n </div>\n}\n<ng-template #tbodyDefaultTemplate>\n <tbody [cAlign]=\"tableBodyProps?.align\"\n [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n >\n @for (item of currentItems; track item; let i = $index, cnt = $count, isEven = $even, isOdd = $odd) {\n <tr (click)=\"handleRowClick({$event, item, i})\"\n [cAlign]=\"item._props?.align\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n [tabindex]=\"clickableRows ? 0 : -1\"\n >\n @if (selectable) {\n <td [cAlign]=\"item?.['_cellProps']?._all?.align\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n cFormCheckInput\n >\n </td>\n }\n @for (column of columns$(); track column; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {column, item, columnName: getColumnKey(column), tdContent: item[column.key], cellProps: getTableDataCellProps(column, item) }\"\n />\n }\n </tr>\n @if (templates['tableDetails']) {\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" [ngStyle]=\"{borderBottomWidth: 0}\" class=\"p-0\" tabindex=\"-1\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" [ngStyle]=\"{border: 0}\" class=\"p-0\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\" />\n </td>\n </tr>\n }\n }\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\" />\n </tbody>\n</ng-template>\n\n<ng-template\n #columnDefaultTemplate\n let-cellProps=\"cellProps\"\n let-column=\"column\"\n let-columnName=\"columnName\"\n let-item=\"item\"\n let-tdContent=\"tdContent\"\n>\n @if (tdContent !== undefined) {\n <td [cAlign]=\"cellProps?.align\"\n [cHtmlAttr]=\"cellProps?.['_attributes'] ?? undefined\"\n [cTableActive]=\"cellProps?.['active']\"\n [cTableColor]=\"cellProps?.color ?? column[columnName]?._colProps?.color ?? undefined\"\n [ngClass]=\"getTableDataCellClass(column, item)\"\n [ngStyle]=\"getTableDataCellStyles(column, item)\"\n >\n {{ tdContent }}\n </td>\n }\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n @if (!currentItems.length) {\n <tr>\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{ noItemsLabel }}</td>\n </tr>\n }\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg class=\"icon icon-custom-size\" pointer-events=\"none\" role=\"img\" viewBox=\"0 0 512 512\"\n width=\"18\" xmlns=\"http://www.w3.org/2000/svg\">\n <polygon\n class=\"ci-primary\"\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\">\n </polygon>\n <polygon\n class=\"ci-primary\"\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: AlignDirective, selector: "[cAlign]", inputs: ["cAlign"] }, { kind: "directive", type: ButtonDirective, selector: "[cButton]", inputs: ["active", "color", "disabled", "shape", "size", "type", "variant"], exportAs: ["cButton"] }, { kind: "component", type: ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { kind: "directive", type: FilterInputDirective, selector: "[cFilterInput]", inputs: ["delay", "onEvent", "value"], outputs: ["valueChange"], exportAs: ["cFilterInput"] }, { kind: "directive", type: FormCheckInputDirective, selector: "input[cFormCheckInput]", inputs: ["type", "indeterminate", "valid", "checked"] }, { kind: "directive", type: HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { kind: "component", type: SmartPaginationComponent, selector: "c-smart-pagination", inputs: ["activePage", "arrows", "doubleArrows", "dots", "limit", "pages", "firstButton", "lastButton", "nextButton", "previousButton", "align", "size", "role"], outputs: ["activePageChange"], exportAs: ["cSmartPagination"] }, { kind: "component", type: SmartTableFilterComponent, selector: "c-smart-table-filter", inputs: ["filterLabel", "filterPlaceholder", "sizing"] }, { kind: "component", type: SmartTableHeadComponent, selector: "c-smart-table-head", inputs: ["columnFilter", "columnFilterState", "columnSorter", "component", "columns", "columnGroups", "selectable", "selectAll", "selectedAll", "showGroups", "sorterValue", "columnFilterTemplates", "columnLabelTemplates", "summaryRowTemplate"], outputs: ["columnFilterStateChange", "sorterStateChange", "selectAllChange"] }, { kind: "component", type: SmartTableItemsPerPageSelectorComponent, selector: "c-smart-table-items-per-page-selector", inputs: ["itemsPerPage", "itemsPerPageLabel", "itemsPerPageOptions"], outputs: ["itemsPerPageChange"] }, { kind: "directive", type: TableActiveDirective, selector: "[cTableActive]", inputs: ["cTableActive"] }, { kind: "directive", type: TableColorDirective, selector: "[cTableColor]", inputs: ["cTableColor"] }, { kind: "directive", type: TableDirective, selector: "table[cTable]", inputs: ["align", "borderColor", "bordered", "borderless", "caption", "color", "hover", "responsive", "small", "striped", "stripedColumns"] }] }); }
420
- }
421
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SmartTableComponent, decorators: [{
422
- type: Component,
423
- args: [{ selector: 'c-smart-table', exportAs: 'cSmartTable', standalone: true, imports: [
424
- AsyncPipe,
425
- NgTemplateOutlet,
426
- NgClass,
427
- NgStyle,
428
- AlignDirective,
429
- ButtonDirective,
430
- ElementCoverComponent,
431
- FilterInputDirective,
432
- FormCheckInputDirective,
433
- HtmlAttributesDirective,
434
- SmartPaginationComponent,
435
- SmartTableFilterComponent,
436
- SmartTableHeadComponent,
437
- SmartTableItemsPerPageSelectorComponent,
438
- TableActiveDirective,
439
- TableColorDirective,
440
- TableDirective,
441
- JsonPipe
442
- ], template: "@if (itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']) {\n <div class=\"row my-2 mx-0\">\n @if (tableFilter) {\n <div class=\"col-auto p-0\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\" />\n </div>\n }\n @if (cleaner) {\n <div class=\"col-auto p-0\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\" />\n </div>\n }\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\" />\n\n <ng-template #tableFilterTemplate>\n @if (tableFilter) {\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n />\n }\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n @if (cleaner) {\n <button\n (click)=\"clean($event)\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n cButton\n color=\"transparent\"\n tabindex=\"0\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\" />\n </button>\n }\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\" />\n </div>\n </ng-template>\n </div>\n}\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n cTable\n >\n @if (header) {\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n [cAlign]=\"tableHeadProps?.align\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnFilter]=\"columnFilter\"\n [columnGroups]=\"columnGroups$()\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter()\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [showGroups]=\"showGroups$()\"\n [sorterValue]=\"sorterValue\"\n />\n }\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\" />\n\n @if (summaryRowTemplate && !footer) {\n <tfoot>\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\" />\n </tfoot>\n }\n @if (footer) {\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n [cAlign]=\"tableFootProps?.align\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter()\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [sorterValue]=\"sorterValue\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n component=\"tfoot\"\n />\n }\n\n </table>\n @if (loading) {\n <c-element-cover\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n />\n }\n</div>\n@if (pagination || itemsPerPageSelect) {\n <div class=\"row\">\n <div class=\"col\">\n @if (pagination && numberOfPages > 1) {\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\"\n />\n }\n </div>\n <div class=\"col-auto ms-auto\">\n @if (itemsPerPageSelect) {\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n />\n }\n </div>\n </div>\n}\n<ng-template #tbodyDefaultTemplate>\n <tbody [cAlign]=\"tableBodyProps?.align\"\n [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n >\n @for (item of currentItems; track item; let i = $index, cnt = $count, isEven = $even, isOdd = $odd) {\n <tr (click)=\"handleRowClick({$event, item, i})\"\n [cAlign]=\"item._props?.align\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n [tabindex]=\"clickableRows ? 0 : -1\"\n >\n @if (selectable) {\n <td [cAlign]=\"item?.['_cellProps']?._all?.align\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n cFormCheckInput\n >\n </td>\n }\n @for (column of columns$(); track column; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {column, item, columnName: getColumnKey(column), tdContent: item[column.key], cellProps: getTableDataCellProps(column, item) }\"\n />\n }\n </tr>\n @if (templates['tableDetails']) {\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" [ngStyle]=\"{borderBottomWidth: 0}\" class=\"p-0\" tabindex=\"-1\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" [ngStyle]=\"{border: 0}\" class=\"p-0\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\" />\n </td>\n </tr>\n }\n }\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\" />\n </tbody>\n</ng-template>\n\n<ng-template\n #columnDefaultTemplate\n let-cellProps=\"cellProps\"\n let-column=\"column\"\n let-columnName=\"columnName\"\n let-item=\"item\"\n let-tdContent=\"tdContent\"\n>\n @if (tdContent !== undefined) {\n <td [cAlign]=\"cellProps?.align\"\n [cHtmlAttr]=\"cellProps?.['_attributes'] ?? undefined\"\n [cTableActive]=\"cellProps?.['active']\"\n [cTableColor]=\"cellProps?.color ?? column[columnName]?._colProps?.color ?? undefined\"\n [ngClass]=\"getTableDataCellClass(column, item)\"\n [ngStyle]=\"getTableDataCellStyles(column, item)\"\n >\n {{ tdContent }}\n </td>\n }\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n @if (!currentItems.length) {\n <tr>\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{ noItemsLabel }}</td>\n </tr>\n }\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg class=\"icon icon-custom-size\" pointer-events=\"none\" role=\"img\" viewBox=\"0 0 512 512\"\n width=\"18\" xmlns=\"http://www.w3.org/2000/svg\">\n <polygon\n class=\"ci-primary\"\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\">\n </polygon>\n <polygon\n class=\"ci-primary\"\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
443
- }], ctorParameters: () => [{ type: i0.IterableDiffers }, { type: i0.KeyValueDiffers }], propDecorators: { activePage: [{
444
- type: Input,
445
- args: [{ transform: numberAttribute }]
446
- }], cleaner: [{
447
- type: Input,
448
- args: [{ transform: booleanAttribute }]
449
- }], clickableRows: [{
450
- type: Input,
451
- args: [{ transform: booleanAttribute }]
452
- }], columns: [{
453
- type: Input
454
- }], columnFilter: [{
455
- type: Input
456
- }], columnFilterValue: [{
457
- type: Input
458
- }], footer: [{
459
- type: Input,
460
- args: [{ transform: booleanAttribute }]
461
- }], header: [{
462
- type: Input,
463
- args: [{ transform: booleanAttribute }]
464
- }], items: [{
465
- type: Input
466
- }], itemsPerPage: [{
467
- type: Input,
468
- args: [{ transform: numberAttribute }]
469
- }], itemsPerPageLabel: [{
470
- type: Input
471
- }], itemsPerPageOptions: [{
472
- type: Input
473
- }], itemsPerPageSelect: [{
474
- type: Input
475
- }], loading: [{
476
- type: Input
477
- }], noItemsLabel: [{
478
- type: Input
479
- }], pagination: [{
480
- type: Input,
481
- args: [{ transform: booleanAttribute }]
482
- }], selectable: [{
483
- type: Input,
484
- args: [{ transform: booleanAttribute }]
485
- }], selectAll: [{
486
- type: Input,
487
- args: [{ transform: booleanAttribute }]
488
- }], sorterValue: [{
489
- type: Input
490
- }], tableFilter: [{
491
- type: Input
492
- }], tableFilterLabel: [{
493
- type: Input
494
- }], tableFilterPlaceholder: [{
495
- type: Input
496
- }], tableFilterValue: [{
497
- type: Input
498
- }], tableBodyProps: [{
499
- type: Input
500
- }], tableFootProps: [{
501
- type: Input
502
- }], tableHeadProps: [{
503
- type: Input
504
- }], tableProps: [{
505
- type: Input
506
- }], selectedItemsChange: [{
507
- type: Output
508
- }], sorterValueChange: [{
509
- type: Output
510
- }], activePageChange: [{
511
- type: Output
512
- }], itemsPerPageChange: [{
513
- type: Output
514
- }], rowClick: [{
515
- type: Output
516
- }], columnFilterValueChange: [{
517
- type: Output
518
- }], filteredItemsChange: [{
519
- type: Output
520
- }], tableFilterValueChange: [{
521
- type: Output
522
- }], columnTemplates: [{
523
- type: ContentChildren,
524
- args: [TemplateIdDirective]
525
- }] } });
526
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbWFydC10YWJsZS9zbWFydC10YWJsZS9zbWFydC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFDTCxLQUFLLEVBS0wsZUFBZSxFQUVmLE1BQU0sRUFFTixNQUFNLEVBS1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFtQnZDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLFlBQVksRUFDWixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLFVBQVUsRUFDVixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN2QixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1RSxPQUFPLEVBQUUs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Z0I7c0JBQWxDLE1BQU07Z0JBQ1ksa0JBQWtCO3NCQUFwQyxNQUFNO2dCQUNZLFFBQVE7c0JBQTFCLE1BQU07Z0JBQ1ksdUJBQXVCO3NCQUF6QyxNQUFNO2dCQUNZLG1CQUFtQjtzQkFBckMsTUFBTTtnQkFDWSxzQkFBc0I7c0JBQXhDLE1BQU07Z0JBRStCLGVBQWU7c0JBQXBELGVBQWU7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIGlucHV0LFxuICBJbnB1dCxcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBzaWduYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBXcml0YWJsZVNpZ25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgSnNvblBpcGUsIE5nQ2xhc3MsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElUYWJsZSB9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLnR5cGUnO1xuaW1wb3J0IHtcbiAgSUNvbHVtbixcbiAgSUNvbHVtbkZpbHRlcixcbiAgSUNvbHVtbkZpbHRlclZhbHVlLFxuICBJR3JvdXAsXG4gIElJdGVtLFxuICBJSXRlbUludGVybmFsLFxuICBJU21hcnRUYWJsZSxcbiAgSVNvcnRlcixcbiAgSVNvcnRlclZhbHVlLFxuICBJVGFibGVGaWx0ZXIsXG4gIElUYWJsZVNlY3Rpb25Qcm9wcyxcbiAgSXRlbXNQZXJQYWdlU2VsZWN0LFxuICBTb3J0T3JkZXJcbn0gZnJvbSAnLi4vc21hcnQtdGFibGUudHlwZSc7XG5cbmltcG9ydCB7XG4gIGdldENsaWNrZWRDb2x1bW5OYW1lLFxuICBnZXRDb2x1bW5Hcm91cHMsXG4gIGdldENvbHVtbktleSxcbiAgZ2V0Q29sdW1uTmFtZXMsXG4gIGdldENvbHVtbk5hbWVzRnJvbUl0ZW1zLFxuICBnZXRDb2x1bW5zLFxuICBnZXRUYWJsZURhdGFDZWxsQ2xhc3MsXG4gIGdldFRhYmxlRGF0YUNlbGxQcm9wcyxcbiAgZ2V0VGFibGVEYXRhQ2VsbFN0eWxlc1xufSBmcm9tICcuLi9zbWFydC10YWJsZS51dGlscyc7XG5cbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2J1dHRvbic7XG5pbXBvcnQgeyBGb3JtQ2hlY2tJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2Zvcm0nO1xuaW1wb3J0IHsgRWxlbWVudENvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZWxlbWVudC1jb3Zlcic7XG5pbXBvcnQgeyBIdG1sQXR0cmlidXRlc0RpcmVjdGl2ZSwgVGVtcGxhdGVJZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBTbWFydFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9zbWFydC1wYWdpbmF0aW9uJztcbmltcG9ydCB7IFRhYmxlQWN0aXZlRGlyZWN0aXZlLCBUYWJsZUNvbG9yRGlyZWN0aXZlLCBUYWJsZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL3RhYmxlJztcbmltcG9ydCB7IEFsaWduRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzJztcbmltcG9ydCB7IFNtYXJ0VGFibGVGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi9zbWFydC10YWJsZS1maWx0ZXIvc21hcnQtdGFibGUtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWx0ZXJJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL3NtYXJ0LXRhYmxlLWZpbHRlci9maWx0ZXItaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNtYXJ0VGFibGVIZWFkQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtdGFibGUtaGVhZC9zbWFydC10YWJsZS1oZWFkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbWFydFRhYmxlSXRlbXNQZXJQYWdlU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3Rvci9zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3Rvci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLXNtYXJ0LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnQtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdjU21hcnRUYWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBOZ0NsYXNzLFxuICAgIE5nU3R5bGUsXG4gICAgQWxpZ25EaXJlY3RpdmUsXG4gICAgQnV0dG9uRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRDb3ZlckNvbXBvbmVudCxcbiAgICBGaWx0ZXJJbnB1dERpcmVjdGl2ZSxcbiAgICBGb3JtQ2hlY2tJbnB1dERpcmVjdGl2ZSxcbiAgICBIdG1sQXR0cmlidXRlc0RpcmVjdGl2ZSxcbiAgICBTbWFydFBhZ2luYXRpb25Db21wb25lbnQsXG4gICAgU21hcnRUYWJsZUZpbHRlckNvbXBvbmVudCxcbiAgICBTbWFydFRhYmxlSGVhZENvbXBvbmVudCxcbiAgICBTbWFydFRhYmxlSXRlbXNQZXJQYWdlU2VsZWN0b3JDb21wb25lbnQsXG4gICAgVGFibGVBY3RpdmVEaXJlY3RpdmUsXG4gICAgVGFibGVDb2xvckRpcmVjdGl2ZSxcbiAgICBUYWJsZURpcmVjdGl2ZSxcbiAgICBKc29uUGlwZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBJU21hcnRUYWJsZSwgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICBwcml2YXRlIGtleVZhbHVlRGlmZmVyczogS2V5VmFsdWVEaWZmZXJzXG4gICkge1xuICAgIHRoaXMuaXRlbXNEaWZmZXIgPSB0aGlzLml0ZXJhYmxlRGlmZmVycy5maW5kKHRoaXMuaXRlbXMpLmNyZWF0ZSgpO1xuICAgIHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5fY29sdW1uRmlsdGVyZWQpLmNyZWF0ZSgpO1xuICAgIHRoaXMuY29sdW1GaWx0ZXJWYWx1ZURpZmZlciA9IHRoaXMua2V5VmFsdWVEaWZmZXJzLmZpbmQodGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSkuY3JlYXRlKCk7XG4gICAgdGhpcy5zb3J0ZXJWYWx1ZURpZmZlciA9IHRoaXMua2V5VmFsdWVEaWZmZXJzLmZpbmQodGhpcy5zb3J0ZXJWYWx1ZSkuY3JlYXRlKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGxTdWJqZWN0Lm5leHQodGhpcy5zZWxlY3RlZEFsbCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICByZWFkb25seSBnZXRDb2x1bW5LZXkgPSBnZXRDb2x1bW5LZXk7XG4gIHJlYWRvbmx5IGdldFRhYmxlRGF0YUNlbGxDbGFzcyA9IGdldFRhYmxlRGF0YUNlbGxDbGFzcztcbiAgcmVhZG9ubHkgZ2V0VGFibGVEYXRhQ2VsbFByb3BzID0gZ2V0VGFibGVEYXRhQ2VsbFByb3BzO1xuICByZWFkb25seSBnZXRUYWJsZURhdGFDZWxsU3R5bGVzID0gZ2V0VGFibGVEYXRhQ2VsbFN0eWxlcztcblxuICByZWFkb25seSBzZWxlY3RlZEFsbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZSc+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zRGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+IHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpdGVtc0ZpbHRlcmVkRGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+IHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2x1bUZpbHRlclZhbHVlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxhbnksIGFueT4gfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHNvcnRlclZhbHVlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxhbnksIGFueT4gfCBudWxsO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHNldCBhY3RpdmVQYWdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9hY3RpdmVQYWdlID0gdmFsdWUgfHwgMTtcbiAgICB0aGlzLmFjdGl2ZVBhZ2VDaGFuZ2UuZW1pdCh0aGlzLl9hY3RpdmVQYWdlKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmVQYWdlID0gMTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2xlYW5lciA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGlja2FibGVSb3dzID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGNvbHVtbnModmFsdWU6IChzdHJpbmcgfCBJQ29sdW1uIHwgSUdyb3VwKVtdKSB7XG4gICAgY29uc3QgY29sT2JqZWN0cyA9IHZhbHVlLm1hcCgoY29sdW1uKSA9PiAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycgPyB7IGtleTogY29sdW1uIH0gOiB7IC4uLmNvbHVtbiB9KSk7XG4gICAgY29uc3QgY29sdW1uczogSUNvbHVtbltdID0gZ2V0Q29sdW1ucyhjb2xPYmplY3RzKTtcbiAgICB0aGlzLmNvbHVtbnMkLnNldChjb2x1bW5zKTtcblxuICAgIC8vIHRvZG86IElucHV0IGNvbHVtbkdyb3VwcyAtIHNlcGFyYXRpb24/XG4gICAgLy8gY29uc29sZS5sb2coZ2V0Q29sdW1uR3JvdXBzKGNvbE9iamVjdHMgPz8gW10pKTtcbiAgICBjb25zdCBncm91cHMgPSBnZXRDb2x1bW5Hcm91cHModmFsdWUgPz8gW10pO1xuICAgIHRoaXMuY29sdW1uR3JvdXBzJC5zZXQoZ3JvdXBzKTtcbiAgfVxuXG4gIGdldCBjb2x1bW5zKCk6IElDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucyQoKTtcbiAgfVxuXG4gIGNvbHVtbnMkOiBXcml0YWJsZVNpZ25hbDxJQ29sdW1uW10+ID0gc2lnbmFsKFtdKTtcbiAgY29sdW1uR3JvdXBzJDogV3JpdGFibGVTaWduYWw8SUdyb3VwW11bXT4gPSBzaWduYWwoW10pO1xuICBzaG93R3JvdXBzJCA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5jb2x1bW5Hcm91cHMkKCkubGVuZ3RoKTtcblxuICBASW5wdXQoKSBjb2x1bW5GaWx0ZXI/OiBib29sZWFuIHwgSUNvbHVtbkZpbHRlcjtcblxuICBASW5wdXQoKVxuICBzZXQgY29sdW1uRmlsdGVyVmFsdWUodmFsdWU6IElDb2x1bW5GaWx0ZXJWYWx1ZSkge1xuICAgIGlmICh0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIuZGlmZih2YWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLl9jb2x1bW5GaWx0ZXJWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHsgLi4udGhpcy5fY29sdW1uRmlsdGVyVmFsdWUgfSk7XG4gICAgICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy8gZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY29sdW1uRmlsdGVyVmFsdWUoKTogSUNvbHVtbkZpbHRlclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRmlsdGVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5GaWx0ZXJWYWx1ZTogSUNvbHVtbkZpbHRlclZhbHVlID0ge307XG5cbiAgcmVhZG9ubHkgY29sdW1uU29ydGVyID0gaW5wdXQ8Ym9vbGVhbiB8IElTb3J0ZXI+KGZhbHNlKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZm9vdGVyID0gZmFsc2U7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhlYWRlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpdGVtcyh2YWx1ZTogSUl0ZW1bXSkge1xuICAgIGlmICh0aGlzLml0ZW1zRGlmZmVyKSB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtc0RpZmZlci5kaWZmKHZhbHVlKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdGhpcy5zZXRJdGVtcyh2YWx1ZSkgYXMgVHlwZTxJSXRlbUludGVybmFsPltdO1xuICAgICAgICB0aGlzLml0ZW1zJC5zZXQodGhpcy5faXRlbXMpO1xuICAgICAgICBpZiAoIXRoaXMuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBnZXRDb2x1bW5OYW1lc0Zyb21JdGVtcyh0aGlzLml0ZW1zJCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBpdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cblxuICBpdGVtcyQgPSBzaWduYWwoW10gYXMgSUl0ZW1JbnRlcm5hbFtdKTtcbiAgcHJpdmF0ZSBfaXRlbXM6IElJdGVtSW50ZXJuYWxbXSA9IFtdIGFzIFR5cGU8SUl0ZW1JbnRlcm5hbD5bXTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBzZXQgaXRlbXNQZXJQYWdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9pdGVtc1BlclBhZ2UgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBpdGVtc1BlclBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXNQZXJQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXRlbXNQZXJQYWdlOiBudW1iZXIgPSAxMDtcblxuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VMYWJlbDogc3RyaW5nID0gJ0l0ZW1zIHBlciBwYWdlOic7XG4gIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyMCwgNTBdO1xuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VTZWxlY3Q/OiBib29sZWFuIHwgSXRlbXNQZXJQYWdlU2VsZWN0O1xuICBASW5wdXQoKSBsb2FkaW5nPzogYm9vbGVhbjtcbiAgQElucHV0KCkgbm9JdGVtc0xhYmVsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+ID0gJ05vIGl0ZW1zIGZvdW5kJztcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcGFnaW5hdGlvbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgc2VsZWN0YWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlbGVjdGFibGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzZWxlY3RBbGwgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBzb3J0ZXJWYWx1ZSh2YWx1ZTogSVNvcnRlclZhbHVlKSB7XG4gICAgaWYgKHRoaXMuc29ydGVyVmFsdWVEaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLnNvcnRlclZhbHVlRGlmZmVyLmRpZmYodmFsdWUpO1xuICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5fc29ydGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zb3J0ZXJWYWx1ZUNoYW5nZS5lbWl0KHsgLi4udmFsdWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNvcnRlclZhbHVlKCk6IElTb3J0ZXJWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc29ydGVyVmFsdWU6IElTb3J0ZXJWYWx1ZSA9IHt9O1xuXG4gIEBJbnB1dCgpXG4gIHNldCB0YWJsZUZpbHRlcihmaWx0ZXIpIHtcbiAgICB0aGlzLl90YWJsZUZpbHRlciA9IGZpbHRlcjtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJMYWJlbCA9IHR5cGVvZiBmaWx0ZXIubGFiZWwgPT09ICdzdHJpbmcnID8gZmlsdGVyLmxhYmVsIDogdGhpcy50YWJsZUZpbHRlckxhYmVsO1xuICAgICAgdGhpcy50YWJsZUZpbHRlclBsYWNlaG9sZGVyID1cbiAgICAgICAgdHlwZW9mIGZpbHRlci5wbGFjZWhvbGRlciA9PT0gJ3N0cmluZycgPyBmaWx0ZXIucGxhY2Vob2xkZXIgOiB0aGlzLnRhYmxlRmlsdGVyUGxhY2Vob2xkZXI7XG4gICAgICB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgPSB0eXBlb2YgZmlsdGVyLnZhbHVlID09PSAnc3RyaW5nJyA/IGZpbHRlci52YWx1ZSA6IHRoaXMudGFibGVGaWx0ZXJWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlRmlsdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVGaWx0ZXI/OiBib29sZWFuIHwgSVRhYmxlRmlsdGVyO1xuXG4gIEBJbnB1dCgpIHRhYmxlRmlsdGVyTGFiZWwgPSAnRmlsdGVyOic7XG4gIEBJbnB1dCgpIHRhYmxlRmlsdGVyUGxhY2Vob2xkZXIgPSAndHlwZSBzdHJpbmcuLi4nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCB0YWJsZUZpbHRlclZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fdGFibGVGaWx0ZXJWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3RhYmxlRmlsdGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy8gZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcbiAgICB9XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUZpbHRlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVGaWx0ZXJWYWx1ZTogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KCkgdGFibGVCb2R5UHJvcHM/OiBJVGFibGVTZWN0aW9uUHJvcHMgPSB7fTtcbiAgQElucHV0KCkgdGFibGVGb290UHJvcHM/OiBJVGFibGVTZWN0aW9uUHJvcHMgPSB7fTtcbiAgQElucHV0KCkgdGFibGVIZWFkUHJvcHM/OiBJVGFibGVTZWN0aW9uUHJvcHMgPSB7fTtcbiAgQElucHV0KCkgdGFibGVQcm9wcz86IElUYWJsZSA9IHt9O1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SUl0ZW1bXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElJdGVtW10+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzb3J0ZXJWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPElTb3J0ZXJWYWx1ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0ZXJWYWx1ZT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGFjdGl2ZVBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBpdGVtc1BlclBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSByb3dDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SUNvbHVtbkZpbHRlclZhbHVlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbkZpbHRlclZhbHVlPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZmlsdGVyZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPElJdGVtSW50ZXJuYWxbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElJdGVtSW50ZXJuYWxbXT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHRhYmxlRmlsdGVyVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZUlkRGlyZWN0aXZlKSBjb2x1bW5UZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVJZERpcmVjdGl2ZT47XG4gIHRlbXBsYXRlczogeyBba2V5OiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB9ID0geyB0YWJsZURldGFpbHM6IG51bGwsIHRhYmxlRGF0YTogbnVsbCB9O1xuICBjb2x1bW5GaWx0ZXJUZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgfSA9IHt9O1xuICBjb2x1bW5MYWJlbFRlbXBsYXRlczogeyBba2V5OiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB9ID0ge307XG4gIHN1bW1hcnlSb3dUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5UZW1wbGF0ZXMuZm9yRWFjaCgoY2hpbGQ6IFRlbXBsYXRlSWREaXJlY3RpdmUpID0+IHtcbiAgICAgIGlmIChjaGlsZC5pZC5zdGFydHNXaXRoKCdjb2x1bW5GaWx0ZXJfJykpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXJUZW1wbGF0ZXNbY2hpbGQuaWRdID0gY2hpbGQudGVtcGxhdGVSZWY7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZC5pZC5zdGFydHNXaXRoKCdjb2x1bW5MYWJlbF8nKSkge1xuICAgICAgICB0aGlzLmNvbHVtbkxhYmVsVGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQuaWQgPT09ICd0YWJsZVN1bW1hcnlSb3cnKSB7XG4gICAgICAgIHRoaXMuc3VtbWFyeVJvd1RlbXBsYXRlID0gY2hpbGQudGVtcGxhdGVSZWY7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMudGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgIH0pO1xuICAgIHRoaXMuY29sdW1uRmlsdGVyVGVtcGxhdGVzID0geyAuLi50aGlzLmNvbHVtbkZpbHRlclRlbXBsYXRlcyB9O1xuICAgIHRoaXMuY29sdW1uTGFiZWxUZW1wbGF0ZXMgPSB7IC4uLnRoaXMuY29sdW1uTGFiZWxUZW1wbGF0ZXMgfTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZEFsbCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaXRlbXMuc29tZSgoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IHRydWUpO1xuICAgIGNvbnN0IHVuc2VsZWN0ZWQgPSB0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSBmYWxzZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkICYmIHVuc2VsZWN0ZWQgPyAnaW5kZXRlcm1pbmF0ZScgOiBzZWxlY3RlZDtcbiAgfVxuXG4gIGdldCB0YWJsZUZpbHRlclN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgPyB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgOiAnJztcbiAgfVxuXG4gIGdldCBjb2x1bW5GaWx0ZXJTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA/IHRoaXMuY29sdW1uRmlsdGVyVmFsdWUgOiB7fTtcbiAgfVxuXG4gIGdldCBudW1iZXJPZlBhZ2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zUGVyUGFnZSA/IE1hdGguY2VpbCh0aGlzLnNvcnRlZEl0ZW1zLmxlbmd0aCAvIHRoaXMuX2l0ZW1zUGVyUGFnZSkgOiAxO1xuICB9XG5cbiAgZ2V0IGNvbHNwYW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZSA/IHRoaXMucmF3Q29sdW1uTmFtZXMkKCkubGVuZ3RoICsgMSA6IHRoaXMucmF3Q29sdW1uTmFtZXMkKCkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGZpcnN0SXRlbU9uQWN0aXZlUGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2UgPyAodGhpcy5fYWN0aXZlUGFnZSAtIDEpICogdGhpcy5faXRlbXNQZXJQYWdlIDogMDtcbiAgfVxuXG4gIGdldCBpdGVtc09uQWN0aXZlUGFnZSgpOiBJSXRlbUludGVybmFsW10ge1xuICAgIHJldHVybiB0aGlzLnNvcnRlZEl0ZW1zLnNsaWNlKFxuICAgICAgdGhpcy5maXJzdEl0ZW1PbkFjdGl2ZVBhZ2VJbmRleCxcbiAgICAgIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXggKyB0aGlzLl9pdGVtc1BlclBhZ2VcbiAgICApO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRJdGVtcygpOiBJSXRlbUludGVybmFsW10ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQYWdlID8gdGhpcy5pdGVtc09uQWN0aXZlUGFnZSA6ICh0aGlzLnNvcnRlZEl0ZW1zID8/IFtdKTtcbiAgfVxuXG4gIHJhd0NvbHVtbk5hbWVzJCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZXModGhpcy5jb2x1bW5zJCgpLCB0aGlzLml0ZW1zJCgpKTtcbiAgfSk7XG5cbiAgaXRlbXNEYXRhQ29sdW1ucyQgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMucmF3Q29sdW1uTmFtZXMkKCkuZmlsdGVyKChuYW1lKSA9PiBnZXRDb2x1bW5OYW1lc0Zyb21JdGVtcyh0aGlzLml0ZW1zJCgpKS5pbmNsdWRlcyhuYW1lKSlcbiAgKTtcblxuICBnZXQgc29ydGVkSXRlbXMoKTogSUl0ZW1JbnRlcm5hbFtdIHtcbiAgICBjb25zdCBjb2x1bW5LZXkgPSB0aGlzLnNvcnRlclZhbHVlLmNvbHVtbjtcbiAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0gY29sdW1uS2V5KTtcbiAgICBjb25zdCBjb2x1bW5Tb3J0ZXIgPSB0aGlzLmNvbHVtblNvcnRlcigpO1xuXG4gICAgaWYgKFxuICAgICAgIWNvbHVtbktleSB8fFxuICAgICAgKCF0aGlzLml0ZW1zRGF0YUNvbHVtbnMkKCkuaW5jbHVkZXMoY29sdW1uS2V5KSAmJiB0eXBlb2YgY3VycmVudENvbHVtbj8uc29ydGVyICE9PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgKHR5cGVvZiBjb2x1bW5Tb3J0ZXIgPT09ICdvYmplY3QnICYmIGNvbHVtblNvcnRlci5leHRlcm5hbClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyZWQ7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQgPSBbLi4udGhpcy50YWJsZUZpbHRlcmVkXTtcblxuICAgIC8vIGlmIHZhbHVlcyBpbiBjb2x1bW4gYXJlIHRvIGJlIHNvcnRlZCBieSBudW1lcmljIHZhbHVlIHRoZXkgYWxsIGhhdmUgdG8gYmUgYSB0eXBlIG9mIG51bWJlclxuICAgIGNvbnN0IGZsaXAgPSB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnYXNjJyA/IDEgOiB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnZGVzYycgPyAtMSA6IDA7XG5cbiAgICBpZiAoZmxpcCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRhYmxlRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdXJyZW50Q29sdW1uPy5zb3J0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IHRhYmxlRmlsdGVyZWQuc2xpY2UoKS5zb3J0KGN1cnJlbnRDb2x1bW4uc29ydGVyKTtcbiAgICAgIHJldHVybiBmbGlwIDwgMCA/IHNvcnRlZC5yZXZlcnNlKCkgOiBzb3J0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGFyZUZuID0gKGl0ZW0xOiB7IFt4OiBzdHJpbmddOiBhbnkgfSwgaXRlbTI6IHsgW3g6IHN0cmluZ106IGFueSB9KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTEgPSBpdGVtMVtjb2x1bW5LZXldO1xuICAgICAgY29uc3QgdmFsdWUyID0gaXRlbTJbY29sdW1uS2V5XTtcbiAgICAgIGNvbnN0IGEgPSB0eXBlb2YgdmFsdWUxID09PSAnbnVtYmVyJyA/IHZhbHVlMSA6IFN0cmluZyh2YWx1ZTEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBiID0gdHlwZW9mIHZhbHVlMiA9PT0gJ251bWJlcicgPyB2YWx1ZTIgOiBTdHJpbmcodmFsdWUyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIGEgPiBiID8gMSAqIGZsaXAgOiBiID4gYSA/IC0xICogZmxpcCA6IDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0YWJsZUZpbHRlcmVkLnNsaWNlKCkuc29ydChjb21wYXJlRm4pO1xuICB9XG5cbiAgZ2V0IHRhYmxlRmlsdGVyRXZlbnQoKTogJ2NoYW5nZScgfCAnaW5wdXQnIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMudGFibGVGaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMudGFibGVGaWx0ZXIubGF6eSA/ICdjaGFuZ2UnIDogJ2lucHV0JztcbiAgfVxuXG4gIHByaXZhdGUgX2NvbHVtbkZpbHRlcmVkOiBJSXRlbUludGVybmFsW10gPSBbXTtcblxuICBnZXQgY29sdW1uRmlsdGVyZWQoKTogSUl0ZW1JbnRlcm5hbFtdIHtcbiAgICBsZXQgX2l0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgaWYgKHRoaXMuY29sdW1uRmlsdGVyICYmIHR5cGVvZiB0aGlzLmNvbHVtbkZpbHRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy5jb2x1bW5GaWx0ZXIuZXh0ZXJuYWwpIHtcbiAgICAgIHRoaXMuX2NvbHVtbkZpbHRlcmVkID0gX2l0ZW1zO1xuICAgICAgcmV0dXJuIF9pdGVtcztcbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5jb2x1bW5GaWx0ZXJTdGF0ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICBfaXRlbXMgPSBfaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB2YWx1ZShpdGVtW2tleV0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudENvbHVtbj8uZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoXG4gICAgICAgICAgKGl0ZW0pID0+ICh0eXBlb2YgY3VycmVudENvbHVtbi5maWx0ZXIgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudENvbHVtbi5maWx0ZXIoaXRlbSwgdmFsdWUpKSA/PyAhdmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2x1bW5GaWx0ZXIgPSBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY29sdW1uRmlsdGVyICYmIHRoaXMuaXRlbXNEYXRhQ29sdW1ucyQoKS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IFN0cmluZyhpdGVtW2tleV0pLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29sdW1uRmlsdGVyKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fY29sdW1uRmlsdGVyZWQgPSBfaXRlbXM7XG4gICAgcmV0dXJuIF9pdGVtcztcbiAgfVxuXG4gIGdldCB0YWJsZUZpbHRlcmVkKCk6IElJdGVtSW50ZXJuYWxbXSB7XG4gICAgbGV0IGl0ZW1zID0gdGhpcy5jb2x1bW5GaWx0ZXJlZDtcbiAgICBpZiAoXG4gICAgICAhdGhpcy50YWJsZUZpbHRlclN0YXRlIHx8XG4gICAgICAodGhpcy50YWJsZUZpbHRlciAmJiB0eXBlb2YgdGhpcy50YWJsZUZpbHRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy50YWJsZUZpbHRlci5leHRlcm5hbClcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlci5kaWZmKGl0ZW1zKTtcbiAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXNDaGFuZ2UuZW1pdChpdGVtcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy50YWJsZUZpbHRlclN0YXRlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdmFsdWVDb250YWluRmlsdGVyID0gKHZhbDogYW55KSA9PiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKChpdGVtOiB7IFt4OiBzdHJpbmddOiBhbnkgfSkgPT4ge1xuICAgICAgcmV0dXJuICEhdGhpcy5pdGVtc0RhdGFDb2x1bW5zJCgpLmZpbmQoKGtleSkgPT4gdmFsdWVDb250YWluRmlsdGVyKGl0ZW1ba2V5XSkpO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIuZGlmZihpdGVtcyk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXNDaGFuZ2UuZW1pdChpdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGdldCBpc0ZpbHRlcmVkKCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyU3RhdGUgfHwgdGhpcy5zb3J0ZXJWYWx1ZT8uY29sdW1uIHx8IE9iamVjdC52YWx1ZXModGhpcy5jb2x1bW5GaWx0ZXJTdGF0ZSkuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIHNldEl0ZW1zKGl0ZW1zOiBJSXRlbVtdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtOiBJSXRlbSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBfX19pZDogaXRlbVsnX19faWQnXSA/PyBpbmRleCB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiA8SUl0ZW1JbnRlcm5hbD5bXTtcbiAgfVxuXG4gIGhhbmRsZVNvcnRDaGFuZ2UoJGV2ZW50OiB7IGNvbHVtbktleTogc3RyaW5nOyBpbmRleDogbnVtYmVyOyBvcmRlcj86IFNvcnRPcmRlciB9KSB7XG4gICAgdGhpcy5oYW5kbGVTb3J0ZXJDaGFuZ2UoJGV2ZW50LmNvbHVtbktleSwgJGV2ZW50LmluZGV4LCAkZXZlbnQub3JkZXIpO1xuICB9XG5cbiAgaXNTb3J0YWJsZShpOiBudW1iZXIpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2x1bW5Tb3J0ZXIgPSB0aGlzLmNvbHVtblNvcnRlcigpO1xuXG4gICAgaWYgKCFjb2x1bW5Tb3J0ZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5LZXkgPSB0aGlzLnJhd0NvbHVtbk5hbWVzJCgpW2ldO1xuICAgIGNvbnN0IGlzRGF0YUNvbHVtbiA9IHRoaXMuaXRlbXNEYXRhQ29sdW1ucyQoKS5pbmNsdWRlcyhjb2x1bW5LZXkpO1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcblxuICAgIGNvbnN0IGlzQ29sdW1uU29ydGFibGUgPSAhdGhpcy5jb2x1bW5zLmxlbmd0aCB8fCB0eXBlb2YgY29sdW1uICE9PSAnb2JqZWN0JyB8fCBjb2x1bW4uc29ydGVyICE9PSBmYWxzZTtcbiAgICBjb25zdCBpc0V4dGVybmFsU29ydGVyID0gdHlwZW9mIGNvbHVtblNvcnRlciA9PT0gJ29iamVjdCcgJiYgY29sdW1uU29ydGVyLmV4dGVybmFsO1xuXG4gICAgcmV0dXJuIChpc0NvbHVtblNvcnRhYmxlICYmIChpc0RhdGFDb2x1bW4gfHwgdHlwZW9mIGNvbHVtbj8uc29ydGVyID09PSAnZnVuY3Rpb24nKSkgfHwgaXNFeHRlcm5hbFNvcnRlcjtcbiAgfVxuXG4gIGhhbmRsZVNvcnRlckNoYW5nZShjb2x1bW46IHN0cmluZywgaW5kZXg6IG51bWJlciwgb3JkZXI/OiBTb3J0T3JkZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTb3J0YWJsZShpbmRleCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy9pZiBjb2x1bW4gY2hhbmdlZCBvciBzb3J0IHdhcyBkZXNjZW5kaW5nIGNoYW5nZSBhc2MgdG8gdHJ1ZVxuICAgIGNvbnN0IHNvcnRlclN0YXRlID0geyAuLi50aGlzLnNvcnRlclZhbHVlIH07XG5cbiAgICBpZiAoc29ydGVyU3RhdGUuY29sdW1uID09PSBjb2x1bW4pIHtcbiAgICAgIGNvbnN0IGNvbHVtblNvcnRlciA9IHRoaXMuY29sdW1uU29ydGVyKCk7XG4gICAgICBjb25zdCByZXNldHRhYmxlID1cbiAgICAgICAgY29sdW1uU29ydGVyID09PSB0cnVlIHx8XG4gICAgICAgICh0eXBlb2YgY29sdW1uU29ydGVyID09PSAnb2JqZWN0JyAmJiBjb2x1bW5Tb3J0ZXIucmVzZXRhYmxlICE9PSBmYWxzZSAmJiBjb2x1bW5Tb3J0ZXIucmVzZXR0YWJsZSAhPT0gZmFsc2UpO1xuICAgICAgY29uc3Qgc3RhdGUgPSBzb3J0ZXJTdGF0ZS5zdGF0ZTtcbiAgICAgIGlmIChvcmRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNvcnRlclN0YXRlLnN0YXRlID0gc3RhdGUgPT09IDAgPyAnYXNjJyA6IHN0YXRlID09PSAnYXNjJyA/ICdkZXNjJyA6IHJlc2V0dGFibGUgPyAwIDogJ2FzYyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3J0ZXJTdGF0ZS5zdGF0ZSA9IG9yZGVyID09PSAwICYmICFyZXNldHRhYmxlID8gc3RhdGUgOiBvcmRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc29ydGVyU3RhdGUuY29sdW1uID0gY29sdW1uO1xuICAgICAgc29ydGVyU3RhdGUuc3RhdGUgPSAnYXNjJztcbiAgICB9XG4gICAgdGhpcy5zb3J0ZXJWYWx1ZSA9IHsgLi4uc29ydGVyU3RhdGUgfTtcbiAgfVxuXG4gIHNldEFjdGl2ZVBhZ2UoJGV2ZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgPSAkZXZlbnQ7XG4gIH1cblxuICBoYW5kbGVDb2x1bW5GaWx0ZXJDaGFuZ2UoJGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IGNvbHVtbiwgdmFsdWUsIHR5cGUgfSA9ICRldmVudDtcbiAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA9IHsgLi4udGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSwgW2Ake2NvbHVtbn1gXTogdmFsdWUgfTtcbiAgfVxuXG4gIGhhbmRsZVRhYmxlRmlsdGVyQ2hhbmdlKCRldmVudDogeyB2YWx1ZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUgfSA9ICRldmVudDtcbiAgICBjb25zdCBpc0xhenkgPSB0eXBlb2YgdGhpcy50YWJsZUZpbHRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy50YWJsZUZpbHRlci5sYXp5ID09PSB0cnVlO1xuICAgIGlmICgoKGlzTGF6eSAmJiB0eXBlID09PSAnaW5wdXQnKSB8fCAoIWlzTGF6eSAmJiB0eXBlID09PSAnY2hhbmdlJykpICYmIHZhbHVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBjbGVhbigkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID0ge307XG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gJyc7XG4gICAgdGhpcy5zb3J0ZXJWYWx1ZSA9IHt9O1xuICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy9lbWl0cyB0YWJsZUZpbHRlcmVkIGNoYW5nZVxuICB9XG5cbiAgaGFuZGxlSXRlbXNQZXJQYWdlQ2hhbmdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2l0ZW1zUGVyUGFnZSkge1xuICAgICAgdGhpcy5zZXRBY3RpdmVQYWdlKDEpO1xuICAgICAgdGhpcy5faXRlbXNQZXJQYWdlID0gdmFsdWU7XG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVSb3dDaGVja2VkKCRldmVudDogRXZlbnQsIGl0ZW06IElJdGVtSW50ZXJuYWwpIHtcbiAgICBpdGVtLl9zZWxlY3RlZCA9IGl0ZW0uX3NlbGVjdGFibGUgIT09IGZhbHNlICYmICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQodGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSB0cnVlKSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxsU3ViamVjdC5uZXh0KHRoaXMuc2VsZWN0ZWRBbGwpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5faXRlbXMgPSB0aGlzLml0ZW1zLm1hcCgoaXRlbTogSUl0ZW1JbnRlcm5hbCkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgX3NlbGVjdGVkOiBpdGVtLl9zZWxlY3RhYmxlICE9PSBmYWxzZSA/ICRldmVudCA6ICEhaXRlbS5fc2VsZWN0ZWQgfTtcbiAgICB9KTtcbiAgICB0aGlzLnNlbGVjdGVkQWxsU3ViamVjdC5uZXh0KCRldmVudCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdCh0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IHRydWUpKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGxTdWJqZWN0Lm5leHQodGhpcy5zZWxlY3RlZEFsbCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBoYW5kbGVSb3dDbGljayhwYXJhbTogeyAkZXZlbnQ6IE1vdXNlRXZlbnQ7IGl0ZW06IElJdGVtSW50ZXJuYWw7IGk6IG51bWJlciB9KSB7XG4gICAgY29uc3QgeyAkZXZlbnQsIGl0ZW0sIGkgfSA9IHsgLi4ucGFyYW0gfTtcbiAgICBjb25zdCB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSB0aGlzLnJhd0NvbHVtbk5hbWVzJCgpO1xuICAgIGNvbnN0IHNlbGVjdGFibGUgPSB0aGlzLl9zZWxlY3RhYmxlO1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBnZXRDbGlja2VkQ29sdW1uTmFtZSh0YXJnZXQsIGNvbHVtbk5hbWVzLCBzZWxlY3RhYmxlKTtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyBpdGVtOiBpdGVtLCBpbmRleDogaSArIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgsIGNvbHVtbk5hbWUsIGV2ZW50OiAkZXZlbnQgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbHVtbkZpbHRlclZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlID0gY2hhbmdlc1snY29sdW1uRmlsdGVyVmFsdWUnXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudFZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjdXJyZW50VmFsdWUgPz8ge30pLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUZpbHRlclZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IHRhYmxlRmlsdGVyVmFsdWVDaGFuZ2UgPSBjaGFuZ2VzWyd0YWJsZUZpbHRlclZhbHVlJ107XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0YWJsZUZpbHRlclZhbHVlQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAoaXRlbXNQZXJQYWdlU2VsZWN0IHx8IHRhYmxlRmlsdGVyIHx8IGNsZWFuZXIgfHwgdGVtcGxhdGVzWyd0YWJsZUN1c3RvbUhlYWRlciddKSB7XG4gIDxkaXYgY2xhc3M9XCJyb3cgbXktMiBteC0wXCI+XG4gICAgQGlmICh0YWJsZUZpbHRlcikge1xuICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHAtMFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVGaWx0ZXJUZW1wbGF0ZVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChjbGVhbmVyKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZUNsZWFuZXJUZW1wbGF0ZVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVDdXN0b21IZWFkZXInXSB8fCB0YWJsZUN1c3RvbUhlYWRlclRlbXBsYXRlXCIgLz5cblxuICAgIDxuZy10ZW1wbGF0ZSAjdGFibGVGaWx0ZXJUZW1wbGF0ZT5cbiAgICAgIEBpZiAodGFibGVGaWx0ZXIpIHtcbiAgICAgICAgPGMtc21hcnQtdGFibGUtZmlsdGVyXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZVRhYmxlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtkZWxheV09XCIzMDBcIlxuICAgICAgICAgIFtmaWx0ZXJMYWJlbF09XCJ0YWJsZUZpbHRlckxhYmVsXCJcbiAgICAgICAgICBbZmlsdGVyUGxhY2Vob2xkZXJdPVwidGFibGVGaWx0ZXJQbGFjZWhvbGRlclwiXG4gICAgICAgICAgW29uRXZlbnRdPVwidGFibGVGaWx0ZXJFdmVudFwiXG4gICAgICAgICAgW3ZhbHVlXT1cInRhYmxlRmlsdGVyU3RhdGVcIlxuICAgICAgICAgIGNGaWx0ZXJJbnB1dFxuICAgICAgICAvPlxuICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI3RhYmxlQ2xlYW5lclRlbXBsYXRlPlxuICAgICAgQGlmIChjbGVhbmVyKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiY2xlYW4oJGV2ZW50KVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0ZpbHRlcmVkXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J21zLTEnOiB0YWJsZUZpbHRlcn1cIlxuICAgICAgICAgIGNCdXR0b25cbiAgICAgICAgICBjb2xvcj1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlckljb25UZW1wbGF0ZVwiIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI3RhYmxlQ3VzdG9tSGVhZGVyVGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wIG1zLWF1dG9cIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2N1c3RvbUhlYWRlcl1cIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG59XG48ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgPHRhYmxlIFthbGlnbl09XCJ0YWJsZVByb3BzPy5hbGlnblwiXG4gICAgICAgICBbYm9yZGVyQ29sb3JdPVwidGFibGVQcm9wcz8uYm9yZGVyQ29sb3JcIlxuICAgICAgICAgW2JvcmRlcmVkXT1cInRhYmxlUHJvcHM/LmJvcmRlcmVkID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbYm9yZGVybGVzc109XCJ0YWJsZVByb3BzPy5ib3JkZXJsZXNzID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbY0h0bWxBdHRyXT1cInRhYmxlUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIFtjYXB0aW9uXT1cInRhYmxlUHJvcHM/LmNhcHRpb25cIlxuICAgICAgICAgW2NvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIFtob3Zlcl09XCJ0YWJsZVByb3BzPy5ob3ZlciA/PyB1bmRlZmluZWRcIlxuICAgICAgICAgW3Jlc3BvbnNpdmVdPVwidGFibGVQcm9wcz8ucmVzcG9uc2l2ZVwiXG4gICAgICAgICBbc21hbGxdPVwidGFibGVQcm9wcz8uc21hbGwgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIFtzdHJpcGVkXT1cInRhYmxlUHJvcHM/LnN0cmlwZWQgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIGNUYWJsZVxuICA+XG4gICAgQGlmIChoZWFkZXIpIHtcbiAgICAgIDxjLXNtYXJ0LXRhYmxlLWhlYWRcbiAgICAgICAgKGNvbHVtbkZpbHRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZUNvbHVtbkZpbHRlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChzb3J0ZXJTdGF0ZUNoYW5nZSk9XCJoYW5kbGVTb3J0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICBbY0FsaWduXT1cInRhYmxlSGVhZFByb3BzPy5hbGlnblwiXG4gICAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVIZWFkUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVIZWFkUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgW2NvbHVtbkZpbHRlclN0YXRlXT1cImNvbHVtbkZpbHRlclN0YXRlXCJcbiAgICAgICAgW2NvbHVtbkZpbHRlclRlbXBsYXRlc109XCJjb2x1bW5GaWx0ZXJUZW1wbGF0ZXNcIlxuICAgICAgICBbY29sdW1uRmlsdGVyXT1cImNvbHVtbkZpbHRlclwiXG4gICAgICAgIFtjb2x1bW5Hcm91cHNdPVwiY29sdW1uR3JvdXBzJCgpXCJcbiAgICAgICAgW2NvbHVtbkxhYmVsVGVtcGxhdGVzXT1cImNvbHVtbkxhYmVsVGVtcGxhdGVzXCJcbiAgICAgICAgW2NvbHVtblNvcnRlcl09XCJjb2x1bW5Tb3J0ZXIoKVwiXG4gICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnMkKClcIlxuICAgICAgICBbc2VsZWN0QWxsXT1cInNlbGVjdEFsbFwiXG4gICAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIlxuICAgICAgICBbc2VsZWN0ZWRBbGxdPVwiKHNlbGVjdGVkQWxsU3ViamVjdCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICAgIFtzaG93R3JvdXBzXT1cInNob3dHcm91cHMkKClcIlxuICAgICAgICBbc29ydGVyVmFsdWVdPVwic29ydGVyVmFsdWVcIlxuICAgICAgLz5cbiAgICB9XG5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGJvZHlEZWZhdWx0VGVtcGxhdGVcIiAvPlxuXG4gICAgQGlmIChzdW1tYXJ5Um93VGVtcGxhdGUgJiYgIWZvb3Rlcikge1xuICAgICAgPHRmb290PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1bW1hcnlSb3dUZW1wbGF0ZVwiIC8+XG4gICAgICA8L3Rmb290PlxuICAgIH1cbiAgICBAaWYgKGZvb3Rlcikge1xuICAgICAgPGMtc21hcnQtdGFibGUtaGVhZFxuICAgICAgICAoc2VsZWN0QWxsQ2hhbmdlKT1cImhhbmRsZVNlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKHNvcnRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZVNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIFtjQWxpZ25dPVwidGFibGVGb290UHJvcHM/LmFsaWduXCJcbiAgICAgICAgW2NIdG1sQXR0cl09XCJ0YWJsZUZvb3RQcm9wcz8uYXR0cmlidXRlcyA/PyB7fVwiXG4gICAgICAgIFtjVGFibGVDb2xvcl09XCJ0YWJsZUZvb3RQcm9wcz8uY29sb3JcIlxuICAgICAgICBbY29sdW1uRmlsdGVyVGVtcGxhdGVzXT1cImNvbHVtbkZpbHRlclRlbXBsYXRlc1wiXG4gICAgICAgIFtjb2x1bW5MYWJlbFRlbXBsYXRlc109XCJjb2x1bW5MYWJlbFRlbXBsYXRlc1wiXG4gICAgICAgIFtjb2x1bW5Tb3J0ZXJdPVwiY29sdW1uU29ydGVyKClcIlxuICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zJCgpXCJcbiAgICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RBbGxcIlxuICAgICAgICBbc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCJcbiAgICAgICAgW3NlbGVjdGVkQWxsXT1cIihzZWxlY3RlZEFsbFN1YmplY3QgfCBhc3luYykgPz8gZmFsc2VcIlxuICAgICAgICBbc29ydGVyVmFsdWVdPVwic29ydGVyVmFsdWVcIlxuICAgICAgICBbc3VtbWFyeVJvd1RlbXBsYXRlXT1cInN1bW1hcnlSb3dUZW1wbGF0ZVwiXG4gICAgICAgIGNvbXBvbmVudD1cInRmb290XCJcbiAgICAgIC8+XG4gICAgfVxuXG4gIDwvdGFibGU+XG4gIEBpZiAobG9hZGluZykge1xuICAgIDxjLWVsZW1lbnQtY292ZXJcbiAgICAgIFtib3VuZGFyaWVzXT1cIltcbiAgICAgICAgeyBzaWRlczogWyd0b3AnXSwgcXVlcnk6ICd0ZCcgfSxcbiAgICAgICAgeyBzaWRlczogWydib3R0b20nXSwgcXVlcnk6ICd0Ym9keScgfVxuICAgICAgXVwiXG4gICAgLz5cbiAgfVxuPC9kaXY+XG5AaWYgKHBhZ2luYXRpb24gfHwgaXRlbXNQZXJQYWdlU2VsZWN0KSB7XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICBAaWYgKHBhZ2luYXRpb24gJiYgbnVtYmVyT2ZQYWdlcyA+IDEpIHtcbiAgICAgICAgPGMtc21hcnQtcGFnaW5hdGlvblxuICAgICAgICAgIChhY3RpdmVQYWdlQ2hhbmdlKT1cInNldEFjdGl2ZVBhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW2FjdGl2ZVBhZ2VdPVwiYWN0aXZlUGFnZVwiXG4gICAgICAgICAgW3BhZ2VzXT1cIm51bWJlck9mUGFnZXNcIlxuICAgICAgICAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBtcy1hdXRvXCI+XG4gICAgICBAaWYgKGl0ZW1zUGVyUGFnZVNlbGVjdCkge1xuICAgICAgICA8Yy1zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3RvclxuICAgICAgICAgIChpdGVtc1BlclBhZ2VDaGFuZ2UpPVwiaGFuZGxlSXRlbXNQZXJQYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtpdGVtc1BlclBhZ2VMYWJlbF09XCJpdGVtc1BlclBhZ2VMYWJlbFwiXG4gICAgICAgICAgW2l0ZW1zUGVyUGFnZU9wdGlvbnNdPVwiaXRlbXNQZXJQYWdlT3B0aW9uc1wiXG4gICAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIlxuICAgICAgICAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cbjxuZy10ZW1wbGF0ZSAjdGJvZHlEZWZhdWx0VGVtcGxhdGU+XG4gIDx0Ym9keSBbY0FsaWduXT1cInRhYmxlQm9keVByb3BzPy5hbGlnblwiXG4gICAgICAgICBbY0h0bWxBdHRyXT1cInRhYmxlQm9keVByb3BzPy5hdHRyaWJ1dGVzID8/IHt9XCJcbiAgICAgICAgIFtjVGFibGVDb2xvcl09XCJ0YWJsZUJvZHlQcm9wcz8uY29sb3JcIlxuICA+XG4gICAgQGZvciAoaXRlbSBvZiBjdXJyZW50SXRlbXM7IHRyYWNrIGl0ZW07IGxldCBpID0gJGluZGV4LCBjbnQgPSAkY291bnQsIGlzRXZlbiA9ICRldmVuLCBpc09kZCA9ICRvZGQpIHtcbiAgICAgIDx0ciAoY2xpY2spPVwiaGFuZGxlUm93Q2xpY2soeyRldmVudCwgaXRlbSwgaX0pXCJcbiAgICAgICAgICBbY0FsaWduXT1cIml0ZW0uX3Byb3BzPy5hbGlnblwiXG4gICAgICAgICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtLl9wcm9wcz8uYWN0aXZlID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICAgW2NUYWJsZUNvbG9yXT1cIml0ZW0uX3Byb3BzPy5jb2xvclwiXG4gICAgICAgICAgW25nU3R5bGVdPVwie2N1cnNvcjogY2xpY2thYmxlUm93cyA/ICdwb2ludGVyJyA6ICdhdXRvJ31cIlxuICAgICAgICAgIFt0YWJpbmRleF09XCJjbGlja2FibGVSb3dzID8gMCA6IC0xXCJcbiAgICAgID5cbiAgICAgICAgQGlmIChzZWxlY3RhYmxlKSB7XG4gICAgICAgICAgPHRkIFtjQWxpZ25dPVwiaXRlbT8uWydfY2VsbFByb3BzJ10/Ll9hbGw/LmFsaWduXCJcbiAgICAgICAgICAgICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uYWN0aXZlID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgIFtjVGFibGVDb2xvcl09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uY29sb3JcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cImhhbmRsZVJvd0NoZWNrZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXRlbS5fc2VsZWN0ZWQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoaXRlbT8uX3NlbGVjdGFibGUgPT09IGZhbHNlKSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICBjRm9ybUNoZWNrSW5wdXRcbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zJCgpOyB0cmFjayBjb2x1bW47IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXNbJ3RhYmxlRGF0YSddIHx8IGNvbHVtbkRlZmF1bHRUZW1wbGF0ZTsgY29udGV4dDoge2NvbHVtbiwgaXRlbSwgY29sdW1uTmFtZTogZ2V0Q29sdW1uS2V5KGNvbHVtbiksIHRkQ29udGVudDogaXRlbVtjb2x1bW4ua2V5XSwgY2VsbFByb3BzOiBnZXRUYWJsZURhdGFDZWxsUHJvcHMoY29sdW1uLCBpdGVtKSB9XCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA8L3RyPlxuICAgICAgQGlmICh0ZW1wbGF0ZXNbJ3RhYmxlRGV0YWlscyddKSB7XG4gICAgICAgIDwhLS0gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93RGV0YWlsc0RlZmF1bHRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPi0tPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBbbmdTdHlsZV09XCJ7Ym9yZGVyQm90dG9tV2lkdGg6IDB9XCIgY2xhc3M9XCJwLTBcIiB0YWJpbmRleD1cIi0xXCI+PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwicC0wXCI+XG4gICAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBbbmdTdHlsZV09XCJ7Ym9yZGVyOiAwfVwiIGNsYXNzPVwicC0wXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVzWyd0YWJsZURldGFpbHMnXTsgY29udGV4dDoge2l0ZW0sIGluZGV4OiBpfVwiIC8+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIH1cbiAgICB9XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub0l0ZW1zRGVmYXVsdFRlbXBsYXRlXCIgLz5cbiAgPC90Ym9keT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjY29sdW1uRGVmYXVsdFRlbXBsYXRlXG4gIGxldC1jZWxsUHJvcHM9XCJjZWxsUHJvcHNcIlxuICBsZXQtY29sdW1uPVwiY29sdW1uXCJcbiAgbGV0LWNvbHVtbk5hbWU9XCJjb2x1bW5OYW1lXCJcbiAgbGV0LWl0ZW09XCJpdGVtXCJcbiAgbGV0LXRkQ29udGVudD1cInRkQ29udGVudFwiXG4+XG4gIEBpZiAodGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICA8dGQgW2NBbGlnbl09XCJjZWxsUHJvcHM/LmFsaWduXCJcbiAgICAgICAgW2NIdG1sQXR0cl09XCJjZWxsUHJvcHM/LlsnX2F0dHJpYnV0ZXMnXSA/PyB1bmRlZmluZWRcIlxuICAgICAgICBbY1RhYmxlQWN0aXZlXT1cImNlbGxQcm9wcz8uWydhY3RpdmUnXVwiXG4gICAgICAgIFtjVGFibGVDb2xvcl09XCJjZWxsUHJvcHM/LmNvbG9yID8/IGNvbHVtbltjb2x1bW5OYW1lXT8uX2NvbFByb3BzPy5jb2xvciA/PyB1bmRlZmluZWRcIlxuICAgICAgICBbbmdDbGFzc109XCJnZXRUYWJsZURhdGFDZWxsQ2xhc3MoY29sdW1uLCBpdGVtKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFRhYmxlRGF0YUNlbGxTdHlsZXMoY29sdW1uLCBpdGVtKVwiXG4gICAgPlxuICAgICAge3sgdGRDb250ZW50IH19XG4gICAgPC90ZD5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLTxuZy10ZW1wbGF0ZSAjcm93RGV0YWlsc0RlZmF1bHRUZW1wbGF0ZSBsZXQtaXRlbSBsZXQtaW5kZXg+LS0+XG48IS0tICA8dHI+PHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIHRhYmluZGV4PVwiLTFcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyQm90dG9tV2lkdGg6IDB9XCI+PC90ZD48L3RyPi0tPlxuPCEtLSAgPHRyIGNsYXNzPVwicC0wXCI+LS0+XG48IS0tICAgIDx0ZCBbY29sU3Bhbl09XCJjb2xzcGFuXCIgY2xhc3M9XCJwLTBcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyOiAwfVwiPi0tPlxuPCEtLSAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXM/LnRhYmxlRGV0YWlsc1wiPjwvbmctY29udGFpbmVyPi0tPlxuPCEtLSAgICA8L3RkPi0tPlxuPCEtLSAgPC90cj4tLT5cbjwhLS08L25nLXRlbXBsYXRlPi0tPlxuXG48bmctdGVtcGxhdGUgI25vSXRlbXNEZWZhdWx0VGVtcGxhdGU+XG4gIEBpZiAoIWN1cnJlbnRJdGVtcy5sZW5ndGgpIHtcbiAgICA8dHI+XG4gICAgICA8dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwianVzdGlmeS1jb250ZW50LWNlbnRlclwiPnt7IG5vSXRlbXNMYWJlbCB9fTwvdGQ+XG4gICAgPC90cj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLXRvZG86IGZpbHRlckljb25DdXN0b21UZW1wbGF0ZS0tPlxuPG5nLXRlbXBsYXRlICNmaWx0ZXJJY29uVGVtcGxhdGU+XG4gIDxzdmcgY2xhc3M9XCJpY29uIGljb24tY3VzdG9tLXNpemVcIiBwb2ludGVyLWV2ZW50cz1cIm5vbmVcIiByb2xlPVwiaW1nXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCJcbiAgICAgICB3aWR0aD1cIjE4XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgIDxwb2x5Z29uXG4gICAgICBjbGFzcz1cImNpLXByaW1hcnlcIlxuICAgICAgZmlsbD1cInZhcigtLWNpLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcilcIlxuICAgICAgcG9pbnRzPVwiNDAgMTYgNDAgNTMuODI4IDEwOS4wMjQgMTM2IDE1MC44MTUgMTM2IDc2Ljg5NiA0OCA0NTkuNTEgNDggMzA0IDI0Mi4zODggMzA0IDQwMS4zNzMgMjQxLjM3MyA0NjQgMjQwIDQ2NCAyNDAgMzY4IDIwOCAzNjggMjA4IDQ5NiAyNTQuNjI3IDQ5NiAzMzYgNDE0LjYyNyAzMzYgMjUzLjYxMiA0OTYgNTMuNjEyIDQ5NiAxNiA0MCAxNlwiPlxuICAgIDwvcG9seWdvbj5cbiAgICA8cG9seWdvblxuICAgICAgY2xhc3M9XCJjaS1wcmltYXJ5XCJcbiAgICAgIGZpbGw9XCJ2YXIoLS1jaS1wcmltYXJ5LWNvbG9yLCBjdXJyZW50Q29sb3IpXCJcbiAgICAgIHBvaW50cz1cIjE2Ni40MDMgMjQ4LjIyNSAyMjYuODY0IDE4Ny43NjMgMjA0LjIzNyAxNjUuMTM1IDE0My43NzUgMjI1LjU5NyA4My4zMTMgMTY1LjEzNSA2MC42ODcgMTg3Ljc2MyAxMjEuMTQ4IDI0OC4yMjUgNjAuNjg3IDMwOC42ODcgODMuMzEzIDMzMS4zMTQgMTQzLjc3NSAyNzAuODUyIDIwNC4yMzcgMzMxLjMxNCAyMjYuODY0IDMwOC42ODcgMTY2LjQwMyAyNDguMjI1XCI+XG4gICAgPC9wb2x5Z29uPlxuICA8L3N2Zz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=