@energycap/components 0.41.1-ECAP-26841-date-input-features.20250108-1012 → 0.42.0

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 (353) hide show
  1. package/{esm2020 → esm2022}/energycap-components.mjs +4 -4
  2. package/esm2022/lib/components.module.mjs +418 -0
  3. package/esm2022/lib/controls/banner/banner.component.mjs +109 -0
  4. package/esm2022/lib/controls/button/button.component.mjs +106 -0
  5. package/esm2022/lib/controls/button/copy-button-base.directive.mjs +67 -0
  6. package/{esm2020 → esm2022}/lib/controls/button/copy-button.directive.mjs +28 -28
  7. package/esm2022/lib/controls/button/copy-table-button.directive.mjs +43 -0
  8. package/esm2022/lib/controls/calendar/calendar-item.component.mjs +59 -0
  9. package/esm2022/lib/controls/calendar/calendar.component.mjs +200 -0
  10. package/esm2022/lib/controls/calendar/calendar.types.mjs +4 -0
  11. package/esm2022/lib/controls/checkbox/checkbox.component.mjs +140 -0
  12. package/{esm2020 → esm2022}/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -38
  13. package/esm2022/lib/controls/combobox/combobox.component.mjs +879 -0
  14. package/esm2022/lib/controls/date-input/date-input.component.mjs +256 -0
  15. package/esm2022/lib/controls/dropdown/dropdown.component.mjs +243 -0
  16. package/esm2022/lib/controls/file-upload/file-upload.component.mjs +261 -0
  17. package/esm2022/lib/controls/form-control/form-control.component.mjs +104 -0
  18. package/esm2022/lib/controls/form-control-base.mjs +151 -0
  19. package/esm2022/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
  20. package/esm2022/lib/controls/form-group/form-group.component.mjs +261 -0
  21. package/{esm2020 → esm2022}/lib/controls/help-popover/help-popover.component.mjs +31 -31
  22. package/esm2022/lib/controls/item-picker/item-picker.component.mjs +329 -0
  23. package/{esm2020 → esm2022}/lib/controls/link-button/link-button.component.mjs +11 -11
  24. package/esm2022/lib/controls/menu/menu.component.mjs +485 -0
  25. package/{esm2020 → esm2022}/lib/controls/navigation/link-item.mjs +1 -1
  26. package/esm2022/lib/controls/navigation/nav-group.mjs +39 -0
  27. package/esm2022/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
  28. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item.mjs +1 -1
  29. package/esm2022/lib/controls/numericbox/numericbox.component.mjs +372 -0
  30. package/esm2022/lib/controls/popover/popover.component.mjs +117 -0
  31. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button-option.mjs +2 -2
  32. package/esm2022/lib/controls/radio-button/radio-button.component.mjs +82 -0
  33. package/esm2022/lib/controls/select/select.component.mjs +88 -0
  34. package/esm2022/lib/controls/tabs/tabs.component.mjs +47 -0
  35. package/esm2022/lib/controls/textbox/textbox.component.mjs +155 -0
  36. package/esm2022/lib/core/cache.service.mjs +105 -0
  37. package/esm2022/lib/core/custom-validators.mjs +29 -0
  38. package/esm2022/lib/core/date-time-helper.mjs +220 -0
  39. package/esm2022/lib/core/error.service.mjs +61 -0
  40. package/esm2022/lib/core/router-helper.service.mjs +111 -0
  41. package/esm2022/lib/core/scroll.service.mjs +89 -0
  42. package/{esm2020 → esm2022}/lib/core/telemetry-tracker.service.mjs +16 -16
  43. package/{esm2020 → esm2022}/lib/core/telemetry.service.mjs +38 -38
  44. package/esm2022/lib/core/validation-message.service.mjs +185 -0
  45. package/{esm2020 → esm2022}/lib/core/validation-patterns.mjs +30 -30
  46. package/esm2022/lib/core/window.service.mjs +186 -0
  47. package/esm2022/lib/display/app-bar/app-bar.component.mjs +46 -0
  48. package/esm2022/lib/display/avatar/avatar.component.mjs +67 -0
  49. package/esm2022/lib/display/avatar/avatar.service.mjs +64 -0
  50. package/esm2022/lib/display/confirm/confirm.component.mjs +168 -0
  51. package/{esm2020 → esm2022}/lib/display/dialog/dialog-content.mjs +1 -1
  52. package/esm2022/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
  53. package/{esm2020 → esm2022}/lib/display/dialog/dialog-types.mjs +76 -76
  54. package/esm2022/lib/display/dialog/dialog.component.mjs +281 -0
  55. package/{esm2020 → esm2022}/lib/display/dialog/dialog.service.mjs +71 -71
  56. package/{esm2020 → esm2022}/lib/display/help/help-types.mjs +1 -1
  57. package/esm2022/lib/display/hierarchy/hierarchy-base.mjs +111 -0
  58. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-mocks.spec.mjs +53 -53
  59. package/esm2022/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -0
  60. package/esm2022/lib/display/item-display/item-display.component.mjs +81 -0
  61. package/esm2022/lib/display/json-display/json-display.component.mjs +47 -0
  62. package/esm2022/lib/display/resizable/resizable-base.mjs +120 -0
  63. package/{esm2020 → esm2022}/lib/display/resizable/resizable.component.mjs +52 -52
  64. package/{esm2020 → esm2022}/lib/display/spinner/spinner.component.mjs +12 -12
  65. package/esm2022/lib/display/splash/splash.component.mjs +42 -0
  66. package/{esm2020 → esm2022}/lib/display/splash/splash.service.mjs +35 -35
  67. package/{esm2020 → esm2022}/lib/display/table/resizable-column.component.mjs +20 -20
  68. package/esm2022/lib/display/table/resizable-table.directive.mjs +227 -0
  69. package/esm2022/lib/display/table/searchable-table.component.mjs +342 -0
  70. package/{esm2020 → esm2022}/lib/display/table/table-detail-row.component.mjs +19 -19
  71. package/esm2022/lib/display/table/table-locked-column.component.mjs +58 -0
  72. package/{esm2020 → esm2022}/lib/display/table/table-master-header-row.component.mjs +14 -14
  73. package/esm2022/lib/display/table/table-master-row.component.mjs +163 -0
  74. package/esm2022/lib/display/table/table-pagination.component.mjs +155 -0
  75. package/esm2022/lib/display/table/table-selectable-row.component.mjs +235 -0
  76. package/esm2022/lib/display/table/table.component.mjs +249 -0
  77. package/esm2022/lib/display/tags/tag.mjs +18 -0
  78. package/esm2022/lib/display/tags/tags.component.mjs +77 -0
  79. package/esm2022/lib/display/toast/toast/toast.component.mjs +77 -0
  80. package/{esm2020 → esm2022}/lib/display/toast/toast-types.mjs +7 -7
  81. package/{esm2020 → esm2022}/lib/display/toast/toast.service.mjs +35 -35
  82. package/esm2022/lib/display/toast/toaster/toaster.component.mjs +114 -0
  83. package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.component.mjs +28 -28
  84. package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.service.mjs +78 -78
  85. package/esm2022/lib/display/tooltip-directive/tooltip.directive.mjs +173 -0
  86. package/{esm2020 → esm2022}/lib/display/tour/tour-types.mjs +33 -33
  87. package/esm2022/lib/display/tour/tour.component.mjs +398 -0
  88. package/esm2022/lib/display/tour/tour.service.mjs +75 -0
  89. package/esm2022/lib/display/tree/tree.component.mjs +135 -0
  90. package/esm2022/lib/display/view-overlay/view-overlay.component.mjs +58 -0
  91. package/esm2022/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
  92. package/esm2022/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
  93. package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +166 -0
  94. package/esm2022/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
  95. package/esm2022/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
  96. package/esm2022/lib/shared/display/pipes/relative-date.pipe.mjs +62 -0
  97. package/esm2022/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
  98. package/esm2022/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
  99. package/esm2022/lib/shared/display.mjs +6 -0
  100. package/esm2022/lib/shared/form-group.helper.mjs +67 -0
  101. package/esm2022/lib/shared/json-helper.mjs +19 -0
  102. package/esm2022/lib/shared/lodash-helper.mjs +52 -0
  103. package/esm2022/lib/shared/page/page-base/page-base.component.mjs +387 -0
  104. package/{esm2020 → esm2022}/lib/shared/page/page-statuses.mjs +22 -22
  105. package/{esm2020 → esm2022}/lib/shared/page/page-title/page-title.component.mjs +23 -23
  106. package/esm2022/lib/shared/page/page-view/page-view.component.mjs +147 -0
  107. package/{esm2020 → esm2022}/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +16 -16
  108. package/{esm2020 → esm2022}/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +16 -16
  109. package/{esm2020 → esm2022}/lib/shared/testing/page-base-component-test-helper.spec.mjs +37 -37
  110. package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +98 -0
  111. package/{esm2020 → esm2022}/lib/shared/testing/public-mocks.spec.mjs +148 -148
  112. package/{esm2020 → esm2022}/lib/shared/testing/spy-factory.spec.mjs +39 -39
  113. package/{esm2020 → esm2022}/lib/shared/testing/translation-mocks.spec.mjs +56 -56
  114. package/{esm2020 → esm2022}/lib/shared/user-preference.service.mjs +17 -17
  115. package/esm2022/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
  116. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -68
  117. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -18
  118. package/esm2022/public-api.mjs +115 -0
  119. package/{fesm2020 → fesm2022}/energycap-components.mjs +11819 -12972
  120. package/fesm2022/energycap-components.mjs.map +1 -0
  121. package/index.d.ts +5 -5
  122. package/lib/components.module.d.ts +91 -92
  123. package/lib/controls/banner/banner.component.d.ts +50 -50
  124. package/lib/controls/button/button.component.d.ts +78 -78
  125. package/lib/controls/button/copy-button-base.directive.d.ts +20 -20
  126. package/lib/controls/button/copy-button.directive.d.ts +14 -14
  127. package/lib/controls/button/copy-table-button.directive.d.ts +19 -19
  128. package/lib/controls/calendar/calendar-item.component.d.ts +17 -22
  129. package/lib/controls/calendar/calendar.component.d.ts +54 -52
  130. package/lib/controls/calendar/calendar.types.d.ts +7 -11
  131. package/lib/controls/checkbox/checkbox.component.d.ts +65 -65
  132. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +25 -25
  133. package/lib/controls/combobox/combobox.component.d.ts +418 -418
  134. package/lib/controls/date-input/date-input.component.d.ts +80 -115
  135. package/lib/controls/dropdown/dropdown.component.d.ts +161 -161
  136. package/lib/controls/file-upload/file-upload.component.d.ts +124 -124
  137. package/lib/controls/form-control/form-control.component.d.ts +30 -28
  138. package/lib/controls/form-control-base.d.ts +110 -110
  139. package/lib/controls/form-control-label/form-control-label.component.d.ts +73 -73
  140. package/lib/controls/form-group/form-group.component.d.ts +105 -105
  141. package/lib/controls/help-popover/help-popover.component.d.ts +11 -11
  142. package/lib/controls/item-picker/item-picker.component.d.ts +164 -164
  143. package/lib/controls/link-button/link-button.component.d.ts +5 -5
  144. package/lib/controls/menu/menu.component.d.ts +255 -255
  145. package/lib/controls/navigation/link-item.d.ts +32 -32
  146. package/lib/controls/navigation/nav-group.d.ts +18 -18
  147. package/lib/controls/navigation/nav-item-active.directive.d.ts +42 -42
  148. package/lib/controls/navigation/nav-item.d.ts +31 -31
  149. package/lib/controls/numericbox/numericbox.component.d.ts +148 -148
  150. package/lib/controls/popover/popover.component.d.ts +51 -51
  151. package/lib/controls/radio-button/radio-button-option.d.ts +19 -19
  152. package/lib/controls/radio-button/radio-button.component.d.ts +53 -53
  153. package/lib/controls/select/select.component.d.ts +44 -44
  154. package/lib/controls/tabs/tabs.component.d.ts +30 -30
  155. package/lib/controls/textbox/textbox.component.d.ts +107 -107
  156. package/lib/core/cache.service.d.ts +33 -33
  157. package/lib/core/custom-validators.d.ts +20 -20
  158. package/lib/core/date-time-helper.d.ts +101 -101
  159. package/lib/core/error.service.d.ts +20 -20
  160. package/lib/core/router-helper.service.d.ts +48 -48
  161. package/lib/core/scroll.service.d.ts +36 -36
  162. package/lib/core/telemetry-tracker.service.d.ts +13 -13
  163. package/lib/core/telemetry.service.d.ts +31 -31
  164. package/lib/core/validation-message.service.d.ts +26 -26
  165. package/lib/core/validation-patterns.d.ts +22 -22
  166. package/lib/core/window.service.d.ts +116 -116
  167. package/lib/display/app-bar/app-bar.component.d.ts +20 -20
  168. package/lib/display/avatar/avatar.component.d.ts +35 -35
  169. package/lib/display/avatar/avatar.service.d.ts +24 -24
  170. package/lib/display/confirm/confirm.component.d.ts +123 -123
  171. package/lib/display/dialog/dialog-content.d.ts +19 -19
  172. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +32 -32
  173. package/lib/display/dialog/dialog-types.d.ts +130 -130
  174. package/lib/display/dialog/dialog.component.d.ts +120 -120
  175. package/lib/display/dialog/dialog.service.d.ts +48 -48
  176. package/lib/display/help/help-types.d.ts +33 -33
  177. package/lib/display/hierarchy/hierarchy-base.d.ts +97 -97
  178. package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +53 -53
  179. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +34 -34
  180. package/lib/display/item-display/item-display.component.d.ts +43 -43
  181. package/lib/display/json-display/json-display.component.d.ts +16 -16
  182. package/lib/display/resizable/resizable-base.d.ts +67 -67
  183. package/lib/display/resizable/resizable.component.d.ts +31 -31
  184. package/lib/display/spinner/spinner.component.d.ts +5 -5
  185. package/lib/display/splash/splash.component.d.ts +16 -16
  186. package/lib/display/splash/splash.service.d.ts +22 -22
  187. package/lib/display/table/resizable-column.component.d.ts +10 -10
  188. package/lib/display/table/resizable-table.directive.d.ts +93 -93
  189. package/lib/display/table/searchable-table.component.d.ts +206 -206
  190. package/lib/display/table/table-detail-row.component.d.ts +8 -8
  191. package/lib/display/table/table-locked-column.component.d.ts +20 -20
  192. package/lib/display/table/table-master-header-row.component.d.ts +9 -9
  193. package/lib/display/table/table-master-row.component.d.ts +113 -113
  194. package/lib/display/table/table-pagination.component.d.ts +91 -91
  195. package/lib/display/table/table-selectable-row.component.d.ts +102 -102
  196. package/lib/display/table/table.component.d.ts +121 -121
  197. package/lib/display/tags/tag.d.ts +18 -18
  198. package/lib/display/tags/tags.component.d.ts +48 -48
  199. package/lib/display/toast/toast/toast.component.d.ts +23 -23
  200. package/lib/display/toast/toast-types.d.ts +24 -24
  201. package/lib/display/toast/toast.service.d.ts +20 -20
  202. package/lib/display/toast/toaster/toaster.component.d.ts +35 -35
  203. package/lib/display/tooltip/tooltip.component.d.ts +70 -70
  204. package/lib/display/tooltip/tooltip.service.d.ts +16 -16
  205. package/lib/display/tooltip-directive/tooltip.directive.d.ts +44 -44
  206. package/lib/display/tour/tour-types.d.ts +70 -70
  207. package/lib/display/tour/tour.component.d.ts +147 -147
  208. package/lib/display/tour/tour.service.d.ts +38 -38
  209. package/lib/display/tree/tree.component.d.ts +75 -75
  210. package/lib/display/view-overlay/view-overlay.component.d.ts +38 -38
  211. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +14 -14
  212. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +60 -60
  213. package/lib/shared/directives/popup/popup-container.directive.d.ts +101 -101
  214. package/lib/shared/display/pipes/date-display.pipe.d.ts +21 -21
  215. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +9 -9
  216. package/lib/shared/display/pipes/relative-date.pipe.d.ts +36 -36
  217. package/lib/shared/display/pipes/row-count.pipe.d.ts +23 -23
  218. package/lib/shared/display/pipes/time-display.pipe.d.ts +18 -18
  219. package/lib/shared/display.d.ts +42 -42
  220. package/lib/shared/form-group.helper.d.ts +31 -31
  221. package/lib/shared/json-helper.d.ts +7 -7
  222. package/lib/shared/lodash-helper.d.ts +18 -18
  223. package/lib/shared/page/page-base/page-base.component.d.ts +259 -259
  224. package/lib/shared/page/page-statuses.d.ts +13 -13
  225. package/lib/shared/page/page-title/page-title.component.d.ts +9 -9
  226. package/lib/shared/page/page-view/page-view.component.d.ts +102 -102
  227. package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +4 -4
  228. package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +4 -4
  229. package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +30 -30
  230. package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +28 -28
  231. package/lib/shared/testing/public-mocks.spec.d.ts +90 -90
  232. package/lib/shared/testing/spy-factory.spec.d.ts +27 -27
  233. package/lib/shared/testing/translation-mocks.spec.d.ts +30 -30
  234. package/lib/shared/user-preference.service.d.ts +13 -13
  235. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +134 -134
  236. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +27 -27
  237. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +10 -10
  238. package/package.json +12 -18
  239. package/public-api.d.ts +111 -113
  240. package/schematics/rxjs-7-upgrade/index.d.ts +3 -3
  241. package/schematics/rxjs-7-upgrade/index.js +67 -67
  242. package/schematics/rxjs-7-upgrade/index.js.map +1 -1
  243. package/schematics/rxjs-7-upgrade/schema.d.ts +4 -4
  244. package/schematics/rxjs-7-upgrade/schema.js +2 -2
  245. package/schematics/utilities/typescript.d.ts +7 -7
  246. package/schematics/utilities/typescript.js +41 -41
  247. package/schematics/utilities/workspace.d.ts +8 -8
  248. package/schematics/utilities/workspace.js +71 -71
  249. package/schematics/utilities/workspace.js.map +1 -1
  250. package/src/assets/locales/en_US.json +1 -9
  251. package/esm2020/lib/components.module.mjs +0 -423
  252. package/esm2020/lib/controls/banner/banner.component.mjs +0 -109
  253. package/esm2020/lib/controls/button/button.component.mjs +0 -106
  254. package/esm2020/lib/controls/button/copy-button-base.directive.mjs +0 -67
  255. package/esm2020/lib/controls/button/copy-table-button.directive.mjs +0 -43
  256. package/esm2020/lib/controls/calendar/calendar-item.component.mjs +0 -91
  257. package/esm2020/lib/controls/calendar/calendar.component.mjs +0 -248
  258. package/esm2020/lib/controls/calendar/calendar.types.mjs +0 -2
  259. package/esm2020/lib/controls/checkbox/checkbox.component.mjs +0 -140
  260. package/esm2020/lib/controls/combobox/combobox.component.mjs +0 -879
  261. package/esm2020/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +0 -57
  262. package/esm2020/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +0 -62
  263. package/esm2020/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +0 -100
  264. package/esm2020/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +0 -101
  265. package/esm2020/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +0 -76
  266. package/esm2020/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +0 -79
  267. package/esm2020/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +0 -210
  268. package/esm2020/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +0 -81
  269. package/esm2020/lib/controls/date-input/date-input.component.mjs +0 -463
  270. package/esm2020/lib/controls/date-input/date-input.types.mjs +0 -44
  271. package/esm2020/lib/controls/dropdown/dropdown.component.mjs +0 -243
  272. package/esm2020/lib/controls/file-upload/file-upload.component.mjs +0 -261
  273. package/esm2020/lib/controls/form-control/form-control.component.mjs +0 -98
  274. package/esm2020/lib/controls/form-control-base.mjs +0 -151
  275. package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +0 -136
  276. package/esm2020/lib/controls/form-group/form-group.component.mjs +0 -261
  277. package/esm2020/lib/controls/item-picker/item-picker.component.mjs +0 -329
  278. package/esm2020/lib/controls/menu/menu.component.mjs +0 -485
  279. package/esm2020/lib/controls/navigation/nav-group.mjs +0 -39
  280. package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +0 -92
  281. package/esm2020/lib/controls/numericbox/numericbox.component.mjs +0 -372
  282. package/esm2020/lib/controls/popover/popover.component.mjs +0 -117
  283. package/esm2020/lib/controls/radio-button/radio-button.component.mjs +0 -82
  284. package/esm2020/lib/controls/select/select.component.mjs +0 -88
  285. package/esm2020/lib/controls/tabs/tabs.component.mjs +0 -47
  286. package/esm2020/lib/controls/textbox/textbox.component.mjs +0 -155
  287. package/esm2020/lib/core/cache.service.mjs +0 -105
  288. package/esm2020/lib/core/custom-validators.mjs +0 -29
  289. package/esm2020/lib/core/date-time-helper.mjs +0 -228
  290. package/esm2020/lib/core/error.service.mjs +0 -61
  291. package/esm2020/lib/core/router-helper.service.mjs +0 -111
  292. package/esm2020/lib/core/scroll.service.mjs +0 -89
  293. package/esm2020/lib/core/validation-message.service.mjs +0 -185
  294. package/esm2020/lib/core/window.service.mjs +0 -186
  295. package/esm2020/lib/display/app-bar/app-bar.component.mjs +0 -46
  296. package/esm2020/lib/display/avatar/avatar.component.mjs +0 -67
  297. package/esm2020/lib/display/avatar/avatar.service.mjs +0 -64
  298. package/esm2020/lib/display/confirm/confirm.component.mjs +0 -168
  299. package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +0 -63
  300. package/esm2020/lib/display/dialog/dialog.component.mjs +0 -281
  301. package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +0 -111
  302. package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +0 -61
  303. package/esm2020/lib/display/item-display/item-display.component.mjs +0 -81
  304. package/esm2020/lib/display/json-display/json-display.component.mjs +0 -47
  305. package/esm2020/lib/display/resizable/resizable-base.mjs +0 -120
  306. package/esm2020/lib/display/splash/splash.component.mjs +0 -42
  307. package/esm2020/lib/display/table/resizable-table.directive.mjs +0 -227
  308. package/esm2020/lib/display/table/searchable-table.component.mjs +0 -342
  309. package/esm2020/lib/display/table/table-locked-column.component.mjs +0 -58
  310. package/esm2020/lib/display/table/table-master-row.component.mjs +0 -163
  311. package/esm2020/lib/display/table/table-pagination.component.mjs +0 -155
  312. package/esm2020/lib/display/table/table-selectable-row.component.mjs +0 -235
  313. package/esm2020/lib/display/table/table.component.mjs +0 -249
  314. package/esm2020/lib/display/tags/tag.mjs +0 -18
  315. package/esm2020/lib/display/tags/tags.component.mjs +0 -77
  316. package/esm2020/lib/display/toast/toast/toast.component.mjs +0 -77
  317. package/esm2020/lib/display/toast/toaster/toaster.component.mjs +0 -114
  318. package/esm2020/lib/display/tooltip-directive/tooltip.directive.mjs +0 -173
  319. package/esm2020/lib/display/tour/tour.component.mjs +0 -398
  320. package/esm2020/lib/display/tour/tour.service.mjs +0 -75
  321. package/esm2020/lib/display/tree/tree.component.mjs +0 -135
  322. package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +0 -58
  323. package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +0 -32
  324. package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +0 -111
  325. package/esm2020/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +0 -100
  326. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +0 -163
  327. package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +0 -50
  328. package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +0 -30
  329. package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +0 -62
  330. package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +0 -48
  331. package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +0 -41
  332. package/esm2020/lib/shared/display.mjs +0 -6
  333. package/esm2020/lib/shared/form-group.helper.mjs +0 -67
  334. package/esm2020/lib/shared/json-helper.mjs +0 -19
  335. package/esm2020/lib/shared/lodash-helper.mjs +0 -51
  336. package/esm2020/lib/shared/page/page-base/page-base.component.mjs +0 -387
  337. package/esm2020/lib/shared/page/page-view/page-view.component.mjs +0 -147
  338. package/esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
  339. package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +0 -246
  340. package/esm2020/public-api.mjs +0 -117
  341. package/fesm2015/energycap-components.mjs +0 -13371
  342. package/fesm2015/energycap-components.mjs.map +0 -1
  343. package/fesm2020/energycap-components.mjs.map +0 -1
  344. package/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.d.ts +0 -42
  345. package/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.d.ts +0 -21
  346. package/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.d.ts +0 -21
  347. package/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.d.ts +0 -21
  348. package/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.d.ts +0 -18
  349. package/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.d.ts +0 -18
  350. package/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.d.ts +0 -21
  351. package/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.d.ts +0 -20
  352. package/lib/controls/date-input/date-input.types.d.ts +0 -62
  353. package/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.d.ts +0 -23
@@ -1,485 +0,0 @@
1
- import { Component, EventEmitter, HostBinding, Input, Output, ViewChild } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "../../core/window.service";
4
- import * as i2 from "../../core/scroll.service";
5
- import * as i3 from "@angular/common";
6
- import * as i4 from "@angular/router";
7
- import * as i5 from "../navigation/nav-item-active.directive";
8
- import * as i6 from "../help-popover/help-popover.component";
9
- import * as i7 from "@ngx-translate/core";
10
- ;
11
- export const menuAnimationSpeed = 350;
12
- /**
13
- * Primitive Menu component that encapsulates known templates
14
- *
15
- * @export
16
- */
17
- export class MenuComponent {
18
- /**
19
- * Helper function to return a flat list of all selectable items in the provided menu items. Filters out headings and divided-sections.
20
- * This makes it much easier to keep track of currently highlighted items for keyboard navigation.
21
- */
22
- static getSelectableItems(items) {
23
- return items.reduce((selectableItems, item) => {
24
- if (item.display !== 'heading' && item.display !== 'divided-section') {
25
- selectableItems.push(item);
26
- }
27
- else if (item.items) {
28
- selectableItems.push(...item.items.filter(childItem => childItem.display !== 'heading' && childItem.display !== 'divided-section'));
29
- }
30
- return selectableItems;
31
- }, []);
32
- }
33
- /**
34
- * Returns an ID for the provided item based on its index in the provided items array. This mimics the behavior of the MenuComponent's
35
- * generated IDs for items that don't have provided IDs. This is used in MenuComponent and ComboboxComponent to scroll to specific items.
36
- * NOTE: If the items array does not match what is displayed in the menu, this function will not return the correct ID.
37
- *
38
- * Returns null if the not found
39
- * @param items The MenuItems array to search through.
40
- * @param item The item to generate the ID for.
41
- * @param menuComponentId Used to prefix the generated ID. This should be the ID of the menu component the item is present in.
42
- * @memberof MenuComponent
43
- */
44
- static getIndexedItemId(items, item, menuComponentId) {
45
- if (item) {
46
- for (let i = 0; i < items.length; i++) {
47
- const itemInList = items[i];
48
- if (itemInList.label === item.label) {
49
- return `${menuComponentId}_item${i}`;
50
- }
51
- // If the item is a heading or divided section, check its children
52
- if (itemInList.items && (itemInList.display === 'heading' || itemInList.display === 'divided-section')) {
53
- for (let j = 0; j < itemInList.items.length; j++) {
54
- const childItem = itemInList.items[j];
55
- // Fall back to checking only the label if the item doesn't have an id
56
- if (childItem.label === item.label) {
57
- return `${menuComponentId}_item${i}-${j}`;
58
- }
59
- }
60
- }
61
- }
62
- }
63
- return null;
64
- }
65
- constructor(el, renderer, windowService, scrollService) {
66
- this.el = el;
67
- this.renderer = renderer;
68
- this.windowService = windowService;
69
- this.scrollService = scrollService;
70
- /**
71
- * Array of items to display
72
- *
73
- * @memberof MenuComponent
74
- */
75
- this.items = [];
76
- /**
77
- * Selected item; annotates the item
78
- * when displayed with 'selected' class
79
- *
80
- * @memberof MenuComponent
81
- */
82
- this.selected = null;
83
- /**
84
- * Display template
85
- *
86
- * @memberof MenuComponent
87
- */
88
- this.templateType = 'label';
89
- /**
90
- * Show message when there are no items
91
- */
92
- this.showNoItems = false;
93
- /**
94
- * Text to show when menu is empty and showNoItems is true
95
- */
96
- this.noDataText = 'NoItems_TC';
97
- /**
98
- * Controls whether keyboard navigation is enabled
99
- */
100
- this.enableKeyNav = false;
101
- /**
102
- * Item currently highlighted by keyboard navigation
103
- */
104
- this.highlightedItem = null;
105
- /**
106
- * Tells the menu to maintain the selected/lastSelected item. Turning this off is useful for
107
- * action type menus that are displayed on the screen at all times and you do not
108
- * want the item to be selected when clicked.
109
- */
110
- this.maintainSelectedItem = true;
111
- /**
112
- * Will prevent text-wrapping of menu items and truncate instead. Also turns on a tooltip for the menu item. Default: false;
113
- */
114
- this.truncateItems = false;
115
- /**
116
- * When true, the space for the icon is preserved for menu items that do not have icons.
117
- * Only applicable for iconAndLabel menus.
118
- */
119
- this.preserveIconSpace = false;
120
- /**
121
- * Emitted when `selected` is changed. Emits the referenced object.
122
- *
123
- * @memberof MenuComponent
124
- */
125
- this.selectedChanged = new EventEmitter();
126
- /**
127
- * Emitted when the menu has a parent and back is clicked
128
- * @memberof MenuComponent
129
- */
130
- this.menuClosed = new EventEmitter();
131
- /**
132
- * Index of the item currently highlighted using keyboard nav
133
- */
134
- this.highlightedItemIndex = -1;
135
- /**
136
- * Last item this.selected was set to via selectItem().
137
- * This isn't necessarily the same as this.selected, because this.selected is an input property
138
- * and could have been changed by a consumer through some means other than selectItem().
139
- * This allows us to prevent double-calls to selectItem() with the same input.
140
- */
141
- this.lastSelected = null;
142
- /**
143
- * Flattened array of all selectable items in the menu. Makes it easier to keep track of the currently highlighted item for keyboard navigation.
144
- */
145
- this.selectableItems = [];
146
- }
147
- ngOnChanges(changes) {
148
- if (changes.items && this.items) {
149
- this.selectableItems = MenuComponent.getSelectableItems(this.items);
150
- }
151
- }
152
- /**
153
- * Sets & displays the interalized template based on
154
- * the set template.
155
- * @see { @link https://angular.io/guide/lifecycle-hooks|Angular Lifecycle Hooks}
156
- *
157
- * @memberof MenuComponent
158
- */
159
- ngAfterContentInit() {
160
- switch (this.templateType) {
161
- case ("label"):
162
- this.internalizedTemplate = this.iconAndLabelTemplate;
163
- break;
164
- case ("iconAndLabel"):
165
- this.internalizedTemplate = this.iconAndLabelTemplate;
166
- break;
167
- case ("checkAndLabel"):
168
- this.internalizedTemplate = this.checkAndLabelTemplate;
169
- break;
170
- case ("iconLabelCaption"):
171
- this.internalizedTemplate = this.iconLabelCaptionTemplate;
172
- break;
173
- default:
174
- throw new Error(`Invalid templateType for MenuComponent. Please use either: 'label', 'iconAndLabel' or 'checkAndLabel'`);
175
- }
176
- //if the consumer provided a menuItemTemplate, override the internalizedTemplate with that.
177
- if (this.customMenuTemplate) {
178
- this.internalizedTemplate = this.customMenuTemplate;
179
- }
180
- if (this.id) {
181
- this.attrId = this.id;
182
- }
183
- this.setItemIds();
184
- if (this.highlightedItem && this.selectableItems.length) {
185
- this.highlightedItemIndex = this.selectableItems.findIndex(item => { return this.highlightedItem === item; });
186
- }
187
- this.addKeydownListener();
188
- }
189
- ngOnDestroy() {
190
- // Remove the listener when the component is destroyed
191
- if (this.removeKeydownListener) {
192
- this.removeKeydownListener();
193
- }
194
- }
195
- /**
196
- * When a menu item is selected, open a child menu if the item has items, call
197
- * the item's click method if defined, or emit the selected item.
198
- *
199
- * @param item The selected item
200
- * @memberof MenuComponent
201
- */
202
- selectItem(event, item, isKeyEvent) {
203
- event.stopPropagation();
204
- //In the case that the user clicks an item, selectItem() will be called from the click handler
205
- //and through onRouterLinkActivated. Only one of these will make it through this if statement
206
- //because the first one will set this.lastSelected = item.
207
- if (!item.disabled && !item.readonly && this.lastSelected !== item) {
208
- if (!item.url) {
209
- if (item.onClick) {
210
- item.onClick(item, false);
211
- }
212
- if (item.items && item.display !== 'heading' && item.display !== 'divided-section') {
213
- this.toggleChildMenu(true);
214
- }
215
- else {
216
- this.onSelection(item);
217
- }
218
- // We need to manually handle the url navigation if the keyboard was used
219
- }
220
- else if (isKeyEvent || event.target?.tagName === 'LI') {
221
- if (item.target) {
222
- window.open(item.url, item.target);
223
- }
224
- else {
225
- this.windowService.navigateToUrl(item.url);
226
- }
227
- // Emit so upstream components know an item was selected
228
- this.onSelection(item);
229
- }
230
- else {
231
- this.onSelection(item);
232
- }
233
- if (this.maintainSelectedItem) {
234
- this.selected = item;
235
- this.lastSelected = item;
236
- }
237
- else {
238
- this.selected = null;
239
- this.lastSelected = null;
240
- }
241
- }
242
- }
243
- /**
244
- * Close the current menu and open the parent menu
245
- * @memberof MenuComponent
246
- */
247
- back(event) {
248
- event.stopPropagation();
249
- if (this.parent && this.parent.onClick) {
250
- this.parent.onClick(null, true);
251
- }
252
- this.menuClosed.emit();
253
- }
254
- /**
255
- * Emit the selected item
256
- * @param item The selected item
257
- */
258
- onSelection(item) {
259
- if (item.display !== 'heading' && item.display !== 'divided-section') {
260
- this.selectedChanged.emit(item);
261
- }
262
- }
263
- /**
264
- * Open or close the child menu. When the child menu closes, the selected
265
- * item is reset.
266
- * @memberof MenuComponent
267
- */
268
- toggleChildMenu(open) {
269
- let navEl = this.el.nativeElement.querySelector('nav');
270
- if (open) {
271
- // Remove the listener on the parent menu when a child menu is opened
272
- // This is to avoid interference between the parent and child menus
273
- if (this.removeKeydownListener) {
274
- this.removeKeydownListener();
275
- }
276
- let height = navEl.offsetHeight;
277
- let width = navEl.offsetWidth;
278
- // In order to animate the child menu, we need to set height on the nav element
279
- // so we can absolutely position the two menus and maintain the current menu's height
280
- this.renderer.setStyle(navEl, 'height', `${height}px`);
281
- this.renderer.setStyle(navEl, 'width', `${width}px`);
282
- this.renderer.addClass(this.el.nativeElement, 'open');
283
- setTimeout(() => {
284
- this.renderer.addClass(this.el.nativeElement, 'open-active');
285
- });
286
- }
287
- else {
288
- // Re-add the listener once the child menu closes
289
- this.addKeydownListener();
290
- this.renderer.removeClass(this.el.nativeElement, 'open-active');
291
- setTimeout(() => {
292
- this.renderer.removeClass(this.el.nativeElement, 'open');
293
- // Reset the nav element's height to auto
294
- this.renderer.setStyle(navEl, 'height', '100%');
295
- this.selected = null;
296
- }, menuAnimationSpeed);
297
- }
298
- }
299
- /**
300
- * Handle key presses to navigate the menu
301
- */
302
- keyNavigate(event) {
303
- if (this.enableKeyNav && event.target === this.dropdownToggleButton?.nativeElement) {
304
- switch (event.key) {
305
- case 'ArrowUp':
306
- case 'Up':
307
- case 'ArrowDown':
308
- case 'Down':
309
- event.stopPropagation();
310
- event.preventDefault();
311
- this.moveHighlightedUpOrDown(event);
312
- break;
313
- case 'ArrowRight':
314
- case 'Right':
315
- event.stopPropagation();
316
- event.preventDefault();
317
- // Select the item if it has child items
318
- if (this.highlightedItem && this.highlightedItem.items) {
319
- this.selectItem(event, this.highlightedItem, true);
320
- }
321
- break;
322
- case 'ArrowLeft':
323
- case 'Left':
324
- event.stopPropagation();
325
- event.preventDefault();
326
- // Close the menu if it is a child menu
327
- if (this.parent) {
328
- this.back(event);
329
- }
330
- break;
331
- case ' ':
332
- case 'Spacebar':
333
- case 'Enter':
334
- // Prevent 'enter' from doing whatever it does on the currently focused element
335
- event.preventDefault();
336
- if (this.highlightedItemIndex > -1 && this.highlightedItem) {
337
- this.selectItem(event, this.highlightedItem, true);
338
- // If the header is highlighted
339
- }
340
- else if (this.highlightedItemIndex === -1) {
341
- // Close the menu if it's a child
342
- if (this.parent) {
343
- this.back(event);
344
- }
345
- }
346
- break;
347
- default:
348
- return;
349
- }
350
- }
351
- }
352
- /**
353
- * Scroll to the item currently marked as 'is-selected'. Wait a tick for the
354
- * NgClassDirecitve or NavItemActiveDirective to respond to the model changes
355
- * and update the view.
356
- */
357
- scrollToSelectedItem() {
358
- window.setTimeout(() => {
359
- const linkSelector = `li.is-selected`;
360
- this.scrollService.scrollToItem(`#${this.id}_list`, linkSelector);
361
- });
362
- }
363
- moveHighlightedUpOrDown(event) {
364
- switch (event.key) {
365
- case 'ArrowUp':
366
- case 'Up':
367
- if (this.highlightedItemIndex > -1) {
368
- this.highlightedItemIndex--;
369
- }
370
- break;
371
- case 'ArrowDown':
372
- case 'Down':
373
- if (this.highlightedItemIndex < this.selectableItems.length - 1) {
374
- this.highlightedItemIndex++;
375
- }
376
- break;
377
- default:
378
- return;
379
- }
380
- if (this.highlightedItemIndex > -1) {
381
- // Store the item at the current highlight index
382
- this.highlightedItem = this.selectableItems[this.highlightedItemIndex];
383
- }
384
- else {
385
- this.highlightedItem = null;
386
- }
387
- this.scrollToHighlightedItem();
388
- }
389
- /**
390
- * Scroll to the specified menu item.
391
- * If no item is provided, it will scroll to the first item.
392
- *
393
- * @param item The menu item to scroll to.
394
- * @memberof MenuComponent
395
- */
396
- scrollMenu(item) {
397
- if (this.items.length > 0 && this.id) {
398
- item = item ? item : this.items[0];
399
- let itemId = item.id ? item.id : MenuComponent.getIndexedItemId(this.items, item, this.id);
400
- this.scrollService.scrollItemCentered(`#${this.id}_list`, `#${itemId}`);
401
- }
402
- }
403
- scrollToHighlightedItem() {
404
- this.scrollMenu(this.highlightedItem);
405
- }
406
- addKeydownListener() {
407
- // Only attempt to add the listener if keyboard nav is enabled
408
- if (this.enableKeyNav) {
409
- // renderer.listen adds the listener and returns a function to remove it from the renderer.
410
- // The listener remains active until this function is called.
411
- this.removeKeydownListener = this.renderer.listen('document', 'keydown', (event) => this.keyNavigate(event));
412
- }
413
- }
414
- /**
415
- * Sets the menu item ids using its index if item doesn't already have one
416
- */
417
- setItemIds() {
418
- if (this.items) {
419
- this.items.forEach((item, index) => {
420
- item.id = item.id ? item.id : this.id + '_item' + index;
421
- if (item.items) {
422
- item.items.forEach((childItem, childIndex) => {
423
- childItem.id = childItem.id ? childItem.id : this.id + '_item' + index + '-' + childIndex;
424
- });
425
- }
426
- });
427
- }
428
- }
429
- }
430
- MenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.WindowService }, { token: i2.ScrollService }], target: i0.ɵɵFactoryTarget.Component });
431
- MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: MenuComponent, selector: "ec-menu", inputs: { id: "id", items: "items", selected: "selected", parent: "parent", templateType: "templateType", customMenuTemplate: "customMenuTemplate", title: "title", showNoItems: "showNoItems", noDataText: "noDataText", enableKeyNav: "enableKeyNav", highlightedItem: "highlightedItem", maintainSelectedItem: "maintainSelectedItem", truncateItems: "truncateItems", preserveIconSpace: "preserveIconSpace", dropdownToggleButton: "dropdownToggleButton" }, outputs: { selectedChanged: "selectedChanged", menuClosed: "menuClosed" }, host: { properties: { "attr.id": "this.attrId" } }, viewQueries: [{ propertyName: "labelTemplate", first: true, predicate: ["label"], descendants: true, static: true }, { propertyName: "iconAndLabelTemplate", first: true, predicate: ["iconAndLabel"], descendants: true, static: true }, { propertyName: "checkAndLabelTemplate", first: true, predicate: ["checkAndLabel"], descendants: true, static: true }, { propertyName: "iconLabelCaptionTemplate", first: true, predicate: ["iconLabelCaption"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <ng-container *ngFor=\"let item of items; index as i\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\r\n\r\n <!-- Show child items under parent item if the item is a heading or divided-section -->\r\n <ng-container\r\n *ngIf=\"item.items?.length && (item.display === 'heading' || item.display === 'divided-section')\">\r\n <ng-container *ngFor=\"let childItem of item.items; index as j; first as isFirst; last as isLast\"\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: childItem, index: i + '-' + j, isDividedSectionChild: item.display === 'divided-section', isFirst: isFirst, isLast: isLast}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items && selected?.display !== 'heading' && selected?.display !== 'divided-section'\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<ng-template #itemTemplate\r\n let-item\r\n let-i=\"index\"\r\n let-isDividedSectionChild=\"isDividedSectionChild\"\r\n let-isFirst=\"isFirst\"\r\n let-isLast=\"isLast\">\r\n <li *ngIf=\"!(item.hideIfNoItems && !item.items?.length) && item.display !== 'divided-section'\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [class.divider-top]=\"item.display === 'divider-top' || (isDividedSectionChild && isFirst)\"\r\n [class.divider]=\"item.display === 'divider' || (isDividedSectionChild && isLast)\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n</ng-template>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\"\r\n [innerHTML]=\"item.caption\"></div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </h3>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<ng-template #helpPopover\r\n let-item>\r\n <ec-help-popover id=\"{{item.id}}_helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{item.helpPopover | translate}}\"\r\n contentPosition=\"{{item.helpPopoverPosition ?? 'top-left'}}\">\r\n </ec-help-popover>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider:not(:last-child){border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.divider-top:not(:first-child):not(.divider + .divider-top){border-top:1px solid var(--ec-border-color);padding-top:.25rem;margin-top:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.NavItemActiveDirective, selector: "[ecNavItemActive]", inputs: ["ecNavItemActive", "ecNavItemActiveExactMatch", "ecNavItemActiveQueryParams", "ecNavItemActiveUrl"], outputs: ["routerLinkActivated"] }, { kind: "component", type: MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "component", type: i6.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
432
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, decorators: [{
433
- type: Component,
434
- args: [{ selector: 'ec-menu', template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <ng-container *ngFor=\"let item of items; index as i\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\r\n\r\n <!-- Show child items under parent item if the item is a heading or divided-section -->\r\n <ng-container\r\n *ngIf=\"item.items?.length && (item.display === 'heading' || item.display === 'divided-section')\">\r\n <ng-container *ngFor=\"let childItem of item.items; index as j; first as isFirst; last as isLast\"\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: childItem, index: i + '-' + j, isDividedSectionChild: item.display === 'divided-section', isFirst: isFirst, isLast: isLast}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items && selected?.display !== 'heading' && selected?.display !== 'divided-section'\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<ng-template #itemTemplate\r\n let-item\r\n let-i=\"index\"\r\n let-isDividedSectionChild=\"isDividedSectionChild\"\r\n let-isFirst=\"isFirst\"\r\n let-isLast=\"isLast\">\r\n <li *ngIf=\"!(item.hideIfNoItems && !item.items?.length) && item.display !== 'divided-section'\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [class.divider-top]=\"item.display === 'divider-top' || (isDividedSectionChild && isFirst)\"\r\n [class.divider]=\"item.display === 'divider' || (isDividedSectionChild && isLast)\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n</ng-template>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\"\r\n [innerHTML]=\"item.caption\"></div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">\r\n {{item.label}}\r\n <ng-container *ngIf=\"item.helpPopover\"\r\n [ngTemplateOutlet]=\"helpPopover\"\r\n [ngTemplateOutletContext]=\"{$implicit: item}\">\r\n </ng-container>\r\n </h3>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<ng-template #helpPopover\r\n let-item>\r\n <ec-help-popover id=\"{{item.id}}_helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{item.helpPopover | translate}}\"\r\n contentPosition=\"{{item.helpPopoverPosition ?? 'top-left'}}\">\r\n </ec-help-popover>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider:not(:last-child){border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.divider-top:not(:first-child):not(.divider + .divider-top){border-top:1px solid var(--ec-border-color);padding-top:.25rem;margin-top:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"] }]
435
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.WindowService }, { type: i2.ScrollService }]; }, propDecorators: { id: [{
436
- type: Input
437
- }], attrId: [{
438
- type: HostBinding,
439
- args: ['attr.id']
440
- }], items: [{
441
- type: Input
442
- }], selected: [{
443
- type: Input
444
- }], parent: [{
445
- type: Input
446
- }], templateType: [{
447
- type: Input
448
- }], customMenuTemplate: [{
449
- type: Input
450
- }], title: [{
451
- type: Input
452
- }], showNoItems: [{
453
- type: Input
454
- }], noDataText: [{
455
- type: Input
456
- }], enableKeyNav: [{
457
- type: Input
458
- }], highlightedItem: [{
459
- type: Input
460
- }], maintainSelectedItem: [{
461
- type: Input
462
- }], truncateItems: [{
463
- type: Input
464
- }], preserveIconSpace: [{
465
- type: Input
466
- }], dropdownToggleButton: [{
467
- type: Input
468
- }], selectedChanged: [{
469
- type: Output
470
- }], menuClosed: [{
471
- type: Output
472
- }], labelTemplate: [{
473
- type: ViewChild,
474
- args: ['label', { static: true }]
475
- }], iconAndLabelTemplate: [{
476
- type: ViewChild,
477
- args: ['iconAndLabel', { static: true }]
478
- }], checkAndLabelTemplate: [{
479
- type: ViewChild,
480
- args: ['checkAndLabel', { static: true }]
481
- }], iconLabelCaptionTemplate: [{
482
- type: ViewChild,
483
- args: ['iconLabelCaption', { static: true }]
484
- }] } });
485
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXdCLE1BQU0sRUFBeUMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFxQ3pMLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFFdEM7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyxhQUFhO0lBZ0x0Qjs7O09BR0c7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBaUI7UUFDOUMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxpQkFBaUIsRUFBRTtnQkFDbEUsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QjtpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ25CLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2FBQ3ZJO1lBQ0QsT0FBTyxlQUFlLENBQUM7UUFDM0IsQ0FBQyxFQUFjLEVB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SztzQkFBcEIsS0FBSztnQkFTVSxRQUFRO3NCQUF2QixLQUFLO2dCQU9VLE1BQU07c0JBQXJCLEtBQUs7Z0JBUVUsWUFBWTtzQkFBM0IsS0FBSztnQkFVVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBTVUsS0FBSztzQkFBcEIsS0FBSztnQkFNVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBTVUsWUFBWTtzQkFBM0IsS0FBSztnQkFNVSxlQUFlO3NCQUE5QixLQUFLO2dCQU9VLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFLVSxhQUFhO3NCQUE1QixLQUFLO2dCQU1VLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFLVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBT1csZUFBZTtzQkFBL0IsTUFBTTtnQkFPVSxVQUFVO3NCQUExQixNQUFNO2dCQW1CdUMsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU1pQixvQkFBb0I7c0JBQXhFLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFNVyxxQkFBcUI7c0JBQTFFLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFLYSx3QkFBd0I7c0JBQWhGLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlua1RhcmdldCB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFncy90YWcnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcbmltcG9ydCB7IFBvcG92ZXJDb250ZW50UG9zaXRpb24gfSBmcm9tICcuLi9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCB0eXBlIE1lbnVUZW1wbGF0ZVR5cGUgPSBcImxhYmVsXCIgfCBcImljb25BbmRMYWJlbFwiIHwgXCJjaGVja0FuZExhYmVsXCIgfCBcImljb25MYWJlbENhcHRpb25cIjtcclxuXHJcbmV4cG9ydCB0eXBlIE1lbnVIb3N0RWxlbWVudENsYXNzZXMgPSAnYmctdHJhbnNwYXJlbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZW51SXRlbTxUVmFsdWUgPSBhbnksIFNJdGVtcyA9IGFueT4gZXh0ZW5kcyBOYXZJdGVtIHtcclxuICAgIC8vIExhYmVsIGlzIG9wdGlvbmFsIGluIE5hdkl0ZW0gYnV0IHdhcyBub3QgaW4gTWVudUl0ZW0sXHJcbiAgICAvLyBvdmVycmlkaW5nIHRvIGJlIHJlcXVpcmVkXHJcbiAgICBsYWJlbDogc3RyaW5nLFxyXG4gICAgY2FwdGlvbj86IHN0cmluZyxcclxuICAgIGl0ZW1zPzogTWVudUl0ZW08U0l0ZW1zPltdLFxyXG4gICAgY2hlY2tlZD86IGJvb2xlYW4sXHJcbiAgICBkaXNwbGF5PzogJ2RlZmF1bHQnIHwgJ2hlYWRpbmcnIHwgJ2RpdmlkZXInIHwgJ2RpdmlkZWQtc2VjdGlvbicsXHJcbiAgICB2YWx1ZT86IFRWYWx1ZSxcclxuICAgIGNsYXNzTGlzdD86IHN0cmluZyxcclxuICAgIGRpc2FibGVkPzogYm9vbGVhbixcclxuICAgIGhpZGRlbj86IGJvb2xlYW4sXHJcbiAgICByZWFkb25seT86IGJvb2xlYW4sXHJcbiAgICB0YXJnZXQ/OiBMaW5rVGFyZ2V0LFxyXG4gICAgZXh0ZXJuYWxMaW5rPzogYm9vbGVhbixcclxuICAgIC8qKiBPcHRpb25hbCB0ZXh0IHRvIGRpc3BsYXkgaW4tcGxhY2Ugb2YgdGhlIGRlZmF1bHQgbGFiZWwgd2hlbiB0aGUgTWVudUl0ZW0gaXMgc2VsZWN0ZWQuICovXHJcbiAgICBzZWxlY3RlZExhYmVsPzogc3RyaW5nLFxyXG4gICAgaGlkZUlmTm9JdGVtcz86IGJvb2xlYW4sXHJcblxyXG4gICAgLyoqIE9wdGlvbmFsIGhlbHAgcG9wb3ZlciBjb250ZW50IHRvIGRpc3BsYXkgbmV4dCB0byB0aGUgaGVhZGVyIG9yIGluZGl2aWR1YWwgaXRlbS4gTm90ZTogVGhpcyBvbmx5IHdpbGxcclxuICAgICAqICBzaG93IHdoZW4gdXNpbmcgb3VyIGJ1aWx0IGluIGl0ZW0gdGVtcGxhdGVzLlxyXG4gICAgICovXHJcbiAgICBoZWxwUG9wb3Zlcj86IHN0cmluZyxcclxuICAgIC8qKiBPcHRpb25hbCBoZWxwIHBvcG92ZXIgcG9zaXRpb24uIElmIG5vdCBkZWZpbmVkIGEgZGVmYXVsdCBvZiAndG9wLWxlZnQnIHdpbGwgYmUgdXNlZC4gKi9cclxuICAgIGhlbHBQb3BvdmVyUG9zaXRpb24/OiBQb3BvdmVyQ29udGVudFBvc2l0aW9uLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IG1lbnVBbmltYXRpb25TcGVlZCA9IDM1MDtcclxuXHJcbi8qKlxyXG4gKiBQcmltaXRpdmUgTWVudSBjb21wb25lbnQgdGhhdCBlbmNhcHN1bGF0ZXMga25vd24gdGVtcGxhdGVzXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdlYy1tZW51JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL21lbnUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnB1dCBmb3IgdGhlIG1lbnUncyB0ZW1wbGF0ZSBpZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgYm91bmQgdG8gdGhlIGhvc3QgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKSBwdWJsaWMgYXR0cklkPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIGl0ZW1zIHRvIGRpc3BsYXlcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXM6IEFycmF5PE1lbnVJdGVtPiA9IFtdO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqICBTZWxlY3RlZCBpdGVtOyBhbm5vdGF0ZXMgdGhlIGl0ZW1cclxuICAgICAqICB3aGVuIGRpc3BsYXllZCB3aXRoICdzZWxlY3RlZCcgY2xhc3NcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWQ6IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBhcmVudCBtZW51IGl0ZW0uIElmIGRlZmluZWQsIGEgaGVhZGVyIHdpdGggdGhlIHBhcmVudCdzIGxhYmVsIGFuZCBhXHJcbiAgICAgKiBiYWNrIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBhcmVudD86IE1lbnVJdGVtO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXkgdGVtcGxhdGVcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGVUeXBlOiBNZW51VGVtcGxhdGVUeXBlID0gJ2xhYmVsJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wdGlvbmFsIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIG1lbnUgaXRlbXMuIE11c3QgZGVjbGFyZSBhIHRlbXBsYXRlXHJcbiAgICAgKiBpbnB1dCB2YXJpYWJsZSBjYWxsZWQgXCJpdGVtXCIgbGlrZSBzbzogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU5hbWUgbGV0LWl0ZW0+LFxyXG4gICAgICogd2hlcmUgaXRlbSByZXByZXNlbnRzIHRoZSBtZW51SXRlbS5cclxuICAgICAqIFdpbGwgb3ZlcnJpZGUgdGhlIGNob2ljZSBmb3IgdGVtcGxhdGVUeXBlIGlmIHByb3ZpZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21NZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZW51J3MgdGl0bGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRpdGxlPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgbWVzc2FnZSB3aGVuIHRoZXJlIGFyZSBubyBpdGVtc1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd05vSXRlbXM/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXh0IHRvIHNob3cgd2hlbiBtZW51IGlzIGVtcHR5IGFuZCBzaG93Tm9JdGVtcyBpcyB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBub0RhdGFUZXh0OiBzdHJpbmcgPSAnTm9JdGVtc19UQyc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbHMgd2hldGhlciBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGVuYWJsZUtleU5hdj86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVtIGN1cnJlbnRseSBoaWdobGlnaHRlZCBieSBrZXlib2FyZCBuYXZpZ2F0aW9uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWdobGlnaHRlZEl0ZW06IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyB0aGUgbWVudSB0byBtYWludGFpbiB0aGUgc2VsZWN0ZWQvbGFzdFNlbGVjdGVkIGl0ZW0uIFR1cm5pbmcgdGhpcyBvZmYgaXMgdXNlZnVsIGZvclxyXG4gICAgICogYWN0aW9uIHR5cGUgbWVudXMgdGhhdCBhcmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4gYXQgYWxsIHRpbWVzIGFuZCB5b3UgZG8gbm90XHJcbiAgICAgKiB3YW50IHRoZSBpdGVtIHRvIGJlIHNlbGVjdGVkIHdoZW4gY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG1haW50YWluU2VsZWN0ZWRJdGVtOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgcHJldmVudCB0ZXh0LXdyYXBwaW5nIG9mIG1lbnUgaXRlbXMgYW5kIHRydW5jYXRlIGluc3RlYWQuIEFsc28gdHVybnMgb24gYSB0b29sdGlwIGZvciB0aGUgbWVudSBpdGVtLiBEZWZhdWx0OiBmYWxzZTtcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRydW5jYXRlSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gdHJ1ZSwgdGhlIHNwYWNlIGZvciB0aGUgaWNvbiBpcyBwcmVzZXJ2ZWQgZm9yIG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSBpY29ucy5cclxuICAgICAqIE9ubHkgYXBwbGljYWJsZSBmb3IgaWNvbkFuZExhYmVsIG1lbnVzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcHJlc2VydmVJY29uU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZmVyZW5jZSB0byB0aGUgdG9nZ2xlIGJ1dHRvbi4gIFNldCB3aGVuIG1lbnUgaXMgdXNlZCBhcyBwYXJ0IG9mIGEgRHJvcGRvd25Db21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93blRvZ2dsZUJ1dHRvbj86IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0dGVkIHdoZW4gYHNlbGVjdGVkYCBpcyBjaGFuZ2VkLiBFbWl0cyB0aGUgcmVmZXJlbmNlZCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxNZW51SXRlbT4gPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtPigpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgbWVudSBoYXMgYSBwYXJlbnQgYW5kIGJhY2sgaXMgY2xpY2tlZFxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBtZW51Q2xvc2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGl0ZW0gdGVtcGxhdGUgdGhhdCBpcyBsb2FkZWQgaW50byB0aGUgY29tcG9uZW50IHRlbXBsYXRlXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsaXplZFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGV4IG9mIHRoZSBpdGVtIGN1cnJlbnRseSBoaWdobGlnaHRlZCB1c2luZyBrZXlib2FyZCBuYXZcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhpZ2hsaWdodGVkSXRlbUluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdsYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgbGFiZWxUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgaWNvbiBhbmQgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnaWNvbkFuZExhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBpY29uQW5kTGFiZWxUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgY2hlY2sgYW5kIGxhYmVsIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2NoZWNrQW5kTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGNoZWNrQW5kTGFiZWxUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBpY29uLCBsYWJlbCBhbmQgY2FwdGlvbiB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdpY29uTGFiZWxDYXB0aW9uJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBpY29uTGFiZWxDYXB0aW9uVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGFpbnMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gcmVtb3ZlIHRoZSBldmVuIGxpc3RlbmVyIGZyb20gdGhlIHJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVtb3ZlS2V5ZG93bkxpc3RlbmVyPzogKCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExhc3QgaXRlbSB0aGlzLnNlbGVjdGVkIHdhcyBzZXQgdG8gdmlhIHNlbGVjdEl0ZW0oKS5cclxuICAgICAqIFRoaXMgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhpcy5zZWxlY3RlZCwgYmVjYXVzZSB0aGlzLnNlbGVjdGVkIGlzIGFuIGlucHV0IHByb3BlcnR5XHJcbiAgICAgKiBhbmQgY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgYSBjb25zdW1lciB0aHJvdWdoIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiBzZWxlY3RJdGVtKCkuXHJcbiAgICAgKiBUaGlzIGFsbG93cyB1cyB0byBwcmV2ZW50IGRvdWJsZS1jYWxscyB0byBzZWxlY3RJdGVtKCkgd2l0aCB0aGUgc2FtZSBpbnB1dC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWQ6IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbGF0dGVuZWQgYXJyYXkgb2YgYWxsIHNlbGVjdGFibGUgaXRlbXMgaW4gdGhlIG1lbnUuIE1ha2VzIGl0IGVhc2llciB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgaXRlbSBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZWxlY3RhYmxlSXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gYSBmbGF0IGxpc3Qgb2YgYWxsIHNlbGVjdGFibGUgaXRlbXMgaW4gdGhlIHByb3ZpZGVkIG1lbnUgaXRlbXMuIEZpbHRlcnMgb3V0IGhlYWRpbmdzIGFuZCBkaXZpZGVkLXNlY3Rpb25zLlxyXG4gICAgICogVGhpcyBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBrZWVwIHRyYWNrIG9mIGN1cnJlbnRseSBoaWdobGlnaHRlZCBpdGVtcyBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTZWxlY3RhYmxlSXRlbXMoaXRlbXM6IE1lbnVJdGVtW10pOiBNZW51SXRlbVtdIHtcclxuICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKChzZWxlY3RhYmxlSXRlbXMsIGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGVJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGVJdGVtcy5wdXNoKC4uLml0ZW0uaXRlbXMuZmlsdGVyKGNoaWxkSXRlbSA9PiBjaGlsZEl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGNoaWxkSXRlbS5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RhYmxlSXRlbXM7XHJcbiAgICAgICAgfSwgPE1lbnVJdGVtW10+W10pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBJRCBmb3IgdGhlIHByb3ZpZGVkIGl0ZW0gYmFzZWQgb24gaXRzIGluZGV4IGluIHRoZSBwcm92aWRlZCBpdGVtcyBhcnJheS4gVGhpcyBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBNZW51Q29tcG9uZW50J3NcclxuICAgICAqIGdlbmVyYXRlZCBJRHMgZm9yIGl0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBwcm92aWRlZCBJRHMuIFRoaXMgaXMgdXNlZCBpbiBNZW51Q29tcG9uZW50IGFuZCBDb21ib2JveENvbXBvbmVudCB0byBzY3JvbGwgdG8gc3BlY2lmaWMgaXRlbXMuXHJcbiAgICAgKiBOT1RFOiBJZiB0aGUgaXRlbXMgYXJyYXkgZG9lcyBub3QgbWF0Y2ggd2hhdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIG1lbnUsIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgcmV0dXJuIHRoZSBjb3JyZWN0IElELlxyXG4gICAgICpcclxuICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgbm90IGZvdW5kXHJcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIE1lbnVJdGVtcyBhcnJheSB0byBzZWFyY2ggdGhyb3VnaC5cclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGdlbmVyYXRlIHRoZSBJRCBmb3IuXHJcbiAgICAgKiBAcGFyYW0gbWVudUNvbXBvbmVudElkIFVzZWQgdG8gcHJlZml4IHRoZSBnZW5lcmF0ZWQgSUQuIFRoaXMgc2hvdWxkIGJlIHRoZSBJRCBvZiB0aGUgbWVudSBjb21wb25lbnQgdGhlIGl0ZW0gaXMgcHJlc2VudCBpbi5cclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5kZXhlZEl0ZW1JZChpdGVtczogTWVudUl0ZW1bXSwgaXRlbT86IE1lbnVJdGVtIHwgbnVsbCwgbWVudUNvbXBvbmVudElkPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUluTGlzdCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1Jbkxpc3QubGFiZWwgPT09IGl0ZW0ubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bWVudUNvbXBvbmVudElkfV9pdGVtJHtpfWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgYSBoZWFkaW5nIG9yIGRpdmlkZWQgc2VjdGlvbiwgY2hlY2sgaXRzIGNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbUluTGlzdC5pdGVtcyAmJiAoaXRlbUluTGlzdC5kaXNwbGF5ID09PSAnaGVhZGluZycgfHwgaXRlbUluTGlzdC5kaXNwbGF5ID09PSAnZGl2aWRlZC1zZWN0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZW1Jbkxpc3QuaXRlbXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRJdGVtID0gaXRlbUluTGlzdC5pdGVtc1tqXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGNoZWNraW5nIG9ubHkgdGhlIGxhYmVsIGlmIHRoZSBpdGVtIGRvZXNuJ3QgaGF2ZSBhbiBpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJdGVtLmxhYmVsID09PSBpdGVtLmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bWVudUNvbXBvbmVudElkfV9pdGVtJHtpfS0ke2p9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZVxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLml0ZW1zICYmIHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlSXRlbXMgPSBNZW51Q29tcG9uZW50LmdldFNlbGVjdGFibGVJdGVtcyh0aGlzLml0ZW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzICYgZGlzcGxheXMgdGhlIGludGVyYWxpemVkIHRlbXBsYXRlIGJhc2VkIG9uXHJcbiAgICAgKiB0aGUgc2V0IHRlbXBsYXRlLlxyXG4gICAgICogQHNlZSB7IEBsaW5rIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3N8QW5ndWxhciBMaWZlY3ljbGUgSG9va3N9XHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMudGVtcGxhdGVUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgKFwibGFiZWxcIik6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5pY29uQW5kTGFiZWxUZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIChcImljb25BbmRMYWJlbFwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25BbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiY2hlY2tBbmRMYWJlbFwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmNoZWNrQW5kTGFiZWxUZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIChcImljb25MYWJlbENhcHRpb25cIik6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5pY29uTGFiZWxDYXB0aW9uVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZVR5cGUgZm9yIE1lbnVDb21wb25lbnQuIFBsZWFzZSB1c2UgZWl0aGVyOiAnbGFiZWwnLCAnaWNvbkFuZExhYmVsJyBvciAnY2hlY2tBbmRMYWJlbCdgKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9pZiB0aGUgY29uc3VtZXIgcHJvdmlkZWQgYSBtZW51SXRlbVRlbXBsYXRlLCBvdmVycmlkZSB0aGUgaW50ZXJuYWxpemVkVGVtcGxhdGUgd2l0aCB0aGF0LlxyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbU1lbnVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5jdXN0b21NZW51VGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF0dHJJZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEl0ZW1JZHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtICYmIHRoaXMuc2VsZWN0YWJsZUl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID0gdGhpcy5zZWxlY3RhYmxlSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4geyByZXR1cm4gdGhpcy5oaWdobGlnaHRlZEl0ZW0gPT09IGl0ZW19KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYWRkS2V5ZG93bkxpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbGlzdGVuZXIgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZFxyXG4gICAgICAgIGlmICh0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkLCBvcGVuIGEgY2hpbGQgbWVudSBpZiB0aGUgaXRlbSBoYXMgaXRlbXMsIGNhbGxcclxuICAgICAqIHRoZSBpdGVtJ3MgY2xpY2sgbWV0aG9kIGlmIGRlZmluZWQsIG9yIGVtaXQgdGhlIHNlbGVjdGVkIGl0ZW0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGl0ZW0gVGhlIHNlbGVjdGVkIGl0ZW1cclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGV2ZW50OiBFdmVudCwgaXRlbTogTWVudUl0ZW0sIGlzS2V5RXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIC8vSW4gdGhlIGNhc2UgdGhhdCB0aGUgdXNlciBjbGlja3MgYW4gaXRlbSwgc2VsZWN0SXRlbSgpIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIGNsaWNrIGhhbmRsZXJcclxuICAgICAgICAvL2FuZCB0aHJvdWdoIG9uUm91dGVyTGlua0FjdGl2YXRlZC4gT25seSBvbmUgb2YgdGhlc2Ugd2lsbCBtYWtlIGl0IHRocm91Z2ggdGhpcyBpZiBzdGF0ZW1lbnRcclxuICAgICAgICAvL2JlY2F1c2UgdGhlIGZpcnN0IG9uZSB3aWxsIHNldCB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW0uXHJcbiAgICAgICAgaWYgKCFpdGVtLmRpc2FibGVkICYmICFpdGVtLnJlYWRvbmx5ICYmIHRoaXMubGFzdFNlbGVjdGVkICE9PSBpdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0udXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5vbkNsaWNrKGl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtcyAmJiBpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJyAmJiBpdGVtLmRpc3BsYXkgIT09ICdkaXZpZGVkLXNlY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVDaGlsZE1lbnUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSB0aGUgdXJsIG5hdmlnYXRpb24gaWYgdGhlIGtleWJvYXJkIHdhcyB1c2VkXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNLZXlFdmVudCB8fCAoPEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KT8udGFnTmFtZSA9PT0gJ0xJJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS51cmwsIGl0ZW0udGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3dTZXJ2aWNlLm5hdmlnYXRlVG9VcmwoaXRlbS51cmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gRW1pdCBzbyB1cHN0cmVhbSBjb21wb25lbnRzIGtub3cgYW4gaXRlbSB3YXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYWludGFpblNlbGVjdGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IG1lbnUgYW5kIG9wZW4gdGhlIHBhcmVudCBtZW51XHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYmFjayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vbkNsaWNrKG51bGwsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lbnVDbG9zZWQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgdGhlIHNlbGVjdGVkIGl0ZW1cclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNlbGVjdGlvbihpdGVtOiBNZW51SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJyAmJiBpdGVtLmRpc3BsYXkgIT09ICdkaXZpZGVkLXNlY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2VkLmVtaXQoaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wZW4gb3IgY2xvc2UgdGhlIGNoaWxkIG1lbnUuIFdoZW4gdGhlIGNoaWxkIG1lbnUgY2xvc2VzLCB0aGUgc2VsZWN0ZWRcclxuICAgICAqIGl0ZW0gaXMgcmVzZXQuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9nZ2xlQ2hpbGRNZW51KG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBsZXQgbmF2RWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignbmF2Jyk7XHJcblxyXG4gICAgICAgIGlmIChvcGVuKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbGlzdGVuZXIgb24gdGhlIHBhcmVudCBtZW51IHdoZW4gYSBjaGlsZCBtZW51IGlzIG9wZW5lZFxyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRvIGF2b2lkIGludGVyZmVyZW5jZSBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIG1lbnVzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gbmF2RWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IG5hdkVsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gYW5pbWF0ZSB0aGUgY2hpbGQgbWVudSwgd2UgbmVlZCB0byBzZXQgaGVpZ2h0IG9uIHRoZSBuYXYgZWxlbWVudFxyXG4gICAgICAgICAgICAvLyBzbyB3ZSBjYW4gYWJzb2x1dGVseSBwb3NpdGlvbiB0aGUgdHdvIG1lbnVzIGFuZCBtYWludGFpbiB0aGUgY3VycmVudCBtZW51J3MgaGVpZ2h0XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXZFbCwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3BlbicpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3Blbi1hY3RpdmUnKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBSZS1hZGQgdGhlIGxpc3RlbmVyIG9uY2UgdGhlIGNoaWxkIG1lbnUgY2xvc2VzXHJcbiAgICAgICAgICAgIHRoaXMuYWRkS2V5ZG93bkxpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4tYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIG5hdiBlbGVtZW50J3MgaGVpZ2h0IHRvIGF1dG9cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICdoZWlnaHQnLCAnMTAwJScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH0sIG1lbnVBbmltYXRpb25TcGVlZClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUga2V5IHByZXNzZXMgdG8gbmF2aWdhdGUgdGhlIG1lbnVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleU5hdmlnYXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5TmF2ICYmIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5kcm9wZG93blRvZ2dsZUJ1dHRvbj8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdVcCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnRG93bic6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVIaWdobGlnaHRlZFVwT3JEb3duKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgaXRlbSBpZiBpdCBoYXMgY2hpbGQgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW0gJiYgdGhpcy5oaWdobGlnaHRlZEl0ZW0uaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLmhpZ2hsaWdodGVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdMZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtZW51IGlmIGl0IGlzIGEgY2hpbGQgbWVudVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1NwYWNlYmFyJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcclxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50ICdlbnRlcicgZnJvbSBkb2luZyB3aGF0ZXZlciBpdCBkb2VzIG9uIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLmhpZ2hsaWdodGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGhlYWRlciBpcyBoaWdobGlnaHRlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA9PT0gLTEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtZW51IGlmIGl0J3MgYSBjaGlsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY3JvbGwgdG8gdGhlIGl0ZW0gY3VycmVudGx5IG1hcmtlZCBhcyAnaXMtc2VsZWN0ZWQnLiBXYWl0IGEgdGljayBmb3IgdGhlXHJcbiAgICAgKiBOZ0NsYXNzRGlyZWNpdHZlIG9yIE5hdkl0ZW1BY3RpdmVEaXJlY3RpdmUgdG8gcmVzcG9uZCB0byB0aGUgbW9kZWwgY2hhbmdlc1xyXG4gICAgICogYW5kIHVwZGF0ZSB0aGUgdmlldy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjcm9sbFRvU2VsZWN0ZWRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGlua1NlbGVjdG9yID0gYGxpLmlzLXNlbGVjdGVkYDtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvSXRlbShgIyR7dGhpcy5pZH1fbGlzdGAsIGxpbmtTZWxlY3Rvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtb3ZlSGlnaGxpZ2h0ZWRVcE9yRG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICBjYXNlICdVcCc6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgICAgICBjYXNlICdEb3duJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4IDwgdGhpcy5zZWxlY3RhYmxlSXRlbXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXgrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGl0ZW0gYXQgdGhlIGN1cnJlbnQgaGlnaGxpZ2h0IGluZGV4XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gdGhpcy5zZWxlY3RhYmxlSXRlbXNbdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjcm9sbFRvSGlnaGxpZ2h0ZWRJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBtZW51IGl0ZW0uXHJcbiAgICogSWYgbm8gaXRlbSBpcyBwcm92aWRlZCwgaXQgd2lsbCBzY3JvbGwgdG8gdGhlIGZpcnN0IGl0ZW0uXHJcbiAgICAgKlxyXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdG8gc2Nyb2xsIHRvLlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxNZW51KGl0ZW0/OiBNZW51SXRlbSB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPiAwICYmIHRoaXMuaWQpIHtcclxuICAgICAgICAgICAgaXRlbSA9IGl0ZW0gPyBpdGVtIDogdGhpcy5pdGVtc1swXTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1JZCA9IGl0ZW0uaWQgPyBpdGVtLmlkIDogTWVudUNvbXBvbmVudC5nZXRJbmRleGVkSXRlbUlkKHRoaXMuaXRlbXMsIGl0ZW0sIHRoaXMuaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsSXRlbUNlbnRlcmVkKGAjJHt0aGlzLmlkfV9saXN0YCwgYCMke2l0ZW1JZH1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzY3JvbGxUb0hpZ2hsaWdodGVkSXRlbSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNjcm9sbE1lbnUodGhpcy5oaWdobGlnaHRlZEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkS2V5ZG93bkxpc3RlbmVyKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIE9ubHkgYXR0ZW1wdCB0byBhZGQgdGhlIGxpc3RlbmVyIGlmIGtleWJvYXJkIG5hdiBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5TmF2KSB7XHJcbiAgICAgICAgICAgIC8vIHJlbmRlcmVyLmxpc3RlbiBhZGRzIHRoZSBsaXN0ZW5lciBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSByZW5kZXJlci5cclxuICAgICAgICAgICAgLy8gVGhlIGxpc3RlbmVyIHJlbWFpbnMgYWN0aXZlIHVudGlsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLlxyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLmtleU5hdmlnYXRlKGV2ZW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWVudSBpdGVtIGlkcyB1c2luZyBpdHMgaW5kZXggaWYgaXRlbSBkb2Vzbid0IGFscmVhZHkgaGF2ZSBvbmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRJdGVtSWRzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uaWQgPSBpdGVtLmlkID8gaXRlbS5pZCA6IHRoaXMuaWQgKyAnX2l0ZW0nICsgaW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uaXRlbXMuZm9yRWFjaCgoY2hpbGRJdGVtLCBjaGlsZEluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSXRlbS5pZCA9IGNoaWxkSXRlbS5pZCA/IGNoaWxkSXRlbS5pZCA6IHRoaXMuaWQgKyAnX2l0ZW0nICsgaW5kZXggKyAnLScgKyBjaGlsZEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPG5hdj5cclxuICAgIDxkaXYgY2xhc3M9XCJwYXJlbnRcIlxyXG4gICAgICAgICBbY2xhc3Mubm8tZGF0YV09XCJzaG93Tm9JdGVtcyAmJiAoIWl0ZW1zIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMClcIj5cclxuICAgICAgICA8aGVhZGVyIGlkPVwie3tpZH19X2hlYWRlclwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtaGVhZGluZy0zIHAtMVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwiaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPT09IC0xXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwicGFyZW50XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrKCRldmVudClcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtOTAgZmxleC1zaHJpbmtcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsIHRleHQtdHJ1bmNhdGUgZmxleC1ncm93XCI+e3twYXJlbnQ/LmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvaGVhZGVyPlxyXG5cclxuICAgICAgICA8dWwgaWQ9XCJ7e2lkfX1fbGlzdFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicHktMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCBpbmRleDogaX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFNob3cgY2hpbGQgaXRlbXMgdW5kZXIgcGFyZW50IGl0ZW0gaWYgdGhlIGl0ZW0gaXMgYSBoZWFkaW5nIG9yIGRpdmlkZWQtc2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLml0ZW1zPy5sZW5ndGggJiYgKGl0ZW0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnIHx8IGl0ZW0uZGlzcGxheSA9PT0gJ2RpdmlkZWQtc2VjdGlvbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGRJdGVtIG9mIGl0ZW0uaXRlbXM7IGluZGV4IGFzIGo7IGZpcnN0IGFzIGlzRmlyc3Q7IGxhc3QgYXMgaXNMYXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGRJdGVtLCBpbmRleDogaSArICctJyArIGosIGlzRGl2aWRlZFNlY3Rpb25DaGlsZDogaXRlbS5kaXNwbGF5ID09PSAnZGl2aWRlZC1zZWN0aW9uJywgaXNGaXJzdDogaXNGaXJzdCwgaXNMYXN0OiBpc0xhc3R9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgPHAgY2xhc3M9XCJuby1kYXRhLW1lc3NhZ2VcIj57e25vRGF0YVRleHQgfCB0cmFuc2xhdGV9fTwvcD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ2hpbGQgbWVudSAoUmVuZGVyZWQgdG8gdGhlIHJpZ2h0KSAtLT5cclxuICAgIDxlYy1tZW51ICpuZ0lmPVwic2VsZWN0ZWQ/Lml0ZW1zICYmIHNlbGVjdGVkPy5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgc2VsZWN0ZWQ/LmRpc3BsYXkgIT09ICdkaXZpZGVkLXNlY3Rpb24nXCJcclxuICAgICAgICAgICAgIGlkPVwie3tpZH19X2NoaWxkXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwiY2hpbGRcIlxyXG4gICAgICAgICAgICAgW3BhcmVudF09XCJzZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICBbaXRlbXNdPVwic2VsZWN0ZWQ/Lml0ZW1zXCJcclxuICAgICAgICAgICAgIFtzaG93Tm9JdGVtc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgIFt0ZW1wbGF0ZVR5cGVdPVwidGVtcGxhdGVUeXBlXCJcclxuICAgICAgICAgICAgIFtlbmFibGVLZXlOYXZdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbdHJ1bmNhdGVJdGVtc109XCJ0cnVuY2F0ZUl0ZW1zXCJcclxuICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwib25TZWxlY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAobWVudUNsb3NlZCk9XCJ0b2dnbGVDaGlsZE1lbnUoZmFsc2UpXCI+XHJcbiAgICA8L2VjLW1lbnU+XHJcbjwvbmF2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNpdGVtVGVtcGxhdGVcclxuICAgICAgICAgICAgIGxldC1pdGVtXHJcbiAgICAgICAgICAgICBsZXQtaT1cImluZGV4XCJcclxuICAgICAgICAgICAgIGxldC1pc0RpdmlkZWRTZWN0aW9uQ2hpbGQ9XCJpc0RpdmlkZWRTZWN0aW9uQ2hpbGRcIlxyXG4gICAgICAgICAgICAgbGV0LWlzRmlyc3Q9XCJpc0ZpcnN0XCJcclxuICAgICAgICAgICAgIGxldC1pc0xhc3Q9XCJpc0xhc3RcIj5cclxuICAgIDxsaSAqbmdJZj1cIiEoaXRlbS5oaWRlSWZOb0l0ZW1zICYmICFpdGVtLml0ZW1zPy5sZW5ndGgpICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbidcIlxyXG4gICAgICAgIGlkPVwie3tpdGVtLmlkIHx8IGlkICsgJ19pdGVtJyArIGl9fVwiXHJcbiAgICAgICAgY2xhc3M9XCJ7e2l0ZW0uZGlzcGxheSB8fCAnaXRlbSd9fSB7e2l0ZW0uY2xhc3NMaXN0fX1cIlxyXG4gICAgICAgIFtjbGFzcy5kaXZpZGVyLXRvcF09XCJpdGVtLmRpc3BsYXkgPT09ICdkaXZpZGVyLXRvcCcgfHwgKGlzRGl2aWRlZFNlY3Rpb25DaGlsZCAmJiBpc0ZpcnN0KVwiXHJcbiAgICAgICAgW2NsYXNzLmRpdmlkZXJdPVwiaXRlbS5kaXNwbGF5ID09PSAnZGl2aWRlcicgfHwgKGlzRGl2aWRlZFNlY3Rpb25DaGlsZCAmJiBpc0xhc3QpXCJcclxuICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICBbaGlkZGVuXT1cIml0ZW0uaGlkZGVuXCJcclxuICAgICAgICBlY05hdkl0ZW1BY3RpdmU9XCJpcy1zZWxlY3RlZFwiXHJcbiAgICAgICAgW2VjTmF2SXRlbUFjdGl2ZVF1ZXJ5UGFyYW1zXT1cIml0ZW0ucXVlcnlQYXJhbXNcIlxyXG4gICAgICAgIFtlY05hdkl0ZW1BY3RpdmVVcmxdPVwiaXRlbS51cmxcIlxyXG4gICAgICAgIFtlY05hdkl0ZW1BY3RpdmVFeGFjdE1hdGNoXT0naXRlbS5pc0FjdGl2ZUV4YWN0TWF0Y2gnXHJcbiAgICAgICAgKHJvdXRlckxpbmtBY3RpdmF0ZWQpPVwic2VsZWN0SXRlbSgkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWhpZ2hsaWdodGVkJzooc2VsZWN0ZWQgPT09IGl0ZW0gJiYgaXRlbT8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKSB8fCBoaWdobGlnaHRlZEl0ZW0gPT09IGl0ZW0sICdpcy1saW5rJzogaXRlbS51cmwsICdpcy1kaXNhYmxlZCc6IGl0ZW0uZGlzYWJsZWQsICdpcy1yZWFkb25seSc6IGl0ZW0ucmVhZG9ubHksICdpcy1jaGVja2VkJzogaXRlbS5jaGVja2VkLCAndGV4dC1oZWFkaW5nLTMnOiBpdGVtPy5kaXNwbGF5ID09PSAnaGVhZGluZyd9XCJcclxuICAgICAgICAoY2xpY2spPVwic2VsZWN0SXRlbSgkZXZlbnQsIGl0ZW0pXCI+XHJcblxyXG4gICAgICAgIDxhICpuZ0lmPVwiaXRlbS51cmwgJiYgIWl0ZW0uZXh0ZXJuYWxMaW5rXCJcclxuICAgICAgICAgICBpZD1cInt7aXRlbS5pZH19X2xpbmtcIlxyXG4gICAgICAgICAgIHRpdGxlPVwie3t0cnVuY2F0ZUl0ZW1zID8gaXRlbS5sYWJlbCA6ICcnfX1cIlxyXG4gICAgICAgICAgIGNsYXNzPVwiaXRlbS13cmFwcGVyXCJcclxuICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnVybFwiXHJcbiAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIml0ZW0ucXVlcnlQYXJhbXMgfHwgbnVsbFwiXHJcbiAgICAgICAgICAgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCAnX3NlbGYnfX1cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgPGEgKm5nSWY9XCJpdGVtLnVybCAmJiBpdGVtLmV4dGVybmFsTGlua1wiXHJcbiAgICAgICAgICAgaWQ9XCJ7e2l0ZW0uaWR9fV9saW5rXCJcclxuICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICBjbGFzcz1cIml0ZW0td3JhcHBlclwiXHJcbiAgICAgICAgICAgaHJlZj1cInt7aXRlbS51cmx9fVwiXHJcbiAgICAgICAgICAgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCAnX3NlbGYnfX1cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtLnVybFwiXHJcbiAgICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbGk+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdsYWJlbCcgSXRlbSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNsYWJlbFxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPlxyXG4gICAgICAgIHt7aXRlbS5sYWJlbH19XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGl0ZW19XCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXMgJiYgaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgaXRlbS5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJ1wiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gJ2NoZWNrQW5kTGFiZWwnIEl0ZW0gVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjY2hlY2tBbmRMYWJlbFxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tY2hlY2sgZWMtaWNvbi1zbVwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnXCI+PC9pPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2l0ZW0uaWNvbn19IG1sLTJcIlxyXG4gICAgICAgKm5nSWY9XCJpdGVtLmljb25cIj48L2k+XHJcblxyXG4gICAgPHNwYW4gaWQ9XCJ7e2l0ZW0uaWR9fV9sYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj5cclxuICAgICAgICB7e2l0ZW0ubGFiZWx9fVxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmhlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBpdGVtfVwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbidcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdpY29uQW5kTGFiZWwnIEl0ZW0gVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjaWNvbkFuZExhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDwhLS0gSWYgbWVudUl0ZW0uaWNvbiBleGlzdHMgYW5kIGlzIG5vdCBibGFuaywgc2hvdyB0aGUgaWNvbiBpbiB0aGUgbWVudSAtLT5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2l0ZW0uaWNvbn19XCJcclxuICAgICAgICpuZ0lmPVwiKGl0ZW0uaWNvbiAmJiBpdGVtLmljb24gIT09ICcnKSB8fCBwcmVzZXJ2ZUljb25TcGFjZVwiPjwvaT5cclxuXHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPlxyXG4gICAgICAgIHt7aXRlbS5sYWJlbH19XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGl0ZW19XCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXMgJiYgaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgaXRlbS5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJ1wiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaWNvbkxhYmVsQ2FwdGlvblxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fVwiXHJcbiAgICAgICAqbmdJZj1cIihpdGVtLmljb24gJiYgaXRlbS5pY29uICE9PSAnJykgfHwgcHJlc2VydmVJY29uU3BhY2VcIj48L2k+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZydcIlxyXG4gICAgICAgICBjbGFzcz1cImxhYmVsIGZsZXgtZ3Jvd1wiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJ7e2l0ZW0uaWR9fV9sYWJlbFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cInRleHQtYm9keS0xXCJcclxuICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj5cclxuICAgICAgICAgICAge3tpdGVtLmxhYmVsfX1cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogaXRlbX1cIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBpZD1cInt7aXRlbS5pZH19X2NhcHRpb25cIlxyXG4gICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmNhcHRpb25cIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNhcHRpb24tMVwiXHJcbiAgICAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCJcclxuICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaXRlbS5jYXB0aW9uXCI+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMyAqbmdJZj1cIml0ZW0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnXCJcclxuICAgICAgICBjbGFzcz1cImZsZXgtZ3JvdyB0ZXh0LWhlYWRpbmctMyBhbGlnbi1zZWxmLWNlbnRlclwiXHJcbiAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPlxyXG4gICAgICAgIHt7aXRlbS5sYWJlbH19XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGl0ZW19XCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2gzPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MCBhbGlnbi1zZWxmLWNlbnRlclwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbidcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2hlbHBQb3BvdmVyXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDxlYy1oZWxwLXBvcG92ZXIgaWQ9XCJ7e2l0ZW0uaWR9fV9oZWxwUG9wb3ZlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbXktbjMgbXgtbjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICB0ZXh0PVwie3tpdGVtLmhlbHBQb3BvdmVyIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICBjb250ZW50UG9zaXRpb249XCJ7e2l0ZW0uaGVscFBvcG92ZXJQb3NpdGlvbiA/PyAndG9wLWxlZnQnfX1cIj5cclxuICAgIDwvZWMtaGVscC1wb3BvdmVyPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==