@one-paragon/angular-utilities 1.0.4 → 1.1.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 (398) hide show
  1. package/action-state/action-state-spinner/action-state-spinner.component.d.ts +12 -0
  2. package/action-state/action-state-ui/action-state-ui.module.d.ts +7 -0
  3. package/{src/action-state/index.ts → action-state/index.d.ts} +4 -8
  4. package/action-state/ngrx-ext/ngrx-ext.module.d.ts +8 -0
  5. package/action-state/ngrx.d.ts +31 -0
  6. package/esm2022/action-state/action-state-spinner/action-state-spinner.component.mjs +24 -0
  7. package/esm2022/action-state/action-state-ui/action-state-ui.module.mjs +20 -0
  8. package/esm2022/action-state/index.mjs +8 -0
  9. package/esm2022/action-state/ngrx-ext/ngrx-ext.module.mjs +23 -0
  10. package/esm2022/action-state/ngrx.mjs +42 -0
  11. package/esm2022/http-request-state/HttpRequestStateFactory.mjs +52 -0
  12. package/esm2022/http-request-state/HttpRequestStateStore.mjs +101 -0
  13. package/esm2022/http-request-state/directives/HttpStateDirectiveBase.mjs +34 -0
  14. package/esm2022/http-request-state/directives/http-error-state-directive.mjs +29 -0
  15. package/esm2022/http-request-state/directives/http-inProgress-state-directive.mjs +29 -0
  16. package/esm2022/http-request-state/directives/http-notStarted-state-directive.mjs +29 -0
  17. package/esm2022/http-request-state/directives/http-success-state-directive.mjs +34 -0
  18. package/esm2022/http-request-state/directives/index.mjs +6 -0
  19. package/esm2022/http-request-state/directives/request-state-directive.mjs +60 -0
  20. package/esm2022/http-request-state/helpers.mjs +22 -0
  21. package/esm2022/http-request-state/http-request-state.mjs +39 -0
  22. package/esm2022/http-request-state/http-state-module.mjs +40 -0
  23. package/esm2022/http-request-state/index.mjs +7 -0
  24. package/esm2022/http-request-state/rxjs/getRequestorBody.mjs +4 -0
  25. package/esm2022/http-request-state/rxjs/getRequestorState.mjs +3 -0
  26. package/esm2022/http-request-state/rxjs/index.mjs +5 -0
  27. package/esm2022/http-request-state/rxjs/tapError.mjs +12 -0
  28. package/esm2022/http-request-state/rxjs/tapSuccess.mjs +12 -0
  29. package/esm2022/http-request-state/types.mjs +16 -0
  30. package/esm2022/ngrx/actionable-selector.mjs +73 -0
  31. package/esm2022/ngrx/index.mjs +2 -0
  32. package/esm2022/one-paragon-angular-utilities.mjs +5 -0
  33. package/esm2022/public-api.mjs +20 -0
  34. package/esm2022/rxjs/defaultShareReplay.mjs +7 -0
  35. package/esm2022/rxjs/index.mjs +6 -0
  36. package/esm2022/rxjs/mapError.mjs +8 -0
  37. package/esm2022/rxjs/rxjs-operators.mjs +92 -0
  38. package/esm2022/rxjs/subjectifier.mjs +15 -0
  39. package/esm2022/rxjs/subscriber.directive.mjs +50 -0
  40. package/esm2022/table-builder/classes/DefaultSettings.mjs +6 -0
  41. package/esm2022/table-builder/classes/MatTableObservableDataSource.mjs +21 -0
  42. package/esm2022/table-builder/classes/TableBuilderConfig.mjs +18 -0
  43. package/esm2022/table-builder/classes/TableBuilderDataSource.mjs +53 -0
  44. package/esm2022/table-builder/classes/TableState.mjs +44 -0
  45. package/esm2022/table-builder/classes/display-col.mjs +2 -0
  46. package/esm2022/table-builder/classes/filter-info.mjs +73 -0
  47. package/esm2022/table-builder/classes/table-builder-general-settings.mjs +86 -0
  48. package/esm2022/table-builder/classes/table-builder.mjs +41 -0
  49. package/esm2022/table-builder/classes/table-store.mjs +356 -0
  50. package/esm2022/table-builder/components/array-column.component.mjs +57 -0
  51. package/esm2022/table-builder/components/column-builder/column-builder.component.mjs +125 -0
  52. package/esm2022/table-builder/components/column-builder/column-helpers.mjs +26 -0
  53. package/esm2022/table-builder/components/date-filter/date-filter.component.mjs +29 -0
  54. package/esm2022/table-builder/components/date-time-filter/date-time-filter.component.mjs +24 -0
  55. package/esm2022/table-builder/components/filter/filter.component.mjs +67 -0
  56. package/esm2022/table-builder/components/filter/in-list/in-list-filter.component.mjs +101 -0
  57. package/esm2022/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +53 -0
  58. package/esm2022/table-builder/components/generic-table/generic-table.component.mjs +203 -0
  59. package/esm2022/table-builder/components/generic-table/paginator.component.mjs +80 -0
  60. package/esm2022/table-builder/components/group-by-list/group-by-list.component.mjs +23 -0
  61. package/esm2022/table-builder/components/header-menu/header-menu.component.mjs +100 -0
  62. package/esm2022/table-builder/components/in-filter/in-filter.component.mjs +64 -0
  63. package/esm2022/table-builder/components/index.mjs +10 -0
  64. package/esm2022/table-builder/components/initialization-component/initialization-component.mjs +40 -0
  65. package/esm2022/table-builder/components/link-column.component.mjs +78 -0
  66. package/esm2022/table-builder/components/number-filter/number-filter.component.mjs +29 -0
  67. package/esm2022/table-builder/components/scroll-strategy.mjs +63 -0
  68. package/esm2022/table-builder/components/sort-menu/sort-menu.component-store.mjs +43 -0
  69. package/esm2022/table-builder/components/sort-menu/sort-menu.component.mjs +81 -0
  70. package/esm2022/table-builder/components/table-container/table-container-imports.mjs +26 -0
  71. package/esm2022/table-builder/components/table-container/table-container.helpers/data-state.helpers.mjs +135 -0
  72. package/esm2022/table-builder/components/table-container/table-container.helpers/filter-state.helpers.mjs +83 -0
  73. package/esm2022/table-builder/components/table-container/table-container.helpers/groupBy.helpers.mjs +71 -0
  74. package/esm2022/table-builder/components/table-container/table-container.helpers/sort-state.helpers.mjs +36 -0
  75. package/esm2022/table-builder/components/table-container/table-container.mjs +305 -0
  76. package/esm2022/table-builder/components/table-container/tableProps.mjs +7 -0
  77. package/esm2022/table-builder/components/table-container/virtual-scroll-container.mjs +105 -0
  78. package/esm2022/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +47 -0
  79. package/esm2022/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +36 -0
  80. package/esm2022/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +25 -0
  81. package/esm2022/table-builder/directives/custom-cell-directive.mjs +70 -0
  82. package/esm2022/table-builder/directives/index.mjs +6 -0
  83. package/esm2022/table-builder/directives/multi-sort.directive.mjs +50 -0
  84. package/esm2022/table-builder/directives/resize-column.directive.mjs +88 -0
  85. package/esm2022/table-builder/directives/table-wrapper.directive.mjs +20 -0
  86. package/esm2022/table-builder/directives/tb-filter.directive.mjs +410 -0
  87. package/esm2022/table-builder/enums/filterTypes.mjs +72 -0
  88. package/esm2022/table-builder/functions/boolean-filter-function.mjs +10 -0
  89. package/esm2022/table-builder/functions/date-filter-function.mjs +58 -0
  90. package/esm2022/table-builder/functions/download-data.mjs +12 -0
  91. package/esm2022/table-builder/functions/null-filter-function.mjs +8 -0
  92. package/esm2022/table-builder/functions/number-filter-function.mjs +32 -0
  93. package/esm2022/table-builder/functions/sort-data-function.mjs +17 -0
  94. package/esm2022/table-builder/functions/string-filter-function.mjs +41 -0
  95. package/esm2022/table-builder/interfaces/ColumnInfo.mjs +2 -0
  96. package/esm2022/table-builder/interfaces/dictionary.mjs +2 -0
  97. package/esm2022/table-builder/interfaces/report-def.mjs +50 -0
  98. package/esm2022/table-builder/ngrx/tableBuilderStateStore.mjs +115 -0
  99. package/esm2022/table-builder/pipes/column-total.pipe.mjs +22 -0
  100. package/esm2022/table-builder/pipes/format-filter-type.pipe.mjs +18 -0
  101. package/esm2022/table-builder/pipes/format-filter-value.pipe.mjs +45 -0
  102. package/esm2022/table-builder/pipes/key-display.mjs +20 -0
  103. package/esm2022/table-builder/services/export-to-csv.service.mjs +91 -0
  104. package/esm2022/table-builder/services/link-creator.service.mjs +50 -0
  105. package/esm2022/table-builder/services/table-template-service.mjs +56 -0
  106. package/esm2022/table-builder/services/transform-creator.mjs +105 -0
  107. package/esm2022/table-builder/table-builder.module.mjs +124 -0
  108. package/esm2022/utilities/array-helpers.mjs +14 -0
  109. package/esm2022/utilities/directives/auto-focus.directive.mjs +27 -0
  110. package/esm2022/utilities/directives/clickEmitterDirective.mjs +22 -0
  111. package/esm2022/utilities/directives/clickSubject.mjs +28 -0
  112. package/esm2022/utilities/directives/conditional-classes.directive.mjs +36 -0
  113. package/esm2022/utilities/directives/dialog-service.mjs +23 -0
  114. package/esm2022/utilities/directives/dialog.mjs +139 -0
  115. package/esm2022/utilities/directives/mat-toggle-group-directive.mjs +60 -0
  116. package/esm2022/utilities/directives/prevent-enter.directive.mjs +20 -0
  117. package/esm2022/utilities/directives/stop-propagation.directive.mjs +26 -0
  118. package/esm2022/utilities/directives/styler.mjs +42 -0
  119. package/esm2022/utilities/directives/trim-whitespace.directive.mjs +30 -0
  120. package/esm2022/utilities/index.mjs +16 -0
  121. package/esm2022/utilities/module.mjs +90 -0
  122. package/esm2022/utilities/pipes/function.pipe.mjs +22 -0
  123. package/esm2022/utilities/pipes/phone.pipe.mjs +20 -0
  124. package/esm2022/utilities/pipes/space-case.pipes.mjs +28 -0
  125. package/fesm2022/one-paragon-angular-utilities.mjs +5376 -0
  126. package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -0
  127. package/http-request-state/HttpRequestStateFactory.d.ts +17 -0
  128. package/http-request-state/HttpRequestStateStore.d.ts +49 -0
  129. package/http-request-state/directives/HttpStateDirectiveBase.d.ts +16 -0
  130. package/http-request-state/directives/http-error-state-directive.d.ts +12 -0
  131. package/http-request-state/directives/http-inProgress-state-directive.d.ts +12 -0
  132. package/http-request-state/directives/http-notStarted-state-directive.d.ts +12 -0
  133. package/http-request-state/directives/http-success-state-directive.d.ts +21 -0
  134. package/{src/http-request-state/directives/index.ts → http-request-state/directives/index.d.ts} +5 -5
  135. package/http-request-state/directives/request-state-directive.d.ts +35 -0
  136. package/http-request-state/helpers.d.ts +9 -0
  137. package/http-request-state/http-request-state.d.ts +12 -0
  138. package/http-request-state/http-state-module.d.ts +11 -0
  139. package/{src/http-request-state/index.ts → http-request-state/index.d.ts} +6 -6
  140. package/http-request-state/rxjs/getRequestorBody.d.ts +3 -0
  141. package/http-request-state/rxjs/getRequestorState.d.ts +3 -0
  142. package/{src/http-request-state/rxjs/index.ts → http-request-state/rxjs/index.d.ts} +4 -4
  143. package/http-request-state/rxjs/tapError.d.ts +3 -0
  144. package/http-request-state/rxjs/tapSuccess.d.ts +3 -0
  145. package/http-request-state/types.d.ts +41 -0
  146. package/index.d.ts +5 -0
  147. package/ngrx/actionable-selector.d.ts +17 -0
  148. package/ngrx/index.d.ts +1 -0
  149. package/package.json +30 -16
  150. package/{src/public-api.ts → public-api.d.ts} +16 -35
  151. package/rxjs/defaultShareReplay.d.ts +2 -0
  152. package/{src/rxjs/index.ts → rxjs/index.d.ts} +5 -5
  153. package/rxjs/mapError.d.ts +2 -0
  154. package/rxjs/rxjs-operators.d.ts +13 -0
  155. package/rxjs/subjectifier.d.ts +9 -0
  156. package/rxjs/subscriber.directive.d.ts +13 -0
  157. package/table-builder/classes/DefaultSettings.d.ts +9 -0
  158. package/table-builder/classes/MatTableObservableDataSource.d.ts +9 -0
  159. package/table-builder/classes/TableBuilderConfig.d.ts +21 -0
  160. package/table-builder/classes/TableBuilderDataSource.d.ts +13 -0
  161. package/table-builder/classes/TableState.d.ts +53 -0
  162. package/{src/table-builder/classes/display-col.ts → table-builder/classes/display-col.d.ts} +5 -5
  163. package/table-builder/classes/filter-info.d.ts +127 -0
  164. package/table-builder/classes/table-builder-general-settings.d.ts +55 -0
  165. package/table-builder/classes/table-builder.d.ts +12 -0
  166. package/table-builder/classes/table-store.d.ts +143 -0
  167. package/table-builder/components/array-column.component.d.ts +15 -0
  168. package/table-builder/components/column-builder/column-builder.component.d.ts +51 -0
  169. package/table-builder/components/column-builder/column-helpers.d.ts +28 -0
  170. package/table-builder/components/date-filter/date-filter.component.d.ts +10 -0
  171. package/table-builder/components/date-time-filter/date-time-filter.component.d.ts +10 -0
  172. package/table-builder/components/filter/filter.component.d.ts +112 -0
  173. package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +27 -0
  174. package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +16 -0
  175. package/table-builder/components/generic-table/generic-table.component.d.ts +63 -0
  176. package/table-builder/components/generic-table/paginator.component.d.ts +26 -0
  177. package/table-builder/components/group-by-list/group-by-list.component.d.ts +7 -0
  178. package/table-builder/components/header-menu/header-menu.component.d.ts +25 -0
  179. package/table-builder/components/in-filter/in-filter.component.d.ts +21 -0
  180. package/{src/table-builder/components/index.ts → table-builder/components/index.d.ts} +9 -9
  181. package/table-builder/components/initialization-component/initialization-component.d.ts +13 -0
  182. package/table-builder/components/link-column.component.d.ts +25 -0
  183. package/table-builder/components/number-filter/number-filter.component.d.ts +12 -0
  184. package/table-builder/components/scroll-strategy.d.ts +23 -0
  185. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +24 -0
  186. package/table-builder/components/sort-menu/sort-menu.component.d.ts +25 -0
  187. package/{src/table-builder/components/table-container/table-container-imports.ts → table-builder/components/table-container/table-container-imports.d.ts} +14 -30
  188. package/table-builder/components/table-container/table-container.d.ts +76 -0
  189. package/table-builder/components/table-container/table-container.helpers/data-state.helpers.d.ts +6 -0
  190. package/table-builder/components/table-container/table-container.helpers/filter-state.helpers.d.ts +17 -0
  191. package/table-builder/components/table-container/table-container.helpers/groupBy.helpers.d.ts +17 -0
  192. package/table-builder/components/table-container/table-container.helpers/sort-state.helpers.d.ts +8 -0
  193. package/table-builder/components/table-container/tableProps.d.ts +11 -0
  194. package/table-builder/components/table-container/virtual-scroll-container.d.ts +19 -0
  195. package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +16 -0
  196. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +14 -0
  197. package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +14 -0
  198. package/table-builder/directives/custom-cell-directive.d.ts +31 -0
  199. package/{src/table-builder/directives/index.ts → table-builder/directives/index.d.ts} +5 -6
  200. package/table-builder/directives/multi-sort.directive.d.ts +11 -0
  201. package/table-builder/directives/resize-column.directive.d.ts +44 -0
  202. package/table-builder/directives/table-wrapper.directive.d.ts +8 -0
  203. package/table-builder/directives/tb-filter.directive.d.ts +120 -0
  204. package/table-builder/enums/filterTypes.d.ts +77 -0
  205. package/table-builder/functions/boolean-filter-function.d.ts +3 -0
  206. package/table-builder/functions/date-filter-function.d.ts +4 -0
  207. package/table-builder/functions/download-data.d.ts +1 -0
  208. package/table-builder/functions/null-filter-function.d.ts +2 -0
  209. package/table-builder/functions/number-filter-function.d.ts +4 -0
  210. package/table-builder/functions/sort-data-function.d.ts +6 -0
  211. package/table-builder/functions/string-filter-function.d.ts +7 -0
  212. package/{src/table-builder/interfaces/ColumnInfo.ts → table-builder/interfaces/ColumnInfo.d.ts} +6 -7
  213. package/{src/table-builder/interfaces/dictionary.ts → table-builder/interfaces/dictionary.d.ts} +3 -3
  214. package/table-builder/interfaces/report-def.d.ts +147 -0
  215. package/table-builder/ngrx/tableBuilderStateStore.d.ts +62 -0
  216. package/table-builder/pipes/column-total.pipe.d.ts +8 -0
  217. package/table-builder/pipes/format-filter-type.pipe.d.ts +8 -0
  218. package/table-builder/pipes/format-filter-value.pipe.d.ts +14 -0
  219. package/table-builder/pipes/key-display.d.ts +11 -0
  220. package/table-builder/services/export-to-csv.service.d.ts +22 -0
  221. package/table-builder/services/link-creator.service.d.ts +16 -0
  222. package/table-builder/services/table-template-service.d.ts +15 -0
  223. package/table-builder/services/transform-creator.d.ts +21 -0
  224. package/table-builder/table-builder.module.d.ts +21 -0
  225. package/utilities/array-helpers.d.ts +1 -0
  226. package/utilities/directives/auto-focus.directive.d.ts +10 -0
  227. package/utilities/directives/clickEmitterDirective.d.ts +7 -0
  228. package/utilities/directives/clickSubject.d.ts +9 -0
  229. package/utilities/directives/conditional-classes.directive.d.ts +14 -0
  230. package/utilities/directives/dialog-service.d.ts +10 -0
  231. package/utilities/directives/dialog.d.ts +46 -0
  232. package/utilities/directives/mat-toggle-group-directive.d.ts +21 -0
  233. package/utilities/directives/prevent-enter.directive.d.ts +6 -0
  234. package/utilities/directives/stop-propagation.directive.d.ts +7 -0
  235. package/utilities/directives/styler.d.ts +17 -0
  236. package/utilities/directives/trim-whitespace.directive.d.ts +9 -0
  237. package/{src/utilities/index.ts → utilities/index.d.ts} +15 -22
  238. package/utilities/module.d.ts +19 -0
  239. package/utilities/pipes/function.pipe.d.ts +7 -0
  240. package/utilities/pipes/phone.pipe.d.ts +7 -0
  241. package/utilities/pipes/space-case.pipes.d.ts +17 -0
  242. package/karma.conf.js +0 -44
  243. package/ng-package.json +0 -7
  244. package/src/action-state/action-state-spinner/action-state-spinner.component.css +0 -16
  245. package/src/action-state/action-state-spinner/action-state-spinner.component.html +0 -6
  246. package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +0 -25
  247. package/src/action-state/action-state-spinner/action-state-spinner.component.ts +0 -26
  248. package/src/action-state/action-state-ui/action-state-ui.module.ts +0 -13
  249. package/src/action-state/ngrx-ext/ngrx-ext.module.ts +0 -15
  250. package/src/action-state/ngrx.ts +0 -69
  251. package/src/http-request-state/HttpRequestStateFactory.ts +0 -66
  252. package/src/http-request-state/HttpRequestStateStore.ts +0 -151
  253. package/src/http-request-state/directives/HttpStateDirectiveBase.ts +0 -38
  254. package/src/http-request-state/directives/http-error-state-directive.ts +0 -32
  255. package/src/http-request-state/directives/http-inProgress-state-directive.ts +0 -32
  256. package/src/http-request-state/directives/http-notStarted-state-directive.ts +0 -31
  257. package/src/http-request-state/directives/http-success-state-directive.ts +0 -40
  258. package/src/http-request-state/directives/request-state-directive.spec.ts +0 -72
  259. package/src/http-request-state/directives/request-state-directive.ts +0 -79
  260. package/src/http-request-state/helpers.ts +0 -30
  261. package/src/http-request-state/http-request-state.ts +0 -69
  262. package/src/http-request-state/http-state-module.ts +0 -23
  263. package/src/http-request-state/observable.spec.ts +0 -43
  264. package/src/http-request-state/rxjs/getRequestorBody.ts +0 -10
  265. package/src/http-request-state/rxjs/getRequestorState.ts +0 -8
  266. package/src/http-request-state/rxjs/tapError.ts +0 -16
  267. package/src/http-request-state/rxjs/tapSuccess.ts +0 -16
  268. package/src/http-request-state/strategies.spec.ts +0 -42
  269. package/src/http-request-state/types.ts +0 -56
  270. package/src/ngrx/actionable-selector.ts +0 -95
  271. package/src/ngrx/index.ts +0 -1
  272. package/src/rxjs/defaultShareReplay.ts +0 -8
  273. package/src/rxjs/mapError.ts +0 -8
  274. package/src/rxjs/rxjs-operators.ts +0 -132
  275. package/src/rxjs/subjectifier.ts +0 -15
  276. package/src/rxjs/subscriber.directive.ts +0 -54
  277. package/src/specs/clickSubject.spec.ts +0 -95
  278. package/src/specs/dialog.spec.ts +0 -101
  279. package/src/specs/toggleGroupDirective.spec.ts +0 -229
  280. package/src/table-builder/classes/DefaultSettings.ts +0 -11
  281. package/src/table-builder/classes/MatTableObservableDataSource.ts +0 -23
  282. package/src/table-builder/classes/TableBuilderConfig.ts +0 -35
  283. package/src/table-builder/classes/TableBuilderDataSource.ts +0 -57
  284. package/src/table-builder/classes/TableState.ts +0 -83
  285. package/src/table-builder/classes/filter-info.ts +0 -131
  286. package/src/table-builder/classes/table-builder-general-settings.ts +0 -90
  287. package/src/table-builder/classes/table-builder.ts +0 -52
  288. package/src/table-builder/classes/table-store.ts +0 -416
  289. package/src/table-builder/components/array-column.component.ts +0 -36
  290. package/src/table-builder/components/column-builder/column-builder.component.html +0 -61
  291. package/src/table-builder/components/column-builder/column-builder.component.scss +0 -43
  292. package/src/table-builder/components/column-builder/column-builder.component.spec.ts +0 -49
  293. package/src/table-builder/components/column-builder/column-builder.component.ts +0 -137
  294. package/src/table-builder/components/column-builder/column-helpers.ts +0 -36
  295. package/src/table-builder/components/date-filter/date-filter.component.html +0 -23
  296. package/src/table-builder/components/date-filter/date-filter.component.ts +0 -24
  297. package/src/table-builder/components/date-time-filter/date-time-filter.component.html +0 -9
  298. package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +0 -22
  299. package/src/table-builder/components/filter/filter.component.html +0 -88
  300. package/src/table-builder/components/filter/filter.component.scss +0 -64
  301. package/src/table-builder/components/filter/filter.component.spec.ts +0 -87
  302. package/src/table-builder/components/filter/filter.component.ts +0 -55
  303. package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +0 -92
  304. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +0 -55
  305. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +0 -57
  306. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +0 -57
  307. package/src/table-builder/components/generic-table/generic-table.component.html +0 -71
  308. package/src/table-builder/components/generic-table/generic-table.component.scss +0 -51
  309. package/src/table-builder/components/generic-table/generic-table.component.ts +0 -228
  310. package/src/table-builder/components/generic-table/paginator.component.ts +0 -94
  311. package/src/table-builder/components/group-by-list/group-by-list.component.css +0 -8
  312. package/src/table-builder/components/group-by-list/group-by-list.component.html +0 -12
  313. package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +0 -23
  314. package/src/table-builder/components/group-by-list/group-by-list.component.ts +0 -21
  315. package/src/table-builder/components/header-menu/header-menu.component.html +0 -104
  316. package/src/table-builder/components/header-menu/header-menu.component.scss +0 -96
  317. package/src/table-builder/components/header-menu/header-menu.component.ts +0 -98
  318. package/src/table-builder/components/in-filter/in-filter.component.css +0 -3
  319. package/src/table-builder/components/in-filter/in-filter.component.html +0 -20
  320. package/src/table-builder/components/in-filter/in-filter.component.ts +0 -64
  321. package/src/table-builder/components/initialization-component/initialization-component.html +0 -29
  322. package/src/table-builder/components/initialization-component/initialization-component.ts +0 -24
  323. package/src/table-builder/components/link-column.component.ts +0 -47
  324. package/src/table-builder/components/number-filter/number-filter.component.css +0 -10
  325. package/src/table-builder/components/number-filter/number-filter.component.html +0 -19
  326. package/src/table-builder/components/number-filter/number-filter.component.spec.ts +0 -30
  327. package/src/table-builder/components/number-filter/number-filter.component.ts +0 -25
  328. package/src/table-builder/components/scroll-strategy.ts +0 -82
  329. package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +0 -62
  330. package/src/table-builder/components/sort-menu/sort-menu.component.html +0 -111
  331. package/src/table-builder/components/sort-menu/sort-menu.component.scss +0 -119
  332. package/src/table-builder/components/sort-menu/sort-menu.component.ts +0 -95
  333. package/src/table-builder/components/table-container/table-container.css +0 -45
  334. package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +0 -141
  335. package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +0 -106
  336. package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +0 -69
  337. package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +0 -45
  338. package/src/table-builder/components/table-container/table-container.html +0 -117
  339. package/src/table-builder/components/table-container/table-container.spec.ts +0 -154
  340. package/src/table-builder/components/table-container/table-container.ts +0 -331
  341. package/src/table-builder/components/table-container/tableProps.ts +0 -18
  342. package/src/table-builder/components/table-container/virtual-scroll-container.ts +0 -126
  343. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +0 -31
  344. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +0 -52
  345. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +0 -42
  346. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +0 -10
  347. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +0 -86
  348. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +0 -38
  349. package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +0 -23
  350. package/src/table-builder/directives/custom-cell-directive.ts +0 -59
  351. package/src/table-builder/directives/multi-sort.directive.spec.ts +0 -124
  352. package/src/table-builder/directives/multi-sort.directive.ts +0 -49
  353. package/src/table-builder/directives/resize-column.directive.ts +0 -105
  354. package/src/table-builder/directives/table-wrapper.directive.ts +0 -14
  355. package/src/table-builder/directives/tb-filter.directive.ts +0 -370
  356. package/src/table-builder/enums/filterTypes.ts +0 -79
  357. package/src/table-builder/functions/boolean-filter-function.ts +0 -13
  358. package/src/table-builder/functions/date-filter-function.ts +0 -69
  359. package/src/table-builder/functions/download-data.ts +0 -11
  360. package/src/table-builder/functions/null-filter-function.ts +0 -9
  361. package/src/table-builder/functions/number-filter-function.ts +0 -42
  362. package/src/table-builder/functions/sort-data-function.ts +0 -23
  363. package/src/table-builder/functions/string-filter-function.ts +0 -52
  364. package/src/table-builder/interfaces/column-template.ts +0 -9
  365. package/src/table-builder/interfaces/report-def.ts +0 -153
  366. package/src/table-builder/ngrx/tableBuilderStateStore.ts +0 -143
  367. package/src/table-builder/pipes/column-total.pipe.ts +0 -17
  368. package/src/table-builder/pipes/format-filter-type.pipe.ts +0 -12
  369. package/src/table-builder/pipes/format-filter-value.pipe.ts +0 -41
  370. package/src/table-builder/pipes/key-display.ts +0 -16
  371. package/src/table-builder/services/export-to-csv.service.ts +0 -95
  372. package/src/table-builder/services/link-creator.service.ts +0 -68
  373. package/src/table-builder/services/table-template-service.ts +0 -55
  374. package/src/table-builder/services/transform-creator.ts +0 -92
  375. package/src/table-builder/specs/table-custom-filters.spec.ts +0 -262
  376. package/src/table-builder/styles/collapser.styles.scss +0 -15
  377. package/src/table-builder/table-builder.module.ts +0 -73
  378. package/src/test.ts +0 -17
  379. package/src/utilities/array-helpers.ts +0 -13
  380. package/src/utilities/directives/auto-focus.directive.ts +0 -20
  381. package/src/utilities/directives/clickEmitterDirective.ts +0 -16
  382. package/src/utilities/directives/clickSubject.ts +0 -20
  383. package/src/utilities/directives/conditional-classes.directive.ts +0 -36
  384. package/src/utilities/directives/dialog-service.ts +0 -19
  385. package/src/utilities/directives/dialog.ts +0 -142
  386. package/src/utilities/directives/mat-toggle-group-directive.ts +0 -61
  387. package/src/utilities/directives/prevent-enter.directive.ts +0 -13
  388. package/src/utilities/directives/stop-propagation.directive.ts +0 -20
  389. package/src/utilities/directives/styler.ts +0 -39
  390. package/src/utilities/directives/trim-whitespace.directive.ts +0 -21
  391. package/src/utilities/module.ts +0 -55
  392. package/src/utilities/pipes/function.pipe.ts +0 -16
  393. package/src/utilities/pipes/phone.pipe.ts +0 -15
  394. package/src/utilities/pipes/space-case.pipes.spec.ts +0 -47
  395. package/src/utilities/pipes/space-case.pipes.ts +0 -23
  396. package/tsconfig.lib.json +0 -19
  397. package/tsconfig.lib.prod.json +0 -10
  398. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,36 @@
1
+ import { difference } from "lodash";
2
+ // If we are only sorting due to a change in the Sorts[] we can 'optimize'. If the sort array was first by column a asc then by column b desc then by column c asc,
3
+ // and now it is first by column d asc then by column a desc then by column b desc then by column c asc, we dont need to rerun the tail, i.e. for culumn b and c.
4
+ // So we need to calculate the matching tail of the sort array. Then sortsToRun will be the non-matching head.
5
+ // But if any sorts were removed the only way to 'unsort' is to start by the original data and run all the existing sorts again, so 'sorts to run' will be all
6
+ // the sorts.
7
+ // We always pass allSorts to the container because if the table data changes all the sorts will need to be run.
8
+ export function updateSortState(previousSorts, currentSorts) {
9
+ currentSorts = addInitSort(currentSorts);
10
+ if (sortsRemoved(previousSorts.allSorts, currentSorts)) {
11
+ return ({ sortsToRun: currentSorts, allSorts: currentSorts });
12
+ }
13
+ const sameTailLength = getSameTailLength(previousSorts.allSorts, currentSorts);
14
+ const sortsToRun = currentSorts.slice(0, currentSorts.length - sameTailLength);
15
+ return ({ sortsToRun, allSorts: currentSorts });
16
+ }
17
+ function addInitSort(sorts) {
18
+ return [...sorts, { active: initIndexSymbol, direction: 'asc' }];
19
+ }
20
+ function sortsRemoved(previousSorts, currentSorts) {
21
+ const previousSortedColumns = previousSorts.map(s => s.active);
22
+ const currentSortedColumns = currentSorts.map(s => s.active);
23
+ const sortsRemoved = !!difference(previousSortedColumns, currentSortedColumns).length;
24
+ return sortsRemoved;
25
+ }
26
+ function getSameTailLength(previousSorts, currentSorts) {
27
+ previousSorts = [...previousSorts].reverse();
28
+ currentSorts = [...currentSorts].reverse();
29
+ let indexOfChange = currentSorts.findIndex((s, i) => s.active !== previousSorts[i]?.active || s.direction !== previousSorts[i]?.direction);
30
+ if (indexOfChange === -1)
31
+ return indexOfChange = currentSorts.length;
32
+ return indexOfChange;
33
+ }
34
+ export const initIndexSymbol = Symbol('tb_init_index');
35
+ export const initialSortState = { sortsToRun: [], allSorts: [] };
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC1zdGF0ZS5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmhlbHBlcnMvc29ydC1zdGF0ZS5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFcEMsbUtBQW1LO0FBQ25LLGlLQUFpSztBQUNqSyw4R0FBOEc7QUFDOUcsOEpBQThKO0FBQzlKLGFBQWE7QUFDYixnSEFBZ0g7QUFDaEgsTUFBTSxVQUFVLGVBQWUsQ0FBQyxhQUF3QixFQUFFLFlBQW9CO0lBQzVFLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsSUFBRyxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDL0UsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQztJQUMvRSxPQUFPLENBQUMsRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUlELFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDaEMsT0FBTyxDQUFDLEdBQUcsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLGVBQW9DLEVBQUUsU0FBUyxFQUFFLEtBQXNCLEVBQUMsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxhQUFxQixFQUFFLFlBQW9CO0lBQy9ELE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxNQUFNLG9CQUFvQixHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0QsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0RixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBR0QsU0FBUyxpQkFBaUIsQ0FBQyxhQUFxQixFQUFFLFlBQW9CO0lBQ3BFLGFBQWEsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0MsWUFBWSxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQyxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNJLElBQUcsYUFBYSxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDcEUsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvcnQgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydFwiO1xyXG5pbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWRlZlwiO1xyXG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSBcImxvZGFzaFwiO1xyXG5cclxuLy8gSWYgd2UgYXJlIG9ubHkgc29ydGluZyBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlIFNvcnRzW10gd2UgY2FuICdvcHRpbWl6ZScuIElmIHRoZSBzb3J0IGFycmF5IHdhcyBmaXJzdCBieSBjb2x1bW4gYSBhc2MgdGhlbiBieSBjb2x1bW4gYiBkZXNjIHRoZW4gYnkgY29sdW1uIGMgYXNjLFxyXG4vLyBhbmQgbm93IGl0IGlzIGZpcnN0IGJ5IGNvbHVtbiBkIGFzYyB0aGVuIGJ5IGNvbHVtbiBhIGRlc2MgdGhlbiBieSBjb2x1bW4gYiBkZXNjIHRoZW4gYnkgY29sdW1uIGMgYXNjLCB3ZSBkb250IG5lZWQgdG8gcmVydW4gdGhlIHRhaWwsIGkuZS4gZm9yIGN1bHVtbiBiIGFuZCBjLlxyXG4vLyBTbyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWF0Y2hpbmcgdGFpbCBvZiB0aGUgc29ydCBhcnJheS4gVGhlbiBzb3J0c1RvUnVuIHdpbGwgYmUgdGhlIG5vbi1tYXRjaGluZyBoZWFkLlxyXG4vLyBCdXQgaWYgYW55IHNvcnRzIHdlcmUgcmVtb3ZlZCB0aGUgb25seSB3YXkgdG8gJ3Vuc29ydCcgaXMgdG8gc3RhcnQgYnkgdGhlIG9yaWdpbmFsIGRhdGEgYW5kIHJ1biBhbGwgdGhlIGV4aXN0aW5nIHNvcnRzIGFnYWluLCBzbyAnc29ydHMgdG8gcnVuJyB3aWxsIGJlIGFsbFxyXG4vLyB0aGUgc29ydHMuXHJcbi8vIFdlIGFsd2F5cyBwYXNzIGFsbFNvcnRzIHRvIHRoZSBjb250YWluZXIgYmVjYXVzZSBpZiB0aGUgdGFibGUgZGF0YSBjaGFuZ2VzIGFsbCB0aGUgc29ydHMgd2lsbCBuZWVkIHRvIGJlIHJ1bi5cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNvcnRTdGF0ZShwcmV2aW91c1NvcnRzOiBTb3J0U3RhdGUsIGN1cnJlbnRTb3J0czogU29ydFtdKTogU29ydFN0YXRle1xyXG4gIGN1cnJlbnRTb3J0cyA9IGFkZEluaXRTb3J0KGN1cnJlbnRTb3J0cyk7XHJcbiAgaWYoc29ydHNSZW1vdmVkKHByZXZpb3VzU29ydHMuYWxsU29ydHMsIGN1cnJlbnRTb3J0cykpe1xyXG4gICAgcmV0dXJuICh7c29ydHNUb1J1bjogY3VycmVudFNvcnRzLCBhbGxTb3J0czogY3VycmVudFNvcnRzfSk7XHJcbiAgfVxyXG4gIGNvbnN0IHNhbWVUYWlsTGVuZ3RoID0gZ2V0U2FtZVRhaWxMZW5ndGgocHJldmlvdXNTb3J0cy5hbGxTb3J0cywgY3VycmVudFNvcnRzKTtcclxuICBjb25zdCBzb3J0c1RvUnVuID0gY3VycmVudFNvcnRzLnNsaWNlKDAsIGN1cnJlbnRTb3J0cy5sZW5ndGggLSBzYW1lVGFpbExlbmd0aCk7XHJcbiAgcmV0dXJuICh7c29ydHNUb1J1biwgYWxsU29ydHM6IGN1cnJlbnRTb3J0c30pO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRTdGF0ZSB7IHNvcnRzVG9SdW46IFNvcnRbXSwgYWxsU29ydHM6IFNvcnRbXX1cclxuXHJcbmZ1bmN0aW9uIGFkZEluaXRTb3J0KHNvcnRzOiBTb3J0W10pe1xyXG4gIHJldHVybiBbLi4uc29ydHMsIHthY3RpdmU6IGluaXRJbmRleFN5bWJvbCBhcyB1bmtub3duIGFzIHN0cmluZywgZGlyZWN0aW9uOiAnYXNjJyBhcyBTb3J0RGlyZWN0aW9ufV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNvcnRzUmVtb3ZlZChwcmV2aW91c1NvcnRzOiBTb3J0W10sIGN1cnJlbnRTb3J0czogU29ydFtdKTogYm9vbGVhbntcclxuICBjb25zdCBwcmV2aW91c1NvcnRlZENvbHVtbnMgPSBwcmV2aW91c1NvcnRzLm1hcChzID0+IHMuYWN0aXZlKTtcclxuICBjb25zdCBjdXJyZW50U29ydGVkQ29sdW1ucyA9IGN1cnJlbnRTb3J0cy5tYXAocyA9PiBzLmFjdGl2ZSk7XHJcbiAgY29uc3Qgc29ydHNSZW1vdmVkID0gISFkaWZmZXJlbmNlKHByZXZpb3VzU29ydGVkQ29sdW1ucywgY3VycmVudFNvcnRlZENvbHVtbnMpLmxlbmd0aDtcclxuICByZXR1cm4gc29ydHNSZW1vdmVkO1xyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0U2FtZVRhaWxMZW5ndGgocHJldmlvdXNTb3J0czogU29ydFtdLCBjdXJyZW50U29ydHM6IFNvcnRbXSl7XHJcbiAgcHJldmlvdXNTb3J0cyA9IFsuLi5wcmV2aW91c1NvcnRzXS5yZXZlcnNlKCk7XHJcbiAgY3VycmVudFNvcnRzID0gWy4uLmN1cnJlbnRTb3J0c10ucmV2ZXJzZSgpO1xyXG4gIGxldCBpbmRleE9mQ2hhbmdlID0gY3VycmVudFNvcnRzLmZpbmRJbmRleCgocywgaSkgPT4gcy5hY3RpdmUgIT09IHByZXZpb3VzU29ydHNbaV0/LmFjdGl2ZSB8fCBzLmRpcmVjdGlvbiAhPT0gcHJldmlvdXNTb3J0c1tpXT8uZGlyZWN0aW9uKTtcclxuICBpZihpbmRleE9mQ2hhbmdlID09PSAtMSkgcmV0dXJuIGluZGV4T2ZDaGFuZ2UgPSBjdXJyZW50U29ydHMubGVuZ3RoO1xyXG4gIHJldHVybiBpbmRleE9mQ2hhbmdlO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaW5pdEluZGV4U3ltYm9sID0gU3ltYm9sKCd0Yl9pbml0X2luZGV4Jyk7XHJcblxyXG5leHBvcnQgY29uc3QgaW5pdGlhbFNvcnRTdGF0ZTogU29ydFN0YXRlID0geyBzb3J0c1RvUnVuOiBbXSwgYWxsU29ydHM6IFtdfTsiXX0=
@@ -0,0 +1,305 @@
1
+ import { Component, Input, EventEmitter, Output, ContentChildren, ChangeDetectionStrategy, ViewChild, inject, ContentChild, ElementRef, } from '@angular/core';
2
+ import { BehaviorSubject, from, ReplaySubject, combineLatest, of } from 'rxjs';
3
+ import { FieldType } from '../../interfaces/report-def';
4
+ import { first, last, map, tap, withLatestFrom, mergeAll, scan, switchAll, startWith, timestamp } from 'rxjs/operators';
5
+ import { MatRowDef } from '@angular/material/table';
6
+ import { CustomCellDirective, TableCustomFilterDirective, TableFilterDirective } from '../../directives';
7
+ import { stateIs, TableStore } from '../../classes/table-store';
8
+ import { mapArray, notNull } from '../../../rxjs/rxjs-operators';
9
+ import { ExportToCsvService } from '../../services/export-to-csv.service';
10
+ import { ArrayDefaults } from '../../classes/DefaultSettings';
11
+ import { TableBuilderConfigToken } from '../../classes/TableBuilderConfig';
12
+ import { InitializationState } from '../../classes/TableState';
13
+ import { sortData } from '../../functions/sort-data-function';
14
+ import { WrapperFilterStore } from '../table-container-filter/table-wrapper-filter-store';
15
+ import { cloneDeep } from 'lodash';
16
+ import { defaultShareReplay } from '../../../rxjs';
17
+ import { createFilterFunc, isCustomFilter, isFilterInfo } from '../../classes/filter-info';
18
+ import { TableWrapperDirective } from '../../directives/table-wrapper.directive';
19
+ import { createLinkCreatorDict } from '../../services/link-creator.service';
20
+ import { TableBuilderStateStore } from '../../ngrx/tableBuilderStateStore';
21
+ import { containerImports } from './table-container-imports';
22
+ import { updateFilterInfoState, updateFilterPredicateState, updateFilterState } from './table-container.helpers/filter-state.helpers';
23
+ import { initialSortState, updateSortState } from './table-container.helpers/sort-state.helpers';
24
+ import { getAllGroupHeaderNames, initialGroupByState, updateGroupByState } from './table-container.helpers/groupBy.helpers';
25
+ import { sortAndFilterData } from './table-container.helpers/data-state.helpers';
26
+ import { defaultProps } from './tableProps';
27
+ import { PaginatorComponent } from '../generic-table/paginator.component';
28
+ import { TableBuilderDataSource } from '../../classes/TableBuilderDataSource';
29
+ import { GenericTableComponent } from '../generic-table/generic-table.component';
30
+ import { toSignal } from '@angular/core/rxjs-interop';
31
+ import * as i0 from "@angular/core";
32
+ import * as i1 from "@angular/common";
33
+ import * as i2 from "../generic-table/paginator.component";
34
+ import * as i3 from "@ngrx/component";
35
+ import * as i4 from "../../directives/multi-sort.directive";
36
+ import * as i5 from "../group-by-list/group-by-list.component";
37
+ import * as i6 from "../table-container-filter/filter-list/filter-list.component";
38
+ import * as i7 from "../table-container-filter/gen-filter-displayer/gen-filter-displayer.component";
39
+ import * as i8 from "../gen-col-displayer/gen-col-displayer.component";
40
+ import * as i9 from "../sort-menu/sort-menu.component";
41
+ import * as i10 from "../generic-table/generic-table.component";
42
+ import * as i11 from "../../../utilities/directives/stop-propagation.directive";
43
+ import * as i12 from "../../../utilities/directives/clickEmitterDirective";
44
+ import * as i13 from "../../../utilities/directives/dialog";
45
+ import * as i14 from "@angular/material/button";
46
+ import * as i15 from "@angular/material/menu";
47
+ import * as i16 from "@angular/material/icon";
48
+ import * as i17 from "@angular/material/tooltip";
49
+ import * as i18 from "@angular/material/input";
50
+ import * as i19 from "@angular/material/form-field";
51
+ import * as i20 from "./virtual-scroll-container";
52
+ export class TableContainerComponent {
53
+ constructor() {
54
+ this.props = { ...defaultProps };
55
+ this.selection$ = new EventEmitter();
56
+ this.displayDataSubject = new ReplaySubject(1);
57
+ this.displayData = this.displayDataSubject.pipe(switchAll(), defaultShareReplay());
58
+ this.$displayData = toSignal(this.displayData, { initialValue: [] });
59
+ this.dataSubject = new ReplaySubject(1);
60
+ this.data = this.dataSubject.pipe(switchAll(), defaultShareReplay());
61
+ this.onStateReset = new EventEmitter();
62
+ this.onSaveState = new EventEmitter();
63
+ this.state = inject(TableStore);
64
+ this.state$ = this.state.getSavableState().pipe(map(state => cloneDeep(state)), defaultShareReplay());
65
+ this.collapseFooter$ = this.state.state$.pipe(map(state => state.persistedTableSettings.collapseFooter));
66
+ this.config = inject(TableBuilderConfigToken);
67
+ this.exportToCsvService = inject((ExportToCsvService));
68
+ this.wrapper = inject(TableWrapperDirective, { optional: true });
69
+ this.store = inject(TableBuilderStateStore);
70
+ this._ = this.state.on(this.state.getSavableState().pipe(last()), finalState => {
71
+ if (this.tableId) {
72
+ this.store.setLocalProfile({ key: this.tableId, value: finalState });
73
+ }
74
+ });
75
+ this.customFilters$ = new BehaviorSubject([]);
76
+ this.expandAllGroups = () => {
77
+ const groupHeaders = getAllGroupHeaderNames(this.$displayData());
78
+ this.state.expandAllOfGroup({ groupHeadersByKey: groupHeaders });
79
+ };
80
+ this.collapseAllGroups = () => this.state.collapseAll();
81
+ this.mapMetaDatas = (meta) => {
82
+ if (meta.fieldType === FieldType.Array) {
83
+ const additional = { ...meta.additional };
84
+ additional.arrayStyle = additional?.arrayStyle ?? ArrayDefaults.arrayStyle;
85
+ additional.limit = additional.limit ?? this.config.arrayInfo?.limit ?? ArrayDefaults.limit;
86
+ return { ...meta, additional };
87
+ }
88
+ return meta;
89
+ };
90
+ this.collapseHeader$ = this.state.state$.pipe(map(state => state.persistedTableSettings.collapseHeader));
91
+ this.addFilterDirectives = (state) => {
92
+ let allFilterDirectives = [...this.filterDirectives, ...this.customFilterDirectives];
93
+ if (this.wrapper) {
94
+ allFilterDirectives = [...allFilterDirectives, ...this.wrapper.registrations];
95
+ }
96
+ const customFilters = [];
97
+ allFilterDirectives.filter(f => !f.used).forEach(f => {
98
+ f.used = true;
99
+ if (f.savable) {
100
+ var filter = state.filters[f.filterId];
101
+ if (isFilterInfo(filter)) {
102
+ const filterDirective = f;
103
+ filterDirective.fieldType = filter.fieldType;
104
+ filterDirective.filterType = filter.filterType;
105
+ filterDirective.setFilterValue(filter.filterValue);
106
+ filterDirective.key = filter.key;
107
+ filterDirective.update();
108
+ }
109
+ if (isCustomFilter(filter)) {
110
+ f.active = filter.active ?? false;
111
+ }
112
+ this.state.addFilter(f.filter$);
113
+ }
114
+ else {
115
+ customFilters.push(f);
116
+ }
117
+ });
118
+ const customFilters$ = from(customFilters.map(cf => cf.filter$)).pipe(mergeAll(), scan((a, b) => {
119
+ if (b.active) {
120
+ a[b.filterId] = isCustomFilter(b) ? b.predicate : createFilterFunc(b);
121
+ }
122
+ else {
123
+ delete a[b.filterId];
124
+ }
125
+ return a;
126
+ }, {}), map(f => Object.values(f)));
127
+ this.state.on(customFilters$, (f) => {
128
+ this.customFilters$.next(f);
129
+ });
130
+ };
131
+ }
132
+ set indexColumn(val) {
133
+ this.props.indexColumn = val;
134
+ }
135
+ set selectionColumn(val) {
136
+ this.props.selectionColumn = val;
137
+ }
138
+ clearSelections() {
139
+ this.genericTable?.selection.clear(true);
140
+ }
141
+ set isSticky(val) {
142
+ this.props.isSticky = val;
143
+ }
144
+ set stickyFooter(val) {
145
+ this.props.stickyFooter = val;
146
+ }
147
+ set pageSize(value) {
148
+ this.state.setPageSize(value);
149
+ }
150
+ set groupHeaderTemplate(template) {
151
+ this.props.groupHeaderTemplate = template;
152
+ }
153
+ firstPage() {
154
+ this.paginatorComponent?.paginator?.firstPage();
155
+ }
156
+ lastPage() {
157
+ this.paginatorComponent?.paginator?.lastPage();
158
+ }
159
+ resetState() {
160
+ this.customFilterDirectives.forEach(cf => cf.reset());
161
+ this.filterDirectives.forEach(cf => cf.reset());
162
+ this.state.resetState();
163
+ this.onStateReset.next(null);
164
+ }
165
+ initializeState() {
166
+ this.state.setTableSettings(this.tableBuilder.settings);
167
+ this.state.runOnceWhen(stateIs(InitializationState.MetaDataLoaded), () => {
168
+ if (this.tableId) {
169
+ const persistedState$ = this.store.selectLocalProfileState(this.tableId).pipe(tap(persistedState => {
170
+ if (!persistedState) {
171
+ this.state.setInitializationState(InitializationState.LoadedFromStore);
172
+ }
173
+ }), notNull());
174
+ this.state.updateStateFromPersistedState(persistedState$);
175
+ }
176
+ else {
177
+ this.state.setInitializationState(InitializationState.LoadedFromStore);
178
+ }
179
+ });
180
+ }
181
+ initializeData() {
182
+ const predicateFilters$ = combineLatest([this.inputFilters?.pipe(startWith([])) ?? of([]), this.customFilters$])
183
+ .pipe(map(([a, b]) => [...a, ...b]));
184
+ const filters$ = combineLatest([
185
+ this.state.filters$.pipe(scan(updateFilterInfoState, { allFilters: {} }), timestamp()),
186
+ predicateFilters$.pipe(scan(updateFilterPredicateState, { allFilters: [] }), timestamp())
187
+ ])
188
+ .pipe(map(([filterInfo, pred]) => updateFilterState(filterInfo, pred)));
189
+ const sortsState$ = this.state.sort$.pipe(scan(updateSortState, initialSortState));
190
+ const sortedAndFilteredData$ = sortAndFilterData(this.tableBuilder.getData$(), sortsState$, filters$);
191
+ const flatGrouped$ = combineLatest([sortedAndFilteredData$.pipe(timestamp()), this.state.groupByKeys$.pipe(timestamp()), this.state.expandedGroups$.pipe(timestamp())]).pipe(scan(updateGroupByState, initialGroupByState), map(({ displayData }) => displayData), defaultShareReplay());
192
+ this.displayDataSubject.next(flatGrouped$);
193
+ this.dataSubject.next(sortedAndFilteredData$);
194
+ this.state.on(this.displayData, (data) => {
195
+ this.state.updateState({ dataLen: data.length });
196
+ });
197
+ }
198
+ ngOnInit() {
199
+ const ds = new TableBuilderDataSource(this.displayData, this.state);
200
+ this.state.updateState({ props: {
201
+ dataSource: ds,
202
+ ...this.props
203
+ } });
204
+ this.initializeState();
205
+ this.initializeData();
206
+ if (this.tableId) {
207
+ this.stateKeys$ = this.store.selectLocalProfileKeys(this.tableId);
208
+ this.currentStateKey$ = this.store.selectLocalProfileCurrentKey(this.tableId);
209
+ }
210
+ }
211
+ exportToCsv() {
212
+ const sorted = this.data.pipe(withLatestFrom(this.state.sort$), map(([data, sorted]) => sortData(data, sorted)));
213
+ this.exportToCsvService.exportToCsv(sorted);
214
+ }
215
+ saveState() {
216
+ this.state.getSavableState().pipe(first()).subscribe(tableState => {
217
+ this.onSaveState.next(null);
218
+ this.store.saveLocalProfile({ key: this.tableId, value: tableState, persist: true });
219
+ this.store.setLocalProfile({ key: this.tableId, value: tableState });
220
+ });
221
+ }
222
+ setProfileState(val) {
223
+ this.store.setLocalProfilesState({ key: this.tableId, current: val });
224
+ }
225
+ deleteProfileState(stateKey) {
226
+ this.store.deleteLocalProfile({ key: this.tableId, stateKey });
227
+ }
228
+ ngAfterContentInit() {
229
+ this.initializeColumns();
230
+ this.state.runOnceWhen(stateIs(InitializationState.LoadedFromStore), state => {
231
+ this.addFilterDirectives(state);
232
+ this.state.updateState({ initializationState: InitializationState.Ready });
233
+ });
234
+ }
235
+ initializeColumns() {
236
+ const customCellMap = new Map(this.customCells.map(cc => [cc.customCell, cc]));
237
+ this.state.setMetaData(this.tableBuilder.metaData$.pipe(map((mds) => {
238
+ mds = mds.map(this.mapMetaDatas);
239
+ return [
240
+ ...mds,
241
+ ...this.customCells.map(cc => cc.getMetaData(mds.find(item => item.key === cc.customCell)))
242
+ ];
243
+ })));
244
+ this.state.setLinkMaps(this.tableBuilder.metaData$.pipe(map(createLinkCreatorDict)));
245
+ this.myColumns$ = this.state.metaDataArray$.pipe(mapArray(metaData => ({ metaData, customCell: customCellMap.get(metaData.key) })), defaultShareReplay());
246
+ }
247
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: TableContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
248
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: TableContainerComponent, isStandalone: true, selector: "tb-table-container", inputs: { indexColumn: "indexColumn", selectionColumn: "selectionColumn", isSticky: "isSticky", stickyFooter: "stickyFooter", pageSize: "pageSize", groupHeaderTemplate: "groupHeaderTemplate", tableId: "tableId", tableBuilder: "tableBuilder", trackBy: "trackBy", inputFilters: "inputFilters" }, outputs: { selection$: "selection$", data: "data", onStateReset: "onStateReset", onSaveState: "onSaveState", state$: "state$" }, providers: [TableStore, ExportToCsvService, WrapperFilterStore], queries: [{ propertyName: "tableElRef", first: true, predicate: ["table"], descendants: true, read: ElementRef }, { propertyName: "customFilterDirectives", predicate: TableCustomFilterDirective, descendants: true }, { propertyName: "filterDirectives", predicate: TableFilterDirective, descendants: true }, { propertyName: "customRows", predicate: MatRowDef }, { propertyName: "customCells", predicate: CustomCellDirective }], viewQueries: [{ propertyName: "paginatorComponent", first: true, predicate: PaginatorComponent, descendants: true }, { propertyName: "genericTable", first: true, predicate: GenericTableComponent, descendants: true }], ngImport: i0, template: "<ng-content select=\"[before]\" />\r\n\r\n<ng-container multiSort *ngrxLet=\"state.tableSettings$ as tableSettings\">\r\n <div class=\"header-wrapper\">\r\n <div class=\"title\">\r\n @if ((!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed) {\r\n <ng-content select=\".tb-header-title\"/>\r\n }\r\n @if((state.groupByKeys$ | async)?.length){\r\n <group-by-list />\r\n }\r\n </div>\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader) {\r\n @if (!(collapseHeader$ | async)) {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu'>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"/>\r\n </mat-menu>\r\n }\r\n @else {\r\n <mat-icon color=\"primary\" [matMenuTriggerFor]=\"mainMenu\" class=\"flat-menu-button pointer\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"flex-column\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"/>\r\n </mat-menu>\r\n }\r\n <mat-icon [matTooltip]=\"(collapseHeader$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div>\r\n @if(!!tableSettings.useVirtualScroll) {\r\n <tb-virtual-scroll-container>\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [displayData$]=\"displayData\"\r\n (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]=\"trackBy\"></tb-generic-table>\r\n </tb-virtual-scroll-container>\r\n }\r\n @else {\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [displayData$]=\"displayData\"\r\n (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]=\"trackBy\"></tb-generic-table>\r\n }\r\n @if(tableSettings.usePaginator) {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator [data$]=\"data\" [tableElRef]=\"tableElRef\" />\r\n\r\n <mat-icon [matTooltip]=\"(collapseFooter$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon footer\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n </div>\r\n\r\n\r\n\r\n <ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n </ng-template>\r\n\r\n <ng-template #headerMenuExtra>\r\n <button mat-menu-item (click)=\"resetState()\">\r\n <mat-icon color=\"primary\">autorenew</mat-icon>\r\n <span>Reset table</span>\r\n </button>\r\n @if (!tableSettings.hideExport) {\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon color=\"primary\">file_download</mat-icon>\r\n <span>Export Table</span>\r\n </button>\r\n }\r\n @if (currentStateKey$ | async; as currentKey) {\r\n @if (tableId) {\r\n <button mat-menu-item (click)=\"saveState()\">\r\n <mat-icon color=\"primary\">save</mat-icon>\r\n <span>Save to {{currentKey}}</span>\r\n </button>\r\n <button mat-menu-item [matMenuTriggerFor]=\"savedNames\">\r\n <span>Choose Profile</span>\r\n </button>\r\n }\r\n }\r\n\r\n <mat-menu #savedNames='matMenu' panelClass='wide-menu'>\r\n <button mat-menu-item clickEmitter #add='clickEmitter'>\r\n <mat-icon>add</mat-icon>\r\n <span>New</span>\r\n </button>\r\n @for (key of stateKeys$ | async; track key) {\r\n <button mat-menu-item (click)='setProfileState(key)'>\r\n <span>{{key}}</span>\r\n <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>\r\n </button>\r\n }\r\n </mat-menu>\r\n <ng-container *opDialog='add'>\r\n <mat-form-field>\r\n <input class=\"add-key\" matInput #addedKey />\r\n </mat-form-field>\r\n <button mat-button (click)='setProfileState(addedKey.value); add.next(false);' [disabled]=\"!addedKey.value\">\r\n Add\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n</ng-container>\r\n", styles: [".wide-menu{width:200px!important}.header-wrapper{display:flex;flex-direction:row;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"], dependencies: [{ kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.PaginatorComponent, selector: "tb-paginator", inputs: ["data$", "tableElRef"] }, { kind: "directive", type: i3.LetDirective, selector: "[ngrxLet]", inputs: ["ngrxLet", "ngrxLetSuspenseTpl"] }, { kind: "directive", type: i4.MultiSortDirective, selector: "[multiSort]", inputs: ["matSortDisabled"], exportAs: ["multiSort"] }, { kind: "component", type: i5.GroupByListComponent, selector: "group-by-list" }, { kind: "component", type: i6.FilterChipsComponent, selector: "lib-filter-list" }, { kind: "component", type: i7.GenFilterDisplayerComponent, selector: "tb-filter-displayer" }, { kind: "component", type: i8.GenColDisplayerComponent, selector: "tb-col-displayer" }, { kind: "component", type: i9.SortMenuComponent, selector: "tb-sort-menu" }, { kind: "component", type: i10.GenericTableComponent, selector: "tb-generic-table", inputs: ["trackBy", "displayData$", "data$", "rows", "columnBuilders", "columnInfos"], outputs: ["selection$"] }, { kind: "directive", type: i11.StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "directive", type: i12.ClickEmitterDirective, selector: "[clickEmitter]", exportAs: ["clickEmitter"] }, { kind: "directive", type: i13.DialogDirective, selector: "[opDialog]", inputs: ["opDialogAddDialogClass", "opDialogConfig", "opDialog", "opDialogOrigin"], outputs: ["opDialogClosed"] }, { kind: "ngmodule", type: i14.MatButtonModule }, { kind: "component", type: i14.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i14.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i15.MatMenuModule }, { kind: "component", type: i15.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i15.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i15.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i16.MatIconModule }, { kind: "component", type: i16.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i17.MatTooltipModule }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: i18.MatInputModule }, { kind: "directive", type: i18.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i19.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i20.VirtualScrollContainer, selector: "tb-virtual-scroll-container" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
249
+ }
250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: TableContainerComponent, decorators: [{
251
+ type: Component,
252
+ args: [{ selector: 'tb-table-container', changeDetection: ChangeDetectionStrategy.OnPush, providers: [TableStore, ExportToCsvService, WrapperFilterStore], standalone: true, imports: containerImports, template: "<ng-content select=\"[before]\" />\r\n\r\n<ng-container multiSort *ngrxLet=\"state.tableSettings$ as tableSettings\">\r\n <div class=\"header-wrapper\">\r\n <div class=\"title\">\r\n @if ((!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed) {\r\n <ng-content select=\".tb-header-title\"/>\r\n }\r\n @if((state.groupByKeys$ | async)?.length){\r\n <group-by-list />\r\n }\r\n </div>\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader) {\r\n @if (!(collapseHeader$ | async)) {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu'>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"/>\r\n </mat-menu>\r\n }\r\n @else {\r\n <mat-icon color=\"primary\" [matMenuTriggerFor]=\"mainMenu\" class=\"flat-menu-button pointer\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"flex-column\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"/>\r\n </mat-menu>\r\n }\r\n <mat-icon [matTooltip]=\"(collapseHeader$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div>\r\n @if(!!tableSettings.useVirtualScroll) {\r\n <tb-virtual-scroll-container>\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [displayData$]=\"displayData\"\r\n (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]=\"trackBy\"></tb-generic-table>\r\n </tb-virtual-scroll-container>\r\n }\r\n @else {\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [displayData$]=\"displayData\"\r\n (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]=\"trackBy\"></tb-generic-table>\r\n }\r\n @if(tableSettings.usePaginator) {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator [data$]=\"data\" [tableElRef]=\"tableElRef\" />\r\n\r\n <mat-icon [matTooltip]=\"(collapseFooter$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon footer\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n </div>\r\n\r\n\r\n\r\n <ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n </ng-template>\r\n\r\n <ng-template #headerMenuExtra>\r\n <button mat-menu-item (click)=\"resetState()\">\r\n <mat-icon color=\"primary\">autorenew</mat-icon>\r\n <span>Reset table</span>\r\n </button>\r\n @if (!tableSettings.hideExport) {\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon color=\"primary\">file_download</mat-icon>\r\n <span>Export Table</span>\r\n </button>\r\n }\r\n @if (currentStateKey$ | async; as currentKey) {\r\n @if (tableId) {\r\n <button mat-menu-item (click)=\"saveState()\">\r\n <mat-icon color=\"primary\">save</mat-icon>\r\n <span>Save to {{currentKey}}</span>\r\n </button>\r\n <button mat-menu-item [matMenuTriggerFor]=\"savedNames\">\r\n <span>Choose Profile</span>\r\n </button>\r\n }\r\n }\r\n\r\n <mat-menu #savedNames='matMenu' panelClass='wide-menu'>\r\n <button mat-menu-item clickEmitter #add='clickEmitter'>\r\n <mat-icon>add</mat-icon>\r\n <span>New</span>\r\n </button>\r\n @for (key of stateKeys$ | async; track key) {\r\n <button mat-menu-item (click)='setProfileState(key)'>\r\n <span>{{key}}</span>\r\n <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>\r\n </button>\r\n }\r\n </mat-menu>\r\n <ng-container *opDialog='add'>\r\n <mat-form-field>\r\n <input class=\"add-key\" matInput #addedKey />\r\n </mat-form-field>\r\n <button mat-button (click)='setProfileState(addedKey.value); add.next(false);' [disabled]=\"!addedKey.value\">\r\n Add\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n</ng-container>\r\n", styles: [".wide-menu{width:200px!important}.header-wrapper{display:flex;flex-direction:row;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"] }]
253
+ }], propDecorators: { paginatorComponent: [{
254
+ type: ViewChild,
255
+ args: [PaginatorComponent]
256
+ }], genericTable: [{
257
+ type: ViewChild,
258
+ args: [GenericTableComponent]
259
+ }], indexColumn: [{
260
+ type: Input
261
+ }], selectionColumn: [{
262
+ type: Input
263
+ }], isSticky: [{
264
+ type: Input
265
+ }], stickyFooter: [{
266
+ type: Input
267
+ }], pageSize: [{
268
+ type: Input
269
+ }], groupHeaderTemplate: [{
270
+ type: Input
271
+ }], customFilterDirectives: [{
272
+ type: ContentChildren,
273
+ args: [TableCustomFilterDirective, { descendants: true }]
274
+ }], filterDirectives: [{
275
+ type: ContentChildren,
276
+ args: [TableFilterDirective, { descendants: true }]
277
+ }], customRows: [{
278
+ type: ContentChildren,
279
+ args: [MatRowDef]
280
+ }], customCells: [{
281
+ type: ContentChildren,
282
+ args: [CustomCellDirective]
283
+ }], tableElRef: [{
284
+ type: ContentChild,
285
+ args: ['table', { read: ElementRef }]
286
+ }], tableId: [{
287
+ type: Input
288
+ }], tableBuilder: [{
289
+ type: Input
290
+ }], trackBy: [{
291
+ type: Input
292
+ }], inputFilters: [{
293
+ type: Input
294
+ }], selection$: [{
295
+ type: Output
296
+ }], data: [{
297
+ type: Output
298
+ }], onStateReset: [{
299
+ type: Output
300
+ }], onSaveState: [{
301
+ type: Output
302
+ }], state$: [{
303
+ type: Output
304
+ }] } });
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBRWYsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxNQUFNLEVBRU4sWUFBWSxFQUNaLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFjLElBQUksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRixPQUFPLEVBQW1CLFNBQVMsRUFBWSxNQUFNLDZCQUE2QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4SCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekcsT0FBTyxFQUFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDMUYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVuQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUzRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN0SSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDakcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDNUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDakYsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZbkQsTUFBTSxPQUFPLHVCQUF1QjtJQVR2QztRQVlFLFVBQUssR0FBZSxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFtQzlCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLHVCQUFrQixHQUFHLElBQUksYUFBYSxDQUFrQixDQUFDLENBQUMsQ0FBQztRQUMzRCxnQkFBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQ3hDLFNBQVMsRUFBRSxFQUNYLGtCQUFrQixFQUFFLENBQ3JCLENBQUM7UUFDRixpQkFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEUsZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBa0IsQ0FBQyxDQUFDLENBQUM7UUFDMUMsU0FBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNwQyxTQUFTLEVBQUUsRUFDWCxrQkFBa0IsRUFBRSxDQUNyQixDQUFDO1FBQ1EsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxVQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pCLFdBQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FDbEQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQzlCLGtCQUFrQixFQUFFLENBQ3JCLENBQUM7UUFFRixvQkFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQU1wRyxXQUFNLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDekMsdUJBQWtCLEdBQUcsTUFBTSxDQUFDLENBQUEsa0JBQXFCLENBQUEsQ0FBQyxDQUFDO1FBQ25ELFlBQU8sR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RCxVQUFLLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdkMsTUFBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDekUsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUMsR0FBRyxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBc0NILG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBMkV6RCxvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixNQUFNLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUE7UUFFRCxzQkFBaUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBaUNuRCxpQkFBWSxHQUFHLENBQUMsSUFBa0IsRUFBRSxFQUFFO1lBQ3BDLElBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFDLENBQUM7Z0JBQ3JDLE1BQU0sVUFBVSxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFvQixDQUFDO2dCQUMzRCxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQztnQkFDM0UsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUMzRixPQUFPLEVBQUMsR0FBRyxJQUFJLEVBQUMsVUFBVSxFQUFDLENBQUE7WUFDN0IsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFBO1FBRUQsb0JBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFcEcsd0JBQW1CLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7WUFDMUMsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDckYsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2hCLG1CQUFtQixHQUFHLENBQUMsR0FBRyxtQkFBbUIsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUVELE1BQU0sYUFBYSxHQUEyRCxFQUFFLENBQUM7WUFFakYsbUJBQW1CLENBQUMsTUFBTSxDQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNyRCxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDZCxJQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDYixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdkMsSUFBRyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxlQUFlLEdBQXlCLENBQXlCLENBQUM7d0JBQ3hFLGVBQWUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzt3QkFDN0MsZUFBZSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO3dCQUMvQyxlQUFlLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDbkQsZUFBZSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO3dCQUNqQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQzNCLENBQUM7b0JBQ0QsSUFBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDMUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQztvQkFDcEMsQ0FBQztvQkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBRSxDQUFDLENBQUMsT0FBZSxDQUFDLENBQUM7Z0JBQzNDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLGNBQWMsR0FBSSxJQUFJLENBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUcsQ0FBQyxDQUFDLElBQUksQ0FDeEUsUUFBUSxFQUFFLEVBQ1YsSUFBSSxDQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxFQUFFO2dCQUNULElBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNaLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBRTtnQkFDeEIsQ0FBQztnQkFDTCxPQUFPLENBQUMsQ0FBQztZQUNULENBQUMsRUFBRSxFQUFnQyxDQUFDLEVBQ3BDLEdBQUcsQ0FBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQTtLQUNGO0lBcFJDLElBQWEsV0FBVyxDQUFDLEdBQVk7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQy9CLENBQUM7SUFDRCxJQUFhLGVBQWUsQ0FBQyxHQUFZO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBYSxRQUFRLENBQUMsR0FBWTtRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7SUFDNUIsQ0FBQztJQUNELElBQWEsWUFBWSxDQUFDLEdBQVk7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFhLFFBQVEsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFhLG1CQUFtQixDQUFFLFFBQTBCO1FBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO0lBQzVDLENBQUM7SUFtREQsU0FBUztRQUNSLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELFFBQVE7UUFDUCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUNwQixPQUFPLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLEVBQzNDLEdBQUcsRUFBRTtZQUNILElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNoQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzNFLEdBQUcsQ0FBRSxjQUFjLENBQUMsRUFBRTtvQkFDcEIsSUFBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUN6RSxDQUFDO2dCQUNILENBQUMsQ0FBQyxFQUNGLE9BQU8sRUFBRSxDQUNWLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN6RSxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztRQUVaLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQW9CLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDL0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDdEYsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFDLFVBQVUsRUFBRSxFQUFvQixFQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUMxRyxDQUFDO2FBQ0QsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDakUsQ0FBQztRQUVGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUVuRixNQUFNLHNCQUFzQixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXRHLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxtQkFBbUIsQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFDbkMsa0JBQWtCLEVBQUUsQ0FDckIsQ0FBQztRQUVGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsUUFBUTtRQUNOLE1BQU0sRUFBRSxHQUFHLElBQUksc0JBQXNCLENBQ25DLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUMsS0FBSyxFQUFFO2dCQUM3QixVQUFVLEVBQUUsRUFBRTtnQkFDZCxHQUFHLElBQUksQ0FBQyxLQUFLO2FBQ2QsRUFBQyxDQUFDLENBQUE7UUFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hGLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUMzQixjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDaEQsQ0FBQztRQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FDL0IsS0FBSyxFQUFFLENBQ1IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFFLENBQUM7WUFDcEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsVUFBVSxFQUFFLENBQUUsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBVztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQUMsR0FBRyxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGtCQUFrQixDQUFDLFFBQWdCO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBQyxHQUFHLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFTRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQ3BCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsRUFDNUMsS0FBSyxDQUFDLEVBQUU7WUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVUsQ0FBQyxJQUFJLENBQ3RELEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ1YsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pDLE9BQU87Z0JBQ0wsR0FBRyxHQUFHO2dCQUNOLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUUsQ0FBQyxDQUFFO2FBQ2hHLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVUsQ0FBQyxJQUFJLENBQ3RELEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUMzQixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDOUMsUUFBUSxDQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQ2pGLGtCQUFrQixFQUFFLENBQ3JCLENBQUM7SUFDSixDQUFDOzhHQTlOYSx1QkFBdUI7a0dBQXZCLHVCQUF1Qix3ZUFKMUIsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsc0dBb0NqQyxVQUFVLHlEQUp2QiwwQkFBMEIsc0VBQzFCLG9CQUFvQixnRUFDcEIsU0FBUyw4Q0FDVCxtQkFBbUIsaUZBOUJ6QixrQkFBa0IsK0VBQ2xCLHFCQUFxQixnREM1RGxDLDhwSkFxSEE7OzJGRDNEZ0IsdUJBQXVCO2tCQVR0QyxTQUFTOytCQUNFLG9CQUFvQixtQkFHYix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLGNBQ25ELElBQUksV0FDUCxnQkFBZ0I7OEJBR08sa0JBQWtCO3NCQUFqRCxTQUFTO3VCQUFDLGtCQUFrQjtnQkFDTSxZQUFZO3NCQUE5QyxTQUFTO3VCQUFDLHFCQUFxQjtnQkFHbkIsV0FBVztzQkFBdkIsS0FBSztnQkFHTyxlQUFlO3NCQUEzQixLQUFLO2dCQU1PLFFBQVE7c0JBQXBCLEtBQUs7Z0JBR08sWUFBWTtzQkFBeEIsS0FBSztnQkFHTyxRQUFRO3NCQUFwQixLQUFLO2dCQUdPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFLNEQsc0JBQXNCO3NCQUF2RixlQUFlO3VCQUFDLDBCQUEwQixFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQztnQkFDSixnQkFBZ0I7c0JBQTNFLGVBQWU7dUJBQUMsb0JBQW9CLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDO2dCQUM5QixVQUFVO3NCQUFyQyxlQUFlO3VCQUFDLFNBQVM7Z0JBQ1ksV0FBVztzQkFBaEQsZUFBZTt1QkFBQyxtQkFBbUI7Z0JBQ08sVUFBVTtzQkFBcEQsWUFBWTt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDO2dCQUNoQyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNO2dCQVNHLElBQUk7c0JBQWIsTUFBTTtnQkFJRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIE91dHB1dCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIFByZWRpY2F0ZSxcclxuICBWaWV3Q2hpbGQsXHJcbiAgaW5qZWN0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGZyb20sIFJlcGxheVN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEFycmF5QWRkaXRpb25hbCwgRmllbGRUeXBlLCBNZXRhRGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWRlZic7XHJcbmltcG9ydCB7IGZpcnN0LCBsYXN0LCBtYXAsIHRhcCwgd2l0aExhdGVzdEZyb20sIG1lcmdlQWxsLCBzY2FuLCBzd2l0Y2hBbGwsIHN0YXJ0V2l0aCwgdGltZXN0YW1wIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUYWJsZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLWJ1aWxkZXInO1xyXG5pbXBvcnQgeyBNYXRSb3dEZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEN1c3RvbUNlbGxEaXJlY3RpdmUsIFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlLCBUYWJsZUZpbHRlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMnO1xyXG5pbXBvcnQgeyAgc3RhdGVJcywgVGFibGVTdG9yZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvdGFibGUtc3RvcmUnO1xyXG5pbXBvcnQgeyBtYXBBcnJheSwgbm90TnVsbCB9IGZyb20gJy4uLy4uLy4uL3J4anMvcnhqcy1vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBFeHBvcnRUb0NzdlNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leHBvcnQtdG8tY3N2LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcnJheURlZmF1bHRzIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9EZWZhdWx0U2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBUYWJsZUJ1aWxkZXJDb25maWdUb2tlbiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGFibGVCdWlsZGVyQ29uZmlnJztcclxuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TdGF0ZSwgVGFibGVTdGF0ZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGFibGVTdGF0ZSc7XHJcbmltcG9ydCB7IHNvcnREYXRhIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL3NvcnQtZGF0YS1mdW5jdGlvbic7XHJcbmltcG9ydCB7IFdyYXBwZXJGaWx0ZXJTdG9yZSB9IGZyb20gJy4uL3RhYmxlLWNvbnRhaW5lci1maWx0ZXIvdGFibGUtd3JhcHBlci1maWx0ZXItc3RvcmUnO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Db2x1bW5JbmZvJztcclxuaW1wb3J0IHsgZGVmYXVsdFNoYXJlUmVwbGF5IH0gZnJvbSAnLi4vLi4vLi4vcnhqcyc7XHJcbmltcG9ydCB7IGNyZWF0ZUZpbHRlckZ1bmMsIGlzQ3VzdG9tRmlsdGVyLCBpc0ZpbHRlckluZm8gfSBmcm9tICcuLi8uLi9jbGFzc2VzL2ZpbHRlci1pbmZvJztcclxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGljdGlvbmFyeSc7XHJcbmltcG9ydCB7IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdGFibGUtd3JhcHBlci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBjcmVhdGVMaW5rQ3JlYXRvckRpY3QgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9saW5rLWNyZWF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlQnVpbGRlclN0YXRlU3RvcmUgfSBmcm9tICcuLi8uLi9uZ3J4L3RhYmxlQnVpbGRlclN0YXRlU3RvcmUnO1xyXG5pbXBvcnQgeyBjb250YWluZXJJbXBvcnRzIH0gZnJvbSAnLi90YWJsZS1jb250YWluZXItaW1wb3J0cyc7XHJcbmltcG9ydCB7IHVwZGF0ZUZpbHRlckluZm9TdGF0ZSwgdXBkYXRlRmlsdGVyUHJlZGljYXRlU3RhdGUsIHVwZGF0ZUZpbHRlclN0YXRlIH0gZnJvbSAnLi90YWJsZS1jb250YWluZXIuaGVscGVycy9maWx0ZXItc3RhdGUuaGVscGVycyc7XHJcbmltcG9ydCB7IGluaXRpYWxTb3J0U3RhdGUsIHVwZGF0ZVNvcnRTdGF0ZSB9IGZyb20gJy4vdGFibGUtY29udGFpbmVyLmhlbHBlcnMvc29ydC1zdGF0ZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgZ2V0QWxsR3JvdXBIZWFkZXJOYW1lcywgaW5pdGlhbEdyb3VwQnlTdGF0ZSwgdXBkYXRlR3JvdXBCeVN0YXRlIH0gZnJvbSAnLi90YWJsZS1jb250YWluZXIuaGVscGVycy9ncm91cEJ5LmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBzb3J0QW5kRmlsdGVyRGF0YSB9IGZyb20gJy4vdGFibGUtY29udGFpbmVyLmhlbHBlcnMvZGF0YS1zdGF0ZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgVGFibGVQcm9wcywgZGVmYXVsdFByb3BzIH0gZnJvbSAnLi90YWJsZVByb3BzJztcclxuaW1wb3J0IHsgUGFnaW5hdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VuZXJpYy10YWJsZS9wYWdpbmF0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVCdWlsZGVyRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGFibGVCdWlsZGVyRGF0YVNvdXJjZSc7XHJcbmltcG9ydCB7IEdlbmVyaWNUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RiLXRhYmxlLWNvbnRhaW5lcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWNvbnRhaW5lci5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1jb250YWluZXIuY3NzJywnLi4vLi4vc3R5bGVzL2NvbGxhcHNlci5zdHlsZXMuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1RhYmxlU3RvcmUsIEV4cG9ydFRvQ3N2U2VydmljZSwgV3JhcHBlckZpbHRlclN0b3JlXSxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IGNvbnRhaW5lckltcG9ydHMsXHJcblxyXG59KSBleHBvcnQgY2xhc3MgVGFibGVDb250YWluZXJDb21wb25lbnQ8VCA9IGFueT4ge1xyXG4gIEBWaWV3Q2hpbGQoUGFnaW5hdG9yQ29tcG9uZW50KSAgcGFnaW5hdG9yQ29tcG9uZW50PzogUGFnaW5hdG9yQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoR2VuZXJpY1RhYmxlQ29tcG9uZW50KSAgZ2VuZXJpY1RhYmxlPzogR2VuZXJpY1RhYmxlQ29tcG9uZW50O1xyXG4gIHByb3BzOiBUYWJsZVByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMgfTtcclxuXHJcbiAgQElucHV0KCkgc2V0IGluZGV4Q29sdW1uKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcm9wcy5pbmRleENvbHVtbiA9IHZhbDtcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbkNvbHVtbih2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJvcHMuc2VsZWN0aW9uQ29sdW1uID0gdmFsO1xyXG4gIH1cclxuICBjbGVhclNlbGVjdGlvbnMoKXtcclxuICAgIHRoaXMuZ2VuZXJpY1RhYmxlPy5zZWxlY3Rpb24uY2xlYXIodHJ1ZSk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBpc1N0aWNreSh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJvcHMuaXNTdGlja3kgPSB2YWw7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBzdGlja3lGb290ZXIodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByb3BzLnN0aWNreUZvb3RlciA9IHZhbDtcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc3RhdGUuc2V0UGFnZVNpemUodmFsdWUpO1xyXG4gIH1cclxuICBASW5wdXQoKSBzZXQgZ3JvdXBIZWFkZXJUZW1wbGF0ZSggdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgIHRoaXMucHJvcHMuZ3JvdXBIZWFkZXJUZW1wbGF0ZSA9IHRlbXBsYXRlO1xyXG4gIH1cclxuXHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIGN1c3RvbUZpbHRlckRpcmVjdGl2ZXMhOiBRdWVyeUxpc3Q8VGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmU+O1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFibGVGaWx0ZXJEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIGZpbHRlckRpcmVjdGl2ZXMhOiBRdWVyeUxpc3Q8VGFibGVGaWx0ZXJEaXJlY3RpdmU+O1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0Um93RGVmKSBjdXN0b21Sb3dzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxhbnk+PjtcclxuICBAQ29udGVudENoaWxkcmVuKEN1c3RvbUNlbGxEaXJlY3RpdmUpIGN1c3RvbUNlbGxzITogUXVlcnlMaXN0PEN1c3RvbUNlbGxEaXJlY3RpdmU+O1xyXG4gIEBDb250ZW50Q2hpbGQoJ3RhYmxlJywge3JlYWQ6IEVsZW1lbnRSZWZ9KSB0YWJsZUVsUmVmITogRWxlbWVudFJlZjtcclxuICBASW5wdXQoKSB0YWJsZUlkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHRhYmxlQnVpbGRlciE6IFRhYmxlQnVpbGRlcjtcclxuICBASW5wdXQoKSB0cmFja0J5ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlucHV0RmlsdGVycz86IE9ic2VydmFibGU8QXJyYXk8UHJlZGljYXRlPFQ+Pj47XHJcblxyXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb24kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIGRpc3BsYXlEYXRhU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PE9ic2VydmFibGU8VFtdPj4oMSk7XHJcbiAgZGlzcGxheURhdGEgPSB0aGlzLmRpc3BsYXlEYXRhU3ViamVjdC5waXBlKFxyXG4gICAgc3dpdGNoQWxsKCksXHJcbiAgICBkZWZhdWx0U2hhcmVSZXBsYXkoKSxcclxuICApO1xyXG4gICRkaXNwbGF5RGF0YSA9IHRvU2lnbmFsKHRoaXMuZGlzcGxheURhdGEsIHsgaW5pdGlhbFZhbHVlOiBbXSB9KTtcclxuXHJcbiAgZGF0YVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxPYnNlcnZhYmxlPFRbXT4+KDEpO1xyXG4gIEBPdXRwdXQoKSBkYXRhID0gdGhpcy5kYXRhU3ViamVjdC5waXBlKFxyXG4gICAgc3dpdGNoQWxsKCksXHJcbiAgICBkZWZhdWx0U2hhcmVSZXBsYXkoKSxcclxuICApO1xyXG4gIEBPdXRwdXQoKSBvblN0YXRlUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uU2F2ZVN0YXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIHN0YXRlID0gaW5qZWN0KFRhYmxlU3RvcmUpO1xyXG4gIEBPdXRwdXQoKSBzdGF0ZSQgPSB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUoXHJcbiAgICBtYXAoc3RhdGUgPT4gY2xvbmVEZWVwKHN0YXRlKSksXHJcbiAgICBkZWZhdWx0U2hhcmVSZXBsYXkoKSxcclxuICApO1xyXG5cclxuICBjb2xsYXBzZUZvb3RlciQgPSB0aGlzLnN0YXRlLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5wZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmNvbGxhcHNlRm9vdGVyKSk7XHJcblxyXG4gIG15Q29sdW1ucyQhOiBPYnNlcnZhYmxlPENvbHVtbkluZm9bXT47XHJcbiAgc3RhdGVLZXlzJD86IE9ic2VydmFibGU8c3RyaW5nW10gfCBudWxsPjtcclxuICBjdXJyZW50U3RhdGVLZXkkPzogT2JzZXJ2YWJsZTxzdHJpbmc+O1xyXG5cclxuICBjb25maWcgPSBpbmplY3QoVGFibGVCdWlsZGVyQ29uZmlnVG9rZW4pO1xyXG4gIGV4cG9ydFRvQ3N2U2VydmljZSA9IGluamVjdChFeHBvcnRUb0NzdlNlcnZpY2U8VD4pO1xyXG4gIHdyYXBwZXIgPSBpbmplY3QoVGFibGVXcmFwcGVyRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG4gIHN0b3JlID0gaW5qZWN0KFRhYmxlQnVpbGRlclN0YXRlU3RvcmUpO1xyXG4gIF8gPSB0aGlzLnN0YXRlLm9uKCB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUobGFzdCgpKSwgZmluYWxTdGF0ZSA9PiB7XHJcbiAgICBpZih0aGlzLnRhYmxlSWQpIHtcclxuICAgICAgdGhpcy5zdG9yZS5zZXRMb2NhbFByb2ZpbGUoe2tleTp0aGlzLnRhYmxlSWQsdmFsdWU6IGZpbmFsU3RhdGV9KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcblxyXG4gIGZpcnN0UGFnZSgpOiB2b2lkIHtcclxuICAgdGhpcy5wYWdpbmF0b3JDb21wb25lbnQ/LnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XHJcbiAgfVxyXG5cclxuICBsYXN0UGFnZSgpOiB2b2lkIHtcclxuICAgdGhpcy5wYWdpbmF0b3JDb21wb25lbnQ/LnBhZ2luYXRvcj8ubGFzdFBhZ2UoKTtcclxuICB9XHJcblxyXG4gIHJlc2V0U3RhdGUoKSB7XHJcbiAgICB0aGlzLmN1c3RvbUZpbHRlckRpcmVjdGl2ZXMuZm9yRWFjaCggY2YgPT4gY2YucmVzZXQoKSk7XHJcbiAgICB0aGlzLmZpbHRlckRpcmVjdGl2ZXMuZm9yRWFjaCggY2YgPT4gY2YucmVzZXQoKSApO1xyXG4gICAgdGhpcy5zdGF0ZS5yZXNldFN0YXRlKCk7XHJcbiAgICB0aGlzLm9uU3RhdGVSZXNldC5uZXh0KG51bGwpXHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplU3RhdGUoKSB7XHJcbiAgICB0aGlzLnN0YXRlLnNldFRhYmxlU2V0dGluZ3ModGhpcy50YWJsZUJ1aWxkZXIuc2V0dGluZ3MpO1xyXG4gICAgdGhpcy5zdGF0ZS5ydW5PbmNlV2hlbihcclxuICAgICAgc3RhdGVJcyhJbml0aWFsaXphdGlvblN0YXRlLk1ldGFEYXRhTG9hZGVkKSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIGlmKHRoaXMudGFibGVJZCkge1xyXG4gICAgICAgICAgY29uc3QgcGVyc2lzdGVkU3RhdGUkID0gdGhpcy5zdG9yZS5zZWxlY3RMb2NhbFByb2ZpbGVTdGF0ZSh0aGlzLnRhYmxlSWQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcCggcGVyc2lzdGVkU3RhdGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKCFwZXJzaXN0ZWRTdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbml0aWFsaXphdGlvblN0YXRlKEluaXRpYWxpemF0aW9uU3RhdGUuTG9hZGVkRnJvbVN0b3JlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBub3ROdWxsKCksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZUZyb21QZXJzaXN0ZWRTdGF0ZShwZXJzaXN0ZWRTdGF0ZSQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXRlLnNldEluaXRpYWxpemF0aW9uU3RhdGUoSW5pdGlhbGl6YXRpb25TdGF0ZS5Mb2FkZWRGcm9tU3RvcmUpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBjdXN0b21GaWx0ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJlZGljYXRlPFQ+W10+KFtdKTtcclxuICBpbml0aWFsaXplRGF0YSgpIHtcclxuXHJcbiAgICBjb25zdCBwcmVkaWNhdGVGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaW5wdXRGaWx0ZXJzPy5waXBlKHN0YXJ0V2l0aChbXSkpID8/IG9mKFtdIGFzIFByZWRpY2F0ZTxUPltdKSwgdGhpcy5jdXN0b21GaWx0ZXJzJF0pXHJcbiAgICAgIC5waXBlKG1hcCgoW2EsIGJdKSA9PiBbLi4uYSwgLi4uYl0pKTtcclxuICAgIFxyXG4gICAgY29uc3QgZmlsdGVycyQgPSBjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgdGhpcy5zdGF0ZS5maWx0ZXJzJC5waXBlKHNjYW4odXBkYXRlRmlsdGVySW5mb1N0YXRlLCB7IGFsbEZpbHRlcnM6IHt9IH0pLCB0aW1lc3RhbXAoKSksXHJcbiAgICAgIHByZWRpY2F0ZUZpbHRlcnMkLnBpcGUoc2Nhbih1cGRhdGVGaWx0ZXJQcmVkaWNhdGVTdGF0ZSwge2FsbEZpbHRlcnM6IFtdIGFzIFByZWRpY2F0ZTxUPltdfSksIHRpbWVzdGFtcCgpKVxyXG4gICAgXSlcclxuICAgIC5waXBlKFxyXG4gICAgICBtYXAoKFtmaWx0ZXJJbmZvLCBwcmVkXSkgPT4gdXBkYXRlRmlsdGVyU3RhdGUoZmlsdGVySW5mbywgcHJlZCkpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHNvcnRzU3RhdGUkID0gdGhpcy5zdGF0ZS5zb3J0JC5waXBlKHNjYW4odXBkYXRlU29ydFN0YXRlLCBpbml0aWFsU29ydFN0YXRlKSk7XHJcbiAgICBcclxuICAgIGNvbnN0IHNvcnRlZEFuZEZpbHRlcmVkRGF0YSQgPSBzb3J0QW5kRmlsdGVyRGF0YSh0aGlzLnRhYmxlQnVpbGRlci5nZXREYXRhJCgpLCBzb3J0c1N0YXRlJCwgZmlsdGVycyQpO1xyXG4gICAgXHJcbiAgICBjb25zdCBmbGF0R3JvdXBlZCQgPSBjb21iaW5lTGF0ZXN0KFtzb3J0ZWRBbmRGaWx0ZXJlZERhdGEkLnBpcGUodGltZXN0YW1wKCkpLCB0aGlzLnN0YXRlLmdyb3VwQnlLZXlzJC5waXBlKHRpbWVzdGFtcCgpKSwgdGhpcy5zdGF0ZS5leHBhbmRlZEdyb3VwcyQucGlwZSh0aW1lc3RhbXAoKSldKS5waXBlKFxyXG4gICAgICBzY2FuKHVwZGF0ZUdyb3VwQnlTdGF0ZSwgaW5pdGlhbEdyb3VwQnlTdGF0ZSksXHJcbiAgICAgIG1hcCgoe2Rpc3BsYXlEYXRhfSkgPT4gZGlzcGxheURhdGEpLFxyXG4gICAgICBkZWZhdWx0U2hhcmVSZXBsYXkoKSxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5RGF0YVN1YmplY3QubmV4dChmbGF0R3JvdXBlZCQpO1xyXG4gICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KHNvcnRlZEFuZEZpbHRlcmVkRGF0YSQpO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5kaXNwbGF5RGF0YSwgKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZSh7ZGF0YUxlbjogZGF0YS5sZW5ndGh9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc3QgZHMgPSBuZXcgVGFibGVCdWlsZGVyRGF0YVNvdXJjZTxUPihcclxuICAgICAgdGhpcy5kaXNwbGF5RGF0YSxcclxuICAgICAgdGhpcy5zdGF0ZSxcclxuICAgICk7XHJcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZVN0YXRlKHtwcm9wczoge1xyXG4gICAgICBkYXRhU291cmNlOiBkcyxcclxuICAgICAgLi4udGhpcy5wcm9wc1xyXG4gICAgfX0pXHJcbiAgICB0aGlzLmluaXRpYWxpemVTdGF0ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplRGF0YSgpO1xyXG5cclxuICAgIGlmKHRoaXMudGFibGVJZCkge1xyXG4gICAgICB0aGlzLnN0YXRlS2V5cyQgPSB0aGlzLnN0b3JlLnNlbGVjdExvY2FsUHJvZmlsZUtleXModGhpcy50YWJsZUlkKTtcclxuICAgICAgdGhpcy5jdXJyZW50U3RhdGVLZXkkID0gdGhpcy5zdG9yZS5zZWxlY3RMb2NhbFByb2ZpbGVDdXJyZW50S2V5KHRoaXMudGFibGVJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb0NzdigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNvcnRlZCA9IHRoaXMuZGF0YS5waXBlKFxyXG4gICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0YXRlLnNvcnQkKSxcclxuICAgICAgbWFwKChbZGF0YSwgc29ydGVkXSkgPT4gc29ydERhdGEoZGF0YSwgc29ydGVkKSlcclxuICAgICk7XHJcbiAgICB0aGlzLmV4cG9ydFRvQ3N2U2VydmljZS5leHBvcnRUb0Nzdihzb3J0ZWQpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVN0YXRlKCkge1xyXG4gICAgdGhpcy5zdGF0ZS5nZXRTYXZhYmxlU3RhdGUoKS5waXBlKFxyXG4gICAgICBmaXJzdCgpXHJcbiAgICApLnN1YnNjcmliZSh0YWJsZVN0YXRlID0+IHtcclxuICAgICAgdGhpcy5vblNhdmVTdGF0ZS5uZXh0KG51bGwpO1xyXG4gICAgICB0aGlzLnN0b3JlLnNhdmVMb2NhbFByb2ZpbGUoeyBrZXk6IHRoaXMudGFibGVJZCwgdmFsdWU6dGFibGVTdGF0ZSwgcGVyc2lzdDogdHJ1ZX0gKTtcclxuICAgICAgdGhpcy5zdG9yZS5zZXRMb2NhbFByb2ZpbGUoeyBrZXk6IHRoaXMudGFibGVJZCwgdmFsdWU6dGFibGVTdGF0ZSB9ICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFByb2ZpbGVTdGF0ZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdG9yZS5zZXRMb2NhbFByb2ZpbGVzU3RhdGUoe2tleTp0aGlzLnRhYmxlSWQsIGN1cnJlbnQ6IHZhbH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlUHJvZmlsZVN0YXRlKHN0YXRlS2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3RvcmUuZGVsZXRlTG9jYWxQcm9maWxlKHtrZXk6dGhpcy50YWJsZUlkLCBzdGF0ZUtleX0pO1xyXG4gIH1cclxuXHJcbiAgZXhwYW5kQWxsR3JvdXBzID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZ3JvdXBIZWFkZXJzID0gZ2V0QWxsR3JvdXBIZWFkZXJOYW1lcyh0aGlzLiRkaXNwbGF5RGF0YSgpKTtcclxuICAgIHRoaXMuc3RhdGUuZXhwYW5kQWxsT2ZHcm91cCh7IGdyb3VwSGVhZGVyc0J5S2V5OiBncm91cEhlYWRlcnMgfSk7XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZUFsbEdyb3VwcyA9ICgpID0+IHRoaXMuc3RhdGUuY29sbGFwc2VBbGwoKTtcclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplQ29sdW1ucygpO1xyXG4gICAgdGhpcy5zdGF0ZS5ydW5PbmNlV2hlbihcclxuICAgICAgc3RhdGVJcyhJbml0aWFsaXphdGlvblN0YXRlLkxvYWRlZEZyb21TdG9yZSksXHJcbiAgICAgIHN0YXRlID0+IHtcclxuICAgICAgICB0aGlzLmFkZEZpbHRlckRpcmVjdGl2ZXMoc3RhdGUpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlU3RhdGUoe2luaXRpYWxpemF0aW9uU3RhdGU6IEluaXRpYWxpemF0aW9uU3RhdGUuUmVhZHl9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplQ29sdW1ucygpIHtcclxuICAgIGNvbnN0IGN1c3RvbUNlbGxNYXAgPSBuZXcgTWFwKHRoaXMuY3VzdG9tQ2VsbHMubWFwKGNjID0+IFtjYy5jdXN0b21DZWxsLGNjXSkpO1xyXG4gICAgdGhpcy5zdGF0ZS5zZXRNZXRhRGF0YSh0aGlzLnRhYmxlQnVpbGRlci5tZXRhRGF0YSQhLnBpcGUoXHJcbiAgICAgIG1hcCgobWRzKSA9PiB7XHJcbiAgICAgICAgbWRzID0gbWRzLm1hcCh0aGlzLm1hcE1ldGFEYXRhcyk7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgIC4uLm1kcyxcclxuICAgICAgICAgIC4uLnRoaXMuY3VzdG9tQ2VsbHMubWFwKCBjYyA9PiBjYy5nZXRNZXRhRGF0YShtZHMuZmluZCggaXRlbSA9PiBpdGVtLmtleSA9PT0gY2MuY3VzdG9tQ2VsbCApKSApXHJcbiAgICAgICAgXVxyXG4gICAgICB9KVxyXG4gICAgKSk7XHJcbiAgICB0aGlzLnN0YXRlLnNldExpbmtNYXBzKHRoaXMudGFibGVCdWlsZGVyLm1ldGFEYXRhJCEucGlwZShcclxuICAgICAgbWFwKGNyZWF0ZUxpbmtDcmVhdG9yRGljdClcclxuICAgICkpXHJcblxyXG4gICAgdGhpcy5teUNvbHVtbnMkID0gdGhpcy5zdGF0ZS5tZXRhRGF0YUFycmF5JC5waXBlKFxyXG4gICAgICBtYXBBcnJheSggbWV0YURhdGEgPT4gKHttZXRhRGF0YSwgY3VzdG9tQ2VsbDogY3VzdG9tQ2VsbE1hcC5nZXQobWV0YURhdGEua2V5KSF9KSksXHJcbiAgICAgIGRlZmF1bHRTaGFyZVJlcGxheSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbWFwTWV0YURhdGFzID0gKG1ldGEgOiBNZXRhRGF0YTxUPikgPT4ge1xyXG4gICAgaWYobWV0YS5maWVsZFR5cGUgPT09IEZpZWxkVHlwZS5BcnJheSl7XHJcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSB7Li4ubWV0YS5hZGRpdGlvbmFsfSBhcyBBcnJheUFkZGl0aW9uYWw7XHJcbiAgICAgIGFkZGl0aW9uYWwuYXJyYXlTdHlsZSA9IGFkZGl0aW9uYWw/LmFycmF5U3R5bGUgPz8gQXJyYXlEZWZhdWx0cy5hcnJheVN0eWxlO1xyXG4gICAgICBhZGRpdGlvbmFsLmxpbWl0ID0gYWRkaXRpb25hbC5saW1pdCA/PyB0aGlzLmNvbmZpZy5hcnJheUluZm8/LmxpbWl0ID8/IEFycmF5RGVmYXVsdHMubGltaXQ7XHJcbiAgICAgIHJldHVybiB7Li4ubWV0YSxhZGRpdGlvbmFsfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1ldGE7XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZUhlYWRlciQgPSB0aGlzLnN0YXRlLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5wZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmNvbGxhcHNlSGVhZGVyKSk7XHJcblxyXG4gIGFkZEZpbHRlckRpcmVjdGl2ZXMgPSAoc3RhdGU6IFRhYmxlU3RhdGUpID0+IHtcclxuICAgIGxldCBhbGxGaWx0ZXJEaXJlY3RpdmVzID0gWy4uLnRoaXMuZmlsdGVyRGlyZWN0aXZlcywgLi4udGhpcy5jdXN0b21GaWx0ZXJEaXJlY3RpdmVzXTtcclxuICAgIGlmKHRoaXMud3JhcHBlcikge1xyXG4gICAgICBhbGxGaWx0ZXJEaXJlY3RpdmVzID0gWy4uLmFsbEZpbHRlckRpcmVjdGl2ZXMsIC4uLnRoaXMud3JhcHBlci5yZWdpc3RyYXRpb25zXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXN0b21GaWx0ZXJzOiAoVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUgfCBUYWJsZUZpbHRlckRpcmVjdGl2ZSApW10gPSBbXTtcclxuXHJcbiAgICBhbGxGaWx0ZXJEaXJlY3RpdmVzLmZpbHRlciggZiA9PiAhZi51c2VkKS5mb3JFYWNoKCBmID0+IHtcclxuICAgICAgZi51c2VkID0gdHJ1ZTtcclxuICAgICAgaWYoZi5zYXZhYmxlKSB7XHJcbiAgICAgICAgdmFyIGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbZi5maWx0ZXJJZF07XHJcbiAgICAgICAgaWYoaXNGaWx0ZXJJbmZvKGZpbHRlcikpIHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlckRpcmVjdGl2ZTogVGFibGVGaWx0ZXJEaXJlY3RpdmUgPSBmIGFzIFRhYmxlRmlsdGVyRGlyZWN0aXZlO1xyXG4gICAgICAgICAgZmlsdGVyRGlyZWN0aXZlLmZpZWxkVHlwZSA9IGZpbHRlci5maWVsZFR5cGU7XHJcbiAgICAgICAgICBmaWx0ZXJEaXJlY3RpdmUuZmlsdGVyVHlwZSA9IGZpbHRlci5maWx0ZXJUeXBlO1xyXG4gICAgICAgICAgZmlsdGVyRGlyZWN0aXZlLnNldEZpbHRlclZhbHVlKGZpbHRlci5maWx0ZXJWYWx1ZSk7XHJcbiAgICAgICAgICBmaWx0ZXJEaXJlY3RpdmUua2V5ID0gZmlsdGVyLmtleTtcclxuICAgICAgICAgIGZpbHRlckRpcmVjdGl2ZS51cGRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoaXNDdXN0b21GaWx0ZXIoZmlsdGVyKSkge1xyXG4gICAgICAgICAgZi5hY3RpdmUgPSBmaWx0ZXIuYWN0aXZlID8/IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YXRlLmFkZEZpbHRlcigoZi5maWx0ZXIkIGFzIGFueSkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN1c3RvbUZpbHRlcnMucHVzaChmKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY3VzdG9tRmlsdGVycyQgPSAgZnJvbSggY3VzdG9tRmlsdGVycy5tYXAoIGNmID0+IGNmLmZpbHRlciQgICkpLnBpcGUoXHJcbiAgICAgIG1lcmdlQWxsKCksXHJcbiAgICAgIHNjYW4oIChhLGIpPT4ge1xyXG4gICAgICAgICAgaWYoYi5hY3RpdmUpIHtcclxuICAgICAgICAgICAgYVtiLmZpbHRlcklkXSA9IGlzQ3VzdG9tRmlsdGVyKGIpID8gYi5wcmVkaWNhdGUgOiBjcmVhdGVGaWx0ZXJGdW5jKGIpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGVsZXRlIGFbYi5maWx0ZXJJZF0gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICByZXR1cm4gYTtcclxuICAgICAgfSwge30gYXMgRGljdGlvbmFyeTxQcmVkaWNhdGU8YW55Pj4pLFxyXG4gICAgICBtYXAoIGYgPT4gT2JqZWN0LnZhbHVlcyhmKSlcclxuICAgICk7XHJcbiAgICB0aGlzLnN0YXRlLm9uKGN1c3RvbUZpbHRlcnMkLCAoZikgPT4ge1xyXG4gICAgICB0aGlzLmN1c3RvbUZpbHRlcnMkLm5leHQoZik7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2JlZm9yZV1cIiAvPlxyXG5cclxuPG5nLWNvbnRhaW5lciBtdWx0aVNvcnQgKm5ncnhMZXQ9XCJzdGF0ZS50YWJsZVNldHRpbmdzJCBhcyB0YWJsZVNldHRpbmdzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlci13cmFwcGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5cclxuICAgICAgQGlmICgoIShjb2xsYXBzZUhlYWRlciQgfCBhc3luYykpIHx8IHRhYmxlU2V0dGluZ3Muc2hvd1RpdGxlV2hlbkhlYWRlckNvbGxhcHNlZCkge1xyXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi50Yi1oZWFkZXItdGl0bGVcIi8+XHJcbiAgICAgIH1cclxuICAgICAgQGlmKChzdGF0ZS5ncm91cEJ5S2V5cyQgfCBhc3luYyk/Lmxlbmd0aCl7XHJcbiAgICAgICAgPGdyb3VwLWJ5LWxpc3QgLz5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmx4LXJvdy1lbmRcIj5cclxuICAgICAgPGxpYi1maWx0ZXItbGlzdCAvPlxyXG4gICAgICBAaWYgKCF0YWJsZVNldHRpbmdzLmhpZGVIZWFkZXIpIHtcclxuICAgICAgICBAaWYgKCEoY29sbGFwc2VIZWFkZXIkIHwgYXN5bmMpKSB7XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudVwiLz5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPSdwcmltYXJ5JyBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWFpbk1lbnVcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxtYXQtbWVudSAjbWFpbk1lbnU9J21hdE1lbnUnPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudUV4dHJhXCIvPlxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2Uge1xyXG4gICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJtYWluTWVudVwiIGNsYXNzPVwiZmxhdC1tZW51LWJ1dHRvbiBwb2ludGVyXCI+bW9yZV9ob3JpejwvbWF0LWljb24+XHJcbiAgICAgICAgICA8bWF0LW1lbnUgI21haW5NZW51PSdtYXRNZW51Jz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlck1lbnVcIi8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudUV4dHJhXCIvPlxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICB9XHJcbiAgICAgICAgPG1hdC1pY29uIFttYXRUb29sdGlwXT1cIihjb2xsYXBzZUhlYWRlciQgfCBhc3luYykgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSdcIiBjbGFzcz1cImNvbGxhcHNlLWljb24gaGVhZGVyXCJcclxuICAgICAgICAgIChjbGljayk9XCJzdGF0ZS50b2dnbGVDb2xsYXBzZUhlYWRlcigpXCI+XHJcbiAgICAgICAgICB7eyhjb2xsYXBzZUhlYWRlciQgfCBhc3luYykgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJ319XHJcbiAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgfVxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXY+XHJcbiAgICBAaWYoISF0YWJsZVNldHRpbmdzLnVzZVZpcnR1YWxTY3JvbGwpIHtcclxuICAgIDx0Yi12aXJ0dWFsLXNjcm9sbC1jb250YWluZXI+XHJcbiAgICAgIDx0Yi1nZW5lcmljLXRhYmxlIFtyb3dzXT0nY3VzdG9tUm93cycgW2RhdGEkXT1cImRhdGFcIiBbZGlzcGxheURhdGEkXT1cImRpc3BsYXlEYXRhXCJcclxuICAgICAgICAoc2VsZWN0aW9uJCk9J3NlbGVjdGlvbiQuZW1pdCgkZXZlbnQpJyBbY29sdW1uSW5mb3NdPSdteUNvbHVtbnMkJyBbdHJhY2tCeV09XCJ0cmFja0J5XCI+PC90Yi1nZW5lcmljLXRhYmxlPlxyXG4gICAgPC90Yi12aXJ0dWFsLXNjcm9sbC1jb250YWluZXI+XHJcbiAgICB9XHJcbiAgICBAZWxzZSB7XHJcbiAgICA8dGItZ2VuZXJpYy10YWJsZSBbcm93c109J2N1c3RvbVJvd3MnIFtkYXRhJF09XCJkYXRhXCIgW2Rpc3BsYXlEYXRhJF09XCJkaXNwbGF5RGF0YVwiXHJcbiAgICAgIChzZWxlY3Rpb24kKT0nc2VsZWN0aW9uJC5lbWl0KCRldmVudCknIFtjb2x1bW5JbmZvc109J215Q29sdW1ucyQnIFt0cmFja0J5XT1cInRyYWNrQnlcIj48L3RiLWdlbmVyaWMtdGFibGU+XHJcbiAgICB9XHJcbiAgICBAaWYodGFibGVTZXR0aW5ncy51c2VQYWdpbmF0b3IpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0b3JcIj5cclxuICAgICAgPHRiLXBhZ2luYXRvciAjdGJQYWdpbmF0b3IgW2RhdGEkXT1cImRhdGFcIiBbdGFibGVFbFJlZl09XCJ0YWJsZUVsUmVmXCIgLz5cclxuXHJcbiAgICAgIDxtYXQtaWNvbiBbbWF0VG9vbHRpcF09XCIoY29sbGFwc2VGb290ZXIkIHwgYXN5bmMpID8gJ2V4cGFuZCcgOiAnY29sbGFwc2UnXCIgY2xhc3M9XCJjb2xsYXBzZS1pY29uIGZvb3RlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cInN0YXRlLnRvZ2dsZUNvbGxhcHNlRm9vdGVyKClcIj5cclxuICAgICAgICB7eyhjb2xsYXBzZUZvb3RlciQgfCBhc3luYykgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJ319XHJcbiAgICAgIDwvbWF0LWljb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICA8bmctdGVtcGxhdGUgI2hlYWRlck1lbnU+XHJcbiAgICBAaWYgKCF0YWJsZVNldHRpbmdzLmhpZGVGaWx0ZXIpIHs8dGItZmlsdGVyLWRpc3BsYXllci8+fVxyXG4gICAgQGlmICghdGFibGVTZXR0aW5ncy5oaWRlQ29sdW1uU2V0dGluZ3MpIHs8dGItY29sLWRpc3BsYXllci8+fVxyXG4gICAgQGlmICghdGFibGVTZXR0aW5ncy5oaWRlU29ydCkgezx0Yi1zb3J0LW1lbnUvPn1cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8bmctdGVtcGxhdGUgI2hlYWRlck1lbnVFeHRyYT5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVzZXRTdGF0ZSgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5hdXRvcmVuZXc8L21hdC1pY29uPlxyXG4gICAgICA8c3Bhbj5SZXNldCB0YWJsZTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgQGlmICghdGFibGVTZXR0aW5ncy5oaWRlRXhwb3J0KSB7XHJcbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZXhwb3J0VG9Dc3YoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5maWxlX2Rvd25sb2FkPC9tYXQtaWNvbj5cclxuICAgICAgICA8c3Bhbj5FeHBvcnQgVGFibGU8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgQGlmIChjdXJyZW50U3RhdGVLZXkkIHwgYXN5bmM7IGFzIGN1cnJlbnRLZXkpIHtcclxuICAgICAgQGlmICh0YWJsZUlkKSB7XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzYXZlU3RhdGUoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiPnNhdmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+U2F2ZSB0byB7e2N1cnJlbnRLZXl9fTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInNhdmVkTmFtZXNcIj5cclxuICAgICAgICAgIDxzcGFuPkNob29zZSBQcm9maWxlPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgPG1hdC1tZW51ICNzYXZlZE5hbWVzPSdtYXRNZW51JyBwYW5lbENsYXNzPSd3aWRlLW1lbnUnPlxyXG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gY2xpY2tFbWl0dGVyICAjYWRkPSdjbGlja0VtaXR0ZXInPlxyXG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuPk5ldzwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIEBmb3IgKGtleSBvZiBzdGF0ZUtleXMkIHwgYXN5bmM7IHRyYWNrIGtleSkge1xyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPSdzZXRQcm9maWxlU3RhdGUoa2V5KSc+XHJcbiAgICAgICAgICA8c3Bhbj57e2tleX19PC9zcGFuPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNvbG9yPSd3YXJuJyAoY2xpY2spPSdkZWxldGVQcm9maWxlU3RhdGUoa2V5KScgc3RvcC1wcm9wYWdhdGlvbj5kZWxldGVfZm9yZXZlcjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIH1cclxuICAgIDwvbWF0LW1lbnU+XHJcbiAgICA8bmctY29udGFpbmVyICpvcERpYWxvZz0nYWRkJz5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImFkZC1rZXlcIiBtYXRJbnB1dCAjYWRkZWRLZXkgLz5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9J3NldFByb2ZpbGVTdGF0ZShhZGRlZEtleS52YWx1ZSk7IGFkZC5uZXh0KGZhbHNlKTsnIFtkaXNhYmxlZF09XCIhYWRkZWRLZXkudmFsdWVcIj5cclxuICAgICAgICBBZGRcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19
@@ -0,0 +1,7 @@
1
+ export const defaultProps = {
2
+ indexColumn: false,
3
+ selectionColumn: false,
4
+ isSticky: true,
5
+ stickyFooter: false,
6
+ };
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVQcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdXRpbGl0aWVzL3NyYy90YWJsZS1idWlsZGVyL2NvbXBvbmVudHMvdGFibGUtY29udGFpbmVyL3RhYmxlUHJvcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBWUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFlO0lBQ3RDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLGVBQWUsRUFBRSxLQUFLO0lBQ3RCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsWUFBWSxFQUFFLEtBQUs7Q0FDcEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRhYmxlQnVpbGRlckRhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RhYmxlQnVpbGRlckRhdGFTb3VyY2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUYWJsZVByb3BzIHtcclxuICBpbmRleENvbHVtbjogYm9vbGVhbjtcclxuICBzZWxlY3Rpb25Db2x1bW46IGJvb2xlYW47XHJcbiAgaXNTdGlja3k6IGJvb2xlYW47XHJcbiAgc3RpY2t5Rm9vdGVyOmJvb2xlYW47XHJcbiAgZ3JvdXBIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZGF0YVNvdXJjZT86IFRhYmxlQnVpbGRlckRhdGFTb3VyY2U8YW55PjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRQcm9wczogVGFibGVQcm9wcyA9IHtcclxuICBpbmRleENvbHVtbjogZmFsc2UsXHJcbiAgc2VsZWN0aW9uQ29sdW1uOiBmYWxzZSxcclxuICBpc1N0aWNreTogdHJ1ZSxcclxuICBzdGlja3lGb290ZXI6IGZhbHNlLFxyXG59XHJcbiJdfQ==
@@ -0,0 +1,105 @@
1
+ import { ChangeDetectionStrategy, Component, ViewChild, forwardRef, } from '@angular/core';
2
+ import { CdkVirtualScrollViewport, ScrollingModule, VIRTUAL_SCROLL_STRATEGY, } from '@angular/cdk/scrolling';
3
+ import { distinctUntilChanged, map } from 'rxjs';
4
+ import { defaultShareReplay } from '../../../rxjs';
5
+ import { TableVirtualScrollStrategy } from '../scroll-strategy';
6
+ import { VirtualScrollOptions } from '../../classes/table-builder-general-settings';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../classes/table-store";
9
+ import * as i2 from "@angular/cdk/scrolling";
10
+ export class VirtualScrollContainer {
11
+ constructor(state) {
12
+ this.state = state;
13
+ this.defaultOptions = new VirtualScrollOptions();
14
+ this.scrollStrategy = new TableVirtualScrollStrategy(this.state.tableSettings().useVirtualScroll.itemHeight || this.defaultOptions.itemHeight, this.state.tableSettings().useVirtualScroll.headerOffset || this.defaultOptions.headerOffset);
15
+ this.resizeHandler = () => {
16
+ if (this.viewport) {
17
+ this.setSize(this.viewport.elementRef);
18
+ }
19
+ };
20
+ }
21
+ ngOnInit() {
22
+ addEventListener('resize', this.resizeHandler);
23
+ setTimeout(() => {
24
+ this.setSize(this.viewport.elementRef);
25
+ }, 0);
26
+ if (this.state.tableSettings().usePaginator) {
27
+ this.state.on(this.state.select((s) => s.pageSize), (len) => this.scrollStrategy.setDataLength(len));
28
+ }
29
+ else {
30
+ this.state.on(this.state.select((s) => s.dataLen), (len) => this.scrollStrategy.setDataLength(len));
31
+ }
32
+ this.state.on(this.viewport.renderedRangeStream, (range) => {
33
+ this.state.updateState({
34
+ virtualStart: range.start,
35
+ virtualEnd: range.end,
36
+ });
37
+ });
38
+ var offset$ = this.viewport.scrolledIndexChange.pipe(map(() => this.viewport.getOffsetToRenderedContentStart() ?? 0), distinctUntilChanged(), defaultShareReplay());
39
+ this.state.on(offset$, (offset) => {
40
+ this.state.updateState({ virtualScrollOffset: offset });
41
+ });
42
+ }
43
+ ngOnDestroy() {
44
+ removeEventListener('resize', this.resizeHandler);
45
+ }
46
+ setSize(el) {
47
+ const vsViewport = el.nativeElement;
48
+ const vsContentWrapper = vsViewport?.children[0];
49
+ const hasHorizontalScrollBar = vsViewport?.scrollWidth > vsViewport?.clientWidth;
50
+ const rect = vsContentWrapper.getBoundingClientRect();
51
+ let wrapperHeight = 0;
52
+ if (rect.top >= 0) {
53
+ wrapperHeight = rect.bottom;
54
+ }
55
+ else {
56
+ wrapperHeight = rect.bottom + rect.top;
57
+ }
58
+ if (wrapperHeight < window.innerHeight) {
59
+ vsViewport.setAttribute('style', `height: ${vsContentWrapper.clientHeight + (hasHorizontalScrollBar ? 17 : 0)}px !important;`);
60
+ }
61
+ else {
62
+ vsViewport.setAttribute('style', `height: ${window.innerHeight - el.nativeElement.offsetTop - (0 || 167)}px !important;`);
63
+ }
64
+ this.viewport?.checkViewportSize();
65
+ const virtualScrollOffset = this.viewport.getOffsetToRenderedContentStart() ?? 0;
66
+ this.state.updateState({ virtualScrollOffset });
67
+ }
68
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: VirtualScrollContainer, deps: [{ token: i1.TableStore }], target: i0.ɵɵFactoryTarget.Component }); }
69
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0", type: VirtualScrollContainer, isStandalone: true, selector: "tb-virtual-scroll-container", viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, static: true }], ngImport: i0, template: `
70
+ <cdk-virtual-scroll-viewport>
71
+ <ng-content/>
72
+ </cdk-virtual-scroll-viewport>
73
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], viewProviders: [
74
+ {
75
+ provide: VIRTUAL_SCROLL_STRATEGY,
76
+ useFactory: (c) => c.scrollStrategy,
77
+ deps: [forwardRef(() => VirtualScrollContainer)],
78
+ },
79
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
80
+ }
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: VirtualScrollContainer, decorators: [{
82
+ type: Component,
83
+ args: [{
84
+ selector: 'tb-virtual-scroll-container',
85
+ template: `
86
+ <cdk-virtual-scroll-viewport>
87
+ <ng-content/>
88
+ </cdk-virtual-scroll-viewport>
89
+ `,
90
+ changeDetection: ChangeDetectionStrategy.OnPush,
91
+ standalone: true,
92
+ imports: [ScrollingModule],
93
+ viewProviders: [
94
+ {
95
+ provide: VIRTUAL_SCROLL_STRATEGY,
96
+ useFactory: (c) => c.scrollStrategy,
97
+ deps: [forwardRef(() => VirtualScrollContainer)],
98
+ },
99
+ ],
100
+ }]
101
+ }], ctorParameters: () => [{ type: i1.TableStore }], propDecorators: { viewport: [{
102
+ type: ViewChild,
103
+ args: [CdkVirtualScrollViewport, { static: true }]
104
+ }] } });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1zY3JvbGwtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdmlydHVhbC1zY3JvbGwtY29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUlULFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YsdUJBQXVCLEdBQ3hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7QUFvQnBGLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFDVSxLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBSTNCLG1CQUFjLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSwwQkFBMEIsQ0FDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQkFBMEMsQ0FBQyxVQUFVLElBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQ2pILElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsZ0JBQTBDLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUN0SCxDQUFBO1FBdUVILGtCQUFhLEdBQUcsR0FBRyxFQUFF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QkFDdkMsUUFBUSxFQUFFOzs7O0tBSVA7b0JBQ0gsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7b0JBQzFCLGFBQWEsRUFBRTt3QkFDYjs0QkFDRSxPQUFPLEVBQUUsdUJBQXVCOzRCQUNoQyxVQUFVLEVBQUUsQ0FBQyxDQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYzs0QkFDM0QsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO3lCQUNqRDtxQkFDRjtpQkFDRjsrRUFNd0QsUUFBUTtzQkFBOUQsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGZvcndhcmRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LFxyXG4gIFNjcm9sbGluZ01vZHVsZSxcclxuICBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSxcclxufSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWZhdWx0U2hhcmVSZXBsYXkgfSBmcm9tICcuLi8uLi8uLi9yeGpzJztcclxuaW1wb3J0IHsgVGFibGVTdG9yZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvdGFibGUtc3RvcmUnO1xyXG5pbXBvcnQgeyBUYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4uL3Njcm9sbC1zdHJhdGVneSc7XHJcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxPcHRpb25zIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90YWJsZS1idWlsZGVyLWdlbmVyYWwtc2V0dGluZ3MnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Yi12aXJ0dWFsLXNjcm9sbC1jb250YWluZXInLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG4gICAgICA8bmctY29udGVudC8+XHJcbiAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cclxuICAgIGAsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbU2Nyb2xsaW5nTW9kdWxlXSxcclxuICB2aWV3UHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLFxyXG4gICAgICB1c2VGYWN0b3J5OiAoYzogVmlydHVhbFNjcm9sbENvbnRhaW5lcikgPT4gYy5zY3JvbGxTdHJhdGVneSxcclxuICAgICAgZGVwczogW2ZvcndhcmRSZWYoKCkgPT4gVmlydHVhbFNjcm9sbENvbnRhaW5lcildLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmlydHVhbFNjcm9sbENvbnRhaW5lciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc3RhdGU6IFRhYmxlU3RvcmVcclxuICApIHt9XHJcblxyXG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCB7IHN0YXRpYzogdHJ1ZSB9KSB2aWV3cG9ydCE6Q2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xyXG4gIGRlZmF1bHRPcHRpb25zID0gbmV3IFZpcnR1YWxTY3JvbGxPcHRpb25zKCk7XHJcbiAgc2Nyb2xsU3RyYXRlZ3kgPSBuZXcgVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3koXHJcbiAgICAodGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzKCkudXNlVmlydHVhbFNjcm9sbCEgYXMgVmlydHVhbFNjcm9sbE9wdGlvbnMpLml0ZW1IZWlnaHR8fCB0aGlzLmRlZmF1bHRPcHRpb25zLml0ZW1IZWlnaHQsXHJcbiAgICAodGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzKCkudXNlVmlydHVhbFNjcm9sbCEgYXMgVmlydHVhbFNjcm9sbE9wdGlvbnMpLmhlYWRlck9mZnNldCB8fCB0aGlzLmRlZmF1bHRPcHRpb25zLmhlYWRlck9mZnNldFxyXG4gICAgKVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemVIYW5kbGVyKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNldFNpemUodGhpcy52aWV3cG9ydC5lbGVtZW50UmVmKTtcclxuICAgIH0sIDApO1xyXG5cclxuICAgIGlmICh0aGlzLnN0YXRlLnRhYmxlU2V0dGluZ3MoKS51c2VQYWdpbmF0b3IpIHtcclxuICAgICAgdGhpcy5zdGF0ZS5vbihcclxuICAgICAgICB0aGlzLnN0YXRlLnNlbGVjdCgocykgPT4gcy5wYWdlU2l6ZSksXHJcbiAgICAgICAgKGxlbikgPT4gdGhpcy5zY3JvbGxTdHJhdGVneS5zZXREYXRhTGVuZ3RoKGxlbilcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhdGUub24oXHJcbiAgICAgICAgdGhpcy5zdGF0ZS5zZWxlY3QoKHMpID0+IHMuZGF0YUxlbiksXHJcbiAgICAgICAgKGxlbikgPT4gdGhpcy5zY3JvbGxTdHJhdGVneS5zZXREYXRhTGVuZ3RoKGxlbilcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy52aWV3cG9ydC5yZW5kZXJlZFJhbmdlU3RyZWFtLCAocmFuZ2UpID0+IHtcclxuICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZSh7XHJcbiAgICAgICAgdmlydHVhbFN0YXJ0OiByYW5nZS5zdGFydCxcclxuICAgICAgICB2aXJ0dWFsRW5kOiByYW5nZS5lbmQsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB2YXIgb2Zmc2V0JCA9IHRoaXMudmlld3BvcnQuc2Nyb2xsZWRJbmRleENoYW5nZS5waXBlKFxyXG4gICAgICBtYXAoKCkgPT4gdGhpcy52aWV3cG9ydC5nZXRPZmZzZXRUb1JlbmRlcmVkQ29udGVudFN0YXJ0KCkgPz8gMCksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIGRlZmF1bHRTaGFyZVJlcGxheSgpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24ob2Zmc2V0JCwgKG9mZnNldCkgPT4ge1xyXG4gICAgICB0aGlzLnN0YXRlLnVwZGF0ZVN0YXRlKHsgdmlydHVhbFNjcm9sbE9mZnNldDogb2Zmc2V0IH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVzaXplSGFuZGxlcik7XHJcbiAgfVxyXG5cclxuICBzZXRTaXplKGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xyXG4gICAgY29uc3QgdnNWaWV3cG9ydDogRWxlbWVudCA9IGVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCB2c0NvbnRlbnRXcmFwcGVyOiBFbGVtZW50ID0gdnNWaWV3cG9ydD8uY2hpbGRyZW5bMF07XHJcbiAgICBjb25zdCBoYXNIb3Jpem9udGFsU2Nyb2xsQmFyID1cclxuICAgICAgdnNWaWV3cG9ydD8uc2Nyb2xsV2lkdGggPiB2c1ZpZXdwb3J0Py5jbGllbnRXaWR0aDtcclxuICAgIGNvbnN0IHJlY3QgPSB2c0NvbnRlbnRXcmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgbGV0IHdyYXBwZXJIZWlnaHQgPSAwO1xyXG4gICAgaWYgKHJlY3QudG9wID49IDApIHtcclxuICAgICAgd3JhcHBlckhlaWdodCA9IHJlY3QuYm90dG9tO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd3JhcHBlckhlaWdodCA9IHJlY3QuYm90dG9tICsgcmVjdC50b3A7XHJcbiAgICB9XHJcbiAgICBpZiAod3JhcHBlckhlaWdodCA8IHdpbmRvdy5pbm5lckhlaWdodCkge1xyXG4gICAgICB2c1ZpZXdwb3J0LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAnc3R5bGUnLFxyXG4gICAgICAgIGBoZWlnaHQ6ICR7XHJcbiAgICAgICAgICB2c0NvbnRlbnRXcmFwcGVyLmNsaWVudEhlaWdodCArIChoYXNIb3Jpem9udGFsU2Nyb2xsQmFyID8gMTcgOiAwKVxyXG4gICAgICAgIH1weCAhaW1wb3J0YW50O2BcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZzVmlld3BvcnQuc2V0QXR0cmlidXRlKFxyXG4gICAgICAgICdzdHlsZScsXHJcbiAgICAgICAgYGhlaWdodDogJHtcclxuICAgICAgICAgIHdpbmRvdy5pbm5lckhlaWdodCAtIGVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wIC0gKDAgfHwgMTY3KVxyXG4gICAgICAgIH1weCAhaW1wb3J0YW50O2BcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMudmlld3BvcnQ/LmNoZWNrVmlld3BvcnRTaXplKCk7XHJcbiAgICBjb25zdCB2aXJ0dWFsU2Nyb2xsT2Zmc2V0ID0gdGhpcy52aWV3cG9ydC5nZXRPZmZzZXRUb1JlbmRlcmVkQ29udGVudFN0YXJ0KCkgPz8gMFxyXG4gICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZSh7IHZpcnR1YWxTY3JvbGxPZmZzZXQgfSk7XHJcbiAgfVxyXG5cclxuICByZXNpemVIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMudmlld3BvcnQpIHtcclxuICAgICAgdGhpcy5zZXRTaXplKHRoaXMudmlld3BvcnQuZWxlbWVudFJlZik7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbn1cclxuIl19