slick-components 4.4.13 → 4.4.16

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 (346) hide show
  1. package/css/slick-components.css +598 -365
  2. package/css/slick-components.min.css +1 -1
  3. package/esm2020/public-api.mjs +43 -0
  4. package/esm2020/slick-accordion/slick-accordion-item-header.component.mjs +14 -0
  5. package/esm2020/slick-accordion/slick-accordion-item.component.mjs +86 -0
  6. package/esm2020/slick-accordion/slick-accordion.component.mjs +75 -0
  7. package/esm2020/slick-accordion/slick-accordion.module.mjs +23 -0
  8. package/esm2020/slick-auto-complete/slick-auto-complete-list-item-template.directive.mjs +22 -0
  9. package/esm2020/slick-auto-complete/slick-auto-complete.component.mjs +375 -0
  10. package/esm2020/slick-auto-complete/slick-auto-complete.module.mjs +24 -0
  11. package/esm2020/slick-button-spinner/slick-button-spinner.component.mjs +175 -0
  12. package/esm2020/slick-button-spinner/slick-button-spinner.module.mjs +19 -0
  13. package/esm2020/slick-calendar/slick-calendar.component.mjs +246 -0
  14. package/esm2020/slick-calendar/slick-calendar.module.mjs +19 -0
  15. package/esm2020/slick-card/slick-card-header.component.mjs +14 -0
  16. package/esm2020/slick-card/slick-card.component.mjs +42 -0
  17. package/esm2020/slick-card/slick-card.module.mjs +20 -0
  18. package/esm2020/slick-components.mjs +5 -0
  19. package/esm2020/slick-confirm-dialog/slick-confirm-dialog.component.mjs +65 -0
  20. package/esm2020/slick-confirm-dialog/slick-confirm-dialog.module.mjs +20 -0
  21. package/esm2020/slick-container/slick-container-body.component.mjs +24 -0
  22. package/esm2020/slick-container/slick-container-footer.component.mjs +20 -0
  23. package/esm2020/slick-container/slick-container-header.component.mjs +20 -0
  24. package/esm2020/slick-container/slick-container.component.mjs +21 -0
  25. package/esm2020/slick-container/slick-container.module.mjs +25 -0
  26. package/esm2020/slick-context-menu/slick-context-menu-item.component.mjs +14 -0
  27. package/esm2020/slick-context-menu/slick-context-menu.component.mjs +48 -0
  28. package/esm2020/slick-context-menu/slick-context-menu.module.mjs +20 -0
  29. package/{esm2015/slick-currency-mask/slick-currency-mask-options.model.js → esm2020/slick-currency-mask/slick-currency-mask-options.model.mjs} +0 -0
  30. package/esm2020/slick-currency-mask/slick-currency-mask.directive.mjs +233 -0
  31. package/esm2020/slick-currency-mask/slick-currency-mask.module.mjs +19 -0
  32. package/esm2020/slick-date-picker/slick-date-picker.component.mjs +278 -0
  33. package/esm2020/slick-date-picker/slick-date-picker.module.mjs +21 -0
  34. package/esm2020/slick-dialog/slick-dialog-footer.component.mjs +24 -0
  35. package/esm2020/slick-dialog/slick-dialog.component.mjs +294 -0
  36. package/esm2020/slick-dialog/slick-dialog.module.mjs +23 -0
  37. package/esm2020/slick-dialog/slick-dialog.service.mjs +68 -0
  38. package/esm2020/slick-drag-drop/slick-drag-drop.directive.mjs +13 -0
  39. package/esm2020/slick-drag-drop/slick-drag-drop.module.mjs +21 -0
  40. package/esm2020/slick-drag-drop/slick-draggable.directive.mjs +13 -0
  41. package/{esm2015/slick-drop-down/slick-drop-down-button.model.js → esm2020/slick-drop-down/slick-drop-down-button.model.mjs} +0 -0
  42. package/esm2020/slick-drop-down/slick-drop-down.component.mjs +479 -0
  43. package/esm2020/slick-drop-down/slick-drop-down.module.mjs +24 -0
  44. package/esm2020/slick-drop-down/slick-drop-down.service.mjs +55 -0
  45. package/esm2020/slick-drop-list/slick-drop-list-grab.directive.mjs +18 -0
  46. package/esm2020/slick-drop-list/slick-drop-list-item.directive.mjs +18 -0
  47. package/esm2020/slick-drop-list/slick-drop-list.directive.mjs +215 -0
  48. package/esm2020/slick-drop-list/slick-drop-list.module.mjs +23 -0
  49. package/esm2020/slick-email-viewer/slick-email-viewer-dialog.component.mjs +81 -0
  50. package/esm2020/slick-email-viewer/slick-email-viewer.component.mjs +42 -0
  51. package/esm2020/slick-email-viewer/slick-email-viewer.module.mjs +26 -0
  52. package/{esm2015/slick-emailer/slick-emailer-address.model.js → esm2020/slick-emailer/slick-emailer-address.model.mjs} +0 -0
  53. package/esm2020/slick-emailer/slick-emailer-dialog.component.mjs +153 -0
  54. package/esm2020/slick-emailer/slick-emailer.component.mjs +235 -0
  55. package/{esm2015/slick-emailer/slick-emailer.model.js → esm2020/slick-emailer/slick-emailer.model.mjs} +0 -0
  56. package/esm2020/slick-emailer/slick-emailer.module.mjs +29 -0
  57. package/esm2020/slick-file-drop/slick-file-drop.component.mjs +156 -0
  58. package/esm2020/slick-file-drop/slick-file-drop.module.mjs +20 -0
  59. package/esm2020/slick-file-list/slick-file-list-item.component.mjs +173 -0
  60. package/esm2020/slick-file-list/slick-file-list.component.mjs +130 -0
  61. package/esm2020/slick-file-list/slick-file-list.module.mjs +23 -0
  62. package/{esm2015/slick-file-model/slick-file.model.js → esm2020/slick-file-model/slick-file.model.mjs} +0 -0
  63. package/esm2020/slick-google-address-search/slick-google-address-search.directive.mjs +75 -0
  64. package/esm2020/slick-google-address-search/slick-google-address-search.module.mjs +19 -0
  65. package/esm2020/slick-google-map/slick-google-map-dialog.component.mjs +50 -0
  66. package/esm2020/slick-google-map/slick-google-map.component.mjs +48 -0
  67. package/esm2020/slick-google-map/slick-google-map.module.mjs +22 -0
  68. package/esm2020/slick-grid/slick-grid-column-template.directive.mjs +19 -0
  69. package/{esm2015/slick-grid/slick-grid-column.model.js → esm2020/slick-grid/slick-grid-column.model.mjs} +0 -0
  70. package/{esm2015/slick-grid/slick-grid-favorite.model.js → esm2020/slick-grid/slick-grid-favorite.model.mjs} +0 -0
  71. package/{esm2015/slick-grid/slick-grid-request.model.js → esm2020/slick-grid/slick-grid-request.model.mjs} +0 -0
  72. package/{esm2015/slick-grid/slick-grid-response.model.js → esm2020/slick-grid/slick-grid-response.model.mjs} +0 -0
  73. package/esm2020/slick-grid/slick-grid-sanitize.pipe.mjs +20 -0
  74. package/esm2020/slick-grid/slick-grid.component.mjs +793 -0
  75. package/esm2020/slick-grid/slick-grid.module.mjs +43 -0
  76. package/{esm2015/slick-grid/slick-grid.options.js → esm2020/slick-grid/slick-grid.options.mjs} +0 -0
  77. package/esm2020/slick-grid/slick-grid.service.mjs +66 -0
  78. package/esm2020/slick-multi-select/slick-multi-select.component.mjs +362 -0
  79. package/esm2020/slick-multi-select/slick-multi-select.module.mjs +20 -0
  80. package/esm2020/slick-multi-select/slick-multi-select.service.mjs +77 -0
  81. package/esm2020/slick-ordered-list/slick-ordered-list.component.mjs +200 -0
  82. package/esm2020/slick-ordered-list/slick-ordered-list.module.mjs +20 -0
  83. package/esm2020/slick-paging/slick-paging.component.mjs +185 -0
  84. package/esm2020/slick-paging/slick-paging.module.mjs +19 -0
  85. package/esm2020/slick-photo-gallery/slick-photo-gallery.component.mjs +98 -0
  86. package/{esm2015/slick-photo-gallery/slick-photo-gallery.model.js → esm2020/slick-photo-gallery/slick-photo-gallery.model.mjs} +0 -0
  87. package/esm2020/slick-photo-gallery/slick-photo-gallery.module.mjs +21 -0
  88. package/esm2020/slick-pick-list/slick-pick-list.component.mjs +84 -0
  89. package/esm2020/slick-pick-list/slick-pick-list.module.mjs +20 -0
  90. package/esm2020/slick-popover/slick-popover.component.mjs +204 -0
  91. package/esm2020/slick-popover/slick-popover.module.mjs +19 -0
  92. package/esm2020/slick-profile-picture/slick-profile-picture.component.mjs +267 -0
  93. package/esm2020/slick-profile-picture/slick-profile-picture.module.mjs +20 -0
  94. package/esm2020/slick-progress-bar/slick-progress-bar.module.mjs +18 -0
  95. package/esm2020/slick-progress-bar/slick-progress-bar.service.mjs +53 -0
  96. package/esm2020/slick-screen-blocker/slick-screen-blocker.module.mjs +18 -0
  97. package/esm2020/slick-screen-blocker/slick-screen-blocker.service.mjs +83 -0
  98. package/{esm2015/slick-slider/slick-slider-tick.model.js → esm2020/slick-slider/slick-slider-tick.model.mjs} +0 -0
  99. package/esm2020/slick-slider/slick-slider.component.mjs +90 -0
  100. package/esm2020/slick-slider/slick-slider.module.mjs +20 -0
  101. package/esm2020/slick-split-screen/slick-screen-split-left-content.component.mjs +15 -0
  102. package/esm2020/slick-split-screen/slick-screen-split-right-content.component.mjs +15 -0
  103. package/esm2020/slick-split-screen/slick-split-screen.component.mjs +159 -0
  104. package/esm2020/slick-split-screen/slick-split-screen.module.mjs +21 -0
  105. package/esm2020/slick-tabs/slick-tab-header.component.mjs +28 -0
  106. package/esm2020/slick-tabs/slick-tab.component.mjs +63 -0
  107. package/{esm2015/slick-tabs/slick-tab.model.js → esm2020/slick-tabs/slick-tab.model.mjs} +0 -0
  108. package/esm2020/slick-tabs/slick-tabs.component.mjs +107 -0
  109. package/esm2020/slick-tabs/slick-tabs.module.mjs +23 -0
  110. package/esm2020/slick-toast/slick-toast.module.mjs +18 -0
  111. package/esm2020/slick-toast/slick-toast.service.mjs +88 -0
  112. package/{esm2015/slick-tree-view/slick-tree-node.model.js → esm2020/slick-tree-view/slick-tree-node.model.mjs} +0 -0
  113. package/esm2020/slick-tree-view/slick-tree-view.component.mjs +293 -0
  114. package/esm2020/slick-tree-view/slick-tree-view.module.mjs +22 -0
  115. package/esm2020/slick-type-ahead/slick-type-ahead.directive.mjs +164 -0
  116. package/esm2020/slick-type-ahead/slick-type-ahead.module.mjs +18 -0
  117. package/esm2020/slick-validation-indicator/slick-validation-indicator.directive.mjs +63 -0
  118. package/esm2020/slick-validation-indicator/slick-validation-indicator.module.mjs +19 -0
  119. package/esm2020/utils/slick-function-lock.service.mjs +55 -0
  120. package/esm2020/utils/slick-init.service.mjs +49 -0
  121. package/esm2020/utils/slick-log.service.mjs +23 -0
  122. package/esm2020/utils/slick-sleep.service.mjs +14 -0
  123. package/esm2020/utils/slick-utils.service.mjs +247 -0
  124. package/fesm2015/{slick-components.js → slick-components.mjs} +2779 -2070
  125. package/fesm2015/slick-components.mjs.map +1 -0
  126. package/fesm2020/slick-components.mjs +8467 -0
  127. package/fesm2020/slick-components.mjs.map +1 -0
  128. package/package.json +20 -8
  129. package/public-api.d.ts +8 -8
  130. package/slick-accordion/slick-accordion-item-header.component.d.ts +3 -0
  131. package/slick-accordion/slick-accordion-item.component.d.ts +3 -0
  132. package/slick-accordion/slick-accordion.component.d.ts +3 -0
  133. package/slick-accordion/slick-accordion.module.d.ts +8 -0
  134. package/slick-auto-complete/slick-auto-complete-list-item-template.directive.d.ts +3 -0
  135. package/slick-auto-complete/slick-auto-complete.component.d.ts +3 -0
  136. package/slick-auto-complete/slick-auto-complete.module.d.ts +8 -0
  137. package/slick-button-spinner/slick-button-spinner.component.d.ts +3 -0
  138. package/slick-button-spinner/slick-button-spinner.module.d.ts +6 -0
  139. package/slick-calendar/slick-calendar.component.d.ts +3 -0
  140. package/slick-calendar/slick-calendar.module.d.ts +6 -0
  141. package/slick-card/slick-card-header.component.d.ts +3 -0
  142. package/slick-card/slick-card.component.d.ts +3 -0
  143. package/slick-card/slick-card.module.d.ts +10 -0
  144. package/slick-components.d.ts +1 -22
  145. package/slick-confirm-dialog/slick-confirm-dialog.component.d.ts +3 -0
  146. package/slick-confirm-dialog/slick-confirm-dialog.module.d.ts +7 -0
  147. package/slick-container/slick-container-body.component.d.ts +3 -0
  148. package/slick-container/slick-container-footer.component.d.ts +3 -0
  149. package/slick-container/slick-container-header.component.d.ts +3 -0
  150. package/slick-container/slick-container.component.d.ts +3 -0
  151. package/slick-container/slick-container.module.d.ts +9 -0
  152. package/slick-context-menu/slick-context-menu-item.component.d.ts +3 -0
  153. package/slick-context-menu/slick-context-menu.component.d.ts +3 -0
  154. package/slick-context-menu/slick-context-menu.module.d.ts +7 -0
  155. package/slick-currency-mask/slick-currency-mask.directive.d.ts +3 -0
  156. package/slick-currency-mask/slick-currency-mask.module.d.ts +5 -0
  157. package/slick-date-picker/slick-date-picker.component.d.ts +3 -0
  158. package/slick-date-picker/slick-date-picker.module.d.ts +8 -0
  159. package/slick-dialog/slick-dialog-footer.component.d.ts +3 -0
  160. package/slick-dialog/slick-dialog.component.d.ts +3 -0
  161. package/slick-dialog/slick-dialog.module.d.ts +10 -1
  162. package/slick-dialog/slick-dialog.service.d.ts +3 -0
  163. package/slick-drag-drop/slick-drag-drop.directive.d.ts +3 -0
  164. package/slick-drag-drop/slick-drag-drop.module.d.ts +11 -0
  165. package/slick-drag-drop/slick-draggable.directive.d.ts +3 -0
  166. package/slick-drop-down/slick-drop-down.component.d.ts +3 -0
  167. package/slick-drop-down/slick-drop-down.module.d.ts +9 -0
  168. package/slick-drop-down/slick-drop-down.service.d.ts +3 -0
  169. package/slick-drop-list/slick-drop-list-grab.directive.d.ts +3 -0
  170. package/slick-drop-list/slick-drop-list-item.directive.d.ts +3 -0
  171. package/slick-drop-list/slick-drop-list.directive.d.ts +13 -7
  172. package/slick-drop-list/slick-drop-list.module.d.ts +14 -0
  173. package/slick-email-viewer/slick-email-viewer-dialog.component.d.ts +3 -0
  174. package/slick-email-viewer/slick-email-viewer.component.d.ts +3 -0
  175. package/slick-email-viewer/slick-email-viewer.module.d.ts +10 -0
  176. package/slick-emailer/slick-emailer-dialog.component.d.ts +3 -0
  177. package/slick-emailer/slick-emailer.component.d.ts +3 -0
  178. package/slick-emailer/slick-emailer.module.d.ts +13 -0
  179. package/slick-file-drop/slick-file-drop.component.d.ts +3 -0
  180. package/slick-file-drop/slick-file-drop.module.d.ts +7 -0
  181. package/slick-file-list/slick-file-list-item.component.d.ts +3 -0
  182. package/slick-file-list/slick-file-list.component.d.ts +3 -0
  183. package/slick-file-list/slick-file-list.module.d.ts +10 -0
  184. package/slick-google-address-search/slick-google-address-search.directive.d.ts +3 -0
  185. package/slick-google-address-search/slick-google-address-search.module.d.ts +6 -0
  186. package/slick-google-map/slick-google-map-dialog.component.d.ts +3 -0
  187. package/slick-google-map/slick-google-map.component.d.ts +3 -0
  188. package/slick-google-map/slick-google-map.module.d.ts +8 -0
  189. package/slick-grid/slick-grid-column-template.directive.d.ts +3 -0
  190. package/slick-grid/slick-grid-sanitize.pipe.d.ts +3 -0
  191. package/slick-grid/slick-grid.component.d.ts +3 -0
  192. package/slick-grid/slick-grid.module.d.ts +16 -0
  193. package/slick-grid/slick-grid.service.d.ts +3 -0
  194. package/slick-multi-select/slick-multi-select.component.d.ts +3 -0
  195. package/slick-multi-select/slick-multi-select.module.d.ts +7 -0
  196. package/slick-multi-select/slick-multi-select.service.d.ts +3 -0
  197. package/slick-ordered-list/slick-ordered-list.component.d.ts +3 -0
  198. package/slick-ordered-list/slick-ordered-list.module.d.ts +7 -0
  199. package/slick-paging/slick-paging.component.d.ts +3 -0
  200. package/slick-paging/slick-paging.module.d.ts +6 -0
  201. package/slick-photo-gallery/slick-photo-gallery.component.d.ts +3 -0
  202. package/slick-photo-gallery/slick-photo-gallery.module.d.ts +6 -0
  203. package/slick-pick-list/slick-pick-list.component.d.ts +3 -0
  204. package/slick-pick-list/slick-pick-list.module.d.ts +7 -0
  205. package/slick-popover/slick-popover.component.d.ts +3 -0
  206. package/slick-popover/slick-popover.module.d.ts +6 -0
  207. package/slick-profile-picture/slick-profile-picture.component.d.ts +3 -0
  208. package/slick-profile-picture/slick-profile-picture.module.d.ts +7 -0
  209. package/slick-progress-bar/slick-progress-bar.module.d.ts +5 -0
  210. package/slick-progress-bar/slick-progress-bar.service.d.ts +3 -0
  211. package/slick-screen-blocker/slick-screen-blocker.module.d.ts +5 -0
  212. package/slick-screen-blocker/slick-screen-blocker.service.d.ts +3 -0
  213. package/slick-slider/slick-slider.component.d.ts +3 -0
  214. package/slick-slider/slick-slider.module.d.ts +6 -0
  215. package/slick-split-screen/slick-screen-split-left-content.component.d.ts +3 -0
  216. package/slick-split-screen/slick-screen-split-right-content.component.d.ts +3 -0
  217. package/slick-split-screen/slick-split-screen.component.d.ts +3 -0
  218. package/slick-split-screen/slick-split-screen.module.d.ts +8 -0
  219. package/slick-tabs/slick-tab-header.component.d.ts +3 -0
  220. package/slick-tabs/slick-tab.component.d.ts +3 -0
  221. package/slick-tabs/slick-tabs.component.d.ts +3 -0
  222. package/slick-tabs/slick-tabs.module.d.ts +10 -0
  223. package/slick-toast/slick-toast.module.d.ts +5 -0
  224. package/slick-toast/slick-toast.service.d.ts +3 -0
  225. package/slick-tree-view/slick-tree-view.component.d.ts +3 -0
  226. package/slick-tree-view/slick-tree-view.module.d.ts +8 -0
  227. package/slick-type-ahead/slick-type-ahead.directive.d.ts +3 -0
  228. package/slick-type-ahead/slick-type-ahead.module.d.ts +5 -0
  229. package/slick-validation-indicator/slick-validation-indicator.directive.d.ts +3 -0
  230. package/slick-validation-indicator/slick-validation-indicator.module.d.ts +6 -0
  231. package/utils/slick-function-lock.service.d.ts +3 -0
  232. package/utils/slick-init.service.d.ts +3 -0
  233. package/utils/slick-log.service.d.ts +3 -0
  234. package/utils/slick-sleep.service.d.ts +3 -0
  235. package/utils/slick-utils.service.d.ts +5 -0
  236. package/bundles/slick-components.umd.js +0 -9777
  237. package/bundles/slick-components.umd.js.map +0 -1
  238. package/esm2015/public-api.js +0 -43
  239. package/esm2015/slick-accordion/slick-accordion-item-header.component.js +0 -10
  240. package/esm2015/slick-accordion/slick-accordion-item.component.js +0 -80
  241. package/esm2015/slick-accordion/slick-accordion.component.js +0 -77
  242. package/esm2015/slick-accordion/slick-accordion.module.js +0 -18
  243. package/esm2015/slick-auto-complete/slick-auto-complete-list-item-template.directive.js +0 -21
  244. package/esm2015/slick-auto-complete/slick-auto-complete.component.js +0 -352
  245. package/esm2015/slick-auto-complete/slick-auto-complete.module.js +0 -19
  246. package/esm2015/slick-button-spinner/slick-button-spinner.component.js +0 -186
  247. package/esm2015/slick-button-spinner/slick-button-spinner.module.js +0 -14
  248. package/esm2015/slick-calendar/slick-calendar.component.js +0 -233
  249. package/esm2015/slick-calendar/slick-calendar.module.js +0 -14
  250. package/esm2015/slick-card/slick-card-header.component.js +0 -10
  251. package/esm2015/slick-card/slick-card.component.js +0 -37
  252. package/esm2015/slick-card/slick-card.module.js +0 -14
  253. package/esm2015/slick-components.js +0 -27
  254. package/esm2015/slick-confirm-dialog/slick-confirm-dialog.component.js +0 -62
  255. package/esm2015/slick-confirm-dialog/slick-confirm-dialog.module.js +0 -15
  256. package/esm2015/slick-container/slick-container-body.component.js +0 -18
  257. package/esm2015/slick-container/slick-container-footer.component.js +0 -16
  258. package/esm2015/slick-container/slick-container-header.component.js +0 -16
  259. package/esm2015/slick-container/slick-container.component.js +0 -19
  260. package/esm2015/slick-container/slick-container.module.js +0 -20
  261. package/esm2015/slick-context-menu/slick-context-menu-item.component.js +0 -10
  262. package/esm2015/slick-context-menu/slick-context-menu.component.js +0 -43
  263. package/esm2015/slick-context-menu/slick-context-menu.module.js +0 -15
  264. package/esm2015/slick-currency-mask/slick-currency-mask.directive.js +0 -234
  265. package/esm2015/slick-currency-mask/slick-currency-mask.module.js +0 -14
  266. package/esm2015/slick-date-picker/slick-date-picker.component.js +0 -267
  267. package/esm2015/slick-date-picker/slick-date-picker.module.js +0 -16
  268. package/esm2015/slick-dialog/slick-dialog-footer.component.js +0 -18
  269. package/esm2015/slick-dialog/slick-dialog.component.js +0 -282
  270. package/esm2015/slick-dialog/slick-dialog.module.js +0 -18
  271. package/esm2015/slick-dialog/slick-dialog.service.js +0 -67
  272. package/esm2015/slick-drag-drop/slick-drag-drop.directive.js +0 -9
  273. package/esm2015/slick-drag-drop/slick-drag-drop.module.js +0 -14
  274. package/esm2015/slick-drag-drop/slick-draggable.directive.js +0 -9
  275. package/esm2015/slick-drop-down/slick-drop-down.component.js +0 -465
  276. package/esm2015/slick-drop-down/slick-drop-down.module.js +0 -19
  277. package/esm2015/slick-drop-down/slick-drop-down.service.js +0 -59
  278. package/esm2015/slick-drop-list/slick-drop-list-grab.directive.js +0 -18
  279. package/esm2015/slick-drop-list/slick-drop-list-item.directive.js +0 -18
  280. package/esm2015/slick-drop-list/slick-drop-list.directive.js +0 -162
  281. package/esm2015/slick-drop-list/slick-drop-list.module.js +0 -15
  282. package/esm2015/slick-email-viewer/slick-email-viewer-dialog.component.js +0 -61
  283. package/esm2015/slick-email-viewer/slick-email-viewer.component.js +0 -39
  284. package/esm2015/slick-email-viewer/slick-email-viewer.module.js +0 -21
  285. package/esm2015/slick-emailer/slick-emailer-dialog.component.js +0 -122
  286. package/esm2015/slick-emailer/slick-emailer.component.js +0 -226
  287. package/esm2015/slick-emailer/slick-emailer.module.js +0 -24
  288. package/esm2015/slick-file-drop/slick-file-drop.component.js +0 -144
  289. package/esm2015/slick-file-drop/slick-file-drop.module.js +0 -15
  290. package/esm2015/slick-file-list/slick-file-list-item.component.js +0 -156
  291. package/esm2015/slick-file-list/slick-file-list.component.js +0 -114
  292. package/esm2015/slick-file-list/slick-file-list.module.js +0 -18
  293. package/esm2015/slick-google-address-search/slick-google-address-search.directive.js +0 -75
  294. package/esm2015/slick-google-address-search/slick-google-address-search.module.js +0 -14
  295. package/esm2015/slick-google-map/slick-google-map-dialog.component.js +0 -45
  296. package/esm2015/slick-google-map/slick-google-map.component.js +0 -45
  297. package/esm2015/slick-google-map/slick-google-map.module.js +0 -17
  298. package/esm2015/slick-grid/slick-grid-column-template.directive.js +0 -19
  299. package/esm2015/slick-grid/slick-grid-sanitize.pipe.js +0 -20
  300. package/esm2015/slick-grid/slick-grid.component.js +0 -792
  301. package/esm2015/slick-grid/slick-grid.module.js +0 -38
  302. package/esm2015/slick-grid/slick-grid.service.js +0 -72
  303. package/esm2015/slick-multi-select/slick-multi-select.component.js +0 -356
  304. package/esm2015/slick-multi-select/slick-multi-select.module.js +0 -15
  305. package/esm2015/slick-multi-select/slick-multi-select.service.js +0 -74
  306. package/esm2015/slick-ordered-list/slick-ordered-list.component.js +0 -198
  307. package/esm2015/slick-ordered-list/slick-ordered-list.module.js +0 -15
  308. package/esm2015/slick-paging/slick-paging.component.js +0 -180
  309. package/esm2015/slick-paging/slick-paging.module.js +0 -14
  310. package/esm2015/slick-photo-gallery/slick-photo-gallery.component.js +0 -101
  311. package/esm2015/slick-photo-gallery/slick-photo-gallery.module.js +0 -16
  312. package/esm2015/slick-pick-list/slick-pick-list.component.js +0 -78
  313. package/esm2015/slick-pick-list/slick-pick-list.module.js +0 -15
  314. package/esm2015/slick-popover/slick-popover.component.js +0 -199
  315. package/esm2015/slick-popover/slick-popover.module.js +0 -14
  316. package/esm2015/slick-profile-picture/slick-profile-picture.component.js +0 -242
  317. package/esm2015/slick-profile-picture/slick-profile-picture.module.js +0 -15
  318. package/esm2015/slick-progress-bar/slick-progress-bar.module.js +0 -13
  319. package/esm2015/slick-progress-bar/slick-progress-bar.service.js +0 -50
  320. package/esm2015/slick-screen-blocker/slick-screen-blocker.module.js +0 -13
  321. package/esm2015/slick-screen-blocker/slick-screen-blocker.service.js +0 -80
  322. package/esm2015/slick-slider/slick-slider.component.js +0 -88
  323. package/esm2015/slick-slider/slick-slider.module.js +0 -15
  324. package/esm2015/slick-split-screen/slick-screen-split-left-content.component.js +0 -13
  325. package/esm2015/slick-split-screen/slick-screen-split-right-content.component.js +0 -13
  326. package/esm2015/slick-split-screen/slick-split-screen.component.js +0 -148
  327. package/esm2015/slick-split-screen/slick-split-screen.module.js +0 -16
  328. package/esm2015/slick-tabs/slick-tab-header.component.js +0 -25
  329. package/esm2015/slick-tabs/slick-tab.component.js +0 -67
  330. package/esm2015/slick-tabs/slick-tabs.component.js +0 -104
  331. package/esm2015/slick-tabs/slick-tabs.module.js +0 -17
  332. package/esm2015/slick-toast/slick-toast.module.js +0 -13
  333. package/esm2015/slick-toast/slick-toast.service.js +0 -91
  334. package/esm2015/slick-tree-view/slick-tree-view.component.js +0 -287
  335. package/esm2015/slick-tree-view/slick-tree-view.module.js +0 -17
  336. package/esm2015/slick-type-ahead/slick-type-ahead.directive.js +0 -155
  337. package/esm2015/slick-type-ahead/slick-type-ahead.module.js +0 -13
  338. package/esm2015/slick-validation-indicator/slick-validation-indicator.directive.js +0 -61
  339. package/esm2015/slick-validation-indicator/slick-validation-indicator.module.js +0 -14
  340. package/esm2015/utils/slick-function-lock.service.js +0 -54
  341. package/esm2015/utils/slick-init.service.js +0 -48
  342. package/esm2015/utils/slick-log.service.js +0 -27
  343. package/esm2015/utils/slick-sleep.service.js +0 -14
  344. package/esm2015/utils/slick-utils.service.js +0 -229
  345. package/fesm2015/slick-components.js.map +0 -1
  346. package/slick-components.metadata.json +0 -1
@@ -1,792 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Component, Input, Output, EventEmitter, ViewChild, HostListener, ElementRef, ContentChildren, QueryList, HostBinding, ChangeDetectorRef } from "@angular/core";
3
- import { SlickGridService } from "./slick-grid.service";
4
- import { SlickGridColumnFilterTypes, SlickGridColumnSortDirection } from "./slick-grid-column.model";
5
- import { SlickGridRequestModel } from "./slick-grid-request.model";
6
- import { SlickDialogComponent } from "../slick-dialog/slick-dialog.module";
7
- import { SlickSleepService } from "../utils/slick-sleep.service";
8
- import { SlickUtilsService } from "../utils/slick-utils.service";
9
- import { SlickFunctionLockService } from "../utils/slick-function-lock.service";
10
- import { SlickGridColumnTemplateDirective } from "./slick-grid-column-template.directive";
11
- import { SlickConfirmDialogComponent, SlickConfirmDialogResults } from '../slick-confirm-dialog/slick-confirm-dialog.module';
12
- import { SlickGridFavoriteModel } from './slick-grid-favorite.model';
13
- class DropDownModel {
14
- constructor(text) {
15
- this.id = text;
16
- this.text = text;
17
- }
18
- }
19
- export class SlickGridComponent {
20
- constructor(gridService, functionLockService, changeDetector) {
21
- this.gridService = gridService;
22
- this.functionLockService = functionLockService;
23
- this.changeDetector = changeDetector;
24
- this.flexColumn = 'slick-flex-column';
25
- this.bordered = true;
26
- this.striped = true;
27
- this.hover = true;
28
- this.showingAllRecords = false;
29
- this.onRowSelected = new EventEmitter();
30
- this.onRowDoubleClick = new EventEmitter();
31
- this.onRowContextMenu = new EventEmitter();
32
- this.onFavoritesModified = new EventEmitter();
33
- this.fnOnMouseUp = (e) => this.onMouseUp(e);
34
- this.selectedIndex = null;
35
- this.gridOpacity = 0;
36
- this.loaded = false;
37
- this.isDoubleClick = false;
38
- this.currentPage = 1;
39
- this.showTestRow = false;
40
- this.showSearchRow = false;
41
- this.isResizing = false;
42
- this.visibleData = [];
43
- this.recordsPerPageValue = "Auto";
44
- this.resizeTimeout = null;
45
- this.uuid = SlickUtilsService.newGuid();
46
- this.requestModel = new SlickGridRequestModel();
47
- }
48
- onResize(event, targetElement) {
49
- return __awaiter(this, void 0, void 0, function* () {
50
- // This is here because firefox shows/hides the menu if you press alt. Don't redraw the grid if we're
51
- // just showing the menu
52
- if (Math.abs(this.slickGridHeight - this.slickGridRef.nativeElement.offsetHeight) < 50)
53
- return;
54
- if (this.slickGridHeight !== this.slickGridRef.nativeElement.offsetHeight) {
55
- clearTimeout(this.resizeTimeout);
56
- this.resizeTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
57
- this.currentPage = 1;
58
- this.requestModel.page = 1;
59
- yield this.resizeGrid();
60
- this.requestModel.recordsPerPage = this.recordsPerPage;
61
- this.reload(this.requestModel);
62
- }), 500);
63
- }
64
- });
65
- }
66
- ngOnInit() {
67
- return __awaiter(this, void 0, void 0, function* () {
68
- this.setGridOptions(this.gridOptions);
69
- });
70
- }
71
- ngAfterViewInit() {
72
- return __awaiter(this, void 0, void 0, function* () {
73
- // Copy the templates to a variable that the html can access. It can't access a QueryList
74
- this.templateRefs = {};
75
- this.slickGridColumnTemplates.forEach(t => {
76
- this.templateRefs[t.columnKey] = t.template;
77
- });
78
- if (this.tableRef)
79
- this.tableRef.nativeElement.focus();
80
- });
81
- }
82
- tableKeydown(e) {
83
- return __awaiter(this, void 0, void 0, function* () {
84
- // Key up
85
- if (e.which === 38 && !(this.selectedIndex === 0 && this.currentPage === 1)) {
86
- clearTimeout(this.keypressTimeout);
87
- this.selectedIndex--;
88
- if (this.selectedIndex < 0) {
89
- if (this.currentPage > 1) {
90
- this.currentPage--;
91
- this.selectedIndex = 0;
92
- yield this.onPageChange(this.currentPage, false);
93
- this.selectedIndex = this.recordsPerPage - 1;
94
- }
95
- }
96
- this.keypressTimeout = setTimeout(() => {
97
- const rowData = this.visibleData[this.selectedIndex];
98
- this.onRowClicked(rowData, this.selectedIndex);
99
- }, 500);
100
- }
101
- // Key down
102
- if (e.which === 40) {
103
- if (((this.currentPage - 1) * this.recordsPerPage) + this.selectedIndex >= this.totalRecords)
104
- return;
105
- clearTimeout(this.keypressTimeout);
106
- this.selectedIndex++;
107
- if (this.selectedIndex >= this.recordsPerPage) {
108
- if (((this.currentPage - 1) * this.recordsPerPage) + this.selectedIndex < this.totalRecords) {
109
- this.currentPage++;
110
- this.selectedIndex = 0;
111
- yield this.onPageChange(this.currentPage, false);
112
- }
113
- }
114
- this.keypressTimeout = setTimeout(() => {
115
- const rowData = this.visibleData[this.selectedIndex];
116
- this.onRowClicked(rowData, this.selectedIndex);
117
- }, 500);
118
- }
119
- });
120
- }
121
- ngOnChanges(changes) {
122
- return __awaiter(this, void 0, void 0, function* () {
123
- if (changes.bordered) {
124
- if (this.gridOptions.bordered === null)
125
- this.bordered = (this.bordered.toString().toLowerCase() !== 'false') ? true : false;
126
- }
127
- if (changes.striped) {
128
- // The grid options override the tag options
129
- if (this.gridOptions.striped === null)
130
- this.striped = (this.striped.toString().toLowerCase() !== 'false') ? true : false;
131
- }
132
- if (changes.hover) {
133
- // The grid options override the tag options
134
- if (this.gridOptions.hover === null)
135
- this.hover = (this.hover.toString().toLowerCase() !== 'false') ? true : false;
136
- }
137
- if (changes.gridOptions) {
138
- if (this.gridOptions.bordered !== null)
139
- this.bordered = this.gridOptions.bordered;
140
- if (this.gridOptions.striped !== null)
141
- this.striped = this.gridOptions.striped;
142
- if (this.gridOptions.hover !== null)
143
- this.hover = this.gridOptions.hover;
144
- this.setGridOptions(this.gridOptions);
145
- }
146
- if (changes.data) {
147
- // If we don't do this lock, the first change will have null data and crash. The second request will have the actual data
148
- yield this.functionLockService.lock("GRID_" + this.uuid + "_DATA_CHANGES");
149
- // Only resize the grid on the first change, otherwise we get a flicker
150
- if (changes.data.firstChange === true)
151
- yield this.resizeGrid();
152
- // We need to wait for the resize in the OnInit to finish before we continue
153
- this.loaded = true;
154
- this.currentPage = 1;
155
- this.requestModel.page = 1;
156
- this.requestModel.recordsPerPage = this.recordsPerPage;
157
- yield this.reload(this.requestModel);
158
- if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
159
- this.selectRow(0);
160
- this.functionLockService.release("GRID_" + this.uuid + "_DATA_CHANGES");
161
- }
162
- });
163
- }
164
- ngOnDestroy() {
165
- document.removeEventListener('mouseup', this.fnOnMouseUp);
166
- }
167
- onRecordsPerPageSelected(recordsPerPage) {
168
- return __awaiter(this, void 0, void 0, function* () {
169
- if (!recordsPerPage)
170
- return;
171
- this.recordsPerPageValue = recordsPerPage;
172
- localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE", recordsPerPage);
173
- this.visibleData = [];
174
- this.gridOpacity = 0;
175
- yield SlickSleepService.sleep();
176
- yield this.resizeGrid(true);
177
- this.requestModel.recordsPerPage = this.recordsPerPage;
178
- this.currentPage = 1;
179
- yield this.onPageChange(this.currentPage, true);
180
- });
181
- }
182
- onColResizeMousedown(e, columnIdx) {
183
- this.isResizing = true;
184
- this.resizeInitialPos = e.pageX;
185
- this.resizeColIdx = columnIdx;
186
- let col = this.tableHeaderRowRef.nativeElement.querySelectorAll("td").item(columnIdx);
187
- this.resizeInitialWidth = col.offsetWidth - 9;
188
- this.visibleColumns[columnIdx].flexible = false;
189
- document.addEventListener('mouseup', this.fnOnMouseUp);
190
- }
191
- onColResizeDoubleclick(e, columnIdx) {
192
- this.visibleColumns[columnIdx].flexible = true;
193
- this.visibleColumns[columnIdx].width = null;
194
- this.saveColumnsToLocalStorage();
195
- }
196
- onColResizeMousemove(e) {
197
- if (!this.isResizing)
198
- return;
199
- let newCursorPos = e.pageX;
200
- let diff = newCursorPos - this.resizeInitialPos;
201
- this.visibleColumns[this.resizeColIdx].width = (this.resizeInitialWidth + diff) + "px";
202
- if ((this.resizeInitialWidth + diff) < 10)
203
- this.visibleColumns[this.resizeColIdx].width = "10px";
204
- this.visibleColumns[this.resizeColIdx].flexible = false;
205
- }
206
- onMouseUp(e) {
207
- this.isResizing = false;
208
- document.removeEventListener('mouseup', this.fnOnMouseUp);
209
- this.saveColumnsToLocalStorage();
210
- }
211
- getVisibleRecords() {
212
- return this.visibleData;
213
- }
214
- addNewRecord(newRecord, selectNewRecord = false) {
215
- this.visibleData.unshift(newRecord);
216
- if (selectNewRecord === true) {
217
- this.selectedIndex = 0;
218
- this.selectRow(0);
219
- }
220
- else {
221
- if (this.selectedIndex)
222
- this.selectedIndex++;
223
- }
224
- }
225
- updateRecord(rowNum, record) {
226
- this.visibleData[rowNum] = record;
227
- }
228
- onRowClicked(rowData, idx) {
229
- this.selectedIndex = idx;
230
- clearTimeout(this.doubleClickWaitTimeout);
231
- this.doubleClickWaitTimeout = setTimeout(() => {
232
- this.onRowSelected.emit(rowData);
233
- }, 250);
234
- }
235
- onRowDoubleClicked(rowData, idx) {
236
- this.selectedIndex = idx;
237
- clearTimeout(this.doubleClickWaitTimeout);
238
- this.onRowDoubleClick.emit(rowData);
239
- }
240
- onRowContextMenuClicked(e, rowData, idx) {
241
- if (this.onRowContextMenu) {
242
- let rowContextMenuModel = {
243
- mouseEvent: e,
244
- data: rowData,
245
- rowIdx: idx
246
- };
247
- this.onRowContextMenu.emit(rowContextMenuModel);
248
- }
249
- }
250
- onPageChange(pageNumber, selectRow = true) {
251
- return __awaiter(this, void 0, void 0, function* () {
252
- this.currentPage = pageNumber;
253
- this.requestModel.page = pageNumber;
254
- yield this.reload(this.requestModel);
255
- this.selectedIndex = (this.gridOptions.autoSelectFirstRow === true) ? 0 : null;
256
- if (selectRow === true && this.gridOptions.autoSelectFirstRow === true) {
257
- const rowData = this.visibleData[this.selectedIndex];
258
- this.onRowClicked(rowData, this.selectedIndex);
259
- }
260
- this.tableRef.nativeElement.focus();
261
- });
262
- }
263
- reloadGrid(additionalParams) {
264
- return __awaiter(this, void 0, void 0, function* () {
265
- try {
266
- yield this.resizeGrid();
267
- yield this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRID");
268
- this.requestModel.url = this.gridOptions.getUrl;
269
- this.requestModel.httpHeaders = this.gridOptions.httpHeaders;
270
- this.requestModel.additionalParams = additionalParams;
271
- this.requestModel.page = this.currentPage;
272
- this.requestModel.recordsPerPage = this.recordsPerPage;
273
- let responseModel = yield this.reload(this.requestModel);
274
- this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRID");
275
- return Promise.resolve(responseModel);
276
- }
277
- catch (error) {
278
- console.error(error);
279
- return Promise.reject(error);
280
- }
281
- });
282
- }
283
- reloadGridWithRequestModel(requestModel) {
284
- return __awaiter(this, void 0, void 0, function* () {
285
- try {
286
- yield this.resizeGrid();
287
- yield this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
288
- this.requestModel = requestModel;
289
- this.currentPage = 1;
290
- this.requestModel.page = 1;
291
- let responseModel = yield this.reload(this.requestModel);
292
- this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
293
- return Promise.resolve(responseModel);
294
- }
295
- catch (error) {
296
- console.error(error);
297
- return Promise.reject(error);
298
- }
299
- });
300
- }
301
- reload(requestModel) {
302
- return __awaiter(this, void 0, void 0, function* () {
303
- try {
304
- yield this.functionLockService.lock("GRID_" + this.uuid + "_RELOAD");
305
- requestModel = this.getRequestModel(this.requestModel);
306
- let responseModel = null;
307
- if (requestModel.url)
308
- responseModel = yield this.gridService.getDataFromServer(requestModel);
309
- else
310
- responseModel = yield this.gridService.getDataFromDataObj(requestModel, this.data);
311
- this.loaded = true;
312
- this.totalRecords = responseModel.totalRecords;
313
- this.visibleData = responseModel.data;
314
- this.functionLockService.release("GRID_" + this.uuid + "_RELOAD");
315
- Promise.resolve(responseModel);
316
- }
317
- catch (error) {
318
- console.error(error);
319
- return Promise.reject(error);
320
- }
321
- });
322
- }
323
- unselectRow() {
324
- this.selectedIndex = null;
325
- }
326
- selectRow(rowNumber) {
327
- let rowData = this.visibleData[rowNumber];
328
- this.onRowClicked(rowData, rowNumber);
329
- }
330
- getColumnHTML(rowData, dataFieldName) {
331
- const columnHTML = SlickUtilsService.getDeepObject(rowData, dataFieldName);
332
- if (columnHTML === null || columnHTML === undefined)
333
- return '';
334
- return columnHTML.toString();
335
- }
336
- sortBy(sortColumn) {
337
- return __awaiter(this, void 0, void 0, function* () {
338
- this.gridOptions.columns.forEach(c => {
339
- if (sortColumn && c.columnKey !== sortColumn.columnKey) {
340
- c.sortDirection = SlickGridColumnSortDirection.none;
341
- }
342
- });
343
- if (sortColumn) {
344
- if (sortColumn.sortDirection === SlickGridColumnSortDirection.none) {
345
- this.visibleColumns.forEach(c => c.sortDirection = SlickGridColumnSortDirection.none);
346
- sortColumn.sortDirection = SlickGridColumnSortDirection.asc;
347
- }
348
- else if (sortColumn.sortDirection === SlickGridColumnSortDirection.asc)
349
- sortColumn.sortDirection = SlickGridColumnSortDirection.desc;
350
- else {
351
- sortColumn.sortDirection = SlickGridColumnSortDirection.none;
352
- }
353
- }
354
- this.saveColumnsToLocalStorage();
355
- this.currentPage = 1;
356
- this.requestModel.page = 1;
357
- yield this.reload(this.requestModel);
358
- if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
359
- this.selectRow(0);
360
- });
361
- }
362
- onSearchSelect(ddValue, column) {
363
- return __awaiter(this, void 0, void 0, function* () {
364
- if (!this.requestModel.columnSearchValues)
365
- this.requestModel.columnSearchValues = [];
366
- let columnSearchValueIdx = this.requestModel.columnSearchValues.findIndex(x => x.columnName === column.dataFieldName);
367
- if (columnSearchValueIdx >= 0)
368
- this.requestModel.columnSearchValues.splice(columnSearchValueIdx, 1);
369
- column.isFiltering = false;
370
- if (ddValue) {
371
- this.requestModel.columnSearchValues.push({
372
- columnName: column.dataFieldName,
373
- searchValueId: ddValue.id,
374
- searchValueText: ddValue.text
375
- });
376
- column.isFiltering = true;
377
- }
378
- else {
379
- column.isLocked = false;
380
- }
381
- this.currentPage = 1;
382
- this.requestModel.page = 1;
383
- yield this.reload(this.requestModel);
384
- if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
385
- this.selectRow(0);
386
- });
387
- }
388
- onSearch(column) {
389
- return __awaiter(this, void 0, void 0, function* () {
390
- yield SlickSleepService.sleep();
391
- if (!this.requestModel.columnSearchValues)
392
- this.requestModel.columnSearchValues = [];
393
- if (column.filterText === column.lastSearchText)
394
- return;
395
- column.lastSearchText = column.filterText;
396
- column.isFiltering = !!column.filterText;
397
- if (!column.isFiltering)
398
- column.isLocked = false;
399
- clearTimeout(this.searchTimeout);
400
- this.searchTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
401
- this.saveColumnsToLocalStorage();
402
- let columnSearchValueIdx = this.requestModel.columnSearchValues.findIndex(x => x.columnName === column.dataFieldName);
403
- if (columnSearchValueIdx >= 0)
404
- this.requestModel.columnSearchValues.splice(columnSearchValueIdx, 1);
405
- if (column.filterText) {
406
- this.requestModel.columnSearchValues.push({
407
- columnName: column.dataFieldName,
408
- searchValueText: column.filterText
409
- });
410
- }
411
- this.currentPage = 1;
412
- this.requestModel.page = 1;
413
- yield this.reload(this.requestModel);
414
- if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
415
- this.selectRow(0);
416
- }), 250);
417
- });
418
- }
419
- toggleLock(column) {
420
- column.isLocked = !column.isLocked;
421
- this.saveColumnsToLocalStorage();
422
- }
423
- resetFilter(column) {
424
- return __awaiter(this, void 0, void 0, function* () {
425
- column.isFiltering = false;
426
- column.isLocked = false;
427
- column.filterText = null;
428
- column.lastSearchText = null;
429
- column.filterDropdownValue = null;
430
- this.requestModel.columnSearchValues = this.requestModel.columnSearchValues.filter(x => x.columnName !== column.dataFieldName);
431
- this.saveColumnsToLocalStorage();
432
- this.currentPage = 1;
433
- this.requestModel.page = 1;
434
- yield this.reload(this.requestModel);
435
- if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
436
- this.selectRow(0);
437
- });
438
- }
439
- openColumnSelectDialog() {
440
- this.columnSelectDialogColumns = [...this.gridOptions.columns];
441
- this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
442
- this.columnSelectDialogRef.showDialog();
443
- }
444
- onColumnDrop(e) {
445
- console.log(e);
446
- }
447
- onColumnReorder(e) {
448
- return __awaiter(this, void 0, void 0, function* () {
449
- const oldOrder = e[0];
450
- const newOrder = e[1];
451
- if (oldOrder === newOrder)
452
- return;
453
- const selectedCol = this.columnSelectDialogColumns.splice(oldOrder, 1)[0];
454
- selectedCol.displayOrder = newOrder;
455
- let currentOrder = 0;
456
- // Everything up to the new order reordered from 0
457
- for (let i = 0; i < this.columnSelectDialogColumns.length; i++) {
458
- // If we're at newOrder, leave a spot
459
- if (i === newOrder)
460
- currentOrder++;
461
- this.columnSelectDialogColumns[i].displayOrder = currentOrder++;
462
- }
463
- this.columnSelectDialogColumns = [...this.columnSelectDialogColumns, selectedCol];
464
- this.columnSelectDialogColumns = this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
465
- });
466
- }
467
- addNewFavorite() {
468
- return __awaiter(this, void 0, void 0, function* () {
469
- this.newFavoriteText = '';
470
- const confirmResult = yield this.addNewFavoriteDialogRef.confirm();
471
- if (confirmResult === SlickConfirmDialogResults.Ok && this.newFavoriteText) {
472
- // Save the previous selection to localstorage
473
- this.saveDialogColumnsToLocalStorage();
474
- this.favorites.push(new DropDownModel(this.newFavoriteText));
475
- this.selectedFavorite = this.newFavoriteText;
476
- localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE", this.selectedFavorite);
477
- const favoritesJson = JSON.stringify(this.favorites.map(x => x.text));
478
- localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES", favoritesJson);
479
- // Save the new one to localstorage
480
- this.saveDialogColumnsToLocalStorage();
481
- }
482
- });
483
- }
484
- loadFavorite(favorite) {
485
- this.saveDialogColumnsToLocalStorage();
486
- this.selectedFavorite = favorite.text;
487
- let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${this.selectedFavorite === 'Default' ? '' : '_' + this.selectedFavorite}`);
488
- if (gridColumnsJson) {
489
- this.columnSelectDialogColumns = JSON.parse(gridColumnsJson);
490
- this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
491
- }
492
- }
493
- setFavorite(favorite) {
494
- return __awaiter(this, void 0, void 0, function* () {
495
- this.selectedFavorite = favorite;
496
- localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE", this.selectedFavorite);
497
- let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${this.selectedFavorite === 'Default' ? '' : '_' + this.selectedFavorite}`);
498
- this.gridOptions.columns = JSON.parse(gridColumnsJson);
499
- this.gridOptions.columns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
500
- this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
501
- this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
502
- this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
503
- this.currentPage = 1;
504
- this.requestModel.page = 1;
505
- this.requestModel.recordsPerPage = this.recordsPerPage;
506
- yield this.reload(this.requestModel);
507
- });
508
- }
509
- onSaveColumns() {
510
- this.saveDialogColumnsToLocalStorage();
511
- this.gridOptions.columns = [...this.columnSelectDialogColumns];
512
- // Make sure if they've hidden a column that we aren't trying to sort or filter by this column
513
- this.gridOptions.columns.forEach(x => {
514
- if (x.visible === false) {
515
- x.filterDropdownValue = null;
516
- x.filterText = null;
517
- x.isFiltering = false;
518
- x.isLocked = false;
519
- x.lastSearchText = null;
520
- x.sortDirection = null;
521
- }
522
- });
523
- this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
524
- this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
525
- this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
526
- this.columnSelectDialogRef.hideDialog();
527
- this.resizeGrid();
528
- if (this.onFavoritesModified) {
529
- const gridFavorites = this.favorites.map(favorite => {
530
- const gridFavorite = new SlickGridFavoriteModel();
531
- gridFavorite.favoriteName = favorite.text;
532
- const suffix = gridFavorite.favoriteName === 'Default' ? '' : ('_' + gridFavorite.favoriteName);
533
- const dialogColumnsJSON = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
534
- gridFavorite.columns = JSON.parse(dialogColumnsJSON);
535
- return gridFavorite;
536
- });
537
- this.onFavoritesModified.emit(gridFavorites);
538
- }
539
- }
540
- onCancelColumns() {
541
- this.columnSelectDialogRef.hideDialog();
542
- }
543
- saveDialogColumnsToLocalStorage() {
544
- let dialogColumnsJSON = JSON.stringify(this.columnSelectDialogColumns);
545
- if (this.gridOptions.gridKey) {
546
- const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
547
- localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, dialogColumnsJSON);
548
- }
549
- }
550
- saveColumnsToLocalStorage() {
551
- let gridColumnsJSON = JSON.stringify(this.gridOptions.columns);
552
- if (this.gridOptions.gridKey) {
553
- const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
554
- let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
555
- if (gridColumnsJson) {
556
- let columns = JSON.parse(gridColumnsJson);
557
- let displayOrder = 0;
558
- columns.forEach(c => {
559
- let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
560
- if (column) {
561
- c.displayOrder = displayOrder;
562
- c.titleOrientation = column.titleOrientation;
563
- c.titleHeight = column.titleHeight;
564
- c.width = column.width;
565
- c.filterDropdownValue = column.filterDropdownValue;
566
- c.filterText = column.filterText;
567
- c.isLocked = column.isLocked;
568
- c.isFiltering = column.isFiltering;
569
- c.sortDirection = column.sortDirection;
570
- }
571
- displayOrder++;
572
- });
573
- columns = columns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
574
- gridColumnsJSON = JSON.stringify(columns);
575
- }
576
- localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
577
- }
578
- if (this.onFavoritesModified) {
579
- const gridFavorites = this.favorites.map(favorite => {
580
- const gridFavorite = new SlickGridFavoriteModel();
581
- gridFavorite.favoriteName = favorite.text;
582
- const suffix = gridFavorite.favoriteName === 'Default' ? '' : ('_' + gridFavorite.favoriteName);
583
- const dialogColumnsJSON = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
584
- gridFavorite.columns = JSON.parse(dialogColumnsJSON);
585
- return gridFavorite;
586
- });
587
- this.onFavoritesModified.emit(gridFavorites);
588
- }
589
- }
590
- resizeGrid(forceRefresh = false) {
591
- return __awaiter(this, void 0, void 0, function* () {
592
- return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
593
- if (!forceRefresh && this.slickGridRef.nativeElement.offsetHeight === this.slickGridHeight) {
594
- resolve();
595
- return;
596
- }
597
- if (this.recordsPerPageValue === 'Auto') {
598
- yield this.functionLockService.lock("GRID_" + this.uuid + "_RESIZEGRID");
599
- this.slickGridHeight = this.tableContainerRef.nativeElement.offsetHeight;
600
- const testRow = this.tableRef.nativeElement.insertRow(0);
601
- const testCell = testRow.insertCell(0);
602
- testCell.style.visibility = "hidden";
603
- testCell.innerHTML = "&NBSP";
604
- const rowHeight = testCell.offsetHeight;
605
- this.tableRef.nativeElement.deleteRow(0);
606
- let headerHeight = this.tableHeaderRowRef.nativeElement.offsetHeight + 2;
607
- if (this.tableHeaderSearchRowRef)
608
- headerHeight += this.tableHeaderSearchRowRef.nativeElement.offsetHeight + 2;
609
- const clientHeight = this.tableContainerRef.nativeElement.offsetHeight - headerHeight;
610
- this.recordsPerPage = parseInt(((clientHeight / rowHeight) - 1).toFixed(0));
611
- let actualRowHeight = parseInt((clientHeight / this.recordsPerPage).toFixed(0)) - 1;
612
- if (actualRowHeight < rowHeight)
613
- actualRowHeight = rowHeight;
614
- const allRows = this.slickGridRef.nativeElement.querySelectorAll(".table tbody tr");
615
- allRows.forEach(row => {
616
- row.style.height = (actualRowHeight) + "px";
617
- });
618
- this.functionLockService.release("GRID_" + this.uuid + "_RESIZEGRID");
619
- this.gridOpacity = 1;
620
- this.showTestRow = false;
621
- resolve();
622
- }
623
- else {
624
- yield SlickSleepService.sleep();
625
- this.recordsPerPage = parseInt(this.recordsPerPageValue);
626
- this.gridOpacity = 1;
627
- resolve();
628
- }
629
- }));
630
- });
631
- }
632
- addColumn(column, idx = null) {
633
- if (idx === null)
634
- this.gridOptions.columns.push(column);
635
- else
636
- this.gridOptions.columns.splice(idx, 0, column);
637
- this.setGridOptions(this.gridOptions);
638
- }
639
- getRequestModel(requestModel = null) {
640
- if (!requestModel)
641
- requestModel = this.requestModel;
642
- requestModel.columnSearchValues = [];
643
- this.gridOptions.columns.forEach(c => {
644
- if (c.visible) {
645
- if (c.filterType === SlickGridColumnFilterTypes.text && c.filterText) {
646
- c.filterText = c.filterText;
647
- requestModel.columnSearchValues.push({
648
- columnName: c.dataFieldName,
649
- searchValueId: null,
650
- searchValueText: c.filterText
651
- });
652
- }
653
- else if (c.filterType === SlickGridColumnFilterTypes.dropdown && c.filterDropdownValue) {
654
- c.filterDropdownValue = c.filterDropdownValue;
655
- requestModel.columnSearchValues.push({
656
- columnName: c.dataFieldName,
657
- searchValueId: c.filterDropdownValue,
658
- searchValueText: null
659
- });
660
- }
661
- }
662
- });
663
- requestModel.sortColumn = null;
664
- const sortColumn = this.gridOptions.columns.find(x => x.sortDirection === SlickGridColumnSortDirection.asc || x.sortDirection === SlickGridColumnSortDirection.desc);
665
- if (sortColumn) {
666
- requestModel.sortColumn = (sortColumn.sortDirection === 0) ? null : sortColumn.dataFieldName;
667
- requestModel.sortDirection = sortColumn.sortDirection;
668
- }
669
- if (requestModel.recordsPerPage <= 0)
670
- requestModel.recordsPerPage = 20;
671
- return this.requestModel;
672
- }
673
- setGridOptions(gridOptions) {
674
- this.gridOptions = gridOptions;
675
- if (this.gridOptions.gridKey) {
676
- if (this.gridOptions.favorites) {
677
- const favoriteNames = this.gridOptions.favorites.map(f => f.favoriteName);
678
- localStorage.setItem(`GRID_${this.gridOptions.gridKey}_FAVORITES`, JSON.stringify(favoriteNames));
679
- this.gridOptions.favorites.forEach(favorite => {
680
- // Make sure we haven't added a new column that needs to be saved
681
- this.gridOptions.columns.forEach(c => {
682
- const columnExists = favorite.columns.findIndex(x => x.dataFieldName === c.dataFieldName);
683
- if (columnExists < 0)
684
- favorite.columns.push(c);
685
- });
686
- let gridColumnsJSON = JSON.stringify(favorite.columns);
687
- if (this.gridOptions.gridKey) {
688
- const suffix = favorite.favoriteName === 'Default' ? '' : ('_' + favorite.favoriteName);
689
- localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
690
- }
691
- });
692
- if (favoriteNames.indexOf(this.selectedFavorite) < 0)
693
- this.selectedFavorite = "Default";
694
- }
695
- this.selectedFavorite = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE") || 'Default';
696
- // Check to make sure we don't have any duplicate column names
697
- this.gridOptions.columns.forEach(c1 => {
698
- const dataFieldCount = (this.gridOptions.columns.filter(x => x.dataFieldName === c1.dataFieldName) || []).length;
699
- if (dataFieldCount > 1)
700
- console.error(`Grid ${this.gridOptions.gridKey} column ${c1.dataFieldName} is defined ${dataFieldCount} times`);
701
- });
702
- const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
703
- let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
704
- if (gridColumnsJson) {
705
- let columns = JSON.parse(gridColumnsJson);
706
- let displayOrder = 0;
707
- columns.forEach(c => {
708
- let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
709
- if (column) {
710
- column.visible = c.visible;
711
- column.displayOrder = displayOrder;
712
- column.titleOrientation = c.titleOrientation;
713
- column.titleHeight = c.titleHeight;
714
- column.width = c.width;
715
- column.flexible = c.flexible;
716
- column.sortDirection = c.sortDirection;
717
- column.isLocked = c.isLocked;
718
- //column.filterType = c.filterType;
719
- if (column.isLocked && column.filterType !== SlickGridColumnFilterTypes.none) {
720
- column.isFiltering = true;
721
- if (column.filterType === SlickGridColumnFilterTypes.text)
722
- column.filterText = c.filterText;
723
- else if (column.filterType === SlickGridColumnFilterTypes.dropdown)
724
- column.filterDropdownValue = c.filterDropdownValue;
725
- if (!column.filterText && !column.filterDropdownValue) {
726
- column.isFiltering = false;
727
- column.isLocked = false;
728
- column.filterText = null;
729
- column.filterDropdownValue = null;
730
- }
731
- }
732
- }
733
- displayOrder++;
734
- });
735
- }
736
- if (this.gridOptions.defaultRecordsPerPage && !localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE"))
737
- this.recordsPerPageValue = this.gridOptions.defaultRecordsPerPage.toString();
738
- else
739
- this.recordsPerPageValue = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE") || "Auto";
740
- const favoritesJson = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES") || `["Default"]`;
741
- this.favorites = JSON.parse(favoritesJson).map(favorite => {
742
- return new DropDownModel(favorite);
743
- });
744
- }
745
- this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
746
- this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
747
- this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
748
- let sortColumn = this.visibleColumns.find(c => c.sortable === true && c.sortDirection > 0);
749
- if (this.visibleColumns.length > 0 && sortColumn) {
750
- this.requestModel.sortColumn = sortColumn.dataFieldName;
751
- this.requestModel.sortDirection = sortColumn.sortDirection;
752
- }
753
- }
754
- }
755
- SlickGridComponent.decorators = [
756
- { type: Component, args: [{
757
- selector: 'slick-grid',
758
- template: "<div id=\"slick-grid_{{uuid}}\" class=\"slick-grid d-flex flex-column flex-fill\" style=\"position: absolute; left: 0; top: 0; right: 0; bottom: 0;\" #slickGrid>\r\n\t<div #tableContainer class=\"d-flex flex-fill\" style=\"overflow: auto\">\r\n\r\n\t\t<div>\r\n\t\t\t<table #tableRef class=\"table table-sm\" [class.table-bordered]=\"bordered\" [class.table-borderless]=\"!bordered\" [class.table-striped]=\"striped\" [class.table-hover]=\"hover\" [style.opacity]=\"gridOpacity\" style=\"margin: 0; padding: 0;\" (keydown)=\"tableKeydown($event)\" tabindex=\"0\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr #tableHeaderRow (mousemove)=\"onColResizeMousemove($event)\" [ngClass]=\"{ 'resizing': isResizing === true }\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns; let idx = index\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [style.height]=\"column.titleHeight\">\r\n\t\t\t\t\t\t\t<div [ngClass]=\"{ 'slick-grid_title-vertical' : column.titleOrientation === 1 }\">\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"idx > 0 && idx < visibleColumns.length\" class=\"resize_column_left\" [class.table-bordered]=\"bordered\" (mousedown)=\"onColResizeMousedown($event, idx - 1)\" (dblclick)=\"onColResizeDoubleclick($event, idx - 1)\"></div>\r\n\t\t\t\t\t\t\t\t<span class=\"sortIcon\" *ngIf=\"column.sortable === true && column.sortDirection > 0\"><i class=\"far\" [ngClass]=\"{'fa-caret-up': column.sortDirection === 1, 'fa-caret-down': column.sortDirection === 2}\"></i>&nbsp;</span>\r\n\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" *ngIf=\"column.sortable === true\" (click)=\"sortBy(column)\" draggable=\"false\" title=\"{{column.title}}\">{{column.title}}</a>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.sortable === false\" title=\"{{column.title}}\">{{column.title}}</div>\r\n\t\t\t\t\t\t\t\t<div class=\"resize_column_right\" (mousedown)=\"onColResizeMousedown($event, idx)\" (dblclick)=\"onColResizeDoubleclick($event, idx)\"></div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t<tr #tableHeaderSearchRow *ngIf=\"showSearchRow === true\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div class=\"slick-grid_search-column\">\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering\" class=\"fas fa-times-circle bg-white text-danger mr-1\" (click)=\"resetFilter(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && column.isLocked\" class=\"far fa-lock mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && !column.isLocked\" class=\"far fa-lock-open mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 1\" class=\"slick-grid_text-search\">\r\n\t\t\t\t\t\t\t\t\t<input autocomplete=\"nope\" type=\"text\" class=\"form-control\" [(ngModel)]=\"column.filterText\" name=\"searchText\" placeholder=\"Search...\" (keydown)=\"onSearch(column)\" />\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 2\" class=\"input-group slick-grid_drop-down-search\">\r\n\t\t\t\t\t\t\t\t\t<slick-drop-down [items]=\"column.filterDropdownValues\" [(ngModel)]=\"column.filterDropdownValue\" listWidth=\"auto\" placeholder=\"Search...\" (onSelect)=\"onSearchSelect($event, column)\"></slick-drop-down>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr *ngIf=\"loaded && visibleData.length === 0\"><td [colSpan]=\"visibleColumns.length\">No Data</td></tr>\r\n\t\t\t\t\t<tr *ngFor=\"let rowData of visibleData; let idx = index\" #tableBodyRows (click)=\"onRowClicked(rowData, idx)\" (dblclick)=\"onRowDoubleClicked(rowData, idx)\" (contextmenu)=\"onRowContextMenuClicked($event, rowData, idx)\" [class.table-success]=\"selectedIndex === idx\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div *ngIf=\"!column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [innerHTML]=\"getColumnHTML(rowData, column.dataFieldName) | slickGridSanitizeHtml\"></div>\r\n\t\t\t\t\t\t\t<div *ngIf=\"column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRefs[column.columnKey], context: { $implicit: rowData }\">\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\r\n\t<div class=\"slick-grid-footer mt-2 d-flex\">\r\n\t\t<div>\r\n\t\t\t<button type=\"button\" (click)=\"openColumnSelectDialog()\" class=\"btn btn-outline-primary\"><i class=\"far fa-columns\"></i></button>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"favorites?.length > 1\">\r\n\t\t\t<button #favoriteSelectRef type=\"button\" class=\"btn btn-outline-primary ml-1\"><i class=\"far fa-star\"></i> {{this.selectedFavorite}}</button>\r\n\t\t\t<slick-popover [element]=\"favoriteSelectRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 250px; cursor: default\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor=\"let favorite of favorites\" (click)=\"setFavorite(favorite.text)\">\r\n\t\t\t\t\t\t\t<td><i *ngIf=\"favorite.text === selectedFavorite\" class=\"far fa-star mr-1\"></i>{{favorite.text}}</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\">\r\n\t\t\t<slick-paging [(pageNumber)]=\"currentPage\" [totalRecords]=\"totalRecords\" [recordsPerPage]=\"recordsPerPage\" (onPageChange)=\"onPageChange($event)\"></slick-paging>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\" class=\"ml-1\">\r\n\t\t\t<button #recordsPerPageRef type=\"button\" class=\"btn btn-outline-primary\">{{recordsPerPageValue}}&nbsp;&nbsp;<i style=\"font-size: 12px\" class=\"far fa-chevron-down\"></i></button>\r\n\r\n\t\t\t<slick-popover [element]=\"recordsPerPageRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 150px;\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('Auto')\"><td>Auto</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('25')\"><td>25</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('50')\"><td>50</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('100')\"><td>100</td></tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<slick-dialog #columnSelectDialogRef header=\"Select Columns\">\r\n\t<div style=\"text-align: center; width: 475px;\" class=\"mx-5\">\r\n\t\t<div class=\"d-flex\">\r\n\t\t\t<div class=\"flex-fill\">\r\n\t\t\t\t<slick-drop-down [items]=\"favorites\"\r\n\t\t\t\t\t\t\t\t [ngModel]=\"selectedFavorite\"\r\n\t\t\t\t\t\t\t\t (onSelect)=\"loadFavorite($event)\"></slick-drop-down>\r\n\t\t\t</div>\r\n\t\t\t<div><button class=\"btn btn-outline-primary ml-1\" (click)=\"addNewFavorite()\"><i class=\"far fa-plus\"></i></button></div>\r\n\t\t</div>\r\n\t\t<div class=\"d-flex flex-column mt-1\" slick-drop-list (onSlickDropListReorder)=\"onColumnReorder($event)\">\r\n\t\t\t<div *ngFor=\"let column of columnSelectDialogColumns\" class=\"d-flex\" slick-drop-list-item>\r\n\t\t\t\t<div style=\"width: 20px\"><input type=\"checkbox\" style=\"position: relative; top: 2px;\" [(ngModel)]=\"column.visible\" /></div>\r\n\t\t\t\t<div class=\"py-0 flex-fill\" style=\"text-align: left; cursor: ns-resize\" slick-drop-list-grab>{{column.title}}</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<slick-dialog-footer>\r\n\t\t<div style=\"margin-top: 10px;\" class=\"col-12 text-center mb-2 mt-1\">\r\n\t\t\t<button type=\"button\" (click)=\"onSaveColumns()\" class=\"btn btn-outline-primary mr-1\"><i class=\"far fa-save\"></i>&nbsp;Save</button>&nbsp;\r\n\t\t\t<button type=\"button\" class=\"btn btn-outline-danger\" (click)=\"onCancelColumns()\">Cancel</button>\r\n\t\t</div>\r\n\t</slick-dialog-footer>\r\n</slick-dialog>\r\n\r\n\r\n<slick-confirm-dialog #addNewFavoriteDialogRef width=\"300\">\r\n\t<label>Enter new favorite name</label>\r\n\t<input type=\"text\" class=\"form-control mx-3\" style=\"width: 250px\" [(ngModel)]=\"newFavoriteText\" />\r\n</slick-confirm-dialog>",
759
- providers: [SlickGridService]
760
- },] }
761
- ];
762
- /** @nocollapse */
763
- SlickGridComponent.ctorParameters = () => [
764
- { type: SlickGridService },
765
- { type: SlickFunctionLockService },
766
- { type: ChangeDetectorRef }
767
- ];
768
- SlickGridComponent.propDecorators = {
769
- flexColumn: [{ type: HostBinding, args: ['class',] }],
770
- gridOptions: [{ type: Input }],
771
- bordered: [{ type: Input }],
772
- striped: [{ type: Input }],
773
- hover: [{ type: Input }],
774
- showingAllRecords: [{ type: Input }],
775
- data: [{ type: Input }],
776
- onRowSelected: [{ type: Output }],
777
- onRowDoubleClick: [{ type: Output }],
778
- onRowContextMenu: [{ type: Output }],
779
- onFavoritesModified: [{ type: Output }],
780
- slickGridRef: [{ type: ViewChild, args: ["slickGrid", { static: true },] }],
781
- tableContainerRef: [{ type: ViewChild, args: ["tableContainer",] }],
782
- tableRef: [{ type: ViewChild, args: ["tableRef",] }],
783
- tableHeaderRowRef: [{ type: ViewChild, args: ["tableHeaderRow",] }],
784
- tableHeaderSearchRowRef: [{ type: ViewChild, args: ["tableHeaderSearchRow",] }],
785
- testRowRef: [{ type: ViewChild, args: ["testRow",] }],
786
- tableBodyRowsRef: [{ type: ViewChild, args: ["tableBodyRows",] }],
787
- columnSelectDialogRef: [{ type: ViewChild, args: ["columnSelectDialogRef",] }],
788
- addNewFavoriteDialogRef: [{ type: ViewChild, args: ["addNewFavoriteDialogRef",] }],
789
- slickGridColumnTemplates: [{ type: ContentChildren, args: [SlickGridColumnTemplateDirective,] }],
790
- onResize: [{ type: HostListener, args: ['window:resize', ['$event', '$event.target'],] }]
791
- };
792
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9zbGljay1ncmlkL3NsaWNrLWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUE4RCxlQUFlLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwTyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQXlCLDBCQUEwQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFNUgsT0FBTyxFQUFFLHFCQUFxQixFQUFnQyxNQUFNLDRCQUE0QixDQUFDO0FBRWpHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdILE9BQU8sRUFBMkIsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RixNQUFNLGFBQWE7SUFDbEIsWUFBWSxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIs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QUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBIb3N0QmluZGluZywgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRTZXJ2aWNlIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElTbGlja0dyaWRDb2x1bW5Nb2RlbCwgU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMsIFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24gfSBmcm9tIFwiLi9zbGljay1ncmlkLWNvbHVtbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJU2xpY2tHcmlkT3B0aW9ucyB9IGZyb20gXCIuL3NsaWNrLWdyaWQub3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRSZXF1ZXN0TW9kZWwsIElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWwgfSBmcm9tIFwiLi9zbGljay1ncmlkLXJlcXVlc3QubW9kZWxcIjtcclxuaW1wb3J0IHsgU2xpY2tHcmlkUmVzcG9uc2VNb2RlbCB9IGZyb20gXCIuL3NsaWNrLWdyaWQtcmVzcG9uc2UubW9kZWxcIjtcclxuaW1wb3J0IHsgU2xpY2tEaWFsb2dDb21wb25lbnQgfSBmcm9tIFwiLi4vc2xpY2stZGlhbG9nL3NsaWNrLWRpYWxvZy5tb2R1bGVcIjtcclxuaW1wb3J0IHsgU2xpY2tTbGVlcFNlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHMvc2xpY2stc2xlZXAuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja1V0aWxzU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay11dGlscy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNsaWNrRnVuY3Rpb25Mb2NrU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay1mdW5jdGlvbi1sb2NrLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9zbGljay1ncmlkLWNvbHVtbi10ZW1wbGF0ZS5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHsgU2xpY2tDb25maXJtRGlhbG9nQ29tcG9uZW50LCBTbGlja0NvbmZpcm1EaWFsb2dSZXN1bHRzIH0gZnJvbSAnLi4vc2xpY2stY29uZmlybS1kaWFsb2cvc2xpY2stY29uZmlybS1kaWFsb2cubW9kdWxlJztcclxuaW1wb3J0IHsgSVNsaWNrR3JpZEZhdm9yaXRlTW9kZWwsIFNsaWNrR3JpZEZhdm9yaXRlTW9kZWwgfSBmcm9tICcuL3NsaWNrLWdyaWQtZmF2b3JpdGUubW9kZWwnO1xyXG5cclxuY2xhc3MgRHJvcERvd25Nb2RlbCB7XHJcblx0Y29uc3RydWN0b3IodGV4dDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmlkID0gdGV4dDtcclxuXHRcdHRoaXMudGV4dCA9IHRleHQ7XHJcblx0fVxyXG5cclxuXHRpZDogc3RyaW5nO1xyXG5cdHRleHQ6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdzbGljay1ncmlkJyxcclxuXHR0ZW1wbGF0ZVVybDogJ3NsaWNrLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHByb3ZpZGVyczogW1NsaWNrR3JpZFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbGlja0dyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHRASG9zdEJpbmRpbmcoJ2NsYXNzJykgZmxleENvbHVtbiA9ICdzbGljay1mbGV4LWNvbHVtbic7XHJcblx0Ly9ASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3MgPSAnZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtZmlsbCc7XHJcblxyXG5cdEBJbnB1dCgpIGdyaWRPcHRpb25zOiBJU2xpY2tHcmlkT3B0aW9ucztcclxuXHRASW5wdXQoKSBib3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgc3RyaXBlZDogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgaG92ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdEBJbnB1dCgpIHNob3dpbmdBbGxSZWNvcmRzID0gZmFsc2U7XHJcblx0QElucHV0KCkgZGF0YTogYW55W107XHJcblx0QE91dHB1dCgpIG9uUm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uUm93RG91YmxlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uUm93Q29udGV4dE1lbnU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uRmF2b3JpdGVzTW9kaWZpZWQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG5cdEBWaWV3Q2hpbGQoXCJzbGlja0dyaWRcIiwgeyBzdGF0aWM6IHRydWUgfSkgc2xpY2tHcmlkUmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUNvbnRhaW5lclwiKSB0YWJsZUNvbnRhaW5lclJlZjogRWxlbWVudFJlZjtcclxuXHRAVmlld0NoaWxkKFwidGFibGVSZWZcIikgdGFibGVSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlSGVhZGVyUm93XCIpIHRhYmxlSGVhZGVyUm93UmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUhlYWRlclNlYXJjaFJvd1wiKSB0YWJsZUhlYWRlclNlYXJjaFJvd1JlZjogRWxlbWVudFJlZjtcclxuXHQvLyBUaGlzIGlzIHRvIHRlc3QgaG93IGhpZ2ggYSBzdGFuZGFyZCByb3cgaXNcclxuXHRAVmlld0NoaWxkKFwidGVzdFJvd1wiKSB0ZXN0Um93UmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUJvZHlSb3dzXCIpIHRhYmxlQm9keVJvd3NSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcImNvbHVtblNlbGVjdERpYWxvZ1JlZlwiKSBjb2x1bW5TZWxlY3REaWFsb2dSZWY6IFNsaWNrRGlhbG9nQ29tcG9uZW50O1xyXG5cdEBWaWV3Q2hpbGQoXCJhZGROZXdGYXZvcml0ZURpYWxvZ1JlZlwiKSBhZGROZXdGYXZvcml0ZURpYWxvZ1JlZjogU2xpY2tDb25maXJtRGlhbG9nQ29tcG9uZW50O1xyXG5cclxuXHRAQ29udGVudENoaWxkcmVuKFNsaWNrR3JpZENvbHVtblRlbXBsYXRlRGlyZWN0aXZlKSBzbGlja0dyaWRDb2x1bW5UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxTbGlja0dyaWRDb2x1bW5UZW1wbGF0ZURpcmVjdGl2ZT47XHJcblx0dGVtcGxhdGVSZWZzOiBhbnk7XHJcblxyXG5cdHByaXZhdGUgZm5Pbk1vdXNlVXAgPSAoZSkgPT4gdGhpcy5vbk1vdXNlVXAoZSk7XHJcblxyXG5cdHV1aWQ6IHN0cmluZztcclxuXHRzZWxlY3RlZEluZGV4OiBudW1iZXIgPSBudWxsO1xyXG5cdGdyaWRPcGFjaXR5ID0gMDtcclxuXHR2aXNpYmxlQ29sdW1uczogSVNsaWNrR3JpZENvbHVtbk1vZGVsW107XHJcblx0ZmF2b3JpdGVzOiBEcm9wRG93bk1vZGVsW107XHJcblx0c2VsZWN0ZWRGYXZvcml0ZTogc3RyaW5nO1xyXG5cdG5ld0Zhdm9yaXRlVGV4dDogc3RyaW5nO1xyXG5cdGNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnM6IElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdO1xyXG5cdGxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdGlzRG91YmxlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRkb3VibGVDbGlja1dhaXRUaW1lb3V0OiBOb2RlSlMuVGltZXI7XHJcblx0Y3VycmVudFBhZ2U6IG51bWJlciA9IDE7XHJcblx0c2VhcmNoVGltZW91dDogTm9kZUpTLlRpbWVyO1xyXG5cdGtleXByZXNzVGltZW91dDogTm9kZUpTLlRpbWVyO1xyXG5cdHNob3dUZXN0Um93ID0gZmFsc2U7XHJcblx0c2hvd1NlYXJjaFJvdyA9IGZhbHNlO1xyXG5cdGlzUmVzaXppbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHR2aXNpYmxlRGF0YTogYW55W10gPSBbXTtcclxuXHRyZWNvcmRzUGVyUGFnZTogbnVtYmVyO1xyXG5cdHRvdGFsUmVjb3JkczogbnVtYmVyO1xyXG5cdHJlY29yZHNQZXJQYWdlVmFsdWU6IHN0cmluZyA9IFwiQXV0b1wiO1xyXG5cclxuXHRwcml2YXRlIHNsaWNrR3JpZEhlaWdodDogbnVtYmVyO1xyXG5cdHByaXZhdGUgcmVzaXplVGltZW91dDogTm9kZUpTLlRpbWVyID0gbnVsbDtcclxuXHRwcml2YXRlIHJlcXVlc3RNb2RlbDogU2xpY2tHcmlkUmVxdWVzdE1vZGVsO1xyXG5cdHByaXZhdGUgcmVzaXplSW5pdGlhbFBvczogbnVtYmVyO1xyXG5cdHByaXZhdGUgcmVzaXplSW5pdGlhbFdpZHRoOiBudW1iZXI7XHJcblx0cHJpdmF0ZSByZXNpemVDb2xJZHg6IG51bWJlcjtcclxuXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50JywgJyRldmVudC50YXJnZXQnXSlcclxuXHRhc3luYyBvblJlc2l6ZShldmVudDogVUlFdmVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuXHRcdC8vIFRoaXMgaXMgaGVyZSBiZWNhdXNlIGZpcmVmb3ggc2hvd3MvaGlkZXMgdGhlIG1lbnUgaWYgeW91IHByZXNzIGFsdC4gRG9uJ3QgcmVkcmF3IHRoZSBncmlkIGlmIHdlJ3JlXHJcblx0XHQvLyBqdXN0IHNob3dpbmcgdGhlIG1lbnVcclxuXHRcdGlmIChNYXRoLmFicyh0aGlzLnNsaWNrR3JpZEhlaWdodCAtIHRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSA8IDUwKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0aWYgKHRoaXMuc2xpY2tHcmlkSGVpZ2h0ICE9PSB0aGlzLnNsaWNrR3JpZFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCkge1xyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0KTtcclxuXHRcdFx0dGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSB0aGlzLnJlY29yZHNQZXJQYWdlO1xyXG5cdFx0XHRcdHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0fSwgNTAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JpZFNlcnZpY2U6IFNsaWNrR3JpZFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGZ1bmN0aW9uTG9ja1NlcnZpY2U6IFNsaWNrRnVuY3Rpb25Mb2NrU2VydmljZSxcclxuXHRcdHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHR0aGlzLnV1aWQgPSBTbGlja1V0aWxzU2VydmljZS5uZXdHdWlkKCk7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbCA9IG5ldyBTbGlja0dyaWRSZXF1ZXN0TW9kZWwoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5zZXRHcmlkT3B0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdC8vIENvcHkgdGhlIHRlbXBsYXRlcyB0byBhIHZhcmlhYmxlIHRoYXQgdGhlIGh0bWwgY2FuIGFjY2Vzcy4gIEl0IGNhbid0IGFjY2VzcyBhIFF1ZXJ5TGlzdFxyXG5cdFx0dGhpcy50ZW1wbGF0ZVJlZnMgPSB7fTtcclxuXHRcdHRoaXMuc2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVzLmZvckVhY2godCA9PiB7XHJcblx0XHRcdHRoaXMudGVtcGxhdGVSZWZzW3QuY29sdW1uS2V5XSA9IHQudGVtcGxhdGU7XHJcblx0XHR9KTtcclxuXHRcdGlmICh0aGlzLnRhYmxlUmVmKVxyXG5cdFx0XHQoPEhUTUxUYWJsZUVsZW1lbnQ+dGhpcy50YWJsZVJlZi5uYXRpdmVFbGVtZW50KS5mb2N1cygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgdGFibGVLZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuXHRcdC8vIEtleSB1cFxyXG5cdFx0aWYgKGUud2hpY2ggPT09IDM4ICYmICEodGhpcy5zZWxlY3RlZEluZGV4ID09PSAwICYmIHRoaXMuY3VycmVudFBhZ2UgPT09IDEpKSB7XHJcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLmtleXByZXNzVGltZW91dCk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgtLTtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8IDApIHtcclxuXHRcdFx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHtcclxuXHRcdFx0XHRcdHRoaXMuY3VycmVudFBhZ2UtLTtcclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLmN1cnJlbnRQYWdlLCBmYWxzZSk7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLnJlY29yZHNQZXJQYWdlIC0gMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMua2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuXHRcdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdFx0Ly8gS2V5IGRvd25cclxuXHRcdGlmIChlLndoaWNoID09PSA0MCkge1xyXG5cdFx0XHRpZiAoKCh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJlY29yZHNQZXJQYWdlKSArIHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLnRvdGFsUmVjb3JkcylcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5rZXlwcmVzc1RpbWVvdXQpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgrKztcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLnJlY29yZHNQZXJQYWdlKSB7XHJcblx0XHRcdFx0aWYgKCgodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5yZWNvcmRzUGVyUGFnZSkgKyB0aGlzLnNlbGVjdGVkSW5kZXggPCB0aGlzLnRvdGFsUmVjb3Jkcykge1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSsrO1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIGZhbHNlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMua2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuXHRcdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG5cdFx0aWYgKGNoYW5nZXMuYm9yZGVyZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuYm9yZGVyZWQgPT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5ib3JkZXJlZCA9ICh0aGlzLmJvcmRlcmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAhPT0gJ2ZhbHNlJykgPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuc3RyaXBlZCkge1xyXG5cdFx0XHQvLyBUaGUgZ3JpZCBvcHRpb25zIG92ZXJyaWRlIHRoZSB0YWcgb3B0aW9uc1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5zdHJpcGVkID09PSBudWxsKVxyXG5cdFx0XHRcdHRoaXMuc3RyaXBlZCA9ICh0aGlzLnN0cmlwZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5ob3Zlcikge1xyXG5cdFx0XHQvLyBUaGUgZ3JpZCBvcHRpb25zIG92ZXJyaWRlIHRoZSB0YWcgb3B0aW9uc1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ob3ZlciA9PT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmhvdmVyID0gKHRoaXMuaG92ZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5ncmlkT3B0aW9ucykge1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZCAhPT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmJvcmRlcmVkID0gdGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZDtcclxuXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLnN0cmlwZWQgIT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5zdHJpcGVkID0gdGhpcy5ncmlkT3B0aW9ucy5zdHJpcGVkO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuaG92ZXIgIT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5ob3ZlciA9IHRoaXMuZ3JpZE9wdGlvbnMuaG92ZXI7XHJcblxyXG5cdFx0XHR0aGlzLnNldEdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjaGFuZ2VzLmRhdGEpIHtcclxuXHRcdFx0Ly8gSWYgd2UgZG9uJ3QgZG8gdGhpcyBsb2NrLCB0aGUgZmlyc3QgY2hhbmdlIHdpbGwgaGF2ZSBudWxsIGRhdGEgYW5kIGNyYXNoLiAgVGhlIHNlY29uZCByZXF1ZXN0IHdpbGwgaGF2ZSB0aGUgYWN0dWFsIGRhdGFcclxuXHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfREFUQV9DSEFOR0VTXCIpO1xyXG5cdFx0XHQvLyBPbmx5IHJlc2l6ZSB0aGUgZ3JpZCBvbiB0aGUgZmlyc3QgY2hhbmdlLCBvdGhlcndpc2Ugd2UgZ2V0IGEgZmxpY2tlclxyXG5cdFx0XHRpZiAoY2hhbmdlcy5kYXRhLmZpcnN0Q2hhbmdlID09PSB0cnVlKVxyXG5cdFx0XHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCgpO1xyXG5cdFx0XHQvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByZXNpemUgaW4gdGhlIE9uSW5pdCB0byBmaW5pc2ggYmVmb3JlIHdlIGNvbnRpbnVlXHJcblx0XHRcdHRoaXMubG9hZGVkID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0Um93KDApO1xyXG5cdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9EQVRBX0NIQU5HRVNcIik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpIHtcclxuXHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmZuT25Nb3VzZVVwKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uUmVjb3Jkc1BlclBhZ2VTZWxlY3RlZChyZWNvcmRzUGVyUGFnZTogc3RyaW5nKSB7XHJcblx0XHRpZiAoIXJlY29yZHNQZXJQYWdlKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gcmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkdSSURfXCIgKyB0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkgKyBcIl9SRUNPUkRTX1BFUl9QQUdFXCIsIHJlY29yZHNQZXJQYWdlKTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVEYXRhID0gW107XHJcblx0XHR0aGlzLmdyaWRPcGFjaXR5ID0gMDtcclxuXHRcdGF3YWl0IFNsaWNrU2xlZXBTZXJ2aWNlLnNsZWVwKCk7XHJcblx0XHRhd2FpdCB0aGlzLnJlc2l6ZUdyaWQodHJ1ZSk7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRhd2FpdCB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuXHR9XHJcblxyXG5cdG9uQ29sUmVzaXplTW91c2Vkb3duKGU6IE1vdXNlRXZlbnQsIGNvbHVtbklkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xyXG5cdFx0dGhpcy5yZXNpemVJbml0aWFsUG9zID0gZS5wYWdlWDtcclxuXHRcdHRoaXMucmVzaXplQ29sSWR4ID0gY29sdW1uSWR4O1xyXG5cdFx0bGV0IGNvbCA9ICg8SFRNTFRhYmxlUm93RWxlbWVudD50aGlzLnRhYmxlSGVhZGVyUm93UmVmLm5hdGl2ZUVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZFwiKS5pdGVtKGNvbHVtbklkeCk7XHJcblx0XHR0aGlzLnJlc2l6ZUluaXRpYWxXaWR0aCA9IGNvbC5vZmZzZXRXaWR0aCAtIDk7XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLmZsZXhpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVEb3VibGVjbGljayhlOiBNb3VzZUV2ZW50LCBjb2x1bW5JZHg6IG51bWJlcikge1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLmZsZXhpYmxlID0gdHJ1ZTtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbY29sdW1uSWR4XS53aWR0aCA9IG51bGw7XHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHR9XHJcblxyXG5cdG9uQ29sUmVzaXplTW91c2Vtb3ZlKGU6IE1vdXNlRXZlbnQpIHtcclxuXHRcdGlmICghdGhpcy5pc1Jlc2l6aW5nKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0bGV0IG5ld0N1cnNvclBvcyA9IGUucGFnZVg7XHJcblx0XHRsZXQgZGlmZiA9IG5ld0N1cnNvclBvcyAtIHRoaXMucmVzaXplSW5pdGlhbFBvcztcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbdGhpcy5yZXNpemVDb2xJZHhdLndpZHRoID0gKHRoaXMucmVzaXplSW5pdGlhbFdpZHRoICsgZGlmZikgKyBcInB4XCI7XHJcblx0XHRpZiAoKHRoaXMucmVzaXplSW5pdGlhbFdpZHRoICsgZGlmZikgPCAxMClcclxuXHRcdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0ud2lkdGggPSBcIjEwcHhcIjtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbdGhpcy5yZXNpemVDb2xJZHhdLmZsZXhpYmxlID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG9uTW91c2VVcChlKSB7XHJcblx0XHR0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTtcclxuXHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmZuT25Nb3VzZVVwKTtcclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdH1cclxuXHJcblx0Z2V0VmlzaWJsZVJlY29yZHMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy52aXNpYmxlRGF0YTtcclxuXHR9XHJcblxyXG5cdGFkZE5ld1JlY29yZChuZXdSZWNvcmQ6IGFueSwgc2VsZWN0TmV3UmVjb3JkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHRcdHRoaXMudmlzaWJsZURhdGEudW5zaGlmdChuZXdSZWNvcmQpO1xyXG5cclxuXHRcdGlmIChzZWxlY3ROZXdSZWNvcmQgPT09IHRydWUpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleClcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgrKztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZVJlY29yZChyb3dOdW06IG51bWJlciwgcmVjb3JkOiBhbnkpIHtcclxuXHRcdHRoaXMudmlzaWJsZURhdGFbcm93TnVtXSA9IHJlY29yZDtcclxuXHR9XHJcblxyXG5cdG9uUm93Q2xpY2tlZChyb3dEYXRhOiBhbnksIGlkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBpZHg7XHJcblx0XHRjbGVhclRpbWVvdXQodGhpcy5kb3VibGVDbGlja1dhaXRUaW1lb3V0KTtcclxuXHRcdHRoaXMuZG91YmxlQ2xpY2tXYWl0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHR0aGlzLm9uUm93U2VsZWN0ZWQuZW1pdChyb3dEYXRhKTtcclxuXHRcdH0sIDI1MCk7XHJcblx0fVxyXG5cclxuXHRvblJvd0RvdWJsZUNsaWNrZWQocm93RGF0YTogYW55LCBpZHgpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IGlkeDtcclxuXHRcdGNsZWFyVGltZW91dCh0aGlzLmRvdWJsZUNsaWNrV2FpdFRpbWVvdXQpO1xyXG5cdFx0dGhpcy5vblJvd0RvdWJsZUNsaWNrLmVtaXQocm93RGF0YSk7XHJcblx0fVxyXG5cclxuXHRvblJvd0NvbnRleHRNZW51Q2xpY2tlZChlOiBNb3VzZUV2ZW50LCByb3dEYXRhLCBpZHgpIHtcclxuXHRcdGlmICh0aGlzLm9uUm93Q29udGV4dE1lbnUpIHtcclxuXHRcdFx0bGV0IHJvd0NvbnRleHRNZW51TW9kZWwgPSB7XHJcblx0XHRcdFx0bW91c2VFdmVudDogZSxcclxuXHRcdFx0XHRkYXRhOiByb3dEYXRhLFxyXG5cdFx0XHRcdHJvd0lkeDogaWR4XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMub25Sb3dDb250ZXh0TWVudS5lbWl0KHJvd0NvbnRleHRNZW51TW9kZWwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgb25QYWdlQ2hhbmdlKHBhZ2VOdW1iZXIsIHNlbGVjdFJvdzogYm9vbGVhbiA9IHRydWUpIHtcclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtYmVyO1xyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IHBhZ2VOdW1iZXI7XHJcblx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAodGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpID8gMCA6IG51bGw7XHJcblxyXG5cdFx0aWYgKHNlbGVjdFJvdyA9PT0gdHJ1ZSAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRjb25zdCByb3dEYXRhID0gdGhpcy52aXNpYmxlRGF0YVt0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdCg8SFRNTFRhYmxlRWxlbWVudD50aGlzLnRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyByZWxvYWRHcmlkKGFkZGl0aW9uYWxQYXJhbXM6IGFueSk6IFByb21pc2U8U2xpY2tHcmlkUmVzcG9uc2VNb2RlbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURcIik7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnVybCA9IHRoaXMuZ3JpZE9wdGlvbnMuZ2V0VXJsO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5odHRwSGVhZGVycyA9IHRoaXMuZ3JpZE9wdGlvbnMuaHR0cEhlYWRlcnM7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmFkZGl0aW9uYWxQYXJhbXMgPSBhZGRpdGlvbmFsUGFyYW1zO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSB0aGlzLnJlY29yZHNQZXJQYWdlO1xyXG5cclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURcIik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2VNb2RlbCk7XHJcblx0XHR9XHJcblx0XHRjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVsb2FkR3JpZFdpdGhSZXF1ZXN0TW9kZWwocmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwpOiBQcm9taXNlPFNsaWNrR3JpZFJlc3BvbnNlTW9kZWw+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURHUklEV0lUSFJFUVVFU1RNT0RFTFwiKTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwgPSByZXF1ZXN0TW9kZWw7XHJcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURXSVRIUkVRVUVTVE1PREVMXCIpO1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTW9kZWwpO1xyXG5cdFx0fVxyXG5cdFx0Y2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhc3luYyByZWxvYWQocmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwpOiBQcm9taXNlPFNsaWNrR3JpZFJlc3BvbnNlTW9kZWw+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BRFwiKTtcclxuXHJcblx0XHRcdHJlcXVlc3RNb2RlbCA9IHRoaXMuZ2V0UmVxdWVzdE1vZGVsKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHJcblx0XHRcdGxldCByZXNwb25zZU1vZGVsOiBTbGlja0dyaWRSZXNwb25zZU1vZGVsID0gbnVsbDtcclxuXHRcdFx0aWYgKHJlcXVlc3RNb2RlbC51cmwpXHJcblx0XHRcdFx0cmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0RGF0YUZyb21TZXJ2ZXIocmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLmdyaWRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YU9iaihyZXF1ZXN0TW9kZWwsIHRoaXMuZGF0YSk7XHJcblxyXG5cdFx0XHR0aGlzLmxvYWRlZCA9IHRydWU7XHJcblx0XHRcdHRoaXMudG90YWxSZWNvcmRzID0gcmVzcG9uc2VNb2RlbC50b3RhbFJlY29yZHM7XHJcblx0XHRcdHRoaXMudmlzaWJsZURhdGEgPSByZXNwb25zZU1vZGVsLmRhdGE7XHJcblxyXG5cdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURcIik7XHJcblx0XHRcdFByb21pc2UucmVzb2x2ZShyZXNwb25zZU1vZGVsKTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVuc2VsZWN0Um93KCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdHNlbGVjdFJvdyhyb3dOdW1iZXI6IG51bWJlcikge1xyXG5cdFx0bGV0IHJvd0RhdGEgPSB0aGlzLnZpc2libGVEYXRhW3Jvd051bWJlcl07XHJcblx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCByb3dOdW1iZXIpO1xyXG5cdH1cclxuXHJcblx0Z2V0Q29sdW1uSFRNTChyb3dEYXRhLCBkYXRhRmllbGROYW1lKSB7XHJcblx0XHRjb25zdCBjb2x1bW5IVE1MID0gU2xpY2tVdGlsc1NlcnZpY2UuZ2V0RGVlcE9iamVjdChyb3dEYXRhLCBkYXRhRmllbGROYW1lKTtcclxuXHJcblx0XHRpZiAoY29sdW1uSFRNTCA9PT0gbnVsbCB8fCBjb2x1bW5IVE1MID09PSB1bmRlZmluZWQpXHJcblx0XHRcdHJldHVybiAnJztcclxuXHJcblx0XHRyZXR1cm4gY29sdW1uSFRNTC50b1N0cmluZygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc29ydEJ5KHNvcnRDb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcblx0XHRcdGlmIChzb3J0Q29sdW1uICYmIGMuY29sdW1uS2V5ICE9PSBzb3J0Q29sdW1uLmNvbHVtbktleSkge1xyXG5cclxuXHRcdFx0XHRjLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmU7XHJcblx0XHRcdH1cclxuXHRcdH0pXHJcblxyXG5cdFx0aWYgKHNvcnRDb2x1bW4pIHtcclxuXHRcdFx0aWYgKHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lKSB7XHJcblx0XHRcdFx0dGhpcy52aXNpYmxlQ29sdW1ucy5mb3JFYWNoKGMgPT4gYy5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lKTtcclxuXHRcdFx0XHRzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLmFzYztcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIGlmIChzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uYXNjKVxyXG5cdFx0XHRcdHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uZGVzYztcclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblNlYXJjaFNlbGVjdChkZFZhbHVlLCBjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0aWYgKCF0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMpXHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdGxldCBjb2x1bW5TZWFyY2hWYWx1ZUlkeCA9IHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5maW5kSW5kZXgoeCA9PiB4LmNvbHVtbk5hbWUgPT09IGNvbHVtbi5kYXRhRmllbGROYW1lKTtcclxuXHRcdGlmIChjb2x1bW5TZWFyY2hWYWx1ZUlkeCA+PSAwKVxyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuc3BsaWNlKGNvbHVtblNlYXJjaFZhbHVlSWR4LCAxKTtcclxuXHJcblx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoZGRWYWx1ZSkge1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0Y29sdW1uTmFtZTogY29sdW1uLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0c2VhcmNoVmFsdWVJZDogZGRWYWx1ZS5pZCxcclxuXHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IGRkVmFsdWUudGV4dFxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblNlYXJjaChjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHJcblx0XHRpZiAoIXRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcylcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzID0gW107XHJcblxyXG5cdFx0aWYgKGNvbHVtbi5maWx0ZXJUZXh0ID09PSBjb2x1bW4ubGFzdFNlYXJjaFRleHQpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRjb2x1bW4ubGFzdFNlYXJjaFRleHQgPSBjb2x1bW4uZmlsdGVyVGV4dDtcclxuXHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9ICEhY29sdW1uLmZpbHRlclRleHQ7XHJcblx0XHRpZiAoIWNvbHVtbi5pc0ZpbHRlcmluZylcclxuXHRcdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZW91dCk7XHJcblx0XHR0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0XHRsZXQgY29sdW1uU2VhcmNoVmFsdWVJZHggPSB0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuZmluZEluZGV4KHggPT4geC5jb2x1bW5OYW1lID09PSBjb2x1bW4uZGF0YUZpZWxkTmFtZSk7XHJcblx0XHRcdGlmIChjb2x1bW5TZWFyY2hWYWx1ZUlkeCA+PSAwKVxyXG5cdFx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5zcGxpY2UoY29sdW1uU2VhcmNoVmFsdWVJZHgsIDEpO1xyXG5cclxuXHRcdFx0aWYgKGNvbHVtbi5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnB1c2goPElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWw+e1xyXG5cdFx0XHRcdFx0Y29sdW1uTmFtZTogY29sdW1uLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IGNvbHVtbi5maWx0ZXJUZXh0XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHRpZiAodGhpcy52aXNpYmxlRGF0YSAmJiB0aGlzLnZpc2libGVEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHR9LCAyNTApO1xyXG5cdH1cclxuXHJcblx0dG9nZ2xlTG9jayhjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0Y29sdW1uLmlzTG9ja2VkID0gIWNvbHVtbi5pc0xvY2tlZDtcclxuXHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHJlc2V0RmlsdGVyKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdGNvbHVtbi5pc0xvY2tlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbHVtbi5maWx0ZXJUZXh0ID0gbnVsbDtcclxuXHRcdGNvbHVtbi5sYXN0U2VhcmNoVGV4dCA9IG51bGw7XHJcblx0XHRjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSB0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuZmlsdGVyKHggPT4geC5jb2x1bW5OYW1lICE9PSBjb2x1bW4uZGF0YUZpZWxkTmFtZSk7XHJcblxyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRvcGVuQ29sdW1uU2VsZWN0RGlhbG9nKCkge1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gWy4uLnRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uc107XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblxyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dSZWYuc2hvd0RpYWxvZygpO1xyXG5cdH1cclxuXHJcblx0b25Db2x1bW5Ecm9wKGU6IGFueSkge1xyXG5cdFx0Y29uc29sZS5sb2coZSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvbkNvbHVtblJlb3JkZXIoZTogbnVtYmVyW10pIHtcclxuXHRcdGNvbnN0IG9sZE9yZGVyID0gZVswXTtcclxuXHRcdGNvbnN0IG5ld09yZGVyID0gZVsxXTtcclxuXHJcblx0XHRpZiAob2xkT3JkZXIgPT09IG5ld09yZGVyKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0Y29uc3Qgc2VsZWN0ZWRDb2wgPSB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc3BsaWNlKG9sZE9yZGVyLCAxKVswXTtcclxuXHRcdHNlbGVjdGVkQ29sLmRpc3BsYXlPcmRlciA9IG5ld09yZGVyO1xyXG5cclxuXHRcdGxldCBjdXJyZW50T3JkZXIgPSAwO1xyXG5cdFx0Ly8gRXZlcnl0aGluZyB1cCB0byB0aGUgbmV3IG9yZGVyIHJlb3JkZXJlZCBmcm9tIDBcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdC8vIElmIHdlJ3JlIGF0IG5ld09yZGVyLCBsZWF2ZSBhIHNwb3RcclxuXHRcdFx0aWYgKGkgPT09IG5ld09yZGVyKVxyXG5cdFx0XHRcdGN1cnJlbnRPcmRlcisrO1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnNbaV0uZGlzcGxheU9yZGVyID0gY3VycmVudE9yZGVyKys7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucywgc2VsZWN0ZWRDb2xdO1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gdGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgYWRkTmV3RmF2b3JpdGUoKSB7XHJcblx0XHR0aGlzLm5ld0Zhdm9yaXRlVGV4dCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCB0aGlzLmFkZE5ld0Zhdm9yaXRlRGlhbG9nUmVmLmNvbmZpcm0oKTtcclxuXHJcblx0XHRpZiAoY29uZmlybVJlc3VsdCA9PT0gU2xpY2tDb25maXJtRGlhbG9nUmVzdWx0cy5PayAmJiB0aGlzLm5ld0Zhdm9yaXRlVGV4dCkge1xyXG5cdFx0XHQvLyBTYXZlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24gdG8gbG9jYWxzdG9yYWdlXHJcblx0XHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cclxuXHRcdFx0dGhpcy5mYXZvcml0ZXMucHVzaChuZXcgRHJvcERvd25Nb2RlbCh0aGlzLm5ld0Zhdm9yaXRlVGV4dCkpO1xyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gdGhpcy5uZXdGYXZvcml0ZVRleHQ7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIsIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0XHRjb25zdCBmYXZvcml0ZXNKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5mYXZvcml0ZXMubWFwKHggPT4geC50ZXh0KSk7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX0ZBVk9SSVRFU1wiLCBmYXZvcml0ZXNKc29uKTtcclxuXHJcblx0XHRcdC8vIFNhdmUgdGhlIG5ldyBvbmUgdG8gbG9jYWxzdG9yYWdlXHJcblx0XHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bG9hZEZhdm9yaXRlKGZhdm9yaXRlOiBEcm9wRG93bk1vZGVsKSB7XHJcblx0XHR0aGlzLnNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBmYXZvcml0ZS50ZXh0O1xyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSnNvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHt0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlfWApO1xyXG5cdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBzZXRGYXZvcml0ZShmYXZvcml0ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBmYXZvcml0ZTtcclxuXHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIsIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSnNvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHt0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlfWApO1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdHRoaXMuc2hvd1NlYXJjaFJvdyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gYy5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKS5sZW5ndGggPiAwO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0fVxyXG5cclxuXHRvblNhdmVDb2x1bW5zKCkge1xyXG5cdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uc107XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIGlmIHRoZXkndmUgaGlkZGVuIGEgY29sdW1uIHRoYXQgd2UgYXJlbid0IHRyeWluZyB0byBzb3J0IG9yIGZpbHRlciBieSB0aGlzIGNvbHVtblxyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goeCA9PiB7XHJcblx0XHRcdGlmICh4LnZpc2libGUgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0eC5maWx0ZXJEcm9wZG93blZhbHVlID0gbnVsbDtcclxuXHRcdFx0XHR4LmZpbHRlclRleHQgPSBudWxsO1xyXG5cdFx0XHRcdHguaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHR4LmlzTG9ja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0eC5sYXN0U2VhcmNoVGV4dCA9IG51bGw7XHJcblx0XHRcdFx0eC5zb3J0RGlyZWN0aW9uID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUgPT09IHRydWUpO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0XHR0aGlzLnNob3dTZWFyY2hSb3cgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjID0+IGMuZmlsdGVyVHlwZSAhPT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMubm9uZSkubGVuZ3RoID4gMDtcclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ1JlZi5oaWRlRGlhbG9nKCk7XHJcblx0XHR0aGlzLnJlc2l6ZUdyaWQoKTtcclxuXHJcblx0XHRpZiAodGhpcy5vbkZhdm9yaXRlc01vZGlmaWVkKSB7XHJcblx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZXM6IElTbGlja0dyaWRGYXZvcml0ZU1vZGVsW10gPSB0aGlzLmZhdm9yaXRlcy5tYXAoZmF2b3JpdGUgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZSA9IG5ldyBTbGlja0dyaWRGYXZvcml0ZU1vZGVsKCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9IGZhdm9yaXRlLnRleHQ7XHJcblx0XHRcdFx0Y29uc3Qgc3VmZml4ID0gZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSk7XHJcblx0XHRcdFx0Y29uc3QgZGlhbG9nQ29sdW1uc0pTT04gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRcdGdyaWRGYXZvcml0ZS5jb2x1bW5zID0gSlNPTi5wYXJzZShkaWFsb2dDb2x1bW5zSlNPTik7XHJcblx0XHRcdFx0cmV0dXJuIGdyaWRGYXZvcml0ZTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQuZW1pdChncmlkRmF2b3JpdGVzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uQ2FuY2VsQ29sdW1ucygpIHtcclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nUmVmLmhpZGVEaWFsb2coKTtcclxuXHR9XHJcblxyXG5cdHNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKSB7XHJcblx0XHRsZXQgZGlhbG9nQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMpO1xyXG5cdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSkge1xyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCwgZGlhbG9nQ29sdW1uc0pTT04pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpIHtcclxuXHRcdGxldCBncmlkQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMpO1xyXG5cdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSkge1xyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0XHJcblx0XHRcdGlmIChncmlkQ29sdW1uc0pzb24pIHtcclxuXHRcdFx0XHRsZXQgY29sdW1ucyA9IDxJU2xpY2tHcmlkQ29sdW1uTW9kZWxbXT5KU09OLnBhcnNlKGdyaWRDb2x1bW5zSnNvbik7XHJcblxyXG5cdFx0XHRcdGxldCBkaXNwbGF5T3JkZXIgPSAwO1xyXG5cdFx0XHRcdGNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0XHRcdGxldCBjb2x1bW4gPSB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmluZChncmlkQ29sdW1uID0+IGdyaWRDb2x1bW4uZGF0YUZpZWxkTmFtZSA9PT0gYy5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0XHRcdGlmIChjb2x1bW4pIHtcclxuXHRcdFx0XHRcdFx0Yy5kaXNwbGF5T3JkZXIgPSBkaXNwbGF5T3JkZXI7XHJcblx0XHRcdFx0XHRcdGMudGl0bGVPcmllbnRhdGlvbiA9IGNvbHVtbi50aXRsZU9yaWVudGF0aW9uO1xyXG5cdFx0XHRcdFx0XHRjLnRpdGxlSGVpZ2h0ID0gY29sdW1uLnRpdGxlSGVpZ2h0O1xyXG5cdFx0XHRcdFx0XHRjLndpZHRoID0gY29sdW1uLndpZHRoO1xyXG5cdFx0XHRcdFx0XHRjLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZTtcclxuXHRcdFx0XHRcdFx0Yy5maWx0ZXJUZXh0ID0gY29sdW1uLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRcdGMuaXNMb2NrZWQgPSBjb2x1bW4uaXNMb2NrZWQ7XHJcblx0XHRcdFx0XHRcdGMuaXNGaWx0ZXJpbmcgPSBjb2x1bW4uaXNGaWx0ZXJpbmc7XHJcblx0XHRcdFx0XHRcdGMuc29ydERpcmVjdGlvbiA9IGNvbHVtbi5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGRpc3BsYXlPcmRlcisrO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbHVtbnMgPSBjb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdFx0XHRcdGdyaWRDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWAsIGdyaWRDb2x1bW5zSlNPTik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMub25GYXZvcml0ZXNNb2RpZmllZCkge1xyXG5cdFx0XHRjb25zdCBncmlkRmF2b3JpdGVzOiBJU2xpY2tHcmlkRmF2b3JpdGVNb2RlbFtdID0gdGhpcy5mYXZvcml0ZXMubWFwKGZhdm9yaXRlID0+IHtcclxuXHRcdFx0XHRjb25zdCBncmlkRmF2b3JpdGUgPSBuZXcgU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCgpO1xyXG5cdFx0XHRcdGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUgPSBmYXZvcml0ZS50ZXh0O1xyXG5cdFx0XHRcdGNvbnN0IHN1ZmZpeCA9IGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdGNvbnN0IGRpYWxvZ0NvbHVtbnNKU09OID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0XHRncmlkRmF2b3JpdGUuY29sdW1ucyA9IEpTT04ucGFyc2UoZGlhbG9nQ29sdW1uc0pTT04pO1xyXG5cdFx0XHRcdHJldHVybiBncmlkRmF2b3JpdGU7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0dGhpcy5vbkZhdm9yaXRlc01vZGlmaWVkLmVtaXQoZ3JpZEZhdm9yaXRlcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0cHJpdmF0ZSBhc3luYyByZXNpemVHcmlkKGZvcmNlUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUpID0+IHtcclxuXHRcdFx0aWYgKCFmb3JjZVJlZnJlc2ggJiYgdGhpcy5zbGlja0dyaWRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPT09IHRoaXMuc2xpY2tHcmlkSGVpZ2h0KSB7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSA9PT0gJ0F1dG8nKSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVTSVpFR1JJRFwiKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zbGlja0dyaWRIZWlnaHQgPSB0aGlzLnRhYmxlQ29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXN0Um93ID0gKDxIVE1MVGFibGVFbGVtZW50PnRoaXMudGFibGVSZWYubmF0aXZlRWxlbWVudCkuaW5zZXJ0Um93KDApO1xyXG5cdFx0XHRcdGNvbnN0IHRlc3RDZWxsID0gdGVzdFJvdy5pbnNlcnRDZWxsKDApO1xyXG5cdFx0XHRcdHRlc3RDZWxsLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG5cdFx0XHRcdHRlc3RDZWxsLmlubmVySFRNTCA9IFwiJk5CU1BcIjtcclxuXHRcdFx0XHRjb25zdCByb3dIZWlnaHQgPSB0ZXN0Q2VsbC5vZmZzZXRIZWlnaHQ7XHJcblx0XHRcdFx0KDxIVE1MVGFibGVFbGVtZW50PnRoaXMudGFibGVSZWYubmF0aXZlRWxlbWVudCkuZGVsZXRlUm93KDApO1xyXG5cclxuXHRcdFx0XHRsZXQgaGVhZGVySGVpZ2h0ID0gdGhpcy50YWJsZUhlYWRlclJvd1JlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArIDI7XHJcblx0XHRcdFx0aWYgKHRoaXMudGFibGVIZWFkZXJTZWFyY2hSb3dSZWYpXHJcblx0XHRcdFx0XHRoZWFkZXJIZWlnaHQgKz0gdGhpcy50YWJsZUhlYWRlclNlYXJjaFJvd1JlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArIDI7XHJcblx0XHRcdFx0Y29uc3QgY2xpZW50SGVpZ2h0ID0gdGhpcy50YWJsZUNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIGhlYWRlckhlaWdodDtcclxuXHRcdFx0XHR0aGlzLnJlY29yZHNQZXJQYWdlID0gcGFyc2VJbnQoKChjbGllbnRIZWlnaHQgLyByb3dIZWlnaHQpIC0gMSkudG9GaXhlZCgwKSk7XHJcblx0XHRcdFx0bGV0IGFjdHVhbFJvd0hlaWdodCA9IHBhcnNlSW50KChjbGllbnRIZWlnaHQgLyB0aGlzLnJlY29yZHNQZXJQYWdlKS50b0ZpeGVkKDApKSAtIDE7XHJcblx0XHRcdFx0aWYgKGFjdHVhbFJvd0hlaWdodCA8IHJvd0hlaWdodClcclxuXHRcdFx0XHRcdGFjdHVhbFJvd0hlaWdodCA9IHJvd0hlaWdodDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWxsUm93cyA9IDxIVE1MRWxlbWVudFtdPnRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi50YWJsZSB0Ym9keSB0clwiKTtcclxuXHRcdFx0XHRhbGxSb3dzLmZvckVhY2gocm93ID0+IHtcclxuXHRcdFx0XHRcdHJvdy5zdHlsZS5oZWlnaHQgPSAoYWN0dWFsUm93SGVpZ2h0KSArIFwicHhcIjtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0dGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLnJlbGVhc2UoXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVTSVpFR1JJRFwiKTtcclxuXHJcblx0XHRcdFx0dGhpcy5ncmlkT3BhY2l0eSA9IDE7XHJcblx0XHRcdFx0dGhpcy5zaG93VGVzdFJvdyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZSA9IHBhcnNlSW50KHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSk7XHJcblx0XHRcdFx0dGhpcy5ncmlkT3BhY2l0eSA9IDE7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGFkZENvbHVtbihjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCwgaWR4OiBudW1iZXIgPSBudWxsKSB7XHJcblxyXG5cdFx0aWYgKGlkeCA9PT0gbnVsbClcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnB1c2goY29sdW1uKTtcclxuXHRcdGVsc2VcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnNwbGljZShpZHgsIDAsIGNvbHVtbik7XHJcblxyXG5cdFx0dGhpcy5zZXRHcmlkT3B0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHR9XHJcblxyXG5cdGdldFJlcXVlc3RNb2RlbChyZXF1ZXN0TW9kZWw6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCA9IG51bGwpOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwge1xyXG5cdFx0aWYgKCFyZXF1ZXN0TW9kZWwpXHJcblx0XHRcdHJlcXVlc3RNb2RlbCA9IHRoaXMucmVxdWVzdE1vZGVsO1xyXG5cclxuXHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSBbXTtcclxuXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0aWYgKGMudmlzaWJsZSkge1xyXG5cdFx0XHRcdGlmIChjLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLnRleHQgJiYgYy5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdFx0XHRjLmZpbHRlclRleHQgPSBjLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRyZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnB1c2goPElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWw+e1xyXG5cdFx0XHRcdFx0XHRjb2x1bW5OYW1lOiBjLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlSWQ6IG51bGwsXHJcblx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogYy5maWx0ZXJUZXh0XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSBpZiAoYy5maWx0ZXJUeXBlID09PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5kcm9wZG93biAmJiBjLmZpbHRlckRyb3Bkb3duVmFsdWUpIHtcclxuXHRcdFx0XHRcdGMuZmlsdGVyRHJvcGRvd25WYWx1ZSA9IGMuZmlsdGVyRHJvcGRvd25WYWx1ZTtcclxuXHRcdFx0XHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRcdGNvbHVtbk5hbWU6IGMuZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdFx0c2VhcmNoVmFsdWVJZDogYy5maWx0ZXJEcm9wZG93blZhbHVlLFxyXG5cdFx0XHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IG51bGxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmVxdWVzdE1vZGVsLnNvcnRDb2x1bW4gPSBudWxsO1xyXG5cdFx0Y29uc3Qgc29ydENvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKHggPT4geC5zb3J0RGlyZWN0aW9uID09PSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLmFzYyB8fCB4LnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uZGVzYyk7XHJcblx0XHRpZiAoc29ydENvbHVtbikge1xyXG5cdFx0XHRyZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IChzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPT09IDApID8gbnVsbCA6IHNvcnRDb2x1bW4uZGF0YUZpZWxkTmFtZTtcclxuXHRcdFx0cmVxdWVzdE1vZGVsLnNvcnREaXJlY3Rpb24gPSBzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb247XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA8PSAwKVxyXG5cdFx0XHRyZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSAyMDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0TW9kZWw7XHJcblx0fVxyXG5cclxuXHRzZXRHcmlkT3B0aW9ucyhncmlkT3B0aW9uczogSVNsaWNrR3JpZE9wdGlvbnMpIHtcclxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMgPSBncmlkT3B0aW9ucztcclxuXHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5mYXZvcml0ZXMpIHtcclxuXHRcdFx0XHRjb25zdCBmYXZvcml0ZU5hbWVzID0gdGhpcy5ncmlkT3B0aW9ucy5mYXZvcml0ZXMubWFwKGYgPT4gZi5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9GQVZPUklURVNgLCBKU09OLnN0cmluZ2lmeShmYXZvcml0ZU5hbWVzKSk7XHJcblxyXG5cdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuZmF2b3JpdGVzLmZvckVhY2goZmF2b3JpdGUgPT4ge1xyXG5cdFx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIGhhdmVuJ3QgYWRkZWQgYSBuZXcgY29sdW1uIHRoYXQgbmVlZHMgdG8gYmUgc2F2ZWRcclxuXHRcdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeGlzdHMgPSBmYXZvcml0ZS5jb2x1bW5zLmZpbmRJbmRleCh4ID0+IHguZGF0YUZpZWxkTmFtZSA9PT0gYy5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0XHRcdFx0aWYgKGNvbHVtbkV4aXN0cyA8IDApXHJcblx0XHRcdFx0XHRcdFx0ZmF2b3JpdGUuY29sdW1ucy5wdXNoKGMpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRsZXQgZ3JpZENvbHVtbnNKU09OID0gSlNPTi5zdHJpbmdpZnkoZmF2b3JpdGUuY29sdW1ucyk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHN1ZmZpeCA9IGZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgZmF2b3JpdGUuZmF2b3JpdGVOYW1lKTtcclxuXHRcdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gLCBncmlkQ29sdW1uc0pTT04pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRpZiAoZmF2b3JpdGVOYW1lcy5pbmRleE9mKHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSkgPCAwKVxyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gXCJEZWZhdWx0XCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIpIHx8ICdEZWZhdWx0JztcclxuXHJcblx0XHRcdC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFueSBkdXBsaWNhdGUgY29sdW1uIG5hbWVzXHJcblx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMxID0+IHtcclxuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb3VudCA9ICh0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmlsdGVyKHggPT4geC5kYXRhRmllbGROYW1lID09PSBjMS5kYXRhRmllbGROYW1lKSB8fCBbXSkubGVuZ3RoO1xyXG5cdFx0XHRcdGlmIChkYXRhRmllbGRDb3VudCA+IDEpXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBHcmlkICR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fSBjb2x1bW4gJHtjMS5kYXRhRmllbGROYW1lfSBpcyBkZWZpbmVkICR7ZGF0YUZpZWxkQ291bnR9IHRpbWVzYCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Y29uc3Qgc3VmZml4ID0gdGhpcy5zZWxlY3RlZEZhdm9yaXRlID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGUpO1xyXG5cdFx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHRcdGxldCBjb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHJcblx0XHRcdFx0bGV0IGRpc3BsYXlPcmRlciA9IDA7XHJcblx0XHRcdFx0Y29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGNvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKGdyaWRDb2x1bW4gPT4gZ3JpZENvbHVtbi5kYXRhRmllbGROYW1lID09PSBjLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0XHRcdFx0aWYgKGNvbHVtbikge1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4udmlzaWJsZSA9IGMudmlzaWJsZTtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLmRpc3BsYXlPcmRlciA9IGRpc3BsYXlPcmRlcjtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLnRpdGxlT3JpZW50YXRpb24gPSBjLnRpdGxlT3JpZW50YXRpb247XHJcblx0XHRcdFx0XHRcdGNvbHVtbi50aXRsZUhlaWdodCA9IGMudGl0bGVIZWlnaHQ7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi53aWR0aCA9IGMud2lkdGg7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5mbGV4aWJsZSA9IGMuZmxleGlibGU7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5zb3J0RGlyZWN0aW9uID0gYy5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBjLmlzTG9ja2VkO1xyXG5cdFx0XHRcdFx0XHQvL2NvbHVtbi5maWx0ZXJUeXBlID0gYy5maWx0ZXJUeXBlO1xyXG5cdFx0XHRcdFx0XHRpZiAoY29sdW1uLmlzTG9ja2VkICYmIGNvbHVtbi5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGNvbHVtbi5maWx0ZXJUeXBlID09PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy50ZXh0KVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlclRleHQgPSBjLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoY29sdW1uLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLmRyb3Bkb3duKVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBjLmZpbHRlckRyb3Bkb3duVmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICghY29sdW1uLmZpbHRlclRleHQgJiYgIWNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi5pc0xvY2tlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlclRleHQgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGRpc3BsYXlPcmRlcisrO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0UmVjb3Jkc1BlclBhZ2UgJiYgIWxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIikpXHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0UmVjb3Jkc1BlclBhZ2UudG9TdHJpbmcoKTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIikgfHwgXCJBdXRvXCI7XHJcblxyXG5cdFx0XHRjb25zdCBmYXZvcml0ZXNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfRkFWT1JJVEVTXCIpIHx8IGBbXCJEZWZhdWx0XCJdYDtcclxuXHRcdFx0dGhpcy5mYXZvcml0ZXMgPSAoPHN0cmluZ1tdPkpTT04ucGFyc2UoZmF2b3JpdGVzSnNvbikpLm1hcChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIG5ldyBEcm9wRG93bk1vZGVsKGZhdm9yaXRlKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUgPT09IHRydWUpO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblxyXG5cdFx0dGhpcy5zaG93U2VhcmNoUm93ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpLmxlbmd0aCA+IDA7XHJcblx0XHRsZXQgc29ydENvbHVtbiA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmluZChjID0+IGMuc29ydGFibGUgPT09IHRydWUgJiYgYy5zb3J0RGlyZWN0aW9uID4gMCk7XHJcblx0XHRpZiAodGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwICYmIHNvcnRDb2x1bW4pIHtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IHNvcnRDb2x1bW4uZGF0YUZpZWxkTmFtZTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuc29ydERpcmVjdGlvbiA9IHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbjtcclxuXHRcdH1cclxuXHR9XHJcbn0iXX0=