@ethlete/cdk 4.2.0 → 4.2.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 (213) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/esm2022/lib/components/accordion/components/accordion/accordion.component.mjs +6 -7
  3. package/esm2022/lib/components/accordion/components/accordion-group/accordion-group.component.mjs +3 -3
  4. package/esm2022/lib/components/accordion/partials/accordion-hint/accordion-hint.directive.mjs +3 -3
  5. package/esm2022/lib/components/accordion/partials/accordion-hint-wrapper/accordion-hint-wrapper.directive.mjs +3 -3
  6. package/esm2022/lib/components/accordion/partials/accordion-label/accordion-label.directive.mjs +3 -3
  7. package/esm2022/lib/components/accordion/partials/accordion-label-wrapper/accordion-label-wrapper.directive.mjs +3 -3
  8. package/esm2022/lib/components/bracket/components/bracket/bracket.component.mjs +9 -18
  9. package/esm2022/lib/components/bracket/directives/bracket-match/bracket-match.directive.mjs +3 -3
  10. package/esm2022/lib/components/bracket/directives/bracket-round/bracket-round.directive.mjs +3 -3
  11. package/esm2022/lib/components/bracket/partials/bracket-match/bracket-match.component.mjs +7 -7
  12. package/esm2022/lib/components/bracket/partials/bracket-round-header/bracket-round-header.component.mjs +7 -7
  13. package/esm2022/lib/components/button/components/button/button.component.mjs +3 -3
  14. package/esm2022/lib/components/button/components/query-button/query-button.component.mjs +7 -7
  15. package/esm2022/lib/components/button/directives/button/button.directive.mjs +3 -3
  16. package/esm2022/lib/components/button/directives/query-button/query-button.directive.mjs +3 -3
  17. package/esm2022/lib/components/filter/filter-overlay/components/filter-overlay-page-outlet/filter-overlay-page-outlet.component.mjs +11 -11
  18. package/esm2022/lib/components/filter/filter-overlay/directives/filter-overlay-back-or-close/filter-overlay-back-or-close.directive.mjs +3 -3
  19. package/esm2022/lib/components/filter/filter-overlay/directives/filter-overlay-link/filter-overlay-link.directive.mjs +3 -3
  20. package/esm2022/lib/components/filter/filter-overlay/directives/filter-overlay-reset/filter-overlay-reset.directive.mjs +3 -3
  21. package/esm2022/lib/components/filter/filter-overlay/directives/filter-overlay-submit/filter-overlay-submit.directive.mjs +3 -3
  22. package/esm2022/lib/components/filter/filter-overlay/services/filter-overlay.service.mjs +3 -3
  23. package/esm2022/lib/components/filter/rich-filter/components/rich-filter-host/rich-filter-host.component.mjs +3 -3
  24. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button/rich-filter-button.directive.mjs +3 -3
  25. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button-slot/rich-filter-button-slot.directive.mjs +3 -3
  26. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-content/rich-filter-content.directive.mjs +3 -3
  27. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-top/rich-filter-top.directive.mjs +3 -3
  28. package/esm2022/lib/components/forms/components/checkbox/components/checkbox/checkbox.component.mjs +3 -3
  29. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-field/checkbox-field.component.mjs +3 -3
  30. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-group/checkbox-group.component.mjs +3 -3
  31. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox/checkbox.directive.mjs +3 -3
  32. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-field/checkbox-field.directive.mjs +3 -3
  33. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group/checkbox-group.directive.mjs +3 -3
  34. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group-control/checkbox-group-control.directive.mjs +3 -3
  35. package/esm2022/lib/components/forms/components/error/components/error/error.component.mjs +6 -6
  36. package/esm2022/lib/components/forms/components/input/components/date-input/date-input.component.mjs +3 -3
  37. package/esm2022/lib/components/forms/components/input/components/email-input/email-input.component.mjs +3 -3
  38. package/esm2022/lib/components/forms/components/input/components/input-field/input-field.component.mjs +6 -6
  39. package/esm2022/lib/components/forms/components/input/components/number-input/number-input.component.mjs +3 -3
  40. package/esm2022/lib/components/forms/components/input/components/password-input/password-input.component.mjs +3 -3
  41. package/esm2022/lib/components/forms/components/input/components/search-input/search-input.component.mjs +3 -3
  42. package/esm2022/lib/components/forms/components/input/components/text-input/text-input.component.mjs +3 -3
  43. package/esm2022/lib/components/forms/components/input/components/textarea-input/textarea-input.component.mjs +3 -3
  44. package/esm2022/lib/components/forms/components/input/directives/autosize-textarea/autosize-textarea.directive.mjs +3 -3
  45. package/esm2022/lib/components/forms/components/input/directives/date-input/date-input.directive.mjs +3 -3
  46. package/esm2022/lib/components/forms/components/input/directives/email-input/email-input.directive.mjs +3 -3
  47. package/esm2022/lib/components/forms/components/input/directives/number-input/number-input.directive.mjs +3 -3
  48. package/esm2022/lib/components/forms/components/input/directives/password-input/password-input.directive.mjs +3 -3
  49. package/esm2022/lib/components/forms/components/input/directives/search-input/search-input.directive.mjs +3 -3
  50. package/esm2022/lib/components/forms/components/input/directives/text-input/text-input.directive.mjs +3 -3
  51. package/esm2022/lib/components/forms/components/input/directives/textarea-input/textarea-input.directive.mjs +3 -3
  52. package/esm2022/lib/components/forms/components/input/partials/password-input-toggle/password-input-toggle.component.mjs +3 -3
  53. package/esm2022/lib/components/forms/components/input/partials/search-input-clear/search-input-clear.component.mjs +3 -3
  54. package/esm2022/lib/components/forms/components/label/components/label/label.component.mjs +3 -3
  55. package/esm2022/lib/components/forms/components/label/directives/label-suffix/label-suffix.directive.mjs +3 -3
  56. package/esm2022/lib/components/forms/components/radio/components/radio/radio.component.mjs +3 -3
  57. package/esm2022/lib/components/forms/components/radio/components/radio-field/radio-field.component.mjs +3 -3
  58. package/esm2022/lib/components/forms/components/radio/components/radio-group/radio-group.component.mjs +3 -3
  59. package/esm2022/lib/components/forms/components/radio/directives/radio/radio.directive.mjs +3 -3
  60. package/esm2022/lib/components/forms/components/radio/directives/radio-field/radio-field.directive.mjs +3 -3
  61. package/esm2022/lib/components/forms/components/radio/directives/radio-group/radio-group.directive.mjs +3 -3
  62. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button/segmented-button.component.mjs +3 -3
  63. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-field/segmented-button-field.component.mjs +5 -5
  64. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-group/segmented-button-group.component.mjs +3 -3
  65. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button/segmented-button.directive.mjs +3 -3
  66. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-field/segmented-button-field.directive.mjs +3 -3
  67. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-group/segmented-button-group.directive.mjs +3 -3
  68. package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +6 -8
  69. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.mjs +3 -3
  70. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-empty-template/combobox-body-empty-template.directive.mjs +3 -3
  71. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-error-template/combobox-body-error-template.directive.mjs +3 -3
  72. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-loading-template/combobox-body-loading-template.directive.mjs +3 -3
  73. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-more-items-hint-template/combobox-body-more-items-hint-template.directive.mjs +3 -3
  74. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-option-template/combobox-option-template.directive.mjs +3 -3
  75. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-selected-option-template/combobox-selected-option-template.directive.mjs +3 -3
  76. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.mjs +7 -9
  77. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.mjs +8 -8
  78. package/esm2022/lib/components/forms/components/select/components/native-select/components/native-select/native-select.component.mjs +6 -6
  79. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-input/native-select-input.directive.mjs +3 -3
  80. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-option/native-select-option.directive.mjs +3 -3
  81. package/esm2022/lib/components/forms/components/select/components/native-select/partials/native-select-option/native-select-option.component.mjs +3 -3
  82. package/esm2022/lib/components/forms/components/select/components/select/components/select/select.component.mjs +6 -6
  83. package/esm2022/lib/components/forms/components/select/components/select/directives/select/select.directive.mjs +3 -3
  84. package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.mjs +3 -3
  85. package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.mjs +3 -3
  86. package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.mjs +3 -3
  87. package/esm2022/lib/components/forms/components/select/components/select/partials/select-option/select-option.component.mjs +3 -3
  88. package/esm2022/lib/components/forms/components/select/components/select-field/select-field.component.mjs +6 -6
  89. package/esm2022/lib/components/forms/components/select/directives/select-field/select-field.directive.mjs +3 -3
  90. package/esm2022/lib/components/forms/components/selection-list/components/selection-list-field/selection-list-field.component.mjs +4 -5
  91. package/esm2022/lib/components/forms/components/selection-list/components/selection-list-option/selection-list-option.component.mjs +5 -5
  92. package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-field/selection-list-field.directive.mjs +3 -3
  93. package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-option/selection-list-option.directive.mjs +3 -3
  94. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle/slide-toggle.component.mjs +3 -3
  95. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle-field/slide-toggle-field.component.mjs +3 -3
  96. package/esm2022/lib/components/forms/components/slide-toggle/directives/slide-toggle/slide-toggle.directive.mjs +3 -3
  97. package/esm2022/lib/components/forms/components/slider/components/slider/slider.component.mjs +6 -6
  98. package/esm2022/lib/components/forms/components/slider/components/slider-field/slider-field.component.mjs +6 -6
  99. package/esm2022/lib/components/forms/directives/dynamic-form-field/dynamic-form-field.directive.mjs +3 -3
  100. package/esm2022/lib/components/forms/directives/dynamic-form-group/dynamic-form-group.directive.mjs +3 -3
  101. package/esm2022/lib/components/forms/directives/expose-input-vars/expose-input-vars.directive.mjs +3 -3
  102. package/esm2022/lib/components/forms/directives/if-input-empty/if-input-empty.directive.mjs +3 -3
  103. package/esm2022/lib/components/forms/directives/if-input-filled/if-input-filled.directive.mjs +3 -3
  104. package/esm2022/lib/components/forms/directives/input/input.directive.mjs +3 -3
  105. package/esm2022/lib/components/forms/directives/input-prefix/input-prefix.directive.mjs +3 -3
  106. package/esm2022/lib/components/forms/directives/input-suffix/input-suffix.directive.mjs +3 -3
  107. package/esm2022/lib/components/forms/directives/native-input-ref/native-input-ref.directive.mjs +3 -3
  108. package/esm2022/lib/components/forms/directives/static-form-field/static-form-field.directive.mjs +3 -3
  109. package/esm2022/lib/components/forms/directives/static-form-group/static-form-group.directive.mjs +3 -3
  110. package/esm2022/lib/components/forms/directives/writeable-input/writeable-input.directive.mjs +3 -3
  111. package/esm2022/lib/components/forms/services/default-validator-errors.service.mjs +3 -3
  112. package/esm2022/lib/components/forms/services/form-field-state.service.mjs +3 -3
  113. package/esm2022/lib/components/forms/services/form-group-state.service.mjs +3 -3
  114. package/esm2022/lib/components/forms/services/input-state.service.mjs +3 -3
  115. package/esm2022/lib/components/forms/utils/decorated-form-field.base.mjs +3 -3
  116. package/esm2022/lib/components/forms/utils/decorated-input.base.mjs +3 -3
  117. package/esm2022/lib/components/forms/utils/input.base.mjs +3 -3
  118. package/esm2022/lib/components/icons/chevron-icon/chevron-icon.component.mjs +3 -3
  119. package/esm2022/lib/components/masonry/components/masonry/masonry.component.mjs +3 -3
  120. package/esm2022/lib/components/masonry/partials/masonry-item/masonry-item.component.mjs +3 -3
  121. package/esm2022/lib/components/overlay/components/bottom-sheet/components/bottom-sheet-container/bottom-sheet-container.component.mjs +3 -3
  122. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/bottom-sheet-container-base.component.mjs +3 -3
  123. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-drag-handle/bottom-sheet-drag-handle.component.mjs +3 -3
  124. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-title/bottom-sheet-title.directive.mjs +3 -3
  125. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-base.service.mjs +3 -3
  126. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-swipe-handler.service.mjs +3 -3
  127. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet.service.mjs +3 -3
  128. package/esm2022/lib/components/overlay/components/dialog/components/dialog-container/dialog-container.component.mjs +3 -3
  129. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-close/dialog-close.directive.mjs +3 -3
  130. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-container-base/dialog-container-base.component.mjs +3 -3
  131. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-title/dialog-title.directive.mjs +3 -3
  132. package/esm2022/lib/components/overlay/components/dialog/services/dialog-base.service.mjs +3 -3
  133. package/esm2022/lib/components/overlay/components/dialog/services/dialog.service.mjs +3 -3
  134. package/esm2022/lib/components/overlay/components/menu/context-menu-trigger.mjs +6 -6
  135. package/esm2022/lib/components/overlay/components/menu/menu-aim.mjs +6 -6
  136. package/esm2022/lib/components/overlay/components/menu/menu-bar.mjs +3 -3
  137. package/esm2022/lib/components/overlay/components/menu/menu-base.mjs +3 -3
  138. package/esm2022/lib/components/overlay/components/menu/menu-group.mjs +3 -3
  139. package/esm2022/lib/components/overlay/components/menu/menu-item-checkbox.mjs +3 -3
  140. package/esm2022/lib/components/overlay/components/menu/menu-item-radio.mjs +3 -3
  141. package/esm2022/lib/components/overlay/components/menu/menu-item-selectable.mjs +3 -3
  142. package/esm2022/lib/components/overlay/components/menu/menu-item.mjs +3 -3
  143. package/esm2022/lib/components/overlay/components/menu/menu-module.mjs +4 -4
  144. package/esm2022/lib/components/overlay/components/menu/menu-stack.mjs +3 -3
  145. package/esm2022/lib/components/overlay/components/menu/menu-trigger-base.mjs +3 -3
  146. package/esm2022/lib/components/overlay/components/menu/menu-trigger.mjs +3 -3
  147. package/esm2022/lib/components/overlay/components/menu/menu.mjs +3 -3
  148. package/esm2022/lib/components/overlay/components/overlay/components/overlay-container/overlay-container.component.mjs +3 -3
  149. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-close/overlay-close.directive.mjs +3 -3
  150. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-title/overlay-title.directive.mjs +3 -3
  151. package/esm2022/lib/components/overlay/components/overlay/services/overlay.service.mjs +4 -4
  152. package/esm2022/lib/components/overlay/components/toggletip/components/toggletip/toggletip.component.mjs +8 -8
  153. package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.mjs +3 -3
  154. package/esm2022/lib/components/overlay/components/tooltip/components/tooltip/tooltip.component.mjs +8 -8
  155. package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.mjs +4 -4
  156. package/esm2022/lib/components/overlay/directives/dynamic-overlay-title/dynamic-overlay-title.directive.mjs +3 -3
  157. package/esm2022/lib/components/overlay/directives/overlay-close-auto-blocker/overlay-close-auto-blocker.directive.mjs +3 -3
  158. package/esm2022/lib/components/overlay/services/dynamic-overlay.service.mjs +3 -3
  159. package/esm2022/lib/components/pagination/components/pagination/pagination.component.mjs +7 -7
  160. package/esm2022/lib/components/pagination/partials/pagination-link/pagination-link.directive.mjs +3 -3
  161. package/esm2022/lib/components/pagination/services/pagination-head.service.mjs +4 -4
  162. package/esm2022/lib/components/pagination/utils/pagination.util.mjs +1 -1
  163. package/esm2022/lib/components/picture/picture-data.directive.mjs +3 -3
  164. package/esm2022/lib/components/picture/picture.component.mjs +8 -8
  165. package/esm2022/lib/components/picture/pipes/normalize-source/normalize-source.pipe.mjs +3 -3
  166. package/esm2022/lib/components/progress-spinner/progress-spinner.component.mjs +6 -6
  167. package/esm2022/lib/components/query-error/components/query-error/query-error.component.mjs +5 -6
  168. package/esm2022/lib/components/query-error/directives/query-error/query-error.directive.mjs +3 -3
  169. package/esm2022/lib/components/scrollable/components/scrollable/scrollable.component.mjs +219 -146
  170. package/esm2022/lib/components/skeleton/components/skeleton/skeleton.component.mjs +3 -3
  171. package/esm2022/lib/components/skeleton/partials/skeleton-item/skeleton-item.component.mjs +3 -3
  172. package/esm2022/lib/components/sort/components/sort-header/sort-header.component.mjs +5 -6
  173. package/esm2022/lib/components/sort/partials/sort/sort.directive.mjs +3 -3
  174. package/esm2022/lib/components/sort/services/sort-header-intl.mjs +3 -3
  175. package/esm2022/lib/components/table/components/table/table.component.mjs +3 -3
  176. package/esm2022/lib/components/table/partials/cells/cell/cell.directive.mjs +3 -3
  177. package/esm2022/lib/components/table/partials/cells/cell-def/cell-def.directive.mjs +3 -3
  178. package/esm2022/lib/components/table/partials/cells/column-def/column-def.directive.mjs +3 -3
  179. package/esm2022/lib/components/table/partials/cells/footer-cell/footer-cell.directive.mjs +3 -3
  180. package/esm2022/lib/components/table/partials/cells/footer-cell-def/footer-cell-def.directive.mjs +3 -3
  181. package/esm2022/lib/components/table/partials/cells/header-cell/header-cell.directive.mjs +3 -3
  182. package/esm2022/lib/components/table/partials/cells/header-cell-def/header-cell-def.directive.mjs +3 -3
  183. package/esm2022/lib/components/table/partials/cells/text-column/text-column.component.mjs +3 -3
  184. package/esm2022/lib/components/table/partials/rows/footer-row/footer-row.component.mjs +3 -3
  185. package/esm2022/lib/components/table/partials/rows/footer-row-def/footer-row-def.directive.mjs +3 -3
  186. package/esm2022/lib/components/table/partials/rows/header-row/header-row.component.mjs +3 -3
  187. package/esm2022/lib/components/table/partials/rows/header-row-def/header-row-def.directive.mjs +3 -3
  188. package/esm2022/lib/components/table/partials/rows/no-data-row/no-data-row.directive.mjs +3 -3
  189. package/esm2022/lib/components/table/partials/rows/recycle-rows/recycle-rows.directive.mjs +3 -3
  190. package/esm2022/lib/components/table/partials/rows/row/row.component.mjs +3 -3
  191. package/esm2022/lib/components/table/partials/rows/row-def/row-def.directive.mjs +3 -3
  192. package/esm2022/lib/components/table/partials/table-busy/table-busy.directive.mjs +3 -3
  193. package/esm2022/lib/components/table/partials/table-busy-outlet/table-busy-outlet.directive.mjs +3 -3
  194. package/esm2022/lib/components/tabs/components/inline-tabs/inline-tabs.component.mjs +7 -9
  195. package/esm2022/lib/components/tabs/components/nav-tabs/nav-tabs.component.mjs +3 -3
  196. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab/inline-tab.component.mjs +3 -3
  197. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body/inline-tab-body.component.mjs +3 -3
  198. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body-host/inline-tab-body-host.directive.mjs +3 -3
  199. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-content/inline-tab-content.directive.mjs +3 -3
  200. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-header/inline-tab-header.component.mjs +3 -3
  201. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label/inline-tab-label.directive.mjs +3 -3
  202. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label-wrapper/inline-tab-label-wrapper.directive.mjs +3 -3
  203. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tab-link/nav-tab-link.directive.mjs +3 -3
  204. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tabs-outlet/nav-tabs-outlet.component.mjs +3 -3
  205. package/esm2022/lib/components/tabs/utils/active-tab-underline.util.mjs +3 -3
  206. package/esm2022/lib/components/tabs/utils/paginated-tab-header.directive.mjs +21 -13
  207. package/esm2022/lib/services/swipe-handler.service.mjs +3 -3
  208. package/fesm2022/ethlete-cdk.mjs +898 -834
  209. package/fesm2022/ethlete-cdk.mjs.map +1 -1
  210. package/lib/components/picture/picture.component.d.ts +1 -1
  211. package/lib/components/scrollable/components/scrollable/scrollable.component.d.ts +55 -35
  212. package/lib/components/tabs/utils/paginated-tab-header.directive.d.ts +1 -1
  213. package/package.json +7 -7
@@ -1,18 +1,63 @@
1
- import { NgClass, NgIf } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, ContentChildren, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild, ViewChildren, ViewEncapsulation, booleanAttribute, computed, effect, inject, isDevMode, numberAttribute, signal, } from '@angular/core';
3
- import { CursorDragScrollDirective, IS_ACTIVE_ELEMENT, IS_ELEMENT, LetDirective, ObserveScrollStateDirective, TypedQueryList, createDestroy, getElementVisibleStates, scrollToElement, signalElementIntersection, signalElementScrollState, signalHostAttributes, } from '@ethlete/core';
1
+ import { NgClass } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, booleanAttribute, computed, effect, inject, isDevMode, numberAttribute, signal, } from '@angular/core';
3
+ import { CursorDragScrollDirective, IS_ACTIVE_ELEMENT, IS_ELEMENT, LetDirective, ObserveScrollStateDirective, TypedQueryList, createDestroy, getElementVisibleStates, isElementVisible, nextFrame, scrollToElement, signalElementIntersection, signalElementScrollState, signalHostAttributes, signalHostClasses, } from '@ethlete/core';
4
4
  import { BehaviorSubject, debounceTime, fromEvent, merge, of, startWith, takeUntil, tap } from 'rxjs';
5
5
  import { ChevronIconComponent } from '../../../icons';
6
6
  import * as i0 from "@angular/core";
7
7
  export class ScrollableComponent {
8
- set scrollableList(list) {
9
- this._scrollableList.set(list);
8
+ set _itemSize(v) {
9
+ this.itemSize.set(v);
10
10
  }
11
- set firstElementList(list) {
12
- this._firstElementList.set(list);
11
+ set _direction(v) {
12
+ this.direction.set(v);
13
13
  }
14
- set lastElementList(list) {
15
- this._lastElementList.set(list);
14
+ set _scrollableRole(v) {
15
+ this.scrollableRole.set(v);
16
+ }
17
+ set _scrollableClass(v) {
18
+ this.scrollableClass.set(v);
19
+ }
20
+ set _renderMasks(v) {
21
+ this.renderMasks.set(v);
22
+ }
23
+ set _renderButtons(v) {
24
+ this.renderButtons.set(v);
25
+ }
26
+ set _renderScrollbars(v) {
27
+ this.renderScrollbars.set(v);
28
+ }
29
+ set _stickyButtons(v) {
30
+ this.stickyButtons.set(v);
31
+ }
32
+ set _cursorDragScroll(v) {
33
+ this.cursorDragScroll.set(v);
34
+ }
35
+ set _disableActiveElementScrolling(v) {
36
+ this.disableActiveElementScrolling.set(v);
37
+ }
38
+ set _scrollMode(v) {
39
+ this.scrollMode.set(v);
40
+ }
41
+ set _snap(v) {
42
+ this.snap.set(v);
43
+ }
44
+ set _scrollMargin(v) {
45
+ this.scrollMargin.set(v);
46
+ }
47
+ set _scrollable(e) {
48
+ this.scrollable.set(e);
49
+ }
50
+ set _firstElement(e) {
51
+ this.firstElement.set(e);
52
+ }
53
+ set _lastElement(e) {
54
+ this.lastElement.set(e);
55
+ }
56
+ set _activeElementList(e) {
57
+ this.activeElementList.set(e);
58
+ }
59
+ set _elementList(e) {
60
+ this.elementList.set(e);
16
61
  }
17
62
  get highestVisibleIntersection() {
18
63
  const elements = this._latestVisibilityStates$.value;
@@ -66,87 +111,121 @@ export class ScrollableComponent {
66
111
  this._elementRef = inject(ElementRef);
67
112
  this._isCursorDragging$ = new BehaviorSubject(false);
68
113
  this._latestVisibilityStates$ = new BehaviorSubject([]);
69
- this.itemSize = 'auto';
70
- this.direction = 'horizontal';
71
- this.renderMasks = true;
72
- this.renderButtons = true;
73
- this.renderScrollbars = false;
74
- this.stickyButtons = false;
75
- this.cursorDragScroll = true;
76
- this.disableActiveElementScrolling = false;
77
- this.scrollMode = 'container';
78
- this.snap = false;
79
- this.scrollMargin = 0;
114
+ this.itemSize = signal('auto');
115
+ this.direction = signal('horizontal');
116
+ this.scrollableRole = signal(null);
117
+ this.scrollableClass = signal(null);
118
+ this.renderMasks = signal(true);
119
+ this.renderButtons = signal(true);
120
+ this.renderScrollbars = signal(false);
121
+ this.stickyButtons = signal(false);
122
+ this.cursorDragScroll = signal(true);
123
+ this.disableActiveElementScrolling = signal(false);
124
+ this.scrollMode = signal('container');
125
+ this.snap = signal(false);
126
+ this.scrollMargin = signal(0);
80
127
  this.scrollStateChange = new EventEmitter();
81
128
  this.intersectionChange = new EventEmitter();
82
- this._scrollableList = signal(null);
83
- this._firstElementList = signal(null);
84
- this._lastElementList = signal(null);
85
- this.activeElements = null;
86
- this.elements = null;
87
- this.containerScrollState = signalElementScrollState(this._scrollableList);
88
- this.firstElementIntersection = signalElementIntersection(this._firstElementList, this._scrollableList);
89
- this.lastElementIntersection = signalElementIntersection(this._lastElementList, this._scrollableList);
90
- this.shouldAnimateOverlays = computed(() => !!this.firstElementIntersection() && !!this.lastElementIntersection());
129
+ this.scrollable = signal(null);
130
+ this.firstElement = signal(null);
131
+ this.lastElement = signal(null);
132
+ this.activeElementList = signal(null);
133
+ this.elementList = signal(null);
134
+ this.containerScrollState = signalElementScrollState(this.scrollable);
135
+ this.firstElementIntersection = signalElementIntersection(this.firstElement, { root: this.scrollable });
136
+ this.firstElementVisibility = signal(null);
137
+ this.lastElementIntersection = signalElementIntersection(this.lastElement, { root: this.scrollable });
138
+ this.lastElementVisibility = signal(null);
91
139
  this.canScroll = computed(() => {
92
- const dir = this.direction;
140
+ const dir = this.direction();
93
141
  if (dir === 'horizontal') {
94
142
  return this.containerScrollState().canScrollHorizontally;
95
143
  }
96
144
  return this.containerScrollState().canScrollVertically;
97
145
  });
98
- this.isAtStart = computed(() => this.canScroll() ? this.firstElementIntersection().isIntersecting : true);
99
- this.isAtEnd = computed(() => this.canScroll() ? this.lastElementIntersection().isIntersecting : true);
146
+ this.isAtStart = computed(() => {
147
+ if (!this.canScroll()) {
148
+ return true;
149
+ }
150
+ const intersection = this.firstElementIntersection();
151
+ if (!intersection) {
152
+ return this.firstElementVisibility()?.inline ?? true;
153
+ }
154
+ return intersection.isIntersecting;
155
+ });
156
+ this.isAtEnd = computed(() => {
157
+ if (!this.canScroll()) {
158
+ return true;
159
+ }
160
+ const intersection = this.lastElementIntersection();
161
+ if (!intersection) {
162
+ return this.lastElementVisibility()?.inline ?? true;
163
+ }
164
+ return intersection.isIntersecting;
165
+ });
166
+ this.enableOverlayAnimations = signal(false);
100
167
  this.hostAttributes = signalHostAttributes({
101
- 'can-scroll': this.canScroll,
102
- 'at-start': this.isAtStart,
103
- 'at-end': this.isAtEnd,
104
- 'animate-overlays': this.shouldAnimateOverlays,
168
+ 'item-size': this.itemSize,
169
+ direction: this.direction,
170
+ 'render-scrollbars': this.renderScrollbars,
171
+ 'sticky-buttons': this.stickyButtons,
105
172
  });
173
+ this.hostClasses = signalHostClasses({
174
+ 'et-scrollable--can-scroll': this.canScroll,
175
+ 'et-scrollable--is-at-start': this.isAtStart,
176
+ 'et-scrollable--is-at-end': this.isAtEnd,
177
+ 'et-scrollable--enable-overlay-animations': this.enableOverlayAnimations,
178
+ });
179
+ effect(() => {
180
+ const scrollable = this.scrollable()?.nativeElement;
181
+ const firstElement = this.firstElement()?.nativeElement;
182
+ const lastElement = this.lastElement()?.nativeElement;
183
+ const activeElementList = this.activeElementList()?.toArray();
184
+ if (!scrollable || !firstElement || !lastElement || !activeElementList) {
185
+ return;
186
+ }
187
+ const firstActive = activeElementList.find((a) => a.isActiveElement);
188
+ if (firstActive && !this.disableActiveElementScrolling()) {
189
+ const offsetTop = firstActive.elementRef.nativeElement.offsetTop - scrollable.offsetTop;
190
+ const offsetLeft = firstActive.elementRef.nativeElement.offsetLeft - scrollable.offsetLeft;
191
+ scrollable.scrollLeft = offsetLeft;
192
+ scrollable.scrollTop = offsetTop;
193
+ }
194
+ this.firstElementVisibility.set(isElementVisible({
195
+ container: scrollable,
196
+ element: firstElement,
197
+ }));
198
+ this.lastElementVisibility.set(isElementVisible({
199
+ container: scrollable,
200
+ element: lastElement,
201
+ }));
202
+ // We need to wait one frame before enabling animations to prevent a animation from playing during initial render.
203
+ nextFrame(() => this.enableOverlayAnimations.set(true));
204
+ }, { allowSignalWrites: true });
106
205
  effect(() => {
107
206
  const isAtStart = this.isAtStart();
108
207
  const isAtEnd = this.isAtEnd();
109
208
  const canScroll = this.canScroll();
110
209
  this.scrollStateChange.emit({
111
210
  canScroll,
112
- isAtEnd,
113
- isAtStart,
211
+ isAtEnd: !!isAtEnd,
212
+ isAtStart: !!isAtStart,
114
213
  });
115
214
  });
116
215
  }
117
216
  ngAfterContentInit() {
118
- if (!this.activeElements || !this.elements) {
119
- return;
120
- }
121
- this.activeElements.changes
122
- .pipe(startWith(this.activeElements), tap((activeElements) => {
123
- if (this.disableActiveElementScrolling) {
124
- return;
125
- }
126
- const firstActive = activeElements
127
- .filter((a) => !!a)
128
- .find((a) => a.isActiveElement);
129
- if (!firstActive) {
130
- return;
131
- }
132
- scrollToElement({
133
- behavior: 'auto',
134
- container: this.scrollable.nativeElement,
135
- element: firstActive.elementRef.nativeElement,
136
- scrollInlineMargin: this.direction === 'horizontal' ? this.scrollMargin : 0,
137
- scrollBlockMargin: this.direction === 'horizontal' ? 0 : this.scrollMargin,
138
- });
139
- }), takeUntil(this._destroy$))
140
- .subscribe();
141
217
  this._setupScrollListening();
142
218
  }
143
219
  scrollOneContainerSize(direction) {
144
- const scrollElement = this.scrollable.nativeElement;
220
+ const scrollElement = this.scrollable()?.nativeElement;
221
+ if (!scrollElement) {
222
+ return;
223
+ }
145
224
  const parent = this._elementRef.nativeElement;
146
- const scrollableSize = this.direction === 'horizontal' ? parent.clientWidth : parent.clientHeight;
147
- const currentScroll = this.direction === 'horizontal' ? scrollElement.scrollLeft : scrollElement.scrollTop;
225
+ const scrollableSize = this.direction() === 'horizontal' ? parent.clientWidth : parent.clientHeight;
226
+ const currentScroll = this.direction() === 'horizontal' ? scrollElement.scrollLeft : scrollElement.scrollTop;
148
227
  scrollElement.scrollTo({
149
- [this.direction === 'horizontal' ? 'left' : 'top']: currentScroll + (direction === 'start' ? -scrollableSize : scrollableSize),
228
+ [this.direction() === 'horizontal' ? 'left' : 'top']: currentScroll + (direction === 'start' ? -scrollableSize : scrollableSize),
150
229
  behavior: 'smooth',
151
230
  });
152
231
  }
@@ -164,39 +243,39 @@ export class ScrollableComponent {
164
243
  }
165
244
  this.scrollToElement({
166
245
  element: el?.element,
167
- direction: this.direction === 'horizontal' ? 'inline' : 'block',
246
+ direction: this.direction() === 'horizontal' ? 'inline' : 'block',
168
247
  origin: direction,
169
- ...(this.direction === 'horizontal'
170
- ? { scrollInlineMargin: this.scrollMargin }
171
- : { scrollBlockMargin: this.scrollMargin }),
248
+ ...(this.direction() === 'horizontal'
249
+ ? { scrollInlineMargin: this.scrollMargin() }
250
+ : { scrollBlockMargin: this.scrollMargin() }),
172
251
  });
173
252
  }
174
253
  scrollToElement(options) {
175
- const scrollElement = this.scrollable.nativeElement;
254
+ const scrollElement = this.scrollable()?.nativeElement;
176
255
  scrollToElement({
177
256
  container: scrollElement,
178
- ...(this.direction === 'horizontal'
179
- ? { scrollInlineMargin: this.scrollMargin }
180
- : { scrollBlockMargin: this.scrollMargin }),
257
+ ...(this.direction() === 'horizontal'
258
+ ? { scrollInlineMargin: this.scrollMargin() }
259
+ : { scrollBlockMargin: this.scrollMargin() }),
181
260
  ...options,
182
261
  });
183
262
  }
184
263
  scrollToElementByIndex(options) {
185
- const elements = this.elements?.toArray() ?? [];
264
+ const elements = this.elementList()?.toArray() ?? [];
186
265
  if (!elements.length) {
187
266
  if (isDevMode()) {
188
267
  console.warn('No elements found to scroll to. Make sure to apply the isElement directive to the elements you want to scroll to.');
189
268
  }
190
269
  return;
191
270
  }
192
- const scrollElement = this.scrollable.nativeElement;
271
+ const scrollElement = this.scrollable()?.nativeElement;
193
272
  const element = elements[options.index]?.elementRef.nativeElement;
194
273
  scrollToElement({
195
274
  container: scrollElement,
196
275
  element,
197
- ...(this.direction === 'horizontal'
198
- ? { scrollInlineMargin: this.scrollMargin }
199
- : { scrollBlockMargin: this.scrollMargin }),
276
+ ...(this.direction() === 'horizontal'
277
+ ? { scrollInlineMargin: this.scrollMargin() }
278
+ : { scrollBlockMargin: this.scrollMargin() }),
200
279
  ...options,
201
280
  });
202
281
  }
@@ -204,7 +283,7 @@ export class ScrollableComponent {
204
283
  this._isCursorDragging$.next(isDragging);
205
284
  }
206
285
  scrollToStartDirection() {
207
- if (this.scrollMode === 'container') {
286
+ if (this.scrollMode() === 'container') {
208
287
  this.scrollOneContainerSize('start');
209
288
  }
210
289
  else {
@@ -212,7 +291,7 @@ export class ScrollableComponent {
212
291
  }
213
292
  }
214
293
  scrollToStartEnd() {
215
- if (this.scrollMode === 'container') {
294
+ if (this.scrollMode() === 'container') {
216
295
  this.scrollOneContainerSize('end');
217
296
  }
218
297
  else {
@@ -220,7 +299,11 @@ export class ScrollableComponent {
220
299
  }
221
300
  }
222
301
  _setupScrollListening() {
223
- const scrollElement = this.scrollable.nativeElement;
302
+ const scrollElement = this.scrollable()?.nativeElement;
303
+ const elements = this.elementList();
304
+ if (!scrollElement || !elements) {
305
+ return;
306
+ }
224
307
  let isSnapping = false;
225
308
  let snapTimeout = 0;
226
309
  merge(fromEvent(scrollElement, 'wheel'), fromEvent(scrollElement, 'touchstart'))
@@ -228,21 +311,21 @@ export class ScrollableComponent {
228
311
  isSnapping = false;
229
312
  }))
230
313
  .subscribe();
231
- merge(fromEvent(scrollElement, 'scroll'), this._isCursorDragging$, this.elements?.changes.pipe(startWith(this.elements)) ?? of(null))
314
+ merge(fromEvent(scrollElement, 'scroll'), this._isCursorDragging$, elements.changes.pipe(startWith(elements)) ?? of(null))
232
315
  .pipe(debounceTime(300), takeUntil(this._destroy$), tap(() => {
233
- const elements = this.elements
316
+ const els = elements
234
317
  ?.toArray()
235
318
  .map((e) => e?.elementRef.nativeElement)
236
319
  .filter((e) => !!e) ?? [];
237
- if (!elements.length) {
320
+ if (!els.length) {
238
321
  this._latestVisibilityStates$.next([]);
239
322
  return;
240
323
  }
241
324
  const states = getElementVisibleStates({
242
- elements,
325
+ elements: els,
243
326
  container: scrollElement,
244
327
  });
245
- const prop = this.direction === 'horizontal' ? 'inlineIntersection' : 'blockIntersection';
328
+ const prop = this.direction() === 'horizontal' ? 'inlineIntersection' : 'blockIntersection';
246
329
  const stateClass = `et-element--is-intersecting`;
247
330
  for (const state of states) {
248
331
  if (state[prop] === 100) {
@@ -263,7 +346,7 @@ export class ScrollableComponent {
263
346
  });
264
347
  this.intersectionChange.emit(intersectionChanges);
265
348
  this._latestVisibilityStates$.next(intersectionChanges);
266
- if (isSnapping || this._isCursorDragging$.value || !this.snap)
349
+ if (isSnapping || this._isCursorDragging$.value || !this.snap())
267
350
  return;
268
351
  const prev = this.previousPartialIntersection;
269
352
  const next = this.nextPartialIntersection;
@@ -283,10 +366,10 @@ export class ScrollableComponent {
283
366
  scrollToElement({
284
367
  container: scrollElement,
285
368
  element: highestIntersecting.element,
286
- direction: this.direction === 'horizontal' ? 'inline' : 'block',
369
+ direction: this.direction() === 'horizontal' ? 'inline' : 'block',
287
370
  origin,
288
- scrollBlockMargin: this.direction === 'horizontal' ? 0 : this.scrollMargin,
289
- scrollInlineMargin: this.direction === 'horizontal' ? this.scrollMargin : 0,
371
+ scrollBlockMargin: this.direction() === 'horizontal' ? 0 : this.scrollMargin(),
372
+ scrollInlineMargin: this.direction() === 'horizontal' ? this.scrollMargin() : 0,
290
373
  });
291
374
  isSnapping = true;
292
375
  window.clearTimeout(snapTimeout);
@@ -296,81 +379,71 @@ export class ScrollableComponent {
296
379
  }))
297
380
  .subscribe();
298
381
  }
299
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: ScrollableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
300
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.1", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { itemSize: "itemSize", direction: "direction", scrollableRole: "scrollableRole", scrollableClass: "scrollableClass", renderMasks: ["renderMasks", "renderMasks", booleanAttribute], renderButtons: ["renderButtons", "renderButtons", booleanAttribute], renderScrollbars: ["renderScrollbars", "renderScrollbars", booleanAttribute], stickyButtons: ["stickyButtons", "stickyButtons", booleanAttribute], cursorDragScroll: ["cursorDragScroll", "cursorDragScroll", booleanAttribute], disableActiveElementScrolling: ["disableActiveElementScrolling", "disableActiveElementScrolling", booleanAttribute], scrollMode: "scrollMode", snap: ["snap", "snap", booleanAttribute], scrollMargin: ["scrollMargin", "scrollMargin", numberAttribute] }, outputs: { scrollStateChange: "scrollStateChange", intersectionChange: "intersectionChange" }, host: { properties: { "attr.item-size": "this.itemSize", "attr.direction": "this.direction", "attr.render-scrollbars": "this.renderScrollbars", "attr.sticky-buttons": "this.stickyButtons" }, classAttribute: "et-scrollable" }, queries: [{ propertyName: "activeElements", predicate: IS_ACTIVE_ELEMENT, descendants: true }, { propertyName: "elements", predicate: IS_ELEMENT, descendants: true }], viewQueries: [{ propertyName: "scrollable", first: true, predicate: ["scrollable"], descendants: true, static: true }, { propertyName: "scrollableList", predicate: ["scrollable"], descendants: true }, { propertyName: "firstElementList", predicate: ["firstElement"], descendants: true }, { propertyName: "lastElementList", predicate: ["lastElement"], descendants: true }], ngImport: i0, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll\"\n [allowedDirection]=\"direction\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n>\n <div [ngClass]=\"scrollableClass\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\"></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\"></div>\n </div>\n</div>\n\n<div *ngIf=\"renderMasks\" class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n</div>\n\n<div *ngIf=\"renderButtons\" class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollToStartEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</div>\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container-outer{overflow-x:auto;overflow-y:hidden;grid-template-columns:auto 1fr auto}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container-outer{overflow-x:hidden;overflow-y:auto;grid-template-rows:auto 1fr auto}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:rotate(180deg)}.et-scrollable[at-start=false] .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable[at-end=false] .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container-outer{overflow:auto;display:grid;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{position:absolute;block-size:100%;inline-size:1px;pointer-events:none}.et-scrollable .et-scroll-observer-first-element{inset-inline-start:1px}.et-scrollable .et-scroll-observer-last-element{inset-inline-end:1px}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);position:relative}.et-scrollable[animate-overlays=true] .et-scrollable-mask,.et-scrollable[animate-overlays=true] .et-scrollable-button{transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}\n"], dependencies: [{ kind: "directive", type: CursorDragScrollDirective, selector: "[etCursorDragScroll]", inputs: ["etCursorDragScroll", "allowedDirection"], outputs: ["cursorDragStart", "cursorDragMove", "cursorDragEnd"], exportAs: ["etCursorDragScroll"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
382
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ScrollableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
383
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.2", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { _itemSize: ["itemSize", "_itemSize"], _direction: ["direction", "_direction"], _scrollableRole: ["scrollableRole", "_scrollableRole"], _scrollableClass: ["scrollableClass", "_scrollableClass"], _renderMasks: ["renderMasks", "_renderMasks", booleanAttribute], _renderButtons: ["renderButtons", "_renderButtons", booleanAttribute], _renderScrollbars: ["renderScrollbars", "_renderScrollbars", booleanAttribute], _stickyButtons: ["stickyButtons", "_stickyButtons", booleanAttribute], _cursorDragScroll: ["cursorDragScroll", "_cursorDragScroll", booleanAttribute], _disableActiveElementScrolling: ["disableActiveElementScrolling", "_disableActiveElementScrolling", booleanAttribute], _scrollMode: ["scrollMode", "_scrollMode"], _snap: ["snap", "_snap", booleanAttribute], _scrollMargin: ["scrollMargin", "_scrollMargin", numberAttribute] }, outputs: { scrollStateChange: "scrollStateChange", intersectionChange: "intersectionChange" }, host: { classAttribute: "et-scrollable" }, queries: [{ propertyName: "_activeElementList", predicate: IS_ACTIVE_ELEMENT, descendants: true }, { propertyName: "_elementList", predicate: IS_ELEMENT, descendants: true }], viewQueries: [{ propertyName: "_scrollable", first: true, predicate: ["scrollable"], descendants: true, static: true }, { propertyName: "_firstElement", first: true, predicate: ["firstElement"], descendants: true, static: true }, { propertyName: "_lastElement", first: true, predicate: ["lastElement"], descendants: true, static: true }], ngImport: i0, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll()\"\n [allowedDirection]=\"direction()\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n>\n <div [ngClass]=\"scrollableClass()\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\"></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\"></div>\n </div>\n</div>\n\n@if (renderMasks()) {\n <div class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n </div>\n}\n\n@if (renderButtons()) {\n <div class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollToStartEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n </div>\n}\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container-outer{overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container-outer{overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:rotate(180deg)}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container-outer{overflow:auto;display:grid;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{position:absolute;block-size:100%;inline-size:1px;pointer-events:none}.et-scrollable .et-scroll-observer-first-element{inset-inline-start:1px}.et-scrollable .et-scroll-observer-last-element{inset-inline-end:1px}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);position:relative}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-mask,.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-button{transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}\n"], dependencies: [{ kind: "directive", type: CursorDragScrollDirective, selector: "[etCursorDragScroll]", inputs: ["etCursorDragScroll", "allowedDirection"], outputs: ["cursorDragStart", "cursorDragMove", "cursorDragEnd"], exportAs: ["etCursorDragScroll"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
301
384
  }
302
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: ScrollableComponent, decorators: [{
385
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ScrollableComponent, decorators: [{
303
386
  type: Component,
304
- args: [{ selector: 'et-scrollable', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CursorDragScrollDirective, ObserveScrollStateDirective, NgClass, NgIf, LetDirective, ChevronIconComponent], host: {
387
+ args: [{ selector: 'et-scrollable', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CursorDragScrollDirective, ObserveScrollStateDirective, NgClass, LetDirective, ChevronIconComponent], host: {
305
388
  class: 'et-scrollable',
306
- }, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll\"\n [allowedDirection]=\"direction\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n>\n <div [ngClass]=\"scrollableClass\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\"></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\"></div>\n </div>\n</div>\n\n<div *ngIf=\"renderMasks\" class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n</div>\n\n<div *ngIf=\"renderButtons\" class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollToStartEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</div>\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container-outer{overflow-x:auto;overflow-y:hidden;grid-template-columns:auto 1fr auto}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container-outer{overflow-x:hidden;overflow-y:auto;grid-template-rows:auto 1fr auto}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:rotate(180deg)}.et-scrollable[at-start=false] .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable[at-start=false] .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable[at-end=false] .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable[at-end=false] .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container-outer{overflow:auto;display:grid;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{position:absolute;block-size:100%;inline-size:1px;pointer-events:none}.et-scrollable .et-scroll-observer-first-element{inset-inline-start:1px}.et-scrollable .et-scroll-observer-last-element{inset-inline-end:1px}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);position:relative}.et-scrollable[animate-overlays=true] .et-scrollable-mask,.et-scrollable[animate-overlays=true] .et-scrollable-button{transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}\n"] }]
307
- }], ctorParameters: () => [], propDecorators: { itemSize: [{
308
- type: Input
309
- }, {
310
- type: HostBinding,
311
- args: ['attr.item-size']
312
- }], direction: [{
313
- type: Input
314
- }, {
315
- type: HostBinding,
316
- args: ['attr.direction']
317
- }], scrollableRole: [{
318
- type: Input
319
- }], scrollableClass: [{
320
- type: Input
321
- }], renderMasks: [{
389
+ }, template: "<div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll()\"\n [allowedDirection]=\"direction()\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n>\n <div [ngClass]=\"scrollableClass()\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\"></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\"></div>\n </div>\n</div>\n\n@if (renderMasks()) {\n <div class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n </div>\n}\n\n@if (renderButtons()) {\n <div class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollToStartEnd()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n </div>\n}\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:grid;position:relative}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container-outer{overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container-outer{overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:rotate(180deg)}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container-outer{overflow:auto;display:grid;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{position:absolute;block-size:100%;inline-size:1px;pointer-events:none}.et-scrollable .et-scroll-observer-first-element{inset-inline-start:1px}.et-scrollable .et-scroll-observer-last-element{inset-inline-end:1px}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);position:relative}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-mask,.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-button{transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}\n"] }]
390
+ }], ctorParameters: () => [], propDecorators: { _itemSize: [{
391
+ type: Input,
392
+ args: [{ alias: 'itemSize' }]
393
+ }], _direction: [{
394
+ type: Input,
395
+ args: [{ alias: 'direction' }]
396
+ }], _scrollableRole: [{
322
397
  type: Input,
323
- args: [{ transform: booleanAttribute }]
324
- }], renderButtons: [{
398
+ args: [{ alias: 'scrollableRole' }]
399
+ }], _scrollableClass: [{
325
400
  type: Input,
326
- args: [{ transform: booleanAttribute }]
327
- }], renderScrollbars: [{
401
+ args: [{ alias: 'scrollableClass' }]
402
+ }], _renderMasks: [{
328
403
  type: Input,
329
- args: [{ transform: booleanAttribute }]
330
- }, {
331
- type: HostBinding,
332
- args: ['attr.render-scrollbars']
333
- }], stickyButtons: [{
404
+ args: [{ transform: booleanAttribute, alias: 'renderMasks' }]
405
+ }], _renderButtons: [{
334
406
  type: Input,
335
- args: [{ transform: booleanAttribute }]
336
- }, {
337
- type: HostBinding,
338
- args: ['attr.sticky-buttons']
339
- }], cursorDragScroll: [{
407
+ args: [{ transform: booleanAttribute, alias: 'renderButtons' }]
408
+ }], _renderScrollbars: [{
340
409
  type: Input,
341
- args: [{ transform: booleanAttribute }]
342
- }], disableActiveElementScrolling: [{
410
+ args: [{ transform: booleanAttribute, alias: 'renderScrollbars' }]
411
+ }], _stickyButtons: [{
343
412
  type: Input,
344
- args: [{ transform: booleanAttribute }]
345
- }], scrollMode: [{
346
- type: Input
347
- }], snap: [{
413
+ args: [{ transform: booleanAttribute, alias: 'stickyButtons' }]
414
+ }], _cursorDragScroll: [{
348
415
  type: Input,
349
- args: [{ transform: booleanAttribute }]
350
- }], scrollMargin: [{
416
+ args: [{ transform: booleanAttribute, alias: 'cursorDragScroll' }]
417
+ }], _disableActiveElementScrolling: [{
351
418
  type: Input,
352
- args: [{ transform: numberAttribute }]
419
+ args: [{ transform: booleanAttribute, alias: 'disableActiveElementScrolling' }]
420
+ }], _scrollMode: [{
421
+ type: Input,
422
+ args: [{ alias: 'scrollMode' }]
423
+ }], _snap: [{
424
+ type: Input,
425
+ args: [{ transform: booleanAttribute, alias: 'snap' }]
426
+ }], _scrollMargin: [{
427
+ type: Input,
428
+ args: [{ transform: numberAttribute, alias: 'scrollMargin' }]
353
429
  }], scrollStateChange: [{
354
430
  type: Output
355
431
  }], intersectionChange: [{
356
432
  type: Output
357
- }], scrollable: [{
433
+ }], _scrollable: [{
358
434
  type: ViewChild,
359
435
  args: ['scrollable', { static: true }]
360
- }], scrollableList: [{
361
- type: ViewChildren,
362
- args: ['scrollable']
363
- }], firstElementList: [{
364
- type: ViewChildren,
365
- args: ['firstElement']
366
- }], lastElementList: [{
367
- type: ViewChildren,
368
- args: ['lastElement']
369
- }], activeElements: [{
436
+ }], _firstElement: [{
437
+ type: ViewChild,
438
+ args: ['firstElement', { static: true }]
439
+ }], _lastElement: [{
440
+ type: ViewChild,
441
+ args: ['lastElement', { static: true }]
442
+ }], _activeElementList: [{
370
443
  type: ContentChildren,
371
444
  args: [IS_ACTIVE_ELEMENT, { descendants: true }]
372
- }], elements: [{
445
+ }], _elementList: [{
373
446
  type: ContentChildren,
374
447
  args: [IS_ELEMENT, { descendants: true }]
375
448
  }] } });
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixVQUFVLEVBR1YsWUFBWSxFQUVaLDJCQUEyQixFQUczQixjQUFjLEVBQ2QsYUFBYSxFQUNiLHVCQUF1QixFQUN2QixlQUFlLEVBQ2YseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4QixvQkFBb0IsR0FDckIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBZXRELE1BQU0sT0FBTyxtQkFBbUI7SUEyRDlCLElBQ2MsY0FBYyxDQUFDLElBQTZDO1FBQ3hFLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFHRCxJQUNjLGdCQUFnQixDQUFDLElBQTZDO1FBQzFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUdELElBQ2MsZUFBZSxDQUFDLElBQTZDO1FBQ3pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQVNELElBQUksMEJBQTBCO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7UUFFckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksdUJBQXVCO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7UUFFckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1FBRW5FLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUMvQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXZHLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsMEJBQTBCLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sV0FBVyxJQUFJLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSwyQkFBMkI7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQztRQUVyRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUM7UUFFbkUsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLGFBQWEsR0FBRyxRQUFRO2FBQzNCLEtBQUssQ0FBQyxDQUFDLEVBQUUsMEJBQTBCLENBQUMsS0FBSyxDQUFDO2FBQzFDLE9BQU8sRUFBRTthQUNULFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdkMsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXZGLE9BQU8sZUFBZSxJQUFJLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBa0NEO1FBckxpQixjQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFDNUIsZ0JBQVcsR0FBRyxNQUFNLENBQTBCLFVBQVUsQ0FBQyxDQUFDO1FBRTFELHVCQUFrQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3pELDZCQUF3QixHQUFHLElBQUksZUFBZSxDQUFpQyxFQUFFLENBQUMsQ0FBQztRQUlwRyxhQUFRLEdBQTZCLE1BQU0sQ0FBQztRQUk1QyxjQUFTLEdBQThCLFlBQVksQ0FBQztRQVNwRCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUduQixrQkFBYSxHQUFHLElBQUksQ0FBQztRQUlyQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFJekIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHdEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBR3hCLGtDQUE2QixHQUFHLEtBQUssQ0FBQztRQUd0QyxlQUFVLEdBQXlCLFdBQVcsQ0FBQztRQUcvQyxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBR2IsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFHUixzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUdsRSx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQVNoRSxvQkFBZSxHQUFHLE1BQU0sQ0FBaUQsSUFBSSxDQUFDLENBQUM7UUFNL0Usc0JBQWlCLEdBQUcsTUFBTSxDQUFpRCxJQUFJLENBQUMsQ0FBQztRQU1qRixxQkFBZ0IsR0FBRyxNQUFNLENBQWlELElBQUksQ0FBQyxDQUFDO1FBR2pHLG1CQUFjLEdBQW9ELElBQUksQ0FBQztRQUd2RSxhQUFRLEdBQThDLElBQUksQ0FBQztRQXFFeEMseUJBQW9CLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RFLDZCQUF3QixHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkcsNEJBQXVCLEdBQUcseUJBQXlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVqRywwQkFBcUIsR0FBRyxRQUFRLENBQ2pELEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQzVFLENBQUM7UUFFaUIsY0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUUzQixJQUFJLEdBQUcsS0FBSyxZQUFZLEVBQUU7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMscUJBQXFCLENBQUM7YUFDMUQ7WUFFRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLG1CQUFtQixDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBRWdCLGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQzNDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3pFLENBQUM7UUFDaUIsWUFBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDekMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDeEUsQ0FBQztRQUVpQixtQkFBYyxHQUFHLG9CQUFvQixDQUFDO1lBQ3ZELFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUztZQUM1QixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3RCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxxQkFBcUI7U0FDL0MsQ0FBQyxDQUFDO1FBR0QsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRW5DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLFNBQVM7Z0JBQ1QsT0FBTztnQkFDUCxTQUFTO2FBQ1YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMxQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU87YUFDeEIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQzlCLEdBQUcsQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQ3JCLElBQUksSUFBSSxDQUFDLDZCQUE2QixFQUFFO2dCQUN0QyxPQUFPO2FBQ1I7WUFFRCxNQUFNLFdBQVcsR0FBRyxjQUFjO2lCQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQWlDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUVsQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNoQixPQUFPO2FBQ1I7WUFFRCxlQUFlLENBQUM7Z0JBQ2QsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWE7Z0JBQ3hDLE9BQU8sRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLGFBQWE7Z0JBQzdDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTthQUMzRSxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsRUFBRSxDQUFDO1FBRWYsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELHNCQUFzQixDQUFDLFNBQTBCO1FBQy9DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBRTlDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ2xHLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1FBRTNHLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDckIsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDaEQsYUFBYSxHQUFHLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUM1RSxRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBMEI7UUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQztRQUVyRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNwQixJQUFJLFNBQVMsRUFBRSxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQ1YsbUhBQW1ILENBQ3BILENBQUM7YUFDSDtZQUNELE9BQU87U0FDUjtRQUVELE1BQU0sRUFBRSxHQUFHLFNBQVMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBRW5HLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTztZQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTztZQUMvRCxNQUFNLEVBQUUsU0FBUztZQUNqQixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZO2dCQUNqQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUMzQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDOUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFrRDtRQUNoRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUVwRCxlQUFlLENBQUM7WUFDZCxTQUFTLEVBQUUsYUFBYTtZQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZO2dCQUNqQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUMzQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0MsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHNCQUFzQixDQUFDLE9BQXNFO1FBQzNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BCLElBQUksU0FBUyxFQUFFLEVBQUU7Z0JBQ2YsT0FBTyxDQUFDLElBQUksQ0FDVixtSEFBbUgsQ0FDcEgsQ0FBQzthQUNIO1lBQ0QsT0FBTztTQUNSO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsYUFBYSxDQUFDO1FBRWxFLGVBQWUsQ0FBQztZQUNkLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLE9BQU87WUFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZO2dCQUNqQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUMzQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0MsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLG1CQUFtQixDQUFDLFVBQW1CO1FBQy9DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVTLHNCQUFzQjtRQUM5QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssV0FBVyxFQUFFO1lBQ25DLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN0QzthQUFNO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVTLGdCQUFnQjtRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssV0FBVyxFQUFFO1lBQ25DLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLEtBQUssQ0FBQyxTQUFTLENBQWEsYUFBYSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBYSxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDckcsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ3pCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7UUFFZixLQUFLLENBQ0gsU0FBUyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsRUFDbEMsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDbEU7YUFDRSxJQUFJLENBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUN6QixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsTUFBTSxRQUFRLEdBQ1osSUFBSSxDQUFDLFFBQVE7Z0JBQ1gsRUFBRSxPQUFPLEVBQUU7aUJBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBQztpQkFDdkMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVoRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDcEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFdkMsT0FBTzthQUNSO1lBRUQsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUM7Z0JBQ3JDLFFBQVE7Z0JBQ1IsU0FBUyxFQUFFLGFBQWE7YUFDekIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQztZQUMxRixNQUFNLFVBQVUsR0FBRyw2QkFBNkIsQ0FBQztZQUVqRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtnQkFDMUIsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO29CQUN2QixLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3pDO3FCQUFNO29CQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDNUM7YUFDRjtZQUVELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDOUMsTUFBTSxLQUFLLEdBQWlDO29CQUMxQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ2xCLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHO29CQUNoQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUc7b0JBQy9CLEtBQUssRUFBRSxDQUFDO2lCQUNULENBQUM7Z0JBRUYsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUVsRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFFeEQsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFFdEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDO1lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztZQUMxQyxNQUFNLFFBQVEsR0FDWixDQUFDLElBQUk7Z0JBQ0wsQ0FBQyxJQUFJO2dCQUNMLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxDQUFDO2dCQUM1QixJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGlCQUFpQixLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUVwRCxJQUFJLFFBQVE7Z0JBQUUsT0FBTztZQUVyQixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQztZQUVyRSxJQUFJLHFCQUFxQixLQUFLLFNBQVM7Z0JBQUUsT0FBTztZQUVoRCxNQUFNLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQztZQUMzRCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFFbEYsZUFBZSxDQUFDO2dCQUNkLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixPQUFPLEVBQUUsbUJBQW1CLENBQUMsT0FBTztnQkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQy9ELE1BQU07Z0JBQ04saUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQzFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzVFLENBQUMsQ0FBQztZQUVILFVBQVUsR0FBRyxJQUFJLENBQUM7WUFFbEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVqQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ25DLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDckIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDOzhHQXJiVSxtQkFBbUI7a0dBQW5CLG1CQUFtQiwyTkFxQlYsZ0JBQWdCLHFEQUdoQixnQkFBZ0IsOERBR2hCLGdCQUFnQixxREFJaEIsZ0JBQWdCLDhEQUloQixnQkFBZ0IscUdBR2hCLGdCQUFnQixvREFNaEIsZ0JBQWdCLGtEQUdoQixlQUFlLDZYQThCbEIsaUJBQWlCLDhEQUdqQixVQUFVLG9hQ3pJN0IsbXdDQXlDQSxnN0tEV1kseUJBQXlCLHdOQUErQixPQUFPLG9GQUFFLElBQUksNkZBQWdCLG9CQUFvQjs7MkZBS3hHLG1CQUFtQjtrQkFaL0IsU0FBUzsrQkFDRSxlQUFlLGNBR2IsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMseUJBQXlCLEVBQUUsMkJBQTJCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsb0JBQW9CLENBQUMsUUFDOUc7d0JBQ0osS0FBSyxFQUFFLGVBQWU7cUJBQ3ZCO3dEQVdELFFBQVE7c0JBRlAsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBSzdCLFNBQVM7c0JBRlIsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBSTdCLGNBQWM7c0JBRGIsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUl0QyxhQUFhO3NCQURaLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBS3RDLGdCQUFnQjtzQkFGZixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFOztzQkFDckMsV0FBVzt1QkFBQyx3QkFBd0I7Z0JBS3JDLGFBQWE7c0JBRlosS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTs7c0JBQ3JDLFdBQVc7dUJBQUMscUJBQXFCO2dCQUlsQyxnQkFBZ0I7c0JBRGYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdEMsNkJBQTZCO3NCQUQ1QixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUl0QyxVQUFVO3NCQURULEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUl0QyxZQUFZO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUk1QixpQkFBaUI7c0JBRHpCLE1BQU07Z0JBSUUsa0JBQWtCO3NCQUQxQixNQUFNO2dCQUlQLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkzQixjQUFjO3NCQUQzQixZQUFZO3VCQUFDLFlBQVk7Z0JBT1osZ0JBQWdCO3NCQUQ3QixZQUFZO3VCQUFDLGNBQWM7Z0JBT2QsZUFBZTtzQkFENUIsWUFBWTt1QkFBQyxhQUFhO2dCQU8zQixjQUFjO3NCQURiLGVBQWU7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUl6RCxRQUFRO3NCQURQLGVBQWU7dUJBQUMsVUFBVSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaXNEZXZNb2RlLFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aXZlLFxuICBJU19BQ1RJVkVfRUxFTUVOVCxcbiAgSVNfRUxFTUVOVCxcbiAgSXNBY3RpdmVFbGVtZW50RGlyZWN0aXZlLFxuICBJc0VsZW1lbnREaXJlY3RpdmUsXG4gIExldERpcmVjdGl2ZSxcbiAgTmdDbGFzc1R5cGUsXG4gIE9ic2VydmVTY3JvbGxTdGF0ZURpcmVjdGl2ZSxcbiAgU2Nyb2xsT2JzZXJ2ZXJTY3JvbGxTdGF0ZSxcbiAgU2Nyb2xsVG9FbGVtZW50T3B0aW9ucyxcbiAgVHlwZWRRdWVyeUxpc3QsXG4gIGNyZWF0ZURlc3Ryb3ksXG4gIGdldEVsZW1lbnRWaXNpYmxlU3RhdGVzLFxuICBzY3JvbGxUb0VsZW1lbnQsXG4gIHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24sXG4gIHNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZSxcbiAgc2lnbmFsSG9zdEF0dHJpYnV0ZXMsXG59IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGZyb21FdmVudCwgbWVyZ2UsIG9mLCBzdGFydFdpdGgsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGV2cm9uSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ljb25zJztcbmltcG9ydCB7IFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2UsIFNjcm9sbGFibGVTY3JvbGxNb2RlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1zY3JvbGxhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY3JvbGxhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQ3Vyc29yRHJhZ1Njcm9sbERpcmVjdGl2ZSwgT2JzZXJ2ZVNjcm9sbFN0YXRlRGlyZWN0aXZlLCBOZ0NsYXNzLCBOZ0lmLCBMZXREaXJlY3RpdmUsIENoZXZyb25JY29uQ29tcG9uZW50XSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZXQtc2Nyb2xsYWJsZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBjcmVhdGVEZXN0cm95KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQ3Vyc29yRHJhZ2dpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY3JvbGxhYmxlSW50ZXJzZWN0aW9uQ2hhbmdlW10+KFtdKTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaXRlbS1zaXplJylcbiAgaXRlbVNpemU6ICdhdXRvJyB8ICdzYW1lJyB8ICdmdWxsJyA9ICdhdXRvJztcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGlyZWN0aW9uJylcbiAgZGlyZWN0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnID0gJ2hvcml6b250YWwnO1xuXG4gIEBJbnB1dCgpXG4gIHNjcm9sbGFibGVSb2xlPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNjcm9sbGFibGVDbGFzcz86IE5nQ2xhc3NUeXBlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICByZW5kZXJNYXNrcyA9IHRydWU7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHJlbmRlckJ1dHRvbnMgPSB0cnVlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBASG9zdEJpbmRpbmcoJ2F0dHIucmVuZGVyLXNjcm9sbGJhcnMnKVxuICByZW5kZXJTY3JvbGxiYXJzID0gZmFsc2U7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIEBIb3N0QmluZGluZygnYXR0ci5zdGlja3ktYnV0dG9ucycpXG4gIHN0aWNreUJ1dHRvbnMgPSBmYWxzZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgY3Vyc29yRHJhZ1Njcm9sbCA9IHRydWU7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2Nyb2xsTW9kZTogU2Nyb2xsYWJsZVNjcm9sbE1vZGUgPSAnY29udGFpbmVyJztcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc25hcCA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHNjcm9sbE1hcmdpbiA9IDA7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHNjcm9sbFN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTY3JvbGxPYnNlcnZlclNjcm9sbFN0YXRlPigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBpbnRlcnNlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2VbXT4oKTtcblxuICBAVmlld0NoaWxkKCdzY3JvbGxhYmxlJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgc2Nyb2xsYWJsZSE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ3Njcm9sbGFibGUnKVxuICBwcm90ZWN0ZWQgc2V0IHNjcm9sbGFibGVMaXN0KGxpc3Q6IFR5cGVkUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pikge1xuICAgIHRoaXMuX3Njcm9sbGFibGVMaXN0LnNldChsaXN0KTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9zY3JvbGxhYmxlTGlzdCA9IHNpZ25hbDxUeXBlZFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4gfCBudWxsPihudWxsKTtcblxuICBAVmlld0NoaWxkcmVuKCdmaXJzdEVsZW1lbnQnKVxuICBwcm90ZWN0ZWQgc2V0IGZpcnN0RWxlbWVudExpc3QobGlzdDogVHlwZWRRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KSB7XG4gICAgdGhpcy5fZmlyc3RFbGVtZW50TGlzdC5zZXQobGlzdCk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfZmlyc3RFbGVtZW50TGlzdCA9IHNpZ25hbDxUeXBlZFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4gfCBudWxsPihudWxsKTtcblxuICBAVmlld0NoaWxkcmVuKCdsYXN0RWxlbWVudCcpXG4gIHByb3RlY3RlZCBzZXQgbGFzdEVsZW1lbnRMaXN0KGxpc3Q6IFR5cGVkUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pikge1xuICAgIHRoaXMuX2xhc3RFbGVtZW50TGlzdC5zZXQobGlzdCk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfbGFzdEVsZW1lbnRMaXN0ID0gc2lnbmFsPFR5cGVkUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PiB8IG51bGw+KG51bGwpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oSVNfQUNUSVZFX0VMRU1FTlQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgYWN0aXZlRWxlbWVudHM6IFR5cGVkUXVlcnlMaXN0PElzQWN0aXZlRWxlbWVudERpcmVjdGl2ZT4gfCBudWxsID0gbnVsbDtcblxuICBAQ29udGVudENoaWxkcmVuKElTX0VMRU1FTlQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgZWxlbWVudHM6IFR5cGVkUXVlcnlMaXN0PElzRWxlbWVudERpcmVjdGl2ZT4gfCBudWxsID0gbnVsbDtcblxuICBnZXQgaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24oKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLl9sYXRlc3RWaXNpYmlsaXR5U3RhdGVzJC52YWx1ZTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICBpZiAoIXByZXYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyLmludGVyc2VjdGlvblJhdGlvID4gcHJldi5pbnRlcnNlY3Rpb25SYXRpbyA/IGN1cnIgOiBwcmV2O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IG5leHRQYXJ0aWFsSW50ZXJzZWN0aW9uKCkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5fbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQudmFsdWU7XG5cbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24gPSB0aGlzLmhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uO1xuXG4gICAgaWYgKCFoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEluZGV4ID0gZWxlbWVudHMuc2xpY2UoaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24uaW5kZXgpLmZpbmRJbmRleCgoZSkgPT4gIWUuaXNJbnRlcnNlY3RpbmcpO1xuXG4gICAgaWYgKG5leHRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudHNbaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24uaW5kZXggKyBuZXh0SW5kZXhdO1xuXG4gICAgcmV0dXJuIG5leHRFbGVtZW50IHx8IG51bGw7XG4gIH1cblxuICBnZXQgcHJldmlvdXNQYXJ0aWFsSW50ZXJzZWN0aW9uKCkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5fbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQudmFsdWU7XG5cbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24gPSB0aGlzLmhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uO1xuXG4gICAgaWYgKCFoaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNJbmRleCA9IGVsZW1lbnRzXG4gICAgICAuc2xpY2UoMCwgaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24uaW5kZXgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmluZEluZGV4KChlKSA9PiAhZS5pc0ludGVyc2VjdGluZyk7XG5cbiAgICBpZiAocHJldmlvdXNJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IGVsZW1lbnRzW2hpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uLmluZGV4IC0gcHJldmlvdXNJbmRleCAtIDFdO1xuXG4gICAgcmV0dXJuIHByZXZpb3VzRWxlbWVudCB8fCBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRhaW5lclNjcm9sbFN0YXRlID0gc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlKHRoaXMuX3Njcm9sbGFibGVMaXN0KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpcnN0RWxlbWVudEludGVyc2VjdGlvbiA9IHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24odGhpcy5fZmlyc3RFbGVtZW50TGlzdCwgdGhpcy5fc2Nyb2xsYWJsZUxpc3QpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGFzdEVsZW1lbnRJbnRlcnNlY3Rpb24gPSBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uKHRoaXMuX2xhc3RFbGVtZW50TGlzdCwgdGhpcy5fc2Nyb2xsYWJsZUxpc3QpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRBbmltYXRlT3ZlcmxheXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiAhIXRoaXMuZmlyc3RFbGVtZW50SW50ZXJzZWN0aW9uKCkgJiYgISF0aGlzLmxhc3RFbGVtZW50SW50ZXJzZWN0aW9uKCksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhblNjcm9sbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0aGlzLmRpcmVjdGlvbjtcblxuICAgIGlmIChkaXIgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxIb3Jpem9udGFsbHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxWZXJ0aWNhbGx5O1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNBdFN0YXJ0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmNhblNjcm9sbCgpID8gdGhpcy5maXJzdEVsZW1lbnRJbnRlcnNlY3Rpb24oKS5pc0ludGVyc2VjdGluZyA6IHRydWUsXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc0F0RW5kID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmNhblNjcm9sbCgpID8gdGhpcy5sYXN0RWxlbWVudEludGVyc2VjdGlvbigpLmlzSW50ZXJzZWN0aW5nIDogdHJ1ZSxcbiAgKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG9zdEF0dHJpYnV0ZXMgPSBzaWduYWxIb3N0QXR0cmlidXRlcyh7XG4gICAgJ2Nhbi1zY3JvbGwnOiB0aGlzLmNhblNjcm9sbCxcbiAgICAnYXQtc3RhcnQnOiB0aGlzLmlzQXRTdGFydCxcbiAgICAnYXQtZW5kJzogdGhpcy5pc0F0RW5kLFxuICAgICdhbmltYXRlLW92ZXJsYXlzJzogdGhpcy5zaG91bGRBbmltYXRlT3ZlcmxheXMsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpc0F0U3RhcnQgPSB0aGlzLmlzQXRTdGFydCgpO1xuICAgICAgY29uc3QgaXNBdEVuZCA9IHRoaXMuaXNBdEVuZCgpO1xuICAgICAgY29uc3QgY2FuU2Nyb2xsID0gdGhpcy5jYW5TY3JvbGwoKTtcblxuICAgICAgdGhpcy5zY3JvbGxTdGF0ZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgY2FuU2Nyb2xsLFxuICAgICAgICBpc0F0RW5kLFxuICAgICAgICBpc0F0U3RhcnQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlRWxlbWVudHMgfHwgIXRoaXMuZWxlbWVudHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnRzLmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBzdGFydFdpdGgodGhpcy5hY3RpdmVFbGVtZW50cyksXG4gICAgICAgIHRhcCgoYWN0aXZlRWxlbWVudHMpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlQWN0aXZlRWxlbWVudFNjcm9sbGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpcnN0QWN0aXZlID0gYWN0aXZlRWxlbWVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGEpOiBhIGlzIElzQWN0aXZlRWxlbWVudERpcmVjdGl2ZSA9PiAhIWEpXG4gICAgICAgICAgICAuZmluZCgoYSkgPT4gYS5pc0FjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgaWYgKCFmaXJzdEFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2F1dG8nLFxuICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLnNjcm9sbGFibGUubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGZpcnN0QWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/IHRoaXMuc2Nyb2xsTWFyZ2luIDogMCxcbiAgICAgICAgICAgIHNjcm9sbEJsb2NrTWFyZ2luOiB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gMCA6IHRoaXMuc2Nyb2xsTWFyZ2luLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuX3NldHVwU2Nyb2xsTGlzdGVuaW5nKCk7XG4gIH1cblxuICBzY3JvbGxPbmVDb250YWluZXJTaXplKGRpcmVjdGlvbjogJ3N0YXJ0JyB8ICdlbmQnKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IHNjcm9sbGFibGVTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/IHBhcmVudC5jbGllbnRXaWR0aCA6IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgY3VycmVudFNjcm9sbCA9IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBzY3JvbGxFbGVtZW50LnNjcm9sbExlZnQgOiBzY3JvbGxFbGVtZW50LnNjcm9sbFRvcDtcblxuICAgIHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG8oe1xuICAgICAgW3RoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnbGVmdCcgOiAndG9wJ106XG4gICAgICAgIGN1cnJlbnRTY3JvbGwgKyAoZGlyZWN0aW9uID09PSAnc3RhcnQnID8gLXNjcm9sbGFibGVTaXplIDogc2Nyb2xsYWJsZVNpemUpLFxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsT25lSXRlbVNpemUoZGlyZWN0aW9uOiAnc3RhcnQnIHwgJ2VuZCcpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLnZhbHVlO1xuXG4gICAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ05vIGVsZW1lbnRzIGZvdW5kIHRvIHNjcm9sbCB0by4gTWFrZSBzdXJlIHRvIGFwcGx5IHRoZSBpc0VsZW1lbnQgZGlyZWN0aXZlIHRvIHRoZSBlbGVtZW50cyB5b3Ugd2FudCB0byBzY3JvbGwgdG8uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbCA9IGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyA/IHRoaXMucHJldmlvdXNQYXJ0aWFsSW50ZXJzZWN0aW9uIDogdGhpcy5uZXh0UGFydGlhbEludGVyc2VjdGlvbjtcblxuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICBlbGVtZW50OiBlbD8uZWxlbWVudCxcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICdpbmxpbmUnIDogJ2Jsb2NrJyxcbiAgICAgIG9yaWdpbjogZGlyZWN0aW9uLFxuICAgICAgLi4uKHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgPyB7IHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4gfVxuICAgICAgICA6IHsgc2Nyb2xsQmxvY2tNYXJnaW46IHRoaXMuc2Nyb2xsTWFyZ2luIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsVG9FbGVtZW50KG9wdGlvbnM6IE9taXQ8U2Nyb2xsVG9FbGVtZW50T3B0aW9ucywgJ2NvbnRhaW5lcic+KSB7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZS5uYXRpdmVFbGVtZW50O1xuXG4gICAgc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgIC4uLih0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgID8geyBzY3JvbGxJbmxpbmVNYXJnaW46IHRoaXMuc2Nyb2xsTWFyZ2luIH1cbiAgICAgICAgOiB7IHNjcm9sbEJsb2NrTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbiB9KSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBzY3JvbGxUb0VsZW1lbnRCeUluZGV4KG9wdGlvbnM6IE9taXQ8U2Nyb2xsVG9FbGVtZW50T3B0aW9ucywgJ2NvbnRhaW5lcic+ICYgeyBpbmRleDogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM/LnRvQXJyYXkoKSA/PyBbXTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdObyBlbGVtZW50cyBmb3VuZCB0byBzY3JvbGwgdG8uIE1ha2Ugc3VyZSB0byBhcHBseSB0aGUgaXNFbGVtZW50IGRpcmVjdGl2ZSB0byB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gc2Nyb2xsIHRvLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tvcHRpb25zLmluZGV4XT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi4odGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHsgc2Nyb2xsSW5saW5lTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbiB9XG4gICAgICAgIDogeyBzY3JvbGxCbG9ja01hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4gfSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldElzQ3Vyc29yRHJhZ2dpbmcoaXNEcmFnZ2luZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQ3Vyc29yRHJhZ2dpbmckLm5leHQoaXNEcmFnZ2luZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TdGFydERpcmVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxNb2RlID09PSAnY29udGFpbmVyJykge1xuICAgICAgdGhpcy5zY3JvbGxPbmVDb250YWluZXJTaXplKCdzdGFydCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUl0ZW1TaXplKCdzdGFydCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1N0YXJ0RW5kKCkge1xuICAgIGlmICh0aGlzLnNjcm9sbE1vZGUgPT09ICdjb250YWluZXInKSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUNvbnRhaW5lclNpemUoJ2VuZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUl0ZW1TaXplKCdlbmQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFNjcm9sbExpc3RlbmluZygpIHtcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgbGV0IGlzU25hcHBpbmcgPSBmYWxzZTtcbiAgICBsZXQgc25hcFRpbWVvdXQgPSAwO1xuXG4gICAgbWVyZ2UoZnJvbUV2ZW50PFdoZWVsRXZlbnQ+KHNjcm9sbEVsZW1lbnQsICd3aGVlbCcpLCBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oc2Nyb2xsRWxlbWVudCwgJ3RvdWNoc3RhcnQnKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIGlzU25hcHBpbmcgPSBmYWxzZTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBtZXJnZShcbiAgICAgIGZyb21FdmVudChzY3JvbGxFbGVtZW50LCAnc2Nyb2xsJyksXG4gICAgICB0aGlzLl9pc0N1cnNvckRyYWdnaW5nJCxcbiAgICAgIHRoaXMuZWxlbWVudHM/LmNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5lbGVtZW50cykpID8/IG9mKG51bGwpLFxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50cyA9XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzXG4gICAgICAgICAgICAgID8udG9BcnJheSgpXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGU/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgLmZpbHRlcigoZSk6IGUgaXMgSFRNTEVsZW1lbnQgPT4gISFlKSA/PyBbXTtcblxuICAgICAgICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXRlc3RWaXNpYmlsaXR5U3RhdGVzJC5uZXh0KFtdKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0YXRlcyA9IGdldEVsZW1lbnRWaXNpYmxlU3RhdGVzKHtcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgY29udGFpbmVyOiBzY3JvbGxFbGVtZW50LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcHJvcCA9IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnaW5saW5lSW50ZXJzZWN0aW9uJyA6ICdibG9ja0ludGVyc2VjdGlvbic7XG4gICAgICAgICAgY29uc3Qgc3RhdGVDbGFzcyA9IGBldC1lbGVtZW50LS1pcy1pbnRlcnNlY3RpbmdgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBzdGF0ZSBvZiBzdGF0ZXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZVtwcm9wXSA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChzdGF0ZUNsYXNzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShzdGF0ZUNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbnRlcnNlY3Rpb25DaGFuZ2VzID0gc3RhdGVzLm1hcCgocywgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGU6IFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2UgPSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IHMuZWxlbWVudCxcbiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUmF0aW86IHNbcHJvcF0gLyAxMDAsXG4gICAgICAgICAgICAgIGlzSW50ZXJzZWN0aW5nOiBzW3Byb3BdID09PSAxMDAsXG4gICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25DaGFuZ2UuZW1pdChpbnRlcnNlY3Rpb25DaGFuZ2VzKTtcblxuICAgICAgICAgIHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLm5leHQoaW50ZXJzZWN0aW9uQ2hhbmdlcyk7XG5cbiAgICAgICAgICBpZiAoaXNTbmFwcGluZyB8fCB0aGlzLl9pc0N1cnNvckRyYWdnaW5nJC52YWx1ZSB8fCAhdGhpcy5zbmFwKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5wcmV2aW91c1BhcnRpYWxJbnRlcnNlY3Rpb247XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMubmV4dFBhcnRpYWxJbnRlcnNlY3Rpb247XG4gICAgICAgICAgY29uc3Qgc2tpcFNuYXAgPVxuICAgICAgICAgICAgIXByZXYgfHxcbiAgICAgICAgICAgICFuZXh0IHx8XG4gICAgICAgICAgICBwcmV2LmludGVyc2VjdGlvblJhdGlvID09PSAwIHx8XG4gICAgICAgICAgICBuZXh0LmludGVyc2VjdGlvblJhdGlvID09PSAwIHx8XG4gICAgICAgICAgICBwcmV2LmludGVyc2VjdGlvblJhdGlvID09PSBuZXh0LmludGVyc2VjdGlvblJhdGlvO1xuXG4gICAgICAgICAgaWYgKHNraXBTbmFwKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBoaWdoZXN0SW50ZXJzZWN0aW5nID0gcHJldi5pbnRlcnNlY3Rpb25SYXRpbyA+IG5leHQuaW50ZXJzZWN0aW9uUmF0aW8gPyBwcmV2IDogbmV4dDtcbiAgICAgICAgICBjb25zdCBmdWxsSW50ZXJzZWN0aW9uSW5kZXggPSB0aGlzLmhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uPy5pbmRleDtcblxuICAgICAgICAgIGlmIChmdWxsSW50ZXJzZWN0aW9uSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgaGlnaGVzdEludGVyc2VjdGluZ0luZGV4ID0gaGlnaGVzdEludGVyc2VjdGluZy5pbmRleDtcbiAgICAgICAgICBjb25zdCBvcmlnaW4gPSBoaWdoZXN0SW50ZXJzZWN0aW5nSW5kZXggPiBmdWxsSW50ZXJzZWN0aW9uSW5kZXggPyAnZW5kJyA6ICdzdGFydCc7XG5cbiAgICAgICAgICBzY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgY29udGFpbmVyOiBzY3JvbGxFbGVtZW50LFxuICAgICAgICAgICAgZWxlbWVudDogaGlnaGVzdEludGVyc2VjdGluZy5lbGVtZW50LFxuICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ2lubGluZScgOiAnYmxvY2snLFxuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgc2Nyb2xsQmxvY2tNYXJnaW46IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAwIDogdGhpcy5zY3JvbGxNYXJnaW4sXG4gICAgICAgICAgICBzY3JvbGxJbmxpbmVNYXJnaW46IHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyB0aGlzLnNjcm9sbE1hcmdpbiA6IDAsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpc1NuYXBwaW5nID0gdHJ1ZTtcblxuICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoc25hcFRpbWVvdXQpO1xuXG4gICAgICAgICAgc25hcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpc1NuYXBwaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2XG4gICNzY3JvbGxhYmxlXG4gIFthdHRyLnJvbGVdPVwic2Nyb2xsYWJsZVJvbGUgPz8gdW5kZWZpbmVkXCJcbiAgW2V0Q3Vyc29yRHJhZ1Njcm9sbF09XCJjdXJzb3JEcmFnU2Nyb2xsXCJcbiAgW2FsbG93ZWREaXJlY3Rpb25dPVwiZGlyZWN0aW9uXCJcbiAgKGN1cnNvckRyYWdTdGFydCk9XCJzZXRJc0N1cnNvckRyYWdnaW5nKHRydWUpXCJcbiAgKGN1cnNvckRyYWdFbmQpPVwic2V0SXNDdXJzb3JEcmFnZ2luZyhmYWxzZSlcIlxuICBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyLW91dGVyXCJcbj5cbiAgPGRpdiBbbmdDbGFzc109XCJzY3JvbGxhYmxlQ2xhc3NcIiBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyXCI+XG4gICAgPGRpdiAjZmlyc3RFbGVtZW50IGNsYXNzPVwiZXQtc2Nyb2xsLW9ic2VydmVyLWZpcnN0LWVsZW1lbnRcIj48L2Rpdj5cbiAgICA8bmctY29udGVudCAvPlxuICAgIDxkaXYgI2xhc3RFbGVtZW50IGNsYXNzPVwiZXQtc2Nyb2xsLW9ic2VydmVyLWxhc3QtZWxlbWVudFwiPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwicmVuZGVyTWFza3NcIiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFza3NcIj5cbiAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFzayBldC1zY3JvbGxhYmxlLW1hc2stLXN0YXJ0XCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW1hc2sgZXQtc2Nyb2xsYWJsZS1tYXNrLS1lbmRcIj48L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwicmVuZGVyQnV0dG9uc1wiIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b25zXCI+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwic2Nyb2xsVG9TdGFydERpcmVjdGlvbigpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uIGV0LXNjcm9sbGFibGUtYnV0dG9uLS1zdGFydFwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgPlxuICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwic2Nyb2xsVG9TdGFydEVuZCgpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uIGV0LXNjcm9sbGFibGUtYnV0dG9uLS1lbmRcIlxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gID5cbiAgICA8ZXQtY2hldnJvbi1pY29uIC8+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
449
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixVQUFVLEVBR1YsWUFBWSxFQUVaLDJCQUEyQixFQUczQixjQUFjLEVBQ2QsYUFBYSxFQUNiLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULGVBQWUsRUFDZix5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEcsT0FBTyxF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YyxFQUFFO2dCQU9uRCxpQkFBaUI7c0JBRHpCLE1BQU07Z0JBSUUsa0JBQWtCO3NCQUQxQixNQUFNO2dCQUlLLFdBQVc7c0JBRHRCLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPN0IsYUFBYTtzQkFEeEIsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU8vQixZQUFZO3NCQUR2QixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTzlCLGtCQUFrQjtzQkFEN0IsZUFBZTt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBTzdDLFlBQVk7c0JBRHZCLGVBQWU7dUJBQUMsVUFBVSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaXNEZXZNb2RlLFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXJyZW50RWxlbWVudFZpc2liaWxpdHksXG4gIEN1cnNvckRyYWdTY3JvbGxEaXJlY3RpdmUsXG4gIElTX0FDVElWRV9FTEVNRU5ULFxuICBJU19FTEVNRU5ULFxuICBJc0FjdGl2ZUVsZW1lbnREaXJlY3RpdmUsXG4gIElzRWxlbWVudERpcmVjdGl2ZSxcbiAgTGV0RGlyZWN0aXZlLFxuICBOZ0NsYXNzVHlwZSxcbiAgT2JzZXJ2ZVNjcm9sbFN0YXRlRGlyZWN0aXZlLFxuICBTY3JvbGxPYnNlcnZlclNjcm9sbFN0YXRlLFxuICBTY3JvbGxUb0VsZW1lbnRPcHRpb25zLFxuICBUeXBlZFF1ZXJ5TGlzdCxcbiAgY3JlYXRlRGVzdHJveSxcbiAgZ2V0RWxlbWVudFZpc2libGVTdGF0ZXMsXG4gIGlzRWxlbWVudFZpc2libGUsXG4gIG5leHRGcmFtZSxcbiAgc2Nyb2xsVG9FbGVtZW50LFxuICBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uLFxuICBzaWduYWxFbGVtZW50U2Nyb2xsU3RhdGUsXG4gIHNpZ25hbEhvc3RBdHRyaWJ1dGVzLFxuICBzaWduYWxIb3N0Q2xhc3Nlcyxcbn0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRlYm91bmNlVGltZSwgZnJvbUV2ZW50LCBtZXJnZSwgb2YsIHN0YXJ0V2l0aCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoZXZyb25JY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vaWNvbnMnO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZUludGVyc2VjdGlvbkNoYW5nZSwgU2Nyb2xsYWJsZVNjcm9sbE1vZGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2V0LXNjcm9sbGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Njcm9sbGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aXZlLCBPYnNlcnZlU2Nyb2xsU3RhdGVEaXJlY3RpdmUsIE5nQ2xhc3MsIExldERpcmVjdGl2ZSwgQ2hldnJvbkljb25Db21wb25lbnRdLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdldC1zY3JvbGxhYmxlJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgU2Nyb2xsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IGNyZWF0ZURlc3Ryb3koKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNDdXJzb3JEcmFnZ2luZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2VbXT4oW10pO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnaXRlbVNpemUnIH0pXG4gIHNldCBfaXRlbVNpemUodjogJ2F1dG8nIHwgJ3NhbWUnIHwgJ2Z1bGwnKSB7XG4gICAgdGhpcy5pdGVtU2l6ZS5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgaXRlbVNpemUgPSBzaWduYWw8J2F1dG8nIHwgJ3NhbWUnIHwgJ2Z1bGwnPignYXV0bycpO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnZGlyZWN0aW9uJyB9KVxuICBzZXQgX2RpcmVjdGlvbih2OiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnKSB7XG4gICAgdGhpcy5kaXJlY3Rpb24uc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IGRpcmVjdGlvbiA9IHNpZ25hbDwnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnPignaG9yaXpvbnRhbCcpO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnc2Nyb2xsYWJsZVJvbGUnIH0pXG4gIHNldCBfc2Nyb2xsYWJsZVJvbGUodjogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuc2Nyb2xsYWJsZVJvbGUuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHNjcm9sbGFibGVSb2xlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnc2Nyb2xsYWJsZUNsYXNzJyB9KVxuICBzZXQgX3Njcm9sbGFibGVDbGFzcyh2OiBOZ0NsYXNzVHlwZSB8IG51bGwpIHtcbiAgICB0aGlzLnNjcm9sbGFibGVDbGFzcy5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgc2Nyb2xsYWJsZUNsYXNzID0gc2lnbmFsPE5nQ2xhc3NUeXBlIHwgbnVsbD4obnVsbCk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ3JlbmRlck1hc2tzJyB9KVxuICBzZXQgX3JlbmRlck1hc2tzKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlbmRlck1hc2tzLnNldCh2KTtcbiAgfVxuICByZWFkb25seSByZW5kZXJNYXNrcyA9IHNpZ25hbCh0cnVlKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAncmVuZGVyQnV0dG9ucycgfSlcbiAgc2V0IF9yZW5kZXJCdXR0b25zKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlbmRlckJ1dHRvbnMuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHJlbmRlckJ1dHRvbnMgPSBzaWduYWwodHJ1ZSk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ3JlbmRlclNjcm9sbGJhcnMnIH0pXG4gIHNldCBfcmVuZGVyU2Nyb2xsYmFycyh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZW5kZXJTY3JvbGxiYXJzLnNldCh2KTtcbiAgfVxuICByZWFkb25seSByZW5kZXJTY3JvbGxiYXJzID0gc2lnbmFsKGZhbHNlKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAnc3RpY2t5QnV0dG9ucycgfSlcbiAgc2V0IF9zdGlja3lCdXR0b25zKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnN0aWNreUJ1dHRvbnMuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHN0aWNreUJ1dHRvbnMgPSBzaWduYWwoZmFsc2UpO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdjdXJzb3JEcmFnU2Nyb2xsJyB9KVxuICBzZXQgX2N1cnNvckRyYWdTY3JvbGwodjogYm9vbGVhbikge1xuICAgIHRoaXMuY3Vyc29yRHJhZ1Njcm9sbC5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgY3Vyc29yRHJhZ1Njcm9sbCA9IHNpZ25hbCh0cnVlKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAnZGlzYWJsZUFjdGl2ZUVsZW1lbnRTY3JvbGxpbmcnIH0pXG4gIHNldCBfZGlzYWJsZUFjdGl2ZUVsZW1lbnRTY3JvbGxpbmcodjogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZUFjdGl2ZUVsZW1lbnRTY3JvbGxpbmcuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IGRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICBASW5wdXQoeyBhbGlhczogJ3Njcm9sbE1vZGUnIH0pXG4gIHNldCBfc2Nyb2xsTW9kZSh2OiBTY3JvbGxhYmxlU2Nyb2xsTW9kZSkge1xuICAgIHRoaXMuc2Nyb2xsTW9kZS5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgc2Nyb2xsTW9kZSA9IHNpZ25hbDxTY3JvbGxhYmxlU2Nyb2xsTW9kZT4oJ2NvbnRhaW5lcicpO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdzbmFwJyB9KVxuICBzZXQgX3NuYXAodjogYm9vbGVhbikge1xuICAgIHRoaXMuc25hcC5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgc25hcCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUsIGFsaWFzOiAnc2Nyb2xsTWFyZ2luJyB9KVxuICBzZXQgX3Njcm9sbE1hcmdpbih2OiBudW1iZXIpIHtcbiAgICB0aGlzLnNjcm9sbE1hcmdpbi5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgc2Nyb2xsTWFyZ2luID0gc2lnbmFsKDApO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBzY3JvbGxTdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2Nyb2xsT2JzZXJ2ZXJTY3JvbGxTdGF0ZT4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgaW50ZXJzZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTY3JvbGxhYmxlSW50ZXJzZWN0aW9uQ2hhbmdlW10+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2Nyb2xsYWJsZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgc2V0IF9zY3JvbGxhYmxlKGU6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG4gICAgdGhpcy5zY3JvbGxhYmxlLnNldChlKTtcbiAgfVxuICByZWFkb25seSBzY3JvbGxhYmxlID0gc2lnbmFsPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgQFZpZXdDaGlsZCgnZmlyc3RFbGVtZW50JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBzZXQgX2ZpcnN0RWxlbWVudChlOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICAgIHRoaXMuZmlyc3RFbGVtZW50LnNldChlKTtcbiAgfVxuICByZWFkb25seSBmaXJzdEVsZW1lbnQgPSBzaWduYWw8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBudWxsPihudWxsKTtcblxuICBAVmlld0NoaWxkKCdsYXN0RWxlbWVudCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgc2V0IF9sYXN0RWxlbWVudChlOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICAgIHRoaXMubGFzdEVsZW1lbnQuc2V0KGUpO1xuICB9XG4gIHJlYWRvbmx5IGxhc3RFbGVtZW50ID0gc2lnbmFsPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihJU19BQ1RJVkVfRUxFTUVOVCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwcml2YXRlIHNldCBfYWN0aXZlRWxlbWVudExpc3QoZTogVHlwZWRRdWVyeUxpc3Q8SXNBY3RpdmVFbGVtZW50RGlyZWN0aXZlPikge1xuICAgIHRoaXMuYWN0aXZlRWxlbWVudExpc3Quc2V0KGUpO1xuICB9XG4gIHJlYWRvbmx5IGFjdGl2ZUVsZW1lbnRMaXN0ID0gc2lnbmFsPFR5cGVkUXVlcnlMaXN0PElzQWN0aXZlRWxlbWVudERpcmVjdGl2ZT4gfCBudWxsPihudWxsKTtcblxuICBAQ29udGVudENoaWxkcmVuKElTX0VMRU1FTlQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgcHJpdmF0ZSBzZXQgX2VsZW1lbnRMaXN0KGU6IFR5cGVkUXVlcnlMaXN0PElzRWxlbWVudERpcmVjdGl2ZT4pIHtcbiAgICB0aGlzLmVsZW1lbnRMaXN0LnNldChlKTtcbiAgfVxuICByZWFkb25seSBlbGVtZW50TGlzdCA9IHNpZ25hbDxUeXBlZFF1ZXJ5TGlzdDxJc0VsZW1lbnREaXJlY3RpdmU+IHwgbnVsbD4obnVsbCk7XG5cbiAgZ2V0IGhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uKCkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5fbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQudmFsdWU7XG5cbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgaWYgKCFwcmV2KSB7XG4gICAgICAgIHJldHVybiBjdXJyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3Vyci5pbnRlcnNlY3Rpb25SYXRpbyA+IHByZXYuaW50ZXJzZWN0aW9uUmF0aW8gPyBjdXJyIDogcHJldjtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBuZXh0UGFydGlhbEludGVyc2VjdGlvbigpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLnZhbHVlO1xuXG4gICAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uID0gdGhpcy5oaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbjtcblxuICAgIGlmICghaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRJbmRleCA9IGVsZW1lbnRzLnNsaWNlKGhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uLmluZGV4KS5maW5kSW5kZXgoKGUpID0+ICFlLmlzSW50ZXJzZWN0aW5nKTtcblxuICAgIGlmIChuZXh0SW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGVsZW1lbnRzW2hpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uLmluZGV4ICsgbmV4dEluZGV4XTtcblxuICAgIHJldHVybiBuZXh0RWxlbWVudCB8fCBudWxsO1xuICB9XG5cbiAgZ2V0IHByZXZpb3VzUGFydGlhbEludGVyc2VjdGlvbigpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2xhdGVzdFZpc2liaWxpdHlTdGF0ZXMkLnZhbHVlO1xuXG4gICAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uID0gdGhpcy5oaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbjtcblxuICAgIGlmICghaGlnaGVzdFZpc2libGVJbnRlcnNlY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBlbGVtZW50c1xuICAgICAgLnNsaWNlKDAsIGhpZ2hlc3RWaXNpYmxlSW50ZXJzZWN0aW9uLmluZGV4KVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbmRJbmRleCgoZSkgPT4gIWUuaXNJbnRlcnNlY3RpbmcpO1xuXG4gICAgaWYgKHByZXZpb3VzSW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBlbGVtZW50c1toaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbi5pbmRleCAtIHByZXZpb3VzSW5kZXggLSAxXTtcblxuICAgIHJldHVybiBwcmV2aW91c0VsZW1lbnQgfHwgbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXJTY3JvbGxTdGF0ZSA9IHNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZSh0aGlzLnNjcm9sbGFibGUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlyc3RFbGVtZW50SW50ZXJzZWN0aW9uID0gc2lnbmFsRWxlbWVudEludGVyc2VjdGlvbih0aGlzLmZpcnN0RWxlbWVudCwgeyByb290OiB0aGlzLnNjcm9sbGFibGUgfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBmaXJzdEVsZW1lbnRWaXNpYmlsaXR5ID0gc2lnbmFsPEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGFzdEVsZW1lbnRJbnRlcnNlY3Rpb24gPSBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uKHRoaXMubGFzdEVsZW1lbnQsIHsgcm9vdDogdGhpcy5zY3JvbGxhYmxlIH0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGFzdEVsZW1lbnRWaXNpYmlsaXR5ID0gc2lnbmFsPEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSB8IG51bGw+KG51bGwpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBjYW5TY3JvbGwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZGlyID0gdGhpcy5kaXJlY3Rpb24oKTtcblxuICAgIGlmIChkaXIgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxIb3Jpem9udGFsbHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxWZXJ0aWNhbGx5O1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNBdFN0YXJ0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghdGhpcy5jYW5TY3JvbGwoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZXJzZWN0aW9uID0gdGhpcy5maXJzdEVsZW1lbnRJbnRlcnNlY3Rpb24oKTtcblxuICAgIGlmICghaW50ZXJzZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRWaXNpYmlsaXR5KCk/LmlubGluZSA/PyB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb24uaXNJbnRlcnNlY3Rpbmc7XG4gIH0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNBdEVuZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoIXRoaXMuY2FuU2Nyb2xsKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IHRoaXMubGFzdEVsZW1lbnRJbnRlcnNlY3Rpb24oKTtcblxuICAgIGlmICghaW50ZXJzZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXN0RWxlbWVudFZpc2liaWxpdHkoKT8uaW5saW5lID8/IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyc2VjdGlvbi5pc0ludGVyc2VjdGluZztcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVuYWJsZU92ZXJsYXlBbmltYXRpb25zID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG9zdEF0dHJpYnV0ZXMgPSBzaWduYWxIb3N0QXR0cmlidXRlcyh7XG4gICAgJ2l0ZW0tc2l6ZSc6IHRoaXMuaXRlbVNpemUsXG4gICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbixcbiAgICAncmVuZGVyLXNjcm9sbGJhcnMnOiB0aGlzLnJlbmRlclNjcm9sbGJhcnMsXG4gICAgJ3N0aWNreS1idXR0b25zJzogdGhpcy5zdGlja3lCdXR0b25zLFxuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG9zdENsYXNzZXMgPSBzaWduYWxIb3N0Q2xhc3Nlcyh7XG4gICAgJ2V0LXNjcm9sbGFibGUtLWNhbi1zY3JvbGwnOiB0aGlzLmNhblNjcm9sbCxcbiAgICAnZXQtc2Nyb2xsYWJsZS0taXMtYXQtc3RhcnQnOiB0aGlzLmlzQXRTdGFydCxcbiAgICAnZXQtc2Nyb2xsYWJsZS0taXMtYXQtZW5kJzogdGhpcy5pc0F0RW5kLFxuICAgICdldC1zY3JvbGxhYmxlLS1lbmFibGUtb3ZlcmxheS1hbmltYXRpb25zJzogdGhpcy5lbmFibGVPdmVybGF5QW5pbWF0aW9ucyxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMuZmlyc3RFbGVtZW50KCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gdGhpcy5sYXN0RWxlbWVudCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50TGlzdCA9IHRoaXMuYWN0aXZlRWxlbWVudExpc3QoKT8udG9BcnJheSgpO1xuXG4gICAgICAgIGlmICghc2Nyb2xsYWJsZSB8fCAhZmlyc3RFbGVtZW50IHx8ICFsYXN0RWxlbWVudCB8fCAhYWN0aXZlRWxlbWVudExpc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEFjdGl2ZSA9IGFjdGl2ZUVsZW1lbnRMaXN0LmZpbmQoKGEpID0+IGEuaXNBY3RpdmVFbGVtZW50KTtcblxuICAgICAgICBpZiAoZmlyc3RBY3RpdmUgJiYgIXRoaXMuZGlzYWJsZUFjdGl2ZUVsZW1lbnRTY3JvbGxpbmcoKSkge1xuICAgICAgICAgIGNvbnN0IG9mZnNldFRvcCA9IGZpcnN0QWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRUb3AgLSBzY3JvbGxhYmxlLm9mZnNldFRvcDtcbiAgICAgICAgICBjb25zdCBvZmZzZXRMZWZ0ID0gZmlyc3RBY3RpdmUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgLSBzY3JvbGxhYmxlLm9mZnNldExlZnQ7XG4gICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxMZWZ0ID0gb2Zmc2V0TGVmdDtcbiAgICAgICAgICBzY3JvbGxhYmxlLnNjcm9sbFRvcCA9IG9mZnNldFRvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyc3RFbGVtZW50VmlzaWJpbGl0eS5zZXQoXG4gICAgICAgICAgaXNFbGVtZW50VmlzaWJsZSh7XG4gICAgICAgICAgICBjb250YWluZXI6IHNjcm9sbGFibGUsXG4gICAgICAgICAgICBlbGVtZW50OiBmaXJzdEVsZW1lbnQsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sYXN0RWxlbWVudFZpc2liaWxpdHkuc2V0KFxuICAgICAgICAgIGlzRWxlbWVudFZpc2libGUoe1xuICAgICAgICAgICAgY29udGFpbmVyOiBzY3JvbGxhYmxlLFxuICAgICAgICAgICAgZWxlbWVudDogbGFzdEVsZW1lbnQsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IG9uZSBmcmFtZSBiZWZvcmUgZW5hYmxpbmcgYW5pbWF0aW9ucyB0byBwcmV2ZW50IGEgYW5pbWF0aW9uIGZyb20gcGxheWluZyBkdXJpbmcgaW5pdGlhbCByZW5kZXIuXG4gICAgICAgIG5leHRGcmFtZSgoKSA9PiB0aGlzLmVuYWJsZU92ZXJsYXlBbmltYXRpb25zLnNldCh0cnVlKSk7XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXNBdFN0YXJ0ID0gdGhpcy5pc0F0U3RhcnQoKTtcbiAgICAgIGNvbnN0IGlzQXRFbmQgPSB0aGlzLmlzQXRFbmQoKTtcbiAgICAgIGNvbnN0IGNhblNjcm9sbCA9IHRoaXMuY2FuU2Nyb2xsKCk7XG5cbiAgICAgIHRoaXMuc2Nyb2xsU3RhdGVDaGFuZ2UuZW1pdCh7XG4gICAgICAgIGNhblNjcm9sbCxcbiAgICAgICAgaXNBdEVuZDogISFpc0F0RW5kLFxuICAgICAgICBpc0F0U3RhcnQ6ICEhaXNBdFN0YXJ0LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dXBTY3JvbGxMaXN0ZW5pbmcoKTtcbiAgfVxuXG4gIHNjcm9sbE9uZUNvbnRhaW5lclNpemUoZGlyZWN0aW9uOiAnc3RhcnQnIHwgJ2VuZCcpIHtcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBzY3JvbGxhYmxlU2l6ZSA9IHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/IHBhcmVudC5jbGllbnRXaWR0aCA6IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgY3VycmVudFNjcm9sbCA9IHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/IHNjcm9sbEVsZW1lbnQuc2Nyb2xsTGVmdCA6IHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wO1xuXG4gICAgc2Nyb2xsRWxlbWVudC5zY3JvbGxUbyh7XG4gICAgICBbdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnID8gJ2xlZnQnIDogJ3RvcCddOlxuICAgICAgICBjdXJyZW50U2Nyb2xsICsgKGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyA/IC1zY3JvbGxhYmxlU2l6ZSA6IHNjcm9sbGFibGVTaXplKSxcbiAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICB9KTtcbiAgfVxuXG4gIHNjcm9sbE9uZUl0ZW1TaXplKGRpcmVjdGlvbjogJ3N0YXJ0JyB8ICdlbmQnKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLl9sYXRlc3RWaXNpYmlsaXR5U3RhdGVzJC52YWx1ZTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdObyBlbGVtZW50cyBmb3VuZCB0byBzY3JvbGwgdG8uIE1ha2Ugc3VyZSB0byBhcHBseSB0aGUgaXNFbGVtZW50IGRpcmVjdGl2ZSB0byB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gc2Nyb2xsIHRvLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWwgPSBkaXJlY3Rpb24gPT09ICdzdGFydCcgPyB0aGlzLnByZXZpb3VzUGFydGlhbEludGVyc2VjdGlvbiA6IHRoaXMubmV4dFBhcnRpYWxJbnRlcnNlY3Rpb247XG5cbiAgICBpZiAoIWVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgZWxlbWVudDogZWw/LmVsZW1lbnQsXG4gICAgICBkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdpbmxpbmUnIDogJ2Jsb2NrJyxcbiAgICAgIG9yaWdpbjogZGlyZWN0aW9uLFxuICAgICAgLi4uKHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHsgc2Nyb2xsSW5saW5lTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbigpIH1cbiAgICAgICAgOiB7IHNjcm9sbEJsb2NrTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbigpIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsVG9FbGVtZW50KG9wdGlvbnM6IE9taXQ8U2Nyb2xsVG9FbGVtZW50T3B0aW9ucywgJ2NvbnRhaW5lcic+KSB7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgIC4uLih0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgPyB7IHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9XG4gICAgICAgIDogeyBzY3JvbGxCbG9ja01hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9KSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBzY3JvbGxUb0VsZW1lbnRCeUluZGV4KG9wdGlvbnM6IE9taXQ8U2Nyb2xsVG9FbGVtZW50T3B0aW9ucywgJ2NvbnRhaW5lcic+ICYgeyBpbmRleDogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZWxlbWVudExpc3QoKT8udG9BcnJheSgpID8/IFtdO1xuXG4gICAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ05vIGVsZW1lbnRzIGZvdW5kIHRvIHNjcm9sbCB0by4gTWFrZSBzdXJlIHRvIGFwcGx5IHRoZSBpc0VsZW1lbnQgZGlyZWN0aXZlIHRvIHRoZSBlbGVtZW50cyB5b3Ugd2FudCB0byBzY3JvbGwgdG8uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW29wdGlvbnMuaW5kZXhdPy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBzY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgY29udGFpbmVyOiBzY3JvbGxFbGVtZW50LFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLih0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgPyB7IHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9XG4gICAgICAgIDogeyBzY3JvbGxCbG9ja01hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9KSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SXNDdXJzb3JEcmFnZ2luZyhpc0RyYWdnaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNDdXJzb3JEcmFnZ2luZyQubmV4dChpc0RyYWdnaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1N0YXJ0RGlyZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNjcm9sbE1vZGUoKSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgIHRoaXMuc2Nyb2xsT25lQ29udGFpbmVyU2l6ZSgnc3RhcnQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxPbmVJdGVtU2l6ZSgnc3RhcnQnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TdGFydEVuZCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxNb2RlKCkgPT09ICdjb250YWluZXInKSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUNvbnRhaW5lclNpemUoJ2VuZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUl0ZW1TaXplKCdlbmQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFNjcm9sbExpc3RlbmluZygpIHtcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRMaXN0KCk7XG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQgfHwgIWVsZW1lbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGlzU25hcHBpbmcgPSBmYWxzZTtcbiAgICBsZXQgc25hcFRpbWVvdXQgPSAwO1xuXG4gICAgbWVyZ2UoZnJvbUV2ZW50PFdoZWVsRXZlbnQ+KHNjcm9sbEVsZW1lbnQsICd3aGVlbCcpLCBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oc2Nyb2xsRWxlbWVudCwgJ3RvdWNoc3RhcnQnKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIGlzU25hcHBpbmcgPSBmYWxzZTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBtZXJnZShcbiAgICAgIGZyb21FdmVudChzY3JvbGxFbGVtZW50LCAnc2Nyb2xsJyksXG4gICAgICB0aGlzLl9pc0N1cnNvckRyYWdnaW5nJCxcbiAgICAgIGVsZW1lbnRzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoZWxlbWVudHMpKSA/PyBvZihudWxsKSxcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxzID1cbiAgICAgICAgICAgIGVsZW1lbnRzXG4gICAgICAgICAgICAgID8udG9BcnJheSgpXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGU/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgLmZpbHRlcigoZSk6IGUgaXMgSFRNTEVsZW1lbnQgPT4gISFlKSA/PyBbXTtcblxuICAgICAgICAgIGlmICghZWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQubmV4dChbXSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdGF0ZXMgPSBnZXRFbGVtZW50VmlzaWJsZVN0YXRlcyh7XG4gICAgICAgICAgICBlbGVtZW50czogZWxzLFxuICAgICAgICAgICAgY29udGFpbmVyOiBzY3JvbGxFbGVtZW50LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcHJvcCA9IHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdpbmxpbmVJbnRlcnNlY3Rpb24nIDogJ2Jsb2NrSW50ZXJzZWN0aW9uJztcbiAgICAgICAgICBjb25zdCBzdGF0ZUNsYXNzID0gYGV0LWVsZW1lbnQtLWlzLWludGVyc2VjdGluZ2A7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHN0YXRlcykge1xuICAgICAgICAgICAgaWYgKHN0YXRlW3Byb3BdID09PSAxMDApIHtcbiAgICAgICAgICAgICAgc3RhdGUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKHN0YXRlQ2xhc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdGUuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHN0YXRlQ2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvbkNoYW5nZXMgPSBzdGF0ZXMubWFwKChzLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZTogU2Nyb2xsYWJsZUludGVyc2VjdGlvbkNoYW5nZSA9IHtcbiAgICAgICAgICAgICAgZWxlbWVudDogcy5lbGVtZW50LFxuICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25SYXRpbzogc1twcm9wXSAvIDEwMCxcbiAgICAgICAgICAgICAgaXNJbnRlcnNlY3Rpbmc6IHNbcHJvcF0gPT09IDEwMCxcbiAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbkNoYW5nZS5lbWl0KGludGVyc2VjdGlvbkNoYW5nZXMpO1xuXG4gICAgICAgICAgdGhpcy5fbGF0ZXN0VmlzaWJpbGl0eVN0YXRlcyQubmV4dChpbnRlcnNlY3Rpb25DaGFuZ2VzKTtcblxuICAgICAgICAgIGlmIChpc1NuYXBwaW5nIHx8IHRoaXMuX2lzQ3Vyc29yRHJhZ2dpbmckLnZhbHVlIHx8ICF0aGlzLnNuYXAoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgcHJldiA9IHRoaXMucHJldmlvdXNQYXJ0aWFsSW50ZXJzZWN0aW9uO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRQYXJ0aWFsSW50ZXJzZWN0aW9uO1xuICAgICAgICAgIGNvbnN0IHNraXBTbmFwID1cbiAgICAgICAgICAgICFwcmV2IHx8XG4gICAgICAgICAgICAhbmV4dCB8fFxuICAgICAgICAgICAgcHJldi5pbnRlcnNlY3Rpb25SYXRpbyA9PT0gMCB8fFxuICAgICAgICAgICAgbmV4dC5pbnRlcnNlY3Rpb25SYXRpbyA9PT0gMCB8fFxuICAgICAgICAgICAgcHJldi5pbnRlcnNlY3Rpb25SYXRpbyA9PT0gbmV4dC5pbnRlcnNlY3Rpb25SYXRpbztcblxuICAgICAgICAgIGlmIChza2lwU25hcCkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgaGlnaGVzdEludGVyc2VjdGluZyA9IHByZXYuaW50ZXJzZWN0aW9uUmF0aW8gPiBuZXh0LmludGVyc2VjdGlvblJhdGlvID8gcHJldiA6IG5leHQ7XG4gICAgICAgICAgY29uc3QgZnVsbEludGVyc2VjdGlvbkluZGV4ID0gdGhpcy5oaWdoZXN0VmlzaWJsZUludGVyc2VjdGlvbj8uaW5kZXg7XG5cbiAgICAgICAgICBpZiAoZnVsbEludGVyc2VjdGlvbkluZGV4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGhpZ2hlc3RJbnRlcnNlY3RpbmdJbmRleCA9IGhpZ2hlc3RJbnRlcnNlY3RpbmcuaW5kZXg7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luID0gaGlnaGVzdEludGVyc2VjdGluZ0luZGV4ID4gZnVsbEludGVyc2VjdGlvbkluZGV4ID8gJ2VuZCcgOiAnc3RhcnQnO1xuXG4gICAgICAgICAgc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGhpZ2hlc3RJbnRlcnNlY3RpbmcuZWxlbWVudCxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnID8gJ2lubGluZScgOiAnYmxvY2snLFxuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgc2Nyb2xsQmxvY2tNYXJnaW46IHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/IDAgOiB0aGlzLnNjcm9sbE1hcmdpbigpLFxuICAgICAgICAgICAgc2Nyb2xsSW5saW5lTWFyZ2luOiB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyB0aGlzLnNjcm9sbE1hcmdpbigpIDogMCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlzU25hcHBpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzbmFwVGltZW91dCk7XG5cbiAgICAgICAgICBzbmFwVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlzU25hcHBpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI3Njcm9sbGFibGVcbiAgW2F0dHIucm9sZV09XCJzY3JvbGxhYmxlUm9sZSgpID8/IHVuZGVmaW5lZFwiXG4gIFtldEN1cnNvckRyYWdTY3JvbGxdPVwiY3Vyc29yRHJhZ1Njcm9sbCgpXCJcbiAgW2FsbG93ZWREaXJlY3Rpb25dPVwiZGlyZWN0aW9uKClcIlxuICAoY3Vyc29yRHJhZ1N0YXJ0KT1cInNldElzQ3Vyc29yRHJhZ2dpbmcodHJ1ZSlcIlxuICAoY3Vyc29yRHJhZ0VuZCk9XCJzZXRJc0N1cnNvckRyYWdnaW5nKGZhbHNlKVwiXG4gIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1jb250YWluZXItb3V0ZXJcIlxuPlxuICA8ZGl2IFtuZ0NsYXNzXT1cInNjcm9sbGFibGVDbGFzcygpXCIgY2xhc3M9XCJldC1zY3JvbGxhYmxlLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgI2ZpcnN0RWxlbWVudCBjbGFzcz1cImV0LXNjcm9sbC1vYnNlcnZlci1maXJzdC1lbGVtZW50XCI+PC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgLz5cbiAgICA8ZGl2ICNsYXN0RWxlbWVudCBjbGFzcz1cImV0LXNjcm9sbC1vYnNlcnZlci1sYXN0LWVsZW1lbnRcIj48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuQGlmIChyZW5kZXJNYXNrcygpKSB7XG4gIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW1hc2tzXCI+XG4gICAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFzayBldC1zY3JvbGxhYmxlLW1hc2stLXN0YXJ0XCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFzayBldC1zY3JvbGxhYmxlLW1hc2stLWVuZFwiPjwvZGl2PlxuICA8L2Rpdj5cbn1cblxuQGlmIChyZW5kZXJCdXR0b25zKCkpIHtcbiAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uc1wiPlxuICAgIDxidXR0b25cbiAgICAgIChjbGljayk9XCJzY3JvbGxUb1N0YXJ0RGlyZWN0aW9uKClcIlxuICAgICAgY2xhc3M9XCJldC1zY3JvbGxhYmxlLWJ1dHRvbiBldC1zY3JvbGxhYmxlLWJ1dHRvbi0tc3RhcnRcIlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgPlxuICAgICAgPGV0LWNoZXZyb24taWNvbiAvPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIChjbGljayk9XCJzY3JvbGxUb1N0YXJ0RW5kKClcIlxuICAgICAgY2xhc3M9XCJldC1zY3JvbGxhYmxlLWJ1dHRvbiBldC1zY3JvbGxhYmxlLWJ1dHRvbi0tZW5kXCJcbiAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgID5cbiAgICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG59XG4iXX0=