@impartner/design-components 1.1.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/README.md +5 -4
  2. package/constants/fontawesome-icons.d.ts +2 -2
  3. package/{esm2020 → esm2022}/constants/fontawesome-icons.mjs +1 -1
  4. package/{esm2020 → esm2022}/lib/alert/alert.component.mjs +4 -4
  5. package/{esm2020 → esm2022}/lib/alert/alert.module.mjs +5 -5
  6. package/{esm2020 → esm2022}/lib/avatar/avatar.component.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/avatar/avatar.module.mjs +5 -5
  8. package/{esm2020 → esm2022}/lib/avatar-group/avatar-group.component.mjs +4 -4
  9. package/{esm2020 → esm2022}/lib/avatar-group/avatar-group.module.mjs +5 -5
  10. package/esm2022/lib/backdrop/backdrop.component.mjs +52 -0
  11. package/{esm2020 → esm2022}/lib/backdrop/backdrop.module.mjs +6 -6
  12. package/esm2022/lib/badge/badge.component.mjs +105 -0
  13. package/{esm2020 → esm2022}/lib/badge/badge.module.mjs +6 -6
  14. package/{esm2020 → esm2022}/lib/badge/types/badge-size.mjs +1 -1
  15. package/{esm2020 → esm2022}/lib/branding/branded.directive.mjs +4 -4
  16. package/{esm2020 → esm2022}/lib/branding/branding.module.mjs +6 -6
  17. package/{esm2020 → esm2022}/lib/breadcrumb/breadcrumb-item.component.mjs +6 -6
  18. package/{esm2020 → esm2022}/lib/breadcrumb/breadcrumb.component.mjs +5 -5
  19. package/{esm2020 → esm2022}/lib/breadcrumb/breadcrumb.module.mjs +5 -5
  20. package/{esm2020 → esm2022}/lib/button/button.component.mjs +4 -4
  21. package/{esm2020 → esm2022}/lib/button/button.module.mjs +6 -6
  22. package/{esm2020 → esm2022}/lib/button-group/button-group.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/button-group/button-group.module.mjs +6 -6
  24. package/{esm2020 → esm2022}/lib/card-heading/card-heading.component.mjs +5 -5
  25. package/{esm2020 → esm2022}/lib/card-heading/card-heading.module.mjs +6 -6
  26. package/esm2022/lib/data-card/data-card.component.mjs +123 -0
  27. package/esm2022/lib/data-card/data-card.module.mjs +21 -0
  28. package/{esm2020 → esm2022}/lib/design-components.module.mjs +61 -61
  29. package/{esm2020 → esm2022}/lib/dropdown/components/dropdown-item/dropdown-item.component.mjs +4 -4
  30. package/esm2022/lib/dropdown/dropdown.component.mjs +143 -0
  31. package/{esm2020 → esm2022}/lib/dropdown/dropdown.module.mjs +6 -6
  32. package/{esm2020 → esm2022}/lib/file-upload/directives/file-drop.directive.mjs +4 -4
  33. package/{esm2020 → esm2022}/lib/file-upload/file-upload.component.mjs +30 -30
  34. package/{esm2020 → esm2022}/lib/file-upload/file-upload.module.mjs +8 -8
  35. package/{esm2020 → esm2022}/lib/file-upload/pipes/human-readable-byte-size.pipe.mjs +4 -4
  36. package/{esm2020 → esm2022}/lib/form-field/controls/checkbox/checkbox.component.mjs +49 -49
  37. package/{esm2020 → esm2022}/lib/form-field/controls/checkbox/checkbox.module.mjs +5 -5
  38. package/esm2022/lib/form-field/controls/input/input.directive.mjs +233 -0
  39. package/esm2022/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +260 -0
  40. package/esm2022/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +289 -0
  41. package/{esm2020 → esm2022}/lib/form-field/controls/radio/radio.module.mjs +5 -5
  42. package/esm2022/lib/form-field/controls/select/option/select-option.component.mjs +139 -0
  43. package/esm2022/lib/form-field/controls/select/select-model.mjs +150 -0
  44. package/esm2022/lib/form-field/controls/select/select.component.mjs +522 -0
  45. package/{esm2020 → esm2022}/lib/form-field/controls/select/select.module.mjs +9 -9
  46. package/{esm2020 → esm2022}/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +4 -4
  47. package/esm2022/lib/form-field/controls/shared/toggle/toggle.component.mjs +96 -0
  48. package/{esm2020 → esm2022}/lib/form-field/controls/shared/toggle/toggle.module.mjs +6 -6
  49. package/{esm2020 → esm2022}/lib/form-field/directives/corner-hint.directive.mjs +4 -4
  50. package/{esm2020 → esm2022}/lib/form-field/directives/error.directive.mjs +4 -4
  51. package/esm2022/lib/form-field/directives/form-root.directive.mjs +91 -0
  52. package/{esm2020 → esm2022}/lib/form-field/directives/hint.directive.mjs +4 -4
  53. package/{esm2020 → esm2022}/lib/form-field/directives/label.directive.mjs +4 -4
  54. package/{esm2020 → esm2022}/lib/form-field/directives/prefix.directive.mjs +4 -4
  55. package/{esm2020 → esm2022}/lib/form-field/directives/suffix.directive.mjs +4 -4
  56. package/{esm2020 → esm2022}/lib/form-field/form-field.component.mjs +11 -11
  57. package/{esm2020 → esm2022}/lib/form-field/impdc-forms.module.mjs +28 -28
  58. package/{esm2020 → esm2022}/lib/form-field/services/error-state-matcher.service.mjs +7 -7
  59. package/{esm2020 → esm2022}/lib/form-field/services/unique-selection-dispatcher.service.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/form-field/shared/disabled.mixin.mjs +5 -5
  61. package/esm2022/lib/form-field/shared/error-state.mixin.mjs +24 -0
  62. package/{esm2020 → esm2022}/lib/form-field/shared/form-field-control.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/form-field/shared/tab-index.mixin.mjs +6 -6
  64. package/{esm2020 → esm2022}/lib/icon/icon.component.mjs +5 -5
  65. package/{esm2020 → esm2022}/lib/icon/icon.module.mjs +6 -6
  66. package/esm2022/lib/modal/modal.component.mjs +260 -0
  67. package/{esm2020 → esm2022}/lib/modal/modal.module.mjs +14 -14
  68. package/{esm2020 → esm2022}/lib/modal/types/modal-component-sizes.mjs +1 -1
  69. package/{esm2020 → esm2022}/lib/modal/types/modal-theme.mjs +1 -1
  70. package/esm2022/lib/pagination/pagination.component.mjs +176 -0
  71. package/esm2022/lib/pagination/pagination.module.mjs +41 -0
  72. package/{esm2020 → esm2022}/lib/progress-bar/progress-bar.component.mjs +5 -5
  73. package/{esm2020 → esm2022}/lib/progress-bar/progress-bar.module.mjs +5 -5
  74. package/esm2022/lib/scrollable/scrollable.component.mjs +186 -0
  75. package/{esm2020 → esm2022}/lib/scrollable/scrollable.module.mjs +6 -6
  76. package/esm2022/lib/select-icon/select-icon.component.mjs +308 -0
  77. package/{esm2020 → esm2022}/lib/select-icon/select-icon.module.mjs +13 -13
  78. package/{esm2020 → esm2022}/lib/size-detection/directive/size-detector.directive.mjs +5 -5
  79. package/{esm2020 → esm2022}/lib/size-detection/size-detection.module.mjs +5 -5
  80. package/{esm2020 → esm2022}/lib/spinner/spinner.component.mjs +4 -4
  81. package/{esm2020 → esm2022}/lib/spinner/spinner.module.mjs +5 -5
  82. package/esm2022/lib/table/components/bulk-actions/bulk-actions.component.mjs +11 -0
  83. package/esm2022/lib/table/components/column-heading/column-heading.component.mjs +38 -0
  84. package/esm2022/lib/table/components/index.mjs +4 -0
  85. package/esm2022/lib/table/components/row-actions/row-actions.component.mjs +61 -0
  86. package/esm2022/lib/table/constants/index.mjs +3 -0
  87. package/esm2022/lib/table/constants/public-table.constants.mjs +2 -0
  88. package/esm2022/lib/table/constants/table.constants.mjs +24 -0
  89. package/esm2022/lib/table/containers/index.mjs +2 -0
  90. package/esm2022/lib/table/containers/table.component.mjs +403 -0
  91. package/esm2022/lib/table/directives/index.mjs +3 -0
  92. package/esm2022/lib/table/directives/table-inject-component.directive.mjs +46 -0
  93. package/esm2022/lib/table/directives/table.directive.mjs +35 -0
  94. package/esm2022/lib/table/enumerations/index.mjs +2 -0
  95. package/esm2022/lib/table/enumerations/table-column-type.mjs +21 -0
  96. package/esm2022/lib/table/helpers/index.mjs +2 -0
  97. package/esm2022/lib/table/helpers/table-theme.helper.mjs +31 -0
  98. package/esm2022/lib/table/index.mjs +8 -0
  99. package/esm2022/lib/table/interfaces/cell-renderer.interface.mjs +2 -0
  100. package/esm2022/lib/table/interfaces/custom-cell-renderer-components.type.mjs +2 -0
  101. package/esm2022/lib/table/interfaces/index.mjs +11 -0
  102. package/esm2022/lib/table/interfaces/sort-by-payload.interface.mjs +2 -0
  103. package/esm2022/lib/table/interfaces/table-cell-option.interface.mjs +2 -0
  104. package/esm2022/lib/table/interfaces/table-column-defs.type.mjs +2 -0
  105. package/esm2022/lib/table/interfaces/table-event-payload.interface.mjs +2 -0
  106. package/esm2022/lib/table/interfaces/table-row-action-payload.interface.mjs +2 -0
  107. package/esm2022/lib/table/interfaces/table-row-action.interface.mjs +2 -0
  108. package/esm2022/lib/table/interfaces/table-row-item.interface.mjs +2 -0
  109. package/esm2022/lib/table/table.module.mjs +96 -0
  110. package/{esm2020 → esm2022}/lib/text-highlight/text-highlight.component.mjs +6 -6
  111. package/{esm2020 → esm2022}/lib/text-highlight/text-highlight.module.mjs +6 -6
  112. package/{esm2020 → esm2022}/services/index.mjs +1 -1
  113. package/esm2022/services/interaction.service.mjs +88 -0
  114. package/{esm2020 → esm2022}/types/component-theme.mjs +1 -1
  115. package/{fesm2020 → fesm2022}/impartner-design-components.mjs +3768 -2988
  116. package/fesm2022/impartner-design-components.mjs.map +1 -0
  117. package/lib/alert/alert.component.d.ts +1 -1
  118. package/lib/alert/theme/alert-theme.d.ts +1 -1
  119. package/lib/avatar/avatar.component.d.ts +1 -1
  120. package/lib/avatar-group/avatar-group.component.d.ts +1 -1
  121. package/lib/backdrop/backdrop.component.d.ts +9 -6
  122. package/lib/badge/badge.component.d.ts +3 -2
  123. package/lib/badge/types/badge-icon.d.ts +1 -1
  124. package/lib/badge/types/badge-size.d.ts +1 -1
  125. package/lib/branding/branded.directive.d.ts +1 -1
  126. package/lib/breadcrumb/breadcrumb-item.component.d.ts +1 -1
  127. package/lib/breadcrumb/breadcrumb.component.d.ts +1 -1
  128. package/lib/button/button.component.d.ts +1 -1
  129. package/lib/button/themes/button-theme.d.ts +1 -1
  130. package/lib/button-group/button-group.component.d.ts +1 -1
  131. package/lib/card-heading/card-heading.component.d.ts +1 -1
  132. package/lib/data-card/data-card.component.d.ts +14 -18
  133. package/lib/data-card/data-card.module.d.ts +2 -1
  134. package/lib/dropdown/components/dropdown-item/dropdown-item.component.d.ts +1 -1
  135. package/lib/dropdown/dropdown.component.d.ts +6 -5
  136. package/lib/dropdown/types/dropdown-position.d.ts +1 -1
  137. package/lib/file-upload/directives/file-drop.directive.d.ts +1 -1
  138. package/lib/file-upload/file-upload.component.d.ts +1 -1
  139. package/lib/form-field/controls/checkbox/checkbox.component.d.ts +1 -1
  140. package/lib/form-field/controls/input/input.directive.d.ts +1 -1
  141. package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +1 -1
  142. package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +1 -1
  143. package/lib/form-field/controls/select/option/select-option.component.d.ts +4 -4
  144. package/lib/form-field/controls/select/select.component.d.ts +1 -1
  145. package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +1 -1
  146. package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +1 -1
  147. package/lib/form-field/directives/corner-hint.directive.d.ts +1 -1
  148. package/lib/form-field/directives/error.directive.d.ts +1 -1
  149. package/lib/form-field/directives/form-root.directive.d.ts +2 -2
  150. package/lib/form-field/directives/hint.directive.d.ts +1 -1
  151. package/lib/form-field/directives/label.directive.d.ts +1 -1
  152. package/lib/form-field/directives/prefix.directive.d.ts +1 -1
  153. package/lib/form-field/directives/suffix.directive.d.ts +1 -1
  154. package/lib/form-field/form-field.component.d.ts +1 -1
  155. package/lib/form-field/services/unique-selection-dispatcher.service.d.ts +1 -1
  156. package/lib/form-field/shared/constructors.type.d.ts +2 -2
  157. package/lib/form-field/shared/disabled.mixin.d.ts +1 -1
  158. package/lib/form-field/shared/error-state.mixin.d.ts +1 -1
  159. package/lib/form-field/shared/form-field-control.d.ts +1 -1
  160. package/lib/form-field/shared/tab-index.mixin.d.ts +1 -1
  161. package/lib/icon/icon.component.d.ts +1 -1
  162. package/lib/modal/modal.component.d.ts +17 -10
  163. package/lib/modal/types/modal-component-sizes.d.ts +1 -1
  164. package/lib/modal/types/modal-theme.d.ts +1 -1
  165. package/lib/pagination/pagination.component.d.ts +18 -3
  166. package/lib/pagination/pagination.module.d.ts +2 -1
  167. package/lib/progress-bar/progress-bar.component.d.ts +1 -1
  168. package/lib/scrollable/scrollable.component.d.ts +1 -1
  169. package/lib/select-icon/select-icon.component.d.ts +1 -1
  170. package/lib/size-detection/directive/size-detector.directive.d.ts +1 -1
  171. package/lib/spinner/spinner.component.d.ts +1 -1
  172. package/lib/table/components/bulk-actions/bulk-actions.component.d.ts +5 -0
  173. package/lib/table/components/column-heading/column-heading.component.d.ts +14 -0
  174. package/lib/table/components/index.d.ts +3 -0
  175. package/lib/table/components/row-actions/row-actions.component.d.ts +21 -0
  176. package/lib/table/constants/index.d.ts +2 -0
  177. package/lib/table/constants/public-table.constants.d.ts +1 -0
  178. package/lib/table/constants/table.constants.d.ts +10 -0
  179. package/lib/table/containers/index.d.ts +1 -0
  180. package/lib/table/containers/table.component.d.ts +133 -0
  181. package/lib/table/directives/index.d.ts +2 -0
  182. package/lib/table/directives/table-inject-component.directive.d.ts +16 -0
  183. package/lib/table/directives/table.directive.d.ts +15 -0
  184. package/lib/table/enumerations/index.d.ts +1 -0
  185. package/lib/table/enumerations/table-column-type.d.ts +19 -0
  186. package/lib/table/helpers/index.d.ts +1 -0
  187. package/lib/table/helpers/table-theme.helper.d.ts +7 -0
  188. package/lib/table/index.d.ts +7 -2
  189. package/lib/table/interfaces/cell-renderer.interface.d.ts +6 -0
  190. package/lib/table/interfaces/custom-cell-renderer-components.type.d.ts +3 -0
  191. package/lib/table/interfaces/index.d.ts +10 -0
  192. package/lib/table/interfaces/sort-by-payload.interface.d.ts +5 -0
  193. package/lib/table/interfaces/table-cell-option.interface.d.ts +4 -0
  194. package/lib/table/interfaces/table-column-defs.type.d.ts +29 -0
  195. package/lib/table/interfaces/table-event-payload.interface.d.ts +6 -0
  196. package/lib/table/interfaces/table-row-action-payload.interface.d.ts +6 -0
  197. package/lib/table/interfaces/table-row-action.interface.d.ts +9 -0
  198. package/lib/table/interfaces/table-row-item.interface.d.ts +9 -0
  199. package/lib/table/table.module.d.ts +17 -3
  200. package/lib/text-highlight/text-highlight.component.d.ts +1 -1
  201. package/package.json +15 -20
  202. package/services/index.d.ts +1 -1
  203. package/services/interaction.service.d.ts +20 -10
  204. package/types/component-size.d.ts +2 -2
  205. package/types/component-theme.d.ts +1 -1
  206. package/utilities/boolean-props.d.ts +1 -1
  207. package/utilities/number-props.d.ts +1 -1
  208. package/esm2020/lib/backdrop/backdrop.component.mjs +0 -40
  209. package/esm2020/lib/badge/badge.component.mjs +0 -99
  210. package/esm2020/lib/data-card/data-card.component.mjs +0 -128
  211. package/esm2020/lib/data-card/data-card.module.mjs +0 -20
  212. package/esm2020/lib/dropdown/dropdown.component.mjs +0 -142
  213. package/esm2020/lib/form-field/controls/input/input.directive.mjs +0 -233
  214. package/esm2020/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +0 -260
  215. package/esm2020/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +0 -289
  216. package/esm2020/lib/form-field/controls/select/option/select-option.component.mjs +0 -139
  217. package/esm2020/lib/form-field/controls/select/select-model.mjs +0 -150
  218. package/esm2020/lib/form-field/controls/select/select.component.mjs +0 -522
  219. package/esm2020/lib/form-field/controls/shared/toggle/toggle.component.mjs +0 -96
  220. package/esm2020/lib/form-field/directives/form-root.directive.mjs +0 -91
  221. package/esm2020/lib/form-field/shared/error-state.mixin.mjs +0 -24
  222. package/esm2020/lib/modal/modal.component.mjs +0 -187
  223. package/esm2020/lib/pagination/pagination.component.mjs +0 -145
  224. package/esm2020/lib/pagination/pagination.module.mjs +0 -37
  225. package/esm2020/lib/scrollable/scrollable.component.mjs +0 -186
  226. package/esm2020/lib/select-icon/select-icon.component.mjs +0 -308
  227. package/esm2020/lib/table/index.mjs +0 -3
  228. package/esm2020/lib/table/table.component.mjs +0 -33
  229. package/esm2020/lib/table/table.module.mjs +0 -19
  230. package/esm2020/services/interaction.service.mjs +0 -81
  231. package/fesm2015/impartner-design-components.mjs +0 -8595
  232. package/fesm2015/impartner-design-components.mjs.map +0 -1
  233. package/fesm2020/impartner-design-components.mjs.map +0 -1
  234. package/lib/table/table.component.d.ts +0 -15
  235. /package/{esm2020 → esm2022}/constants/index.mjs +0 -0
  236. /package/{esm2020 → esm2022}/impartner-design-components.mjs +0 -0
  237. /package/{esm2020 → esm2022}/lib/alert/index.mjs +0 -0
  238. /package/{esm2020 → esm2022}/lib/alert/theme/alert-theme.mjs +0 -0
  239. /package/{esm2020 → esm2022}/lib/alert/theme/index.mjs +0 -0
  240. /package/{esm2020 → esm2022}/lib/avatar/index.mjs +0 -0
  241. /package/{esm2020 → esm2022}/lib/avatar-group/index.mjs +0 -0
  242. /package/{esm2020 → esm2022}/lib/backdrop/index.mjs +0 -0
  243. /package/{esm2020 → esm2022}/lib/badge/index.mjs +0 -0
  244. /package/{esm2020 → esm2022}/lib/badge/types/badge-icon.mjs +0 -0
  245. /package/{esm2020 → esm2022}/lib/badge/types/index.mjs +0 -0
  246. /package/{esm2020 → esm2022}/lib/branding/index.mjs +0 -0
  247. /package/{esm2020 → esm2022}/lib/breadcrumb/index.mjs +0 -0
  248. /package/{esm2020 → esm2022}/lib/button/index.mjs +0 -0
  249. /package/{esm2020 → esm2022}/lib/button/themes/button-theme.mjs +0 -0
  250. /package/{esm2020 → esm2022}/lib/button/themes/index.mjs +0 -0
  251. /package/{esm2020 → esm2022}/lib/button-group/index.mjs +0 -0
  252. /package/{esm2020 → esm2022}/lib/card-heading/index.mjs +0 -0
  253. /package/{esm2020 → esm2022}/lib/data-card/index.mjs +0 -0
  254. /package/{esm2020 → esm2022}/lib/dropdown/components/index.mjs +0 -0
  255. /package/{esm2020 → esm2022}/lib/dropdown/index.mjs +0 -0
  256. /package/{esm2020 → esm2022}/lib/dropdown/types/dropdown-position.mjs +0 -0
  257. /package/{esm2020 → esm2022}/lib/dropdown/types/index.mjs +0 -0
  258. /package/{esm2020 → esm2022}/lib/file-upload/directives/index.mjs +0 -0
  259. /package/{esm2020 → esm2022}/lib/file-upload/index.mjs +0 -0
  260. /package/{esm2020 → esm2022}/lib/file-upload/pipes/index.mjs +0 -0
  261. /package/{esm2020 → esm2022}/lib/form-field/controls/checkbox/index.mjs +0 -0
  262. /package/{esm2020 → esm2022}/lib/form-field/controls/index.mjs +0 -0
  263. /package/{esm2020 → esm2022}/lib/form-field/controls/input/index.mjs +0 -0
  264. /package/{esm2020 → esm2022}/lib/form-field/controls/radio/index.mjs +0 -0
  265. /package/{esm2020 → esm2022}/lib/form-field/controls/radio/injection-tokens.mjs +0 -0
  266. /package/{esm2020 → esm2022}/lib/form-field/controls/radio/interfaces/index.mjs +0 -0
  267. /package/{esm2020 → esm2022}/lib/form-field/controls/radio/interfaces/radio-button.interface.mjs +0 -0
  268. /package/{esm2020 → esm2022}/lib/form-field/controls/radio/interfaces/radio-change-event.interface.mjs +0 -0
  269. /package/{esm2020 → esm2022}/lib/form-field/controls/radio/interfaces/radio-group.interface.mjs +0 -0
  270. /package/{esm2020 → esm2022}/lib/form-field/controls/select/index.mjs +0 -0
  271. /package/{esm2020 → esm2022}/lib/form-field/controls/select/option/index.mjs +0 -0
  272. /package/{esm2020 → esm2022}/lib/form-field/controls/select/option-parent.mjs +0 -0
  273. /package/{esm2020 → esm2022}/lib/form-field/controls/shared/index.mjs +0 -0
  274. /package/{esm2020 → esm2022}/lib/form-field/controls/shared/toggle/components/index.mjs +0 -0
  275. /package/{esm2020 → esm2022}/lib/form-field/controls/shared/toggle/index.mjs +0 -0
  276. /package/{esm2020 → esm2022}/lib/form-field/directives/index.mjs +0 -0
  277. /package/{esm2020 → esm2022}/lib/form-field/form-field-errors.mjs +0 -0
  278. /package/{esm2020 → esm2022}/lib/form-field/impdc-forms.mjs +0 -0
  279. /package/{esm2020 → esm2022}/lib/form-field/index.mjs +0 -0
  280. /package/{esm2020 → esm2022}/lib/form-field/services/index.mjs +0 -0
  281. /package/{esm2020 → esm2022}/lib/form-field/shared/constructors.type.mjs +0 -0
  282. /package/{esm2020 → esm2022}/lib/form-field/shared/index.mjs +0 -0
  283. /package/{esm2020 → esm2022}/lib/icon/index.mjs +0 -0
  284. /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
  285. /package/{esm2020 → esm2022}/lib/modal/index.mjs +0 -0
  286. /package/{esm2020 → esm2022}/lib/modal/types/index.mjs +0 -0
  287. /package/{esm2020 → esm2022}/lib/pagination/index.mjs +0 -0
  288. /package/{esm2020 → esm2022}/lib/progress-bar/index.mjs +0 -0
  289. /package/{esm2020 → esm2022}/lib/scrollable/index.mjs +0 -0
  290. /package/{esm2020 → esm2022}/lib/select-icon/index.mjs +0 -0
  291. /package/{esm2020 → esm2022}/lib/size-detection/directive/element-size.interface.mjs +0 -0
  292. /package/{esm2020 → esm2022}/lib/size-detection/directive/index.mjs +0 -0
  293. /package/{esm2020 → esm2022}/lib/size-detection/index.mjs +0 -0
  294. /package/{esm2020 → esm2022}/lib/spinner/index.mjs +0 -0
  295. /package/{esm2020 → esm2022}/lib/text-highlight/index.mjs +0 -0
  296. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  297. /package/{esm2020 → esm2022}/types/component-size.mjs +0 -0
  298. /package/{esm2020 → esm2022}/types/index.mjs +0 -0
  299. /package/{esm2020 → esm2022}/utilities/boolean-props.mjs +0 -0
  300. /package/{esm2020 → esm2022}/utilities/dc.mjs +0 -0
  301. /package/{esm2020 → esm2022}/utilities/index.mjs +0 -0
  302. /package/{esm2020 → esm2022}/utilities/lc.mjs +0 -0
  303. /package/{esm2020 → esm2022}/utilities/number-props.mjs +0 -0
  304. /package/{esm2020 → esm2022}/utilities/sanitize.mjs +0 -0
@@ -0,0 +1,260 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { nanoid } from 'nanoid';
3
+ import { Subject, filter, fromEvent, switchMap, take, takeUntil, tap } from 'rxjs';
4
+ import { ComponentSize } from '../../types';
5
+ import { ModalTheme } from './types';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../services";
8
+ import * as i2 from "@angular/common";
9
+ import * as i3 from "../button/button.component";
10
+ import * as i4 from "../icon/icon.component";
11
+ /**
12
+ * The `ModalComponent` (`<impdc-modal`) displays over the content of the page when a user action is required.
13
+ * To use, import `ModalModule` or another module that imports and exports that module from `@impartner/design-components`.
14
+ * `ModalModule` imports and exports BackdropModule, [ButtonModule](./?path=/docs/design-components-button),
15
+ * and [IconModule](./?path=/docs/design-components-icon).
16
+ */
17
+ export class ModalComponent {
18
+ /**
19
+ * Determines if the Modal should be shown immediately.
20
+ */
21
+ set show(show) {
22
+ if (show) {
23
+ this.open();
24
+ }
25
+ else {
26
+ this.close();
27
+ }
28
+ }
29
+ get show() {
30
+ return this._show;
31
+ }
32
+ constructor(_interactionService, _elementRef) {
33
+ this._interactionService = _interactionService;
34
+ this._elementRef = _elementRef;
35
+ this._interactableId = `impdc-modal-${nanoid()}`;
36
+ this._closed$ = new Subject();
37
+ this._initialized = false;
38
+ this._show = false;
39
+ /**
40
+ * The theme of the Modal. Affects the layout of the Modal as well as some colors.
41
+ */
42
+ this.theme = ModalTheme.Simple;
43
+ /**
44
+ * The size of the Modal.
45
+ */
46
+ this.size = ComponentSize.Medium;
47
+ /**
48
+ * The Font Awesome 5 icon style. Fewer icons support the Regular theme and will fallback to Solid
49
+ * if not supported.
50
+ */
51
+ this.iconTheme = 'light';
52
+ /**
53
+ * The subject text of the Modal.
54
+ */
55
+ this.titleText = '';
56
+ /**
57
+ * The fallback button text to accept the Modal. This is bypassed if you content-project the accept button.
58
+ */
59
+ this.acceptText = 'OK';
60
+ /**
61
+ * Determines if the Modal should fade in/out.
62
+ */
63
+ this.fade = true;
64
+ /**
65
+ * Shows a backdrop behind the Modal.
66
+ */
67
+ this.backdrop = true;
68
+ /**
69
+ * Event emitted when the Modal content is dismissed.
70
+ */
71
+ this.dismiss = new EventEmitter();
72
+ /**
73
+ * Event emitted when the Modal content is denied.
74
+ */
75
+ this.deny = new EventEmitter();
76
+ /**
77
+ * Event emitted when the Modal content is accepted.
78
+ */
79
+ this.accept = new EventEmitter();
80
+ }
81
+ get interactableId() {
82
+ return this._interactableId;
83
+ }
84
+ get valid() {
85
+ return this._initialized;
86
+ }
87
+ get shown() {
88
+ return this.valid && this._show;
89
+ }
90
+ get showWorkingIcon() {
91
+ return !!this.iconName && this.theme === ModalTheme.Working;
92
+ }
93
+ get showDestructiveIcon() {
94
+ return !!this.iconName && this.theme === ModalTheme.Destructive;
95
+ }
96
+ get acceptFallbackTheme() {
97
+ return this.theme === ModalTheme.Destructive ? 'danger' : 'primary';
98
+ }
99
+ get hideHeader() {
100
+ return !this.titleText && !this.dismissable;
101
+ }
102
+ ngOnInit() {
103
+ this._interactionService.add(this);
104
+ if (this.dismissable === undefined && this.theme === ModalTheme.Working) {
105
+ this.dismissable = true;
106
+ }
107
+ if (this.iconName === undefined && this.theme === ModalTheme.Destructive) {
108
+ this.iconName = 'exclamation-triangle';
109
+ }
110
+ this._initialized = true;
111
+ }
112
+ ngOnDestroy() {
113
+ this._interactionService.remove(this.interactableId);
114
+ this._disableEventHandling();
115
+ }
116
+ handleDismiss(event) {
117
+ if (!this.dismissable ||
118
+ !!this.dismissEl?.nativeElement?.firstChild?.disabled) {
119
+ return;
120
+ }
121
+ this.close();
122
+ this.dismiss.emit(event);
123
+ }
124
+ handleDeny(event) {
125
+ if (!!this.denyEl?.nativeElement?.firstChild?.disabled) {
126
+ return;
127
+ }
128
+ this.close();
129
+ this.deny.emit(event);
130
+ }
131
+ handleAccept(event) {
132
+ if (!!this.acceptEl?.nativeElement?.firstChild?.disabled) {
133
+ return;
134
+ }
135
+ this.close();
136
+ this.accept.emit(event);
137
+ }
138
+ /**
139
+ * Opens/shows the modal. Can be used programmatically.
140
+ */
141
+ open() {
142
+ if (this.backdrop) {
143
+ this._interactionService.queueBackdrop(this.interactableId);
144
+ }
145
+ this._show = true;
146
+ this._setupEventHandling();
147
+ }
148
+ /**
149
+ * Closes/hides the modal. Can be used programmatically.
150
+ */
151
+ close() {
152
+ this._show = false;
153
+ this._interactionService.dequeueBackdrop(this.interactableId);
154
+ this._disableEventHandling();
155
+ }
156
+ _setupEventHandling() {
157
+ const { nativeElement } = this._elementRef;
158
+ fromEvent(nativeElement, 'keydown')
159
+ .pipe(takeUntil(this._closed$), filter(evt => evt.key === 'Escape'))
160
+ .subscribe(evt => {
161
+ if (this.dismissable && !evt.defaultPrevented) {
162
+ Promise.resolve().then(() => {
163
+ this.handleDismiss(evt);
164
+ evt.stopPropagation();
165
+ });
166
+ }
167
+ });
168
+ fromEvent(nativeElement, 'keydown')
169
+ .pipe(takeUntil(this._closed$), filter(evt => evt.key === 'Enter'))
170
+ .subscribe(evt => {
171
+ if (!evt.defaultPrevented) {
172
+ Promise.resolve().then(() => {
173
+ this.handleAccept(evt);
174
+ evt.stopPropagation();
175
+ });
176
+ }
177
+ });
178
+ let preventClose = false;
179
+ if (this._dialogElementRef) {
180
+ // listen to 'mousedown' and 'mouseup' to prevent dismissal when mouse is pressed inside
181
+ // of the dialog window and then released outside
182
+ fromEvent(this._dialogElementRef.nativeElement, 'mousedown')
183
+ .pipe(takeUntil(this._closed$), tap(() => {
184
+ preventClose = false;
185
+ }), switchMap(() => fromEvent(nativeElement, 'mouseup').pipe(takeUntil(this._closed$), take(1))), filter(({ target }) => nativeElement === target))
186
+ .subscribe(() => {
187
+ preventClose = true;
188
+ });
189
+ }
190
+ // listen to 'click' events to dismiss on component/container click, except when
191
+ // clicking inside the dialog window or when prevented by the above 'mousedown'
192
+ // and 'mouseup' handlers
193
+ fromEvent(nativeElement, 'click')
194
+ .pipe(takeUntil(this._closed$))
195
+ .subscribe(evt => {
196
+ if (nativeElement === evt.target && !preventClose) {
197
+ Promise.resolve().then(() => {
198
+ this.handleDismiss(evt);
199
+ evt.stopPropagation();
200
+ });
201
+ }
202
+ preventClose = false;
203
+ });
204
+ }
205
+ _disableEventHandling() {
206
+ this._closed$.next();
207
+ }
208
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: ModalComponent, deps: [{ token: i1.InteractionService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
209
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: ModalComponent, selector: "impdc-modal", inputs: { show: "show", theme: "theme", size: "size", iconName: "iconName", iconTheme: "iconTheme", titleText: "titleText", acceptText: "acceptText", dismissable: "dismissable", fade: "fade", backdrop: "backdrop" }, outputs: { dismiss: "dismiss", deny: "deny", accept: "accept" }, host: { attributes: { "tabindex": "-1" }, properties: { "class.fade": "fade", "class.in": "fade && shown", "class.show": "shown", "class.dismissable": "dismissable" }, classAttribute: "impdc modal" }, viewQueries: [{ propertyName: "_dialogElementRef", first: true, predicate: ["dialogElement"], descendants: true }, { propertyName: "dismissEl", first: true, predicate: ["dismissEl"], descendants: true }, { propertyName: "denyEl", first: true, predicate: ["denyEl"], descendants: true }, { propertyName: "acceptEl", first: true, predicate: ["acceptEl"], descendants: true }], ngImport: i0, template: "<div\n #dialogElement\n *ngIf=\"valid\"\n class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable modal-theme-{{\n theme\n }}\"\n [class.modal-sm]=\"size === 'sm'\"\n [class.modal-lg]=\"size === 'lg'\"\n [class.modal-xl]=\"size === 'xl'\"\n [class.modal-fullscreen]=\"size === 'fs'\"\n [class.modal-fullscreen-lg-down]=\"size !== 'fs'\">\n <div class=\"modal-content\">\n <div *ngIf=\"showDestructiveIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </div>\n <div #header class=\"modal-header\" [class.hide]=\"hideHeader\">\n <h3 class=\"modal-title\">\n <span *ngIf=\"showWorkingIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </span>\n <span>{{ titleText }}</span>\n </h3>\n <button\n impdcButton\n *ngIf=\"dismissable\"\n theme=\"close\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"></button>\n </div>\n <div #bodyEl class=\"modal-body\">\n <ng-content></ng-content>\n </div>\n <div #footer class=\"modal-footer\">\n <span\n #dismissEl\n *ngIf=\"dismissable\"\n [class.hide]=\"!dismissEl.children.length\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\">\n <ng-content select=\"[dismiss]\"></ng-content>\n </span>\n <span\n #denyEl\n [class.hide]=\"!denyEl.children.length\"\n (click)=\"handleDeny($event); $event.stopPropagation()\">\n <ng-content select=\"[deny]\"></ng-content>\n </span>\n <span\n #acceptEl\n [class.hide]=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <ng-content select=\"[accept]\"></ng-content>\n </span>\n <span\n #acceptFallbackEl\n *ngIf=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <button\n impdcButton\n [text]=\"acceptText\"\n [theme]=\"acceptFallbackTheme\"></button>\n </span>\n </div>\n </div>\n</div>\n", styles: [":host{-webkit-user-select:none;user-select:none}:host .modal-icon{display:inline-flex;justify-content:center;align-items:center;height:40px;width:40px;color:var(--impd-color-gray-500);background:var(--impd-color-gray-100);border-radius:50%;flex-shrink:0}:host .modal-icon .fa,:host .modal-icon .fa-brands,:host .modal-icon .fa-duotone,:host .modal-icon .fa-light,:host .modal-icon .fa-regular,:host .modal-icon .fa-solid,:host .modal-icon .fa-thin,:host .modal-icon .fab,:host .modal-icon .fad,:host .modal-icon .fal,:host .modal-icon .far,:host .modal-icon .fas,:host .modal-icon .fat{line-height:var(--impartner-hex-modal-title-line-height)}:host.fade.in{background-color:transparent}:host.show{display:block;opacity:1}:host:not(.show),:host.hide,:host .hide{display:none}:host.dismissable{cursor:pointer}:host.dismissable .modal-dialog{cursor:default}:host .modal-dialog{cursor:default;-webkit-user-select:auto;user-select:auto}:host .modal-theme-simple .modal-header,:host .modal-theme-destructive .modal-header{border:0;padding-bottom:0}:host .modal-theme-simple .modal-body,:host .modal-theme-destructive .modal-body{padding:calc(var(--impartner-hex-modal-padding) * .5) var(--impartner-hex-modal-padding) var(--impartner-hex-modal-padding)}:host .modal-theme-simple .modal-footer,:host .modal-theme-destructive .modal-footer{border:0;padding-top:0}:host .modal-theme-working .modal-footer{padding:calc(var(--impartner-hex-modal-padding) * .5 - var(--impartner-hex-modal-footer-gap) * .5) calc(var(--impartner-hex-modal-padding) - var(--impartner-hex-modal-footer-gap) * .5)}:host .modal-theme-destructive .modal-content{display:grid;grid-template-areas:\"modal-icon modal-header\" \"modal-icon modal-body\" \"modal-footer modal-footer\";grid-template-columns:auto 1fr;grid-template-rows:auto 1fr auto}:host .modal-theme-destructive .modal-content>.modal-icon{grid-area:modal-icon;margin:var(--impartner-hex-modal-header-padding);margin-right:0;margin-bottom:0}:host .modal-theme-destructive .modal-content>.modal-header{grid-area:modal-header;padding-left:16px;margin-top:8px;justify-content:unset}:host .modal-theme-destructive .modal-content>.modal-body{grid-area:modal-body;padding-left:16px}:host .modal-theme-destructive .modal-content>.modal-footer{grid-area:modal-footer}:host .modal-theme-destructive .modal-icon{color:var(--impd-color-red-600);background:var(--impd-color-red-100)}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ButtonComponent, selector: "button[impdcButton]", inputs: ["type", "theme", "text", "disabled", "titleText", "ariaLabel"] }, { kind: "component", type: i4.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }] }); }
210
+ }
211
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: ModalComponent, decorators: [{
212
+ type: Component,
213
+ args: [{ selector: 'impdc-modal', host: {
214
+ class: 'impdc modal',
215
+ '[class.fade]': 'fade',
216
+ '[class.in]': 'fade && shown',
217
+ '[class.show]': 'shown',
218
+ '[class.dismissable]': 'dismissable',
219
+ tabindex: '-1'
220
+ }, template: "<div\n #dialogElement\n *ngIf=\"valid\"\n class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable modal-theme-{{\n theme\n }}\"\n [class.modal-sm]=\"size === 'sm'\"\n [class.modal-lg]=\"size === 'lg'\"\n [class.modal-xl]=\"size === 'xl'\"\n [class.modal-fullscreen]=\"size === 'fs'\"\n [class.modal-fullscreen-lg-down]=\"size !== 'fs'\">\n <div class=\"modal-content\">\n <div *ngIf=\"showDestructiveIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </div>\n <div #header class=\"modal-header\" [class.hide]=\"hideHeader\">\n <h3 class=\"modal-title\">\n <span *ngIf=\"showWorkingIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </span>\n <span>{{ titleText }}</span>\n </h3>\n <button\n impdcButton\n *ngIf=\"dismissable\"\n theme=\"close\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"></button>\n </div>\n <div #bodyEl class=\"modal-body\">\n <ng-content></ng-content>\n </div>\n <div #footer class=\"modal-footer\">\n <span\n #dismissEl\n *ngIf=\"dismissable\"\n [class.hide]=\"!dismissEl.children.length\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\">\n <ng-content select=\"[dismiss]\"></ng-content>\n </span>\n <span\n #denyEl\n [class.hide]=\"!denyEl.children.length\"\n (click)=\"handleDeny($event); $event.stopPropagation()\">\n <ng-content select=\"[deny]\"></ng-content>\n </span>\n <span\n #acceptEl\n [class.hide]=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <ng-content select=\"[accept]\"></ng-content>\n </span>\n <span\n #acceptFallbackEl\n *ngIf=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <button\n impdcButton\n [text]=\"acceptText\"\n [theme]=\"acceptFallbackTheme\"></button>\n </span>\n </div>\n </div>\n</div>\n", styles: [":host{-webkit-user-select:none;user-select:none}:host .modal-icon{display:inline-flex;justify-content:center;align-items:center;height:40px;width:40px;color:var(--impd-color-gray-500);background:var(--impd-color-gray-100);border-radius:50%;flex-shrink:0}:host .modal-icon .fa,:host .modal-icon .fa-brands,:host .modal-icon .fa-duotone,:host .modal-icon .fa-light,:host .modal-icon .fa-regular,:host .modal-icon .fa-solid,:host .modal-icon .fa-thin,:host .modal-icon .fab,:host .modal-icon .fad,:host .modal-icon .fal,:host .modal-icon .far,:host .modal-icon .fas,:host .modal-icon .fat{line-height:var(--impartner-hex-modal-title-line-height)}:host.fade.in{background-color:transparent}:host.show{display:block;opacity:1}:host:not(.show),:host.hide,:host .hide{display:none}:host.dismissable{cursor:pointer}:host.dismissable .modal-dialog{cursor:default}:host .modal-dialog{cursor:default;-webkit-user-select:auto;user-select:auto}:host .modal-theme-simple .modal-header,:host .modal-theme-destructive .modal-header{border:0;padding-bottom:0}:host .modal-theme-simple .modal-body,:host .modal-theme-destructive .modal-body{padding:calc(var(--impartner-hex-modal-padding) * .5) var(--impartner-hex-modal-padding) var(--impartner-hex-modal-padding)}:host .modal-theme-simple .modal-footer,:host .modal-theme-destructive .modal-footer{border:0;padding-top:0}:host .modal-theme-working .modal-footer{padding:calc(var(--impartner-hex-modal-padding) * .5 - var(--impartner-hex-modal-footer-gap) * .5) calc(var(--impartner-hex-modal-padding) - var(--impartner-hex-modal-footer-gap) * .5)}:host .modal-theme-destructive .modal-content{display:grid;grid-template-areas:\"modal-icon modal-header\" \"modal-icon modal-body\" \"modal-footer modal-footer\";grid-template-columns:auto 1fr;grid-template-rows:auto 1fr auto}:host .modal-theme-destructive .modal-content>.modal-icon{grid-area:modal-icon;margin:var(--impartner-hex-modal-header-padding);margin-right:0;margin-bottom:0}:host .modal-theme-destructive .modal-content>.modal-header{grid-area:modal-header;padding-left:16px;margin-top:8px;justify-content:unset}:host .modal-theme-destructive .modal-content>.modal-body{grid-area:modal-body;padding-left:16px}:host .modal-theme-destructive .modal-content>.modal-footer{grid-area:modal-footer}:host .modal-theme-destructive .modal-icon{color:var(--impd-color-red-600);background:var(--impd-color-red-100)}\n"] }]
221
+ }], ctorParameters: () => [{ type: i1.InteractionService }, { type: i0.ElementRef }], propDecorators: { _dialogElementRef: [{
222
+ type: ViewChild,
223
+ args: ['dialogElement']
224
+ }], show: [{
225
+ type: Input
226
+ }], theme: [{
227
+ type: Input
228
+ }], size: [{
229
+ type: Input
230
+ }], iconName: [{
231
+ type: Input
232
+ }], iconTheme: [{
233
+ type: Input
234
+ }], titleText: [{
235
+ type: Input
236
+ }], acceptText: [{
237
+ type: Input
238
+ }], dismissable: [{
239
+ type: Input
240
+ }], fade: [{
241
+ type: Input
242
+ }], backdrop: [{
243
+ type: Input
244
+ }], dismissEl: [{
245
+ type: ViewChild,
246
+ args: ['dismissEl', { static: false }]
247
+ }], denyEl: [{
248
+ type: ViewChild,
249
+ args: ['denyEl', { static: false }]
250
+ }], acceptEl: [{
251
+ type: ViewChild,
252
+ args: ['acceptEl', { static: false }]
253
+ }], dismiss: [{
254
+ type: Output
255
+ }], deny: [{
256
+ type: Output
257
+ }], accept: [{
258
+ type: Output
259
+ }] } });
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi9tb2RhbC9tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL21vZGFsL21vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUNMLE9BQU8sRUFDUCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUF1QixVQUFVLEVBQWUsTUFBTSxTQUFTLENBQUM7Ozs7OztBQUV2RTs7Ozs7R0FLRztBQWNILE1BQU0sT0FBTyxjQUFjO0lBV3pCOztPQUVHO0lBQ0gsSUFDSSxJQUFJLENBQUMsSUFBYTtRQUNwQixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNiO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQTZGRCxZQUNtQixtQkFBdUMsRUFDdkMsV0FBb0M7UUFEcEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQjtRQUN2QyxnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFySHRDLG9CQUFl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QyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQzs4R0FsU1UsY0FBYztrR0FBZCxjQUFjLDQ0QkM3QzNCLDZvRUErREE7OzJGRGxCYSxjQUFjO2tCQWIxQixTQUFTOytCQUNFLGFBQWEsUUFHakI7d0JBQ0osS0FBSyxFQUFFLGFBQWE7d0JBQ3BCLGNBQWMsRUFBRSxNQUFNO3dCQUN0QixZQUFZLEVBQUUsZUFBZTt3QkFDN0IsY0FBYyxFQUFFLE9BQU87d0JBQ3ZCLHFCQUFxQixFQUFFLGFBQWE7d0JBQ3BDLFFBQVEsRUFBRSxJQUFJO3FCQUNmO2dIQVdPLGlCQUFpQjtzQkFEeEIsU0FBUzt1QkFBQyxlQUFlO2dCQU90QixJQUFJO3NCQURQLEtBQUs7Z0JBaUJOLEtBQUs7c0JBREosS0FBSztnQkFPTixJQUFJO3NCQURILEtBQUs7Z0JBT04sUUFBUTtzQkFEUCxLQUFLO2dCQVFOLFNBQVM7c0JBRFIsS0FBSztnQkFPTixTQUFTO3NCQURSLEtBQUs7Z0JBT04sVUFBVTtzQkFEVCxLQUFLO2dCQU9OLFdBQVc7c0JBRFYsS0FBSztnQkFPTixJQUFJO3NCQURILEtBQUs7Z0JBT04sUUFBUTtzQkFEUCxLQUFLO2dCQU9OLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU96QyxNQUFNO3NCQURMLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFPdEMsUUFBUTtzQkFEUCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT3hDLE9BQU87c0JBRE4sTUFBTTtnQkFPUCxJQUFJO3NCQURILE1BQU07Z0JBT1AsTUFBTTtzQkFETCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHtcbiAgU3ViamVjdCxcbiAgZmlsdGVyLFxuICBmcm9tRXZlbnQsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGb250QXdlc29tZUljb24sIEZvbnRBd2Vzb21lSWNvblRoZW1lIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IElJbnRlcmFjdGFibGVDb21wb25lbnQsIEludGVyYWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IENvbXBvbmVudFNpemUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBCdXR0b25UaGVtZSB9IGZyb20gJy4uL2J1dHRvbic7XG5pbXBvcnQgeyBNb2RhbENvbXBvbmVudFNpemVzLCBNb2RhbFRoZW1lLCBNb2RhbFRoZW1lcyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRoZSBgTW9kYWxDb21wb25lbnRgIChgPGltcGRjLW1vZGFsYCkgZGlzcGxheXMgb3ZlciB0aGUgY29udGVudCBvZiB0aGUgcGFnZSB3aGVuIGEgdXNlciBhY3Rpb24gaXMgcmVxdWlyZWQuXG4gKiBUbyB1c2UsIGltcG9ydCBgTW9kYWxNb2R1bGVgIG9yIGFub3RoZXIgbW9kdWxlIHRoYXQgaW1wb3J0cyBhbmQgZXhwb3J0cyB0aGF0IG1vZHVsZSBmcm9tIGBAaW1wYXJ0bmVyL2Rlc2lnbi1jb21wb25lbnRzYC5cbiAqIGBNb2RhbE1vZHVsZWAgaW1wb3J0cyBhbmQgZXhwb3J0cyBCYWNrZHJvcE1vZHVsZSwgW0J1dHRvbk1vZHVsZV0oLi8/cGF0aD0vZG9jcy9kZXNpZ24tY29tcG9uZW50cy1idXR0b24pLFxuICogYW5kIFtJY29uTW9kdWxlXSguLz9wYXRoPS9kb2NzL2Rlc2lnbi1jb21wb25lbnRzLWljb24pLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbXBkYy1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21vZGFsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2ltcGRjIG1vZGFsJyxcbiAgICAnW2NsYXNzLmZhZGVdJzogJ2ZhZGUnLFxuICAgICdbY2xhc3MuaW5dJzogJ2ZhZGUgJiYgc2hvd24nLFxuICAgICdbY2xhc3Muc2hvd10nOiAnc2hvd24nLFxuICAgICdbY2xhc3MuZGlzbWlzc2FibGVdJzogJ2Rpc21pc3NhYmxlJyxcbiAgICB0YWJpbmRleDogJy0xJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE1vZGFsQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIElJbnRlcmFjdGFibGVDb21wb25lbnRcbntcbiAgcHJpdmF0ZSByZWFkb25seSBfaW50ZXJhY3RhYmxlSWQgPSBgaW1wZGMtbW9kYWwtJHtuYW5vaWQoKX1gO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvdyA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2RpYWxvZ0VsZW1lbnQnKVxuICBwcml2YXRlIF9kaWFsb2dFbGVtZW50UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIE1vZGFsIHNob3VsZCBiZSBzaG93biBpbW1lZGlhdGVseS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBzaG93KHNob3c6IGJvb2xlYW4pIHtcbiAgICBpZiAoc2hvdykge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvdztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGhlbWUgb2YgdGhlIE1vZGFsLiBBZmZlY3RzIHRoZSBsYXlvdXQgb2YgdGhlIE1vZGFsIGFzIHdlbGwgYXMgc29tZSBjb2xvcnMuXG4gICAqL1xuICBASW5wdXQoKVxuICB0aGVtZTogTW9kYWxUaGVtZXMgPSBNb2RhbFRoZW1lLlNpbXBsZTtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIE1vZGFsLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2l6ZTogTW9kYWxDb21wb25lbnRTaXplcyA9IENvbXBvbmVudFNpemUuTWVkaXVtO1xuXG4gIC8qKlxuICAgKiBUaGUgRm9udCBBd2Vzb21lIDUgaWNvbiBuYW1lLiBPbmx5IHN1cHBvcnRlZCB3aGVuIHRoZSB0aGVtZSBpcyBXb3JraW5nIG9yIERlc3RydWN0aXZlLlxuICAgKi9cbiAgQElucHV0KClcbiAgaWNvbk5hbWU/OiBGb250QXdlc29tZUljb247XG5cbiAgLyoqXG4gICAqIFRoZSBGb250IEF3ZXNvbWUgNSBpY29uIHN0eWxlLiBGZXdlciBpY29ucyBzdXBwb3J0IHRoZSBSZWd1bGFyIHRoZW1lIGFuZCB3aWxsIGZhbGxiYWNrIHRvIFNvbGlkXG4gICAqIGlmIG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBpY29uVGhlbWU6IEZvbnRBd2Vzb21lSWNvblRoZW1lID0gJ2xpZ2h0JztcblxuICAvKipcbiAgICogVGhlIHN1YmplY3QgdGV4dCBvZiB0aGUgTW9kYWwuXG4gICAqL1xuICBASW5wdXQoKVxuICB0aXRsZVRleHQgPSAnJztcblxuICAvKipcbiAgICogVGhlIGZhbGxiYWNrIGJ1dHRvbiB0ZXh0IHRvIGFjY2VwdCB0aGUgTW9kYWwuIFRoaXMgaXMgYnlwYXNzZWQgaWYgeW91IGNvbnRlbnQtcHJvamVjdCB0aGUgYWNjZXB0IGJ1dHRvbi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjY2VwdFRleHQgPSAnT0snO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIE1vZGFsIHRvIGJlIGRpc21pc3NlZC4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBgYWNjZXB0YCBhbmQgYGRlbnlgLiBJZiBhIE1vZGFsIGlzIG1lYW50IHRvIGJlIHJlLW9wZW5lZCBmcmVxdWVudGx5IGl0IHNob3VsZCBiZSBkaXNtaXNzYWJsZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGRpc21pc3NhYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgTW9kYWwgc2hvdWxkIGZhZGUgaW4vb3V0LlxuICAgKi9cbiAgQElucHV0KClcbiAgZmFkZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgYmFja2Ryb3AgYmVoaW5kIHRoZSBNb2RhbC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGJhY2tkcm9wID0gdHJ1ZTtcblxuICAvKipcbiAgICogQ29udGFpbnMgdGhlIGRpc21pc3MgYnV0dG9uIGNvbnRlbnQgcHJvamVjdGlvbi5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2Rpc21pc3NFbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBkaXNtaXNzRWwhOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBDb250YWlucyB0aGUgZGVueSBidXR0b24gY29udGVudCBwcm9qZWN0aW9uLlxuICAgKi9cbiAgQFZpZXdDaGlsZCgnZGVueUVsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGRlbnlFbCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIHRoZSBhY2NlcHQgYnV0dG9uIGNvbnRlbnQgcHJvamVjdGlvbi5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2FjY2VwdEVsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGFjY2VwdEVsITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBNb2RhbCBjb250ZW50IGlzIGRpc21pc3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBkaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50IHwgRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgTW9kYWwgY29udGVudCBpcyBkZW5pZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgZGVueSA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudCB8IEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIE1vZGFsIGNvbnRlbnQgaXMgYWNjZXB0ZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgYWNjZXB0ID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50IHwgRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW50ZXJhY3Rpb25TZXJ2aWNlOiBJbnRlcmFjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgKSB7fVxuXG4gIGdldCBpbnRlcmFjdGFibGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGFibGVJZDtcbiAgfVxuXG4gIGdldCB2YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBnZXQgc2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWQgJiYgdGhpcy5fc2hvdztcbiAgfVxuXG4gIGdldCBzaG93V29ya2luZ0ljb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5pY29uTmFtZSAmJiB0aGlzLnRoZW1lID09PSBNb2RhbFRoZW1lLldvcmtpbmc7XG4gIH1cblxuICBnZXQgc2hvd0Rlc3RydWN0aXZlSWNvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmljb25OYW1lICYmIHRoaXMudGhlbWUgPT09IE1vZGFsVGhlbWUuRGVzdHJ1Y3RpdmU7XG4gIH1cblxuICBnZXQgYWNjZXB0RmFsbGJhY2tUaGVtZSgpOiBCdXR0b25UaGVtZSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbWUgPT09IE1vZGFsVGhlbWUuRGVzdHJ1Y3RpdmUgPyAnZGFuZ2VyJyA6ICdwcmltYXJ5JztcbiAgfVxuXG4gIGdldCBoaWRlSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy50aXRsZVRleHQgJiYgIXRoaXMuZGlzbWlzc2FibGU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvblNlcnZpY2UuYWRkKHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuZGlzbWlzc2FibGUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnRoZW1lID09PSBNb2RhbFRoZW1lLldvcmtpbmcpIHtcbiAgICAgIHRoaXMuZGlzbWlzc2FibGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmljb25OYW1lID09PSB1bmRlZmluZWQgJiYgdGhpcy50aGVtZSA9PT0gTW9kYWxUaGVtZS5EZXN0cnVjdGl2ZSkge1xuICAgICAgdGhpcy5pY29uTmFtZSA9ICdleGNsYW1hdGlvbi10cmlhbmdsZSc7XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5faW50ZXJhY3Rpb25TZXJ2aWNlLnJlbW92ZSh0aGlzLmludGVyYWN0YWJsZUlkKTtcbiAgICB0aGlzLl9kaXNhYmxlRXZlbnRIYW5kbGluZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZURpc21pc3MoZXZlbnQ6IE1vdXNlRXZlbnQgfCBFdmVudCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmRpc21pc3NhYmxlIHx8XG4gICAgICAhIXRoaXMuZGlzbWlzc0VsPy5uYXRpdmVFbGVtZW50Py5maXJzdENoaWxkPy5kaXNhYmxlZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlKCk7XG4gICAgdGhpcy5kaXNtaXNzLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZURlbnkoZXZlbnQ6IE1vdXNlRXZlbnQgfCBFdmVudCk6IHZvaWQge1xuICAgIGlmICghIXRoaXMuZGVueUVsPy5uYXRpdmVFbGVtZW50Py5maXJzdENoaWxkPy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlKCk7XG4gICAgdGhpcy5kZW55LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUFjY2VwdChldmVudDogTW91c2VFdmVudCB8IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCEhdGhpcy5hY2NlcHRFbD8ubmF0aXZlRWxlbWVudD8uZmlyc3RDaGlsZD8uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZSgpO1xuICAgIHRoaXMuYWNjZXB0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zL3Nob3dzIHRoZSBtb2RhbC4gQ2FuIGJlIHVzZWQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmFja2Ryb3ApIHtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uU2VydmljZS5xdWV1ZUJhY2tkcm9wKHRoaXMuaW50ZXJhY3RhYmxlSWQpO1xuICAgIH1cbiAgICB0aGlzLl9zaG93ID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXR1cEV2ZW50SGFuZGxpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMvaGlkZXMgdGhlIG1vZGFsLiBDYW4gYmUgdXNlZCBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fc2hvdyA9IGZhbHNlO1xuICAgIHRoaXMuX2ludGVyYWN0aW9uU2VydmljZS5kZXF1ZXVlQmFja2Ryb3AodGhpcy5pbnRlcmFjdGFibGVJZCk7XG4gICAgdGhpcy5fZGlzYWJsZUV2ZW50SGFuZGxpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwRXZlbnRIYW5kbGluZygpOiB2b2lkIHtcbiAgICBjb25zdCB7IG5hdGl2ZUVsZW1lbnQgfSA9IHRoaXMuX2VsZW1lbnRSZWY7XG5cbiAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4obmF0aXZlRWxlbWVudCwgJ2tleWRvd24nKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9jbG9zZWQkKSxcbiAgICAgICAgZmlsdGVyKGV2dCA9PiBldnQua2V5ID09PSAnRXNjYXBlJylcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzbWlzc2FibGUgJiYgIWV2dC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZURpc21pc3MoZXZ0KTtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4obmF0aXZlRWxlbWVudCwgJ2tleWRvd24nKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9jbG9zZWQkKSxcbiAgICAgICAgZmlsdGVyKGV2dCA9PiBldnQua2V5ID09PSAnRW50ZXInKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShldnQgPT4ge1xuICAgICAgICBpZiAoIWV2dC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFjY2VwdChldnQpO1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGxldCBwcmV2ZW50Q2xvc2UgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5fZGlhbG9nRWxlbWVudFJlZikge1xuICAgICAgLy8gbGlzdGVuIHRvICdtb3VzZWRvd24nIGFuZCAnbW91c2V1cCcgdG8gcHJldmVudCBkaXNtaXNzYWwgd2hlbiBtb3VzZSBpcyBwcmVzc2VkIGluc2lkZVxuICAgICAgLy8gb2YgdGhlIGRpYWxvZyB3aW5kb3cgYW5kIHRoZW4gcmVsZWFzZWQgb3V0c2lkZVxuICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuX2RpYWxvZ0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlZG93bicpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9jbG9zZWQkKSxcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgcHJldmVudENsb3NlID0gZmFsc2U7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4obmF0aXZlRWxlbWVudCwgJ21vdXNldXAnKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fY2xvc2VkJCksXG4gICAgICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIGZpbHRlcigoeyB0YXJnZXQgfSkgPT4gbmF0aXZlRWxlbWVudCA9PT0gdGFyZ2V0KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHByZXZlbnRDbG9zZSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGxpc3RlbiB0byAnY2xpY2snIGV2ZW50cyB0byBkaXNtaXNzIG9uIGNvbXBvbmVudC9jb250YWluZXIgY2xpY2ssIGV4Y2VwdCB3aGVuXG4gICAgLy8gY2xpY2tpbmcgaW5zaWRlIHRoZSBkaWFsb2cgd2luZG93IG9yIHdoZW4gcHJldmVudGVkIGJ5IHRoZSBhYm92ZSAnbW91c2Vkb3duJ1xuICAgIC8vIGFuZCAnbW91c2V1cCcgaGFuZGxlcnNcbiAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4obmF0aXZlRWxlbWVudCwgJ2NsaWNrJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9jbG9zZWQkKSlcbiAgICAgIC5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICAgICAgaWYgKG5hdGl2ZUVsZW1lbnQgPT09IGV2dC50YXJnZXQgJiYgIXByZXZlbnRDbG9zZSkge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEaXNtaXNzKGV2dCk7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2ZW50Q2xvc2UgPSBmYWxzZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZUV2ZW50SGFuZGxpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2VkJC5uZXh0KCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI2RpYWxvZ0VsZW1lbnRcbiAgKm5nSWY9XCJ2YWxpZFwiXG4gIGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSBtb2RhbC10aGVtZS17e1xuICAgIHRoZW1lXG4gIH19XCJcbiAgW2NsYXNzLm1vZGFsLXNtXT1cInNpemUgPT09ICdzbSdcIlxuICBbY2xhc3MubW9kYWwtbGddPVwic2l6ZSA9PT0gJ2xnJ1wiXG4gIFtjbGFzcy5tb2RhbC14bF09XCJzaXplID09PSAneGwnXCJcbiAgW2NsYXNzLm1vZGFsLWZ1bGxzY3JlZW5dPVwic2l6ZSA9PT0gJ2ZzJ1wiXG4gIFtjbGFzcy5tb2RhbC1mdWxsc2NyZWVuLWxnLWRvd25dPVwic2l6ZSAhPT0gJ2ZzJ1wiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgIDxkaXYgKm5nSWY9XCJzaG93RGVzdHJ1Y3RpdmVJY29uXCIgY2xhc3M9XCJtb2RhbC1pY29uXCI+XG4gICAgICA8c3BhbiBpbXBkYy1pY29uIFtuYW1lXT1cImljb25OYW1lXCIgW3RoZW1lXT1cImljb25UaGVtZVwiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICNoZWFkZXIgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIiBbY2xhc3MuaGlkZV09XCJoaWRlSGVhZGVyXCI+XG4gICAgICA8aDMgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dXb3JraW5nSWNvblwiIGNsYXNzPVwibW9kYWwtaWNvblwiPlxuICAgICAgICAgIDxzcGFuIGltcGRjLWljb24gW25hbWVdPVwiaWNvbk5hbWVcIiBbdGhlbWVdPVwiaWNvblRoZW1lXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IHRpdGxlVGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvaDM+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGltcGRjQnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZGlzbWlzc2FibGVcIlxuICAgICAgICB0aGVtZT1cImNsb3NlXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZURpc21pc3MoJGV2ZW50KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAjYm9keUVsIGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgI2Zvb3RlciBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgI2Rpc21pc3NFbFxuICAgICAgICAqbmdJZj1cImRpc21pc3NhYmxlXCJcbiAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWRpc21pc3NFbC5jaGlsZHJlbi5sZW5ndGhcIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlRGlzbWlzcygkZXZlbnQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Rpc21pc3NdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgI2RlbnlFbFxuICAgICAgICBbY2xhc3MuaGlkZV09XCIhZGVueUVsLmNoaWxkcmVuLmxlbmd0aFwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVEZW55KCRldmVudCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZGVueV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICAjYWNjZXB0RWxcbiAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWFjY2VwdEVsLmNoaWxkcmVuLmxlbmd0aFwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVBY2NlcHQoJGV2ZW50KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthY2NlcHRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgI2FjY2VwdEZhbGxiYWNrRWxcbiAgICAgICAgKm5nSWY9XCIhYWNjZXB0RWwuY2hpbGRyZW4ubGVuZ3RoXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUFjY2VwdCgkZXZlbnQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGltcGRjQnV0dG9uXG4gICAgICAgICAgW3RleHRdPVwiYWNjZXB0VGV4dFwiXG4gICAgICAgICAgW3RoZW1lXT1cImFjY2VwdEZhbGxiYWNrVGhlbWVcIj48L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -8,19 +8,19 @@ import { ModalComponent } from './modal.component';
8
8
  import * as i0 from "@angular/core";
9
9
  export class ModalModule {
10
10
  constructor() { }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: ModalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.1", ngImport: i0, type: ModalModule, declarations: [ModalComponent], imports: [CommonModule,
13
+ FormsModule,
14
+ BackdropModule,
15
+ ButtonModule,
16
+ IconModule], exports: [BackdropModule, ButtonModule, IconModule, ModalComponent] }); }
17
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: ModalModule, imports: [CommonModule,
18
+ FormsModule,
19
+ BackdropModule,
20
+ ButtonModule,
21
+ IconModule, BackdropModule, ButtonModule, IconModule] }); }
11
22
  }
12
- ModalModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ModalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
13
- ModalModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: ModalModule, declarations: [ModalComponent], imports: [CommonModule,
14
- FormsModule,
15
- BackdropModule,
16
- ButtonModule,
17
- IconModule], exports: [BackdropModule, ButtonModule, IconModule, ModalComponent] });
18
- ModalModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ModalModule, imports: [CommonModule,
19
- FormsModule,
20
- BackdropModule,
21
- ButtonModule,
22
- IconModule, BackdropModule, ButtonModule, IconModule] });
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ModalModule, decorators: [{
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: ModalModule, decorators: [{
24
24
  type: NgModule,
25
25
  args: [{
26
26
  imports: [
@@ -33,5 +33,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
33
33
  declarations: [ModalComponent],
34
34
  exports: [BackdropModule, ButtonModule, IconModule, ModalComponent]
35
35
  }]
36
- }], ctorParameters: function () { return []; } });
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi9tb2RhbC9tb2RhbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFhbkQsTUFBTSxPQUFPLFdBQVc7SUFDdEIsZ0JBQWUsQ0FBQzs7eUdBREwsV0FBVzswR0FBWCxXQUFXLGlCQUhQLGNBQWMsYUFOM0IsWUFBWTtRQUNaLFdBQVc7UUFDWCxjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVUsYUFHRixjQUFjLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjOzBHQUV2RCxXQUFXLFlBVHBCLFlBQVk7UUFDWixXQUFXO1FBQ1gsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVLEVBR0YsY0FBYyxFQUFFLFlBQVksRUFBRSxVQUFVOzRGQUV2QyxXQUFXO2tCQVh2QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLFVBQVU7cUJBQ1g7b0JBQ0QsWUFBWSxFQUFFLENBQUMsY0FBYyxDQUFDO29CQUM5QixPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUM7aUJBQ3BFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJhY2tkcm9wTW9kdWxlIH0gZnJvbSAnLi4vYmFja2Ryb3AnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vYnV0dG9uJztcbmltcG9ydCB7IEljb25Nb2R1bGUgfSBmcm9tICcuLi9pY29uJztcbmltcG9ydCB7IE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RhbC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEJhY2tkcm9wTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBJY29uTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW01vZGFsQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0JhY2tkcm9wTW9kdWxlLCBCdXR0b25Nb2R1bGUsIEljb25Nb2R1bGUsIE1vZGFsQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbE1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
36
+ }], ctorParameters: () => [] });
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi9tb2RhbC9tb2RhbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFhbkQsTUFBTSxPQUFPLFdBQVc7SUFDdEIsZ0JBQWUsQ0FBQzs4R0FETCxXQUFXOytHQUFYLFdBQVcsaUJBSFAsY0FBYyxhQU4zQixZQUFZO1lBQ1osV0FBVztZQUNYLGNBQWM7WUFDZCxZQUFZO1lBQ1osVUFBVSxhQUdGLGNBQWMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGNBQWM7K0dBRXZELFdBQVcsWUFUcEIsWUFBWTtZQUNaLFdBQVc7WUFDWCxjQUFjO1lBQ2QsWUFBWTtZQUNaLFVBQVUsRUFHRixjQUFjLEVBQUUsWUFBWSxFQUFFLFVBQVU7OzJGQUV2QyxXQUFXO2tCQVh2QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLFVBQVU7cUJBQ1g7b0JBQ0QsWUFBWSxFQUFFLENBQUMsY0FBYyxDQUFDO29CQUM5QixPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUM7aUJBQ3BFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJhY2tkcm9wTW9kdWxlIH0gZnJvbSAnLi4vYmFja2Ryb3AnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vYnV0dG9uJztcbmltcG9ydCB7IEljb25Nb2R1bGUgfSBmcm9tICcuLi9pY29uJztcbmltcG9ydCB7IE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RhbC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEJhY2tkcm9wTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBJY29uTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW01vZGFsQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0JhY2tkcm9wTW9kdWxlLCBCdXR0b25Nb2R1bGUsIEljb25Nb2R1bGUsIE1vZGFsQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbE1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
@@ -6,4 +6,4 @@ export const ModalComponentSizesArr = [
6
6
  ComponentSize.XLarge,
7
7
  ComponentSize.Fullscreen
8
8
  ];
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtY29tcG9uZW50LXNpemVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi9tb2RhbC90eXBlcy9tb2RhbC1jb21wb25lbnQtc2l6ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLGFBQWEsQ0FBQyxLQUFLO0lBQ25CLGFBQWEsQ0FBQyxNQUFNO0lBQ3BCLGFBQWEsQ0FBQyxLQUFLO0lBQ25CLGFBQWEsQ0FBQyxNQUFNO0lBQ3BCLGFBQWEsQ0FBQyxVQUFVO0NBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRTaXplIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgTW9kYWxDb21wb25lbnRTaXplc0FyciA9IFtcbiAgQ29tcG9uZW50U2l6ZS5TbWFsbCxcbiAgQ29tcG9uZW50U2l6ZS5NZWRpdW0sXG4gIENvbXBvbmVudFNpemUuTGFyZ2UsXG4gIENvbXBvbmVudFNpemUuWExhcmdlLFxuICBDb21wb25lbnRTaXplLkZ1bGxzY3JlZW5cbl07XG5cbmV4cG9ydCB0eXBlIE1vZGFsQ29tcG9uZW50U2l6ZXMgPSB0eXBlb2YgTW9kYWxDb21wb25lbnRTaXplc0FycltudW1iZXJdO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtY29tcG9uZW50LXNpemVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi9tb2RhbC90eXBlcy9tb2RhbC1jb21wb25lbnQtc2l6ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLGFBQWEsQ0FBQyxLQUFLO0lBQ25CLGFBQWEsQ0FBQyxNQUFNO0lBQ3BCLGFBQWEsQ0FBQyxLQUFLO0lBQ25CLGFBQWEsQ0FBQyxNQUFNO0lBQ3BCLGFBQWEsQ0FBQyxVQUFVO0NBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRTaXplIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgTW9kYWxDb21wb25lbnRTaXplc0FyciA9IFtcbiAgQ29tcG9uZW50U2l6ZS5TbWFsbCxcbiAgQ29tcG9uZW50U2l6ZS5NZWRpdW0sXG4gIENvbXBvbmVudFNpemUuTGFyZ2UsXG4gIENvbXBvbmVudFNpemUuWExhcmdlLFxuICBDb21wb25lbnRTaXplLkZ1bGxzY3JlZW5cbl07XG5cbmV4cG9ydCB0eXBlIE1vZGFsQ29tcG9uZW50U2l6ZXMgPSAodHlwZW9mIE1vZGFsQ29tcG9uZW50U2l6ZXNBcnIpW251bWJlcl07XG4iXX0=
@@ -9,4 +9,4 @@ export const ModalThemesArr = [
9
9
  ModalTheme.Working,
10
10
  ModalTheme.Destructive
11
11
  ];
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtdGhlbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL21vZGFsL3R5cGVzL21vZGFsLXRoZW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIsK0JBQWlCLENBQUE7SUFDakIsaUNBQW1CLENBQUE7SUFDbkIseUNBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQUpXLFVBQVUsS0FBVixVQUFVLFFBSXJCO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHO0lBQzVCLFVBQVUsQ0FBQyxNQUFNO0lBQ2pCLFVBQVUsQ0FBQyxPQUFPO0lBQ2xCLFVBQVUsQ0FBQyxXQUFXO0NBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBNb2RhbFRoZW1lIHtcbiAgU2ltcGxlID0gJ3NpbXBsZScsXG4gIFdvcmtpbmcgPSAnd29ya2luZycsXG4gIERlc3RydWN0aXZlID0gJ2Rlc3RydWN0aXZlJ1xufVxuXG5leHBvcnQgY29uc3QgTW9kYWxUaGVtZXNBcnIgPSBbXG4gIE1vZGFsVGhlbWUuU2ltcGxlLFxuICBNb2RhbFRoZW1lLldvcmtpbmcsXG4gIE1vZGFsVGhlbWUuRGVzdHJ1Y3RpdmVcbl07XG5cbmV4cG9ydCB0eXBlIE1vZGFsVGhlbWVzID0gdHlwZW9mIE1vZGFsVGhlbWVzQXJyW251bWJlcl07XG4iXX0=
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtdGhlbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL21vZGFsL3R5cGVzL21vZGFsLXRoZW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIsK0JBQWlCLENBQUE7SUFDakIsaUNBQW1CLENBQUE7SUFDbkIseUNBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQUpXLFVBQVUsS0FBVixVQUFVLFFBSXJCO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHO0lBQzVCLFVBQVUsQ0FBQyxNQUFNO0lBQ2pCLFVBQVUsQ0FBQyxPQUFPO0lBQ2xCLFVBQVUsQ0FBQyxXQUFXO0NBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBNb2RhbFRoZW1lIHtcbiAgU2ltcGxlID0gJ3NpbXBsZScsXG4gIFdvcmtpbmcgPSAnd29ya2luZycsXG4gIERlc3RydWN0aXZlID0gJ2Rlc3RydWN0aXZlJ1xufVxuXG5leHBvcnQgY29uc3QgTW9kYWxUaGVtZXNBcnIgPSBbXG4gIE1vZGFsVGhlbWUuU2ltcGxlLFxuICBNb2RhbFRoZW1lLldvcmtpbmcsXG4gIE1vZGFsVGhlbWUuRGVzdHJ1Y3RpdmVcbl07XG5cbmV4cG9ydCB0eXBlIE1vZGFsVGhlbWVzID0gKHR5cGVvZiBNb2RhbFRoZW1lc0FycilbbnVtYmVyXTtcbiJdfQ==
@@ -0,0 +1,176 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { sanitize } from '../../utilities';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "../button/button.component";
6
+ import * as i3 from "../icon/icon.component";
7
+ import * as i4 from "@angular/forms";
8
+ import * as i5 from "../form-field/controls/select/option/select-option.component";
9
+ import * as i6 from "../form-field/controls/select/select.component";
10
+ import * as i7 from "../form-field/form-field.component";
11
+ import * as i8 from "../form-field/controls/input/input.directive";
12
+ import * as i9 from "../size-detection/directive/size-detector.directive";
13
+ /**
14
+ * The `PaginationComponent` (`<impdc-pagination` or `<div impdc-pagination`) is a control for paged content such as tables or lists.
15
+ * To use, import `PaginationModule` or another module that imports and exports that module from `@impartner/design-components`.
16
+ * `ModalModule` imports and exports ImpdcFormsModule and [ButtonModule](./?path=/docs/design-components-button).
17
+ */
18
+ export class PaginationComponent {
19
+ /**
20
+ * A formattable text summary of pagination data. `{firstPageResult}` The first item within the current page.
21
+ * `{lastPageResult}` The last item within the current page. `{total}` The total number of items.
22
+ */
23
+ set summary(summary) {
24
+ this._summary = summary;
25
+ }
26
+ get summary() {
27
+ return sanitize(this._summary)
28
+ .replace('{firstPageResult}', `<b>${this.firstPageResult}</b>`)
29
+ .replace('{lastPageResult}', `<b>${this.lastPageResult}</b>`)
30
+ .replace('{total}', `<b>${this.total}</b>`);
31
+ }
32
+ get totalPages() {
33
+ if (this.total < 1 || this.perPage < 1) {
34
+ return 0;
35
+ }
36
+ if (this.total < this.perPage) {
37
+ return 1;
38
+ }
39
+ return Math.ceil(this.total / this.perPage);
40
+ }
41
+ get firstPageResult() {
42
+ const page = this._getPageClamped();
43
+ if (this.total < 1 || page < 1 || this.perPage < 1) {
44
+ return 0;
45
+ }
46
+ if (page === 1) {
47
+ return 1;
48
+ }
49
+ if (page > Math.ceil(this.total / this.perPage)) {
50
+ return this.total;
51
+ }
52
+ return (page - 1) * this.perPage + 1;
53
+ }
54
+ get lastPageResult() {
55
+ const page = this._getPageClamped();
56
+ if (this.total <= 0 || page < 1 || this.perPage < 1) {
57
+ return 0;
58
+ }
59
+ if (page === 1) {
60
+ if (this.total < this.perPage) {
61
+ return this.total;
62
+ }
63
+ else {
64
+ return this.perPage;
65
+ }
66
+ }
67
+ if (this.total < this.perPage * page) {
68
+ return this.total;
69
+ }
70
+ else {
71
+ return this.perPage * page;
72
+ }
73
+ }
74
+ constructor(_changeDetectorRef) {
75
+ this._changeDetectorRef = _changeDetectorRef;
76
+ this._summary = 'Showing {firstPageResult} to {lastPageResult} of {total} results';
77
+ /**
78
+ * The current page.
79
+ */
80
+ this.page = 0;
81
+ /**
82
+ * The number of items shown per page. Items are commonly displayed as rows in a table.
83
+ */
84
+ this.perPage = 10;
85
+ /**
86
+ * The total number of items.
87
+ */
88
+ this.total = 0;
89
+ /**
90
+ * The label text for the per page select input.
91
+ */
92
+ this.perPageLabel = '';
93
+ /**
94
+ * Emitted when the page number is changed, specifying the target page number.
95
+ */
96
+ this.goToPage = new EventEmitter();
97
+ /**
98
+ * Emitted when the per page is changed, specifying the new value.
99
+ */
100
+ this.perPageChange = new EventEmitter();
101
+ /** @ignore */
102
+ this.mobile = false;
103
+ }
104
+ handleResize(size) {
105
+ this.mobile = size.width < 640;
106
+ this._changeDetectorRef.detectChanges();
107
+ }
108
+ goToPreviousPage() {
109
+ const page = this._getPageClamped();
110
+ if (page <= 1) {
111
+ return;
112
+ }
113
+ const previousPage = page - 1;
114
+ this.page = previousPage;
115
+ this.goToPage.emit(previousPage);
116
+ }
117
+ goToNextPage() {
118
+ const page = this._getPageClamped();
119
+ if (page >= this.totalPages) {
120
+ return;
121
+ }
122
+ const nextPage = page + 1;
123
+ this.page = nextPage;
124
+ this.goToPage.emit(nextPage);
125
+ }
126
+ goToExactPageFromEvent({ target }) {
127
+ this.goToExactPage(target?.value);
128
+ }
129
+ goToExactPage(page) {
130
+ const targetPage = this._getPageClamped(page);
131
+ if (targetPage === this.page) {
132
+ return;
133
+ }
134
+ this.page = targetPage;
135
+ this.goToPage.emit(this.page);
136
+ }
137
+ handlePerPageChange() {
138
+ this.perPageChange.emit(this.perPage);
139
+ }
140
+ preventDefaultAndBlur(event) {
141
+ // prevents PRM form submit
142
+ event.preventDefault();
143
+ event.target.blur();
144
+ }
145
+ _getPageClamped(page) {
146
+ page = Number(page || this.page || 0);
147
+ if (isNaN(page) || page < 1) {
148
+ return 1;
149
+ }
150
+ if (page > this.totalPages) {
151
+ return this.totalPages;
152
+ }
153
+ return page;
154
+ }
155
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PaginationComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
156
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: PaginationComponent, selector: "impdc-pagination, div[impdc-pagination]", inputs: { page: "page", perPage: "perPage", total: "total", summary: "summary", perPageLabel: "perPageLabel" }, outputs: { goToPage: "goToPage", perPageChange: "perPageChange" }, ngImport: i0, template: "<div\n class=\"pagination-container\"\n impdcSizeDetector\n (resized)=\"handleResize($event)\">\n <div class=\"mobile-pagination\" [ngClass]=\"{ 'd-none': !mobile }\">\n <button\n impdcButton\n theme=\"secondary\"\n [disabled]=\"page <= 1\"\n (click)=\"goToPreviousPage()\">\n <i impdc-icon name=\"chevron-left\"></i>\n </button>\n <button\n impdcButton\n theme=\"secondary\"\n [disabled]=\"page === totalPages\"\n (click)=\"goToNextPage()\">\n <i impdc-icon name=\"chevron-right\"></i>\n </button>\n </div>\n\n <div class=\"desktop-pagination\" [ngClass]=\"{ 'd-none': mobile }\">\n <div class=\"rows-per-page\">\n <div>{{ perPageLabel }}</div>\n <div>\n <impdc-form-field>\n <impdc-select\n [(ngModel)]=\"perPage\"\n (selectionChange)=\"handlePerPageChange()\">\n <impdc-select-option [value]=\"10\" label=\"10\"></impdc-select-option>\n <impdc-select-option [value]=\"25\" label=\"25\"></impdc-select-option>\n <impdc-select-option [value]=\"50\" label=\"50\"></impdc-select-option>\n <impdc-select-option\n [value]=\"100\"\n label=\"100\"></impdc-select-option>\n <impdc-select-option\n [value]=\"200\"\n label=\"200\"></impdc-select-option>\n </impdc-select>\n </impdc-form-field>\n </div>\n </div>\n <div class=\"pagination-rhs\">\n <div>\n <span class=\"summary\" [innerHTML]=\"summary\"></span>\n </div>\n <div class=\"pagination-actions\">\n <button\n impdcButton\n theme=\"secondary\"\n aria-label=\"First Page\"\n class=\"pagination-first-last-btns\"\n (click)=\"goToExactPage(1)\"\n [disabled]=\"page <= 1\">\n <i impdc-icon name=\"chevron-left first\"></i>\n <i impdc-icon name=\"chevron-left\"></i>\n <!-- 1 -->\n </button>\n <button\n impdcButton\n theme=\"secondary\"\n class=\"previous\"\n aria-label=\"Previous\"\n (click)=\"goToPreviousPage()\"\n [disabled]=\"page <= 1\">\n <i impdc-icon name=\"chevron-left\"></i>\n </button>\n <div class=\"page-change\">\n <input\n impdcInput\n [(ngModel)]=\"page\"\n maxlength=\"4\"\n (blur)=\"goToExactPageFromEvent($event)\"\n (keydown.enter)=\"preventDefaultAndBlur($event)\" />\n <span> / {{ totalPages }} </span>\n </div>\n <button\n impdcButton\n theme=\"secondary\"\n aria-label=\"Next\"\n (click)=\"goToNextPage()\"\n [disabled]=\"page >= totalPages\">\n <i impdc-icon name=\"chevron-right\"></i>\n </button>\n <button\n impdcButton\n theme=\"secondary\"\n class=\"pagination-first-last-btns\"\n aria-label=\"Last Page\"\n (click)=\"goToExactPage(totalPages)\"\n [disabled]=\"page === totalPages\">\n <i impdc-icon name=\"chevron-right\"></i>\n <i impdc-icon name=\"chevron-right last\"></i>\n <!-- {{ totalPages }} -->\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".pagination-container{background-color:var(--impd-color-white);padding:var(--impd-size-3) var(--impd-size-5);gap:1rem;color:var(--impd-color-gray-700, #374151)}.pagination-container .mobile-pagination{display:flex;gap:2rem;justify-content:space-between;align-items:center}.pagination-container .mobile-pagination button[impdcButton]{width:50%;justify-content:left}.pagination-container .desktop-pagination{display:flex;flex:1 1 0%;align-items:center;justify-content:space-between;gap:2rem;flex-flow:wrap}.pagination-container .desktop-pagination .rows-per-page{display:flex;flex-direction:row;align-items:center;gap:1rem;flex-grow:1;font-size:var(--impd-font-size-sm);line-height:var(--impd-size-5);font-weight:400;color:var(--impd-color-gray-700)}.pagination-container .desktop-pagination .pagination-rhs{display:flex;flex-direction:row;gap:2.4rem;flex-wrap:wrap;align-items:center}.pagination-container .desktop-pagination .pagination-rhs .summary{font-size:var(--impd-font-size-sm);line-height:var(--impd-size-5);font-weight:400;color:var(--impd-color-gray-700)}.pagination-container .desktop-pagination .pagination-rhs .pagination-actions{display:flex;flex-direction:row;gap:.4rem;flex-flow:wrap}.pagination-container .desktop-pagination .pagination-rhs .pagination-actions ::ng-deep .first{margin-right:-1.2rem}.pagination-container .desktop-pagination .pagination-rhs .pagination-actions ::ng-deep .last{margin-left:-1.2rem}.pagination-container .desktop-pagination .pagination-rhs .page-change{display:flex;flex-direction:row;align-items:center;gap:.4rem;font-size:var(--impd-size-3_5, 1.4rem)}.pagination-container .desktop-pagination .pagination-rhs .page-change .form-control{min-width:4.275rem;max-width:6.3rem;text-align:center}.pagination-container .desktop-pagination .pagination-rhs .pagination-first-last-btns{padding-left:1.325rem;padding-right:1.325rem}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.ButtonComponent, selector: "button[impdcButton]", inputs: ["type", "theme", "text", "disabled", "titleText", "ariaLabel"] }, { kind: "component", type: i3.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.SelectOptionComponent, selector: "impdc-select-option", inputs: ["value", "label", "id", "disabled"], outputs: ["onSelectionChange"] }, { kind: "component", type: i6.SelectComponent, selector: "impdc-select", inputs: ["disabled", "tabIndex", "placeholder", "required", "multiple", "compareWith", "errorStateMatcher", "value", "id"], outputs: ["selectionChange", "valueChange"], exportAs: ["impdcSelect"] }, { kind: "component", type: i7.FormFieldComponent, selector: "impdc-form-field", exportAs: ["impdcFormField"] }, { kind: "directive", type: i8.InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "directive", type: i9.SizeDetectorDirective, selector: "[impdcSizeDetector]", outputs: ["resized"] }] }); }
157
+ }
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PaginationComponent, decorators: [{
159
+ type: Component,
160
+ args: [{ selector: 'impdc-pagination, div[impdc-pagination]', template: "<div\n class=\"pagination-container\"\n impdcSizeDetector\n (resized)=\"handleResize($event)\">\n <div class=\"mobile-pagination\" [ngClass]=\"{ 'd-none': !mobile }\">\n <button\n impdcButton\n theme=\"secondary\"\n [disabled]=\"page <= 1\"\n (click)=\"goToPreviousPage()\">\n <i impdc-icon name=\"chevron-left\"></i>\n </button>\n <button\n impdcButton\n theme=\"secondary\"\n [disabled]=\"page === totalPages\"\n (click)=\"goToNextPage()\">\n <i impdc-icon name=\"chevron-right\"></i>\n </button>\n </div>\n\n <div class=\"desktop-pagination\" [ngClass]=\"{ 'd-none': mobile }\">\n <div class=\"rows-per-page\">\n <div>{{ perPageLabel }}</div>\n <div>\n <impdc-form-field>\n <impdc-select\n [(ngModel)]=\"perPage\"\n (selectionChange)=\"handlePerPageChange()\">\n <impdc-select-option [value]=\"10\" label=\"10\"></impdc-select-option>\n <impdc-select-option [value]=\"25\" label=\"25\"></impdc-select-option>\n <impdc-select-option [value]=\"50\" label=\"50\"></impdc-select-option>\n <impdc-select-option\n [value]=\"100\"\n label=\"100\"></impdc-select-option>\n <impdc-select-option\n [value]=\"200\"\n label=\"200\"></impdc-select-option>\n </impdc-select>\n </impdc-form-field>\n </div>\n </div>\n <div class=\"pagination-rhs\">\n <div>\n <span class=\"summary\" [innerHTML]=\"summary\"></span>\n </div>\n <div class=\"pagination-actions\">\n <button\n impdcButton\n theme=\"secondary\"\n aria-label=\"First Page\"\n class=\"pagination-first-last-btns\"\n (click)=\"goToExactPage(1)\"\n [disabled]=\"page <= 1\">\n <i impdc-icon name=\"chevron-left first\"></i>\n <i impdc-icon name=\"chevron-left\"></i>\n <!-- 1 -->\n </button>\n <button\n impdcButton\n theme=\"secondary\"\n class=\"previous\"\n aria-label=\"Previous\"\n (click)=\"goToPreviousPage()\"\n [disabled]=\"page <= 1\">\n <i impdc-icon name=\"chevron-left\"></i>\n </button>\n <div class=\"page-change\">\n <input\n impdcInput\n [(ngModel)]=\"page\"\n maxlength=\"4\"\n (blur)=\"goToExactPageFromEvent($event)\"\n (keydown.enter)=\"preventDefaultAndBlur($event)\" />\n <span> / {{ totalPages }} </span>\n </div>\n <button\n impdcButton\n theme=\"secondary\"\n aria-label=\"Next\"\n (click)=\"goToNextPage()\"\n [disabled]=\"page >= totalPages\">\n <i impdc-icon name=\"chevron-right\"></i>\n </button>\n <button\n impdcButton\n theme=\"secondary\"\n class=\"pagination-first-last-btns\"\n aria-label=\"Last Page\"\n (click)=\"goToExactPage(totalPages)\"\n [disabled]=\"page === totalPages\">\n <i impdc-icon name=\"chevron-right\"></i>\n <i impdc-icon name=\"chevron-right last\"></i>\n <!-- {{ totalPages }} -->\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".pagination-container{background-color:var(--impd-color-white);padding:var(--impd-size-3) var(--impd-size-5);gap:1rem;color:var(--impd-color-gray-700, #374151)}.pagination-container .mobile-pagination{display:flex;gap:2rem;justify-content:space-between;align-items:center}.pagination-container .mobile-pagination button[impdcButton]{width:50%;justify-content:left}.pagination-container .desktop-pagination{display:flex;flex:1 1 0%;align-items:center;justify-content:space-between;gap:2rem;flex-flow:wrap}.pagination-container .desktop-pagination .rows-per-page{display:flex;flex-direction:row;align-items:center;gap:1rem;flex-grow:1;font-size:var(--impd-font-size-sm);line-height:var(--impd-size-5);font-weight:400;color:var(--impd-color-gray-700)}.pagination-container .desktop-pagination .pagination-rhs{display:flex;flex-direction:row;gap:2.4rem;flex-wrap:wrap;align-items:center}.pagination-container .desktop-pagination .pagination-rhs .summary{font-size:var(--impd-font-size-sm);line-height:var(--impd-size-5);font-weight:400;color:var(--impd-color-gray-700)}.pagination-container .desktop-pagination .pagination-rhs .pagination-actions{display:flex;flex-direction:row;gap:.4rem;flex-flow:wrap}.pagination-container .desktop-pagination .pagination-rhs .pagination-actions ::ng-deep .first{margin-right:-1.2rem}.pagination-container .desktop-pagination .pagination-rhs .pagination-actions ::ng-deep .last{margin-left:-1.2rem}.pagination-container .desktop-pagination .pagination-rhs .page-change{display:flex;flex-direction:row;align-items:center;gap:.4rem;font-size:var(--impd-size-3_5, 1.4rem)}.pagination-container .desktop-pagination .pagination-rhs .page-change .form-control{min-width:4.275rem;max-width:6.3rem;text-align:center}.pagination-container .desktop-pagination .pagination-rhs .pagination-first-last-btns{padding-left:1.325rem;padding-right:1.325rem}\n"] }]
161
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { page: [{
162
+ type: Input
163
+ }], perPage: [{
164
+ type: Input
165
+ }], total: [{
166
+ type: Input
167
+ }], summary: [{
168
+ type: Input
169
+ }], perPageLabel: [{
170
+ type: Input
171
+ }], goToPage: [{
172
+ type: Output
173
+ }], perPageChange: [{
174
+ type: Output
175
+ }] } });
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7QUFHM0M7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyxtQkFBbUI7SUFzQjlCOzs7T0FHRztJQUNILElBQ1csT0FBTyxDQUFDLE9BQWU7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQzNCLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLElBQUksQ0FBQyxlQUFlLE1BQU0sQ0FBQzthQUM5RCxPQUFPLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxJQUFJLENBQUMsY0FBYyxNQUFNLENBQUM7YUFDNUQsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFrQkQsSUFBVyxVQUFVO1FBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUU7WUFDdEMsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUVELElBQUksSUFBSSxDQUFD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LENBQUMsQ0FBQztRQUN0QyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUN4QjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs4R0EvS1UsbUJBQW1CO2tHQUFuQixtQkFBbUIsa1FDcEJoQyw2d0dBbUdBOzsyRkQvRWEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLHlDQUF5QztzRkFZNUMsSUFBSTtzQkFEVixLQUFLO2dCQU9DLE9BQU87c0JBRGIsS0FBSztnQkFPQyxLQUFLO3NCQURYLEtBQUs7Z0JBUUssT0FBTztzQkFEakIsS0FBSztnQkFnQkMsWUFBWTtzQkFEbEIsS0FBSztnQkFNb0IsUUFBUTtzQkFBakMsTUFBTTtnQkFLbUIsYUFBYTtzQkFBdEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNhbml0aXplIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzJztcbmltcG9ydCB7IElFbGVtZW50U2l6ZSB9IGZyb20gJy4uL3NpemUtZGV0ZWN0aW9uJztcblxuLyoqXG4gKiBUaGUgYFBhZ2luYXRpb25Db21wb25lbnRgIChgPGltcGRjLXBhZ2luYXRpb25gIG9yIGA8ZGl2IGltcGRjLXBhZ2luYXRpb25gKSBpcyBhIGNvbnRyb2wgZm9yIHBhZ2VkIGNvbnRlbnQgc3VjaCBhcyB0YWJsZXMgb3IgbGlzdHMuXG4gKiBUbyB1c2UsIGltcG9ydCBgUGFnaW5hdGlvbk1vZHVsZWAgb3IgYW5vdGhlciBtb2R1bGUgdGhhdCBpbXBvcnRzIGFuZCBleHBvcnRzIHRoYXQgbW9kdWxlIGZyb20gYEBpbXBhcnRuZXIvZGVzaWduLWNvbXBvbmVudHNgLlxuICogYE1vZGFsTW9kdWxlYCBpbXBvcnRzIGFuZCBleHBvcnRzIEltcGRjRm9ybXNNb2R1bGUgYW5kIFtCdXR0b25Nb2R1bGVdKC4vP3BhdGg9L2RvY3MvZGVzaWduLWNvbXBvbmVudHMtYnV0dG9uKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW1wZGMtcGFnaW5hdGlvbiwgZGl2W2ltcGRjLXBhZ2luYXRpb25dJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkNvbXBvbmVudCB7XG4gIHByaXZhdGUgX3N1bW1hcnkgPVxuICAgICdTaG93aW5nIHtmaXJzdFBhZ2VSZXN1bHR9IHRvIHtsYXN0UGFnZVJlc3VsdH0gb2Yge3RvdGFsfSByZXN1bHRzJztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcGFnZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwYWdlID0gMDtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBpdGVtcyBzaG93biBwZXIgcGFnZS4gSXRlbXMgYXJlIGNvbW1vbmx5IGRpc3BsYXllZCBhcyByb3dzIGluIGEgdGFibGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcGVyUGFnZSA9IDEwO1xuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHRvdGFsID0gMDtcblxuICAvKipcbiAgICogQSBmb3JtYXR0YWJsZSB0ZXh0IHN1bW1hcnkgb2YgcGFnaW5hdGlvbiBkYXRhLiBge2ZpcnN0UGFnZVJlc3VsdH1gIFRoZSBmaXJzdCBpdGVtIHdpdGhpbiB0aGUgY3VycmVudCBwYWdlLlxuICAgKiBge2xhc3RQYWdlUmVzdWx0fWAgVGhlIGxhc3QgaXRlbSB3aXRoaW4gdGhlIGN1cnJlbnQgcGFnZS4gYHt0b3RhbH1gIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN1bW1hcnkoc3VtbWFyeTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc3VtbWFyeSA9IHN1bW1hcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2FuaXRpemUodGhpcy5fc3VtbWFyeSlcbiAgICAgIC5yZXBsYWNlKCd7Zmlyc3RQYWdlUmVzdWx0fScsIGA8Yj4ke3RoaXMuZmlyc3RQYWdlUmVzdWx0fTwvYj5gKVxuICAgICAgLnJlcGxhY2UoJ3tsYXN0UGFnZVJlc3VsdH0nLCBgPGI+JHt0aGlzLmxhc3RQYWdlUmVzdWx0fTwvYj5gKVxuICAgICAgLnJlcGxhY2UoJ3t0b3RhbH0nLCBgPGI+JHt0aGlzLnRvdGFsfTwvYj5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgdGV4dCBmb3IgdGhlIHBlciBwYWdlIHNlbGVjdCBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwZXJQYWdlTGFiZWwgPSAnJztcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBwYWdlIG51bWJlciBpcyBjaGFuZ2VkLCBzcGVjaWZ5aW5nIHRoZSB0YXJnZXQgcGFnZSBudW1iZXIuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGdvVG9QYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcGVyIHBhZ2UgaXMgY2hhbmdlZCwgc3BlY2lmeWluZyB0aGUgbmV3IHZhbHVlLlxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBwZXJQYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgcHVibGljIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudG90YWwgPCAxIHx8IHRoaXMucGVyUGFnZSA8IDEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRvdGFsIDwgdGhpcy5wZXJQYWdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnBlclBhZ2UpO1xuICB9XG5cbiAgcHVibGljIGdldCBmaXJzdFBhZ2VSZXN1bHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYWdlID0gdGhpcy5fZ2V0UGFnZUNsYW1wZWQoKTtcbiAgICBpZiAodGhpcy50b3RhbCA8IDEgfHwgcGFnZSA8IDEgfHwgdGhpcy5wZXJQYWdlIDwgMSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmIChwYWdlID4gTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnBlclBhZ2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b3RhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gKHBhZ2UgLSAxKSAqIHRoaXMucGVyUGFnZSArIDE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxhc3RQYWdlUmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcGFnZSA9IHRoaXMuX2dldFBhZ2VDbGFtcGVkKCk7XG4gICAgaWYgKHRoaXMudG90YWwgPD0gMCB8fCBwYWdlIDwgMSB8fCB0aGlzLnBlclBhZ2UgPCAxKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAocGFnZSA9PT0gMSkge1xuICAgICAgaWYgKHRoaXMudG90YWwgPCB0aGlzLnBlclBhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJQYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRvdGFsIDwgdGhpcy5wZXJQYWdlICogcGFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMudG90YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnBlclBhZ2UgKiBwYWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBtb2JpbGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgcHVibGljIGhhbmRsZVJlc2l6ZShzaXplOiBJRWxlbWVudFNpemUpOiB2b2lkIHtcbiAgICB0aGlzLm1vYmlsZSA9IHNpemUud2lkdGggPCA2NDA7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGdvVG9QcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgcGFnZSA9IHRoaXMuX2dldFBhZ2VDbGFtcGVkKCk7XG4gICAgaWYgKHBhZ2UgPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzUGFnZSA9IHBhZ2UgLSAxO1xuICAgIHRoaXMucGFnZSA9IHByZXZpb3VzUGFnZTtcblxuICAgIHRoaXMuZ29Ub1BhZ2UuZW1pdChwcmV2aW91c1BhZ2UpO1xuICB9XG5cbiAgcHVibGljIGdvVG9OZXh0UGFnZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwYWdlID0gdGhpcy5fZ2V0UGFnZUNsYW1wZWQoKTtcbiAgICBpZiAocGFnZSA+PSB0aGlzLnRvdGFsUGFnZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UGFnZSA9IHBhZ2UgKyAxO1xuICAgIHRoaXMucGFnZSA9IG5leHRQYWdlO1xuXG4gICAgdGhpcy5nb1RvUGFnZS5lbWl0KG5leHRQYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBnb1RvRXhhY3RQYWdlRnJvbUV2ZW50KHsgdGFyZ2V0IH06IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmdvVG9FeGFjdFBhZ2UoKHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8udmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdvVG9FeGFjdFBhZ2UocGFnZTogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0UGFnZSA9IHRoaXMuX2dldFBhZ2VDbGFtcGVkKHBhZ2UpO1xuXG4gICAgaWYgKHRhcmdldFBhZ2UgPT09IHRoaXMucGFnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGFnZSA9IHRhcmdldFBhZ2U7XG5cbiAgICB0aGlzLmdvVG9QYWdlLmVtaXQodGhpcy5wYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVQZXJQYWdlQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMucGVyUGFnZUNoYW5nZS5lbWl0KHRoaXMucGVyUGFnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJldmVudERlZmF1bHRBbmRCbHVyKGV2ZW50OiBFdmVudCkge1xuICAgIC8vIHByZXZlbnRzIFBSTSBmb3JtIHN1Ym1pdFxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5ibHVyKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRQYWdlQ2xhbXBlZChwYWdlPzogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgICBwYWdlID0gTnVtYmVyKHBhZ2UgfHwgdGhpcy5wYWdlIHx8IDApO1xuICAgIGlmIChpc05hTihwYWdlKSB8fCBwYWdlIDwgMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgaWYgKHBhZ2UgPiB0aGlzLnRvdGFsUGFnZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvdGFsUGFnZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJwYWdpbmF0aW9uLWNvbnRhaW5lclwiXG4gIGltcGRjU2l6ZURldGVjdG9yXG4gIChyZXNpemVkKT1cImhhbmRsZVJlc2l6ZSgkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2JpbGUtcGFnaW5hdGlvblwiIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6ICFtb2JpbGUgfVwiPlxuICAgIDxidXR0b25cbiAgICAgIGltcGRjQnV0dG9uXG4gICAgICB0aGVtZT1cInNlY29uZGFyeVwiXG4gICAgICBbZGlzYWJsZWRdPVwicGFnZSA8PSAxXCJcbiAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNQYWdlKClcIj5cbiAgICAgIDxpIGltcGRjLWljb24gbmFtZT1cImNoZXZyb24tbGVmdFwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBpbXBkY0J1dHRvblxuICAgICAgdGhlbWU9XCJzZWNvbmRhcnlcIlxuICAgICAgW2Rpc2FibGVkXT1cInBhZ2UgPT09IHRvdGFsUGFnZXNcIlxuICAgICAgKGNsaWNrKT1cImdvVG9OZXh0UGFnZSgpXCI+XG4gICAgICA8aSBpbXBkYy1pY29uIG5hbWU9XCJjaGV2cm9uLXJpZ2h0XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZGVza3RvcC1wYWdpbmF0aW9uXCIgW25nQ2xhc3NdPVwieyAnZC1ub25lJzogbW9iaWxlIH1cIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93cy1wZXItcGFnZVwiPlxuICAgICAgPGRpdj57eyBwZXJQYWdlTGFiZWwgfX08L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxpbXBkYy1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbXBkYy1zZWxlY3RcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGVyUGFnZVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImhhbmRsZVBlclBhZ2VDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgPGltcGRjLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIjEwXCIgbGFiZWw9XCIxMFwiPjwvaW1wZGMtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgIDxpbXBkYy1zZWxlY3Qtb3B0aW9uIFt2YWx1ZV09XCIyNVwiIGxhYmVsPVwiMjVcIj48L2ltcGRjLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICA8aW1wZGMtc2VsZWN0LW9wdGlvbiBbdmFsdWVdPVwiNTBcIiBsYWJlbD1cIjUwXCI+PC9pbXBkYy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgPGltcGRjLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIjEwMFwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiMTAwXCI+PC9pbXBkYy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgPGltcGRjLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIjIwMFwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiMjAwXCI+PC9pbXBkYy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgIDwvaW1wZGMtc2VsZWN0PlxuICAgICAgICA8L2ltcGRjLWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdGlvbi1yaHNcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeVwiIFtpbm5lckhUTUxdPVwic3VtbWFyeVwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRpb24tYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgaW1wZGNCdXR0b25cbiAgICAgICAgICB0aGVtZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IFBhZ2VcIlxuICAgICAgICAgIGNsYXNzPVwicGFnaW5hdGlvbi1maXJzdC1sYXN0LWJ0bnNcIlxuICAgICAgICAgIChjbGljayk9XCJnb1RvRXhhY3RQYWdlKDEpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA8PSAxXCI+XG4gICAgICAgICAgPGkgaW1wZGMtaWNvbiBuYW1lPVwiY2hldnJvbi1sZWZ0IGZpcnN0XCI+PC9pPlxuICAgICAgICAgIDxpIGltcGRjLWljb24gbmFtZT1cImNoZXZyb24tbGVmdFwiPjwvaT5cbiAgICAgICAgICA8IS0tIDEgLS0+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgaW1wZGNCdXR0b25cbiAgICAgICAgICB0aGVtZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgY2xhc3M9XCJwcmV2aW91c1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCJcbiAgICAgICAgICAoY2xpY2spPVwiZ29Ub1ByZXZpb3VzUGFnZSgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA8PSAxXCI+XG4gICAgICAgICAgPGkgaW1wZGMtaWNvbiBuYW1lPVwiY2hldnJvbi1sZWZ0XCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2UtY2hhbmdlXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpbXBkY0lucHV0XG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZ2VcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNFwiXG4gICAgICAgICAgICAoYmx1cik9XCJnb1RvRXhhY3RQYWdlRnJvbUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicHJldmVudERlZmF1bHRBbmRCbHVyKCRldmVudClcIiAvPlxuICAgICAgICAgIDxzcGFuPiAvIHt7IHRvdGFsUGFnZXMgfX0gPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGltcGRjQnV0dG9uXG4gICAgICAgICAgdGhlbWU9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0XCJcbiAgICAgICAgICAoY2xpY2spPVwiZ29Ub05leHRQYWdlKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJwYWdlID49IHRvdGFsUGFnZXNcIj5cbiAgICAgICAgICA8aSBpbXBkYy1pY29uIG5hbWU9XCJjaGV2cm9uLXJpZ2h0XCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGltcGRjQnV0dG9uXG4gICAgICAgICAgdGhlbWU9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIGNsYXNzPVwicGFnaW5hdGlvbi1maXJzdC1sYXN0LWJ0bnNcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJMYXN0IFBhZ2VcIlxuICAgICAgICAgIChjbGljayk9XCJnb1RvRXhhY3RQYWdlKHRvdGFsUGFnZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA9PT0gdG90YWxQYWdlc1wiPlxuICAgICAgICAgIDxpIGltcGRjLWljb24gbmFtZT1cImNoZXZyb24tcmlnaHRcIj48L2k+XG4gICAgICAgICAgPGkgaW1wZGMtaWNvbiBuYW1lPVwiY2hldnJvbi1yaWdodCBsYXN0XCI+PC9pPlxuICAgICAgICAgIDwhLS0ge3sgdG90YWxQYWdlcyB9fSAtLT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==