@fundamental-ngx/core 0.58.2-rc.0 → 0.58.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/fesm2022/fundamental-ngx-core-action-bar.mjs +26 -26
  2. package/fesm2022/fundamental-ngx-core-action-bar.mjs.map +1 -1
  3. package/fesm2022/fundamental-ngx-core-action-sheet.mjs +20 -20
  4. package/fesm2022/fundamental-ngx-core-action-sheet.mjs.map +1 -1
  5. package/fesm2022/fundamental-ngx-core-avatar-group-legacy.mjs +28 -28
  6. package/fesm2022/fundamental-ngx-core-avatar-group-legacy.mjs.map +1 -1
  7. package/fesm2022/fundamental-ngx-core-avatar-group.mjs +34 -34
  8. package/fesm2022/fundamental-ngx-core-avatar-group.mjs.map +1 -1
  9. package/fesm2022/fundamental-ngx-core-avatar.mjs +10 -10
  10. package/fesm2022/fundamental-ngx-core-avatar.mjs.map +1 -1
  11. package/fesm2022/fundamental-ngx-core-bar.mjs +25 -25
  12. package/fesm2022/fundamental-ngx-core-bar.mjs.map +1 -1
  13. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs +10 -10
  14. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  15. package/fesm2022/fundamental-ngx-core-busy-indicator.mjs +15 -15
  16. package/fesm2022/fundamental-ngx-core-busy-indicator.mjs.map +1 -1
  17. package/fesm2022/fundamental-ngx-core-button.mjs +15 -15
  18. package/fesm2022/fundamental-ngx-core-button.mjs.map +1 -1
  19. package/fesm2022/fundamental-ngx-core-calendar.mjs +40 -40
  20. package/fesm2022/fundamental-ngx-core-calendar.mjs.map +1 -1
  21. package/fesm2022/fundamental-ngx-core-card.mjs +130 -126
  22. package/fesm2022/fundamental-ngx-core-card.mjs.map +1 -1
  23. package/fesm2022/fundamental-ngx-core-carousel.mjs +19 -19
  24. package/fesm2022/fundamental-ngx-core-carousel.mjs.map +1 -1
  25. package/fesm2022/fundamental-ngx-core-checkbox.mjs +7 -7
  26. package/fesm2022/fundamental-ngx-core-checkbox.mjs.map +1 -1
  27. package/fesm2022/fundamental-ngx-core-combobox.mjs +16 -16
  28. package/fesm2022/fundamental-ngx-core-combobox.mjs.map +1 -1
  29. package/fesm2022/fundamental-ngx-core-content-density.mjs +25 -25
  30. package/fesm2022/fundamental-ngx-core-content-density.mjs.map +1 -1
  31. package/fesm2022/fundamental-ngx-core-date-picker.mjs +13 -13
  32. package/fesm2022/fundamental-ngx-core-date-picker.mjs.map +1 -1
  33. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs +13 -13
  34. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
  35. package/fesm2022/fundamental-ngx-core-datetime.mjs +30 -30
  36. package/fesm2022/fundamental-ngx-core-datetime.mjs.map +1 -1
  37. package/fesm2022/fundamental-ngx-core-dialog.mjs +64 -64
  38. package/fesm2022/fundamental-ngx-core-dialog.mjs.map +1 -1
  39. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs +52 -52
  40. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs.map +1 -1
  41. package/fesm2022/fundamental-ngx-core-dynamic-side-content.mjs +13 -13
  42. package/fesm2022/fundamental-ngx-core-dynamic-side-content.mjs.map +1 -1
  43. package/fesm2022/fundamental-ngx-core-facets.mjs +17 -17
  44. package/fesm2022/fundamental-ngx-core-facets.mjs.map +1 -1
  45. package/fesm2022/fundamental-ngx-core-feed-input.mjs +17 -17
  46. package/fesm2022/fundamental-ngx-core-feed-input.mjs.map +1 -1
  47. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs +22 -22
  48. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs.map +1 -1
  49. package/fesm2022/fundamental-ngx-core-file-uploader.mjs +16 -16
  50. package/fesm2022/fundamental-ngx-core-file-uploader.mjs.map +1 -1
  51. package/fesm2022/fundamental-ngx-core-fixed-card-layout.mjs +13 -13
  52. package/fesm2022/fundamental-ngx-core-fixed-card-layout.mjs.map +1 -1
  53. package/fesm2022/fundamental-ngx-core-flexible-column-layout.mjs +7 -7
  54. package/fesm2022/fundamental-ngx-core-flexible-column-layout.mjs.map +1 -1
  55. package/fesm2022/fundamental-ngx-core-form.mjs +70 -70
  56. package/fesm2022/fundamental-ngx-core-form.mjs.map +1 -1
  57. package/fesm2022/fundamental-ngx-core-formatted-text.mjs +8 -8
  58. package/fesm2022/fundamental-ngx-core-formatted-text.mjs.map +1 -1
  59. package/fesm2022/fundamental-ngx-core-generic-tag.mjs +7 -7
  60. package/fesm2022/fundamental-ngx-core-generic-tag.mjs.map +1 -1
  61. package/fesm2022/fundamental-ngx-core-grid-list.mjs +47 -47
  62. package/fesm2022/fundamental-ngx-core-grid-list.mjs.map +1 -1
  63. package/fesm2022/fundamental-ngx-core-icon.mjs +8 -8
  64. package/fesm2022/fundamental-ngx-core-icon.mjs.map +1 -1
  65. package/fesm2022/fundamental-ngx-core-illustrated-message.mjs +19 -19
  66. package/fesm2022/fundamental-ngx-core-illustrated-message.mjs.map +1 -1
  67. package/fesm2022/fundamental-ngx-core-infinite-scroll.mjs +10 -8
  68. package/fesm2022/fundamental-ngx-core-infinite-scroll.mjs.map +1 -1
  69. package/fesm2022/fundamental-ngx-core-info-label.mjs +7 -7
  70. package/fesm2022/fundamental-ngx-core-info-label.mjs.map +1 -1
  71. package/fesm2022/fundamental-ngx-core-inline-help.mjs +7 -7
  72. package/fesm2022/fundamental-ngx-core-inline-help.mjs.map +1 -1
  73. package/fesm2022/fundamental-ngx-core-input-group.mjs +19 -19
  74. package/fesm2022/fundamental-ngx-core-input-group.mjs.map +1 -1
  75. package/fesm2022/fundamental-ngx-core-layout-grid.mjs +17 -17
  76. package/fesm2022/fundamental-ngx-core-layout-grid.mjs.map +1 -1
  77. package/fesm2022/fundamental-ngx-core-layout-panel.mjs +31 -31
  78. package/fesm2022/fundamental-ngx-core-layout-panel.mjs.map +1 -1
  79. package/fesm2022/fundamental-ngx-core-link.mjs +7 -7
  80. package/fesm2022/fundamental-ngx-core-link.mjs.map +1 -1
  81. package/fesm2022/fundamental-ngx-core-list.mjs +80 -80
  82. package/fesm2022/fundamental-ngx-core-list.mjs.map +1 -1
  83. package/fesm2022/fundamental-ngx-core-menu.mjs +58 -56
  84. package/fesm2022/fundamental-ngx-core-menu.mjs.map +1 -1
  85. package/fesm2022/fundamental-ngx-core-message-box.mjs +37 -37
  86. package/fesm2022/fundamental-ngx-core-message-box.mjs.map +1 -1
  87. package/fesm2022/fundamental-ngx-core-message-page.mjs +19 -19
  88. package/fesm2022/fundamental-ngx-core-message-page.mjs.map +1 -1
  89. package/fesm2022/fundamental-ngx-core-message-strip.mjs +25 -25
  90. package/fesm2022/fundamental-ngx-core-message-strip.mjs.map +1 -1
  91. package/fesm2022/fundamental-ngx-core-message-toast.mjs +17 -17
  92. package/fesm2022/fundamental-ngx-core-message-toast.mjs.map +1 -1
  93. package/fesm2022/fundamental-ngx-core-micro-process-flow.mjs +19 -19
  94. package/fesm2022/fundamental-ngx-core-micro-process-flow.mjs.map +1 -1
  95. package/fesm2022/fundamental-ngx-core-mobile-mode.mjs +3 -3
  96. package/fesm2022/fundamental-ngx-core-mobile-mode.mjs.map +1 -1
  97. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs +22 -22
  98. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  99. package/fesm2022/fundamental-ngx-core-multi-input.mjs +15 -15
  100. package/fesm2022/fundamental-ngx-core-multi-input.mjs.map +1 -1
  101. package/fesm2022/fundamental-ngx-core-nested-list.mjs +40 -40
  102. package/fesm2022/fundamental-ngx-core-nested-list.mjs.map +1 -1
  103. package/fesm2022/fundamental-ngx-core-notification.mjs +88 -88
  104. package/fesm2022/fundamental-ngx-core-notification.mjs.map +1 -1
  105. package/fesm2022/fundamental-ngx-core-object-attribute.mjs +7 -7
  106. package/fesm2022/fundamental-ngx-core-object-attribute.mjs.map +1 -1
  107. package/fesm2022/fundamental-ngx-core-object-identifier.mjs +11 -11
  108. package/fesm2022/fundamental-ngx-core-object-identifier.mjs.map +1 -1
  109. package/fesm2022/fundamental-ngx-core-object-marker.mjs +7 -7
  110. package/fesm2022/fundamental-ngx-core-object-marker.mjs.map +1 -1
  111. package/fesm2022/fundamental-ngx-core-object-number.mjs +7 -7
  112. package/fesm2022/fundamental-ngx-core-object-number.mjs.map +1 -1
  113. package/fesm2022/fundamental-ngx-core-object-status.mjs +7 -7
  114. package/fesm2022/fundamental-ngx-core-object-status.mjs.map +1 -1
  115. package/fesm2022/fundamental-ngx-core-overflow-layout.mjs +31 -31
  116. package/fesm2022/fundamental-ngx-core-overflow-layout.mjs.map +1 -1
  117. package/fesm2022/fundamental-ngx-core-pagination.mjs +11 -11
  118. package/fesm2022/fundamental-ngx-core-pagination.mjs.map +1 -1
  119. package/fesm2022/fundamental-ngx-core-panel.mjs +19 -19
  120. package/fesm2022/fundamental-ngx-core-panel.mjs.map +1 -1
  121. package/fesm2022/fundamental-ngx-core-popover.mjs +42 -42
  122. package/fesm2022/fundamental-ngx-core-popover.mjs.map +1 -1
  123. package/fesm2022/fundamental-ngx-core-product-switch.mjs +13 -13
  124. package/fesm2022/fundamental-ngx-core-product-switch.mjs.map +1 -1
  125. package/fesm2022/fundamental-ngx-core-progress-indicator.mjs +7 -7
  126. package/fesm2022/fundamental-ngx-core-progress-indicator.mjs.map +1 -1
  127. package/fesm2022/fundamental-ngx-core-quick-view.mjs +37 -37
  128. package/fesm2022/fundamental-ngx-core-quick-view.mjs.map +1 -1
  129. package/fesm2022/fundamental-ngx-core-radio.mjs +7 -7
  130. package/fesm2022/fundamental-ngx-core-radio.mjs.map +1 -1
  131. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs +10 -10
  132. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs.map +1 -1
  133. package/fesm2022/fundamental-ngx-core-resizable-card-layout.mjs +10 -10
  134. package/fesm2022/fundamental-ngx-core-resizable-card-layout.mjs.map +1 -1
  135. package/fesm2022/fundamental-ngx-core-scroll-spy.mjs +7 -7
  136. package/fesm2022/fundamental-ngx-core-scroll-spy.mjs.map +1 -1
  137. package/fesm2022/fundamental-ngx-core-scrollbar.mjs +7 -7
  138. package/fesm2022/fundamental-ngx-core-scrollbar.mjs.map +1 -1
  139. package/fesm2022/fundamental-ngx-core-segmented-button.mjs +7 -7
  140. package/fesm2022/fundamental-ngx-core-segmented-button.mjs.map +1 -1
  141. package/fesm2022/fundamental-ngx-core-select.mjs +20 -20
  142. package/fesm2022/fundamental-ngx-core-select.mjs.map +1 -1
  143. package/fesm2022/fundamental-ngx-core-settings.mjs +52 -52
  144. package/fesm2022/fundamental-ngx-core-settings.mjs.map +1 -1
  145. package/fesm2022/fundamental-ngx-core-shared.mjs +3 -3
  146. package/fesm2022/fundamental-ngx-core-shared.mjs.map +1 -1
  147. package/fesm2022/fundamental-ngx-core-shellbar.mjs +88 -75
  148. package/fesm2022/fundamental-ngx-core-shellbar.mjs.map +1 -1
  149. package/fesm2022/fundamental-ngx-core-side-navigation.mjs +13 -13
  150. package/fesm2022/fundamental-ngx-core-side-navigation.mjs.map +1 -1
  151. package/fesm2022/fundamental-ngx-core-skeleton.mjs +12 -10
  152. package/fesm2022/fundamental-ngx-core-skeleton.mjs.map +1 -1
  153. package/fesm2022/fundamental-ngx-core-slider.mjs +10 -10
  154. package/fesm2022/fundamental-ngx-core-slider.mjs.map +1 -1
  155. package/fesm2022/fundamental-ngx-core-split-button.mjs +10 -10
  156. package/fesm2022/fundamental-ngx-core-split-button.mjs.map +1 -1
  157. package/fesm2022/fundamental-ngx-core-status-indicator.mjs +7 -7
  158. package/fesm2022/fundamental-ngx-core-status-indicator.mjs.map +1 -1
  159. package/fesm2022/fundamental-ngx-core-step-input.mjs +13 -9
  160. package/fesm2022/fundamental-ngx-core-step-input.mjs.map +1 -1
  161. package/fesm2022/fundamental-ngx-core-switch.mjs +7 -7
  162. package/fesm2022/fundamental-ngx-core-switch.mjs.map +1 -1
  163. package/fesm2022/fundamental-ngx-core-table.mjs +49 -49
  164. package/fesm2022/fundamental-ngx-core-table.mjs.map +1 -1
  165. package/fesm2022/fundamental-ngx-core-tabs.mjs +52 -52
  166. package/fesm2022/fundamental-ngx-core-tabs.mjs.map +1 -1
  167. package/fesm2022/fundamental-ngx-core-tests.mjs.map +1 -1
  168. package/fesm2022/fundamental-ngx-core-text.mjs +8 -8
  169. package/fesm2022/fundamental-ngx-core-text.mjs.map +1 -1
  170. package/fesm2022/fundamental-ngx-core-theming.mjs +7 -7
  171. package/fesm2022/fundamental-ngx-core-theming.mjs.map +1 -1
  172. package/fesm2022/fundamental-ngx-core-tile.mjs +94 -94
  173. package/fesm2022/fundamental-ngx-core-tile.mjs.map +1 -1
  174. package/fesm2022/fundamental-ngx-core-time-picker.mjs +8 -8
  175. package/fesm2022/fundamental-ngx-core-time-picker.mjs.map +1 -1
  176. package/fesm2022/fundamental-ngx-core-time.mjs +11 -11
  177. package/fesm2022/fundamental-ngx-core-time.mjs.map +1 -1
  178. package/fesm2022/fundamental-ngx-core-timeline.mjs +43 -43
  179. package/fesm2022/fundamental-ngx-core-timeline.mjs.map +1 -1
  180. package/fesm2022/fundamental-ngx-core-title.mjs +8 -8
  181. package/fesm2022/fundamental-ngx-core-title.mjs.map +1 -1
  182. package/fesm2022/fundamental-ngx-core-token.mjs +19 -15
  183. package/fesm2022/fundamental-ngx-core-token.mjs.map +1 -1
  184. package/fesm2022/fundamental-ngx-core-toolbar.mjs +47 -47
  185. package/fesm2022/fundamental-ngx-core-toolbar.mjs.map +1 -1
  186. package/fesm2022/fundamental-ngx-core-tree.mjs +32 -32
  187. package/fesm2022/fundamental-ngx-core-tree.mjs.map +1 -1
  188. package/fesm2022/fundamental-ngx-core-upload-collection.mjs +37 -37
  189. package/fesm2022/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  190. package/fesm2022/fundamental-ngx-core-user-menu.mjs +64 -64
  191. package/fesm2022/fundamental-ngx-core-user-menu.mjs.map +1 -1
  192. package/fesm2022/fundamental-ngx-core-vertical-navigation.mjs +13 -13
  193. package/fesm2022/fundamental-ngx-core-vertical-navigation.mjs.map +1 -1
  194. package/fesm2022/fundamental-ngx-core-wizard.mjs +28 -28
  195. package/fesm2022/fundamental-ngx-core-wizard.mjs.map +1 -1
  196. package/fesm2022/fundamental-ngx-core.mjs +4 -4
  197. package/fesm2022/fundamental-ngx-core.mjs.map +1 -1
  198. package/package.json +113 -113
  199. package/{types/fundamental-ngx-core-shellbar.d.ts → shellbar/index.d.ts} +21 -13
  200. package/{types/fundamental-ngx-core-toolbar.d.ts → toolbar/index.d.ts} +7 -8
  201. /package/{types/fundamental-ngx-core-action-bar.d.ts → action-bar/index.d.ts} +0 -0
  202. /package/{types/fundamental-ngx-core-action-sheet.d.ts → action-sheet/index.d.ts} +0 -0
  203. /package/{types/fundamental-ngx-core-avatar.d.ts → avatar/index.d.ts} +0 -0
  204. /package/{types/fundamental-ngx-core-avatar-group.d.ts → avatar-group/index.d.ts} +0 -0
  205. /package/{types/fundamental-ngx-core-avatar-group-legacy.d.ts → avatar-group-legacy/index.d.ts} +0 -0
  206. /package/{types/fundamental-ngx-core-bar.d.ts → bar/index.d.ts} +0 -0
  207. /package/{types/fundamental-ngx-core-breadcrumb.d.ts → breadcrumb/index.d.ts} +0 -0
  208. /package/{types/fundamental-ngx-core-busy-indicator.d.ts → busy-indicator/index.d.ts} +0 -0
  209. /package/{types/fundamental-ngx-core-button.d.ts → button/index.d.ts} +0 -0
  210. /package/{types/fundamental-ngx-core-calendar.d.ts → calendar/index.d.ts} +0 -0
  211. /package/{types/fundamental-ngx-core-card.d.ts → card/index.d.ts} +0 -0
  212. /package/{types/fundamental-ngx-core-carousel.d.ts → carousel/index.d.ts} +0 -0
  213. /package/{types/fundamental-ngx-core-checkbox.d.ts → checkbox/index.d.ts} +0 -0
  214. /package/{types/fundamental-ngx-core-combobox.d.ts → combobox/index.d.ts} +0 -0
  215. /package/{types/fundamental-ngx-core-content-density.d.ts → content-density/index.d.ts} +0 -0
  216. /package/{types/fundamental-ngx-core-date-picker.d.ts → date-picker/index.d.ts} +0 -0
  217. /package/{types/fundamental-ngx-core-datetime.d.ts → datetime/index.d.ts} +0 -0
  218. /package/{types/fundamental-ngx-core-datetime-picker.d.ts → datetime-picker/index.d.ts} +0 -0
  219. /package/{types/fundamental-ngx-core-dialog.d.ts → dialog/index.d.ts} +0 -0
  220. /package/{types/fundamental-ngx-core-dynamic-page.d.ts → dynamic-page/index.d.ts} +0 -0
  221. /package/{types/fundamental-ngx-core-dynamic-side-content.d.ts → dynamic-side-content/index.d.ts} +0 -0
  222. /package/{types/fundamental-ngx-core-facets.d.ts → facets/index.d.ts} +0 -0
  223. /package/{types/fundamental-ngx-core-feed-input.d.ts → feed-input/index.d.ts} +0 -0
  224. /package/{types/fundamental-ngx-core-feed-list-item.d.ts → feed-list-item/index.d.ts} +0 -0
  225. /package/{types/fundamental-ngx-core-file-uploader.d.ts → file-uploader/index.d.ts} +0 -0
  226. /package/{types/fundamental-ngx-core-fixed-card-layout.d.ts → fixed-card-layout/index.d.ts} +0 -0
  227. /package/{types/fundamental-ngx-core-flexible-column-layout.d.ts → flexible-column-layout/index.d.ts} +0 -0
  228. /package/{types/fundamental-ngx-core-form.d.ts → form/index.d.ts} +0 -0
  229. /package/{types/fundamental-ngx-core-formatted-text.d.ts → formatted-text/index.d.ts} +0 -0
  230. /package/{types/fundamental-ngx-core-generic-tag.d.ts → generic-tag/index.d.ts} +0 -0
  231. /package/{types/fundamental-ngx-core-grid-list.d.ts → grid-list/index.d.ts} +0 -0
  232. /package/{types/fundamental-ngx-core-icon.d.ts → icon/index.d.ts} +0 -0
  233. /package/{types/fundamental-ngx-core-illustrated-message.d.ts → illustrated-message/index.d.ts} +0 -0
  234. /package/{types/fundamental-ngx-core.d.ts → index.d.ts} +0 -0
  235. /package/{types/fundamental-ngx-core-infinite-scroll.d.ts → infinite-scroll/index.d.ts} +0 -0
  236. /package/{types/fundamental-ngx-core-info-label.d.ts → info-label/index.d.ts} +0 -0
  237. /package/{types/fundamental-ngx-core-inline-help.d.ts → inline-help/index.d.ts} +0 -0
  238. /package/{types/fundamental-ngx-core-input-group.d.ts → input-group/index.d.ts} +0 -0
  239. /package/{types/fundamental-ngx-core-layout-grid.d.ts → layout-grid/index.d.ts} +0 -0
  240. /package/{types/fundamental-ngx-core-layout-panel.d.ts → layout-panel/index.d.ts} +0 -0
  241. /package/{types/fundamental-ngx-core-link.d.ts → link/index.d.ts} +0 -0
  242. /package/{types/fundamental-ngx-core-list.d.ts → list/index.d.ts} +0 -0
  243. /package/{types/fundamental-ngx-core-menu.d.ts → menu/index.d.ts} +0 -0
  244. /package/{types/fundamental-ngx-core-message-box.d.ts → message-box/index.d.ts} +0 -0
  245. /package/{types/fundamental-ngx-core-message-page.d.ts → message-page/index.d.ts} +0 -0
  246. /package/{types/fundamental-ngx-core-message-strip.d.ts → message-strip/index.d.ts} +0 -0
  247. /package/{types/fundamental-ngx-core-message-toast.d.ts → message-toast/index.d.ts} +0 -0
  248. /package/{types/fundamental-ngx-core-micro-process-flow.d.ts → micro-process-flow/index.d.ts} +0 -0
  249. /package/{types/fundamental-ngx-core-mobile-mode.d.ts → mobile-mode/index.d.ts} +0 -0
  250. /package/{types/fundamental-ngx-core-multi-combobox.d.ts → multi-combobox/index.d.ts} +0 -0
  251. /package/{types/fundamental-ngx-core-multi-input.d.ts → multi-input/index.d.ts} +0 -0
  252. /package/{types/fundamental-ngx-core-nested-list.d.ts → nested-list/index.d.ts} +0 -0
  253. /package/{types/fundamental-ngx-core-notification.d.ts → notification/index.d.ts} +0 -0
  254. /package/{types/fundamental-ngx-core-object-attribute.d.ts → object-attribute/index.d.ts} +0 -0
  255. /package/{types/fundamental-ngx-core-object-identifier.d.ts → object-identifier/index.d.ts} +0 -0
  256. /package/{types/fundamental-ngx-core-object-marker.d.ts → object-marker/index.d.ts} +0 -0
  257. /package/{types/fundamental-ngx-core-object-number.d.ts → object-number/index.d.ts} +0 -0
  258. /package/{types/fundamental-ngx-core-object-status.d.ts → object-status/index.d.ts} +0 -0
  259. /package/{types/fundamental-ngx-core-overflow-layout.d.ts → overflow-layout/index.d.ts} +0 -0
  260. /package/{types/fundamental-ngx-core-pagination.d.ts → pagination/index.d.ts} +0 -0
  261. /package/{types/fundamental-ngx-core-panel.d.ts → panel/index.d.ts} +0 -0
  262. /package/{types/fundamental-ngx-core-popover.d.ts → popover/index.d.ts} +0 -0
  263. /package/{types/fundamental-ngx-core-product-switch.d.ts → product-switch/index.d.ts} +0 -0
  264. /package/{types/fundamental-ngx-core-progress-indicator.d.ts → progress-indicator/index.d.ts} +0 -0
  265. /package/{types/fundamental-ngx-core-quick-view.d.ts → quick-view/index.d.ts} +0 -0
  266. /package/{types/fundamental-ngx-core-radio.d.ts → radio/index.d.ts} +0 -0
  267. /package/{types/fundamental-ngx-core-rating-indicator.d.ts → rating-indicator/index.d.ts} +0 -0
  268. /package/{types/fundamental-ngx-core-resizable-card-layout.d.ts → resizable-card-layout/index.d.ts} +0 -0
  269. /package/{types/fundamental-ngx-core-scroll-spy.d.ts → scroll-spy/index.d.ts} +0 -0
  270. /package/{types/fundamental-ngx-core-scrollbar.d.ts → scrollbar/index.d.ts} +0 -0
  271. /package/{types/fundamental-ngx-core-segmented-button.d.ts → segmented-button/index.d.ts} +0 -0
  272. /package/{types/fundamental-ngx-core-select.d.ts → select/index.d.ts} +0 -0
  273. /package/{types/fundamental-ngx-core-settings.d.ts → settings/index.d.ts} +0 -0
  274. /package/{types/fundamental-ngx-core-shared.d.ts → shared/index.d.ts} +0 -0
  275. /package/{types/fundamental-ngx-core-side-navigation.d.ts → side-navigation/index.d.ts} +0 -0
  276. /package/{types/fundamental-ngx-core-skeleton.d.ts → skeleton/index.d.ts} +0 -0
  277. /package/{types/fundamental-ngx-core-slider.d.ts → slider/index.d.ts} +0 -0
  278. /package/{types/fundamental-ngx-core-split-button.d.ts → split-button/index.d.ts} +0 -0
  279. /package/{types/fundamental-ngx-core-status-indicator.d.ts → status-indicator/index.d.ts} +0 -0
  280. /package/{types/fundamental-ngx-core-step-input.d.ts → step-input/index.d.ts} +0 -0
  281. /package/{types/fundamental-ngx-core-switch.d.ts → switch/index.d.ts} +0 -0
  282. /package/{types/fundamental-ngx-core-table.d.ts → table/index.d.ts} +0 -0
  283. /package/{types/fundamental-ngx-core-tabs.d.ts → tabs/index.d.ts} +0 -0
  284. /package/{types/fundamental-ngx-core-tests.d.ts → tests/index.d.ts} +0 -0
  285. /package/{types/fundamental-ngx-core-text.d.ts → text/index.d.ts} +0 -0
  286. /package/{types/fundamental-ngx-core-theming.d.ts → theming/index.d.ts} +0 -0
  287. /package/{types/fundamental-ngx-core-tile.d.ts → tile/index.d.ts} +0 -0
  288. /package/{types/fundamental-ngx-core-time.d.ts → time/index.d.ts} +0 -0
  289. /package/{types/fundamental-ngx-core-time-picker.d.ts → time-picker/index.d.ts} +0 -0
  290. /package/{types/fundamental-ngx-core-timeline.d.ts → timeline/index.d.ts} +0 -0
  291. /package/{types/fundamental-ngx-core-title.d.ts → title/index.d.ts} +0 -0
  292. /package/{types/fundamental-ngx-core-token.d.ts → token/index.d.ts} +0 -0
  293. /package/{types/fundamental-ngx-core-tree.d.ts → tree/index.d.ts} +0 -0
  294. /package/{types/fundamental-ngx-core-upload-collection.d.ts → upload-collection/index.d.ts} +0 -0
  295. /package/{types/fundamental-ngx-core-user-menu.d.ts → user-menu/index.d.ts} +0 -0
  296. /package/{types/fundamental-ngx-core-vertical-navigation.d.ts → vertical-navigation/index.d.ts} +0 -0
  297. /package/{types/fundamental-ngx-core-wizard.d.ts → wizard/index.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"fundamental-ngx-core-resizable-card-layout.mjs","sources":["../../../../libs/core/resizable-card-layout/resizable-card-layout/resizable-card-item/resizable-card-item.component.ts","../../../../libs/core/resizable-card-layout/resizable-card-layout/resizable-card-item/resizable-card-item.component.html","../../../../libs/core/resizable-card-layout/resizable-card-layout/resizable-card-layout.component.ts","../../../../libs/core/resizable-card-layout/resizable-card-layout/resizable-card-layout.component.html","../../../../libs/core/resizable-card-layout/resizable-card-layout.module.ts","../../../../libs/core/resizable-card-layout/fundamental-ngx-core-resizable-card-layout.ts"],"sourcesContent":["import { FocusableOption } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Input,\n OnDestroy,\n Optional,\n Output,\n ViewEncapsulation\n} from '@angular/core';\nimport { Nullable, RtlService } from '@fundamental-ngx/cdk/utils';\nimport { Subscription } from 'rxjs';\n\nexport type ResizeDirection = 'vertical' | 'horizontal' | 'both';\n\n// Card resizes in step of fixed values. values are in pixel\nexport const horizontalResizeStep = 320;\n\n// vertical resize step\nexport const verticalResizeStep = 16;\n\n// gap of 1rem between the cards\nexport const gap = 16;\n\n// threshold offset for horizontal resizing.\nexport const horizontalResizeOffset = 160;\n\n// threshold offset for vertical resizing.\nexport const verticalResizeOffset = 8;\n\n// state of card. Increasing width, no change or decreasing width.\nexport type CardState = 1 | 0 | -1;\n\n// card is given numeric value, on which sorting of cards is done\nlet cardRank = 1;\nlet cardUniqueId = 0;\n\n@Component({\n selector: 'fd-resizable-card-item',\n templateUrl: 'resizable-card-item.component.html',\n styleUrl: './resizable-card-item.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet]\n})\nexport class ResizableCardItemComponent implements FocusableOption, OnDestroy {\n /** Card properties from the config */\n @Input()\n set config(config: ResizableCardItemConfig) {\n this._config = config;\n this._initialSetup();\n this._cd.detectChanges();\n }\n get config(): ResizableCardItemConfig {\n return this._config;\n }\n\n /** set uinque id for the card */\n @Input()\n itemId = `fd-card-item-${cardUniqueId++}`;\n\n /** set title of the card */\n @Input()\n title: string;\n\n /**\n * Serial order of card.\n * cards are sorted based on ranks before displaying layout.\n * card with lower rank will be displayed first in layout than the card with higher rank.\n */\n @Input()\n set rank(rankValue: number) {\n // determine max value between user given value and default value\n this._rank = rankValue ? rankValue : cardRank++;\n if (rankValue > cardRank) {\n cardRank = rankValue;\n }\n }\n get rank(): number {\n return this._rank;\n }\n\n /**\n * Number of column span card width takes.\n * It will be in step of 20rem.\n */\n @Input()\n set cardWidthColSpan(colSpan: number) {\n this._cardWidthColSpan = colSpan;\n this._setCardWidth();\n }\n get cardWidthColSpan(): number {\n return this._cardWidthColSpan;\n }\n\n /**\n * Number of row span, card height takes.\n * It will be in the step of 1rem.\n */\n @Input()\n set cardHeightRowSpan(rowSpan: number) {\n this._cardHeightRowSpan = rowSpan;\n this._setCardHeight();\n }\n get cardHeightRowSpan(): number {\n return this._cardHeightRowSpan;\n }\n\n /**\n * Number of row span card mini header height takes.\n * Mini Header: The smallest representation of the card is the header.\n * The card can be collapsed to only its header height.\n */\n @Input()\n set cardMiniHeaderRowSpan(rowSpan: number) {\n this._cardMiniHeaderRowSpan = rowSpan;\n this._setCardMiniHeaderHeight();\n }\n get cardMiniHeaderRowSpan(): number {\n return this._cardMiniHeaderRowSpan;\n }\n\n /**\n * Number of row span card mini content height takes.\n * Mini Content: The minimum height for the card content depends on the card type,\n * and must be as high as the smallest representation of the content.\n */\n @Input()\n set cardMiniContentRowSpan(rowSpan: number) {\n this._cardMiniContentRowSpan = rowSpan;\n this._setCardMiniContentHeight();\n }\n get cardMiniContentRowSpan(): number {\n return this._cardMiniContentRowSpan ?? 0;\n }\n\n /** Card can be set to resizable=false, to restrict card resize */\n @Input()\n resizable = true;\n\n /** Set left position for the card */\n @Input()\n @HostBinding('style.left.px')\n left: Nullable<number>;\n\n /** Set right position for the card */\n @Input()\n @HostBinding('style.right.px')\n right: Nullable<number>;\n\n /** Set top position for the card*/\n @Input()\n @HostBinding('style.top.px')\n top = 0;\n\n /** @hidden while resizing this value will change to a greater value */\n @HostBinding('style.z-index')\n zIndex = 0;\n\n /** @hidden */\n @HostBinding('style.position')\n position = 'absolute';\n\n /** @hidden transition animation when layout re-draws */\n @HostBinding('class.fd-resizable-card-layout__draw-transition')\n reDrawAnimation = true;\n\n /** Emits when card is still resizing */\n @Output()\n resizing: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** Emits when card resize is completed */\n @Output()\n resized: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** Emits when card height is reduced to show only header */\n @Output()\n miniHeaderReached: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** Emits when minimum height of card content area is reached */\n @Output()\n miniContentReached: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** show corner resize icon on hover over card */\n showingResizeIcon = false;\n\n /** show border when card is resizing */\n showBorder = false;\n\n /** starting column position of card. starts with 0 */\n startingColumnPosition: number;\n\n /** card width in px. Default value to 20rem */\n cardWidth: number = horizontalResizeStep;\n\n /** card height in px */\n cardHeight: number;\n\n /** Mini-header height of card */\n cardMiniHeaderHeight: number;\n\n /** Mini-content height of card to display minimum valid content */\n cardMiniContentHeight: number;\n\n /** Outer resize indication border width for the card */\n resizeIndicationBorderWidth = 0;\n\n /**\n * Denotes if card is currently expanding or contracting horizontally.\n * +1 denotes increasing, -1 denotes decreasing and 0 denotes card-state has not changed horizontally.\n */\n cardState: CardState = 0;\n\n /** Change in rank from previous value*/\n prevRank = 0;\n\n /** @hidden Default width of card is 20rem ie. 1 column */\n private _cardWidthColSpan = 1;\n\n /** @hidden */\n private _cardHeightRowSpan: number;\n\n /** @hidden helps in vertical step change event emit */\n private _prevCardHeightRowSpan: number;\n\n /** @hidden */\n private _cardMiniHeaderRowSpan: number;\n\n /** @hidden */\n private _cardMiniContentRowSpan?: number;\n\n /** @hidden config values for card */\n private _config: ResizableCardItemConfig;\n\n /** @hidden previous cursor x position */\n private _prevX: number;\n\n /** @hidden previous cursor y position */\n private _prevY: number;\n\n /** @hidden */\n private _prevCardWidth: number;\n\n /** @hidden */\n private _prevCardHeight: number;\n\n /** @hidden flag to control resize */\n private _resize = false;\n\n /** @hidden */\n private _resizeDirection: ResizeDirection;\n\n /** @hidden */\n private _maxColumn: number;\n\n /**\n * @hidden stores original width span of card.\n * It may reduce on small screen, so have to restore using this.\n */\n private _originalCardWidthSpan = 0;\n\n /** @hidden */\n private _rank: number;\n\n /** @hidden */\n private _subscriptions = new Subscription();\n\n /** @hidden */\n constructor(\n private readonly _cd: ChangeDetectorRef,\n public readonly elementRef: ElementRef,\n @Optional() private readonly _rtlService: RtlService\n ) {}\n\n /**\n * @hidden When mouse moves to resize the card.\n * using window:mousemove so, resize will happen smoothly\n * @param event {MouseEvent}\n */\n @HostListener('window:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n event.preventDefault();\n if (!this.resizable) {\n return;\n }\n\n // saves from un-necessary resize\n if (!this._resize) {\n return;\n }\n\n if (!this.showBorder) {\n this.showBorder = true;\n }\n\n // resizing card will go over other cards\n this.zIndex = 1;\n\n const { clientX, clientY } = event;\n switch (this._resizeDirection) {\n case 'both':\n this._horizontalResizing(clientX);\n this._verticalResizing(clientY);\n break;\n case 'horizontal':\n this._horizontalResizing(clientX);\n break;\n case 'vertical':\n this._verticalResizing(clientY);\n break;\n default:\n this._horizontalResizing(clientX);\n this._verticalResizing(clientY);\n }\n\n const cardWidthColSpan = Math.floor(this.cardWidth / horizontalResizeStep);\n const cardWidthWithColumn = cardWidthColSpan * horizontalResizeStep + cardWidthColSpan * gap;\n\n const horizontalResizeThresholdReached = this.cardWidth - cardWidthWithColumn > horizontalResizeOffset;\n\n if (clientX > this._prevX) {\n // increasing width\n this.cardState = 1;\n\n if (horizontalResizeThresholdReached) {\n const futureCardWidth = (cardWidthColSpan + 1) * horizontalResizeStep + cardWidthColSpan * gap;\n this.resizeIndicationBorderWidth = futureCardWidth - this.cardWidth;\n } else {\n this.resizeIndicationBorderWidth = 0;\n }\n } else if (clientX < this._prevX) {\n // decreasing width\n this.cardState = -1;\n if (horizontalResizeThresholdReached) {\n const futureCardWidth = (cardWidthColSpan + 1) * horizontalResizeStep + cardWidthColSpan * gap;\n this.resizeIndicationBorderWidth = futureCardWidth - this.cardWidth;\n } else {\n this.resizeIndicationBorderWidth = 0;\n }\n }\n\n this._prevX = clientX;\n this._prevY = clientY;\n this._cd.detectChanges();\n\n // Emits resizing event.\n this.resizing.emit(this.getResizedEventObject());\n }\n\n /**\n * when resizing of card stops\n */\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (!this.resizable) {\n return;\n }\n // if card was not resizing\n if (!this._resize) {\n return;\n }\n\n // increase/decrease width of card in order of 20rem\n if (Math.abs(this.cardWidth - this._prevCardWidth) > 0) {\n this._horizontalStepResizing();\n }\n\n // increase/decrease height of card in order of 1rem\n if (Math.abs(this.cardHeight - this._prevCardHeight) > 0) {\n this._verticalStepResizing();\n }\n\n this._stopResizing();\n this._cd.markForCheck();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /**\n * When resize handler is pressed and resizing may start.\n * @param event {MouseEvent}\n * @param resizeDirection which handler is pressed to resize\n */\n onMouseDown(event: MouseEvent, resizeDirection: ResizeDirection): void {\n event.preventDefault();\n if (!this.resizable) {\n return;\n }\n\n this.showingResizeIcon = true;\n this._resize = true;\n this._prevX = event.clientX;\n this._prevY = event.clientY;\n this._prevCardWidth = this.cardWidth;\n this._prevCardHeight = this.cardHeight;\n this._resizeDirection = resizeDirection;\n }\n\n /** Sets focus on the element */\n focus(): void {\n const header = this.elementRef.nativeElement.querySelector('.fd-card__header');\n header?.focus();\n }\n\n /** Shows resize icon */\n showResizeIcon(): void {\n if (!this.resizable) {\n return;\n }\n this.showingResizeIcon = true;\n }\n\n /** Hides resize icon */\n hideResizeIcon(): void {\n if (!this._resize) {\n this.showingResizeIcon = false;\n }\n }\n\n /** Returns max width for card, based on layout size passed */\n getMaxColSpan(layoutSize: string): number {\n switch (layoutSize) {\n case 'sm':\n this._maxColumn = 1;\n break;\n case 'md':\n this._maxColumn = 2;\n break;\n case 'lg':\n this._maxColumn = 3;\n break;\n case 'xl':\n this._maxColumn = 4;\n break;\n default:\n this._maxColumn = 1;\n }\n return this._maxColumn;\n }\n\n /** Update card width if it exceeds column span based on layout */\n verifyUpdateCardWidth(layoutSize: string): void {\n const widthColSpan = this._config?.cardWidthColSpan || this.cardWidthColSpan;\n // storing original width of card.\n // used to restore width on window resize from small to large\n this._originalCardWidthSpan = !this._originalCardWidthSpan ? widthColSpan : this._originalCardWidthSpan;\n this._maxColumn = this.getMaxColSpan(layoutSize);\n if (widthColSpan > this._maxColumn) {\n this.cardWidthColSpan = this._maxColumn;\n this._setCardWidth();\n // Emits resized event.\n this.resized.emit(this.getResizedEventObject());\n } else {\n // keep card width minimum, so it can fit in screen.\n this.cardWidthColSpan = Math.min(this._maxColumn, this._originalCardWidthSpan);\n this._setCardWidth();\n // Emits resized event.\n this.resized.emit(this.getResizedEventObject());\n }\n }\n\n /** Returns ResizedEvent object to emit. */\n getResizedEventObject(): ResizedEvent {\n const newCardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n const newCardWidthColSpan = Math.floor(this.cardWidth / horizontalResizeStep);\n const newCardWidth = newCardWidthColSpan * horizontalResizeStep + newCardWidthColSpan * gap;\n\n const horizontalResizeThresholdReached = this.cardWidth - newCardWidth > horizontalResizeOffset;\n const newCardColSpan = horizontalResizeThresholdReached ? newCardWidthColSpan + 1 : newCardWidthColSpan;\n return new ResizedEvent(\n this,\n this._prevCardWidth,\n this._prevCardHeight,\n this.cardWidth,\n this.cardHeight,\n this._cardWidthColSpan,\n this._cardHeightRowSpan,\n newCardColSpan,\n newCardHeightRowSpan\n );\n }\n\n /** @hidden Return previous height row span of the card */\n get previousCardHeightRowSpan(): number {\n return this._prevCardHeightRowSpan;\n }\n\n /** @hidden Set card properties using config received */\n private _initialSetup(): void {\n this.cardWidthColSpan = this._config?.cardWidthColSpan || this.cardWidthColSpan;\n this.cardHeightRowSpan = this._config?.cardHeightRowSpan || this.cardHeightRowSpan;\n this.title = this._config?.title || this.title;\n this.rank = this._config?.rank || this.rank;\n this.cardMiniHeaderRowSpan = this._config?.cardMiniHeaderRowSpan || this.cardMiniHeaderRowSpan;\n this.cardMiniContentRowSpan = this._config?.cardMiniContentRowSpan || this.cardMiniContentRowSpan;\n this.resizable = this._config.resizable || this.resizable;\n }\n\n /** @hidden Returns true when resize offset is crossed */\n private _horizontalResizeWithOffset(): void {\n // positive value indicates that width has increased\n const widthIncrement = this.cardWidth - this._prevCardWidth;\n const cardSpan = Math.floor(this.cardWidth / horizontalResizeStep);\n const cardSpanFraction = this.cardWidth % horizontalResizeStep;\n\n // when width increases\n if (widthIncrement > 0) {\n if (widthIncrement < horizontalResizeOffset + gap) {\n // widthIncrement is less than offset, do not increase width\n this.cardWidth = this._prevCardWidth;\n } else {\n // check value of cardSpanFraction, including gaps in cards\n const isCardSpanFractionCrossingOffset =\n cardSpanFraction - (cardSpan - 1) * gap > horizontalResizeOffset;\n this.cardWidth = isCardSpanFractionCrossingOffset\n ? (cardSpan + 1) * horizontalResizeStep\n : cardSpan * horizontalResizeStep;\n }\n } else {\n // when width decreases\n if (Math.abs(widthIncrement) < horizontalResizeOffset) {\n // widthIncrement is less than offset, do not decrease width\n this.cardWidth = this._prevCardWidth;\n } else {\n // check value of cardSpanFraction, including gaps in cards\n const isCardSpanFractionCrossingOffset = cardSpanFraction - cardSpan * gap > horizontalResizeOffset;\n this.cardWidth = isCardSpanFractionCrossingOffset\n ? (cardSpan + 1) * horizontalResizeStep\n : cardSpan * horizontalResizeStep;\n }\n }\n }\n\n /**\n * @hidden make horizontal resize only on step of 20rem\n */\n private _horizontalStepResizing(): void {\n this._horizontalResizeWithOffset();\n\n // Add inner gap in cardWidth if width is more than 1 column\n if (this.cardWidth > horizontalResizeStep) {\n this.cardWidth = this.cardWidth + (this.cardWidth / horizontalResizeStep - 1) * gap;\n }\n this.cardWidthColSpan = Math.floor(this.cardWidth / horizontalResizeStep);\n }\n\n /**\n * @hidden make vertical resize only on step of 1rem\n */\n private _verticalStepResizing(): void {\n // positive value indicates that height has increased\n const cardHeightSpan = Math.floor(this.cardHeight / verticalResizeStep);\n const cardSpanFraction = this.cardHeight % verticalResizeStep;\n this.cardHeight =\n cardSpanFraction > verticalResizeOffset\n ? (cardHeightSpan + 1) * verticalResizeStep\n : cardHeightSpan * verticalResizeStep;\n\n this.cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n }\n\n /**\n * @hidden Resize card horizontally by checking boundary condition\n * @param xPosition current x-position of cursor\n */\n private _horizontalResizing(xPosition: number): void {\n const difference = this._prevX - xPosition;\n this.cardWidth = this._rtlService?.rtlSignal() ? this.cardWidth + difference : this.cardWidth - difference;\n\n const totalIndentation = (this._maxColumn - 1) * gap;\n const maxCardWidtWithoutIndentation = this._maxColumn * horizontalResizeStep;\n\n const maxCardWidth = this._rtlService?.rtlSignal()\n ? maxCardWidtWithoutIndentation - totalIndentation\n : maxCardWidtWithoutIndentation + totalIndentation;\n\n if (this.cardWidth > maxCardWidth) {\n this.cardWidth = maxCardWidth;\n } else if (this.cardWidth < horizontalResizeStep) {\n this.cardWidth = horizontalResizeStep;\n }\n }\n\n /**\n * @hidden Resize card vertically.\n * takes care of mini-header height and mini-content height\n * @param yPosition current y-position of cursor\n */\n private _verticalResizing(yPosition: number): void {\n let reachingMiniHeader = false;\n\n if (this.cardHeight === this.cardMiniHeaderHeight) {\n // if card height is already at mini-header height\n if (this._prevY - yPosition > 0) {\n // decreasing height\n // if miniHeader height reached, stop resizing\n this.cardHeight = this.cardMiniHeaderHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n } else {\n // increasing height\n this.cardHeight = this.cardMiniHeaderHeight + this.cardMiniContentHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n this._stopResizing();\n this.miniContentReached.emit(this.getResizedEventObject());\n }\n } else if (this.cardHeight < this.cardMiniContentHeight + this.cardMiniHeaderHeight) {\n // if card height is between mini-header and mini-content\n if (this._prevY - yPosition < 0) {\n this.cardHeight = this.cardMiniHeaderHeight + this.cardMiniContentHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n this._stopResizing();\n this.miniContentReached.emit(this.getResizedEventObject());\n }\n } else if (\n this.cardHeight === this.cardMiniContentHeight + this.cardMiniHeaderHeight &&\n this._prevY - yPosition > 0\n ) {\n // decreasing height\n // height decreasing after reaching mini-content. this needs to differentiate\n // from height decreasing and reaching to mini-content.\n reachingMiniHeader = true;\n this.cardHeight = this.cardMiniHeaderHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n // miniHeader height reached, stop resizing\n this._stopResizing();\n this.miniHeaderReached.emit(this.getResizedEventObject());\n } else {\n this.cardHeight = this.cardHeight - (this._prevY - yPosition);\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n }\n\n // stop resizing on miniContent height\n if (\n this.cardHeight <= this.cardMiniContentHeight + this.cardMiniHeaderHeight &&\n this._prevY - yPosition > 0 &&\n !reachingMiniHeader\n ) {\n this.cardHeight = this.cardMiniContentHeight + this.cardMiniHeaderHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n this.miniContentReached.emit(this.getResizedEventObject());\n this._stopResizing();\n }\n\n // while corner resize, width might have increased and reached to mini-content height.\n // so, on mini-content resize will stop, but have to do step resizing for vertical and horizontal.\n if (!this._resize) {\n // increase/decrease width of card in order of 20rem\n if (Math.abs(this.cardWidth - this._prevCardWidth) > 0) {\n this._horizontalStepResizing();\n }\n\n // increase/decrease height of card in order of 1rem\n if (Math.abs(this.cardHeight - this._prevCardHeight) > 0) {\n this._verticalStepResizing();\n }\n }\n }\n\n /** @hidden reset involved variables while resizing */\n private _stopResizing(): void {\n if (this._resize) {\n this.cardState = 0;\n this.resizeIndicationBorderWidth = 0;\n this._resize = false;\n this.zIndex = 0;\n this.showBorder = false;\n this.resized.emit(this.getResizedEventObject());\n }\n }\n\n /** @hidden Returns cardWidth based on card column span */\n private _setCardWidth(): void {\n this.cardWidth = this._cardWidthColSpan * horizontalResizeStep + (this._cardWidthColSpan - 1) * gap;\n this._cd.markForCheck();\n }\n\n /** @hidden Returns cardHeight based on card row span */\n private _setCardHeight(): void {\n this.cardHeight = this._cardHeightRowSpan * verticalResizeStep;\n this._cd.markForCheck();\n }\n\n /** @hidden Returns card mini header height */\n private _setCardMiniHeaderHeight(): void {\n this.cardMiniHeaderHeight = this._cardMiniHeaderRowSpan * verticalResizeStep;\n this._cd.markForCheck();\n }\n\n /** @hidden Returns card mini content height */\n private _setCardMiniContentHeight(): void {\n this.cardMiniContentHeight = this.cardMiniContentRowSpan * verticalResizeStep;\n this._cd.markForCheck();\n }\n}\n\n/** Config interface for card properties */\nexport interface ResizableCardItemConfig {\n title?: string;\n rank?: number;\n cardWidthColSpan?: number;\n cardHeightRowSpan?: number;\n cardMiniHeaderRowSpan?: number;\n cardMiniContentRowSpan?: number;\n resizable?: boolean;\n}\n\n/** Object to emit on resize complete */\nexport class ResizedEvent {\n /**\n * Object to emit on resize complete\n * @param card\n * @param prevCardWidth Previous card width\n * @param prevCardHeight Previous card height\n * @param cardWidth Current card width\n * @param cardHeight Current card height\n * @param cardWidthColSpan Current card width column span\n * @param cardHeightRowSpan Current card height row span\n * @param newCardWidthColSpan New card width column span\n * @param newCardHeightRowSpan New card height row span\n */\n constructor(\n public card: ResizableCardItemComponent,\n public prevCardWidth: number,\n public prevCardHeight: number,\n public cardWidth: number,\n public cardHeight: number,\n public cardWidthColSpan: number,\n public cardHeightRowSpan: number,\n public newCardWidthColSpan: number,\n public newCardHeightRowSpan: number\n ) {}\n}\n","<div\n class=\"fd-resizable-card-layout__item\"\n [class.fd-resizable-card-layout__indication-border]=\"showBorder\"\n #resizeCard\n>\n <div\n class=\"fd-resizable-card-layout__item--border-display fd-resizable-card-layout__item--resize-transition\"\n [style.width.px]=\"cardWidth\"\n [style.height.px]=\"cardHeight\"\n (mouseenter)=\"showResizeIcon()\"\n (mouseleave)=\"hideResizeIcon()\"\n >\n <div class=\"fd-resizable-card-layout__card\">\n <ng-content></ng-content>\n @if (showingResizeIcon) {\n <div class=\"fd-resizable-card-layout__icon-wrapper\" role=\"presentation\" aria-hidden=\"true\">\n <div\n class=\"fd-resizable-card-layout__icon\"\n #cornerHandle\n (mousedown)=\"onMouseDown($event, 'both')\"\n ></div>\n </div>\n }\n </div>\n @if (resizable) {\n <ng-template [ngTemplateOutlet]=\"verticalHandleTemplate\"></ng-template>\n <ng-template [ngTemplateOutlet]=\"horizontalHandleTemplate\"></ng-template>\n }\n </div>\n <div\n class=\"fd-resizable-card-layout__item--resize-transition\"\n [style.width.px]=\"resizeIndicationBorderWidth\"\n [style.height.px]=\"cardHeight\"\n ></div>\n</div>\n<ng-template #verticalHandleTemplate>\n <div\n #verticalHandle\n class=\"fd-resizable-card-layout__resize--vertical\"\n (mousedown)=\"onMouseDown($event, 'horizontal')\"\n ></div>\n</ng-template>\n<ng-template #horizontalHandleTemplate>\n <div\n #horizontalHandle\n class=\"fd-resizable-card-layout__resize--horizontal\"\n (mousedown)=\"onMouseDown($event, 'vertical')\"\n ></div>\n</ng-template>\n","import { FocusKeyManager } from '@angular/cdk/a11y';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n DestroyRef,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n ViewEncapsulation,\n computed,\n inject\n} from '@angular/core';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RtlService } from '@fundamental-ngx/cdk/utils';\nimport {\n ResizableCardItemComponent,\n ResizableCardItemConfig,\n ResizedEvent,\n gap,\n horizontalResizeOffset,\n horizontalResizeStep,\n verticalResizeStep\n} from './resizable-card-item/resizable-card-item.component';\n\nexport type LayoutSize = 'sm' | 'md' | 'lg' | 'xl';\nexport type ResizableCardLayoutConfig = Array<ResizableCardItemConfig>;\n\n@Component({\n selector: 'fd-resizable-card-layout',\n templateUrl: 'resizable-card-layout.component.html',\n styleUrl: './resizable-card-layout.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true\n})\nexport class ResizableCardLayoutComponent implements OnInit, AfterViewInit, AfterContentInit, OnDestroy {\n /** Object for setting each card property */\n @Input()\n layoutConfig: ResizableCardLayoutConfig;\n\n /** Emits when card resize is reached to one new step in horizontal or vertical direction */\n @Output()\n stepChange: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** Emits when card is still resizing */\n @Output()\n resizing: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** Emits when card resize is completed */\n @Output()\n resized: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** Emits when card height is reduced to show only header */\n @Output()\n miniHeaderReached: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** Emits when minimum height of card content area is reached */\n @Output()\n miniContentReached: EventEmitter<ResizedEvent> = new EventEmitter<ResizedEvent>();\n\n /** Emits when layout changes */\n @Output()\n layoutChange: EventEmitter<ResizableCardLayoutConfig> = new EventEmitter<ResizableCardLayoutConfig>();\n\n /** @hidden */\n @ContentChildren(ResizableCardItemComponent)\n resizeCardItems: QueryList<ResizableCardItemComponent>;\n\n /** width for layout */\n layoutWidth: number;\n\n /** height for layout */\n layoutHeight: number;\n\n /** @hidden Number of columns in layout. considering 1 column width 20rem */\n private _columns: number;\n\n /** @hidden Layout padding. will be added to first card padding in every row */\n private _paddingLeft: number;\n\n /** @hidden Stores height of each column on card arrangement */\n private _columnsHeight: Array<number>;\n\n /** @hidden Available screen layout */\n private _layout: LayoutSize;\n\n /** @hidden Stores sorted card before placing in layout */\n private _sortedCards: Array<ResizableCardItemComponent>;\n\n /** @hidden FocusKeyManager instance */\n private _keyboardEventsManager: FocusKeyManager<ResizableCardItemComponent>;\n\n /** @hidden */\n private readonly _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n private _layoutShifted = false;\n\n /** @hidden */\n private _directionPosition$ = computed<'left' | 'right'>(() => (this._rtlService?.rtlSignal() ? 'right' : 'left'));\n\n /** @hidden */\n constructor(\n private readonly _cd: ChangeDetectorRef,\n public readonly elementRef: ElementRef,\n @Optional() private readonly _rtlService: RtlService\n ) {}\n\n /** @hidden handles keyboard accessibility */\n @HostListener('keydown', ['$event'])\n _handleKeydown(event: KeyboardEvent): void {\n event.stopImmediatePropagation();\n if (!this._keyboardEventsManager.activeItemIndex) {\n this._keyboardEventsManager.setFirstItemActive();\n }\n\n if (this._keyboardEventsManager) {\n this._keyboardEventsManager.onKeydown(event);\n }\n }\n\n /** @hidden */\n @HostListener('window:resize')\n onResize(): void {\n this._createLayout();\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._columnsHeight = new Array(this._columns);\n this._columnsHeight.fill(0);\n // initialise value 0\n // detect initial window size and set layout\n this._createLayout();\n }\n\n /** @hidden */\n ngAfterContentInit(): void {\n this._initialSetup();\n // listen for query-list change\n this.resizeCardItems?.forEach((card) => {\n card?.verifyUpdateCardWidth(this.layoutSize);\n });\n\n this.resizeCardItems.changes.subscribe(() => {\n this.arrangeCards(this.resizeCardItems?.toArray());\n });\n this.arrangeCards(this.resizeCardItems?.toArray());\n this._cd.markForCheck();\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n this._accessibilitySetup();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._keyboardEventsManager?.destroy();\n }\n\n /** Layout size. Available options are 'sm', 'md', 'lg' and 'xl' */\n set layoutSize(layoutSize: LayoutSize) {\n this._layout = layoutSize;\n }\n get layoutSize(): LayoutSize {\n return this._layout;\n }\n\n /**\n * Arranges cards in layout based on rank, width and height of card\n * @param cards Array of ResizableCardItemComponent\n */\n arrangeCards(cards: Array<ResizableCardItemComponent>): void {\n this._columnsHeight = new Array(this._columns);\n this._columnsHeight.fill(0);\n // sort based on the card rank\n this._sortedCards = cards?.sort(this._sortCards);\n\n this._sortedCards?.forEach((card, index) => {\n this._setCardPositionValues(card, index);\n this._updateColumnsHeight(card);\n });\n this.layoutHeight = Math.max.apply(null, this._columnsHeight) + verticalResizeStep;\n\n this._emitLayoutChange();\n this._cd.markForCheck();\n }\n\n /**\n * Handles shifting of cards with animation, while card is still resizing.\n * @param event {ResizedEvent}\n */\n cardResizing(event: ResizedEvent): void {\n this.resizing.emit(event);\n this._handleHorizontalResize(event);\n this._handleVerticalResize(event);\n }\n\n /**\n * Handles arrangement of cards in layout\n * @param event {ResizedEvent}\n */\n cardResizeComplete(event: ResizedEvent): void {\n this._layoutShifted = false;\n this.arrangeCards(this.resizeCardItems.toArray());\n this.resized.emit(event);\n }\n\n /** @hidden */\n updateLayout(): void {\n this.resizeCardItems?.forEach((card) => {\n card?.verifyUpdateCardWidth(this.layoutSize);\n });\n this.arrangeCards(this.resizeCardItems?.toArray());\n }\n\n /**\n * method to get screen width\n * @returns Window width in px\n */\n getWidthAvailable(): number {\n return window.innerWidth;\n }\n\n /** @hidden Subscribe to events from items */\n private _initialSetup(): void {\n // listen for resizing event of card item\n this.resizeCardItems?.forEach((resizeCardItem, index) => {\n if (this.layoutConfig && this.layoutConfig.length >= index + 1) {\n resizeCardItem.config = this.layoutConfig[index];\n }\n\n resizeCardItem.resizing\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: ResizedEvent) => this.cardResizing(event));\n\n // listen for resize complete event of card item\n resizeCardItem.resized\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: ResizedEvent) => this.cardResizeComplete(event));\n\n // listen for mini-header height event of card item\n resizeCardItem.miniHeaderReached\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: ResizedEvent) => {\n this.miniHeaderReached.emit(event);\n this.stepChange.emit(event);\n });\n\n // listen for mini-content height event of card item\n resizeCardItem.miniContentReached\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: ResizedEvent) => {\n this.miniContentReached.emit(event);\n this.stepChange.emit(event);\n });\n });\n }\n\n /** @hidden */\n private _accessibilitySetup(): void {\n this._keyboardEventsManager?.destroy();\n this._keyboardEventsManager = new FocusKeyManager(this.resizeCardItems).withWrap();\n }\n\n /** @hidden create layout based on layout size */\n private _createLayout(): void {\n const screenWidth = this.getWidthAvailable();\n const prevLayoutSize = this.layoutSize;\n\n if (screenWidth > 0 && screenWidth <= 656 && prevLayoutSize !== 'sm') {\n this.layoutSize = 'sm';\n this._setLayoutColumns(this.layoutSize);\n this.updateLayout();\n } else if (screenWidth > 656 && screenWidth <= 975 && prevLayoutSize !== 'md') {\n this.layoutSize = 'md';\n this._setLayoutColumns(this.layoutSize);\n this.updateLayout();\n } else if (screenWidth > 975 && screenWidth <= 1359 && prevLayoutSize !== 'lg') {\n this.layoutSize = 'lg';\n this._setLayoutColumns(this.layoutSize);\n this.updateLayout();\n } else if (screenWidth > 1359 && prevLayoutSize !== 'xl') {\n this.layoutSize = 'xl';\n this._setLayoutColumns(this.layoutSize);\n this.updateLayout();\n }\n }\n\n /** @hidden Emit layoutChange event with updated card dimensions */\n private _emitLayoutChange(): void {\n const latestCardConfig: ResizableCardLayoutConfig = [];\n this.resizeCardItems?.forEach((card) => {\n const cardConfig: ResizableCardItemConfig = {};\n cardConfig.cardWidthColSpan = card.cardWidthColSpan;\n cardConfig.cardHeightRowSpan = card.cardHeightRowSpan;\n cardConfig.rank = card.rank;\n cardConfig.title = card.title;\n cardConfig.cardMiniContentRowSpan = card.cardMiniContentRowSpan;\n cardConfig.cardMiniHeaderRowSpan = card.cardMiniHeaderRowSpan;\n cardConfig.resizable = card.resizable;\n latestCardConfig.push(cardConfig);\n });\n this.layoutChange.emit(latestCardConfig);\n }\n\n /**\n * @hidden Sets number of column in layout, based on LayoutSize passed\n * @param layoutSize {'sm' | 'md' | 'lg' | 'xl'}\n */\n private _setLayoutColumns(layoutSize: LayoutSize): void {\n let layoutWidthDefault: number;\n\n switch (layoutSize) {\n case 'sm':\n this._columns = 1;\n this._paddingLeft = 8;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault;\n break;\n case 'md':\n this._columns = 2;\n this._paddingLeft = 16;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault + gap;\n break;\n case 'lg':\n this._columns = 3;\n this._paddingLeft = 16;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault + 2 * gap;\n break;\n case 'xl':\n this._columns = 4;\n this._paddingLeft = 48;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault + 3 * gap;\n break;\n default:\n this._columns = 4;\n this._paddingLeft = 48;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault + 3 * gap;\n }\n }\n\n /**\n * @hidden Method to handle card vertical resize and trigger the layout change\n * @param event {ResizedEvent}\n */\n private _handleVerticalResize(event: ResizedEvent): void {\n if (event.card.cardHeightRowSpan !== event.card.previousCardHeightRowSpan) {\n this.arrangeCards(this._sortedCards);\n this._cd.markForCheck();\n this.stepChange.emit(event.card.getResizedEventObject());\n }\n }\n\n /**\n * @hidden Method to handle card horizontal resize and trigger the layout change\n * @param event {ResizedEvent}\n */\n private _handleHorizontalResize(event: ResizedEvent): void {\n // when increasing width hit the offset, show extended border and start pushing down border cards\n // when width is decreasing , show extended border till it reaches to offset.\n const cardWidthChange = event.cardWidth - event.prevCardWidth;\n const currentResizingItemIndex = this._sortedCards?.findIndex((x) => x.rank === event.card.rank);\n\n if (event.cardWidth > event.prevCardWidth) {\n // when increasing size\n // card width increasing currently\n if (event.card.cardState === 1 && cardWidthChange > horizontalResizeOffset + gap && !this._layoutShifted) {\n // index of this card, then get next card. exchange ranks\n this._sortedCards.forEach((card: ResizableCardItemComponent, index: number) => {\n if (index > currentResizingItemIndex) {\n // if there are some cards on same height. make the current card rank higher than these.\n // otherwise next index where it will fit. until any card has less column span than total columns\n // if only in next top, one card is taking full columns\n if (\n card.startingColumnPosition + card.cardWidthColSpan === this._columns &&\n card.cardWidthColSpan !== this._columns\n ) {\n // get cards with top > current top , but minimum of it\n // exchange rank with these card\n this._moveCardDown(index);\n }\n }\n });\n this._layoutShifted = true;\n this.arrangeCards(this._sortedCards);\n this.stepChange.emit(event.card.getResizedEventObject());\n } else if (\n event.card.cardState === -1 &&\n cardWidthChange < horizontalResizeOffset + gap &&\n this._layoutShifted\n ) {\n // card width decreasing currently\n // move up the cards, if it was shifted while increasing the width\n this._sortedCards.forEach((card: ResizableCardItemComponent) => {\n card.rank = card.prevRank ? card.prevRank : card.rank;\n card.prevRank = 0;\n });\n this._layoutShifted = false;\n this.arrangeCards(this._sortedCards);\n this.stepChange.emit(event.card.getResizedEventObject());\n }\n } else if (event.cardWidth < event.prevCardWidth) {\n // when decreasing size\n if (event.card.cardState === -1 && -cardWidthChange > horizontalResizeOffset && !this._layoutShifted) {\n // card width decreasing currently\n this._layoutShifted = true;\n this.arrangeCards(this._sortedCards);\n this.stepChange.emit(event.card.getResizedEventObject());\n } else if (event.card.cardState === 1 && -cardWidthChange < horizontalResizeOffset && this._layoutShifted) {\n // card width increasing currently\n this._layoutShifted = false;\n this.arrangeCards(this._sortedCards);\n this.stepChange.emit(event.card.getResizedEventObject());\n }\n }\n }\n\n /**\n * @hidden Method to move card down, when another card width is increasing\n * Method to loop till this._columns -1 positions and exchange the rank\n * @param currentCardIndex Index of current card\n */\n private _moveCardDown(currentCardIndex: number): void {\n // taking width of adjacent card col-span into account\n\n // eg: 4 columns - 2 col(adjacent card) = 2 positions can exchange ranks\n const currentCard: ResizableCardItemComponent = this._sortedCards[currentCardIndex];\n let card: ResizableCardItemComponent;\n\n // unoccupiedPositions positions left after currentCard occupies in next row.\n let unoccupiedPositions = this._columns - currentCard.cardWidthColSpan;\n\n currentCard.prevRank = currentCard.rank;\n\n let index = 1;\n while (unoccupiedPositions > 0) {\n // compare from next card\n card = this._sortedCards[index + currentCardIndex];\n if (card && unoccupiedPositions >= card.cardWidthColSpan) {\n card.prevRank = card.rank;\n card.rank -= 1;\n currentCard.rank = card.prevRank;\n unoccupiedPositions -= card.cardWidthColSpan;\n } else {\n unoccupiedPositions = 0;\n }\n index += 1;\n }\n }\n\n /**\n * @hidden updates array with new column heights\n * @param card {ResizableCardItemComponent}\n */\n private _updateColumnsHeight(card: ResizableCardItemComponent): void {\n const directionPosition = this._directionPosition$();\n const columnsStart =\n card[directionPosition] != null ? Math.floor(card[directionPosition]! / horizontalResizeStep) : 0;\n\n // Get width of current card resizing and assign width here for that card\n const cardBaseColSpan = Math.floor(card.cardWidth / horizontalResizeStep);\n\n // till which columns card spans\n const columnsSpan =\n card.cardWidth - cardBaseColSpan * horizontalResizeStep - cardBaseColSpan * gap > horizontalResizeOffset\n ? cardBaseColSpan + 1\n : cardBaseColSpan;\n\n const columnHeight = card.cardHeight + card.top;\n\n for (let i = 0; i < columnsSpan; i++) {\n this._columnsHeight[i + columnsStart] = columnHeight;\n }\n\n if (columnsStart === columnsSpan) {\n this._columnsHeight[columnsStart] = columnHeight;\n }\n }\n\n /**\n * @hidden Try to set card at available heights\n * @param card ResizableCardItemComponent\n * @param index value of card in array of ResizableCardItemComponent\n */\n private _setCardPositionValues(card: ResizableCardItemComponent, index: number): void {\n const directionPosition = this._directionPosition$();\n if (index === 0) {\n card[directionPosition] = Number(this._paddingLeft);\n card.top = 0;\n card.startingColumnPosition = 0;\n return;\n }\n\n const uniqueHeights = this._getSortedUniqueHeights();\n let cardPositioned = false;\n\n for (let i = 0; i < uniqueHeights.length && !cardPositioned; i++) {\n cardPositioned = this._isPositionSetSuccess(uniqueHeights[i], card);\n }\n }\n\n /**\n * @hidden try to set card at given height.\n * @param height height at which card is getting positioned.\n * @param card ResizableCardItemComponent\n * @returns It returns true when card position id found otherwise it returns false.\n */\n private _isPositionSetSuccess(height: number, card: ResizableCardItemComponent): boolean {\n const directionPosition = this._directionPosition$();\n const columnPositions: number[] = [];\n let index = 0;\n for (const columnHeight of this._columnsHeight) {\n index++;\n if (columnHeight === height) {\n columnPositions.push(index);\n }\n }\n // check for each card position, starting from leftmost\n let isFitting = false;\n // try to fit as left (or right if Rtl) as possible from the column position\n const startingColumnPosition = this._fitCardColumnPosition(card, columnPositions, height);\n\n if (startingColumnPosition !== -1) {\n isFitting = true;\n card[directionPosition] =\n startingColumnPosition * horizontalResizeStep +\n this._paddingLeft +\n (startingColumnPosition > 0 ? gap * startingColumnPosition : 0);\n card.top = height + (height > 0 ? verticalResizeStep : 0);\n card.startingColumnPosition = startingColumnPosition;\n }\n return isFitting;\n }\n\n /**\n * @hidden Try to start card position from left most fit position.\n * @param card ResizableCardItemComponent\n * @param columnPositions {Array<number>} Array of available positions for cards.\n * @param height {number} height at which fixing the card\n * @returns {number} returns starting column position where card will fit.\n */\n private _fitCardColumnPosition(\n card: ResizableCardItemComponent,\n columnPositions: Array<number>,\n height: number\n ): number {\n // check for each card position, starting from leftmost\n let isFitting = false;\n let startingColumnPosition = -1;\n\n // start from previous indexes\n const cardBaseColSpan = Math.floor(card.cardWidth / horizontalResizeStep);\n const cardColSpan =\n card.cardWidth - cardBaseColSpan * horizontalResizeStep - cardBaseColSpan * gap > horizontalResizeOffset\n ? cardBaseColSpan + 1\n : cardBaseColSpan;\n // try to set towards left from available card position\n // eg. [1, 2, 3, 4] columnsPositions\n for (const columnPosition of columnPositions) {\n if (isFitting) {\n break;\n }\n\n // startingPosition values will be 1, 2, 3, 4\n // try to fit as left as possible\n let startingPosition = columnPosition - (cardColSpan - 1);\n startingPosition = startingPosition > 0 ? startingPosition : 1;\n\n for (let index = startingPosition; index <= columnPosition && !isFitting; index++) {\n for (let span = 0; span < cardColSpan; span++) {\n if (this._columnsHeight[index + span - 1] <= height && cardColSpan + index - 1 <= this._columns) {\n isFitting = true;\n startingColumnPosition = index - 1;\n } else {\n isFitting = false;\n startingColumnPosition = -1;\n break;\n }\n }\n }\n }\n return startingColumnPosition;\n }\n\n /** @hidden returns sorted unique height of columns */\n private _getSortedUniqueHeights(): number[] {\n const tempArray = this._columnsHeight.slice();\n const sortedColumnsHeightArray = tempArray.sort(comparer);\n const uniqueHeights: number[] = [];\n\n for (const sortedHeight of sortedColumnsHeightArray) {\n if (uniqueHeights.indexOf(sortedHeight) === -1) {\n uniqueHeights.push(sortedHeight);\n }\n }\n function comparer(first: number, second: number): number {\n return first - second;\n }\n return uniqueHeights;\n }\n\n /**\n * @hidden Comparator to sort card based on rank.\n * @param firstCard ResizableCardItemComponent\n * @param secondCard ResizableCardItemComponent\n * @returns : returns difference between first card rank and other card rank.\n */\n private _sortCards(firstCard: ResizableCardItemComponent, secondCard: ResizableCardItemComponent): number {\n return firstCard.rank - secondCard.rank;\n }\n}\n","<div\n #layout\n class=\"fd-resizable-card-layout\"\n [class]=\"'fd-resizable-card-layout--' + layoutSize\"\n [style.width.px]=\"layoutWidth\"\n [style.height.px]=\"layoutHeight\"\n>\n <ng-content></ng-content>\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { ResizableCardItemComponent } from './resizable-card-layout/resizable-card-item/resizable-card-item.component';\nimport { ResizableCardLayoutComponent } from './resizable-card-layout/resizable-card-layout.component';\n\n/**\n * @deprecated\n * Use direct imports of `ResizableCardLayoutComponent` and `ResizableCardItemComponent`.\n */\n@NgModule({\n imports: [ResizableCardLayoutComponent, ResizableCardItemComponent],\n exports: [ResizableCardLayoutComponent, ResizableCardItemComponent]\n})\nexport class ResizableCardLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fundamental-ngx-core-resizable-card-layout.mjs","sources":["../tmp-esm2022/resizable-card-layout/resizable-card-layout/resizable-card-item/resizable-card-item.component.js","../tmp-esm2022/resizable-card-layout/resizable-card-layout/resizable-card-layout.component.js","../tmp-esm2022/resizable-card-layout/resizable-card-layout.module.js","../tmp-esm2022/resizable-card-layout/fundamental-ngx-core-resizable-card-layout.js"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Optional, Output, ViewEncapsulation } from '@angular/core';\nimport { RtlService } from '@fundamental-ngx/cdk/utils';\nimport { Subscription } from 'rxjs';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@fundamental-ngx/cdk/utils\";\n// Card resizes in step of fixed values. values are in pixel\nexport const horizontalResizeStep = 320;\n// vertical resize step\nexport const verticalResizeStep = 16;\n// gap of 1rem between the cards\nexport const gap = 16;\n// threshold offset for horizontal resizing.\nexport const horizontalResizeOffset = 160;\n// threshold offset for vertical resizing.\nexport const verticalResizeOffset = 8;\n// card is given numeric value, on which sorting of cards is done\nlet cardRank = 1;\nlet cardUniqueId = 0;\nexport class ResizableCardItemComponent {\n /** Card properties from the config */\n set config(config) {\n this._config = config;\n this._initialSetup();\n this._cd.detectChanges();\n }\n get config() {\n return this._config;\n }\n /**\n * Serial order of card.\n * cards are sorted based on ranks before displaying layout.\n * card with lower rank will be displayed first in layout than the card with higher rank.\n */\n set rank(rankValue) {\n // determine max value between user given value and default value\n this._rank = rankValue ? rankValue : cardRank++;\n if (rankValue > cardRank) {\n cardRank = rankValue;\n }\n }\n get rank() {\n return this._rank;\n }\n /**\n * Number of column span card width takes.\n * It will be in step of 20rem.\n */\n set cardWidthColSpan(colSpan) {\n this._cardWidthColSpan = colSpan;\n this._setCardWidth();\n }\n get cardWidthColSpan() {\n return this._cardWidthColSpan;\n }\n /**\n * Number of row span, card height takes.\n * It will be in the step of 1rem.\n */\n set cardHeightRowSpan(rowSpan) {\n this._cardHeightRowSpan = rowSpan;\n this._setCardHeight();\n }\n get cardHeightRowSpan() {\n return this._cardHeightRowSpan;\n }\n /**\n * Number of row span card mini header height takes.\n * Mini Header: The smallest representation of the card is the header.\n * The card can be collapsed to only its header height.\n */\n set cardMiniHeaderRowSpan(rowSpan) {\n this._cardMiniHeaderRowSpan = rowSpan;\n this._setCardMiniHeaderHeight();\n }\n get cardMiniHeaderRowSpan() {\n return this._cardMiniHeaderRowSpan;\n }\n /**\n * Number of row span card mini content height takes.\n * Mini Content: The minimum height for the card content depends on the card type,\n * and must be as high as the smallest representation of the content.\n */\n set cardMiniContentRowSpan(rowSpan) {\n this._cardMiniContentRowSpan = rowSpan;\n this._setCardMiniContentHeight();\n }\n get cardMiniContentRowSpan() {\n return this._cardMiniContentRowSpan ?? 0;\n }\n /** @hidden */\n constructor(_cd, elementRef, _rtlService) {\n this._cd = _cd;\n this.elementRef = elementRef;\n this._rtlService = _rtlService;\n /** set uinque id for the card */\n this.itemId = `fd-card-item-${cardUniqueId++}`;\n /** Card can be set to resizable=false, to restrict card resize */\n this.resizable = true;\n /** Set top position for the card*/\n this.top = 0;\n /** @hidden while resizing this value will change to a greater value */\n this.zIndex = 0;\n /** @hidden */\n this.position = 'absolute';\n /** @hidden transition animation when layout re-draws */\n this.reDrawAnimation = true;\n /** Emits when card is still resizing */\n this.resizing = new EventEmitter();\n /** Emits when card resize is completed */\n this.resized = new EventEmitter();\n /** Emits when card height is reduced to show only header */\n this.miniHeaderReached = new EventEmitter();\n /** Emits when minimum height of card content area is reached */\n this.miniContentReached = new EventEmitter();\n /** show corner resize icon on hover over card */\n this.showingResizeIcon = false;\n /** show border when card is resizing */\n this.showBorder = false;\n /** card width in px. Default value to 20rem */\n this.cardWidth = horizontalResizeStep;\n /** Outer resize indication border width for the card */\n this.resizeIndicationBorderWidth = 0;\n /**\n * Denotes if card is currently expanding or contracting horizontally.\n * +1 denotes increasing, -1 denotes decreasing and 0 denotes card-state has not changed horizontally.\n */\n this.cardState = 0;\n /** Change in rank from previous value*/\n this.prevRank = 0;\n /** @hidden Default width of card is 20rem ie. 1 column */\n this._cardWidthColSpan = 1;\n /** @hidden flag to control resize */\n this._resize = false;\n /**\n * @hidden stores original width span of card.\n * It may reduce on small screen, so have to restore using this.\n */\n this._originalCardWidthSpan = 0;\n /** @hidden */\n this._subscriptions = new Subscription();\n }\n /**\n * @hidden When mouse moves to resize the card.\n * using window:mousemove so, resize will happen smoothly\n * @param event {MouseEvent}\n */\n onMouseMove(event) {\n event.preventDefault();\n if (!this.resizable) {\n return;\n }\n // saves from un-necessary resize\n if (!this._resize) {\n return;\n }\n if (!this.showBorder) {\n this.showBorder = true;\n }\n // resizing card will go over other cards\n this.zIndex = 1;\n const { clientX, clientY } = event;\n switch (this._resizeDirection) {\n case 'both':\n this._horizontalResizing(clientX);\n this._verticalResizing(clientY);\n break;\n case 'horizontal':\n this._horizontalResizing(clientX);\n break;\n case 'vertical':\n this._verticalResizing(clientY);\n break;\n default:\n this._horizontalResizing(clientX);\n this._verticalResizing(clientY);\n }\n const cardWidthColSpan = Math.floor(this.cardWidth / horizontalResizeStep);\n const cardWidthWithColumn = cardWidthColSpan * horizontalResizeStep + cardWidthColSpan * gap;\n const horizontalResizeThresholdReached = this.cardWidth - cardWidthWithColumn > horizontalResizeOffset;\n if (clientX > this._prevX) {\n // increasing width\n this.cardState = 1;\n if (horizontalResizeThresholdReached) {\n const futureCardWidth = (cardWidthColSpan + 1) * horizontalResizeStep + cardWidthColSpan * gap;\n this.resizeIndicationBorderWidth = futureCardWidth - this.cardWidth;\n }\n else {\n this.resizeIndicationBorderWidth = 0;\n }\n }\n else if (clientX < this._prevX) {\n // decreasing width\n this.cardState = -1;\n if (horizontalResizeThresholdReached) {\n const futureCardWidth = (cardWidthColSpan + 1) * horizontalResizeStep + cardWidthColSpan * gap;\n this.resizeIndicationBorderWidth = futureCardWidth - this.cardWidth;\n }\n else {\n this.resizeIndicationBorderWidth = 0;\n }\n }\n this._prevX = clientX;\n this._prevY = clientY;\n this._cd.detectChanges();\n // Emits resizing event.\n this.resizing.emit(this.getResizedEventObject());\n }\n /**\n * when resizing of card stops\n */\n onMouseUp() {\n if (!this.resizable) {\n return;\n }\n // if card was not resizing\n if (!this._resize) {\n return;\n }\n // increase/decrease width of card in order of 20rem\n if (Math.abs(this.cardWidth - this._prevCardWidth) > 0) {\n this._horizontalStepResizing();\n }\n // increase/decrease height of card in order of 1rem\n if (Math.abs(this.cardHeight - this._prevCardHeight) > 0) {\n this._verticalStepResizing();\n }\n this._stopResizing();\n this._cd.markForCheck();\n }\n /** @hidden */\n ngOnDestroy() {\n this._subscriptions.unsubscribe();\n }\n /**\n * When resize handler is pressed and resizing may start.\n * @param event {MouseEvent}\n * @param resizeDirection which handler is pressed to resize\n */\n onMouseDown(event, resizeDirection) {\n event.preventDefault();\n if (!this.resizable) {\n return;\n }\n this.showingResizeIcon = true;\n this._resize = true;\n this._prevX = event.clientX;\n this._prevY = event.clientY;\n this._prevCardWidth = this.cardWidth;\n this._prevCardHeight = this.cardHeight;\n this._resizeDirection = resizeDirection;\n }\n /** Sets focus on the element */\n focus() {\n const header = this.elementRef.nativeElement.querySelector('.fd-card__header');\n header?.focus();\n }\n /** Shows resize icon */\n showResizeIcon() {\n if (!this.resizable) {\n return;\n }\n this.showingResizeIcon = true;\n }\n /** Hides resize icon */\n hideResizeIcon() {\n if (!this._resize) {\n this.showingResizeIcon = false;\n }\n }\n /** Returns max width for card, based on layout size passed */\n getMaxColSpan(layoutSize) {\n switch (layoutSize) {\n case 'sm':\n this._maxColumn = 1;\n break;\n case 'md':\n this._maxColumn = 2;\n break;\n case 'lg':\n this._maxColumn = 3;\n break;\n case 'xl':\n this._maxColumn = 4;\n break;\n default:\n this._maxColumn = 1;\n }\n return this._maxColumn;\n }\n /** Update card width if it exceeds column span based on layout */\n verifyUpdateCardWidth(layoutSize) {\n const widthColSpan = this._config?.cardWidthColSpan || this.cardWidthColSpan;\n // storing original width of card.\n // used to restore width on window resize from small to large\n this._originalCardWidthSpan = !this._originalCardWidthSpan ? widthColSpan : this._originalCardWidthSpan;\n this._maxColumn = this.getMaxColSpan(layoutSize);\n if (widthColSpan > this._maxColumn) {\n this.cardWidthColSpan = this._maxColumn;\n this._setCardWidth();\n // Emits resized event.\n this.resized.emit(this.getResizedEventObject());\n }\n else {\n // keep card width minimum, so it can fit in screen.\n this.cardWidthColSpan = Math.min(this._maxColumn, this._originalCardWidthSpan);\n this._setCardWidth();\n // Emits resized event.\n this.resized.emit(this.getResizedEventObject());\n }\n }\n /** Returns ResizedEvent object to emit. */\n getResizedEventObject() {\n const newCardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n const newCardWidthColSpan = Math.floor(this.cardWidth / horizontalResizeStep);\n const newCardWidth = newCardWidthColSpan * horizontalResizeStep + newCardWidthColSpan * gap;\n const horizontalResizeThresholdReached = this.cardWidth - newCardWidth > horizontalResizeOffset;\n const newCardColSpan = horizontalResizeThresholdReached ? newCardWidthColSpan + 1 : newCardWidthColSpan;\n return new ResizedEvent(this, this._prevCardWidth, this._prevCardHeight, this.cardWidth, this.cardHeight, this._cardWidthColSpan, this._cardHeightRowSpan, newCardColSpan, newCardHeightRowSpan);\n }\n /** @hidden Return previous height row span of the card */\n get previousCardHeightRowSpan() {\n return this._prevCardHeightRowSpan;\n }\n /** @hidden Set card properties using config received */\n _initialSetup() {\n this.cardWidthColSpan = this._config?.cardWidthColSpan || this.cardWidthColSpan;\n this.cardHeightRowSpan = this._config?.cardHeightRowSpan || this.cardHeightRowSpan;\n this.title = this._config?.title || this.title;\n this.rank = this._config?.rank || this.rank;\n this.cardMiniHeaderRowSpan = this._config?.cardMiniHeaderRowSpan || this.cardMiniHeaderRowSpan;\n this.cardMiniContentRowSpan = this._config?.cardMiniContentRowSpan || this.cardMiniContentRowSpan;\n this.resizable = this._config.resizable || this.resizable;\n }\n /** @hidden Returns true when resize offset is crossed */\n _horizontalResizeWithOffset() {\n // positive value indicates that width has increased\n const widthIncrement = this.cardWidth - this._prevCardWidth;\n const cardSpan = Math.floor(this.cardWidth / horizontalResizeStep);\n const cardSpanFraction = this.cardWidth % horizontalResizeStep;\n // when width increases\n if (widthIncrement > 0) {\n if (widthIncrement < horizontalResizeOffset + gap) {\n // widthIncrement is less than offset, do not increase width\n this.cardWidth = this._prevCardWidth;\n }\n else {\n // check value of cardSpanFraction, including gaps in cards\n const isCardSpanFractionCrossingOffset = cardSpanFraction - (cardSpan - 1) * gap > horizontalResizeOffset;\n this.cardWidth = isCardSpanFractionCrossingOffset\n ? (cardSpan + 1) * horizontalResizeStep\n : cardSpan * horizontalResizeStep;\n }\n }\n else {\n // when width decreases\n if (Math.abs(widthIncrement) < horizontalResizeOffset) {\n // widthIncrement is less than offset, do not decrease width\n this.cardWidth = this._prevCardWidth;\n }\n else {\n // check value of cardSpanFraction, including gaps in cards\n const isCardSpanFractionCrossingOffset = cardSpanFraction - cardSpan * gap > horizontalResizeOffset;\n this.cardWidth = isCardSpanFractionCrossingOffset\n ? (cardSpan + 1) * horizontalResizeStep\n : cardSpan * horizontalResizeStep;\n }\n }\n }\n /**\n * @hidden make horizontal resize only on step of 20rem\n */\n _horizontalStepResizing() {\n this._horizontalResizeWithOffset();\n // Add inner gap in cardWidth if width is more than 1 column\n if (this.cardWidth > horizontalResizeStep) {\n this.cardWidth = this.cardWidth + (this.cardWidth / horizontalResizeStep - 1) * gap;\n }\n this.cardWidthColSpan = Math.floor(this.cardWidth / horizontalResizeStep);\n }\n /**\n * @hidden make vertical resize only on step of 1rem\n */\n _verticalStepResizing() {\n // positive value indicates that height has increased\n const cardHeightSpan = Math.floor(this.cardHeight / verticalResizeStep);\n const cardSpanFraction = this.cardHeight % verticalResizeStep;\n this.cardHeight =\n cardSpanFraction > verticalResizeOffset\n ? (cardHeightSpan + 1) * verticalResizeStep\n : cardHeightSpan * verticalResizeStep;\n this.cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n }\n /**\n * @hidden Resize card horizontally by checking boundary condition\n * @param xPosition current x-position of cursor\n */\n _horizontalResizing(xPosition) {\n const difference = this._prevX - xPosition;\n this.cardWidth = this._rtlService?.rtlSignal() ? this.cardWidth + difference : this.cardWidth - difference;\n const totalIndentation = (this._maxColumn - 1) * gap;\n const maxCardWidtWithoutIndentation = this._maxColumn * horizontalResizeStep;\n const maxCardWidth = this._rtlService?.rtlSignal()\n ? maxCardWidtWithoutIndentation - totalIndentation\n : maxCardWidtWithoutIndentation + totalIndentation;\n if (this.cardWidth > maxCardWidth) {\n this.cardWidth = maxCardWidth;\n }\n else if (this.cardWidth < horizontalResizeStep) {\n this.cardWidth = horizontalResizeStep;\n }\n }\n /**\n * @hidden Resize card vertically.\n * takes care of mini-header height and mini-content height\n * @param yPosition current y-position of cursor\n */\n _verticalResizing(yPosition) {\n let reachingMiniHeader = false;\n if (this.cardHeight === this.cardMiniHeaderHeight) {\n // if card height is already at mini-header height\n if (this._prevY - yPosition > 0) {\n // decreasing height\n // if miniHeader height reached, stop resizing\n this.cardHeight = this.cardMiniHeaderHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n }\n else {\n // increasing height\n this.cardHeight = this.cardMiniHeaderHeight + this.cardMiniContentHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n this._stopResizing();\n this.miniContentReached.emit(this.getResizedEventObject());\n }\n }\n else if (this.cardHeight < this.cardMiniContentHeight + this.cardMiniHeaderHeight) {\n // if card height is between mini-header and mini-content\n if (this._prevY - yPosition < 0) {\n this.cardHeight = this.cardMiniHeaderHeight + this.cardMiniContentHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n this._stopResizing();\n this.miniContentReached.emit(this.getResizedEventObject());\n }\n }\n else if (this.cardHeight === this.cardMiniContentHeight + this.cardMiniHeaderHeight &&\n this._prevY - yPosition > 0) {\n // decreasing height\n // height decreasing after reaching mini-content. this needs to differentiate\n // from height decreasing and reaching to mini-content.\n reachingMiniHeader = true;\n this.cardHeight = this.cardMiniHeaderHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n // miniHeader height reached, stop resizing\n this._stopResizing();\n this.miniHeaderReached.emit(this.getResizedEventObject());\n }\n else {\n this.cardHeight = this.cardHeight - (this._prevY - yPosition);\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n }\n // stop resizing on miniContent height\n if (this.cardHeight <= this.cardMiniContentHeight + this.cardMiniHeaderHeight &&\n this._prevY - yPosition > 0 &&\n !reachingMiniHeader) {\n this.cardHeight = this.cardMiniContentHeight + this.cardMiniHeaderHeight;\n this._prevCardHeightRowSpan = this._cardHeightRowSpan;\n this._cardHeightRowSpan = Math.floor(this.cardHeight / verticalResizeStep);\n this.miniContentReached.emit(this.getResizedEventObject());\n this._stopResizing();\n }\n // while corner resize, width might have increased and reached to mini-content height.\n // so, on mini-content resize will stop, but have to do step resizing for vertical and horizontal.\n if (!this._resize) {\n // increase/decrease width of card in order of 20rem\n if (Math.abs(this.cardWidth - this._prevCardWidth) > 0) {\n this._horizontalStepResizing();\n }\n // increase/decrease height of card in order of 1rem\n if (Math.abs(this.cardHeight - this._prevCardHeight) > 0) {\n this._verticalStepResizing();\n }\n }\n }\n /** @hidden reset involved variables while resizing */\n _stopResizing() {\n if (this._resize) {\n this.cardState = 0;\n this.resizeIndicationBorderWidth = 0;\n this._resize = false;\n this.zIndex = 0;\n this.showBorder = false;\n this.resized.emit(this.getResizedEventObject());\n }\n }\n /** @hidden Returns cardWidth based on card column span */\n _setCardWidth() {\n this.cardWidth = this._cardWidthColSpan * horizontalResizeStep + (this._cardWidthColSpan - 1) * gap;\n this._cd.markForCheck();\n }\n /** @hidden Returns cardHeight based on card row span */\n _setCardHeight() {\n this.cardHeight = this._cardHeightRowSpan * verticalResizeStep;\n this._cd.markForCheck();\n }\n /** @hidden Returns card mini header height */\n _setCardMiniHeaderHeight() {\n this.cardMiniHeaderHeight = this._cardMiniHeaderRowSpan * verticalResizeStep;\n this._cd.markForCheck();\n }\n /** @hidden Returns card mini content height */\n _setCardMiniContentHeight() {\n this.cardMiniContentHeight = this.cardMiniContentRowSpan * verticalResizeStep;\n this._cd.markForCheck();\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: ResizableCardItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.RtlService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.1.4\", type: ResizableCardItemComponent, isStandalone: true, selector: \"fd-resizable-card-item\", inputs: { config: \"config\", itemId: \"itemId\", title: \"title\", rank: \"rank\", cardWidthColSpan: \"cardWidthColSpan\", cardHeightRowSpan: \"cardHeightRowSpan\", cardMiniHeaderRowSpan: \"cardMiniHeaderRowSpan\", cardMiniContentRowSpan: \"cardMiniContentRowSpan\", resizable: \"resizable\", left: \"left\", right: \"right\", top: \"top\" }, outputs: { resizing: \"resizing\", resized: \"resized\", miniHeaderReached: \"miniHeaderReached\", miniContentReached: \"miniContentReached\" }, host: { listeners: { \"window:mousemove\": \"onMouseMove($event)\", \"document:mouseup\": \"onMouseUp()\" }, properties: { \"style.left.px\": \"this.left\", \"style.right.px\": \"this.right\", \"style.top.px\": \"this.top\", \"style.z-index\": \"this.zIndex\", \"style.position\": \"this.position\", \"class.fd-resizable-card-layout__draw-transition\": \"this.reDrawAnimation\" } }, ngImport: i0, template: \"<div\\n class=\\\"fd-resizable-card-layout__item\\\"\\n [class.fd-resizable-card-layout__indication-border]=\\\"showBorder\\\"\\n #resizeCard\\n>\\n <div\\n class=\\\"fd-resizable-card-layout__item--border-display fd-resizable-card-layout__item--resize-transition\\\"\\n [style.width.px]=\\\"cardWidth\\\"\\n [style.height.px]=\\\"cardHeight\\\"\\n (mouseenter)=\\\"showResizeIcon()\\\"\\n (mouseleave)=\\\"hideResizeIcon()\\\"\\n >\\n <div class=\\\"fd-resizable-card-layout__card\\\">\\n <ng-content></ng-content>\\n @if (showingResizeIcon) {\\n <div class=\\\"fd-resizable-card-layout__icon-wrapper\\\" role=\\\"presentation\\\" aria-hidden=\\\"true\\\">\\n <div\\n class=\\\"fd-resizable-card-layout__icon\\\"\\n #cornerHandle\\n (mousedown)=\\\"onMouseDown($event, 'both')\\\"\\n ></div>\\n </div>\\n }\\n </div>\\n @if (resizable) {\\n <ng-template [ngTemplateOutlet]=\\\"verticalHandleTemplate\\\"></ng-template>\\n <ng-template [ngTemplateOutlet]=\\\"horizontalHandleTemplate\\\"></ng-template>\\n }\\n </div>\\n <div\\n class=\\\"fd-resizable-card-layout__item--resize-transition\\\"\\n [style.width.px]=\\\"resizeIndicationBorderWidth\\\"\\n [style.height.px]=\\\"cardHeight\\\"\\n ></div>\\n</div>\\n<ng-template #verticalHandleTemplate>\\n <div\\n #verticalHandle\\n class=\\\"fd-resizable-card-layout__resize--vertical\\\"\\n (mousedown)=\\\"onMouseDown($event, 'horizontal')\\\"\\n ></div>\\n</ng-template>\\n<ng-template #horizontalHandleTemplate>\\n <div\\n #horizontalHandle\\n class=\\\"fd-resizable-card-layout__resize--horizontal\\\"\\n (mousedown)=\\\"onMouseDown($event, 'vertical')\\\"\\n ></div>\\n</ng-template>\\n\", styles: [\".fd-resizable-card-layout{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;margin-top:1rem;padding-block:0;padding-inline:0;padding-inline:.5rem;position:relative}.fd-resizable-card-layout:after,.fd-resizable-card-layout:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__item{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;min-width:20rem;position:relative}.fd-resizable-card-layout__item:after,.fd-resizable-card-layout__item:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__card{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:1;-ms-flex:1;flex:1;height:calc(100% - .0625rem);position:relative}.fd-resizable-card-layout__card:after,.fd-resizable-card-layout__card:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon-wrapper{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.5rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1.5rem;padding-block:0;padding-inline:0;width:1.5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;bottom:-.35rem;justify-content:flex-start;position:absolute;right:0;z-index:2}.fd-resizable-card-layout__icon-wrapper:after,.fd-resizable-card-layout__icon-wrapper:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon-wrapper[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon-wrapper{bottom:-.125rem;left:-.25rem;right:auto}.fd-resizable-card-layout__icon{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1rem;padding-block:0;padding-inline:0;width:1rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--sapButton_Lite_TextColor);cursor:nwse-resize;font-family:SAP-icons;font-size:1rem;height:100%;line-height:1rem;position:absolute;width:100%;z-index:2}.fd-resizable-card-layout__icon:after,.fd-resizable-card-layout__icon:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon:before{content:\\\"\\\\e24f\\\";font-family:SAP-icons;height:100%;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;width:100%}.fd-resizable-card-layout__icon[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon{cursor:nesw-resize;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fd-resizable-card-layout__icon--vertical,.fd-resizable-card-layout__icon--vertical[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon--vertical{cursor:ns-resize}.fd-resizable-card-layout__icon--horizontal,.fd-resizable-card-layout__icon--horizontal[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon--horizontal{cursor:ew-resize}.fd-resizable-card-layout__resize--vertical{-webkit-box-ordinal-group:3;-ms-flex-order:2;cursor:ew-resize;order:2;width:.0625rem;z-index:2}.fd-resizable-card-layout__resize--vertical::content{content:\\\"\\\";position:absolute}.fd-resizable-card-layout__resize--horizontal{bottom:0;cursor:ns-resize;height:.0625rem;position:absolute;width:calc(100% - .5rem);z-index:2}.fd-resizable-card-layout__indication-border{border:0;border:.125rem dashed var(--sapContent_DragAndDropActiveColor);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-resizable-card-layout__indication-border:after,.fd-resizable-card-layout__indication-border:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout--sm{padding-inline:.5rem}.fd-resizable-card-layout--lg,.fd-resizable-card-layout--md{padding-inline:1rem}.fd-resizable-card-layout--xl{padding-inline:3rem}.fd-resizable-card-layout__item--resize-transition{transition-duration:.25s;animation-timing-function:ease-in-out}.fd-resizable-card-layout__draw-transition{transition-duration:.5s;animation-timing-function:ease-in}.fd-resizable-card-layout__item--border-display{display:flex}\\n/*! Bundled license information:\\n\\nfundamental-styles/dist/resizable-card-layout.css:\\n (*!\\n * Fundamental Library Styles v0.40.1\\n * Copyright (c) 2025 SAP SE or an SAP affiliate company.\\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\\n *)\\n*/\\n\"], dependencies: [{ kind: \"directive\", type: NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: ResizableCardItemComponent, decorators: [{\n type: Component,\n args: [{ selector: 'fd-resizable-card-item', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [NgTemplateOutlet], template: \"<div\\n class=\\\"fd-resizable-card-layout__item\\\"\\n [class.fd-resizable-card-layout__indication-border]=\\\"showBorder\\\"\\n #resizeCard\\n>\\n <div\\n class=\\\"fd-resizable-card-layout__item--border-display fd-resizable-card-layout__item--resize-transition\\\"\\n [style.width.px]=\\\"cardWidth\\\"\\n [style.height.px]=\\\"cardHeight\\\"\\n (mouseenter)=\\\"showResizeIcon()\\\"\\n (mouseleave)=\\\"hideResizeIcon()\\\"\\n >\\n <div class=\\\"fd-resizable-card-layout__card\\\">\\n <ng-content></ng-content>\\n @if (showingResizeIcon) {\\n <div class=\\\"fd-resizable-card-layout__icon-wrapper\\\" role=\\\"presentation\\\" aria-hidden=\\\"true\\\">\\n <div\\n class=\\\"fd-resizable-card-layout__icon\\\"\\n #cornerHandle\\n (mousedown)=\\\"onMouseDown($event, 'both')\\\"\\n ></div>\\n </div>\\n }\\n </div>\\n @if (resizable) {\\n <ng-template [ngTemplateOutlet]=\\\"verticalHandleTemplate\\\"></ng-template>\\n <ng-template [ngTemplateOutlet]=\\\"horizontalHandleTemplate\\\"></ng-template>\\n }\\n </div>\\n <div\\n class=\\\"fd-resizable-card-layout__item--resize-transition\\\"\\n [style.width.px]=\\\"resizeIndicationBorderWidth\\\"\\n [style.height.px]=\\\"cardHeight\\\"\\n ></div>\\n</div>\\n<ng-template #verticalHandleTemplate>\\n <div\\n #verticalHandle\\n class=\\\"fd-resizable-card-layout__resize--vertical\\\"\\n (mousedown)=\\\"onMouseDown($event, 'horizontal')\\\"\\n ></div>\\n</ng-template>\\n<ng-template #horizontalHandleTemplate>\\n <div\\n #horizontalHandle\\n class=\\\"fd-resizable-card-layout__resize--horizontal\\\"\\n (mousedown)=\\\"onMouseDown($event, 'vertical')\\\"\\n ></div>\\n</ng-template>\\n\", styles: [\".fd-resizable-card-layout{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;margin-top:1rem;padding-block:0;padding-inline:0;padding-inline:.5rem;position:relative}.fd-resizable-card-layout:after,.fd-resizable-card-layout:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__item{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;min-width:20rem;position:relative}.fd-resizable-card-layout__item:after,.fd-resizable-card-layout__item:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__card{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:1;-ms-flex:1;flex:1;height:calc(100% - .0625rem);position:relative}.fd-resizable-card-layout__card:after,.fd-resizable-card-layout__card:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon-wrapper{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.5rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1.5rem;padding-block:0;padding-inline:0;width:1.5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;bottom:-.35rem;justify-content:flex-start;position:absolute;right:0;z-index:2}.fd-resizable-card-layout__icon-wrapper:after,.fd-resizable-card-layout__icon-wrapper:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon-wrapper[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon-wrapper{bottom:-.125rem;left:-.25rem;right:auto}.fd-resizable-card-layout__icon{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1rem;padding-block:0;padding-inline:0;width:1rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--sapButton_Lite_TextColor);cursor:nwse-resize;font-family:SAP-icons;font-size:1rem;height:100%;line-height:1rem;position:absolute;width:100%;z-index:2}.fd-resizable-card-layout__icon:after,.fd-resizable-card-layout__icon:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon:before{content:\\\"\\\\e24f\\\";font-family:SAP-icons;height:100%;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;width:100%}.fd-resizable-card-layout__icon[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon{cursor:nesw-resize;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fd-resizable-card-layout__icon--vertical,.fd-resizable-card-layout__icon--vertical[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon--vertical{cursor:ns-resize}.fd-resizable-card-layout__icon--horizontal,.fd-resizable-card-layout__icon--horizontal[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon--horizontal{cursor:ew-resize}.fd-resizable-card-layout__resize--vertical{-webkit-box-ordinal-group:3;-ms-flex-order:2;cursor:ew-resize;order:2;width:.0625rem;z-index:2}.fd-resizable-card-layout__resize--vertical::content{content:\\\"\\\";position:absolute}.fd-resizable-card-layout__resize--horizontal{bottom:0;cursor:ns-resize;height:.0625rem;position:absolute;width:calc(100% - .5rem);z-index:2}.fd-resizable-card-layout__indication-border{border:0;border:.125rem dashed var(--sapContent_DragAndDropActiveColor);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-resizable-card-layout__indication-border:after,.fd-resizable-card-layout__indication-border:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout--sm{padding-inline:.5rem}.fd-resizable-card-layout--lg,.fd-resizable-card-layout--md{padding-inline:1rem}.fd-resizable-card-layout--xl{padding-inline:3rem}.fd-resizable-card-layout__item--resize-transition{transition-duration:.25s;animation-timing-function:ease-in-out}.fd-resizable-card-layout__draw-transition{transition-duration:.5s;animation-timing-function:ease-in}.fd-resizable-card-layout__item--border-display{display:flex}\\n/*! Bundled license information:\\n\\nfundamental-styles/dist/resizable-card-layout.css:\\n (*!\\n * Fundamental Library Styles v0.40.1\\n * Copyright (c) 2025 SAP SE or an SAP affiliate company.\\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\\n *)\\n*/\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.RtlService, decorators: [{\n type: Optional\n }] }], propDecorators: { config: [{\n type: Input\n }], itemId: [{\n type: Input\n }], title: [{\n type: Input\n }], rank: [{\n type: Input\n }], cardWidthColSpan: [{\n type: Input\n }], cardHeightRowSpan: [{\n type: Input\n }], cardMiniHeaderRowSpan: [{\n type: Input\n }], cardMiniContentRowSpan: [{\n type: Input\n }], resizable: [{\n type: Input\n }], left: [{\n type: Input\n }, {\n type: HostBinding,\n args: ['style.left.px']\n }], right: [{\n type: Input\n }, {\n type: HostBinding,\n args: ['style.right.px']\n }], top: [{\n type: Input\n }, {\n type: HostBinding,\n args: ['style.top.px']\n }], zIndex: [{\n type: HostBinding,\n args: ['style.z-index']\n }], position: [{\n type: HostBinding,\n args: ['style.position']\n }], reDrawAnimation: [{\n type: HostBinding,\n args: ['class.fd-resizable-card-layout__draw-transition']\n }], resizing: [{\n type: Output\n }], resized: [{\n type: Output\n }], miniHeaderReached: [{\n type: Output\n }], miniContentReached: [{\n type: Output\n }], onMouseMove: [{\n type: HostListener,\n args: ['window:mousemove', ['$event']]\n }], onMouseUp: [{\n type: HostListener,\n args: ['document:mouseup']\n }] } });\n/** Object to emit on resize complete */\nexport class ResizedEvent {\n /**\n * Object to emit on resize complete\n * @param card\n * @param prevCardWidth Previous card width\n * @param prevCardHeight Previous card height\n * @param cardWidth Current card width\n * @param cardHeight Current card height\n * @param cardWidthColSpan Current card width column span\n * @param cardHeightRowSpan Current card height row span\n * @param newCardWidthColSpan New card width column span\n * @param newCardHeightRowSpan New card height row span\n */\n constructor(card, prevCardWidth, prevCardHeight, cardWidth, cardHeight, cardWidthColSpan, cardHeightRowSpan, newCardWidthColSpan, newCardHeightRowSpan) {\n this.card = card;\n this.prevCardWidth = prevCardWidth;\n this.prevCardHeight = prevCardHeight;\n this.cardWidth = cardWidth;\n this.cardHeight = cardHeight;\n this.cardWidthColSpan = cardWidthColSpan;\n this.cardHeightRowSpan = cardHeightRowSpan;\n this.newCardWidthColSpan = newCardWidthColSpan;\n this.newCardHeightRowSpan = newCardHeightRowSpan;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLWNhcmQtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvcmVzaXphYmxlLWNhcmQtbGF5b3V0L3Jlc2l6YWJsZS1jYXJkLWxheW91dC9yZXNpemFibGUtY2FyZC1pdGVtL3Jlc2l6YWJsZS1jYXJkLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3Jlc2l6YWJsZS1jYXJkLWxheW91dC9yZXNpemFibGUtY2FyZC1sYXlvdXQvcmVzaXphYmxlLWNhcmQtaXRlbS9yZXNpemFibGUtY2FyZC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04saUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBWSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFJcEMsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUV4Qyx1QkFBdUI7QUFDdkIsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRXJDLGdDQUFnQztBQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBRXRCLDRDQUE0QztBQUM1QyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFFMUMsMENBQTBDO0FBQzFDLE1BQU0sQ0FBQyxN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QUNXLElBQWdDLEVBQ2hDLGFBQXFCLEVBQ3JCLGNBQXNCLEVBQ3RCLFNBQWlCLEVBQ2pCLFVBQWtCLEVBQ2xCLGdCQUF3QixFQUN4QixpQkFBeUIsRUFDekIsbUJBQTJCLEVBQzNCLG9CQUE0QjtRQVI1QixTQUFJLEdBQUosSUFBSSxDQUE0QjtRQUNoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtRQUN6Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQVE7UUFDM0IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFRO0lBQ3BDLENBQUM7Q0FDUCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzYWJsZU9wdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOdWxsYWJsZSwgUnRsU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgdHlwZSBSZXNpemVEaXJlY3Rpb24gPSAndmVydGljYWwnIHwgJ2hvcml6b250YWwnIHwgJ2JvdGgnO1xuXG4vLyBDYXJkIHJlc2l6ZXMgaW4gc3RlcCBvZiBmaXhlZCB2YWx1ZXMuIHZhbHVlcyBhcmUgaW4gcGl4ZWxcbmV4cG9ydCBjb25zdCBob3Jpem9udGFsUmVzaXplU3RlcCA9IDMyMDtcblxuLy8gdmVydGljYWwgcmVzaXplIHN0ZXBcbmV4cG9ydCBjb25zdCB2ZXJ0aWNhbFJlc2l6ZVN0ZXAgPSAxNjtcblxuLy8gZ2FwIG9mIDFyZW0gYmV0d2VlbiB0aGUgY2FyZHNcbmV4cG9ydCBjb25zdCBnYXAgPSAxNjtcblxuLy8gdGhyZXNob2xkIG9mZnNldCBmb3IgaG9yaXpvbnRhbCByZXNpemluZy5cbmV4cG9ydCBjb25zdCBob3Jpem9udGFsUmVzaXplT2Zmc2V0ID0gMTYwO1xuXG4vLyB0aHJlc2hvbGQgb2Zmc2V0IGZvciB2ZXJ0aWNhbCByZXNpemluZy5cbmV4cG9ydCBjb25zdCB2ZXJ0aWNhbFJlc2l6ZU9mZnNldCA9IDg7XG5cbi8vIHN0YXRlIG9mIGNhcmQuIEluY3JlYXNpbmcgd2lkdGgsIG5vIGNoYW5nZSBvciBkZWNyZWFzaW5nIHdpZHRoLlxuZXhwb3J0IHR5cGUgQ2FyZFN0YXRlID0gMSB8IDAgfCAtMTtcblxuLy8gY2FyZCBpcyBnaXZlbiBudW1lcmljIHZhbHVlLCBvbiB3aGljaCBzb3J0aW5nIG9mIGNhcmRzIGlzIGRvbmVcbmxldCBjYXJkUmFuayA9IDE7XG5sZXQgY2FyZFVuaXF1ZUlkID0gMDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1yZXNpemFibGUtY2FyZC1pdGVtJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3Jlc2l6YWJsZS1jYXJkLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9yZXNpemFibGUtY2FyZC1pdGVtLmNvbXBvbmVudC5zY3NzJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGltcG9ydHM6IFtOZ1RlbXBsYXRlT3V0bGV0XVxufSlcbmV4cG9ydCBjbGFzcyBSZXNpemFibGVDYXJkSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIEZvY3VzYWJsZU9wdGlvbiwgT25EZXN0cm95IHtcbiAgICAvKiogQ2FyZCBwcm9wZXJ0aWVzIGZyb20gdGhlIGNvbmZpZyAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNvbmZpZyhjb25maWc6IFJlc2l6YWJsZUNhcmRJdGVtQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5faW5pdGlhbFNldHVwKCk7XG4gICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgZ2V0IGNvbmZpZygpOiBSZXNpemFibGVDYXJkSXRlbUNvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gICAgfVxuXG4gICAgLyoqIHNldCB1aW5xdWUgaWQgZm9yIHRoZSBjYXJkICovXG4gICAgQElucHV0KClcbiAgICBpdGVtSWQgPSBgZmQtY2FyZC1pdGVtLSR7Y2FyZFVuaXF1ZUlkKyt9YDtcblxuICAgIC8qKiBzZXQgdGl0bGUgb2YgdGhlIGNhcmQgKi9cbiAgICBASW5wdXQoKVxuICAgIHRpdGxlOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWwgb3JkZXIgb2YgY2FyZC5cbiAgICAgKiBjYXJkcyBhcmUgc29ydGVkIGJhc2VkIG9uIHJhbmtzIGJlZm9yZSBkaXNwbGF5aW5nIGxheW91dC5cbiAgICAgKiBjYXJkIHdpdGggbG93ZXIgcmFuayB3aWxsIGJlIGRpc3BsYXllZCBmaXJzdCBpbiBsYXlvdXQgdGhhbiB0aGUgY2FyZCB3aXRoIGhpZ2hlciByYW5rLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHJhbmsocmFua1ZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgLy8gZGV0ZXJtaW5lIG1heCB2YWx1ZSBiZXR3ZWVuIHVzZXIgZ2l2ZW4gdmFsdWUgYW5kIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgdGhpcy5fcmFuayA9IHJhbmtWYWx1ZSA/IHJhbmtWYWx1ZSA6IGNhcmRSYW5rKys7XG4gICAgICAgIGlmIChyYW5rVmFsdWUgPiBjYXJkUmFuaykge1xuICAgICAgICAgICAgY2FyZFJhbmsgPSByYW5rVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHJhbmsoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhbms7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNvbHVtbiBzcGFuIGNhcmQgd2lkdGggdGFrZXMuXG4gICAgICogSXQgd2lsbCBiZSBpbiBzdGVwIG9mIDIwcmVtLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNhcmRXaWR0aENvbFNwYW4oY29sU3BhbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2NhcmRXaWR0aENvbFNwYW4gPSBjb2xTcGFuO1xuICAgICAgICB0aGlzLl9zZXRDYXJkV2lkdGgoKTtcbiAgICB9XG4gICAgZ2V0IGNhcmRXaWR0aENvbFNwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhcmRXaWR0aENvbFNwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHJvdyBzcGFuLCBjYXJkIGhlaWdodCB0YWtlcy5cbiAgICAgKiBJdCB3aWxsIGJlIGluIHRoZSBzdGVwIG9mIDFyZW0uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgY2FyZEhlaWdodFJvd1NwYW4ocm93U3BhbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2NhcmRIZWlnaHRSb3dTcGFuID0gcm93U3BhbjtcbiAgICAgICAgdGhpcy5fc2V0Q2FyZEhlaWdodCgpO1xuICAgIH1cbiAgICBnZXQgY2FyZEhlaWdodFJvd1NwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhcmRIZWlnaHRSb3dTcGFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3cgc3BhbiBjYXJkIG1pbmkgaGVhZGVyIGhlaWdodCB0YWtlcy5cbiAgICAgKiBNaW5pIEhlYWRlcjogVGhlIHNtYWxsZXN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjYXJkIGlzIHRoZSBoZWFkZXIuXG4gICAgICogVGhlIGNhcmQgY2FuIGJlIGNvbGxhcHNlZCB0byBvbmx5IGl0cyBoZWFkZXIgaGVpZ2h0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNhcmRNaW5pSGVhZGVyUm93U3Bhbihyb3dTcGFuOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fY2FyZE1pbmlIZWFkZXJSb3dTcGFuID0gcm93U3BhbjtcbiAgICAgICAgdGhpcy5fc2V0Q2FyZE1pbmlIZWFkZXJIZWlnaHQoKTtcbiAgICB9XG4gICAgZ2V0IGNhcmRNaW5pSGVhZGVyUm93U3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FyZE1pbmlIZWFkZXJSb3dTcGFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3cgc3BhbiBjYXJkIG1pbmkgY29udGVudCBoZWlnaHQgdGFrZXMuXG4gICAgICogTWluaSBDb250ZW50OiBUaGUgbWluaW11bSBoZWlnaHQgZm9yIHRoZSBjYXJkIGNvbnRlbnQgZGVwZW5kcyBvbiB0aGUgY2FyZCB0eXBlLFxuICAgICAqIGFuZCBtdXN0IGJlIGFzIGhpZ2ggYXMgdGhlIHNtYWxsZXN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNhcmRNaW5pQ29udGVudFJvd1NwYW4ocm93U3BhbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2NhcmRNaW5pQ29udGVudFJvd1NwYW4gPSByb3dTcGFuO1xuICAgICAgICB0aGlzLl9zZXRDYXJkTWluaUNvbnRlbnRIZWlnaHQoKTtcbiAgICB9XG4gICAgZ2V0IGNhcmRNaW5pQ29udGVudFJvd1NwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhcmRNaW5pQ29udGVudFJvd1NwYW4gPz8gMDtcbiAgICB9XG5cbiAgICAvKiogQ2FyZCBjYW4gYmUgc2V0IHRvIHJlc2l6YWJsZT1mYWxzZSwgdG8gcmVzdHJpY3QgY2FyZCByZXNpemUgKi9cbiAgICBASW5wdXQoKVxuICAgIHJlc2l6YWJsZSA9IHRydWU7XG5cbiAgICAvKiogU2V0IGxlZnQgcG9zaXRpb24gZm9yIHRoZSBjYXJkICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmxlZnQucHgnKVxuICAgIGxlZnQ6IE51bGxhYmxlPG51bWJlcj47XG5cbiAgICAvKiogU2V0IHJpZ2h0IHBvc2l0aW9uIGZvciB0aGUgY2FyZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5yaWdodC5weCcpXG4gICAgcmlnaHQ6IE51bGxhYmxlPG51bWJlcj47XG5cbiAgICAvKiogU2V0IHRvcCBwb3NpdGlvbiBmb3IgdGhlIGNhcmQqL1xuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS50b3AucHgnKVxuICAgIHRvcCA9IDA7XG5cbiAgICAvKiogQGhpZGRlbiB3aGlsZSByZXNpemluZyB0aGlzIHZhbHVlIHdpbGwgY2hhbmdlIHRvIGEgZ3JlYXRlciB2YWx1ZSAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuei1pbmRleCcpXG4gICAgekluZGV4ID0gMDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5wb3NpdGlvbicpXG4gICAgcG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXG4gICAgLyoqIEBoaWRkZW4gdHJhbnNpdGlvbiBhbmltYXRpb24gd2hlbiBsYXlvdXQgcmUtZHJhd3MgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZkLXJlc2l6YWJsZS1jYXJkLWxheW91dF9fZHJhdy10cmFuc2l0aW9uJylcbiAgICByZURyYXdBbmltYXRpb24gPSB0cnVlO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gY2FyZCBpcyBzdGlsbCByZXNpemluZyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlc2l6aW5nOiBFdmVudEVtaXR0ZXI8UmVzaXplZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVzaXplZEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gY2FyZCByZXNpemUgaXMgY29tcGxldGVkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVzaXplZDogRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIGNhcmQgaGVpZ2h0IGlzIHJlZHVjZWQgdG8gc2hvdyBvbmx5IGhlYWRlciAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG1pbmlIZWFkZXJSZWFjaGVkOiBFdmVudEVtaXR0ZXI8UmVzaXplZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVzaXplZEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gbWluaW11bSBoZWlnaHQgb2YgY2FyZCBjb250ZW50IGFyZWEgaXMgcmVhY2hlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG1pbmlDb250ZW50UmVhY2hlZDogRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4oKTtcblxuICAgIC8qKiBzaG93IGNvcm5lciByZXNpemUgaWNvbiBvbiBob3ZlciBvdmVyIGNhcmQgKi9cbiAgICBzaG93aW5nUmVzaXplSWNvbiA9IGZhbHNlO1xuXG4gICAgLyoqIHNob3cgYm9yZGVyIHdoZW4gY2FyZCBpcyByZXNpemluZyAqL1xuICAgIHNob3dCb3JkZXIgPSBmYWxzZTtcblxuICAgIC8qKiBzdGFydGluZyBjb2x1bW4gcG9zaXRpb24gb2YgY2FyZC4gc3RhcnRzIHdpdGggMCAqL1xuICAgIHN0YXJ0aW5nQ29sdW1uUG9zaXRpb246IG51bWJlcjtcblxuICAgIC8qKiBjYXJkIHdpZHRoIGluIHB4LiBEZWZhdWx0IHZhbHVlIHRvIDIwcmVtICovXG4gICAgY2FyZFdpZHRoOiBudW1iZXIgPSBob3Jpem9udGFsUmVzaXplU3RlcDtcblxuICAgIC8qKiBjYXJkIGhlaWdodCBpbiBweCAqL1xuICAgIGNhcmRIZWlnaHQ6IG51bWJlcjtcblxuICAgIC8qKiBNaW5pLWhlYWRlciBoZWlnaHQgb2YgY2FyZCAqL1xuICAgIGNhcmRNaW5pSGVhZGVySGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvKiogTWluaS1jb250ZW50IGhlaWdodCBvZiBjYXJkIHRvIGRpc3BsYXkgbWluaW11bSB2YWxpZCBjb250ZW50ICovXG4gICAgY2FyZE1pbmlDb250ZW50SGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvKiogT3V0ZXIgcmVzaXplIGluZGljYXRpb24gYm9yZGVyIHdpZHRoIGZvciB0aGUgY2FyZCAqL1xuICAgIHJlc2l6ZUluZGljYXRpb25Cb3JkZXJXaWR0aCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIGlmIGNhcmQgaXMgY3VycmVudGx5IGV4cGFuZGluZyBvciBjb250cmFjdGluZyBob3Jpem9udGFsbHkuXG4gICAgICogKzEgZGVub3RlcyBpbmNyZWFzaW5nLCAtMSBkZW5vdGVzIGRlY3JlYXNpbmcgYW5kIDAgZGVub3RlcyBjYXJkLXN0YXRlIGhhcyBub3QgY2hhbmdlZCBob3Jpem9udGFsbHkuXG4gICAgICovXG4gICAgY2FyZFN0YXRlOiBDYXJkU3RhdGUgPSAwO1xuXG4gICAgLyoqIENoYW5nZSBpbiByYW5rIGZyb20gcHJldmlvdXMgdmFsdWUqL1xuICAgIHByZXZSYW5rID0gMDtcblxuICAgIC8qKiBAaGlkZGVuIERlZmF1bHQgd2lkdGggb2YgY2FyZCBpcyAyMHJlbSBpZS4gMSBjb2x1bW4gKi9cbiAgICBwcml2YXRlIF9jYXJkV2lkdGhDb2xTcGFuID0gMTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2FyZEhlaWdodFJvd1NwYW46IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuIGhlbHBzIGluIHZlcnRpY2FsIHN0ZXAgY2hhbmdlIGV2ZW50IGVtaXQgKi9cbiAgICBwcml2YXRlIF9wcmV2Q2FyZEhlaWdodFJvd1NwYW46IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2FyZE1pbmlIZWFkZXJSb3dTcGFuOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2NhcmRNaW5pQ29udGVudFJvd1NwYW4/OiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiBjb25maWcgdmFsdWVzIGZvciBjYXJkICovXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBSZXNpemFibGVDYXJkSXRlbUNvbmZpZztcblxuICAgIC8qKiBAaGlkZGVuIHByZXZpb3VzIGN1cnNvciB4IHBvc2l0aW9uICovXG4gICAgcHJpdmF0ZSBfcHJldlg6IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuIHByZXZpb3VzIGN1cnNvciB5IHBvc2l0aW9uICovXG4gICAgcHJpdmF0ZSBfcHJldlk6IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcHJldkNhcmRXaWR0aDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9wcmV2Q2FyZEhlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gZmxhZyB0byBjb250cm9sIHJlc2l6ZSAqL1xuICAgIHByaXZhdGUgX3Jlc2l6ZSA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZXNpemVEaXJlY3Rpb246IFJlc2l6ZURpcmVjdGlvbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfbWF4Q29sdW1uOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIHN0b3JlcyBvcmlnaW5hbCB3aWR0aCBzcGFuIG9mIGNhcmQuXG4gICAgICogSXQgbWF5IHJlZHVjZSBvbiBzbWFsbCBzY3JlZW4sIHNvIGhhdmUgdG8gcmVzdG9yZSB1c2luZyB0aGlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX29yaWdpbmFsQ2FyZFdpZHRoU3BhbiA9IDA7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Jhbms6IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgX3J0bFNlcnZpY2U6IFJ0bFNlcnZpY2VcbiAgICApIHt9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIFdoZW4gbW91c2UgbW92ZXMgdG8gcmVzaXplIHRoZSBjYXJkLlxuICAgICAqIHVzaW5nIHdpbmRvdzptb3VzZW1vdmUgc28sIHJlc2l6ZSB3aWxsIGhhcHBlbiBzbW9vdGhseVxuICAgICAqIEBwYXJhbSBldmVudCB7TW91c2VFdmVudH1cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYXZlcyBmcm9tIHVuLW5lY2Vzc2FyeSByZXNpemVcbiAgICAgICAgaWYgKCF0aGlzLl9yZXNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zaG93Qm9yZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dCb3JkZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVzaXppbmcgY2FyZCB3aWxsIGdvIG92ZXIgb3RoZXIgY2FyZHNcbiAgICAgICAgdGhpcy56SW5kZXggPSAxO1xuXG4gICAgICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gZXZlbnQ7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fcmVzaXplRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdib3RoJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3Jpem9udGFsUmVzaXppbmcoY2xpZW50WCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmVydGljYWxSZXNpemluZyhjbGllbnRZKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvcml6b250YWwnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2hvcml6b250YWxSZXNpemluZyhjbGllbnRYKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3ZlcnRpY2FsJzpcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJ0aWNhbFJlc2l6aW5nKGNsaWVudFkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3Jpem9udGFsUmVzaXppbmcoY2xpZW50WCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmVydGljYWxSZXNpemluZyhjbGllbnRZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcmRXaWR0aENvbFNwYW4gPSBNYXRoLmZsb29yKHRoaXMuY2FyZFdpZHRoIC8gaG9yaXpvbnRhbFJlc2l6ZVN0ZXApO1xuICAgICAgICBjb25zdCBjYXJkV2lkdGhXaXRoQ29sdW1uID0gY2FyZFdpZHRoQ29sU3BhbiAqIGhvcml6b250YWxSZXNpemVTdGVwICsgY2FyZFdpZHRoQ29sU3BhbiAqIGdhcDtcblxuICAgICAgICBjb25zdCBob3Jpem9udGFsUmVzaXplVGhyZXNob2xkUmVhY2hlZCA9IHRoaXMuY2FyZFdpZHRoIC0gY2FyZFdpZHRoV2l0aENvbHVtbiA+IGhvcml6b250YWxSZXNpemVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKGNsaWVudFggPiB0aGlzLl9wcmV2WCkge1xuICAgICAgICAgICAgLy8gaW5jcmVhc2luZyB3aWR0aFxuICAgICAgICAgICAgdGhpcy5jYXJkU3RhdGUgPSAxO1xuXG4gICAgICAgICAgICBpZiAoaG9yaXpvbnRhbFJlc2l6ZVRocmVzaG9sZFJlYWNoZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmdXR1cmVDYXJkV2lkdGggPSAoY2FyZFdpZHRoQ29sU3BhbiArIDEpICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXAgKyBjYXJkV2lkdGhDb2xTcGFuICogZ2FwO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplSW5kaWNhdGlvbkJvcmRlcldpZHRoID0gZnV0dXJlQ2FyZFdpZHRoIC0gdGhpcy5jYXJkV2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplSW5kaWNhdGlvbkJvcmRlcldpZHRoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjbGllbnRYIDwgdGhpcy5fcHJldlgpIHtcbiAgICAgICAgICAgIC8vIGRlY3JlYXNpbmcgd2lkdGhcbiAgICAgICAgICAgIHRoaXMuY2FyZFN0YXRlID0gLTE7XG4gICAgICAgICAgICBpZiAoaG9yaXpvbnRhbFJlc2l6ZVRocmVzaG9sZFJlYWNoZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmdXR1cmVDYXJkV2lkdGggPSAoY2FyZFdpZHRoQ29sU3BhbiArIDEpICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXAgKyBjYXJkV2lkdGhDb2xTcGFuICogZ2FwO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplSW5kaWNhdGlvbkJvcmRlcldpZHRoID0gZnV0dXJlQ2FyZFdpZHRoIC0gdGhpcy5jYXJkV2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplSW5kaWNhdGlvbkJvcmRlcldpZHRoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ByZXZYID0gY2xpZW50WDtcbiAgICAgICAgdGhpcy5fcHJldlkgPSBjbGllbnRZO1xuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgLy8gRW1pdHMgcmVzaXppbmcgZXZlbnQuXG4gICAgICAgIHRoaXMucmVzaXppbmcuZW1pdCh0aGlzLmdldFJlc2l6ZWRFdmVudE9iamVjdCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB3aGVuIHJlc2l6aW5nIG9mIGNhcmQgc3RvcHNcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJylcbiAgICBvbk1vdXNlVXAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBjYXJkIHdhcyBub3QgcmVzaXppbmdcbiAgICAgICAgaWYgKCF0aGlzLl9yZXNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluY3JlYXNlL2RlY3JlYXNlIHdpZHRoIG9mIGNhcmQgaW4gb3JkZXIgb2YgMjByZW1cbiAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMuY2FyZFdpZHRoIC0gdGhpcy5fcHJldkNhcmRXaWR0aCkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3Jpem9udGFsU3RlcFJlc2l6aW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbmNyZWFzZS9kZWNyZWFzZSBoZWlnaHQgb2YgY2FyZCBpbiBvcmRlciBvZiAxcmVtXG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLmNhcmRIZWlnaHQgLSB0aGlzLl9wcmV2Q2FyZEhlaWdodCkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl92ZXJ0aWNhbFN0ZXBSZXNpemluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RvcFJlc2l6aW5nKCk7XG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHJlc2l6ZSBoYW5kbGVyIGlzIHByZXNzZWQgYW5kIHJlc2l6aW5nIG1heSBzdGFydC5cbiAgICAgKiBAcGFyYW0gZXZlbnQge01vdXNlRXZlbnR9XG4gICAgICogQHBhcmFtIHJlc2l6ZURpcmVjdGlvbiB3aGljaCBoYW5kbGVyIGlzIHByZXNzZWQgdG8gcmVzaXplXG4gICAgICovXG4gICAgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJlc2l6ZURpcmVjdGlvbjogUmVzaXplRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd2luZ1Jlc2l6ZUljb24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZXNpemUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9wcmV2WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICAgIHRoaXMuX3ByZXZZID0gZXZlbnQuY2xpZW50WTtcbiAgICAgICAgdGhpcy5fcHJldkNhcmRXaWR0aCA9IHRoaXMuY2FyZFdpZHRoO1xuICAgICAgICB0aGlzLl9wcmV2Q2FyZEhlaWdodCA9IHRoaXMuY2FyZEhlaWdodDtcbiAgICAgICAgdGhpcy5fcmVzaXplRGlyZWN0aW9uID0gcmVzaXplRGlyZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKiBTZXRzIGZvY3VzIG9uIHRoZSBlbGVtZW50ICovXG4gICAgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mZC1jYXJkX19oZWFkZXInKTtcbiAgICAgICAgaGVhZGVyPy5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKiBTaG93cyByZXNpemUgaWNvbiAqL1xuICAgIHNob3dSZXNpemVJY29uKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93aW5nUmVzaXplSWNvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEhpZGVzIHJlc2l6ZSBpY29uICovXG4gICAgaGlkZVJlc2l6ZUljb24oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fcmVzaXplKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dpbmdSZXNpemVJY29uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBtYXggd2lkdGggZm9yIGNhcmQsIGJhc2VkIG9uIGxheW91dCBzaXplIHBhc3NlZCAqL1xuICAgIGdldE1heENvbFNwYW4obGF5b3V0U2l6ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoIChsYXlvdXRTaXplKSB7XG4gICAgICAgICAgICBjYXNlICdzbSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4Q29sdW1uID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21kJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhDb2x1bW4gPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbGcnOlxuICAgICAgICAgICAgICAgIHRoaXMuX21heENvbHVtbiA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd4bCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4Q29sdW1uID0gNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4Q29sdW1uID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4Q29sdW1uO1xuICAgIH1cblxuICAgIC8qKiBVcGRhdGUgY2FyZCB3aWR0aCBpZiBpdCBleGNlZWRzIGNvbHVtbiBzcGFuIGJhc2VkIG9uIGxheW91dCAqL1xuICAgIHZlcmlmeVVwZGF0ZUNhcmRXaWR0aChsYXlvdXRTaXplOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgd2lkdGhDb2xTcGFuID0gdGhpcy5fY29uZmlnPy5jYXJkV2lkdGhDb2xTcGFuIHx8IHRoaXMuY2FyZFdpZHRoQ29sU3BhbjtcbiAgICAgICAgLy8gc3RvcmluZyBvcmlnaW5hbCB3aWR0aCBvZiBjYXJkLlxuICAgICAgICAvLyB1c2VkIHRvIHJlc3RvcmUgd2lkdGggb24gd2luZG93IHJlc2l6ZSBmcm9tIHNtYWxsIHRvIGxhcmdlXG4gICAgICAgIHRoaXMuX29yaWdpbmFsQ2FyZFdpZHRoU3BhbiA9ICF0aGlzLl9vcmlnaW5hbENhcmRXaWR0aFNwYW4gPyB3aWR0aENvbFNwYW4gOiB0aGlzLl9vcmlnaW5hbENhcmRXaWR0aFNwYW47XG4gICAgICAgIHRoaXMuX21heENvbHVtbiA9IHRoaXMuZ2V0TWF4Q29sU3BhbihsYXlvdXRTaXplKTtcbiAgICAgICAgaWYgKHdpZHRoQ29sU3BhbiA+IHRoaXMuX21heENvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5jYXJkV2lkdGhDb2xTcGFuID0gdGhpcy5fbWF4Q29sdW1uO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FyZFdpZHRoKCk7XG4gICAgICAgICAgICAvLyBFbWl0cyByZXNpemVkIGV2ZW50LlxuICAgICAgICAgICAgdGhpcy5yZXNpemVkLmVtaXQodGhpcy5nZXRSZXNpemVkRXZlbnRPYmplY3QoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBrZWVwIGNhcmQgd2lkdGggbWluaW11bSwgc28gaXQgY2FuIGZpdCBpbiBzY3JlZW4uXG4gICAgICAgICAgICB0aGlzLmNhcmRXaWR0aENvbFNwYW4gPSBNYXRoLm1pbih0aGlzLl9tYXhDb2x1bW4sIHRoaXMuX29yaWdpbmFsQ2FyZFdpZHRoU3Bhbik7XG4gICAgICAgICAgICB0aGlzLl9zZXRDYXJkV2lkdGgoKTtcbiAgICAgICAgICAgIC8vIEVtaXRzIHJlc2l6ZWQgZXZlbnQuXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZWQuZW1pdCh0aGlzLmdldFJlc2l6ZWRFdmVudE9iamVjdCgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIFJlc2l6ZWRFdmVudCBvYmplY3QgdG8gZW1pdC4gKi9cbiAgICBnZXRSZXNpemVkRXZlbnRPYmplY3QoKTogUmVzaXplZEV2ZW50IHtcbiAgICAgICAgY29uc3QgbmV3Q2FyZEhlaWdodFJvd1NwYW4gPSBNYXRoLmZsb29yKHRoaXMuY2FyZEhlaWdodCAvIHZlcnRpY2FsUmVzaXplU3RlcCk7XG4gICAgICAgIGNvbnN0IG5ld0NhcmRXaWR0aENvbFNwYW4gPSBNYXRoLmZsb29yKHRoaXMuY2FyZFdpZHRoIC8gaG9yaXpvbnRhbFJlc2l6ZVN0ZXApO1xuICAgICAgICBjb25zdCBuZXdDYXJkV2lkdGggPSBuZXdDYXJkV2lkdGhDb2xTcGFuICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXAgKyBuZXdDYXJkV2lkdGhDb2xTcGFuICogZ2FwO1xuXG4gICAgICAgIGNvbnN0IGhvcml6b250YWxSZXNpemVUaHJlc2hvbGRSZWFjaGVkID0gdGhpcy5jYXJkV2lkdGggLSBuZXdDYXJkV2lkdGggPiBob3Jpem9udGFsUmVzaXplT2Zmc2V0O1xuICAgICAgICBjb25zdCBuZXdDYXJkQ29sU3BhbiA9IGhvcml6b250YWxSZXNpemVUaHJlc2hvbGRSZWFjaGVkID8gbmV3Q2FyZFdpZHRoQ29sU3BhbiArIDEgOiBuZXdDYXJkV2lkdGhDb2xTcGFuO1xuICAgICAgICByZXR1cm4gbmV3IFJlc2l6ZWRFdmVudChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLl9wcmV2Q2FyZFdpZHRoLFxuICAgICAgICAgICAgdGhpcy5fcHJldkNhcmRIZWlnaHQsXG4gICAgICAgICAgICB0aGlzLmNhcmRXaWR0aCxcbiAgICAgICAgICAgIHRoaXMuY2FyZEhlaWdodCxcbiAgICAgICAgICAgIHRoaXMuX2NhcmRXaWR0aENvbFNwYW4sXG4gICAgICAgICAgICB0aGlzLl9jYXJkSGVpZ2h0Um93U3BhbixcbiAgICAgICAgICAgIG5ld0NhcmRDb2xTcGFuLFxuICAgICAgICAgICAgbmV3Q2FyZEhlaWdodFJvd1NwYW5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZXR1cm4gcHJldmlvdXMgaGVpZ2h0IHJvdyBzcGFuIG9mIHRoZSBjYXJkICovXG4gICAgZ2V0IHByZXZpb3VzQ2FyZEhlaWdodFJvd1NwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXZDYXJkSGVpZ2h0Um93U3BhbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBTZXQgY2FyZCBwcm9wZXJ0aWVzIHVzaW5nIGNvbmZpZyByZWNlaXZlZCAqL1xuICAgIHByaXZhdGUgX2luaXRpYWxTZXR1cCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYXJkV2lkdGhDb2xTcGFuID0gdGhpcy5fY29uZmlnPy5jYXJkV2lkdGhDb2xTcGFuIHx8IHRoaXMuY2FyZFdpZHRoQ29sU3BhbjtcbiAgICAgICAgdGhpcy5jYXJkSGVpZ2h0Um93U3BhbiA9IHRoaXMuX2NvbmZpZz8uY2FyZEhlaWdodFJvd1NwYW4gfHwgdGhpcy5jYXJkSGVpZ2h0Um93U3BhbjtcbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuX2NvbmZpZz8udGl0bGUgfHwgdGhpcy50aXRsZTtcbiAgICAgICAgdGhpcy5yYW5rID0gdGhpcy5fY29uZmlnPy5yYW5rIHx8IHRoaXMucmFuaztcbiAgICAgICAgdGhpcy5jYXJkTWluaUhlYWRlclJvd1NwYW4gPSB0aGlzLl9jb25maWc/LmNhcmRNaW5pSGVhZGVyUm93U3BhbiB8fCB0aGlzLmNhcmRNaW5pSGVhZGVyUm93U3BhbjtcbiAgICAgICAgdGhpcy5jYXJkTWluaUNvbnRlbnRSb3dTcGFuID0gdGhpcy5fY29uZmlnPy5jYXJkTWluaUNvbnRlbnRSb3dTcGFuIHx8IHRoaXMuY2FyZE1pbmlDb250ZW50Um93U3BhbjtcbiAgICAgICAgdGhpcy5yZXNpemFibGUgPSB0aGlzLl9jb25maWcucmVzaXphYmxlIHx8IHRoaXMucmVzaXphYmxlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJldHVybnMgdHJ1ZSB3aGVuIHJlc2l6ZSBvZmZzZXQgaXMgY3Jvc3NlZCAqL1xuICAgIHByaXZhdGUgX2hvcml6b250YWxSZXNpemVXaXRoT2Zmc2V0KCk6IHZvaWQge1xuICAgICAgICAvLyBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB3aWR0aCBoYXMgaW5jcmVhc2VkXG4gICAgICAgIGNvbnN0IHdpZHRoSW5jcmVtZW50ID0gdGhpcy5jYXJkV2lkdGggLSB0aGlzLl9wcmV2Q2FyZFdpZHRoO1xuICAgICAgICBjb25zdCBjYXJkU3BhbiA9IE1hdGguZmxvb3IodGhpcy5jYXJkV2lkdGggLyBob3Jpem9udGFsUmVzaXplU3RlcCk7XG4gICAgICAgIGNvbnN0IGNhcmRTcGFuRnJhY3Rpb24gPSB0aGlzLmNhcmRXaWR0aCAlIGhvcml6b250YWxSZXNpemVTdGVwO1xuXG4gICAgICAgIC8vIHdoZW4gd2lkdGggaW5jcmVhc2VzXG4gICAgICAgIGlmICh3aWR0aEluY3JlbWVudCA+IDApIHtcbiAgICAgICAgICAgIGlmICh3aWR0aEluY3JlbWVudCA8IGhvcml6b250YWxSZXNpemVPZmZzZXQgKyBnYXApIHtcbiAgICAgICAgICAgICAgICAvLyB3aWR0aEluY3JlbWVudCBpcyBsZXNzIHRoYW4gb2Zmc2V0LCBkbyBub3QgaW5jcmVhc2Ugd2lkdGhcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmRXaWR0aCA9IHRoaXMuX3ByZXZDYXJkV2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIHZhbHVlIG9mIGNhcmRTcGFuRnJhY3Rpb24sIGluY2x1ZGluZyBnYXBzIGluIGNhcmRzXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDYXJkU3BhbkZyYWN0aW9uQ3Jvc3NpbmdPZmZzZXQgPVxuICAgICAgICAgICAgICAgICAgICBjYXJkU3BhbkZyYWN0aW9uIC0gKGNhcmRTcGFuIC0gMSkgKiBnYXAgPiBob3Jpem9udGFsUmVzaXplT2Zmc2V0O1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZFdpZHRoID0gaXNDYXJkU3BhbkZyYWN0aW9uQ3Jvc3NpbmdPZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgPyAoY2FyZFNwYW4gKyAxKSAqIGhvcml6b250YWxSZXNpemVTdGVwXG4gICAgICAgICAgICAgICAgICAgIDogY2FyZFNwYW4gKiBob3Jpem9udGFsUmVzaXplU3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdoZW4gd2lkdGggZGVjcmVhc2VzXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMod2lkdGhJbmNyZW1lbnQpIDwgaG9yaXpvbnRhbFJlc2l6ZU9mZnNldCkge1xuICAgICAgICAgICAgICAgIC8vIHdpZHRoSW5jcmVtZW50IGlzIGxlc3MgdGhhbiBvZmZzZXQsIGRvIG5vdCBkZWNyZWFzZSB3aWR0aFxuICAgICAgICAgICAgICAgIHRoaXMuY2FyZFdpZHRoID0gdGhpcy5fcHJldkNhcmRXaWR0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgdmFsdWUgb2YgY2FyZFNwYW5GcmFjdGlvbiwgaW5jbHVkaW5nIGdhcHMgaW4gY2FyZHNcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NhcmRTcGFuRnJhY3Rpb25Dcm9zc2luZ09mZnNldCA9IGNhcmRTcGFuRnJhY3Rpb24gLSBjYXJkU3BhbiAqIGdhcCA+IGhvcml6b250YWxSZXNpemVPZmZzZXQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJkV2lkdGggPSBpc0NhcmRTcGFuRnJhY3Rpb25Dcm9zc2luZ09mZnNldFxuICAgICAgICAgICAgICAgICAgICA/IChjYXJkU3BhbiArIDEpICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXBcbiAgICAgICAgICAgICAgICAgICAgOiBjYXJkU3BhbiAqIGhvcml6b250YWxSZXNpemVTdGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBtYWtlIGhvcml6b250YWwgcmVzaXplIG9ubHkgb24gc3RlcCBvZiAyMHJlbVxuICAgICAqL1xuICAgIHByaXZhdGUgX2hvcml6b250YWxTdGVwUmVzaXppbmcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2hvcml6b250YWxSZXNpemVXaXRoT2Zmc2V0KCk7XG5cbiAgICAgICAgLy8gQWRkIGlubmVyIGdhcCBpbiAgY2FyZFdpZHRoIGlmIHdpZHRoIGlzIG1vcmUgdGhhbiAxIGNvbHVtblxuICAgICAgICBpZiAodGhpcy5jYXJkV2lkdGggPiBob3Jpem9udGFsUmVzaXplU3RlcCkge1xuICAgICAgICAgICAgdGhpcy5jYXJkV2lkdGggPSB0aGlzLmNhcmRXaWR0aCArICh0aGlzLmNhcmRXaWR0aCAvIGhvcml6b250YWxSZXNpemVTdGVwIC0gMSkgKiBnYXA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYXJkV2lkdGhDb2xTcGFuID0gTWF0aC5mbG9vcih0aGlzLmNhcmRXaWR0aCAvIGhvcml6b250YWxSZXNpemVTdGVwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIG1ha2UgdmVydGljYWwgcmVzaXplIG9ubHkgb24gc3RlcCBvZiAxcmVtXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdmVydGljYWxTdGVwUmVzaXppbmcoKTogdm9pZCB7XG4gICAgICAgIC8vIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IGhlaWdodCBoYXMgaW5jcmVhc2VkXG4gICAgICAgIGNvbnN0IGNhcmRIZWlnaHRTcGFuID0gTWF0aC5mbG9vcih0aGlzLmNhcmRIZWlnaHQgLyB2ZXJ0aWNhbFJlc2l6ZVN0ZXApO1xuICAgICAgICBjb25zdCBjYXJkU3BhbkZyYWN0aW9uID0gdGhpcy5jYXJkSGVpZ2h0ICUgdmVydGljYWxSZXNpemVTdGVwO1xuICAgICAgICB0aGlzLmNhcmRIZWlnaHQgPVxuICAgICAgICAgICAgY2FyZFNwYW5GcmFjdGlvbiA+IHZlcnRpY2FsUmVzaXplT2Zmc2V0XG4gICAgICAgICAgICAgICAgPyAoY2FyZEhlaWdodFNwYW4gKyAxKSAqIHZlcnRpY2FsUmVzaXplU3RlcFxuICAgICAgICAgICAgICAgIDogY2FyZEhlaWdodFNwYW4gKiB2ZXJ0aWNhbFJlc2l6ZVN0ZXA7XG5cbiAgICAgICAgdGhpcy5jYXJkSGVpZ2h0Um93U3BhbiA9IE1hdGguZmxvb3IodGhpcy5jYXJkSGVpZ2h0IC8gdmVydGljYWxSZXNpemVTdGVwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIFJlc2l6ZSBjYXJkIGhvcml6b250YWxseSBieSBjaGVja2luZyBib3VuZGFyeSBjb25kaXRpb25cbiAgICAgKiBAcGFyYW0geFBvc2l0aW9uIGN1cnJlbnQgeC1wb3NpdGlvbiBvZiBjdXJzb3JcbiAgICAgKi9cbiAgICBwcml2YXRlIF9ob3Jpem9udGFsUmVzaXppbmcoeFBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IHRoaXMuX3ByZXZYIC0geFBvc2l0aW9uO1xuICAgICAgICB0aGlzLmNhcmRXaWR0aCA9IHRoaXMuX3J0bFNlcnZpY2U/LnJ0bFNpZ25hbCgpID8gdGhpcy5jYXJkV2lkdGggKyBkaWZmZXJlbmNlIDogdGhpcy5jYXJkV2lkdGggLSBkaWZmZXJlbmNlO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsSW5kZW50YXRpb24gPSAodGhpcy5fbWF4Q29sdW1uIC0gMSkgKiBnYXA7XG4gICAgICAgIGNvbnN0IG1heENhcmRXaWR0V2l0aG91dEluZGVudGF0aW9uID0gdGhpcy5fbWF4Q29sdW1uICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXA7XG5cbiAgICAgICAgY29uc3QgbWF4Q2FyZFdpZHRoID0gdGhpcy5fcnRsU2VydmljZT8ucnRsU2lnbmFsKClcbiAgICAgICAgICAgID8gbWF4Q2FyZFdpZHRXaXRob3V0SW5kZW50YXRpb24gLSB0b3RhbEluZGVudGF0aW9uXG4gICAgICAgICAgICA6IG1heENhcmRXaWR0V2l0aG91dEluZGVudGF0aW9uICsgdG90YWxJbmRlbnRhdGlvbjtcblxuICAgICAgICBpZiAodGhpcy5jYXJkV2lkdGggPiBtYXhDYXJkV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2FyZFdpZHRoID0gbWF4Q2FyZFdpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2FyZFdpZHRoIDwgaG9yaXpvbnRhbFJlc2l6ZVN0ZXApIHtcbiAgICAgICAgICAgIHRoaXMuY2FyZFdpZHRoID0gaG9yaXpvbnRhbFJlc2l6ZVN0ZXA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIFJlc2l6ZSBjYXJkIHZlcnRpY2FsbHkuXG4gICAgICogdGFrZXMgY2FyZSBvZiBtaW5pLWhlYWRlciBoZWlnaHQgYW5kIG1pbmktY29udGVudCBoZWlnaHRcbiAgICAgKiBAcGFyYW0geVBvc2l0aW9uIGN1cnJlbnQgeS1wb3NpdGlvbiBvZiBjdXJzb3JcbiAgICAgKi9cbiAgICBwcml2YXRlIF92ZXJ0aWNhbFJlc2l6aW5nKHlQb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCByZWFjaGluZ01pbmlIZWFkZXIgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5jYXJkSGVpZ2h0ID09PSB0aGlzLmNhcmRNaW5pSGVhZGVySGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBpZiBjYXJkIGhlaWdodCBpcyBhbHJlYWR5IGF0IG1pbmktaGVhZGVyIGhlaWdodFxuICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZZIC0geVBvc2l0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGRlY3JlYXNpbmcgaGVpZ2h0XG4gICAgICAgICAgICAgICAgLy8gaWYgbWluaUhlYWRlciBoZWlnaHQgcmVhY2hlZCwgc3RvcCByZXNpemluZ1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZEhlaWdodCA9IHRoaXMuY2FyZE1pbmlIZWFkZXJIZWlnaHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJldkNhcmRIZWlnaHRSb3dTcGFuID0gdGhpcy5fY2FyZEhlaWdodFJvd1NwYW47XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FyZEhlaWdodFJvd1NwYW4gPSBNYXRoLmZsb29yKHRoaXMuY2FyZEhlaWdodCAvIHZlcnRpY2FsUmVzaXplU3RlcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGluY3JlYXNpbmcgaGVpZ2h0XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJkSGVpZ2h0ID0gdGhpcy5jYXJkTWluaUhlYWRlckhlaWdodCArIHRoaXMuY2FyZE1pbmlDb250ZW50SGVpZ2h0O1xuICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZDYXJkSGVpZ2h0Um93U3BhbiA9IHRoaXMuX2NhcmRIZWlnaHRSb3dTcGFuO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhcmRIZWlnaHRSb3dTcGFuID0gTWF0aC5mbG9vcih0aGlzLmNhcmRIZWlnaHQgLyB2ZXJ0aWNhbFJlc2l6ZVN0ZXApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BSZXNpemluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMubWluaUNvbnRlbnRSZWFjaGVkLmVtaXQodGhpcy5nZXRSZXNpemVkRXZlbnRPYmplY3QoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkSGVpZ2h0IDwgdGhpcy5jYXJkTWluaUNvbnRlbnRIZWlnaHQgKyB0aGlzLmNhcmRNaW5pSGVhZGVySGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBpZiBjYXJkIGhlaWdodCBpcyBiZXR3ZWVuIG1pbmktaGVhZGVyIGFuZCBtaW5pLWNvbnRlbnRcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcmV2WSAtIHlQb3NpdGlvbiA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmRIZWlnaHQgPSB0aGlzLmNhcmRNaW5pSGVhZGVySGVpZ2h0ICsgdGhpcy5jYXJkTWluaUNvbnRlbnRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJldkNhcmRIZWlnaHRSb3dTcGFuID0gdGhpcy5fY2FyZEhlaWdodFJvd1NwYW47XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FyZEhlaWdodFJvd1NwYW4gPSBNYXRoLmZsb29yKHRoaXMuY2FyZEhlaWdodCAvIHZlcnRpY2FsUmVzaXplU3RlcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcFJlc2l6aW5nKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5pQ29udGVudFJlYWNoZWQuZW1pdCh0aGlzLmdldFJlc2l6ZWRFdmVudE9iamVjdCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuY2FyZEhlaWdodCA9PT0gdGhpcy5jYXJkTWluaUNvbnRlbnRIZWlnaHQgKyB0aGlzLmNhcmRNaW5pSGVhZGVySGVpZ2h0ICYmXG4gICAgICAgICAgICB0aGlzLl9wcmV2WSAtIHlQb3NpdGlvbiA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBkZWNyZWFzaW5nIGhlaWdodFxuICAgICAgICAgICAgLy8gaGVpZ2h0IGRlY3JlYXNpbmcgYWZ0ZXIgcmVhY2hpbmcgbWluaS1jb250ZW50LiB0aGlzIG5lZWRzIHRvIGRpZmZlcmVudGlhdGVcbiAgICAgICAgICAgIC8vIGZyb20gaGVpZ2h0IGRlY3JlYXNpbmcgYW5kIHJlYWNoaW5nIHRvIG1pbmktY29udGVudC5cbiAgICAgICAgICAgIHJlYWNoaW5nTWluaUhlYWRlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNhcmRIZWlnaHQgPSB0aGlzLmNhcmRNaW5pSGVhZGVySGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5fcHJldkNhcmRIZWlnaHRSb3dTcGFuID0gdGhpcy5fY2FyZEhlaWdodFJvd1NwYW47XG4gICAgICAgICAgICB0aGlzLl9jYXJkSGVpZ2h0Um93U3BhbiA9IE1hdGguZmxvb3IodGhpcy5jYXJkSGVpZ2h0IC8gdmVydGljYWxSZXNpemVTdGVwKTtcbiAgICAgICAgICAgIC8vIG1pbmlIZWFkZXIgaGVpZ2h0IHJlYWNoZWQsIHN0b3AgcmVzaXppbmdcbiAgICAgICAgICAgIHRoaXMuX3N0b3BSZXNpemluZygpO1xuICAgICAgICAgICAgdGhpcy5taW5pSGVhZGVyUmVhY2hlZC5lbWl0KHRoaXMuZ2V0UmVzaXplZEV2ZW50T2JqZWN0KCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYXJkSGVpZ2h0ID0gdGhpcy5jYXJkSGVpZ2h0IC0gKHRoaXMuX3ByZXZZIC0geVBvc2l0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZDYXJkSGVpZ2h0Um93U3BhbiA9IHRoaXMuX2NhcmRIZWlnaHRSb3dTcGFuO1xuICAgICAgICAgICAgdGhpcy5fY2FyZEhlaWdodFJvd1NwYW4gPSBNYXRoLmZsb29yKHRoaXMuY2FyZEhlaWdodCAvIHZlcnRpY2FsUmVzaXplU3RlcCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9wIHJlc2l6aW5nIG9uIG1pbmlDb250ZW50IGhlaWdodFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNhcmRIZWlnaHQgPD0gdGhpcy5jYXJkTWluaUNvbnRlbnRIZWlnaHQgKyB0aGlzLmNhcmRNaW5pSGVhZGVySGVpZ2h0ICYmXG4gICAgICAgICAgICB0aGlzLl9wcmV2WSAtIHlQb3NpdGlvbiA+IDAgJiZcbiAgICAgICAgICAgICFyZWFjaGluZ01pbmlIZWFkZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNhcmRIZWlnaHQgPSB0aGlzLmNhcmRNaW5pQ29udGVudEhlaWdodCArIHRoaXMuY2FyZE1pbmlIZWFkZXJIZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLl9wcmV2Q2FyZEhlaWdodFJvd1NwYW4gPSB0aGlzLl9jYXJkSGVpZ2h0Um93U3BhbjtcbiAgICAgICAgICAgIHRoaXMuX2NhcmRIZWlnaHRSb3dTcGFuID0gTWF0aC5mbG9vcih0aGlzLmNhcmRIZWlnaHQgLyB2ZXJ0aWNhbFJlc2l6ZVN0ZXApO1xuICAgICAgICAgICAgdGhpcy5taW5pQ29udGVudFJlYWNoZWQuZW1pdCh0aGlzLmdldFJlc2l6ZWRFdmVudE9iamVjdCgpKTtcbiAgICAgICAgICAgIHRoaXMuX3N0b3BSZXNpemluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hpbGUgY29ybmVyIHJlc2l6ZSwgd2lkdGggbWlnaHQgaGF2ZSBpbmNyZWFzZWQgYW5kIHJlYWNoZWQgdG8gbWluaS1jb250ZW50IGhlaWdodC5cbiAgICAgICAgLy8gc28sIG9uIG1pbmktY29udGVudCByZXNpemUgd2lsbCBzdG9wLCBidXQgaGF2ZSB0byBkbyBzdGVwIHJlc2l6aW5nIGZvciB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbC5cbiAgICAgICAgaWYgKCF0aGlzLl9yZXNpemUpIHtcbiAgICAgICAgICAgIC8vIGluY3JlYXNlL2RlY3JlYXNlIHdpZHRoIG9mIGNhcmQgaW4gb3JkZXIgb2YgMjByZW1cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aGlzLmNhcmRXaWR0aCAtIHRoaXMuX3ByZXZDYXJkV2lkdGgpID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hvcml6b250YWxTdGVwUmVzaXppbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5jcmVhc2UvZGVjcmVhc2UgaGVpZ2h0IG9mIGNhcmQgaW4gb3JkZXIgb2YgMXJlbVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMuY2FyZEhlaWdodCAtIHRoaXMuX3ByZXZDYXJkSGVpZ2h0KSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJ0aWNhbFN0ZXBSZXNpemluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gcmVzZXQgaW52b2x2ZWQgdmFyaWFibGVzIHdoaWxlIHJlc2l6aW5nICovXG4gICAgcHJpdmF0ZSBfc3RvcFJlc2l6aW5nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fcmVzaXplKSB7XG4gICAgICAgICAgICB0aGlzLmNhcmRTdGF0ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUluZGljYXRpb25Cb3JkZXJXaWR0aCA9IDA7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICAgICAgICAgIHRoaXMuc2hvd0JvcmRlciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVkLmVtaXQodGhpcy5nZXRSZXNpemVkRXZlbnRPYmplY3QoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZXR1cm5zIGNhcmRXaWR0aCBiYXNlZCBvbiBjYXJkIGNvbHVtbiBzcGFuICovXG4gICAgcHJpdmF0ZSBfc2V0Q2FyZFdpZHRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhcmRXaWR0aCA9IHRoaXMuX2NhcmRXaWR0aENvbFNwYW4gKiBob3Jpem9udGFsUmVzaXplU3RlcCArICh0aGlzLl9jYXJkV2lkdGhDb2xTcGFuIC0gMSkgKiBnYXA7XG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJldHVybnMgY2FyZEhlaWdodCBiYXNlZCBvbiBjYXJkIHJvdyBzcGFuICovXG4gICAgcHJpdmF0ZSBfc2V0Q2FyZEhlaWdodCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYXJkSGVpZ2h0ID0gdGhpcy5fY2FyZEhlaWdodFJvd1NwYW4gKiB2ZXJ0aWNhbFJlc2l6ZVN0ZXA7XG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJldHVybnMgY2FyZCBtaW5pIGhlYWRlciBoZWlnaHQgKi9cbiAgICBwcml2YXRlIF9zZXRDYXJkTWluaUhlYWRlckhlaWdodCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYXJkTWluaUhlYWRlckhlaWdodCA9IHRoaXMuX2NhcmRNaW5pSGVhZGVyUm93U3BhbiAqIHZlcnRpY2FsUmVzaXplU3RlcDtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gUmV0dXJucyBjYXJkIG1pbmkgY29udGVudCBoZWlnaHQgKi9cbiAgICBwcml2YXRlIF9zZXRDYXJkTWluaUNvbnRlbnRIZWlnaHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FyZE1pbmlDb250ZW50SGVpZ2h0ID0gdGhpcy5jYXJkTWluaUNvbnRlbnRSb3dTcGFuICogdmVydGljYWxSZXNpemVTdGVwO1xuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG59XG5cbi8qKiBDb25maWcgaW50ZXJmYWNlIGZvciBjYXJkIHByb3BlcnRpZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXphYmxlQ2FyZEl0ZW1Db25maWcge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHJhbms/OiBudW1iZXI7XG4gICAgY2FyZFdpZHRoQ29sU3Bhbj86IG51bWJlcjtcbiAgICBjYXJkSGVpZ2h0Um93U3Bhbj86IG51bWJlcjtcbiAgICBjYXJkTWluaUhlYWRlclJvd1NwYW4/OiBudW1iZXI7XG4gICAgY2FyZE1pbmlDb250ZW50Um93U3Bhbj86IG51bWJlcjtcbiAgICByZXNpemFibGU/OiBib29sZWFuO1xufVxuXG4vKiogT2JqZWN0IHRvIGVtaXQgb24gcmVzaXplIGNvbXBsZXRlICovXG5leHBvcnQgY2xhc3MgUmVzaXplZEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBPYmplY3QgdG8gZW1pdCBvbiByZXNpemUgY29tcGxldGVcbiAgICAgKiBAcGFyYW0gY2FyZFxuICAgICAqIEBwYXJhbSBwcmV2Q2FyZFdpZHRoIFByZXZpb3VzIGNhcmQgd2lkdGhcbiAgICAgKiBAcGFyYW0gcHJldkNhcmRIZWlnaHQgUHJldmlvdXMgY2FyZCBoZWlnaHRcbiAgICAgKiBAcGFyYW0gY2FyZFdpZHRoIEN1cnJlbnQgY2FyZCB3aWR0aFxuICAgICAqIEBwYXJhbSBjYXJkSGVpZ2h0IEN1cnJlbnQgY2FyZCBoZWlnaHRcbiAgICAgKiBAcGFyYW0gY2FyZFdpZHRoQ29sU3BhbiBDdXJyZW50IGNhcmQgd2lkdGggY29sdW1uIHNwYW5cbiAgICAgKiBAcGFyYW0gY2FyZEhlaWdodFJvd1NwYW4gQ3VycmVudCBjYXJkIGhlaWdodCByb3cgc3BhblxuICAgICAqIEBwYXJhbSBuZXdDYXJkV2lkdGhDb2xTcGFuIE5ldyBjYXJkIHdpZHRoIGNvbHVtbiBzcGFuXG4gICAgICogQHBhcmFtIG5ld0NhcmRIZWlnaHRSb3dTcGFuIE5ldyBjYXJkIGhlaWdodCByb3cgc3BhblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY2FyZDogUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnQsXG4gICAgICAgIHB1YmxpYyBwcmV2Q2FyZFdpZHRoOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBwcmV2Q2FyZEhlaWdodDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgY2FyZFdpZHRoOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBjYXJkSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBjYXJkV2lkdGhDb2xTcGFuOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBjYXJkSGVpZ2h0Um93U3BhbjogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgbmV3Q2FyZFdpZHRoQ29sU3BhbjogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgbmV3Q2FyZEhlaWdodFJvd1NwYW46IG51bWJlclxuICAgICkge31cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cImZkLXJlc2l6YWJsZS1jYXJkLWxheW91dF9faXRlbVwiXG4gICAgW2NsYXNzLmZkLXJlc2l6YWJsZS1jYXJkLWxheW91dF9faW5kaWNhdGlvbi1ib3JkZXJdPVwic2hvd0JvcmRlclwiXG4gICAgI3Jlc2l6ZUNhcmRcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmQtcmVzaXphYmxlLWNhcmQtbGF5b3V0X19pdGVtLS1ib3JkZXItZGlzcGxheSBmZC1yZXNpemFibGUtY2FyZC1sYXlvdXRfX2l0ZW0tLXJlc2l6ZS10cmFuc2l0aW9uXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNhcmRXaWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiY2FyZEhlaWdodFwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInNob3dSZXNpemVJY29uKClcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJoaWRlUmVzaXplSWNvbigpXCJcbiAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmZC1yZXNpemFibGUtY2FyZC1sYXlvdXRfX2NhcmRcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgIEBpZiAoc2hvd2luZ1Jlc2l6ZUljb24pIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmQtcmVzaXphYmxlLWNhcmQtbGF5b3V0X19pY29uLXdyYXBwZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtcmVzaXphYmxlLWNhcmQtbGF5b3V0X19pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICNjb3JuZXJIYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50LCAnYm90aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChyZXNpemFibGUpIHtcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ2ZXJ0aWNhbEhhbmRsZVRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJob3Jpem9udGFsSGFuZGxlVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZkLXJlc2l6YWJsZS1jYXJkLWxheW91dF9faXRlbS0tcmVzaXplLXRyYW5zaXRpb25cIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwicmVzaXplSW5kaWNhdGlvbkJvcmRlcldpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjYXJkSGVpZ2h0XCJcbiAgICA+PC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjdmVydGljYWxIYW5kbGVUZW1wbGF0ZT5cbiAgICA8ZGl2XG4gICAgICAgICN2ZXJ0aWNhbEhhbmRsZVxuICAgICAgICBjbGFzcz1cImZkLXJlc2l6YWJsZS1jYXJkLWxheW91dF9fcmVzaXplLS12ZXJ0aWNhbFwiXG4gICAgICAgIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50LCAnaG9yaXpvbnRhbCcpXCJcbiAgICA+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNob3Jpem9udGFsSGFuZGxlVGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgICAjaG9yaXpvbnRhbEhhbmRsZVxuICAgICAgICBjbGFzcz1cImZkLXJlc2l6YWJsZS1jYXJkLWxheW91dF9fcmVzaXplLS1ob3Jpem9udGFsXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQsICd2ZXJ0aWNhbCcpXCJcbiAgICA+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19","import { FocusKeyManager } from '@angular/cdk/a11y';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, DestroyRef, ElementRef, EventEmitter, HostListener, Input, Optional, Output, QueryList, ViewEncapsulation, computed, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RtlService } from '@fundamental-ngx/cdk/utils';\nimport { ResizableCardItemComponent, gap, horizontalResizeOffset, horizontalResizeStep, verticalResizeStep } from './resizable-card-item/resizable-card-item.component';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@fundamental-ngx/cdk/utils\";\nexport class ResizableCardLayoutComponent {\n /** @hidden */\n constructor(_cd, elementRef, _rtlService) {\n this._cd = _cd;\n this.elementRef = elementRef;\n this._rtlService = _rtlService;\n /** Emits when card resize is reached to one new step in horizontal or vertical direction */\n this.stepChange = new EventEmitter();\n /** Emits when card is still resizing */\n this.resizing = new EventEmitter();\n /** Emits when card resize is completed */\n this.resized = new EventEmitter();\n /** Emits when card height is reduced to show only header */\n this.miniHeaderReached = new EventEmitter();\n /** Emits when minimum height of card content area is reached */\n this.miniContentReached = new EventEmitter();\n /** Emits when layout changes */\n this.layoutChange = new EventEmitter();\n /** @hidden */\n this._destroyRef = inject(DestroyRef);\n /** @hidden */\n this._layoutShifted = false;\n /** @hidden */\n this._directionPosition$ = computed(() => (this._rtlService?.rtlSignal() ? 'right' : 'left'), ...(ngDevMode ? [{ debugName: \"_directionPosition$\" }] : []));\n }\n /** @hidden handles keyboard accessibility */\n _handleKeydown(event) {\n event.stopImmediatePropagation();\n if (!this._keyboardEventsManager.activeItemIndex) {\n this._keyboardEventsManager.setFirstItemActive();\n }\n if (this._keyboardEventsManager) {\n this._keyboardEventsManager.onKeydown(event);\n }\n }\n /** @hidden */\n onResize() {\n this._createLayout();\n }\n /** @hidden */\n ngOnInit() {\n this._columnsHeight = new Array(this._columns);\n this._columnsHeight.fill(0);\n // initialise value 0\n // detect initial window size and set layout\n this._createLayout();\n }\n /** @hidden */\n ngAfterContentInit() {\n this._initialSetup();\n // listen for query-list change\n this.resizeCardItems?.forEach((card) => {\n card?.verifyUpdateCardWidth(this.layoutSize);\n });\n this.resizeCardItems.changes.subscribe(() => {\n this.arrangeCards(this.resizeCardItems?.toArray());\n });\n this.arrangeCards(this.resizeCardItems?.toArray());\n this._cd.markForCheck();\n }\n /** @hidden */\n ngAfterViewInit() {\n this._accessibilitySetup();\n }\n /** @hidden */\n ngOnDestroy() {\n this._keyboardEventsManager?.destroy();\n }\n /** Layout size. Available options are 'sm', 'md', 'lg' and 'xl' */\n set layoutSize(layoutSize) {\n this._layout = layoutSize;\n }\n get layoutSize() {\n return this._layout;\n }\n /**\n * Arranges cards in layout based on rank, width and height of card\n * @param cards Array of ResizableCardItemComponent\n */\n arrangeCards(cards) {\n this._columnsHeight = new Array(this._columns);\n this._columnsHeight.fill(0);\n // sort based on the card rank\n this._sortedCards = cards?.sort(this._sortCards);\n this._sortedCards?.forEach((card, index) => {\n this._setCardPositionValues(card, index);\n this._updateColumnsHeight(card);\n });\n this.layoutHeight = Math.max.apply(null, this._columnsHeight) + verticalResizeStep;\n this._emitLayoutChange();\n this._cd.markForCheck();\n }\n /**\n * Handles shifting of cards with animation, while card is still resizing.\n * @param event {ResizedEvent}\n */\n cardResizing(event) {\n this.resizing.emit(event);\n this._handleHorizontalResize(event);\n this._handleVerticalResize(event);\n }\n /**\n * Handles arrangement of cards in layout\n * @param event {ResizedEvent}\n */\n cardResizeComplete(event) {\n this._layoutShifted = false;\n this.arrangeCards(this.resizeCardItems.toArray());\n this.resized.emit(event);\n }\n /** @hidden */\n updateLayout() {\n this.resizeCardItems?.forEach((card) => {\n card?.verifyUpdateCardWidth(this.layoutSize);\n });\n this.arrangeCards(this.resizeCardItems?.toArray());\n }\n /**\n * method to get screen width\n * @returns Window width in px\n */\n getWidthAvailable() {\n return window.innerWidth;\n }\n /** @hidden Subscribe to events from items */\n _initialSetup() {\n // listen for resizing event of card item\n this.resizeCardItems?.forEach((resizeCardItem, index) => {\n if (this.layoutConfig && this.layoutConfig.length >= index + 1) {\n resizeCardItem.config = this.layoutConfig[index];\n }\n resizeCardItem.resizing\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event) => this.cardResizing(event));\n // listen for resize complete event of card item\n resizeCardItem.resized\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event) => this.cardResizeComplete(event));\n // listen for mini-header height event of card item\n resizeCardItem.miniHeaderReached\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event) => {\n this.miniHeaderReached.emit(event);\n this.stepChange.emit(event);\n });\n // listen for mini-content height event of card item\n resizeCardItem.miniContentReached\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event) => {\n this.miniContentReached.emit(event);\n this.stepChange.emit(event);\n });\n });\n }\n /** @hidden */\n _accessibilitySetup() {\n this._keyboardEventsManager?.destroy();\n this._keyboardEventsManager = new FocusKeyManager(this.resizeCardItems).withWrap();\n }\n /** @hidden create layout based on layout size */\n _createLayout() {\n const screenWidth = this.getWidthAvailable();\n const prevLayoutSize = this.layoutSize;\n if (screenWidth > 0 && screenWidth <= 656 && prevLayoutSize !== 'sm') {\n this.layoutSize = 'sm';\n this._setLayoutColumns(this.layoutSize);\n this.updateLayout();\n }\n else if (screenWidth > 656 && screenWidth <= 975 && prevLayoutSize !== 'md') {\n this.layoutSize = 'md';\n this._setLayoutColumns(this.layoutSize);\n this.updateLayout();\n }\n else if (screenWidth > 975 && screenWidth <= 1359 && prevLayoutSize !== 'lg') {\n this.layoutSize = 'lg';\n this._setLayoutColumns(this.layoutSize);\n this.updateLayout();\n }\n else if (screenWidth > 1359 && prevLayoutSize !== 'xl') {\n this.layoutSize = 'xl';\n this._setLayoutColumns(this.layoutSize);\n this.updateLayout();\n }\n }\n /** @hidden Emit layoutChange event with updated card dimensions */\n _emitLayoutChange() {\n const latestCardConfig = [];\n this.resizeCardItems?.forEach((card) => {\n const cardConfig = {};\n cardConfig.cardWidthColSpan = card.cardWidthColSpan;\n cardConfig.cardHeightRowSpan = card.cardHeightRowSpan;\n cardConfig.rank = card.rank;\n cardConfig.title = card.title;\n cardConfig.cardMiniContentRowSpan = card.cardMiniContentRowSpan;\n cardConfig.cardMiniHeaderRowSpan = card.cardMiniHeaderRowSpan;\n cardConfig.resizable = card.resizable;\n latestCardConfig.push(cardConfig);\n });\n this.layoutChange.emit(latestCardConfig);\n }\n /**\n * @hidden Sets number of column in layout, based on LayoutSize passed\n * @param layoutSize {'sm' | 'md' | 'lg' | 'xl'}\n */\n _setLayoutColumns(layoutSize) {\n let layoutWidthDefault;\n switch (layoutSize) {\n case 'sm':\n this._columns = 1;\n this._paddingLeft = 8;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault;\n break;\n case 'md':\n this._columns = 2;\n this._paddingLeft = 16;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault + gap;\n break;\n case 'lg':\n this._columns = 3;\n this._paddingLeft = 16;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault + 2 * gap;\n break;\n case 'xl':\n this._columns = 4;\n this._paddingLeft = 48;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault + 3 * gap;\n break;\n default:\n this._columns = 4;\n this._paddingLeft = 48;\n layoutWidthDefault = this._columns * horizontalResizeStep + 2 * this._paddingLeft;\n this.layoutWidth = layoutWidthDefault + 3 * gap;\n }\n }\n /**\n * @hidden Method to handle card vertical resize and trigger the layout change\n * @param event {ResizedEvent}\n */\n _handleVerticalResize(event) {\n if (event.card.cardHeightRowSpan !== event.card.previousCardHeightRowSpan) {\n this.arrangeCards(this._sortedCards);\n this._cd.markForCheck();\n this.stepChange.emit(event.card.getResizedEventObject());\n }\n }\n /**\n * @hidden Method to handle card horizontal resize and trigger the layout change\n * @param event {ResizedEvent}\n */\n _handleHorizontalResize(event) {\n // when increasing width hit the offset, show extended border and start pushing down border cards\n // when width is decreasing , show extended border till it reaches to offset.\n const cardWidthChange = event.cardWidth - event.prevCardWidth;\n const currentResizingItemIndex = this._sortedCards?.findIndex((x) => x.rank === event.card.rank);\n if (event.cardWidth > event.prevCardWidth) {\n // when increasing size\n // card width increasing currently\n if (event.card.cardState === 1 && cardWidthChange > horizontalResizeOffset + gap && !this._layoutShifted) {\n // index of this card, then get next card. exchange ranks\n this._sortedCards.forEach((card, index) => {\n if (index > currentResizingItemIndex) {\n // if there are some cards on same height. make the current card rank higher than these.\n // otherwise next index where it will fit. until any card has less column span than total columns\n // if only in next top, one card is taking full columns\n if (card.startingColumnPosition + card.cardWidthColSpan === this._columns &&\n card.cardWidthColSpan !== this._columns) {\n // get cards with top > current top , but minimum of it\n // exchange rank with these card\n this._moveCardDown(index);\n }\n }\n });\n this._layoutShifted = true;\n this.arrangeCards(this._sortedCards);\n this.stepChange.emit(event.card.getResizedEventObject());\n }\n else if (event.card.cardState === -1 &&\n cardWidthChange < horizontalResizeOffset + gap &&\n this._layoutShifted) {\n // card width decreasing currently\n // move up the cards, if it was shifted while increasing the width\n this._sortedCards.forEach((card) => {\n card.rank = card.prevRank ? card.prevRank : card.rank;\n card.prevRank = 0;\n });\n this._layoutShifted = false;\n this.arrangeCards(this._sortedCards);\n this.stepChange.emit(event.card.getResizedEventObject());\n }\n }\n else if (event.cardWidth < event.prevCardWidth) {\n // when decreasing size\n if (event.card.cardState === -1 && -cardWidthChange > horizontalResizeOffset && !this._layoutShifted) {\n // card width decreasing currently\n this._layoutShifted = true;\n this.arrangeCards(this._sortedCards);\n this.stepChange.emit(event.card.getResizedEventObject());\n }\n else if (event.card.cardState === 1 && -cardWidthChange < horizontalResizeOffset && this._layoutShifted) {\n // card width increasing currently\n this._layoutShifted = false;\n this.arrangeCards(this._sortedCards);\n this.stepChange.emit(event.card.getResizedEventObject());\n }\n }\n }\n /**\n * @hidden Method to move card down, when another card width is increasing\n * Method to loop till this._columns -1 positions and exchange the rank\n * @param currentCardIndex Index of current card\n */\n _moveCardDown(currentCardIndex) {\n // taking width of adjacent card col-span into account\n // eg: 4 columns - 2 col(adjacent card) = 2 positions can exchange ranks\n const currentCard = this._sortedCards[currentCardIndex];\n let card;\n // unoccupiedPositions positions left after currentCard occupies in next row.\n let unoccupiedPositions = this._columns - currentCard.cardWidthColSpan;\n currentCard.prevRank = currentCard.rank;\n let index = 1;\n while (unoccupiedPositions > 0) {\n // compare from next card\n card = this._sortedCards[index + currentCardIndex];\n if (card && unoccupiedPositions >= card.cardWidthColSpan) {\n card.prevRank = card.rank;\n card.rank -= 1;\n currentCard.rank = card.prevRank;\n unoccupiedPositions -= card.cardWidthColSpan;\n }\n else {\n unoccupiedPositions = 0;\n }\n index += 1;\n }\n }\n /**\n * @hidden updates array with new column heights\n * @param card {ResizableCardItemComponent}\n */\n _updateColumnsHeight(card) {\n const directionPosition = this._directionPosition$();\n const columnsStart = card[directionPosition] != null ? Math.floor(card[directionPosition] / horizontalResizeStep) : 0;\n // Get width of current card resizing and assign width here for that card\n const cardBaseColSpan = Math.floor(card.cardWidth / horizontalResizeStep);\n // till which columns card spans\n const columnsSpan = card.cardWidth - cardBaseColSpan * horizontalResizeStep - cardBaseColSpan * gap > horizontalResizeOffset\n ? cardBaseColSpan + 1\n : cardBaseColSpan;\n const columnHeight = card.cardHeight + card.top;\n for (let i = 0; i < columnsSpan; i++) {\n this._columnsHeight[i + columnsStart] = columnHeight;\n }\n if (columnsStart === columnsSpan) {\n this._columnsHeight[columnsStart] = columnHeight;\n }\n }\n /**\n * @hidden Try to set card at available heights\n * @param card ResizableCardItemComponent\n * @param index value of card in array of ResizableCardItemComponent\n */\n _setCardPositionValues(card, index) {\n const directionPosition = this._directionPosition$();\n if (index === 0) {\n card[directionPosition] = Number(this._paddingLeft);\n card.top = 0;\n card.startingColumnPosition = 0;\n return;\n }\n const uniqueHeights = this._getSortedUniqueHeights();\n let cardPositioned = false;\n for (let i = 0; i < uniqueHeights.length && !cardPositioned; i++) {\n cardPositioned = this._isPositionSetSuccess(uniqueHeights[i], card);\n }\n }\n /**\n * @hidden try to set card at given height.\n * @param height height at which card is getting positioned.\n * @param card ResizableCardItemComponent\n * @returns It returns true when card position id found otherwise it returns false.\n */\n _isPositionSetSuccess(height, card) {\n const directionPosition = this._directionPosition$();\n const columnPositions = [];\n let index = 0;\n for (const columnHeight of this._columnsHeight) {\n index++;\n if (columnHeight === height) {\n columnPositions.push(index);\n }\n }\n // check for each card position, starting from leftmost\n let isFitting = false;\n // try to fit as left (or right if Rtl) as possible from the column position\n const startingColumnPosition = this._fitCardColumnPosition(card, columnPositions, height);\n if (startingColumnPosition !== -1) {\n isFitting = true;\n card[directionPosition] =\n startingColumnPosition * horizontalResizeStep +\n this._paddingLeft +\n (startingColumnPosition > 0 ? gap * startingColumnPosition : 0);\n card.top = height + (height > 0 ? verticalResizeStep : 0);\n card.startingColumnPosition = startingColumnPosition;\n }\n return isFitting;\n }\n /**\n * @hidden Try to start card position from left most fit position.\n * @param card ResizableCardItemComponent\n * @param columnPositions {Array<number>} Array of available positions for cards.\n * @param height {number} height at which fixing the card\n * @returns {number} returns starting column position where card will fit.\n */\n _fitCardColumnPosition(card, columnPositions, height) {\n // check for each card position, starting from leftmost\n let isFitting = false;\n let startingColumnPosition = -1;\n // start from previous indexes\n const cardBaseColSpan = Math.floor(card.cardWidth / horizontalResizeStep);\n const cardColSpan = card.cardWidth - cardBaseColSpan * horizontalResizeStep - cardBaseColSpan * gap > horizontalResizeOffset\n ? cardBaseColSpan + 1\n : cardBaseColSpan;\n // try to set towards left from available card position\n // eg. [1, 2, 3, 4] columnsPositions\n for (const columnPosition of columnPositions) {\n if (isFitting) {\n break;\n }\n // startingPosition values will be 1, 2, 3, 4\n // try to fit as left as possible\n let startingPosition = columnPosition - (cardColSpan - 1);\n startingPosition = startingPosition > 0 ? startingPosition : 1;\n for (let index = startingPosition; index <= columnPosition && !isFitting; index++) {\n for (let span = 0; span < cardColSpan; span++) {\n if (this._columnsHeight[index + span - 1] <= height && cardColSpan + index - 1 <= this._columns) {\n isFitting = true;\n startingColumnPosition = index - 1;\n }\n else {\n isFitting = false;\n startingColumnPosition = -1;\n break;\n }\n }\n }\n }\n return startingColumnPosition;\n }\n /** @hidden returns sorted unique height of columns */\n _getSortedUniqueHeights() {\n const tempArray = this._columnsHeight.slice();\n const sortedColumnsHeightArray = tempArray.sort(comparer);\n const uniqueHeights = [];\n for (const sortedHeight of sortedColumnsHeightArray) {\n if (uniqueHeights.indexOf(sortedHeight) === -1) {\n uniqueHeights.push(sortedHeight);\n }\n }\n function comparer(first, second) {\n return first - second;\n }\n return uniqueHeights;\n }\n /**\n * @hidden Comparator to sort card based on rank.\n * @param firstCard ResizableCardItemComponent\n * @param secondCard ResizableCardItemComponent\n * @returns : returns difference between first card rank and other card rank.\n */\n _sortCards(firstCard, secondCard) {\n return firstCard.rank - secondCard.rank;\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: ResizableCardLayoutComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.RtlService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.4\", type: ResizableCardLayoutComponent, isStandalone: true, selector: \"fd-resizable-card-layout\", inputs: { layoutConfig: \"layoutConfig\" }, outputs: { stepChange: \"stepChange\", resizing: \"resizing\", resized: \"resized\", miniHeaderReached: \"miniHeaderReached\", miniContentReached: \"miniContentReached\", layoutChange: \"layoutChange\" }, host: { listeners: { \"keydown\": \"_handleKeydown($event)\", \"window:resize\": \"onResize()\" } }, queries: [{ propertyName: \"resizeCardItems\", predicate: ResizableCardItemComponent }], ngImport: i0, template: \"<div\\n #layout\\n class=\\\"fd-resizable-card-layout\\\"\\n [class]=\\\"'fd-resizable-card-layout--' + layoutSize\\\"\\n [style.width.px]=\\\"layoutWidth\\\"\\n [style.height.px]=\\\"layoutHeight\\\"\\n>\\n <ng-content></ng-content>\\n</div>\\n\", styles: [\".fd-resizable-card-layout{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;margin-top:1rem;padding-block:0;padding-inline:0;padding-inline:.5rem;position:relative}.fd-resizable-card-layout:after,.fd-resizable-card-layout:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__item{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;min-width:20rem;position:relative}.fd-resizable-card-layout__item:after,.fd-resizable-card-layout__item:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__card{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:1;-ms-flex:1;flex:1;height:calc(100% - .0625rem);position:relative}.fd-resizable-card-layout__card:after,.fd-resizable-card-layout__card:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon-wrapper{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.5rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1.5rem;padding-block:0;padding-inline:0;width:1.5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;bottom:-.35rem;justify-content:flex-start;position:absolute;right:0;z-index:2}.fd-resizable-card-layout__icon-wrapper:after,.fd-resizable-card-layout__icon-wrapper:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon-wrapper[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon-wrapper{bottom:-.125rem;left:-.25rem;right:auto}.fd-resizable-card-layout__icon{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1rem;padding-block:0;padding-inline:0;width:1rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--sapButton_Lite_TextColor);cursor:nwse-resize;font-family:SAP-icons;font-size:1rem;height:100%;line-height:1rem;position:absolute;width:100%;z-index:2}.fd-resizable-card-layout__icon:after,.fd-resizable-card-layout__icon:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon:before{content:\\\"\\\\e24f\\\";font-family:SAP-icons;height:100%;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;width:100%}.fd-resizable-card-layout__icon[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon{cursor:nesw-resize;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fd-resizable-card-layout__icon--vertical,.fd-resizable-card-layout__icon--vertical[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon--vertical{cursor:ns-resize}.fd-resizable-card-layout__icon--horizontal,.fd-resizable-card-layout__icon--horizontal[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon--horizontal{cursor:ew-resize}.fd-resizable-card-layout__resize--vertical{-webkit-box-ordinal-group:3;-ms-flex-order:2;cursor:ew-resize;order:2;width:.0625rem;z-index:2}.fd-resizable-card-layout__resize--vertical::content{content:\\\"\\\";position:absolute}.fd-resizable-card-layout__resize--horizontal{bottom:0;cursor:ns-resize;height:.0625rem;position:absolute;width:calc(100% - .5rem);z-index:2}.fd-resizable-card-layout__indication-border{border:0;border:.125rem dashed var(--sapContent_DragAndDropActiveColor);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-resizable-card-layout__indication-border:after,.fd-resizable-card-layout__indication-border:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout--sm{padding-inline:.5rem}.fd-resizable-card-layout--lg,.fd-resizable-card-layout--md{padding-inline:1rem}.fd-resizable-card-layout--xl{padding-inline:3rem}fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper{right:0}[dir=rtl] fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper,fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper[dir=rtl]{right:auto;left:-.375rem;bottom:0}fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper .fd-resizable-card-layout__icon{width:100%;height:100%}fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper .fd-resizable-card-layout__icon:before{width:100%;height:100%}\\n/*! Bundled license information:\\n\\nfundamental-styles/dist/resizable-card-layout.css:\\n (*!\\n * Fundamental Library Styles v0.40.1\\n * Copyright (c) 2025 SAP SE or an SAP affiliate company.\\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\\n *)\\n*/\\n\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: ResizableCardLayoutComponent, decorators: [{\n type: Component,\n args: [{ selector: 'fd-resizable-card-layout', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, template: \"<div\\n #layout\\n class=\\\"fd-resizable-card-layout\\\"\\n [class]=\\\"'fd-resizable-card-layout--' + layoutSize\\\"\\n [style.width.px]=\\\"layoutWidth\\\"\\n [style.height.px]=\\\"layoutHeight\\\"\\n>\\n <ng-content></ng-content>\\n</div>\\n\", styles: [\".fd-resizable-card-layout{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;margin-top:1rem;padding-block:0;padding-inline:0;padding-inline:.5rem;position:relative}.fd-resizable-card-layout:after,.fd-resizable-card-layout:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__item{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;min-width:20rem;position:relative}.fd-resizable-card-layout__item:after,.fd-resizable-card-layout__item:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__card{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:1;-ms-flex:1;flex:1;height:calc(100% - .0625rem);position:relative}.fd-resizable-card-layout__card:after,.fd-resizable-card-layout__card:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon-wrapper{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.5rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1.5rem;padding-block:0;padding-inline:0;width:1.5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;bottom:-.35rem;justify-content:flex-start;position:absolute;right:0;z-index:2}.fd-resizable-card-layout__icon-wrapper:after,.fd-resizable-card-layout__icon-wrapper:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon-wrapper[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon-wrapper{bottom:-.125rem;left:-.25rem;right:auto}.fd-resizable-card-layout__icon{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1rem;padding-block:0;padding-inline:0;width:1rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--sapButton_Lite_TextColor);cursor:nwse-resize;font-family:SAP-icons;font-size:1rem;height:100%;line-height:1rem;position:absolute;width:100%;z-index:2}.fd-resizable-card-layout__icon:after,.fd-resizable-card-layout__icon:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout__icon:before{content:\\\"\\\\e24f\\\";font-family:SAP-icons;height:100%;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;width:100%}.fd-resizable-card-layout__icon[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon{cursor:nesw-resize;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fd-resizable-card-layout__icon--vertical,.fd-resizable-card-layout__icon--vertical[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon--vertical{cursor:ns-resize}.fd-resizable-card-layout__icon--horizontal,.fd-resizable-card-layout__icon--horizontal[dir=rtl],[dir=rtl] .fd-resizable-card-layout__icon--horizontal{cursor:ew-resize}.fd-resizable-card-layout__resize--vertical{-webkit-box-ordinal-group:3;-ms-flex-order:2;cursor:ew-resize;order:2;width:.0625rem;z-index:2}.fd-resizable-card-layout__resize--vertical::content{content:\\\"\\\";position:absolute}.fd-resizable-card-layout__resize--horizontal{bottom:0;cursor:ns-resize;height:.0625rem;position:absolute;width:calc(100% - .5rem);z-index:2}.fd-resizable-card-layout__indication-border{border:0;border:.125rem dashed var(--sapContent_DragAndDropActiveColor);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-resizable-card-layout__indication-border:after,.fd-resizable-card-layout__indication-border:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-resizable-card-layout--sm{padding-inline:.5rem}.fd-resizable-card-layout--lg,.fd-resizable-card-layout--md{padding-inline:1rem}.fd-resizable-card-layout--xl{padding-inline:3rem}fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper{right:0}[dir=rtl] fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper,fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper[dir=rtl]{right:auto;left:-.375rem;bottom:0}fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper .fd-resizable-card-layout__icon{width:100%;height:100%}fd-resizable-card-item .fd-resizable-card-layout__icon-wrapper .fd-resizable-card-layout__icon:before{width:100%;height:100%}\\n/*! Bundled license information:\\n\\nfundamental-styles/dist/resizable-card-layout.css:\\n (*!\\n * Fundamental Library Styles v0.40.1\\n * Copyright (c) 2025 SAP SE or an SAP affiliate company.\\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\\n *)\\n*/\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.RtlService, decorators: [{\n type: Optional\n }] }], propDecorators: { layoutConfig: [{\n type: Input\n }], stepChange: [{\n type: Output\n }], resizing: [{\n type: Output\n }], resized: [{\n type: Output\n }], miniHeaderReached: [{\n type: Output\n }], miniContentReached: [{\n type: Output\n }], layoutChange: [{\n type: Output\n }], resizeCardItems: [{\n type: ContentChildren,\n args: [ResizableCardItemComponent]\n }], _handleKeydown: [{\n type: HostListener,\n args: ['keydown', ['$event']]\n }], onResize: [{\n type: HostListener,\n args: ['window:resize']\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLWNhcmQtbGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9yZXNpemFibGUtY2FyZC1sYXlvdXQvcmVzaXphYmxlLWNhcmQtbGF5b3V0L3Jlc2l6YWJsZS1jYXJkLWxheW91dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvcmVzaXphYmxlLWNhcmQtbGF5b3V0L3Jlc2l6YWJsZS1jYXJkLWxheW91dC9yZXNpemFibGUtY2FyZC1sYXlvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFHSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUNILDBCQUEwQixFQUcxQixHQUFHLEVBQ0gsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDckIsTUFBTSxxREFBcUQsQ0FBQzs7O0FBYTdELE1BQU0sT0FBTyw0QkFBNEI7SUFrRXJDLGNBQWM7SUFDZCxZQUNxQixHQUFzQixFQUN2QixVQUFzQixFQUNULFdBQXVCO1FBRm5DLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3ZCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDVCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtR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QUM7UUFDMUIsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLFVBQVUsQ0FBQyxTQUFxQyxFQUFFLFVBQXNDO1FBQzVGLE9BQU8sU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQzVDLENBQUM7OEdBcGtCUSw0QkFBNEI7a0dBQTVCLDRCQUE0Qiw0YkE4QnBCLDBCQUEwQiw2QkM1RS9DLGdQQVNBOzsyRkRxQ2EsNEJBQTRCO2tCQVJ4QyxTQUFTOytCQUNJLDBCQUEwQixtQkFHbkIsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJOzswQkF3RVgsUUFBUTt5Q0FuRWIsWUFBWTtzQkFEWCxLQUFLO2dCQUtOLFVBQVU7c0JBRFQsTUFBTTtnQkFLUCxRQUFRO3NCQURQLE1BQU07Z0JBS1AsT0FBTztzQkFETixNQUFNO2dCQUtQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFLUCxrQkFBa0I7c0JBRGpCLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtQLGVBQWU7c0JBRGQsZUFBZTt1QkFBQywwQkFBMEI7Z0JBNkMzQyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWNuQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzS2V5TWFuYWdlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIGNvbXB1dGVkLFxuICAgIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgUnRsU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7XG4gICAgUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnQsXG4gICAgUmVzaXphYmxlQ2FyZEl0ZW1Db25maWcsXG4gICAgUmVzaXplZEV2ZW50LFxuICAgIGdhcCxcbiAgICBob3Jpem9udGFsUmVzaXplT2Zmc2V0LFxuICAgIGhvcml6b250YWxSZXNpemVTdGVwLFxuICAgIHZlcnRpY2FsUmVzaXplU3RlcFxufSBmcm9tICcuL3Jlc2l6YWJsZS1jYXJkLWl0ZW0vcmVzaXphYmxlLWNhcmQtaXRlbS5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBMYXlvdXRTaXplID0gJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJztcbmV4cG9ydCB0eXBlIFJlc2l6YWJsZUNhcmRMYXlvdXRDb25maWcgPSBBcnJheTxSZXNpemFibGVDYXJkSXRlbUNvbmZpZz47XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmQtcmVzaXphYmxlLWNhcmQtbGF5b3V0JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3Jlc2l6YWJsZS1jYXJkLWxheW91dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL3Jlc2l6YWJsZS1jYXJkLWxheW91dC5jb21wb25lbnQuc2NzcycsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFJlc2l6YWJsZUNhcmRMYXlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqIE9iamVjdCBmb3Igc2V0dGluZyBlYWNoIGNhcmQgcHJvcGVydHkgKi9cbiAgICBASW5wdXQoKVxuICAgIGxheW91dENvbmZpZzogUmVzaXphYmxlQ2FyZExheW91dENvbmZpZztcblxuICAgIC8qKiBFbWl0cyB3aGVuIGNhcmQgcmVzaXplIGlzIHJlYWNoZWQgdG8gb25lIG5ldyBzdGVwIGluIGhvcml6b250YWwgb3IgdmVydGljYWwgZGlyZWN0aW9uICovXG4gICAgQE91dHB1dCgpXG4gICAgc3RlcENoYW5nZTogRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIGNhcmQgaXMgc3RpbGwgcmVzaXppbmcgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZXNpemluZzogRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIGNhcmQgcmVzaXplIGlzIGNvbXBsZXRlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlc2l6ZWQ6IEV2ZW50RW1pdHRlcjxSZXNpemVkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZXNpemVkRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBjYXJkIGhlaWdodCBpcyByZWR1Y2VkIHRvIHNob3cgb25seSBoZWFkZXIgKi9cbiAgICBAT3V0cHV0KClcbiAgICBtaW5pSGVhZGVyUmVhY2hlZDogRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlc2l6ZWRFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIG1pbmltdW0gaGVpZ2h0IG9mIGNhcmQgY29udGVudCBhcmVhIGlzIHJlYWNoZWQgKi9cbiAgICBAT3V0cHV0KClcbiAgICBtaW5pQ29udGVudFJlYWNoZWQ6IEV2ZW50RW1pdHRlcjxSZXNpemVkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZXNpemVkRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBsYXlvdXQgY2hhbmdlcyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGxheW91dENoYW5nZTogRXZlbnRFbWl0dGVyPFJlc2l6YWJsZUNhcmRMYXlvdXRDb25maWc+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZXNpemFibGVDYXJkTGF5b3V0Q29uZmlnPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAQ29udGVudENoaWxkcmVuKFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50KVxuICAgIHJlc2l6ZUNhcmRJdGVtczogUXVlcnlMaXN0PFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50PjtcblxuICAgIC8qKiB3aWR0aCBmb3IgbGF5b3V0ICovXG4gICAgbGF5b3V0V2lkdGg6IG51bWJlcjtcblxuICAgIC8qKiBoZWlnaHQgZm9yIGxheW91dCAqL1xuICAgIGxheW91dEhlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gTnVtYmVyIG9mIGNvbHVtbnMgaW4gbGF5b3V0LiBjb25zaWRlcmluZyAxIGNvbHVtbiB3aWR0aCAyMHJlbSAqL1xuICAgIHByaXZhdGUgX2NvbHVtbnM6IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuIExheW91dCBwYWRkaW5nLiB3aWxsIGJlIGFkZGVkIHRvIGZpcnN0IGNhcmQgcGFkZGluZyBpbiBldmVyeSByb3cgKi9cbiAgICBwcml2YXRlIF9wYWRkaW5nTGVmdDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gU3RvcmVzIGhlaWdodCBvZiBlYWNoIGNvbHVtbiBvbiBjYXJkIGFycmFuZ2VtZW50ICovXG4gICAgcHJpdmF0ZSBfY29sdW1uc0hlaWdodDogQXJyYXk8bnVtYmVyPjtcblxuICAgIC8qKiBAaGlkZGVuIEF2YWlsYWJsZSBzY3JlZW4gbGF5b3V0ICovXG4gICAgcHJpdmF0ZSBfbGF5b3V0OiBMYXlvdXRTaXplO1xuXG4gICAgLyoqIEBoaWRkZW4gU3RvcmVzIHNvcnRlZCBjYXJkIGJlZm9yZSBwbGFjaW5nIGluIGxheW91dCAqL1xuICAgIHByaXZhdGUgX3NvcnRlZENhcmRzOiBBcnJheTxSZXNpemFibGVDYXJkSXRlbUNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBGb2N1c0tleU1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIF9rZXlib2FyZEV2ZW50c01hbmFnZXI6IEZvY3VzS2V5TWFuYWdlcjxSZXNpemFibGVDYXJkSXRlbUNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xheW91dFNoaWZ0ZWQgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGlyZWN0aW9uUG9zaXRpb24kID0gY29tcHV0ZWQ8J2xlZnQnIHwgJ3JpZ2h0Jz4oKCkgPT4gKHRoaXMuX3J0bFNlcnZpY2U/LnJ0bFNpZ25hbCgpID8gJ3JpZ2h0JyA6ICdsZWZ0JykpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfcnRsU2VydmljZTogUnRsU2VydmljZVxuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuIGhhbmRsZXMga2V5Ym9hcmQgYWNjZXNzaWJpbGl0eSAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIF9oYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoIXRoaXMuX2tleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzTWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9rZXlib2FyZEV2ZW50c01hbmFnZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzTWFuYWdlci5vbktleWRvd24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlTGF5b3V0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29sdW1uc0hlaWdodCA9IG5ldyBBcnJheSh0aGlzLl9jb2x1bW5zKTtcbiAgICAgICAgdGhpcy5fY29sdW1uc0hlaWdodC5maWxsKDApO1xuICAgICAgICAvLyBpbml0aWFsaXNlIHZhbHVlIDBcbiAgICAgICAgLy8gZGV0ZWN0IGluaXRpYWwgd2luZG93IHNpemUgYW5kIHNldCBsYXlvdXRcbiAgICAgICAgdGhpcy5fY3JlYXRlTGF5b3V0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxTZXR1cCgpO1xuICAgICAgICAvLyBsaXN0ZW4gZm9yIHF1ZXJ5LWxpc3QgY2hhbmdlXG4gICAgICAgIHRoaXMucmVzaXplQ2FyZEl0ZW1zPy5mb3JFYWNoKChjYXJkKSA9PiB7XG4gICAgICAgICAgICBjYXJkPy52ZXJpZnlVcGRhdGVDYXJkV2lkdGgodGhpcy5sYXlvdXRTaXplKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNpemVDYXJkSXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hcnJhbmdlQ2FyZHModGhpcy5yZXNpemVDYXJkSXRlbXM/LnRvQXJyYXkoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFycmFuZ2VDYXJkcyh0aGlzLnJlc2l6ZUNhcmRJdGVtcz8udG9BcnJheSgpKTtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlTZXR1cCgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzTWFuYWdlcj8uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8qKiBMYXlvdXQgc2l6ZS4gQXZhaWxhYmxlIG9wdGlvbnMgYXJlICdzbScsICdtZCcsICdsZycgYW5kICd4bCcgKi9cbiAgICBzZXQgbGF5b3V0U2l6ZShsYXlvdXRTaXplOiBMYXlvdXRTaXplKSB7XG4gICAgICAgIHRoaXMuX2xheW91dCA9IGxheW91dFNpemU7XG4gICAgfVxuICAgIGdldCBsYXlvdXRTaXplKCk6IExheW91dFNpemUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFycmFuZ2VzIGNhcmRzIGluIGxheW91dCBiYXNlZCBvbiByYW5rLCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNhcmRcbiAgICAgKiBAcGFyYW0gY2FyZHMgQXJyYXkgb2YgUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBhcnJhbmdlQ2FyZHMoY2FyZHM6IEFycmF5PFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50Pik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb2x1bW5zSGVpZ2h0ID0gbmV3IEFycmF5KHRoaXMuX2NvbHVtbnMpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zSGVpZ2h0LmZpbGwoMCk7XG4gICAgICAgIC8vIHNvcnQgYmFzZWQgb24gdGhlIGNhcmQgcmFua1xuICAgICAgICB0aGlzLl9zb3J0ZWRDYXJkcyA9IGNhcmRzPy5zb3J0KHRoaXMuX3NvcnRDYXJkcyk7XG5cbiAgICAgICAgdGhpcy5fc29ydGVkQ2FyZHM/LmZvckVhY2goKGNhcmQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDYXJkUG9zaXRpb25WYWx1ZXMoY2FyZCwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29sdW1uc0hlaWdodChjYXJkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGF5b3V0SGVpZ2h0ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgdGhpcy5fY29sdW1uc0hlaWdodCkgKyB2ZXJ0aWNhbFJlc2l6ZVN0ZXA7XG5cbiAgICAgICAgdGhpcy5fZW1pdExheW91dENoYW5nZSgpO1xuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHNoaWZ0aW5nIG9mIGNhcmRzIHdpdGggYW5pbWF0aW9uLCB3aGlsZSBjYXJkIGlzIHN0aWxsIHJlc2l6aW5nLlxuICAgICAqIEBwYXJhbSBldmVudCB7UmVzaXplZEV2ZW50fVxuICAgICAqL1xuICAgIGNhcmRSZXNpemluZyhldmVudDogUmVzaXplZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzaXppbmcuZW1pdChldmVudCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZUhvcml6b250YWxSZXNpemUoZXZlbnQpO1xuICAgICAgICB0aGlzLl9oYW5kbGVWZXJ0aWNhbFJlc2l6ZShldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBhcnJhbmdlbWVudCBvZiBjYXJkcyBpbiBsYXlvdXRcbiAgICAgKiBAcGFyYW0gZXZlbnQge1Jlc2l6ZWRFdmVudH1cbiAgICAgKi9cbiAgICBjYXJkUmVzaXplQ29tcGxldGUoZXZlbnQ6IFJlc2l6ZWRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9sYXlvdXRTaGlmdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXJyYW5nZUNhcmRzKHRoaXMucmVzaXplQ2FyZEl0ZW1zLnRvQXJyYXkoKSk7XG4gICAgICAgIHRoaXMucmVzaXplZC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHVwZGF0ZUxheW91dCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNpemVDYXJkSXRlbXM/LmZvckVhY2goKGNhcmQpID0+IHtcbiAgICAgICAgICAgIGNhcmQ/LnZlcmlmeVVwZGF0ZUNhcmRXaWR0aCh0aGlzLmxheW91dFNpemUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hcnJhbmdlQ2FyZHModGhpcy5yZXNpemVDYXJkSXRlbXM/LnRvQXJyYXkoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWV0aG9kIHRvIGdldCBzY3JlZW4gd2lkdGhcbiAgICAgKiBAcmV0dXJucyBXaW5kb3cgd2lkdGggaW4gcHhcbiAgICAgKi9cbiAgICBnZXRXaWR0aEF2YWlsYWJsZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gU3Vic2NyaWJlIHRvIGV2ZW50cyBmcm9tIGl0ZW1zICovXG4gICAgcHJpdmF0ZSBfaW5pdGlhbFNldHVwKCk6IHZvaWQge1xuICAgICAgICAvLyBsaXN0ZW4gZm9yIHJlc2l6aW5nIGV2ZW50IG9mIGNhcmQgaXRlbVxuICAgICAgICB0aGlzLnJlc2l6ZUNhcmRJdGVtcz8uZm9yRWFjaCgocmVzaXplQ2FyZEl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXRDb25maWcgJiYgdGhpcy5sYXlvdXRDb25maWcubGVuZ3RoID49IGluZGV4ICsgMSkge1xuICAgICAgICAgICAgICAgIHJlc2l6ZUNhcmRJdGVtLmNvbmZpZyA9IHRoaXMubGF5b3V0Q29uZmlnW2luZGV4XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzaXplQ2FyZEl0ZW0ucmVzaXppbmdcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IFJlc2l6ZWRFdmVudCkgPT4gdGhpcy5jYXJkUmVzaXppbmcoZXZlbnQpKTtcblxuICAgICAgICAgICAgLy8gbGlzdGVuIGZvciByZXNpemUgY29tcGxldGUgZXZlbnQgb2YgY2FyZCBpdGVtXG4gICAgICAgICAgICByZXNpemVDYXJkSXRlbS5yZXNpemVkXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBSZXNpemVkRXZlbnQpID0+IHRoaXMuY2FyZFJlc2l6ZUNvbXBsZXRlKGV2ZW50KSk7XG5cbiAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgbWluaS1oZWFkZXIgaGVpZ2h0IGV2ZW50IG9mIGNhcmQgaXRlbVxuICAgICAgICAgICAgcmVzaXplQ2FyZEl0ZW0ubWluaUhlYWRlclJlYWNoZWRcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IFJlc2l6ZWRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbmlIZWFkZXJSZWFjaGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0ZXBDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgbWluaS1jb250ZW50IGhlaWdodCBldmVudCBvZiBjYXJkIGl0ZW1cbiAgICAgICAgICAgIHJlc2l6ZUNhcmRJdGVtLm1pbmlDb250ZW50UmVhY2hlZFxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogUmVzaXplZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWluaUNvbnRlbnRSZWFjaGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0ZXBDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfYWNjZXNzaWJpbGl0eVNldHVwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9rZXlib2FyZEV2ZW50c01hbmFnZXI/LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fa2V5Ym9hcmRFdmVudHNNYW5hZ2VyID0gbmV3IEZvY3VzS2V5TWFuYWdlcih0aGlzLnJlc2l6ZUNhcmRJdGVtcykud2l0aFdyYXAoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBjcmVhdGUgbGF5b3V0IGJhc2VkIG9uIGxheW91dCBzaXplICovXG4gICAgcHJpdmF0ZSBfY3JlYXRlTGF5b3V0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHRoaXMuZ2V0V2lkdGhBdmFpbGFibGUoKTtcbiAgICAgICAgY29uc3QgcHJldkxheW91dFNpemUgPSB0aGlzLmxheW91dFNpemU7XG5cbiAgICAgICAgaWYgKHNjcmVlbldpZHRoID4gMCAmJiBzY3JlZW5XaWR0aCA8PSA2NTYgJiYgcHJldkxheW91dFNpemUgIT09ICdzbScpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0U2l6ZSA9ICdzbSc7XG4gICAgICAgICAgICB0aGlzLl9zZXRMYXlvdXRDb2x1bW5zKHRoaXMubGF5b3V0U2l6ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHNjcmVlbldpZHRoID4gNjU2ICYmIHNjcmVlbldpZHRoIDw9IDk3NSAmJiBwcmV2TGF5b3V0U2l6ZSAhPT0gJ21kJykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRTaXplID0gJ21kJztcbiAgICAgICAgICAgIHRoaXMuX3NldExheW91dENvbHVtbnModGhpcy5sYXlvdXRTaXplKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NyZWVuV2lkdGggPiA5NzUgJiYgc2NyZWVuV2lkdGggPD0gMTM1OSAmJiBwcmV2TGF5b3V0U2l6ZSAhPT0gJ2xnJykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRTaXplID0gJ2xnJztcbiAgICAgICAgICAgIHRoaXMuX3NldExheW91dENvbHVtbnModGhpcy5sYXlvdXRTaXplKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NyZWVuV2lkdGggPiAxMzU5ICYmIHByZXZMYXlvdXRTaXplICE9PSAneGwnKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFNpemUgPSAneGwnO1xuICAgICAgICAgICAgdGhpcy5fc2V0TGF5b3V0Q29sdW1ucyh0aGlzLmxheW91dFNpemUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMYXlvdXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEVtaXQgbGF5b3V0Q2hhbmdlIGV2ZW50IHdpdGggdXBkYXRlZCBjYXJkIGRpbWVuc2lvbnMgKi9cbiAgICBwcml2YXRlIF9lbWl0TGF5b3V0Q2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsYXRlc3RDYXJkQ29uZmlnOiBSZXNpemFibGVDYXJkTGF5b3V0Q29uZmlnID0gW107XG4gICAgICAgIHRoaXMucmVzaXplQ2FyZEl0ZW1zPy5mb3JFYWNoKChjYXJkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXJkQ29uZmlnOiBSZXNpemFibGVDYXJkSXRlbUNvbmZpZyA9IHt9O1xuICAgICAgICAgICAgY2FyZENvbmZpZy5jYXJkV2lkdGhDb2xTcGFuID0gY2FyZC5jYXJkV2lkdGhDb2xTcGFuO1xuICAgICAgICAgICAgY2FyZENvbmZpZy5jYXJkSGVpZ2h0Um93U3BhbiA9IGNhcmQuY2FyZEhlaWdodFJvd1NwYW47XG4gICAgICAgICAgICBjYXJkQ29uZmlnLnJhbmsgPSBjYXJkLnJhbms7XG4gICAgICAgICAgICBjYXJkQ29uZmlnLnRpdGxlID0gY2FyZC50aXRsZTtcbiAgICAgICAgICAgIGNhcmRDb25maWcuY2FyZE1pbmlDb250ZW50Um93U3BhbiA9IGNhcmQuY2FyZE1pbmlDb250ZW50Um93U3BhbjtcbiAgICAgICAgICAgIGNhcmRDb25maWcuY2FyZE1pbmlIZWFkZXJSb3dTcGFuID0gY2FyZC5jYXJkTWluaUhlYWRlclJvd1NwYW47XG4gICAgICAgICAgICBjYXJkQ29uZmlnLnJlc2l6YWJsZSA9IGNhcmQucmVzaXphYmxlO1xuICAgICAgICAgICAgbGF0ZXN0Q2FyZENvbmZpZy5wdXNoKGNhcmRDb25maWcpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2UuZW1pdChsYXRlc3RDYXJkQ29uZmlnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIFNldHMgbnVtYmVyIG9mIGNvbHVtbiBpbiBsYXlvdXQsIGJhc2VkIG9uIExheW91dFNpemUgcGFzc2VkXG4gICAgICogQHBhcmFtIGxheW91dFNpemUgeydzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCd9XG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0TGF5b3V0Q29sdW1ucyhsYXlvdXRTaXplOiBMYXlvdXRTaXplKTogdm9pZCB7XG4gICAgICAgIGxldCBsYXlvdXRXaWR0aERlZmF1bHQ6IG51bWJlcjtcblxuICAgICAgICBzd2l0Y2ggKGxheW91dFNpemUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NtJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYWRkaW5nTGVmdCA9IDg7XG4gICAgICAgICAgICAgICAgbGF5b3V0V2lkdGhEZWZhdWx0ID0gdGhpcy5fY29sdW1ucyAqIGhvcml6b250YWxSZXNpemVTdGVwICsgMiAqIHRoaXMuX3BhZGRpbmdMZWZ0O1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0V2lkdGggPSBsYXlvdXRXaWR0aERlZmF1bHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucyA9IDI7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFkZGluZ0xlZnQgPSAxNjtcbiAgICAgICAgICAgICAgICBsYXlvdXRXaWR0aERlZmF1bHQgPSB0aGlzLl9jb2x1bW5zICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXAgKyAyICogdGhpcy5fcGFkZGluZ0xlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRXaWR0aCA9IGxheW91dFdpZHRoRGVmYXVsdCArIGdhcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2xnJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gMztcbiAgICAgICAgICAgICAgICB0aGlzLl9wYWRkaW5nTGVmdCA9IDE2O1xuICAgICAgICAgICAgICAgIGxheW91dFdpZHRoRGVmYXVsdCA9IHRoaXMuX2NvbHVtbnMgKiBob3Jpem9udGFsUmVzaXplU3RlcCArIDIgKiB0aGlzLl9wYWRkaW5nTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFdpZHRoID0gbGF5b3V0V2lkdGhEZWZhdWx0ICsgMiAqIGdhcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3hsJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gNDtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYWRkaW5nTGVmdCA9IDQ4O1xuICAgICAgICAgICAgICAgIGxheW91dFdpZHRoRGVmYXVsdCA9IHRoaXMuX2NvbHVtbnMgKiBob3Jpem9udGFsUmVzaXplU3RlcCArIDIgKiB0aGlzLl9wYWRkaW5nTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFdpZHRoID0gbGF5b3V0V2lkdGhEZWZhdWx0ICsgMyAqIGdhcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucyA9IDQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFkZGluZ0xlZnQgPSA0ODtcbiAgICAgICAgICAgICAgICBsYXlvdXRXaWR0aERlZmF1bHQgPSB0aGlzLl9jb2x1bW5zICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXAgKyAyICogdGhpcy5fcGFkZGluZ0xlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRXaWR0aCA9IGxheW91dFdpZHRoRGVmYXVsdCArIDMgKiBnYXA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIE1ldGhvZCB0byBoYW5kbGUgY2FyZCB2ZXJ0aWNhbCByZXNpemUgYW5kIHRyaWdnZXIgdGhlIGxheW91dCBjaGFuZ2VcbiAgICAgKiBAcGFyYW0gZXZlbnQge1Jlc2l6ZWRFdmVudH1cbiAgICAgKi9cbiAgICBwcml2YXRlIF9oYW5kbGVWZXJ0aWNhbFJlc2l6ZShldmVudDogUmVzaXplZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5jYXJkLmNhcmRIZWlnaHRSb3dTcGFuICE9PSBldmVudC5jYXJkLnByZXZpb3VzQ2FyZEhlaWdodFJvd1NwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYW5nZUNhcmRzKHRoaXMuX3NvcnRlZENhcmRzKTtcbiAgICAgICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoZXZlbnQuY2FyZC5nZXRSZXNpemVkRXZlbnRPYmplY3QoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIE1ldGhvZCB0byBoYW5kbGUgY2FyZCBob3Jpem9udGFsIHJlc2l6ZSBhbmQgdHJpZ2dlciB0aGUgbGF5b3V0IGNoYW5nZVxuICAgICAqIEBwYXJhbSBldmVudCB7UmVzaXplZEV2ZW50fVxuICAgICAqL1xuICAgIHByaXZhdGUgX2hhbmRsZUhvcml6b250YWxSZXNpemUoZXZlbnQ6IFJlc2l6ZWRFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyB3aGVuIGluY3JlYXNpbmcgd2lkdGggaGl0IHRoZSBvZmZzZXQsIHNob3cgZXh0ZW5kZWQgYm9yZGVyIGFuZCBzdGFydCBwdXNoaW5nIGRvd24gYm9yZGVyIGNhcmRzXG4gICAgICAgIC8vIHdoZW4gd2lkdGggaXMgZGVjcmVhc2luZyAsIHNob3cgZXh0ZW5kZWQgYm9yZGVyIHRpbGwgaXQgcmVhY2hlcyB0byBvZmZzZXQuXG4gICAgICAgIGNvbnN0IGNhcmRXaWR0aENoYW5nZSA9IGV2ZW50LmNhcmRXaWR0aCAtIGV2ZW50LnByZXZDYXJkV2lkdGg7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXNpemluZ0l0ZW1JbmRleCA9IHRoaXMuX3NvcnRlZENhcmRzPy5maW5kSW5kZXgoKHgpID0+IHgucmFuayA9PT0gZXZlbnQuY2FyZC5yYW5rKTtcblxuICAgICAgICBpZiAoZXZlbnQuY2FyZFdpZHRoID4gZXZlbnQucHJldkNhcmRXaWR0aCkge1xuICAgICAgICAgICAgLy8gd2hlbiBpbmNyZWFzaW5nIHNpemVcbiAgICAgICAgICAgIC8vIGNhcmQgd2lkdGggaW5jcmVhc2luZyBjdXJyZW50bHlcbiAgICAgICAgICAgIGlmIChldmVudC5jYXJkLmNhcmRTdGF0ZSA9PT0gMSAmJiBjYXJkV2lkdGhDaGFuZ2UgPiBob3Jpem9udGFsUmVzaXplT2Zmc2V0ICsgZ2FwICYmICF0aGlzLl9sYXlvdXRTaGlmdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5kZXggb2YgdGhpcyBjYXJkLCB0aGVuIGdldCBuZXh0IGNhcmQuIGV4Y2hhbmdlIHJhbmtzXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydGVkQ2FyZHMuZm9yRWFjaCgoY2FyZDogUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gY3VycmVudFJlc2l6aW5nSXRlbUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgc29tZSBjYXJkcyBvbiBzYW1lIGhlaWdodC4gbWFrZSB0aGUgY3VycmVudCBjYXJkIHJhbmsgaGlnaGVyIHRoYW4gdGhlc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgbmV4dCBpbmRleCB3aGVyZSBpdCB3aWxsIGZpdC4gdW50aWwgYW55IGNhcmQgaGFzIGxlc3MgY29sdW1uIHNwYW4gdGhhbiB0b3RhbCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBvbmx5IGluIG5leHQgdG9wLCBvbmUgY2FyZCBpcyB0YWtpbmcgZnVsbCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC5zdGFydGluZ0NvbHVtblBvc2l0aW9uICsgY2FyZC5jYXJkV2lkdGhDb2xTcGFuID09PSB0aGlzLl9jb2x1bW5zICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC5jYXJkV2lkdGhDb2xTcGFuICE9PSB0aGlzLl9jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgY2FyZHMgd2l0aCB0b3AgPiBjdXJyZW50IHRvcCAsIGJ1dCBtaW5pbXVtIG9mIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjaGFuZ2UgcmFuayB3aXRoIHRoZXNlIGNhcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlQ2FyZERvd24oaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0U2hpZnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnJhbmdlQ2FyZHModGhpcy5fc29ydGVkQ2FyZHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcENoYW5nZS5lbWl0KGV2ZW50LmNhcmQuZ2V0UmVzaXplZEV2ZW50T2JqZWN0KCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBldmVudC5jYXJkLmNhcmRTdGF0ZSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICBjYXJkV2lkdGhDaGFuZ2UgPCBob3Jpem9udGFsUmVzaXplT2Zmc2V0ICsgZ2FwICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0U2hpZnRlZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FyZCB3aWR0aCBkZWNyZWFzaW5nIGN1cnJlbnRseVxuICAgICAgICAgICAgICAgIC8vIG1vdmUgdXAgdGhlIGNhcmRzLCBpZiBpdCB3YXMgc2hpZnRlZCB3aGlsZSBpbmNyZWFzaW5nIHRoZSB3aWR0aFxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRlZENhcmRzLmZvckVhY2goKGNhcmQ6IFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNhcmQucmFuayA9IGNhcmQucHJldlJhbmsgPyBjYXJkLnByZXZSYW5rIDogY2FyZC5yYW5rO1xuICAgICAgICAgICAgICAgICAgICBjYXJkLnByZXZSYW5rID0gMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRTaGlmdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnJhbmdlQ2FyZHModGhpcy5fc29ydGVkQ2FyZHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcENoYW5nZS5lbWl0KGV2ZW50LmNhcmQuZ2V0UmVzaXplZEV2ZW50T2JqZWN0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNhcmRXaWR0aCA8IGV2ZW50LnByZXZDYXJkV2lkdGgpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gZGVjcmVhc2luZyBzaXplXG4gICAgICAgICAgICBpZiAoZXZlbnQuY2FyZC5jYXJkU3RhdGUgPT09IC0xICYmIC1jYXJkV2lkdGhDaGFuZ2UgPiBob3Jpem9udGFsUmVzaXplT2Zmc2V0ICYmICF0aGlzLl9sYXlvdXRTaGlmdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FyZCB3aWR0aCBkZWNyZWFzaW5nIGN1cnJlbnRseVxuICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dFNoaWZ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJyYW5nZUNhcmRzKHRoaXMuX3NvcnRlZENhcmRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBDaGFuZ2UuZW1pdChldmVudC5jYXJkLmdldFJlc2l6ZWRFdmVudE9iamVjdCgpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2FyZC5jYXJkU3RhdGUgPT09IDEgJiYgLWNhcmRXaWR0aENoYW5nZSA8IGhvcml6b250YWxSZXNpemVPZmZzZXQgJiYgdGhpcy5fbGF5b3V0U2hpZnRlZCkge1xuICAgICAgICAgICAgICAgIC8vIGNhcmQgd2lkdGggaW5jcmVhc2luZyBjdXJyZW50bHlcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRTaGlmdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnJhbmdlQ2FyZHModGhpcy5fc29ydGVkQ2FyZHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcENoYW5nZS5lbWl0KGV2ZW50LmNhcmQuZ2V0UmVzaXplZEV2ZW50T2JqZWN0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBNZXRob2QgdG8gbW92ZSBjYXJkIGRvd24sIHdoZW4gYW5vdGhlciBjYXJkIHdpZHRoIGlzIGluY3JlYXNpbmdcbiAgICAgKiBNZXRob2QgdG8gbG9vcCB0aWxsIHRoaXMuX2NvbHVtbnMgLTEgcG9zaXRpb25zIGFuZCBleGNoYW5nZSB0aGUgcmFua1xuICAgICAqIEBwYXJhbSBjdXJyZW50Q2FyZEluZGV4IEluZGV4IG9mIGN1cnJlbnQgY2FyZFxuICAgICAqL1xuICAgIHByaXZhdGUgX21vdmVDYXJkRG93bihjdXJyZW50Q2FyZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLy8gdGFraW5nIHdpZHRoIG9mIGFkamFjZW50IGNhcmQgY29sLXNwYW4gaW50byBhY2NvdW50XG5cbiAgICAgICAgLy8gZWc6IDQgY29sdW1ucyAtIDIgY29sKGFkamFjZW50IGNhcmQpID0gMiBwb3NpdGlvbnMgY2FuIGV4Y2hhbmdlIHJhbmtzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDYXJkOiBSZXNpemFibGVDYXJkSXRlbUNvbXBvbmVudCA9IHRoaXMuX3NvcnRlZENhcmRzW2N1cnJlbnRDYXJkSW5kZXhdO1xuICAgICAgICBsZXQgY2FyZDogUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnQ7XG5cbiAgICAgICAgLy8gdW5vY2N1cGllZFBvc2l0aW9ucyBwb3NpdGlvbnMgbGVmdCBhZnRlciBjdXJyZW50Q2FyZCBvY2N1cGllcyBpbiBuZXh0IHJvdy5cbiAgICAgICAgbGV0IHVub2NjdXBpZWRQb3NpdGlvbnMgPSB0aGlzLl9jb2x1bW5zIC0gY3VycmVudENhcmQuY2FyZFdpZHRoQ29sU3BhbjtcblxuICAgICAgICBjdXJyZW50Q2FyZC5wcmV2UmFuayA9IGN1cnJlbnRDYXJkLnJhbms7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gMTtcbiAgICAgICAgd2hpbGUgKHVub2NjdXBpZWRQb3NpdGlvbnMgPiAwKSB7XG4gICAgICAgICAgICAvLyBjb21wYXJlIGZyb20gbmV4dCBjYXJkXG4gICAgICAgICAgICBjYXJkID0gdGhpcy5fc29ydGVkQ2FyZHNbaW5kZXggKyBjdXJyZW50Q2FyZEluZGV4XTtcbiAgICAgICAgICAgIGlmIChjYXJkICYmIHVub2NjdXBpZWRQb3NpdGlvbnMgPj0gY2FyZC5jYXJkV2lkdGhDb2xTcGFuKSB7XG4gICAgICAgICAgICAgICAgY2FyZC5wcmV2UmFuayA9IGNhcmQucmFuaztcbiAgICAgICAgICAgICAgICBjYXJkLnJhbmsgLT0gMTtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q2FyZC5yYW5rID0gY2FyZC5wcmV2UmFuaztcbiAgICAgICAgICAgICAgICB1bm9jY3VwaWVkUG9zaXRpb25zIC09IGNhcmQuY2FyZFdpZHRoQ29sU3BhbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5vY2N1cGllZFBvc2l0aW9ucyA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiB1cGRhdGVzIGFycmF5IHdpdGggbmV3IGNvbHVtbiBoZWlnaHRzXG4gICAgICogQHBhcmFtIGNhcmQge1Jlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50fVxuICAgICAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUNvbHVtbnNIZWlnaHQoY2FyZDogUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uUG9zaXRpb24gPSB0aGlzLl9kaXJlY3Rpb25Qb3NpdGlvbiQoKTtcbiAgICAgICAgY29uc3QgY29sdW1uc1N0YXJ0ID1cbiAgICAgICAgICAgIGNhcmRbZGlyZWN0aW9uUG9zaXRpb25dICE9IG51bGwgPyBNYXRoLmZsb29yKGNhcmRbZGlyZWN0aW9uUG9zaXRpb25dISAvIGhvcml6b250YWxSZXNpemVTdGVwKSA6IDA7XG5cbiAgICAgICAgLy8gR2V0IHdpZHRoIG9mIGN1cnJlbnQgY2FyZCByZXNpemluZyBhbmQgYXNzaWduIHdpZHRoIGhlcmUgZm9yIHRoYXQgY2FyZFxuICAgICAgICBjb25zdCBjYXJkQmFzZUNvbFNwYW4gPSBNYXRoLmZsb29yKGNhcmQuY2FyZFdpZHRoIC8gaG9yaXpvbnRhbFJlc2l6ZVN0ZXApO1xuXG4gICAgICAgIC8vIHRpbGwgd2hpY2ggY29sdW1ucyBjYXJkIHNwYW5zXG4gICAgICAgIGNvbnN0IGNvbHVtbnNTcGFuID1cbiAgICAgICAgICAgIGNhcmQuY2FyZFdpZHRoIC0gY2FyZEJhc2VDb2xTcGFuICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXAgLSBjYXJkQmFzZUNvbFNwYW4gKiBnYXAgPiBob3Jpem9udGFsUmVzaXplT2Zmc2V0XG4gICAgICAgICAgICAgICAgPyBjYXJkQmFzZUNvbFNwYW4gKyAxXG4gICAgICAgICAgICAgICAgOiBjYXJkQmFzZUNvbFNwYW47XG5cbiAgICAgICAgY29uc3QgY29sdW1uSGVpZ2h0ID0gY2FyZC5jYXJkSGVpZ2h0ICsgY2FyZC50b3A7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zU3BhbjsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW5zSGVpZ2h0W2kgKyBjb2x1bW5zU3RhcnRdID0gY29sdW1uSGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbnNTdGFydCA9PT0gY29sdW1uc1NwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnNIZWlnaHRbY29sdW1uc1N0YXJ0XSA9IGNvbHVtbkhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gVHJ5IHRvIHNldCBjYXJkIGF0IGF2YWlsYWJsZSBoZWlnaHRzXG4gICAgICogQHBhcmFtIGNhcmQgUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnRcbiAgICAgKiBAcGFyYW0gaW5kZXggdmFsdWUgb2YgY2FyZCBpbiBhcnJheSBvZiBSZXNpemFibGVDYXJkSXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldENhcmRQb3NpdGlvblZhbHVlcyhjYXJkOiBSZXNpemFibGVDYXJkSXRlbUNvbXBvbmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkaXJlY3Rpb25Qb3NpdGlvbiA9IHRoaXMuX2RpcmVjdGlvblBvc2l0aW9uJCgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIGNhcmRbZGlyZWN0aW9uUG9zaXRpb25dID0gTnVtYmVyKHRoaXMuX3BhZGRpbmdMZWZ0KTtcbiAgICAgICAgICAgIGNhcmQudG9wID0gMDtcbiAgICAgICAgICAgIGNhcmQuc3RhcnRpbmdDb2x1bW5Qb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlxdWVIZWlnaHRzID0gdGhpcy5fZ2V0U29ydGVkVW5pcXVlSGVpZ2h0cygpO1xuICAgICAgICBsZXQgY2FyZFBvc2l0aW9uZWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXF1ZUhlaWdodHMubGVuZ3RoICYmICFjYXJkUG9zaXRpb25lZDsgaSsrKSB7XG4gICAgICAgICAgICBjYXJkUG9zaXRpb25lZCA9IHRoaXMuX2lzUG9zaXRpb25TZXRTdWNjZXNzKHVuaXF1ZUhlaWdodHNbaV0sIGNhcmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiB0cnkgdG8gc2V0IGNhcmQgYXQgZ2l2ZW4gaGVpZ2h0LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IGF0IHdoaWNoIGNhcmQgaXMgZ2V0dGluZyBwb3NpdGlvbmVkLlxuICAgICAqIEBwYXJhbSBjYXJkIFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50XG4gICAgICogQHJldHVybnMgSXQgcmV0dXJucyB0cnVlIHdoZW4gY2FyZCBwb3NpdGlvbiBpZCBmb3VuZCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pc1Bvc2l0aW9uU2V0U3VjY2VzcyhoZWlnaHQ6IG51bWJlciwgY2FyZDogUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uUG9zaXRpb24gPSB0aGlzLl9kaXJlY3Rpb25Qb3NpdGlvbiQoKTtcbiAgICAgICAgY29uc3QgY29sdW1uUG9zaXRpb25zOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbkhlaWdodCBvZiB0aGlzLl9jb2x1bW5zSGVpZ2h0KSB7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgaWYgKGNvbHVtbkhlaWdodCA9PT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29sdW1uUG9zaXRpb25zLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGZvciBlYWNoIGNhcmQgcG9zaXRpb24sIHN0YXJ0aW5nIGZyb20gbGVmdG1vc3RcbiAgICAgICAgbGV0IGlzRml0dGluZyA9IGZhbHNlO1xuICAgICAgICAvLyB0cnkgdG8gZml0IGFzIGxlZnQgKG9yIHJpZ2h0IGlmIFJ0bCkgYXMgcG9zc2libGUgZnJvbSB0aGUgY29sdW1uIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHN0YXJ0aW5nQ29sdW1uUG9zaXRpb24gPSB0aGlzLl9maXRDYXJkQ29sdW1uUG9zaXRpb24oY2FyZCwgY29sdW1uUG9zaXRpb25zLCBoZWlnaHQpO1xuXG4gICAgICAgIGlmIChzdGFydGluZ0NvbHVtblBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgaXNGaXR0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhcmRbZGlyZWN0aW9uUG9zaXRpb25dID1cbiAgICAgICAgICAgICAgICBzdGFydGluZ0NvbHVtblBvc2l0aW9uICogaG9yaXpvbnRhbFJlc2l6ZVN0ZXAgK1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhZGRpbmdMZWZ0ICtcbiAgICAgICAgICAgICAgICAoc3RhcnRpbmdDb2x1bW5Qb3NpdGlvbiA+IDAgPyBnYXAgKiBzdGFydGluZ0NvbHVtblBvc2l0aW9uIDogMCk7XG4gICAgICAgICAgICBjYXJkLnRvcCA9IGhlaWdodCArIChoZWlnaHQgPiAwID8gdmVydGljYWxSZXNpemVTdGVwIDogMCk7XG4gICAgICAgICAgICBjYXJkLnN0YXJ0aW5nQ29sdW1uUG9zaXRpb24gPSBzdGFydGluZ0NvbHVtblBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0ZpdHRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBUcnkgdG8gc3RhcnQgY2FyZCBwb3NpdGlvbiBmcm9tIGxlZnQgbW9zdCBmaXQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIGNhcmQgUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnRcbiAgICAgKiBAcGFyYW0gY29sdW1uUG9zaXRpb25zIHtBcnJheTxudW1iZXI+fSBBcnJheSBvZiBhdmFpbGFibGUgcG9zaXRpb25zIGZvciBjYXJkcy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IHtudW1iZXJ9IGhlaWdodCBhdCB3aGljaCBmaXhpbmcgdGhlIGNhcmRcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSByZXR1cm5zIHN0YXJ0aW5nIGNvbHVtbiBwb3NpdGlvbiB3aGVyZSBjYXJkIHdpbGwgZml0LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpdENhcmRDb2x1bW5Qb3NpdGlvbihcbiAgICAgICAgY2FyZDogUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnQsXG4gICAgICAgIGNvbHVtblBvc2l0aW9uczogQXJyYXk8bnVtYmVyPixcbiAgICAgICAgaGVpZ2h0OiBudW1iZXJcbiAgICApOiBudW1iZXIge1xuICAgICAgICAvLyBjaGVjayBmb3IgZWFjaCBjYXJkIHBvc2l0aW9uLCBzdGFydGluZyBmcm9tIGxlZnRtb3N0XG4gICAgICAgIGxldCBpc0ZpdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0aW5nQ29sdW1uUG9zaXRpb24gPSAtMTtcblxuICAgICAgICAvLyBzdGFydCBmcm9tIHByZXZpb3VzIGluZGV4ZXNcbiAgICAgICAgY29uc3QgY2FyZEJhc2VDb2xTcGFuID0gTWF0aC5mbG9vcihjYXJkLmNhcmRXaWR0aCAvIGhvcml6b250YWxSZXNpemVTdGVwKTtcbiAgICAgICAgY29uc3QgY2FyZENvbFNwYW4gPVxuICAgICAgICAgICAgY2FyZC5jYXJkV2lkdGggLSBjYXJkQmFzZUNvbFNwYW4gKiBob3Jpem9udGFsUmVzaXplU3RlcCAtIGNhcmRCYXNlQ29sU3BhbiAqIGdhcCA+IGhvcml6b250YWxSZXNpemVPZmZzZXRcbiAgICAgICAgICAgICAgICA/IGNhcmRCYXNlQ29sU3BhbiArIDFcbiAgICAgICAgICAgICAgICA6IGNhcmRCYXNlQ29sU3BhbjtcbiAgICAgICAgLy8gdHJ5IHRvIHNldCB0b3dhcmRzIGxlZnQgZnJvbSBhdmFpbGFibGUgY2FyZCBwb3NpdGlvblxuICAgICAgICAvLyBlZy4gWzEsIDIsIDMsIDRdIGNvbHVtbnNQb3NpdGlvbnNcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW5Qb3NpdGlvbiBvZiBjb2x1bW5Qb3NpdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChpc0ZpdHRpbmcpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc3RhcnRpbmdQb3NpdGlvbiB2YWx1ZXMgd2lsbCBiZSAxLCAyLCAzLCA0XG4gICAgICAgICAgICAvLyB0cnkgdG8gZml0IGFzIGxlZnQgYXMgcG9zc2libGVcbiAgICAgICAgICAgIGxldCBzdGFydGluZ1Bvc2l0aW9uID0gY29sdW1uUG9zaXRpb24gLSAoY2FyZENvbFNwYW4gLSAxKTtcbiAgICAgICAgICAgIHN0YXJ0aW5nUG9zaXRpb24gPSBzdGFydGluZ1Bvc2l0aW9uID4gMCA/IHN0YXJ0aW5nUG9zaXRpb24gOiAxO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0aW5nUG9zaXRpb247IGluZGV4IDw9IGNvbHVtblBvc2l0aW9uICYmICFpc0ZpdHRpbmc7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzcGFuID0gMDsgc3BhbiA8IGNhcmRDb2xTcGFuOyBzcGFuKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbHVtbnNIZWlnaHRbaW5kZXggKyBzcGFuIC0gMV0gPD0gaGVpZ2h0ICYmIGNhcmRDb2xTcGFuICsgaW5kZXggLSAxIDw9IHRoaXMuX2NvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRml0dGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ0NvbHVtblBvc2l0aW9uID0gaW5kZXggLSAxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNGaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ0NvbHVtblBvc2l0aW9uID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnRpbmdDb2x1bW5Qb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiByZXR1cm5zIHNvcnRlZCB1bmlxdWUgaGVpZ2h0IG9mIGNvbHVtbnMgKi9cbiAgICBwcml2YXRlIF9nZXRTb3J0ZWRVbmlxdWVIZWlnaHRzKCk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgdGVtcEFycmF5ID0gdGhpcy5fY29sdW1uc0hlaWdodC5zbGljZSgpO1xuICAgICAgICBjb25zdCBzb3J0ZWRDb2x1bW5zSGVpZ2h0QXJyYXkgPSB0ZW1wQXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUhlaWdodHM6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzb3J0ZWRIZWlnaHQgb2Ygc29ydGVkQ29sdW1uc0hlaWdodEFycmF5KSB7XG4gICAgICAgICAgICBpZiAodW5pcXVlSGVpZ2h0cy5pbmRleE9mKHNvcnRlZEhlaWdodCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdW5pcXVlSGVpZ2h0cy5wdXNoKHNvcnRlZEhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY29tcGFyZXIoZmlyc3Q6IG51bWJlciwgc2Vjb25kOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0IC0gc2Vjb25kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmlxdWVIZWlnaHRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQ29tcGFyYXRvciB0byBzb3J0IGNhcmQgYmFzZWQgb24gcmFuay5cbiAgICAgKiBAcGFyYW0gZmlyc3RDYXJkIFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50XG4gICAgICogQHBhcmFtIHNlY29uZENhcmQgUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnRcbiAgICAgKiBAcmV0dXJucyA6IHJldHVybnMgZGlmZmVyZW5jZSBiZXR3ZWVuIGZpcnN0IGNhcmQgcmFuayBhbmQgb3RoZXIgY2FyZCByYW5rLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3NvcnRDYXJkcyhmaXJzdENhcmQ6IFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50LCBzZWNvbmRDYXJkOiBSZXNpemFibGVDYXJkSXRlbUNvbXBvbmVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBmaXJzdENhcmQucmFuayAtIHNlY29uZENhcmQucmFuaztcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgI2xheW91dFxuICAgIGNsYXNzPVwiZmQtcmVzaXphYmxlLWNhcmQtbGF5b3V0XCJcbiAgICBbY2xhc3NdPVwiJ2ZkLXJlc2l6YWJsZS1jYXJkLWxheW91dC0tJyArIGxheW91dFNpemVcIlxuICAgIFtzdHlsZS53aWR0aC5weF09XCJsYXlvdXRXaWR0aFwiXG4gICAgW3N0eWxlLmhlaWdodC5weF09XCJsYXlvdXRIZWlnaHRcIlxuPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuIl19","import { NgModule } from '@angular/core';\nimport { ResizableCardItemComponent } from './resizable-card-layout/resizable-card-item/resizable-card-item.component';\nimport { ResizableCardLayoutComponent } from './resizable-card-layout/resizable-card-layout.component';\nimport * as i0 from \"@angular/core\";\n/**\n * @deprecated\n * Use direct imports of `ResizableCardLayoutComponent` and `ResizableCardItemComponent`.\n */\nexport class ResizableCardLayoutModule {\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: ResizableCardLayoutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.4\", ngImport: i0, type: ResizableCardLayoutModule, imports: [ResizableCardLayoutComponent, ResizableCardItemComponent], exports: [ResizableCardLayoutComponent, ResizableCardItemComponent] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: ResizableCardLayoutModule }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: ResizableCardLayoutModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [ResizableCardLayoutComponent, ResizableCardItemComponent],\n exports: [ResizableCardLayoutComponent, ResizableCardItemComponent]\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLWNhcmQtbGF5b3V0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9yZXNpemFibGUtY2FyZC1sYXlvdXQvcmVzaXphYmxlLWNhcmQtbGF5b3V0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDJFQUEyRSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDOztBQUV2Rzs7O0dBR0c7QUFLSCxNQUFNLE9BQU8seUJBQXlCOzhHQUF6Qix5QkFBeUI7K0dBQXpCLHlCQUF5QixZQUh4Qiw0QkFBNEIsRUFBRSwwQkFBMEIsYUFDeEQsNEJBQTRCLEVBQUUsMEJBQTBCOytHQUV6RCx5QkFBeUI7OzJGQUF6Qix5QkFBeUI7a0JBSnJDLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsMEJBQTBCLENBQUM7b0JBQ25FLE9BQU8sRUFBRSxDQUFDLDRCQUE0QixFQUFFLDBCQUEwQixDQUFDO2lCQUN0RSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNpemFibGUtY2FyZC1sYXlvdXQvcmVzaXphYmxlLWNhcmQtaXRlbS9yZXNpemFibGUtY2FyZC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXNpemFibGVDYXJkTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9yZXNpemFibGUtY2FyZC1sYXlvdXQvcmVzaXphYmxlLWNhcmQtbGF5b3V0LmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZSBkaXJlY3QgaW1wb3J0cyBvZiBgUmVzaXphYmxlQ2FyZExheW91dENvbXBvbmVudGAgYW5kIGBSZXNpemFibGVDYXJkSXRlbUNvbXBvbmVudGAuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW1Jlc2l6YWJsZUNhcmRMYXlvdXRDb21wb25lbnQsIFJlc2l6YWJsZUNhcmRJdGVtQ29tcG9uZW50XSxcbiAgICBleHBvcnRzOiBbUmVzaXphYmxlQ2FyZExheW91dENvbXBvbmVudCwgUmVzaXphYmxlQ2FyZEl0ZW1Db21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIFJlc2l6YWJsZUNhcmRMYXlvdXRNb2R1bGUge31cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuZGFtZW50YWwtbmd4LWNvcmUtcmVzaXphYmxlLWNhcmQtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3Jlc2l6YWJsZS1jYXJkLWxheW91dC9mdW5kYW1lbnRhbC1uZ3gtY29yZS1yZXNpemFibGUtY2FyZC1sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}