ngx-register-base 1.3.1 → 1.3.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 (479) hide show
  1. package/esm2022/lib/components/checkbox-selector/checkbox-selector.component.mjs +129 -0
  2. package/esm2022/lib/components/checkbox-selector/checkbox-selector.types.mjs +8 -0
  3. package/esm2022/lib/components/column-settings/column-settings.component.mjs +249 -0
  4. package/esm2022/lib/components/column-settings/components/column-settings-template/column-settings-template.component.mjs +80 -0
  5. package/esm2022/lib/components/column-settings/consts/column-settings.consts.mjs +10 -0
  6. package/esm2022/lib/components/column-settings/index.mjs +3 -0
  7. package/esm2022/lib/components/column-settings/types/column-settings.types.mjs +7 -0
  8. package/esm2022/lib/components/divider/divider.component.mjs +16 -0
  9. package/esm2022/lib/components/filter-button/filter-button.component.mjs +19 -0
  10. package/esm2022/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.mjs +31 -0
  11. package/esm2022/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.mjs +57 -0
  12. package/esm2022/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.mjs +110 -0
  13. package/esm2022/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.mjs +130 -0
  14. package/esm2022/lib/components/filters/components/filter-list/filter-list.service.mjs +89 -0
  15. package/esm2022/lib/components/filters/components/filter-list/filters-section/filters-section.component.mjs +41 -0
  16. package/esm2022/lib/components/filters/components/filter-list.module.mjs +45 -0
  17. package/esm2022/lib/components/filters/index.mjs +3 -0
  18. package/esm2022/lib/components/filters/register-table-filter.component.mjs +155 -0
  19. package/esm2022/lib/components/filters/register-table-filter.module.mjs +39 -0
  20. package/esm2022/lib/components/index.mjs +11 -0
  21. package/esm2022/lib/components/inputs/index.mjs +20 -0
  22. package/esm2022/lib/components/inputs/inputs.module.mjs +166 -0
  23. package/esm2022/lib/components/inputs/param-calendar-year/param-calendar-year.component.mjs +45 -0
  24. package/esm2022/lib/components/inputs/param-custom/param-custom.component.mjs +12 -0
  25. package/esm2022/lib/components/inputs/param-date/param-date.component.mjs +76 -0
  26. package/esm2022/lib/components/inputs/param-date-range/param-date-range.component.mjs +60 -0
  27. package/esm2022/lib/components/inputs/param-date-time/param-date-time.component.mjs +86 -0
  28. package/esm2022/lib/components/inputs/param-date-time-range/param-date-time-range.component.mjs +95 -0
  29. package/esm2022/lib/components/inputs/param-month/param-month.component.mjs +50 -0
  30. package/esm2022/lib/components/inputs/param-month-range/param-month-range.component.mjs +62 -0
  31. package/esm2022/lib/components/inputs/param-multi-select/param-multi-select.component.mjs +309 -0
  32. package/esm2022/lib/components/inputs/param-select/param-select.component.mjs +225 -0
  33. package/esm2022/lib/components/inputs/param-switcher/param-switcher.component.mjs +21 -0
  34. package/esm2022/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.mjs +28 -0
  35. package/esm2022/lib/components/inputs/param-switcher-date-time-range/index.mjs +3 -0
  36. package/esm2022/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.mjs +105 -0
  37. package/esm2022/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.mjs +10 -0
  38. package/esm2022/lib/components/inputs/param-text/param-text.component.mjs +40 -0
  39. package/esm2022/lib/components/inputs/param-textarea/param-textarea.component.mjs +38 -0
  40. package/esm2022/lib/components/inputs/param-toggle/param-toggle.component.mjs +20 -0
  41. package/esm2022/lib/components/inputs/param-tree/consts/param-tree.consts.mjs +37 -0
  42. package/esm2022/lib/components/inputs/param-tree/index.mjs +8 -0
  43. package/esm2022/lib/components/inputs/param-tree/param-tree.component.mjs +207 -0
  44. package/esm2022/lib/components/inputs/param-tree/services/param-tree.service.mjs +116 -0
  45. package/esm2022/lib/components/inputs/param-tree/services/sync-tree-loader.service.mjs +20 -0
  46. package/esm2022/lib/components/inputs/param-tree/tokens/param-tree.tokens.mjs +3 -0
  47. package/esm2022/lib/components/inputs/param-tree/types/param-tree.types.mjs +2 -0
  48. package/esm2022/lib/components/inputs/param-tree/utils/param-tree.utils.mjs +9 -0
  49. package/esm2022/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.mjs +80 -0
  50. package/esm2022/lib/components/inputs/param-tree-select/param-tree-select.component.mjs +85 -0
  51. package/esm2022/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.mjs +15 -0
  52. package/esm2022/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.mjs +12 -0
  53. package/esm2022/lib/components/menu-constructor/index.mjs +5 -0
  54. package/esm2022/lib/components/menu-constructor/sproc-menu-constructor.component.mjs +559 -0
  55. package/esm2022/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.mjs +3 -0
  56. package/esm2022/lib/components/menu-constructor/store/sproc-menu-constructor.consts.mjs +5 -0
  57. package/esm2022/lib/components/menu-constructor/store/sproc-menu.tokens.mjs +3 -0
  58. package/esm2022/lib/components/page-menu/index.mjs +6 -0
  59. package/esm2022/lib/components/page-menu/schema/sproc-page-menu.consts.mjs +9 -0
  60. package/esm2022/lib/components/page-menu/schema/sproc-page-menu.schema.mjs +2 -0
  61. package/esm2022/lib/components/page-menu/schema/sproc-page-menu.tokens.mjs +4 -0
  62. package/esm2022/lib/components/page-menu/schema/sproc-page-menu.types.mjs +3 -0
  63. package/esm2022/lib/components/page-menu/sproc-page-menu.component.mjs +275 -0
  64. package/esm2022/lib/components/paginator/paginator.component.mjs +159 -0
  65. package/esm2022/lib/components/paginator/types/paginator.types.mjs +2 -0
  66. package/esm2022/lib/components/register-table/consts/register-table.consts.mjs +4 -0
  67. package/esm2022/lib/components/register-table/directives/cell-template.directive.mjs +19 -0
  68. package/esm2022/lib/components/register-table/directives/header-template.directive.mjs +18 -0
  69. package/esm2022/lib/components/register-table/index.mjs +4 -0
  70. package/esm2022/lib/components/register-table/model/schema.mjs +10 -0
  71. package/esm2022/lib/components/register-table/pipes/class-by-type.pipe.mjs +33 -0
  72. package/esm2022/lib/components/register-table/pipes/sticky-column.pipe.mjs +17 -0
  73. package/esm2022/lib/components/register-table/register-table.component.mjs +544 -0
  74. package/esm2022/lib/components/reset-settings-form/reset-settings-form.component.mjs +18 -0
  75. package/esm2022/lib/components/search-input/search-input.component.mjs +28 -0
  76. package/esm2022/lib/components/sliding-panel/sliding-panel.component.mjs +48 -0
  77. package/esm2022/lib/components/sliding-panel/sliding-panel.module.mjs +19 -0
  78. package/esm2022/lib/consts/date-time.consts.mjs +2 -0
  79. package/esm2022/lib/consts/index.mjs +4 -0
  80. package/esm2022/lib/consts/inputs.consts.mjs +4 -0
  81. package/esm2022/lib/consts/month.consts.mjs +77 -0
  82. package/esm2022/lib/consts/params.consts.mjs +2 -0
  83. package/esm2022/lib/consts/register-base.consts.mjs +26 -0
  84. package/esm2022/lib/core/form-group-wrapper/errors-consts.mjs +8 -0
  85. package/esm2022/lib/core/form-group-wrapper/form-group-wrapper.mjs +81 -0
  86. package/esm2022/lib/core/form-group-wrapper/index.mjs +2 -0
  87. package/esm2022/lib/core/index.mjs +5 -0
  88. package/esm2022/lib/core/input-control/index.mjs +2 -0
  89. package/esm2022/lib/core/input-control/input-control.mjs +11 -0
  90. package/esm2022/lib/core/param/index.mjs +6 -0
  91. package/esm2022/lib/core/param/param-base.mjs +215 -0
  92. package/esm2022/lib/core/param/param-date-base.mjs +26 -0
  93. package/esm2022/lib/core/param/param-select-base.mjs +114 -0
  94. package/esm2022/lib/core/param/param-text-base.mjs +25 -0
  95. package/esm2022/lib/core/param/param.tokens.mjs +4 -0
  96. package/esm2022/lib/core/register-base/index.mjs +3 -0
  97. package/esm2022/lib/core/register-base/register-base.mjs +575 -0
  98. package/esm2022/lib/core/register-base/register-base.store.mjs +43 -0
  99. package/esm2022/lib/directives/date/date-time.types.mjs +34 -0
  100. package/esm2022/lib/directives/date/format-date.pipe.mjs +33 -0
  101. package/esm2022/lib/directives/index.mjs +3 -0
  102. package/esm2022/lib/directives/number/number-only.directive.mjs +41 -0
  103. package/esm2022/lib/directives/sticky/index.mjs +3 -0
  104. package/esm2022/lib/directives/sticky/sticky-relative.directive.mjs +32 -0
  105. package/esm2022/lib/directives/sticky/sticky-relative.service.mjs +32 -0
  106. package/esm2022/lib/directives/sticky/sticky.directive.mjs +169 -0
  107. package/esm2022/lib/services/date-time.service.mjs +314 -0
  108. package/esm2022/lib/services/dialog/dialog.service.mjs +53 -0
  109. package/esm2022/lib/services/dialog/dialog.types.mjs +2 -0
  110. package/esm2022/lib/services/dialog/index.mjs +3 -0
  111. package/esm2022/lib/services/dom-intersection.service.mjs +22 -0
  112. package/esm2022/lib/services/filter/filters-state.service.mjs +65 -0
  113. package/esm2022/lib/services/filter/filters-transmit.service.mjs +82 -0
  114. package/esm2022/lib/services/filter/filters.service.mjs +23 -0
  115. package/esm2022/lib/services/index.mjs +8 -0
  116. package/esm2022/lib/services/inputs-state.service.mjs +130 -0
  117. package/esm2022/lib/services/inputs.service.mjs +88 -0
  118. package/esm2022/lib/services/key-pressed.service.mjs +37 -0
  119. package/esm2022/lib/services/resize-window-observer.service.mjs +33 -0
  120. package/esm2022/lib/services/selected-objects-state.service.mjs +123 -0
  121. package/esm2022/lib/store/fast-query-store.service.mjs +110 -0
  122. package/esm2022/lib/store/index.mjs +2 -0
  123. package/esm2022/lib/types/event.types.mjs +2 -0
  124. package/esm2022/lib/types/hasura.types.mjs +2 -0
  125. package/esm2022/lib/types/index.mjs +7 -0
  126. package/esm2022/lib/types/inputs.types.mjs +19 -0
  127. package/esm2022/lib/types/params.types.mjs +2 -0
  128. package/esm2022/lib/types/register-base.types.mjs +6 -0
  129. package/esm2022/lib/types/sub-types.mjs +2 -0
  130. package/esm2022/lib/types/user-profile.types.mjs +2 -0
  131. package/esm2022/lib/utils/functions.mjs +10 -0
  132. package/esm2022/lib/utils/get-url-segment.mjs +35 -0
  133. package/esm2022/lib/utils/index.mjs +5 -0
  134. package/esm2022/lib/utils/prizm.shared.module.mjs +284 -0
  135. package/esm2022/lib/utils/rxjs.mjs +28 -0
  136. package/esm2022/lib/utils/select-all-utils.mjs +11 -0
  137. package/esm2022/ngx-register-base.mjs +5 -0
  138. package/esm2022/public-api.mjs +9 -0
  139. package/fesm2022/ngx-register-base.mjs +7479 -0
  140. package/fesm2022/ngx-register-base.mjs.map +1 -0
  141. package/index.d.ts +5 -0
  142. package/lib/components/checkbox-selector/checkbox-selector.component.d.ts +33 -0
  143. package/lib/components/checkbox-selector/checkbox-selector.types.d.ts +7 -0
  144. package/lib/components/column-settings/column-settings.component.d.ts +80 -0
  145. package/lib/components/column-settings/components/column-settings-template/column-settings-template.component.d.ts +24 -0
  146. package/lib/components/column-settings/consts/column-settings.consts.d.ts +8 -0
  147. package/lib/components/column-settings/types/column-settings.types.d.ts +22 -0
  148. package/lib/components/divider/divider.component.d.ts +6 -0
  149. package/lib/components/filter-button/filter-button.component.d.ts +8 -0
  150. package/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.d.ts +14 -0
  151. package/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.d.ts +25 -0
  152. package/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.d.ts +39 -0
  153. package/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.d.ts +41 -0
  154. package/lib/components/filters/components/filter-list/filter-list.service.d.ts +20 -0
  155. package/lib/components/filters/components/filter-list/filters-section/filters-section.component.d.ts +15 -0
  156. package/lib/components/filters/components/filter-list.module.d.ts +15 -0
  157. package/lib/components/filters/register-table-filter.component.d.ts +40 -0
  158. package/lib/components/filters/register-table-filter.module.d.ts +13 -0
  159. package/lib/components/inputs/inputs.module.d.ts +31 -0
  160. package/lib/components/inputs/param-calendar-year/param-calendar-year.component.d.ts +19 -0
  161. package/lib/components/inputs/param-custom/param-custom.component.d.ts +6 -0
  162. package/lib/components/inputs/param-date/param-date.component.d.ts +20 -0
  163. package/lib/components/inputs/param-date-range/param-date-range.component.d.ts +26 -0
  164. package/lib/components/inputs/param-date-time/param-date-time.component.d.ts +25 -0
  165. package/lib/components/inputs/param-date-time-range/param-date-time-range.component.d.ts +28 -0
  166. package/lib/components/inputs/param-month/param-month.component.d.ts +18 -0
  167. package/lib/components/inputs/param-month-range/param-month-range.component.d.ts +21 -0
  168. package/lib/components/inputs/param-multi-select/param-multi-select.component.d.ts +46 -0
  169. package/lib/components/inputs/param-select/param-select.component.d.ts +34 -0
  170. package/lib/components/inputs/param-switcher/param-switcher.component.d.ts +8 -0
  171. package/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.d.ts +2 -0
  172. package/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.d.ts +19 -0
  173. package/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.d.ts +8 -0
  174. package/lib/components/inputs/param-text/param-text.component.d.ts +10 -0
  175. package/lib/components/inputs/param-textarea/param-textarea.component.d.ts +10 -0
  176. package/lib/components/inputs/param-toggle/param-toggle.component.d.ts +9 -0
  177. package/lib/components/inputs/param-tree/consts/param-tree.consts.d.ts +7 -0
  178. package/lib/components/inputs/param-tree/param-tree.component.d.ts +41 -0
  179. package/lib/components/inputs/param-tree/services/param-tree.service.d.ts +37 -0
  180. package/lib/components/inputs/param-tree/services/sync-tree-loader.service.d.ts +10 -0
  181. package/{src/lib/components/inputs/param-tree/tokens/param-tree.tokens.ts → lib/components/inputs/param-tree/tokens/param-tree.tokens.d.ts} +1 -2
  182. package/lib/components/inputs/param-tree/types/param-tree.types.d.ts +32 -0
  183. package/lib/components/inputs/param-tree/utils/param-tree.utils.d.ts +7 -0
  184. package/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.d.ts +31 -0
  185. package/lib/components/inputs/param-tree-select/param-tree-select.component.d.ts +30 -0
  186. package/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.d.ts +6 -0
  187. package/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.d.ts +5 -0
  188. package/lib/components/menu-constructor/sproc-menu-constructor.component.d.ts +113 -0
  189. package/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.d.ts +24 -0
  190. package/lib/components/menu-constructor/store/sproc-menu-constructor.consts.d.ts +36 -0
  191. package/{src/lib/components/menu-constructor/store/sproc-menu.tokens.ts → lib/components/menu-constructor/store/sproc-menu.tokens.d.ts} +1 -4
  192. package/lib/components/page-menu/schema/sproc-page-menu.consts.d.ts +7 -0
  193. package/lib/components/page-menu/schema/sproc-page-menu.schema.d.ts +30 -0
  194. package/lib/components/page-menu/schema/sproc-page-menu.tokens.d.ts +3 -0
  195. package/lib/components/page-menu/schema/sproc-page-menu.types.d.ts +36 -0
  196. package/lib/components/page-menu/sproc-page-menu.component.d.ts +48 -0
  197. package/lib/components/paginator/paginator.component.d.ts +52 -0
  198. package/lib/components/paginator/types/paginator.types.d.ts +15 -0
  199. package/lib/components/register-table/consts/register-table.consts.d.ts +3 -0
  200. package/lib/components/register-table/directives/cell-template.directive.d.ts +9 -0
  201. package/lib/components/register-table/directives/header-template.directive.d.ts +9 -0
  202. package/lib/components/register-table/model/schema.d.ts +52 -0
  203. package/lib/components/register-table/pipes/class-by-type.pipe.d.ts +8 -0
  204. package/lib/components/register-table/pipes/sticky-column.pipe.d.ts +7 -0
  205. package/lib/components/register-table/register-table.component.d.ts +165 -0
  206. package/lib/components/reset-settings-form/reset-settings-form.component.d.ts +9 -0
  207. package/lib/components/search-input/search-input.component.d.ts +11 -0
  208. package/lib/components/sliding-panel/sliding-panel.component.d.ts +14 -0
  209. package/lib/components/sliding-panel/sliding-panel.module.d.ts +9 -0
  210. package/lib/consts/date-time.consts.d.ts +1 -0
  211. package/lib/consts/index.d.ts +3 -0
  212. package/lib/consts/inputs.consts.d.ts +4 -0
  213. package/lib/consts/month.consts.d.ts +49 -0
  214. package/lib/consts/params.consts.d.ts +1 -0
  215. package/lib/consts/register-base.consts.d.ts +19 -0
  216. package/lib/core/form-group-wrapper/errors-consts.d.ts +5 -0
  217. package/lib/core/form-group-wrapper/form-group-wrapper.d.ts +15 -0
  218. package/lib/core/input-control/input-control.d.ts +11 -0
  219. package/lib/core/param/param-base.d.ts +68 -0
  220. package/lib/core/param/param-date-base.d.ts +18 -0
  221. package/lib/core/param/param-select-base.d.ts +42 -0
  222. package/lib/core/param/param-text-base.d.ts +15 -0
  223. package/{src/lib/core/param/param.tokens.ts → lib/core/param/param.tokens.d.ts} +1 -2
  224. package/lib/core/register-base/register-base.d.ts +168 -0
  225. package/lib/core/register-base/register-base.store.d.ts +35 -0
  226. package/lib/directives/date/date-time.types.d.ts +32 -0
  227. package/lib/directives/date/format-date.pipe.d.ts +10 -0
  228. package/lib/directives/number/number-only.directive.d.ts +10 -0
  229. package/lib/directives/sticky/sticky-relative.directive.d.ts +13 -0
  230. package/lib/directives/sticky/sticky-relative.service.d.ts +15 -0
  231. package/lib/directives/sticky/sticky.directive.d.ts +27 -0
  232. package/lib/services/date-time.service.d.ts +80 -0
  233. package/lib/services/dialog/dialog.service.d.ts +22 -0
  234. package/{src/lib/services/dialog/dialog.types.ts → lib/services/dialog/dialog.types.d.ts} +4 -8
  235. package/lib/services/dom-intersection.service.d.ts +8 -0
  236. package/lib/services/filter/filters-state.service.d.ts +21 -0
  237. package/lib/services/filter/filters-transmit.service.d.ts +28 -0
  238. package/lib/services/filter/filters.service.d.ts +12 -0
  239. package/lib/services/inputs-state.service.d.ts +57 -0
  240. package/lib/services/inputs.service.d.ts +28 -0
  241. package/lib/services/key-pressed.service.d.ts +15 -0
  242. package/lib/services/resize-window-observer.service.d.ts +11 -0
  243. package/lib/services/selected-objects-state.service.d.ts +47 -0
  244. package/lib/store/fast-query-store.service.d.ts +19 -0
  245. package/{src/lib/types/event.types.ts → lib/types/event.types.d.ts} +1 -1
  246. package/lib/types/hasura.types.d.ts +35 -0
  247. package/lib/types/inputs.types.d.ts +41 -0
  248. package/lib/types/params.types.d.ts +27 -0
  249. package/lib/types/register-base.types.d.ts +123 -0
  250. package/lib/types/sub-types.d.ts +8 -0
  251. package/lib/types/user-profile.types.d.ts +17 -0
  252. package/lib/utils/functions.d.ts +3 -0
  253. package/lib/utils/get-url-segment.d.ts +7 -0
  254. package/lib/utils/prizm.shared.module.d.ts +14 -0
  255. package/lib/utils/rxjs.d.ts +10 -0
  256. package/lib/utils/select-all-utils.d.ts +8 -0
  257. package/package.json +15 -12
  258. package/schematics/ng-update/replace-menu-state-token/index.d.ts +2 -0
  259. package/schematics/ng-update/replace-menu-state-token/index.js +29 -0
  260. package/schematics/ng-update/replace-menu-state-token/index.js.map +1 -0
  261. package/schematics/ng-update/update-prefix/index.d.ts +2 -0
  262. package/schematics/ng-update/update-prefix/index.js +33 -0
  263. package/schematics/ng-update/update-prefix/index.js.map +1 -0
  264. package/schematics/utils/{utils.ts → utils.d.ts} +2 -9
  265. package/schematics/utils/utils.js +25 -0
  266. package/schematics/utils/utils.js.map +1 -0
  267. package/ng-package.json +0 -15
  268. package/schematics/ng-update/replace-menu-state-token/index.ts +0 -33
  269. package/schematics/ng-update/update-prefix/index.ts +0 -38
  270. package/src/lib/components/checkbox-selector/checkbox-selector.component.html +0 -91
  271. package/src/lib/components/checkbox-selector/checkbox-selector.component.less +0 -67
  272. package/src/lib/components/checkbox-selector/checkbox-selector.component.ts +0 -176
  273. package/src/lib/components/checkbox-selector/checkbox-selector.types.ts +0 -8
  274. package/src/lib/components/column-settings/column-settings.component.html +0 -160
  275. package/src/lib/components/column-settings/column-settings.component.less +0 -131
  276. package/src/lib/components/column-settings/column-settings.component.ts +0 -352
  277. package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.html +0 -65
  278. package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.less +0 -79
  279. package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.ts +0 -114
  280. package/src/lib/components/column-settings/consts/column-settings.consts.ts +0 -9
  281. package/src/lib/components/column-settings/types/column-settings.types.ts +0 -26
  282. package/src/lib/components/divider/divider.component.html +0 -4
  283. package/src/lib/components/divider/divider.component.less +0 -10
  284. package/src/lib/components/divider/divider.component.ts +0 -12
  285. package/src/lib/components/filter-button/filter-button.component.html +0 -20
  286. package/src/lib/components/filter-button/filter-button.component.less +0 -41
  287. package/src/lib/components/filter-button/filter-button.component.ts +0 -18
  288. package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.html +0 -22
  289. package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.less +0 -23
  290. package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.ts +0 -31
  291. package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.html +0 -49
  292. package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.less +0 -37
  293. package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.ts +0 -66
  294. package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.html +0 -147
  295. package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.less +0 -45
  296. package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.ts +0 -114
  297. package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.html +0 -44
  298. package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.less +0 -49
  299. package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.ts +0 -167
  300. package/src/lib/components/filters/components/filter-list/filter-list.service.ts +0 -97
  301. package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.html +0 -18
  302. package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.less +0 -55
  303. package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.ts +0 -69
  304. package/src/lib/components/filters/components/filter-list.module.ts +0 -29
  305. package/src/lib/components/filters/register-table-filter.component.html +0 -53
  306. package/src/lib/components/filters/register-table-filter.component.less +0 -17
  307. package/src/lib/components/filters/register-table-filter.component.ts +0 -167
  308. package/src/lib/components/filters/register-table-filter.module.ts +0 -22
  309. package/src/lib/components/inputs/inputs.module.ts +0 -104
  310. package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.html +0 -49
  311. package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.less +0 -70
  312. package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.ts +0 -52
  313. package/src/lib/components/inputs/param-custom/param-custom.component.html +0 -1
  314. package/src/lib/components/inputs/param-custom/param-custom.component.ts +0 -9
  315. package/src/lib/components/inputs/param-date/param-date.component.html +0 -55
  316. package/src/lib/components/inputs/param-date/param-date.component.less +0 -67
  317. package/src/lib/components/inputs/param-date/param-date.component.ts +0 -77
  318. package/src/lib/components/inputs/param-date-range/param-date-range.component.html +0 -45
  319. package/src/lib/components/inputs/param-date-range/param-date-range.component.less +0 -75
  320. package/src/lib/components/inputs/param-date-range/param-date-range.component.ts +0 -67
  321. package/src/lib/components/inputs/param-date-time/param-date-time.component.html +0 -70
  322. package/src/lib/components/inputs/param-date-time/param-date-time.component.less +0 -72
  323. package/src/lib/components/inputs/param-date-time/param-date-time.component.ts +0 -101
  324. package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.html +0 -67
  325. package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.less +0 -103
  326. package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.ts +0 -128
  327. package/src/lib/components/inputs/param-month/param-month.component.html +0 -46
  328. package/src/lib/components/inputs/param-month/param-month.component.less +0 -72
  329. package/src/lib/components/inputs/param-month/param-month.component.ts +0 -55
  330. package/src/lib/components/inputs/param-month-range/param-month-range.component.html +0 -39
  331. package/src/lib/components/inputs/param-month-range/param-month-range.component.less +0 -71
  332. package/src/lib/components/inputs/param-month-range/param-month-range.component.ts +0 -76
  333. package/src/lib/components/inputs/param-multi-select/param-multi-select.component.html +0 -84
  334. package/src/lib/components/inputs/param-multi-select/param-multi-select.component.less +0 -108
  335. package/src/lib/components/inputs/param-multi-select/param-multi-select.component.ts +0 -448
  336. package/src/lib/components/inputs/param-select/param-select.component.html +0 -106
  337. package/src/lib/components/inputs/param-select/param-select.component.less +0 -26
  338. package/src/lib/components/inputs/param-select/param-select.component.ts +0 -318
  339. package/src/lib/components/inputs/param-switcher/param-switcher.component.html +0 -8
  340. package/src/lib/components/inputs/param-switcher/param-switcher.component.less +0 -53
  341. package/src/lib/components/inputs/param-switcher/param-switcher.component.ts +0 -13
  342. package/src/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.ts +0 -29
  343. package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.html +0 -19
  344. package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.less +0 -76
  345. package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.ts +0 -134
  346. package/src/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.ts +0 -8
  347. package/src/lib/components/inputs/param-text/param-text.component.html +0 -59
  348. package/src/lib/components/inputs/param-text/param-text.component.less +0 -33
  349. package/src/lib/components/inputs/param-text/param-text.component.ts +0 -36
  350. package/src/lib/components/inputs/param-textarea/param-textarea.component.html +0 -61
  351. package/src/lib/components/inputs/param-textarea/param-textarea.component.less +0 -21
  352. package/src/lib/components/inputs/param-textarea/param-textarea.component.ts +0 -33
  353. package/src/lib/components/inputs/param-toggle/param-toggle.component.html +0 -40
  354. package/src/lib/components/inputs/param-toggle/param-toggle.component.less +0 -69
  355. package/src/lib/components/inputs/param-toggle/param-toggle.component.ts +0 -14
  356. package/src/lib/components/inputs/param-tree/consts/param-tree.consts.ts +0 -59
  357. package/src/lib/components/inputs/param-tree/param-tree.component.html +0 -51
  358. package/src/lib/components/inputs/param-tree/param-tree.component.less +0 -3
  359. package/src/lib/components/inputs/param-tree/param-tree.component.ts +0 -282
  360. package/src/lib/components/inputs/param-tree/services/param-tree.service.ts +0 -176
  361. package/src/lib/components/inputs/param-tree/services/sync-tree-loader.service.ts +0 -18
  362. package/src/lib/components/inputs/param-tree/types/param-tree.types.ts +0 -39
  363. package/src/lib/components/inputs/param-tree/utils/param-tree.utils.ts +0 -18
  364. package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.html +0 -78
  365. package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.less +0 -109
  366. package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.ts +0 -89
  367. package/src/lib/components/inputs/param-tree-select/param-tree-select.component.html +0 -54
  368. package/src/lib/components/inputs/param-tree-select/param-tree-select.component.less +0 -56
  369. package/src/lib/components/inputs/param-tree-select/param-tree-select.component.ts +0 -91
  370. package/src/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.html +0 -5
  371. package/src/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.ts +0 -13
  372. package/src/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.html +0 -4
  373. package/src/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.ts +0 -11
  374. package/src/lib/components/menu-constructor/sproc-menu-constructor.component.html +0 -95
  375. package/src/lib/components/menu-constructor/sproc-menu-constructor.component.less +0 -183
  376. package/src/lib/components/menu-constructor/sproc-menu-constructor.component.ts +0 -687
  377. package/src/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.ts +0 -32
  378. package/src/lib/components/menu-constructor/store/sproc-menu-constructor.consts.ts +0 -46
  379. package/src/lib/components/page-menu/README.md +0 -60
  380. package/src/lib/components/page-menu/schema/sproc-page-menu.consts.ts +0 -8
  381. package/src/lib/components/page-menu/schema/sproc-page-menu.schema.ts +0 -35
  382. package/src/lib/components/page-menu/schema/sproc-page-menu.tokens.ts +0 -5
  383. package/src/lib/components/page-menu/schema/sproc-page-menu.types.ts +0 -42
  384. package/src/lib/components/page-menu/sproc-page-menu.component.html +0 -166
  385. package/src/lib/components/page-menu/sproc-page-menu.component.less +0 -228
  386. package/src/lib/components/page-menu/sproc-page-menu.component.ts +0 -337
  387. package/src/lib/components/paginator/paginator.component.html +0 -97
  388. package/src/lib/components/paginator/paginator.component.less +0 -101
  389. package/src/lib/components/paginator/paginator.component.ts +0 -192
  390. package/src/lib/components/paginator/types/paginator.types.ts +0 -16
  391. package/src/lib/components/register-table/consts/register-table.consts.ts +0 -3
  392. package/src/lib/components/register-table/directives/cell-template.directive.ts +0 -11
  393. package/src/lib/components/register-table/directives/header-template.directive.ts +0 -11
  394. package/src/lib/components/register-table/model/schema.ts +0 -62
  395. package/src/lib/components/register-table/pipes/class-by-type.pipe.ts +0 -28
  396. package/src/lib/components/register-table/pipes/sticky-column.pipe.ts +0 -11
  397. package/src/lib/components/register-table/register-table.component.html +0 -257
  398. package/src/lib/components/register-table/register-table.component.less +0 -151
  399. package/src/lib/components/register-table/register-table.component.ts +0 -743
  400. package/src/lib/components/reset-settings-form/reset-settings-form.component.html +0 -14
  401. package/src/lib/components/reset-settings-form/reset-settings-form.component.less +0 -26
  402. package/src/lib/components/reset-settings-form/reset-settings-form.component.ts +0 -15
  403. package/src/lib/components/search-input/search-input.component.html +0 -6
  404. package/src/lib/components/search-input/search-input.component.less +0 -17
  405. package/src/lib/components/search-input/search-input.component.ts +0 -31
  406. package/src/lib/components/sliding-panel/sliding-panel.component.html +0 -13
  407. package/src/lib/components/sliding-panel/sliding-panel.component.less +0 -112
  408. package/src/lib/components/sliding-panel/sliding-panel.component.ts +0 -36
  409. package/src/lib/components/sliding-panel/sliding-panel.module.ts +0 -11
  410. package/src/lib/consts/date-time.consts.ts +0 -1
  411. package/src/lib/consts/index.ts +0 -8
  412. package/src/lib/consts/inputs.consts.ts +0 -9
  413. package/src/lib/consts/month.consts.ts +0 -82
  414. package/src/lib/consts/params.consts.ts +0 -1
  415. package/src/lib/consts/register-base.consts.ts +0 -40
  416. package/src/lib/core/form-group-wrapper/errors-consts.ts +0 -6
  417. package/src/lib/core/form-group-wrapper/form-group-wrapper.ts +0 -109
  418. package/src/lib/core/input-control/input-control.ts +0 -30
  419. package/src/lib/core/param/param-base.ts +0 -262
  420. package/src/lib/core/param/param-date-base.ts +0 -30
  421. package/src/lib/core/param/param-select-base.ts +0 -118
  422. package/src/lib/core/param/param-text-base.ts +0 -23
  423. package/src/lib/core/register-base/register-base.store.ts +0 -84
  424. package/src/lib/core/register-base/register-base.ts +0 -854
  425. package/src/lib/directives/date/date-time.types.ts +0 -36
  426. package/src/lib/directives/date/format-date.pipe.ts +0 -28
  427. package/src/lib/directives/number/number-only.directive.ts +0 -36
  428. package/src/lib/directives/sticky/sticky-relative.directive.ts +0 -30
  429. package/src/lib/directives/sticky/sticky-relative.service.ts +0 -34
  430. package/src/lib/directives/sticky/sticky.directive.ts +0 -189
  431. package/src/lib/services/date-time.service.ts +0 -399
  432. package/src/lib/services/dialog/dialog.service.ts +0 -62
  433. package/src/lib/services/dom-intersection.service.ts +0 -23
  434. package/src/lib/services/filter/filters-state.service.ts +0 -83
  435. package/src/lib/services/filter/filters-transmit.service.ts +0 -105
  436. package/src/lib/services/filter/filters.service.ts +0 -21
  437. package/src/lib/services/inputs-state.service.ts +0 -157
  438. package/src/lib/services/inputs.service.ts +0 -114
  439. package/src/lib/services/key-pressed.service.ts +0 -40
  440. package/src/lib/services/resize-window-observer.service.ts +0 -37
  441. package/src/lib/services/selected-objects-state.service.ts +0 -159
  442. package/src/lib/store/fast-query-store.service.ts +0 -132
  443. package/src/lib/types/hasura.types.ts +0 -41
  444. package/src/lib/types/inputs.types.ts +0 -63
  445. package/src/lib/types/params.types.ts +0 -42
  446. package/src/lib/types/register-base.types.ts +0 -161
  447. package/src/lib/types/sub-types.ts +0 -15
  448. package/src/lib/types/user-profile.types.ts +0 -18
  449. package/src/lib/utils/functions.ts +0 -11
  450. package/src/lib/utils/get-url-segment.ts +0 -46
  451. package/src/lib/utils/prizm.shared.module.ts +0 -176
  452. package/src/lib/utils/rxjs.ts +0 -33
  453. package/src/lib/utils/select-all-utils.ts +0 -16
  454. package/tsconfig.lib.json +0 -16
  455. package/tsconfig.lib.prod.json +0 -11
  456. package/tsconfig.schematics.json +0 -26
  457. package/tsconfig.spec.json +0 -15
  458. /package/{src/lib/components/column-settings/index.ts → lib/components/column-settings/index.d.ts} +0 -0
  459. /package/{src/lib/components/filters/index.ts → lib/components/filters/index.d.ts} +0 -0
  460. /package/{src/lib/components/index.ts → lib/components/index.d.ts} +0 -0
  461. /package/{src/lib/components/inputs/index.ts → lib/components/inputs/index.d.ts} +0 -0
  462. /package/{src/lib/components/inputs/param-switcher-date-time-range/index.ts → lib/components/inputs/param-switcher-date-time-range/index.d.ts} +0 -0
  463. /package/{src/lib/components/inputs/param-tree/index.ts → lib/components/inputs/param-tree/index.d.ts} +0 -0
  464. /package/{src/lib/components/menu-constructor/index.ts → lib/components/menu-constructor/index.d.ts} +0 -0
  465. /package/{src/lib/components/page-menu/index.ts → lib/components/page-menu/index.d.ts} +0 -0
  466. /package/{src/lib/components/register-table/index.ts → lib/components/register-table/index.d.ts} +0 -0
  467. /package/{src/lib/core/form-group-wrapper/index.ts → lib/core/form-group-wrapper/index.d.ts} +0 -0
  468. /package/{src/lib/core/index.ts → lib/core/index.d.ts} +0 -0
  469. /package/{src/lib/core/input-control/index.ts → lib/core/input-control/index.d.ts} +0 -0
  470. /package/{src/lib/core/param/index.ts → lib/core/param/index.d.ts} +0 -0
  471. /package/{src/lib/core/register-base/index.ts → lib/core/register-base/index.d.ts} +0 -0
  472. /package/{src/lib/directives/index.ts → lib/directives/index.d.ts} +0 -0
  473. /package/{src/lib/directives/sticky/index.ts → lib/directives/sticky/index.d.ts} +0 -0
  474. /package/{src/lib/services/dialog/index.ts → lib/services/dialog/index.d.ts} +0 -0
  475. /package/{src/lib/services/index.ts → lib/services/index.d.ts} +0 -0
  476. /package/{src/lib/store/index.ts → lib/store/index.d.ts} +0 -0
  477. /package/{src/lib/types/index.ts → lib/types/index.d.ts} +0 -0
  478. /package/{src/lib/utils/index.ts → lib/utils/index.d.ts} +0 -0
  479. /package/{src/public-api.ts → public-api.d.ts} +0 -0
@@ -0,0 +1,575 @@
1
+ import { ChangeDetectorRef, DestroyRef, Directive, inject, } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { BehaviorSubject, catchError, combineLatest, debounceTime, filter as rxjsFilter, map, ReplaySubject, switchMap, take, tap, throwError, } from 'rxjs';
4
+ import { ERegisterObjectState, EInputsAction, EInputsState, } from '../../types';
5
+ import { EColumnStatus, } from '../../components/column-settings/types/column-settings.types';
6
+ import { SelectionTypes, } from '../../components/checkbox-selector/checkbox-selector.types';
7
+ import { FiltersStateService, FiltersService, FiltersTransmitService, SelectedObjectsStateService, } from '../../services';
8
+ import { SEARCH_INPUT_DEBOUNCE_TIME_MLS, SETTINGS_TYPE, USER_PROFILE_LOADER, USER_SETTINGS_LOADER, } from '../../consts/register-base.consts';
9
+ import { getLastSegmentOfPathName, isNonNull } from '../../utils';
10
+ import { DEFAULT_LIMIT } from '../../services/inputs-state.service';
11
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
12
+ import _ from 'lodash';
13
+ import { RegisterBaseStore } from './register-base.store';
14
+ import * as i0 from "@angular/core";
15
+ export class RegisterBase {
16
+ get limit() {
17
+ return this._limit;
18
+ }
19
+ get offset() {
20
+ return this._offset;
21
+ }
22
+ /** Uuid'ы всех выбранных или исключаемых объектов реестра (зависит от состояния еще не загруженных объектов) */
23
+ get idsFromState() {
24
+ const service = this.selectedService;
25
+ if (!service) {
26
+ throw new Error('SelectedObjectsStateService не запровайжен');
27
+ }
28
+ return service.keys();
29
+ }
30
+ /** Все выбранные uuid'ы реестра */
31
+ get selectedIdsFromState() {
32
+ const service = this.selectedService;
33
+ if (!service) {
34
+ throw new Error('SelectedObjectsStateService не запровайжен');
35
+ }
36
+ return service.selectedKeys();
37
+ }
38
+ /** Все выбранные объекты реестра */
39
+ get selectedObjectsFromState() {
40
+ const service = this.selectedService;
41
+ if (!service) {
42
+ throw new Error('SelectedObjectsStateService не запровайжен');
43
+ }
44
+ return service.selectedValues();
45
+ }
46
+ constructor(injector, columnsData) {
47
+ this.injector = injector;
48
+ /** Сервисы управления фильтрами */
49
+ this.filtersService = inject(FiltersService);
50
+ this.stateService = inject(FiltersStateService);
51
+ this.transmitter = inject(FiltersTransmitService, { optional: true });
52
+ /** Сервис управления пользователем */
53
+ this.userService = inject(USER_PROFILE_LOADER);
54
+ /** Сервис управления данными в реестре */
55
+ this.baseStore = inject((RegisterBaseStore), { optional: true });
56
+ // TODO удалить optional: true после выполнения задачи SMA2-3134
57
+ this.selectedService = inject((SelectedObjectsStateService), {
58
+ optional: true,
59
+ });
60
+ // TODO protected readonly navigationService = inject(NavigationService);
61
+ this.router = inject(Router);
62
+ this.cdr = inject(ChangeDetectorRef);
63
+ this.destroyRef = inject(DestroyRef);
64
+ this.settingsService = inject(USER_SETTINGS_LOADER);
65
+ this.filterApplied$ = this.stateService.gqlValues$.pipe(map((filter) => Number(filter.length) > 0));
66
+ this.page$ = this.stateService.page$;
67
+ this.limit$ = this.stateService.limit$;
68
+ this.selectedRecordsLoading$ = new BehaviorSubject(false);
69
+ this.data = [];
70
+ this.visibleData = [];
71
+ this.dataCount = 0;
72
+ /** @deprecated Используйте selectedObjectsFromState */
73
+ this.selectedObjects = new Set();
74
+ /** @deprecated Используйте selectedIdsFromState */
75
+ this.selectedIds = new Set();
76
+ this._user = this.userService.getUserProfile();
77
+ this.stickyLeftIds = [];
78
+ this.stickyRightIds = [];
79
+ this.currentFilter = null;
80
+ this.filterState = [];
81
+ this._modulePath = getLastSegmentOfPathName(this.router.url);
82
+ this._defaultFilterApplied$ = new ReplaySubject();
83
+ /**
84
+ * Контрол строки поиска
85
+ */
86
+ this.searchInput = this.filtersService.searchInput;
87
+ this._selectionType$ = this.selectedService?.selectionType$ ?? new BehaviorSubject(null);
88
+ this.stateObjects = this.selectedService?.state;
89
+ this.columnsData = columnsData;
90
+ this._defaultColumnsWidths = new Map(columnsData.map((col) => [col.name, col.width]));
91
+ this.columns = this._getDefaultColumnsRecursive(columnsData);
92
+ this._subscribeOnSettings();
93
+ this._fetchSavedPageRowsLimit();
94
+ const state = this.router.getCurrentNavigation()?.extras?.state;
95
+ if (state) {
96
+ this.filterState = this.parseToFilters(state);
97
+ }
98
+ }
99
+ _subscribeOnSettings() {
100
+ this.settingsService.settings$
101
+ .pipe(takeUntilDestroyed(this.destroyRef))
102
+ .subscribe(([userSetting]) => {
103
+ const { tableColumnsWidth } = userSetting?.settings ?? {};
104
+ const type = userSetting?.settings_type;
105
+ if (type && type !== SETTINGS_TYPE.COLUMNS) {
106
+ return;
107
+ }
108
+ const cleanedCurrent = this._omitUndefined(this._columnsSettings?.settings.tableColumnsWidth);
109
+ const cleanedNew = this._omitUndefined(tableColumnsWidth);
110
+ if (!_.isEqual(cleanedCurrent, cleanedNew)) {
111
+ this._setColumnsWidth(tableColumnsWidth);
112
+ }
113
+ this._columnsSettings = userSetting;
114
+ });
115
+ }
116
+ _omitUndefined(arr) {
117
+ return _.map(arr ?? [], (obj) => _.omitBy(obj, _.isUndefined));
118
+ }
119
+ _setColumnsWidth(columnsWidth) {
120
+ const thsWidthMap = new Map(columnsWidth?.map(({ name, width }) => [name, width]));
121
+ this.columnsData = this.columnsData.map((col) => {
122
+ const defaultWidth = this._defaultColumnsWidths.get(col.name);
123
+ const currentWidth = thsWidthMap.has(col.name) ? thsWidthMap.get(col.name) : null;
124
+ const width = currentWidth === null ? defaultWidth : currentWidth;
125
+ return {
126
+ ...col,
127
+ width,
128
+ };
129
+ });
130
+ }
131
+ _fetchSavedPageRowsLimit() {
132
+ this.settingsService
133
+ .fetchUserSettings$({
134
+ id_user: {
135
+ _eq: this._user.id,
136
+ },
137
+ settings_type: {
138
+ _eq: SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT,
139
+ },
140
+ module_name: {
141
+ _eq: this._modulePath,
142
+ },
143
+ }, true)
144
+ .subscribe(([firstSetting]) => {
145
+ this._pageRowsLimitSetting = firstSetting;
146
+ const { pageRowsLimit } = firstSetting?.settings ?? {};
147
+ this.stateService.setLimit(pageRowsLimit ?? DEFAULT_LIMIT);
148
+ });
149
+ }
150
+ ngOnInit() {
151
+ this.filtersForm = this.buildForm;
152
+ this.filtersService.init(this.filtersForm);
153
+ this.stateService.setState({ state: EInputsState.HIDDEN, action: EInputsAction.OPEN });
154
+ this.fetchTotalObjects(this.baseFilter(this._user));
155
+ this._subscribeOnMutationCompleted();
156
+ this.subscribeOnPaging();
157
+ // TODO проверить нужна ли Перезагрузка страницы
158
+ // if (this.navigationService.previousUrl === null) {
159
+ // this.stateService.setOffset(0);
160
+ // this.stateService.setPage(1);
161
+ // }
162
+ this.baseStore?.count$?.subscribe((count) => {
163
+ this.dataCount = count;
164
+ this.stateService.setCount(count);
165
+ });
166
+ }
167
+ ngAfterViewInit(searchLimiter = 2) {
168
+ this._setFilters();
169
+ this.subscribeOnSearchChanges(searchLimiter);
170
+ }
171
+ _setFilters() {
172
+ const queryFilters = this.transmitter?.filters;
173
+ const querySearch = this.transmitter?.search;
174
+ let filters;
175
+ if (querySearch) {
176
+ this.searchInput.setValue(querySearch);
177
+ }
178
+ if (!queryFilters || queryFilters.length > 0) {
179
+ filters = queryFilters || [];
180
+ }
181
+ this.applyBaseFilter();
182
+ this._initDefaultFilter(filters);
183
+ }
184
+ applyBaseFilter(_data) { }
185
+ ngOnDestroy() {
186
+ this.actionCompleted$.complete();
187
+ this.selectedRecordsLoading$.complete();
188
+ this.filtersService.clear();
189
+ this.stateService.setOffset(0);
190
+ this.stateService.setGqlValues({});
191
+ if (this.searchInput?.value) {
192
+ this.stateService.setSearchFilterValue('');
193
+ this.stateService.setGqlValues(this.filtersService.gqlFilter);
194
+ }
195
+ }
196
+ applyFilters(filters) {
197
+ this.filtersService.setUserSettingsFilterValues(filters);
198
+ this.stateService.setGqlValues(this.filtersService.gqlFilter);
199
+ }
200
+ setData(data, count) {
201
+ this.data = data;
202
+ if (count !== undefined) {
203
+ this.dataCount = count;
204
+ this.stateService.setCount(count);
205
+ }
206
+ this.cdr.markForCheck();
207
+ }
208
+ updateAllStateObjectsByState(state) {
209
+ this.selectedService?.setAllStateObjectsByState(state);
210
+ }
211
+ updateStateObjectByKey(key, updates) {
212
+ this.selectedService?.setStateObjectByKey(key, updates);
213
+ }
214
+ clearSelections(data) {
215
+ this.selectedIds.clear();
216
+ this.selectedObjects.clear();
217
+ if (this.selectedService) {
218
+ this.selectedService?.resetState(data);
219
+ this.buildActions({
220
+ row: [],
221
+ count: 0,
222
+ });
223
+ }
224
+ }
225
+ actionCompleted() {
226
+ const filter = this.buildFilter(this.limit, this.offset, this._filterState);
227
+ this.currentFilter = filter;
228
+ this.clearSelections();
229
+ this.objectsSubscription({ filter });
230
+ }
231
+ buildActions(_data) { }
232
+ subscribeOnSearchChanges(limiter) {
233
+ this.searchInput?.valueChanges
234
+ .pipe(rxjsFilter((value) => !value || value.length > limiter), debounceTime(SEARCH_INPUT_DEBOUNCE_TIME_MLS), takeUntilDestroyed(this.destroyRef))
235
+ .subscribe(() => {
236
+ this.stateService.setGqlValues(this.filtersService.gqlFilter);
237
+ });
238
+ }
239
+ updateRegister() {
240
+ this.stateService.setLimit(this.stateService.limit);
241
+ }
242
+ subscribeOnPaging() {
243
+ this._defaultFilterApplied$
244
+ .pipe(take(1), switchMap(() => combineLatest([
245
+ this.stateService.limit$.pipe(rxjsFilter(isNonNull)),
246
+ this.stateService.offset$,
247
+ this.stateService.gqlValues$.pipe(tap((data) => {
248
+ if (Number(data.length) > 0) {
249
+ this.selectChanged(null);
250
+ }
251
+ })),
252
+ this.stateService.sorter$,
253
+ ]).pipe(debounceTime(250))), catchError((e) => {
254
+ console.error('pagination', e);
255
+ return throwError(() => new Error(e));
256
+ }), takeUntilDestroyed(this.destroyRef))
257
+ .subscribe(([limit, offset, gqlFilter, sorter]) => {
258
+ const filter = this.buildFilter(limit, offset, gqlFilter, sorter);
259
+ const gqlFilterUpdated = !_.isEqual(this._filterState, gqlFilter);
260
+ this.currentFilter = filter;
261
+ this._filterState = gqlFilter;
262
+ this._limit = limit;
263
+ this._offset = offset;
264
+ if (this.stateObjects) {
265
+ if (gqlFilterUpdated) {
266
+ this.selectedService?.resetState();
267
+ }
268
+ this.objectsSubscription({ filter, callback: this._setStateObjects.bind(this) });
269
+ }
270
+ else {
271
+ this.objectsSubscription({ filter });
272
+ }
273
+ this.fetchTotalFilteredObjects?.(filter.where);
274
+ });
275
+ }
276
+ _setStateObjects(data) {
277
+ this.selectedService?.loadStateObjects(data);
278
+ }
279
+ selectChanged(value) {
280
+ this._selectionType$.next(value);
281
+ const stateObjects = this.stateObjects;
282
+ if (stateObjects) {
283
+ this._changeStateObjects(stateObjects(), value);
284
+ return;
285
+ }
286
+ const filter = this._selectChangedFilter(value);
287
+ this.currentFilter = filter;
288
+ this.buildActions({
289
+ row: [...(this.selectedObjects ?? [])],
290
+ count: this.selectedObjects ? this.selectedObjects.size : 0,
291
+ });
292
+ if (!filter) {
293
+ return;
294
+ }
295
+ this.selectedRecordsLoading$.next(true);
296
+ this.objectsSubscription({
297
+ filter,
298
+ callback: this._setSelected.bind(this),
299
+ });
300
+ }
301
+ _changeStateObjects(stateObjects, value) {
302
+ if (value === SelectionTypes.ALL) {
303
+ this.updateAllStateObjectsByState(ERegisterObjectState.SELECTED);
304
+ }
305
+ else if (value === SelectionTypes.INVERSE) {
306
+ this._inverseStateObjects(stateObjects);
307
+ }
308
+ else if (value === SelectionTypes.VISIBLE) {
309
+ this._selectVisibleStateObjects();
310
+ }
311
+ else if (typeof value === 'number') {
312
+ this._selectFirstNStateObjects(value);
313
+ }
314
+ else {
315
+ this.clearSelections(this.data);
316
+ }
317
+ this.buildActions({
318
+ row: [...this.selectedObjectsFromState],
319
+ count: this.selectedObjectsFromState.size,
320
+ });
321
+ }
322
+ _inverseStateObjects(stateObjects) {
323
+ for (const [key, { state }] of stateObjects) {
324
+ const inverseState = state === ERegisterObjectState.SELECTED
325
+ ? ERegisterObjectState.UNSELECTED
326
+ : ERegisterObjectState.SELECTED;
327
+ this.updateStateObjectByKey(key, { state: inverseState });
328
+ }
329
+ }
330
+ _selectVisibleStateObjects() {
331
+ this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
332
+ for (const visibleObject of this.visibleData) {
333
+ this.updateStateObjectByKey(visibleObject.id, { state: ERegisterObjectState.SELECTED });
334
+ }
335
+ }
336
+ _selectFirstNStateObjects(value) {
337
+ this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
338
+ if (value > this.limit) {
339
+ const { sorter } = this.stateService;
340
+ const filter = this.buildFilter(value, this.offset, this._filterState, sorter.length > 0 ? sorter : undefined);
341
+ this.objectsSubscription({
342
+ filter,
343
+ callback: this._selectFirstNLoadingObjects.bind(this),
344
+ noSet: true,
345
+ });
346
+ }
347
+ else {
348
+ const firstNObjects = this.data.slice(0, value);
349
+ this._selectFirstNLoadingObjects(firstNObjects);
350
+ }
351
+ }
352
+ _selectFirstNLoadingObjects(objects) {
353
+ for (const object of objects) {
354
+ this.updateStateObjectByKey(object.id, { state: ERegisterObjectState.SELECTED, object });
355
+ }
356
+ }
357
+ filterToggle() {
358
+ this.stateService.toggle();
359
+ }
360
+ onPaginatorChange(paginatorChange) {
361
+ const { rows, first, page } = paginatorChange;
362
+ if (this.stateService.limit !== rows) {
363
+ this.stateService.setLimit(rows);
364
+ this._savePageRowsLimit(rows);
365
+ }
366
+ if (this.stateService.offset !== first - 1) {
367
+ this.stateService.setOffset(first - 1);
368
+ }
369
+ if (this.stateService.page !== page) {
370
+ this.stateService.setPage(page);
371
+ }
372
+ }
373
+ _savePageRowsLimit(pageRowsLimit) {
374
+ this.settingsService
375
+ .upsertReturningOne$(SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT)
376
+ .subscribe((setting) => {
377
+ this._pageRowsLimitSetting = setting || undefined;
378
+ });
379
+ this.settingsService.upsertUserSettingsByUserId({
380
+ settings: {
381
+ id: this._pageRowsLimitSetting?.id,
382
+ settings_type: SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT,
383
+ module_name: this._modulePath,
384
+ settings: { pageRowsLimit },
385
+ },
386
+ hidden: true,
387
+ });
388
+ }
389
+ updateColumnSettings({ settings }) {
390
+ if (settings) {
391
+ this.stickyLeftIds = this._getColumnIdsRecursive(settings.stickyLeft);
392
+ this.stickyRightIds = this._getColumnIdsRecursive(settings.stickyRight, (el) => el.status === EColumnStatus.DEFAULT);
393
+ this.columns = [
394
+ ...this.stickyLeftIds,
395
+ ...this._getColumnIdsRecursive(settings.columns, (el) => el.status === EColumnStatus.DEFAULT),
396
+ ...this.stickyRightIds,
397
+ ];
398
+ }
399
+ this.cdr.markForCheck();
400
+ }
401
+ _getColumnIdsRecursive(columns, predicate) {
402
+ const filteredColumns = predicate
403
+ ? columns.filter((col, index, array) => predicate(col, index, array))
404
+ : columns;
405
+ return filteredColumns.flatMap((column) => {
406
+ const { id, children } = column;
407
+ if (children) {
408
+ return [id, ...this._getColumnIdsRecursive(children, predicate)];
409
+ }
410
+ return [id];
411
+ });
412
+ }
413
+ updateSort(sort) {
414
+ this.stateService.setSorter(sort);
415
+ }
416
+ saveThsWidthToUserSettings(tableColumnsWidth) {
417
+ const settings = this._columnsSettings;
418
+ if (settings) {
419
+ settings.settings.tableColumnsWidth = tableColumnsWidth;
420
+ }
421
+ this.settingsService.upsertUserSettingsByUserId({
422
+ settings: {
423
+ id: this._columnsSettings?.id,
424
+ settings_type: SETTINGS_TYPE.COLUMNS,
425
+ module_name: this._modulePath,
426
+ settings: { ...this._columnsSettings?.settings, tableColumnsWidth },
427
+ },
428
+ hidden: true,
429
+ updateSettings: true,
430
+ });
431
+ }
432
+ get filtersAreOpened() {
433
+ return this.stateService.state.state !== EInputsState.HIDDEN;
434
+ }
435
+ _subscribeOnMutationCompleted() {
436
+ this.actionCompleted$
437
+ .pipe(takeUntilDestroyed(this.destroyRef))
438
+ .subscribe(() => this.actionCompleted());
439
+ }
440
+ _initDefaultFilter(queryFilters) {
441
+ this.settingsService
442
+ .fetchUserSettings$({
443
+ id_user: {
444
+ _eq: this._user.id,
445
+ },
446
+ settings_type: {
447
+ _in: [SETTINGS_TYPE.FILTER, SETTINGS_TYPE.REGISTER_PINNED_INPUTS],
448
+ },
449
+ module_name: {
450
+ _eq: this._modulePath,
451
+ },
452
+ })
453
+ .pipe(take(1))
454
+ .subscribe((userSettings) => {
455
+ const pinnedFilter = userSettings.find(({ settings_type: type }) => type === SETTINGS_TYPE.REGISTER_PINNED_INPUTS);
456
+ const isPinned = !!pinnedFilter?.settings.pinned;
457
+ const favoriteFilter = userSettings.find(({ settings }) => settings.favorite);
458
+ if (isPinned) {
459
+ this.stateService.setPin(true);
460
+ this.stateService.setState({
461
+ state: EInputsState.FILTER_LIST,
462
+ action: EInputsAction.APPLY_SAVED_FILTER,
463
+ });
464
+ }
465
+ if (queryFilters || this.searchInput?.getRawValue()) {
466
+ this.applyFilters(queryFilters ?? []);
467
+ }
468
+ else if (pinnedFilter && isPinned) {
469
+ this._applyFilterSettings(pinnedFilter);
470
+ }
471
+ else if (favoriteFilter) {
472
+ this._applyFilterSettings(favoriteFilter);
473
+ }
474
+ this._defaultFilterApplied$.next(true);
475
+ });
476
+ }
477
+ _applyFilterSettings(settings) {
478
+ this.filtersService.setUserSettingsFilterValues(settings.settings.filter ?? []);
479
+ const { gqlFilter } = this.filtersService;
480
+ this.stateService.setGqlValues(gqlFilter);
481
+ this.stateService.setState({
482
+ state: EInputsState.HIDDEN,
483
+ action: EInputsAction.APPLY_SAVED_FILTER,
484
+ });
485
+ }
486
+ _selectChangedFilter(selection) {
487
+ let filter = null;
488
+ if (selection === null) {
489
+ this.clearSelections();
490
+ return;
491
+ }
492
+ if (selection === SelectionTypes.ALL || typeof selection === 'number') {
493
+ filter = this._handleAllOrNumberSelection(selection);
494
+ }
495
+ else if (selection === SelectionTypes.VISIBLE) {
496
+ this._selectVisibleItems();
497
+ }
498
+ else if (selection === SelectionTypes.INVERSE) {
499
+ filter = this._handleInverseSelection();
500
+ }
501
+ return filter;
502
+ }
503
+ _handleAllOrNumberSelection(selection) {
504
+ let filter = null;
505
+ const { sorter } = this.stateService;
506
+ if (selection === SelectionTypes.ALL) {
507
+ filter = this.buildFilter(undefined, undefined, this._filterState);
508
+ }
509
+ else if (typeof selection === 'number') {
510
+ if (selection > this.limit) {
511
+ filter = this.buildFilter(selection, 0, this._filterState, sorter.length > 0 ? sorter : undefined);
512
+ }
513
+ else {
514
+ this._selectFirstNItems(selection);
515
+ }
516
+ }
517
+ return filter;
518
+ }
519
+ _selectFirstNItems(count) {
520
+ this.selectedObjects = new Set(this.data.slice(0, count));
521
+ this.selectedIds = new Set(this.data.map((d) => d.id).slice(0, count));
522
+ }
523
+ _selectVisibleItems() {
524
+ this.selectedObjects = new Set(this.visibleData);
525
+ this.selectedIds = new Set(this.visibleData.map((d) => d.id));
526
+ }
527
+ _handleInverseSelection() {
528
+ const inverseFilter = { id: { _nin: [...this.selectedIds] } };
529
+ const updatedFilterState = Array.isArray(this._filterState)
530
+ ? [...this._filterState, inverseFilter]
531
+ : [this._filterState, inverseFilter];
532
+ return this.buildFilter(undefined, undefined, updatedFilterState);
533
+ }
534
+ _setSelected(data) {
535
+ this.selectedObjects = new Set(data);
536
+ this.selectedIds = new Set(data.map((d) => d.id));
537
+ this.selectedRecordsLoading$.next(false);
538
+ }
539
+ parseToFilters(input) {
540
+ return Object.entries(input).map(([key, value]) => ({
541
+ id: key,
542
+ value,
543
+ }));
544
+ }
545
+ get selectedCount() {
546
+ const selectedSize = this.selectedService?.selectedValues()?.size ?? null;
547
+ const unselectedSize = this.selectedService?.unselectedValues()?.size ?? 0;
548
+ const unfetchedObjects = this.selectedService?.stateUnfetchedObjects();
549
+ const isNotSelected = unfetchedObjects !== ERegisterObjectState.SELECTED;
550
+ if (selectedSize === null) {
551
+ return this.selectedIds.size;
552
+ }
553
+ return isNotSelected ? selectedSize : this.dataCount - unselectedSize;
554
+ }
555
+ _getDefaultColumnsRecursive(columnsData) {
556
+ return columnsData.flatMap((column) => {
557
+ const { name, children } = column;
558
+ if (children) {
559
+ return [name, ...this._getDefaultColumnsRecursive(children)];
560
+ }
561
+ return [name];
562
+ });
563
+ }
564
+ get notAllFetched() {
565
+ const unfetchedState = this.selectedService.stateUnfetchedObjects();
566
+ const allFetched = this.stateObjects().size === this.dataCount;
567
+ return unfetchedState === ERegisterObjectState.SELECTED && !allFetched;
568
+ }
569
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
570
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: RegisterBase, ngImport: i0 }); }
571
+ }
572
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterBase, decorators: [{
573
+ type: Directive
574
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: undefined }] });
575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29yZS9yZWdpc3Rlci1iYXNlL3JlZ2lzdGVyLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sR0FJUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLElBQUksVUFBVSxFQUNwQixHQUFHLEVBRUgsYUFBYSxFQUViLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxvQkFBb0IsRUFPcEIsYUFBYSxFQUNiLFlBQVksR0FHYixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sOERBQThELENBQUM7QUFPdEUsT0FBTyxFQUVMLGNBQWMsR0FDZixNQUFNLDREQUE0RCxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QiwyQkFBMkIsR0FDNUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsb0JBQW9CLEdBQ3JCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENB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QkFDYixPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFjLGFBQWE7UUFDekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNyRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBYSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFaEUsT0FBTyxjQUFjLEtBQUssb0JBQW9CLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pFLENBQUM7K0dBendCbUIsWUFBWTttR0FBWixZQUFZOzs0RkFBWixZQUFZO2tCQURqQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBmaWx0ZXIgYXMgcnhqc0ZpbHRlcixcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBSZXBsYXlTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEVSZWdpc3Rlck9iamVjdFN0YXRlLFxuICBJUmVnaXN0ZXJCYXNlLFxuICBJUmVnaXN0ZXJPYmplY3QsXG4gIElUcFVzZXJTZXR0aW5ncyxcbiAgSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXIsXG4gIE9iamVjdHNTdWJzY3JpcHRpb25Db25maWcsXG4gIElVc2VyUHJvZmlsZSxcbiAgRUlucHV0c0FjdGlvbixcbiAgRUlucHV0c1N0YXRlLFxuICBHcWxGaWVsZCxcbiAgR3FsRmllbGRzLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge1xuICBFQ29sdW1uU3RhdHVzLFxuICBJQ29sdW1uU2V0dGluZ3MsXG4gIElDb2x1bW5TZXR0aW5nc0NoYW5nZXMsXG59IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXNldHRpbmdzL3R5cGVzL2NvbHVtbi1zZXR0aW5ncy50eXBlcyc7XG5pbXBvcnQge1xuICBJQ29sdW1uRGF0YSxcbiAgSUhhc3VyYVF1ZXJ5RmlsdGVyLFxuICBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcixcbiAgVGhXaWR0aEVudHJ5LFxufSBmcm9tICcuLi8uLi9jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIEFwcGx5U2VsZWN0aW9uVHlwZXMsXG4gIFNlbGVjdGlvblR5cGVzLFxufSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NoZWNrYm94LXNlbGVjdG9yL2NoZWNrYm94LXNlbGVjdG9yLnR5cGVzJztcbmltcG9ydCB7XG4gIEZpbHRlcnNTdGF0ZVNlcnZpY2UsXG4gIEZpbHRlcnNTZXJ2aWNlLFxuICBGaWx0ZXJzVHJhbnNtaXRTZXJ2aWNlLFxuICBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2UsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gIFNFQVJDSF9JTlBVVF9ERUJPVU5DRV9USU1FX01MUyxcbiAgU0VUVElOR1NfVFlQRSxcbiAgVVNFUl9QUk9GSUxFX0xPQURFUixcbiAgVVNFUl9TRVRUSU5HU19MT0FERVIsXG59IGZyb20gJy4uLy4uL2NvbnN0cy9yZWdpc3Rlci1iYXNlLmNvbnN0cyc7XG5pbXBvcnQgeyBnZXRMYXN0U2VnbWVudE9mUGF0aE5hbWUsIGlzTm9uTnVsbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IEZvcm1Hcm91cFdyYXBwZXIgfSBmcm9tICcuLi9mb3JtLWdyb3VwLXdyYXBwZXInO1xuaW1wb3J0IHsgREVGQVVMVF9MSU1JVCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2lucHV0cy1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTY2FsYXJVVUlEIH0gZnJvbSAnaGFzdXJhJztcbmltcG9ydCB7IFJlZ2lzdGVyQmFzZVN0b3JlIH0gZnJvbSAnLi9yZWdpc3Rlci1iYXNlLnN0b3JlJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVnaXN0ZXJCYXNlPFQgZXh0ZW5kcyBJUmVnaXN0ZXJCYXNlLCBGb3JtID0gYW55PlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKiDQodC10YDQstC40YHRiyDRg9C/0YDQsNCy0LvQtdC90LjRjyDRhNC40LvRjNGC0YDQsNC80LggKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlcnNTZXJ2aWNlID0gaW5qZWN0KEZpbHRlcnNTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0YXRlU2VydmljZSA9IGluamVjdChGaWx0ZXJzU3RhdGVTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zbWl0dGVyID0gaW5qZWN0KEZpbHRlcnNUcmFuc21pdFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIC8qKiDQodC10YDQstC40YEg0YPQv9GA0LDQstC70LXQvdC40Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C10LwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHVzZXJTZXJ2aWNlID0gaW5qZWN0KFVTRVJfUFJPRklMRV9MT0FERVIpO1xuICAvKiog0KHQtdGA0LLQuNGBINGD0L/RgNCw0LLQu9C10L3QuNGPINC00LDQvdC90YvQvNC4INCyINGA0LXQtdGB0YLRgNC1ICovXG4gIHByb3RlY3RlZCByZWFkb25seSBiYXNlU3RvcmUgPSBpbmplY3QoUmVnaXN0ZXJCYXNlU3RvcmU8VD4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIC8vIFRPRE8g0YPQtNCw0LvQuNGC0Ywgb3B0aW9uYWw6IHRydWUg0L/QvtGB0LvQtSDQstGL0L/QvtC70L3QtdC90LjRjyDQt9Cw0LTQsNGH0LggU01BMi0zMTM0XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZFNlcnZpY2UgPSBpbmplY3QoU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlPFQ+LCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuICAvLyBUT0RPIHByb3RlY3RlZCByZWFkb25seSBuYXZpZ2F0aW9uU2VydmljZSA9IGluamVjdChOYXZpZ2F0aW9uU2VydmljZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KFVTRVJfU0VUVElOR1NfTE9BREVSKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyQXBwbGllZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0YXRlU2VydmljZS5ncWxWYWx1ZXMkLnBpcGUoXG4gICAgbWFwKChmaWx0ZXIpID0+IE51bWJlcihmaWx0ZXIubGVuZ3RoKSA+IDApXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlJCA9IHRoaXMuc3RhdGVTZXJ2aWNlLnBhZ2UkO1xuICBwdWJsaWMgcmVhZG9ubHkgbGltaXQkID0gdGhpcy5zdGF0ZVNlcnZpY2UubGltaXQkO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ZWRSZWNvcmRzTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBwdWJsaWMgY29sdW1uc0RhdGE6IElDb2x1bW5EYXRhW107XG4gIHB1YmxpYyBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgcHVibGljIGRhdGE6IFRbXSA9IFtdO1xuICBwdWJsaWMgdmlzaWJsZURhdGE6IFRbXSA9IFtdO1xuICBwdWJsaWMgZGF0YUNvdW50ID0gMDtcbiAgLyoqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc2VsZWN0ZWRPYmplY3RzRnJvbVN0YXRlICovXG4gIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSBuZXcgU2V0PGFueT4oKTtcbiAgLyoqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc2VsZWN0ZWRJZHNGcm9tU3RhdGUgKi9cbiAgcHVibGljIHNlbGVjdGVkSWRzID0gbmV3IFNldDxTY2FsYXJVVUlEPigpO1xuICBwdWJsaWMgX3VzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJQcm9maWxlKCk7XG4gIHB1YmxpYyBzdGlja3lMZWZ0SWRzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgc3RpY2t5UmlnaHRJZHM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBjdXJyZW50RmlsdGVyOiBJSGFzdXJhUXVlcnlGaWx0ZXI8VD4gfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqINCk0L7RgNC80LAg0YTQuNC70YzRgtGA0L7QslxuICAgKi9cbiAgcHJvdGVjdGVkIGZpbHRlcnNGb3JtITogRm9ybUdyb3VwV3JhcHBlcjxGb3JtPjtcbiAgcHJvdGVjdGVkIGZpbHRlclN0YXRlOiBJVHBVc2VyU2V0dGluZ3NTZXR0aW5nc0ZpbHRlcltdID0gW107XG5cbiAgcHJpdmF0ZSBfbGltaXQhOiBudW1iZXI7XG4gIHByaXZhdGUgX29mZnNldCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUhOiBHcWxGaWVsZHM7XG4gIHByaXZhdGUgX21vZHVsZVBhdGggPSBnZXRMYXN0U2VnbWVudE9mUGF0aE5hbWUodGhpcy5yb3V0ZXIudXJsKTtcbiAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlckFwcGxpZWQkID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgLyoqXG4gICAqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LksINCx0LXQtyDRg9GH0LXRgtCwINGE0LjQu9GM0YLRgNCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgdG90YWxOb3RGaWx0ZXJlZCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqXG4gICAqINCc0LDRgNGI0YDRg9GC0Ysg0LTQu9GPINCx0YDQtdC00LrRgNCw0LzQsdCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3Qgcm91dGVzOiBhbnlbXTtcbiAgLyoqXG4gICAqINCa0L7QvdGC0YDQvtC7INGB0YLRgNC+0LrQuCDQv9C+0LjRgdC60LBcbiAgICovXG4gIHB1YmxpYyBzZWFyY2hJbnB1dCA9IHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2VhcmNoSW5wdXQhO1xuICAvKipcbiAgICog0JTQtdC50YHRgtCy0LjQtSDQt9Cw0LLQtdGA0YjQtdC90L5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBhY3Rpb25Db21wbGV0ZWQkOiBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+O1xuICAvKipcbiAgICog0J/QvtC70YPRh9C10L3QuNC1INC+0LHRidC10LPQviDQutC+0LvQuNGH0LXRgdGC0LLQsCDQt9Cw0L/QuNGB0LXQuVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGZldGNoVG90YWxPYmplY3RzOiAoXG4gICAgb2JzZXJ2YWJsZU9yVmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICkgPT4gU3Vic2NyaXB0aW9uO1xuICAvKipcbiAgICog0JfQsNC/0YDQvtGBINC90LAg0LrQvtC70LjRh9C10YHRgtCy0L4g0L7RgtGE0LjQu9GM0YLRgNC+0LLQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqL1xuICBwdWJsaWMgZmV0Y2hUb3RhbEZpbHRlcmVkT2JqZWN0czpcbiAgICB8ICgob2JzZXJ2YWJsZU9yVmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIGFueT4+KSA9PiBTdWJzY3JpcHRpb24pXG4gICAgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiDQn9C+0LTQv9C40YHQutCwINC90LAg0L/QvtC70YPRh9C10L3QuNC1INCy0YHQtdGFINC+0LHRitC10LrRgtC+0LIg0Lgg0YEg0L7QsdGA0LDRgtC90YvQvCDQstGL0LfQvtCy0L7QvFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IG9iamVjdHNTdWJzY3JpcHRpb246IChcbiAgICBvYnNlcnZhYmxlT3JWYWx1ZTogT2JqZWN0c1N1YnNjcmlwdGlvbkNvbmZpZzxUPiB8IE9ic2VydmFibGU8T2JqZWN0c1N1YnNjcmlwdGlvbkNvbmZpZzxUPj5cbiAgKSA9PiBTdWJzY3JpcHRpb247XG4gIC8qKlxuICAgKiDQkdCw0LfQvtCy0YvQuSDRhNC40LvRjNGC0YAsINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYmFzZUZpbHRlcjogKHVzZXI6IElVc2VyUHJvZmlsZSB8IHVuZGVmaW5lZCkgPT4gUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAvKipcbiAgICog0KHQsdC+0YDQutCwINGE0LjQu9GM0YLRgNCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYnVpbGRGaWx0ZXIoXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgb2Zmc2V0PzogbnVtYmVyLFxuICAgIGdxbEZpbHRlcj86IEdxbEZpZWxkcyxcbiAgICBzb3J0ZXI/OiBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxUPltdXG4gICk6IGFueTtcblxuICAvKipcbiAgICog0KHQsdC+0YDQutCwINGE0LjQu9GM0YLRgNC+0LIg0YDQtdC10YHRgtGA0LBcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgYnVpbGRGb3JtKCk6IEZvcm1Hcm91cFdyYXBwZXI8Rm9ybT47XG5cbiAgcHVibGljIGdldCBsaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX29mZnNldDtcbiAgfVxuXG4gIC8qKiBVdWlkJ9GLINCy0YHQtdGFINCy0YvQsdGA0LDQvdC90YvRhSDQuNC70Lgg0LjRgdC60LvRjtGH0LDQtdC80YvRhSDQvtCx0YrQtdC60YLQvtCyINGA0LXQtdGB0YLRgNCwICjQt9Cw0LLQuNGB0LjRgiDQvtGCINGB0L7RgdGC0L7Rj9C90LjRjyDQtdGJ0LUg0L3QtSDQt9Cw0LPRgNGD0LbQtdC90L3Ri9GFINC+0LHRitC10LrRgtC+0LIpICovXG4gIHB1YmxpYyBnZXQgaWRzRnJvbVN0YXRlKCk6IFNldDxTY2FsYXJVVUlEPiB7XG4gICAgY29uc3Qgc2VydmljZTogU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlPFQ+IHwgbnVsbCA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlO1xuXG4gICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbGVjdGVkT2JqZWN0c1N0YXRlU2VydmljZSDQvdC1INC30LDQv9GA0L7QstCw0LnQttC10L0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmljZS5rZXlzKCk7XG4gIH1cblxuICAvKiog0JLRgdC1INCy0YvQsdGA0LDQvdC90YvQtSB1dWlkJ9GLINGA0LXQtdGB0YLRgNCwICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJZHNGcm9tU3RhdGUoKTogU2V0PFNjYWxhclVVSUQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlOiBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2U8VD4gfCBudWxsID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U7XG5cbiAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlINC90LUg0LfQsNC/0YDQvtCy0LDQudC20LXQvScpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdGVkS2V5cygpO1xuICB9XG5cbiAgLyoqINCS0YHQtSDQstGL0LHRgNCw0L3QvdGL0LUg0L7QsdGK0LXQutGC0Ysg0YDQtdC10YHRgtGA0LAgKi9cbiAgcHVibGljIGdldCBzZWxlY3RlZE9iamVjdHNGcm9tU3RhdGUoKTogU2V0PFQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlOiBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2U8VD4gfCBudWxsID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U7XG5cbiAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlINC90LUg0LfQsNC/0YDQvtCy0LDQudC20LXQvScpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdGVkVmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5zU2V0dGluZ3M6IElUcFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcGFnZVJvd3NMaW1pdFNldHRpbmc6IElUcFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0Q29sdW1uc1dpZHRoczogTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3Rpb25UeXBlJCA9XG4gICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNlbGVjdGlvblR5cGUkID8/IG5ldyBCZWhhdmlvclN1YmplY3Q8QXBwbHlTZWxlY3Rpb25UeXBlcz4obnVsbCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlT2JqZWN0cyA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5zdGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcbiAgICBjb2x1bW5zRGF0YTogSUNvbHVtbkRhdGFbXVxuICApIHtcbiAgICB0aGlzLmNvbHVtbnNEYXRhID0gY29sdW1uc0RhdGE7XG4gICAgdGhpcy5fZGVmYXVsdENvbHVtbnNXaWR0aHMgPSBuZXcgTWFwKGNvbHVtbnNEYXRhLm1hcCgoY29sKSA9PiBbY29sLm5hbWUsIGNvbC53aWR0aF0pKTtcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl9nZXREZWZhdWx0Q29sdW1uc1JlY3Vyc2l2ZShjb2x1bW5zRGF0YSk7XG4gICAgdGhpcy5fc3Vic2NyaWJlT25TZXR0aW5ncygpO1xuICAgIHRoaXMuX2ZldGNoU2F2ZWRQYWdlUm93c0xpbWl0KCk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpPy5leHRyYXM/LnN0YXRlO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJTdGF0ZSA9IHRoaXMucGFyc2VUb0ZpbHRlcnMoc3RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3N1YnNjcmliZU9uU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MkXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt1c2VyU2V0dGluZ10pID0+IHtcbiAgICAgICAgY29uc3QgeyB0YWJsZUNvbHVtbnNXaWR0aCB9ID0gdXNlclNldHRpbmc/LnNldHRpbmdzID8/IHt9O1xuICAgICAgICBjb25zdCB0eXBlID0gdXNlclNldHRpbmc/LnNldHRpbmdzX3R5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgJiYgdHlwZSAhPT0gU0VUVElOR1NfVFlQRS5DT0xVTU5TKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW5lZEN1cnJlbnQgPSB0aGlzLl9vbWl0VW5kZWZpbmVkKFxuICAgICAgICAgIHRoaXMuX2NvbHVtbnNTZXR0aW5ncz8uc2V0dGluZ3MudGFibGVDb2x1bW5zV2lkdGhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY2xlYW5lZE5ldyA9IHRoaXMuX29taXRVbmRlZmluZWQodGFibGVDb2x1bW5zV2lkdGgpO1xuXG4gICAgICAgIGlmICghXy5pc0VxdWFsKGNsZWFuZWRDdXJyZW50LCBjbGVhbmVkTmV3KSkge1xuICAgICAgICAgIHRoaXMuX3NldENvbHVtbnNXaWR0aCh0YWJsZUNvbHVtbnNXaWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb2x1bW5zU2V0dGluZ3MgPSB1c2VyU2V0dGluZztcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb21pdFVuZGVmaW5lZChhcnI6IFRoV2lkdGhFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIF8ubWFwKGFyciA/PyBbXSwgKG9iaikgPT4gXy5vbWl0Qnkob2JqLCBfLmlzVW5kZWZpbmVkKSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDb2x1bW5zV2lkdGgoY29sdW1uc1dpZHRoOiBUaFdpZHRoRW50cnlbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IHRoc1dpZHRoTWFwID0gbmV3IE1hcChjb2x1bW5zV2lkdGg/Lm1hcCgoeyBuYW1lLCB3aWR0aCB9KSA9PiBbbmFtZSwgd2lkdGhdKSk7XG5cbiAgICB0aGlzLmNvbHVtbnNEYXRhID0gdGhpcy5jb2x1bW5zRGF0YS5tYXAoKGNvbCkgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gdGhpcy5fZGVmYXVsdENvbHVtbnNXaWR0aHMuZ2V0KGNvbC5uYW1lKSE7XG4gICAgICBjb25zdCBjdXJyZW50V2lkdGggPSB0aHNXaWR0aE1hcC5oYXMoY29sLm5hbWUpID8gdGhzV2lkdGhNYXAuZ2V0KGNvbC5uYW1lKSA6IG51bGw7XG5cbiAgICAgIGNvbnN0IHdpZHRoID0gY3VycmVudFdpZHRoID09PSBudWxsID8gZGVmYXVsdFdpZHRoIDogY3VycmVudFdpZHRoO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb2wsXG4gICAgICAgIHdpZHRoLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZldGNoU2F2ZWRQYWdlUm93c0xpbWl0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3NTZXJ2aWNlXG4gICAgICAuZmV0Y2hVc2VyU2V0dGluZ3MkKFxuICAgICAgICB7XG4gICAgICAgICAgaWRfdXNlcjoge1xuICAgICAgICAgICAgX2VxOiB0aGlzLl91c2VyLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0dGluZ3NfdHlwZToge1xuICAgICAgICAgICAgX2VxOiBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BBR0VfUk9XU19MSU1JVCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vZHVsZV9uYW1lOiB7XG4gICAgICAgICAgICBfZXE6IHRoaXMuX21vZHVsZVBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW2ZpcnN0U2V0dGluZ10pID0+IHtcbiAgICAgICAgdGhpcy5fcGFnZVJvd3NMaW1pdFNldHRpbmcgPSBmaXJzdFNldHRpbmc7XG4gICAgICAgIGNvbnN0IHsgcGFnZVJvd3NMaW1pdCB9ID0gZmlyc3RTZXR0aW5nPy5zZXR0aW5ncyA/PyB7fTtcblxuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRMaW1pdChwYWdlUm93c0xpbWl0ID8/IERFRkFVTFRfTElNSVQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJzRm9ybSA9IHRoaXMuYnVpbGRGb3JtO1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2UuaW5pdCh0aGlzLmZpbHRlcnNGb3JtKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRTdGF0ZSh7IHN0YXRlOiBFSW5wdXRzU3RhdGUuSElEREVOLCBhY3Rpb246IEVJbnB1dHNBY3Rpb24uT1BFTiB9KTtcblxuICAgIHRoaXMuZmV0Y2hUb3RhbE9iamVjdHModGhpcy5iYXNlRmlsdGVyKHRoaXMuX3VzZXIpKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVPbk11dGF0aW9uQ29tcGxldGVkKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVPblBhZ2luZygpO1xuXG4gICAgLy8gVE9ETyDQv9GA0L7QstC10YDQuNGC0Ywg0L3Rg9C20L3QsCDQu9C4INCf0LXRgNC10LfQsNCz0YDRg9C30LrQsCDRgdGC0YDQsNC90LjRhtGLXG4gICAgLy8gaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UucHJldmlvdXNVcmwgPT09IG51bGwpIHtcbiAgICAvLyAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE9mZnNldCgwKTtcbiAgICAvLyAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldFBhZ2UoMSk7XG4gICAgLy8gfVxuXG4gICAgdGhpcy5iYXNlU3RvcmU/LmNvdW50JD8uc3Vic2NyaWJlKChjb3VudCkgPT4ge1xuICAgICAgdGhpcy5kYXRhQ291bnQgPSBjb3VudDtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldENvdW50KGNvdW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoc2VhcmNoTGltaXRlciA9IDIpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVPblNlYXJjaENoYW5nZXMoc2VhcmNoTGltaXRlcik7XG4gIH1cblxuICBwcml2YXRlIF9zZXRGaWx0ZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5RmlsdGVycyA9IHRoaXMudHJhbnNtaXR0ZXI/LmZpbHRlcnM7XG4gICAgY29uc3QgcXVlcnlTZWFyY2ggPSB0aGlzLnRyYW5zbWl0dGVyPy5zZWFyY2g7XG4gICAgbGV0IGZpbHRlcnM6IElUcFVzZXJTZXR0aW5nc1NldHRpbmdzRmlsdGVyW10gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocXVlcnlTZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuc2V0VmFsdWUocXVlcnlTZWFyY2gpO1xuICAgIH1cblxuICAgIGlmICghcXVlcnlGaWx0ZXJzIHx8IHF1ZXJ5RmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWx0ZXJzID0gcXVlcnlGaWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbHlCYXNlRmlsdGVyKCk7XG4gICAgdGhpcy5faW5pdERlZmF1bHRGaWx0ZXIoZmlsdGVycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlCYXNlRmlsdGVyKF9kYXRhPzogYW55KTogdm9pZCB7fVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNvbXBsZXRlZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5maWx0ZXJzU2VydmljZS5jbGVhcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE9mZnNldCgwKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRHcWxWYWx1ZXMoe30pO1xuXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQ/LnZhbHVlKSB7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRTZWFyY2hGaWx0ZXJWYWx1ZSgnJyk7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRHcWxWYWx1ZXModGhpcy5maWx0ZXJzU2VydmljZS5ncWxGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhcHBseUZpbHRlcnMoZmlsdGVyczogSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXJbXSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2V0VXNlclNldHRpbmdzRmlsdGVyVmFsdWVzKGZpbHRlcnMpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEdxbFZhbHVlcyh0aGlzLmZpbHRlcnNTZXJ2aWNlLmdxbEZpbHRlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0RGF0YShkYXRhOiBUW10sIGNvdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgIGlmIChjb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRhdGFDb3VudCA9IGNvdW50O1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0Q291bnQoY291bnQpO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGU6IEVSZWdpc3Rlck9iamVjdFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNldEFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5OiBTY2FsYXJVVUlELCB1cGRhdGVzOiBQYXJ0aWFsPElSZWdpc3Rlck9iamVjdDxUPj4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2V0U3RhdGVPYmplY3RCeUtleShrZXksIHVwZGF0ZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyU2VsZWN0aW9ucyhkYXRhPzogVFtdKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzLmNsZWFyKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5yZXNldFN0YXRlKGRhdGEpO1xuICAgICAgdGhpcy5idWlsZEFjdGlvbnMoe1xuICAgICAgICByb3c6IFtdLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25Db21wbGV0ZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5idWlsZEZpbHRlcih0aGlzLmxpbWl0LCB0aGlzLm9mZnNldCwgdGhpcy5fZmlsdGVyU3RhdGUpO1xuICAgIHRoaXMuY3VycmVudEZpbHRlciA9IGZpbHRlcjtcblxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7XG4gICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHsgZmlsdGVyIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkQWN0aW9ucyhfZGF0YTogeyByb3c6IFRbXTsgY291bnQ6IG51bWJlciB9KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblNlYXJjaENoYW5nZXMobGltaXRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hJbnB1dD8udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgcnhqc0ZpbHRlcigodmFsdWUpID0+ICF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPiBsaW1pdGVyKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKFNFQVJDSF9JTlBVVF9ERUJPVU5DRV9USU1FX01MUyksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0R3FsVmFsdWVzKHRoaXMuZmlsdGVyc1NlcnZpY2UuZ3FsRmlsdGVyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlZ2lzdGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldExpbWl0KHRoaXMuc3RhdGVTZXJ2aWNlLmxpbWl0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJzY3JpYmVPblBhZ2luZygpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWZhdWx0RmlsdGVyQXBwbGllZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmxpbWl0JC5waXBlKHJ4anNGaWx0ZXIoaXNOb25OdWxsKSksXG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5vZmZzZXQkLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuZ3FsVmFsdWVzJC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGRhdGEubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hhbmdlZChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc29ydGVyJCxcbiAgICAgICAgICBdKS5waXBlKGRlYm91bmNlVGltZSgyNTApKVxuICAgICAgICApLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigncGFnaW5hdGlvbicsIGUpO1xuXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGUpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbbGltaXQsIG9mZnNldCwgZ3FsRmlsdGVyLCBzb3J0ZXJdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIobGltaXQsIG9mZnNldCwgZ3FsRmlsdGVyLCBzb3J0ZXIpO1xuICAgICAgICBjb25zdCBncWxGaWx0ZXJVcGRhdGVkID0gIV8uaXNFcXVhbCh0aGlzLl9maWx0ZXJTdGF0ZSwgZ3FsRmlsdGVyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyID0gZmlsdGVyO1xuICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZSA9IGdxbEZpbHRlcjtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZU9iamVjdHMpIHtcbiAgICAgICAgICBpZiAoZ3FsRmlsdGVyVXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnJlc2V0U3RhdGUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9iamVjdHNTdWJzY3JpcHRpb24oeyBmaWx0ZXIsIGNhbGxiYWNrOiB0aGlzLl9zZXRTdGF0ZU9iamVjdHMuYmluZCh0aGlzKSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9iamVjdHNTdWJzY3JpcHRpb24oeyBmaWx0ZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaFRvdGFsRmlsdGVyZWRPYmplY3RzPy4oZmlsdGVyLndoZXJlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U3RhdGVPYmplY3RzKGRhdGE6IFRbXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5sb2FkU3RhdGVPYmplY3RzKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdENoYW5nZWQodmFsdWU6IEFwcGx5U2VsZWN0aW9uVHlwZXMpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25UeXBlJC5uZXh0KHZhbHVlKTtcblxuICAgIGNvbnN0IHN0YXRlT2JqZWN0cyA9IHRoaXMuc3RhdGVPYmplY3RzO1xuXG4gICAgaWYgKHN0YXRlT2JqZWN0cykge1xuICAgICAgdGhpcy5fY2hhbmdlU3RhdGVPYmplY3RzKHN0YXRlT2JqZWN0cygpLCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9zZWxlY3RDaGFuZ2VkRmlsdGVyKHZhbHVlKTtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIgPSBmaWx0ZXI7XG5cbiAgICB0aGlzLmJ1aWxkQWN0aW9ucyh7XG4gICAgICByb3c6IFsuLi4odGhpcy5zZWxlY3RlZE9iamVjdHMgPz8gW10pXSxcbiAgICAgIGNvdW50OiB0aGlzLnNlbGVjdGVkT2JqZWN0cyA/IHRoaXMuc2VsZWN0ZWRPYmplY3RzLnNpemUgOiAwLFxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWx0ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHtcbiAgICAgIGZpbHRlcixcbiAgICAgIGNhbGxiYWNrOiB0aGlzLl9zZXRTZWxlY3RlZC5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlU3RhdGVPYmplY3RzKFxuICAgIHN0YXRlT2JqZWN0czogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdDxUPj4sXG4gICAgdmFsdWU6IEFwcGx5U2VsZWN0aW9uVHlwZXNcbiAgKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBTZWxlY3Rpb25UeXBlcy5BTEwpIHtcbiAgICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gU2VsZWN0aW9uVHlwZXMuSU5WRVJTRSkge1xuICAgICAgdGhpcy5faW52ZXJzZVN0YXRlT2JqZWN0cyhzdGF0ZU9iamVjdHMpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFNlbGVjdGlvblR5cGVzLlZJU0lCTEUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFZpc2libGVTdGF0ZU9iamVjdHMoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuX3NlbGVjdEZpcnN0TlN0YXRlT2JqZWN0cyh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZEFjdGlvbnMoe1xuICAgICAgcm93OiBbLi4udGhpcy5zZWxlY3RlZE9iamVjdHNGcm9tU3RhdGVdLFxuICAgICAgY291bnQ6IHRoaXMuc2VsZWN0ZWRPYmplY3RzRnJvbVN0YXRlLnNpemUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbnZlcnNlU3RhdGVPYmplY3RzKHN0YXRlT2JqZWN0czogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdDxUPj4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHsgc3RhdGUgfV0gb2Ygc3RhdGVPYmplY3RzKSB7XG4gICAgICBjb25zdCBpbnZlcnNlU3RhdGUgPVxuICAgICAgICBzdGF0ZSA9PT0gRVJlZ2lzdGVyT2JqZWN0U3RhdGUuU0VMRUNURURcbiAgICAgICAgICA/IEVSZWdpc3Rlck9iamVjdFN0YXRlLlVOU0VMRUNURURcbiAgICAgICAgICA6IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5LCB7IHN0YXRlOiBpbnZlcnNlU3RhdGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0VmlzaWJsZVN0YXRlT2JqZWN0cygpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoRVJlZ2lzdGVyT2JqZWN0U3RhdGUuVU5TRUxFQ1RFRCk7XG4gICAgZm9yIChjb25zdCB2aXNpYmxlT2JqZWN0IG9mIHRoaXMudmlzaWJsZURhdGEpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVPYmplY3RCeUtleSh2aXNpYmxlT2JqZWN0LmlkLCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RGaXJzdE5TdGF0ZU9iamVjdHModmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5VTlNFTEVDVEVEKTtcblxuICAgIGlmICh2YWx1ZSA+IHRoaXMubGltaXQpIHtcbiAgICAgIGNvbnN0IHsgc29ydGVyIH0gPSB0aGlzLnN0YXRlU2VydmljZTtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLm9mZnNldCxcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUsXG4gICAgICAgIHNvcnRlci5sZW5ndGggPiAwID8gc29ydGVyIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHtcbiAgICAgICAgZmlsdGVyLFxuICAgICAgICBjYWxsYmFjazogdGhpcy5fc2VsZWN0Rmlyc3ROTG9hZGluZ09iamVjdHMuYmluZCh0aGlzKSxcbiAgICAgICAgbm9TZXQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlyc3ROT2JqZWN0cyA9IHRoaXMuZGF0YS5zbGljZSgwLCB2YWx1ZSk7XG4gICAgICB0aGlzLl9zZWxlY3RGaXJzdE5Mb2FkaW5nT2JqZWN0cyhmaXJzdE5PYmplY3RzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RGaXJzdE5Mb2FkaW5nT2JqZWN0cyhvYmplY3RzOiBUW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBvYmplY3RzKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkob2JqZWN0LmlkLCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCwgb2JqZWN0IH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJUb2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UudG9nZ2xlKCk7XG4gIH1cblxuICBwdWJsaWMgb25QYWdpbmF0b3JDaGFuZ2UocGFnaW5hdG9yQ2hhbmdlOiB7XG4gICAgZmlyc3Q6IG51bWJlcjtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcGFnZXNDb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICByb3dzOiBudW1iZXI7XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCB7IHJvd3MsIGZpcnN0LCBwYWdlIH0gPSBwYWdpbmF0b3JDaGFuZ2U7XG5cbiAgICBpZiAodGhpcy5zdGF0ZVNlcnZpY2UubGltaXQgIT09IHJvd3MpIHtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldExpbWl0KHJvd3MpO1xuICAgICAgdGhpcy5fc2F2ZVBhZ2VSb3dzTGltaXQocm93cyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGVTZXJ2aWNlLm9mZnNldCAhPT0gZmlyc3QgLSAxKSB7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRPZmZzZXQoZmlyc3QgLSAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZVNlcnZpY2UucGFnZSAhPT0gcGFnZSkge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0UGFnZShwYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zYXZlUGFnZVJvd3NMaW1pdChwYWdlUm93c0xpbWl0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzU2VydmljZVxuICAgICAgLnVwc2VydFJldHVybmluZ09uZSQoU0VUVElOR1NfVFlQRS5SRUdJU1RFUl9QQUdFX1JPV1NfTElNSVQpXG4gICAgICAuc3Vic2NyaWJlKChzZXR0aW5nKSA9PiB7XG4gICAgICAgIHRoaXMuX3BhZ2VSb3dzTGltaXRTZXR0aW5nID0gc2V0dGluZyB8fCB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB0aGlzLnNldHRpbmdzU2VydmljZS51cHNlcnRVc2VyU2V0dGluZ3NCeVVzZXJJZCh7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBpZDogdGhpcy5fcGFnZVJvd3NMaW1pdFNldHRpbmc/LmlkLFxuICAgICAgICBzZXR0aW5nc190eXBlOiBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BBR0VfUk9XU19MSU1JVCxcbiAgICAgICAgbW9kdWxlX25hbWU6IHRoaXMuX21vZHVsZVBhdGgsXG4gICAgICAgIHNldHRpbmdzOiB7IHBhZ2VSb3dzTGltaXQgfSxcbiAgICAgIH0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uU2V0dGluZ3MoeyBzZXR0aW5ncyB9OiBJQ29sdW1uU2V0dGluZ3NDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICB0aGlzLnN0aWNreUxlZnRJZHMgPSB0aGlzLl9nZXRDb2x1bW5JZHNSZWN1cnNpdmUoc2V0dGluZ3Muc3RpY2t5TGVmdCk7XG4gICAgICB0aGlzLnN0aWNreVJpZ2h0SWRzID0gdGhpcy5fZ2V0Q29sdW1uSWRzUmVjdXJzaXZlKFxuICAgICAgICBzZXR0aW5ncy5zdGlja3lSaWdodCxcbiAgICAgICAgKGVsKSA9PiBlbC5zdGF0dXMgPT09IEVDb2x1bW5TdGF0dXMuREVGQVVMVFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29sdW1ucyA9IFtcbiAgICAgICAgLi4udGhpcy5zdGlja3lMZWZ0SWRzLFxuICAgICAgICAuLi50aGlzLl9nZXRDb2x1bW5JZHNSZWN1cnNpdmUoXG4gICAgICAgICAgc2V0dGluZ3MuY29sdW1ucyxcbiAgICAgICAgICAoZWwpID0+IGVsLnN0YXR1cyA9PT0gRUNvbHVtblN0YXR1cy5ERUZBVUxUXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMuc3RpY2t5UmlnaHRJZHMsXG4gICAgICBdO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29sdW1uSWRzUmVjdXJzaXZlKFxuICAgIGNvbHVtbnM6IElDb2x1bW5TZXR0aW5nc1tdLFxuICAgIHByZWRpY2F0ZT86ICh2YWx1ZTogSUNvbHVtblNldHRpbmdzLCBpbmRleDogbnVtYmVyLCBhcnJheTogSUNvbHVtblNldHRpbmdzW10pID0+IHVua25vd25cbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IHByZWRpY2F0ZVxuICAgICAgPyBjb2x1bW5zLmZpbHRlcigoY29sLCBpbmRleCwgYXJyYXkpID0+IHByZWRpY2F0ZShjb2wsIGluZGV4LCBhcnJheSkpXG4gICAgICA6IGNvbHVtbnM7XG5cbiAgICByZXR1cm4gZmlsdGVyZWRDb2x1bW5zLmZsYXRNYXAoKGNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgeyBpZCwgY2hpbGRyZW4gfSA9IGNvbHVtbjtcblxuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBbaWQsIC4uLnRoaXMuX2dldENvbHVtbklkc1JlY3Vyc2l2ZShjaGlsZHJlbiwgcHJlZGljYXRlKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaWRdO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydDogUmVnaXN0ZXJUYWJsZUNlbGxTb3J0ZXI8YW55PltdKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U29ydGVyKHNvcnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVUaHNXaWR0aFRvVXNlclNldHRpbmdzKHRhYmxlQ29sdW1uc1dpZHRoOiBUaFdpZHRoRW50cnlbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5fY29sdW1uc1NldHRpbmdzO1xuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgc2V0dGluZ3Muc2V0dGluZ3MudGFibGVDb2x1bW5zV2lkdGggPSB0YWJsZUNvbHVtbnNXaWR0aDtcbiAgICB9XG5cbiAgICB0aGlzLnNldHRpbmdzU2VydmljZS51cHNlcnRVc2VyU2V0dGluZ3NCeVVzZXJJZCh7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBpZDogdGhpcy5fY29sdW1uc1NldHRpbmdzPy5pZCxcbiAgICAgICAgc2V0dGluZ3NfdHlwZTogU0VUVElOR1NfVFlQRS5DT0xVTU5TLFxuICAgICAgICBtb2R1bGVfbmFtZTogdGhpcy5fbW9kdWxlUGF0aCxcbiAgICAgICAgc2V0dGluZ3M6IHsgLi4udGhpcy5fY29sdW1uc1NldHRpbmdzPy5zZXR0aW5ncywgdGFibGVDb2x1bW5zV2lkdGggfSxcbiAgICAgIH0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICB1cGRhdGVTZXR0aW5nczogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZmlsdGVyc0FyZU9wZW5lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUuc3RhdGUgIT09IEVJbnB1dHNTdGF0ZS5ISURERU47XG4gIH1cblxuICBwcml2YXRlIF9zdWJzY3JpYmVPbk11dGF0aW9uQ29tcGxldGVkKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ29tcGxldGVkJFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuYWN0aW9uQ29tcGxldGVkKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdERlZmF1bHRGaWx0ZXIocXVlcnlGaWx0ZXJzOiBJVHBVc2VyU2V0dGluZ3NTZXR0aW5nc0ZpbHRlcltdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5nc1NlcnZpY2VcbiAgICAgIC5mZXRjaFVzZXJTZXR0aW5ncyQoe1xuICAgICAgICBpZF91c2VyOiB7XG4gICAgICAgICAgX2VxOiB0aGlzLl91c2VyLmlkLFxuICAgICAgICB9LFxuICAgICAgICBzZXR0aW5nc190eXBlOiB7XG4gICAgICAgICAgX2luOiBbU0VUVElOR1NfVFlQRS5GSUxURVIsIFNFVFRJTkdTX1RZUEUuUkVHSVNURVJfUElOTkVEX0lOUFVUU10sXG4gICAgICAgIH0sXG4gICAgICAgIG1vZHVsZV9uYW1lOiB7XG4gICAgICAgICAgX2VxOiB0aGlzLl9tb2R1bGVQYXRoLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh1c2VyU2V0dGluZ3MpID0+IHtcbiAgICAgICAgY29uc3QgcGlubmVkRmlsdGVyID0gdXNlclNldHRpbmdzLmZpbmQoXG4gICAgICAgICAgKHsgc2V0dGluZ3NfdHlwZTogdHlwZSB9KSA9PiB0eXBlID09PSBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BJTk5FRF9JTlBVVFNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNQaW5uZWQgPSAhIXBpbm5lZEZpbHRlcj8uc2V0dGluZ3MucGlubmVkO1xuICAgICAgICBjb25zdCBmYXZvcml0ZUZpbHRlciA9IHVzZXJTZXR0aW5ncy5maW5kKCh7IHNldHRpbmdzIH0pID0+IHNldHRpbmdzLmZhdm9yaXRlKTtcblxuICAgICAgICBpZiAoaXNQaW5uZWQpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRQaW4odHJ1ZSk7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc3RhdGU6IEVJbnB1dHNTdGF0ZS5GSUxURVJfTElTVCxcbiAgICAgICAgICAgIGFjdGlvbjogRUlucHV0c0FjdGlvbi5BUFBMWV9TQVZFRF9GSUxURVIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocXVlcnlGaWx0ZXJzIHx8IHRoaXMuc2VhcmNoSW5wdXQ/LmdldFJhd1ZhbHVlKCkpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVycyhxdWVyeUZpbHRlcnMgPz8gW10pO1xuICAgICAgICB9IGVsc2UgaWYgKHBpbm5lZEZpbHRlciAmJiBpc1Bpbm5lZCkge1xuICAgICAgICAgIHRoaXMuX2FwcGx5RmlsdGVyU2V0dGluZ3MocGlubmVkRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChmYXZvcml0ZUZpbHRlcikge1xuICAgICAgICAgIHRoaXMuX2FwcGx5RmlsdGVyU2V0dGluZ3MoZmF2b3JpdGVGaWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGVmYXVsdEZpbHRlckFwcGxpZWQkLm5leHQodHJ1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5RmlsdGVyU2V0dGluZ3Moc2V0dGluZ3M6IElUcFVzZXJTZXR0aW5ncyk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2V0VXNlclNldHRpbmdzRmlsdGVyVmFsdWVzKHNldHRpbmdzLnNldHRpbmdzLmZpbHRlciA/PyBbXSk7XG4gICAgY29uc3QgeyBncWxGaWx0ZXIgfSA9IHRoaXMuZmlsdGVyc1NlcnZpY2U7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0R3FsVmFsdWVzKGdxbEZpbHRlcik7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U3RhdGUoe1xuICAgICAgc3RhdGU6IEVJbnB1dHNTdGF0ZS5ISURERU4sXG4gICAgICBhY3Rpb246IEVJbnB1dHNBY3Rpb24uQVBQTFlfU0FWRURfRklMVEVSLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0Q2hhbmdlZEZpbHRlcihzZWxlY3Rpb246IEFwcGx5U2VsZWN0aW9uVHlwZXMpOiBhbnkge1xuICAgIGxldCBmaWx0ZXIgPSBudWxsO1xuXG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uID09PSBTZWxlY3Rpb25UeXBlcy5BTEwgfHwgdHlwZW9mIHNlbGVjdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGZpbHRlciA9IHRoaXMuX2hhbmRsZUFsbE9yTnVtYmVyU2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb24gPT09IFNlbGVjdGlvblR5cGVzLlZJU0lCTEUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFZpc2libGVJdGVtcygpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uID09PSBTZWxlY3Rpb25UeXBlcy5JTlZFUlNFKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLl9oYW5kbGVJbnZlcnNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUFsbE9yTnVtYmVyU2VsZWN0aW9uKHNlbGVjdGlvbjogQXBwbHlTZWxlY3Rpb25UeXBlcyk6IGFueSB7XG4gICAgbGV0IGZpbHRlciA9IG51bGw7XG4gICAgY29uc3QgeyBzb3J0ZXIgfSA9IHRoaXMuc3RhdGVTZXJ2aWNlO1xuXG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gU2VsZWN0aW9uVHlwZXMuQUxMKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmJ1aWxkRmlsdGVyKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aGlzLl9maWx0ZXJTdGF0ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHNlbGVjdGlvbiA+IHRoaXMubGltaXQpIHtcbiAgICAgICAgZmlsdGVyID0gdGhpcy5idWlsZEZpbHRlcihcbiAgICAgICAgICBzZWxlY3Rpb24sXG4gICAgICAgICAgMCxcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZSxcbiAgICAgICAgICBzb3J0ZXIubGVuZ3RoID4gMCA/IHNvcnRlciA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Rmlyc3ROSXRlbXMoc2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0Rmlyc3ROSXRlbXMoY291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzID0gbmV3IFNldCh0aGlzLmRhdGEuc2xpY2UoMCwgY291bnQpKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLmRhdGEubWFwKChkKSA9PiBkLmlkKS5zbGljZSgwLCBjb3VudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0VmlzaWJsZUl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzID0gbmV3IFNldCh0aGlzLnZpc2libGVEYXRhKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLnZpc2libGVEYXRhLm1hcCgoZCkgPT4gZC5pZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSW52ZXJzZVNlbGVjdGlvbigpOiBhbnkge1xuICAgIGNvbnN0IGludmVyc2VGaWx0ZXIgPSB7IGlkOiB7IF9uaW46IFsuLi50aGlzLnNlbGVjdGVkSWRzXSB9IH0gYXMgR3FsRmllbGQ7XG4gICAgY29uc3QgdXBkYXRlZEZpbHRlclN0YXRlID0gQXJyYXkuaXNBcnJheSh0aGlzLl9maWx0ZXJTdGF0ZSlcbiAgICAgID8gWy4uLnRoaXMuX2ZpbHRlclN0YXRlLCBpbnZlcnNlRmlsdGVyXVxuICAgICAgOiBbdGhpcy5fZmlsdGVyU3RhdGUsIGludmVyc2VGaWx0ZXJdO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVwZGF0ZWRGaWx0ZXJTdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRTZWxlY3RlZChkYXRhOiBUW10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cyA9IG5ldyBTZXQoZGF0YSk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IG5ldyBTZXQoZGF0YS5tYXAoKGQpID0+IGQuaWQpKTtcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlVG9GaWx0ZXJzKGlucHV0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGlucHV0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIGlkOiBrZXksXG4gICAgICB2YWx1ZSxcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBzZWxlY3RlZFNpemUgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyBudWxsO1xuICAgIGNvbnN0IHVuc2VsZWN0ZWRTaXplID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnVuc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyAwO1xuICAgIGNvbnN0IHVuZmV0Y2hlZE9iamVjdHMgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc3RhdGVVbmZldGNoZWRPYmplY3RzKCk7XG4gICAgY29uc3QgaXNOb3RTZWxlY3RlZCA9IHVuZmV0Y2hlZE9iamVjdHMgIT09IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgaWYgKHNlbGVjdGVkU2l6ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJZHMuc2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNOb3RTZWxlY3RlZCA/IHNlbGVjdGVkU2l6ZSA6IHRoaXMuZGF0YUNvdW50IC0gdW5zZWxlY3RlZFNpemU7XG4gIH1cblxuICBwcml2YXRlIF9nZXREZWZhdWx0Q29sdW1uc1JlY3Vyc2l2ZShjb2x1bW5zRGF0YTogSUNvbHVtbkRhdGFbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY29sdW1uc0RhdGEuZmxhdE1hcCgoY29sdW1uKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNoaWxkcmVuIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gW25hbWUsIC4uLnRoaXMuX2dldERlZmF1bHRDb2x1bW5zUmVjdXJzaXZlKGNoaWxkcmVuKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbbmFtZV07XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG5vdEFsbEZldGNoZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdW5mZXRjaGVkU3RhdGUgPSB0aGlzLnNlbGVjdGVkU2VydmljZSEuc3RhdGVVbmZldGNoZWRPYmplY3RzKCk7XG4gICAgY29uc3QgYWxsRmV0Y2hlZCA9IHRoaXMuc3RhdGVPYmplY3RzISgpLnNpemUgPT09IHRoaXMuZGF0YUNvdW50O1xuXG4gICAgcmV0dXJuIHVuZmV0Y2hlZFN0YXRlID09PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCAmJiAhYWxsRmV0Y2hlZDtcbiAgfVxufVxuIl19