@energycap/components 0.40.2-rxjs-7-upgrade.20241219-1425 → 0.41.1-ECAP-27592-angular-17.20241219-1718

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 (258) hide show
  1. package/{esm2020 → esm2022}/energycap-components.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/components.module.mjs +418 -418
  3. package/{esm2020 → esm2022}/lib/controls/banner/banner.component.mjs +109 -109
  4. package/{esm2020 → esm2022}/lib/controls/button/button.component.mjs +106 -106
  5. package/{esm2020 → esm2022}/lib/controls/button/copy-button-base.directive.mjs +67 -67
  6. package/{esm2020 → esm2022}/lib/controls/button/copy-button.directive.mjs +28 -28
  7. package/{esm2020 → esm2022}/lib/controls/button/copy-table-button.directive.mjs +43 -43
  8. package/{esm2020 → esm2022}/lib/controls/calendar/calendar-item.component.mjs +59 -59
  9. package/{esm2020 → esm2022}/lib/controls/calendar/calendar.component.mjs +200 -200
  10. package/{esm2020 → esm2022}/lib/controls/calendar/calendar.types.mjs +3 -3
  11. package/{esm2020 → esm2022}/lib/controls/checkbox/checkbox.component.mjs +140 -140
  12. package/{esm2020 → esm2022}/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -38
  13. package/{esm2020 → esm2022}/lib/controls/combobox/combobox.component.mjs +879 -879
  14. package/{esm2020 → esm2022}/lib/controls/date-input/date-input.component.mjs +256 -256
  15. package/{esm2020 → esm2022}/lib/controls/dropdown/dropdown.component.mjs +243 -243
  16. package/{esm2020 → esm2022}/lib/controls/file-upload/file-upload.component.mjs +261 -261
  17. package/{esm2020 → esm2022}/lib/controls/form-control/form-control.component.mjs +104 -104
  18. package/{esm2020 → esm2022}/lib/controls/form-control-base.mjs +151 -151
  19. package/{esm2020 → esm2022}/lib/controls/form-control-label/form-control-label.component.mjs +136 -136
  20. package/{esm2020 → esm2022}/lib/controls/form-group/form-group.component.mjs +261 -261
  21. package/{esm2020 → esm2022}/lib/controls/help-popover/help-popover.component.mjs +31 -31
  22. package/{esm2020 → esm2022}/lib/controls/item-picker/item-picker.component.mjs +329 -329
  23. package/{esm2020 → esm2022}/lib/controls/link-button/link-button.component.mjs +11 -11
  24. package/{esm2020 → esm2022}/lib/controls/menu/menu.component.mjs +485 -485
  25. package/{esm2020 → esm2022}/lib/controls/navigation/link-item.mjs +1 -1
  26. package/{esm2020 → esm2022}/lib/controls/navigation/nav-group.mjs +38 -38
  27. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item-active.directive.mjs +92 -92
  28. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/controls/numericbox/numericbox.component.mjs +372 -372
  30. package/{esm2020 → esm2022}/lib/controls/popover/popover.component.mjs +117 -117
  31. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button-option.mjs +2 -2
  32. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button.component.mjs +82 -82
  33. package/{esm2020 → esm2022}/lib/controls/select/select.component.mjs +88 -88
  34. package/{esm2020 → esm2022}/lib/controls/tabs/tabs.component.mjs +47 -47
  35. package/{esm2020 → esm2022}/lib/controls/textbox/textbox.component.mjs +155 -155
  36. package/{esm2020 → esm2022}/lib/core/cache.service.mjs +105 -105
  37. package/esm2022/lib/core/custom-validators.mjs +29 -0
  38. package/esm2022/lib/core/date-time-helper.mjs +220 -0
  39. package/{esm2020 → esm2022}/lib/core/error.service.mjs +61 -61
  40. package/{esm2020 → esm2022}/lib/core/router-helper.service.mjs +111 -111
  41. package/{esm2020 → esm2022}/lib/core/scroll.service.mjs +89 -89
  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/{esm2020 → esm2022}/lib/core/validation-message.service.mjs +185 -185
  45. package/{esm2020 → esm2022}/lib/core/validation-patterns.mjs +30 -30
  46. package/{esm2020 → esm2022}/lib/core/window.service.mjs +186 -186
  47. package/{esm2020 → esm2022}/lib/display/app-bar/app-bar.component.mjs +46 -46
  48. package/esm2022/lib/display/avatar/avatar.component.mjs +67 -0
  49. package/{esm2020 → esm2022}/lib/display/avatar/avatar.service.mjs +64 -64
  50. package/{esm2020 → esm2022}/lib/display/confirm/confirm.component.mjs +168 -168
  51. package/{esm2020 → esm2022}/lib/display/dialog/dialog-content.mjs +1 -1
  52. package/{esm2020 → esm2022}/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -63
  53. package/{esm2020 → esm2022}/lib/display/dialog/dialog-types.mjs +76 -76
  54. package/{esm2020 → esm2022}/lib/display/dialog/dialog.component.mjs +281 -281
  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/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-base.mjs +111 -111
  58. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-mocks.spec.mjs +53 -53
  59. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -61
  60. package/{esm2020 → esm2022}/lib/display/item-display/item-display.component.mjs +81 -81
  61. package/{esm2020 → esm2022}/lib/display/json-display/json-display.component.mjs +47 -47
  62. package/{esm2020 → esm2022}/lib/display/resizable/resizable-base.mjs +120 -120
  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/{esm2020 → esm2022}/lib/display/splash/splash.component.mjs +42 -42
  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/{esm2020 → esm2022}/lib/display/table/resizable-table.directive.mjs +227 -227
  69. package/{esm2020 → esm2022}/lib/display/table/searchable-table.component.mjs +342 -342
  70. package/{esm2020 → esm2022}/lib/display/table/table-detail-row.component.mjs +19 -19
  71. package/{esm2020 → esm2022}/lib/display/table/table-locked-column.component.mjs +58 -58
  72. package/{esm2020 → esm2022}/lib/display/table/table-master-header-row.component.mjs +14 -14
  73. package/{esm2020 → esm2022}/lib/display/table/table-master-row.component.mjs +163 -163
  74. package/{esm2020 → esm2022}/lib/display/table/table-pagination.component.mjs +155 -155
  75. package/{esm2020 → esm2022}/lib/display/table/table-selectable-row.component.mjs +235 -235
  76. package/{esm2020 → esm2022}/lib/display/table/table.component.mjs +249 -249
  77. package/{esm2020 → esm2022}/lib/display/tags/tag.mjs +17 -17
  78. package/{esm2020 → esm2022}/lib/display/tags/tags.component.mjs +77 -77
  79. package/{esm2020 → esm2022}/lib/display/toast/toast/toast.component.mjs +77 -77
  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/{esm2020 → esm2022}/lib/display/toast/toaster/toaster.component.mjs +114 -114
  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/{esm2020 → esm2022}/lib/display/tooltip-directive/tooltip.directive.mjs +173 -173
  86. package/{esm2020 → esm2022}/lib/display/tour/tour-types.mjs +33 -33
  87. package/{esm2020 → esm2022}/lib/display/tour/tour.component.mjs +398 -398
  88. package/{esm2020 → esm2022}/lib/display/tour/tour.service.mjs +75 -75
  89. package/{esm2020 → esm2022}/lib/display/tree/tree.component.mjs +135 -135
  90. package/{esm2020 → esm2022}/lib/display/view-overlay/view-overlay.component.mjs +58 -58
  91. package/{esm2020 → esm2022}/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -32
  92. package/{esm2020 → esm2022}/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -111
  93. package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +166 -0
  94. package/{esm2020 → esm2022}/lib/shared/display/pipes/date-display.pipe.mjs +50 -50
  95. package/{esm2020 → esm2022}/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -30
  96. package/{esm2020 → esm2022}/lib/shared/display/pipes/relative-date.pipe.mjs +62 -62
  97. package/{esm2020 → esm2022}/lib/shared/display/pipes/row-count.pipe.mjs +48 -48
  98. package/{esm2020 → esm2022}/lib/shared/display/pipes/time-display.pipe.mjs +41 -41
  99. package/esm2022/lib/shared/display.mjs +6 -0
  100. package/esm2022/lib/shared/form-group.helper.mjs +67 -0
  101. package/{esm2020 → esm2022}/lib/shared/json-helper.mjs +18 -18
  102. package/esm2022/lib/shared/lodash-helper.mjs +52 -0
  103. package/{esm2020 → esm2022}/lib/shared/page/page-base/page-base.component.mjs +387 -387
  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/{esm2020 → esm2022}/lib/shared/page/page-view/page-view.component.mjs +147 -147
  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/{esm2020 → esm2022}/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -246
  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/{esm2020 → esm2022}/public-api.mjs +114 -114
  119. package/{fesm2020 → fesm2022}/energycap-components.mjs +11797 -11793
  120. package/fesm2022/energycap-components.mjs.map +1 -0
  121. package/index.d.ts +5 -5
  122. package/lib/components.module.d.ts +91 -91
  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 -17
  129. package/lib/controls/calendar/calendar.component.d.ts +54 -54
  130. package/lib/controls/calendar/calendar.types.d.ts +7 -7
  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 -80
  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 -30
  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 -111
  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/schema.d.ts +4 -4
  243. package/schematics/rxjs-7-upgrade/schema.js +2 -2
  244. package/schematics/utilities/typescript.d.ts +7 -7
  245. package/schematics/utilities/typescript.js +41 -41
  246. package/schematics/utilities/workspace.d.ts +8 -8
  247. package/schematics/utilities/workspace.js +71 -71
  248. package/esm2020/lib/core/custom-validators.mjs +0 -29
  249. package/esm2020/lib/core/date-time-helper.mjs +0 -220
  250. package/esm2020/lib/display/avatar/avatar.component.mjs +0 -67
  251. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +0 -163
  252. package/esm2020/lib/shared/display.mjs +0 -6
  253. package/esm2020/lib/shared/form-group.helper.mjs +0 -67
  254. package/esm2020/lib/shared/lodash-helper.mjs +0 -51
  255. package/esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
  256. package/fesm2015/energycap-components.mjs +0 -12211
  257. package/fesm2015/energycap-components.mjs.map +0 -1
  258. package/fesm2020/energycap-components.mjs.map +0 -1
@@ -1,105 +1,105 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class CacheService {
4
- constructor() {
5
- this.localStorageAvailable = false;
6
- this.sessionStorageAvailable = false;
7
- let cacheError = null;
8
- try {
9
- let dateStr = 'roundtrip-test-' + new Date().getTime();
10
- const value = 'val-' + dateStr;
11
- localStorage.setItem(dateStr, value);
12
- sessionStorage.setItem(dateStr, value);
13
- this.localStorageAvailable = localStorage.getItem(dateStr) == value;
14
- this.sessionStorageAvailable = sessionStorage.getItem(dateStr) == value;
15
- localStorage.removeItem(dateStr);
16
- sessionStorage.removeItem(dateStr);
17
- }
18
- catch (error) {
19
- cacheError = error;
20
- }
21
- finally {
22
- if (!this.localStorageAvailable || !this.sessionStorageAvailable) {
23
- console.warn('storage unavailable for caching purposes. Some features will not be fully supported. ', {
24
- local: this.localStorageAvailable,
25
- session: this.sessionStorageAvailable,
26
- error: cacheError
27
- });
28
- }
29
- }
30
- }
31
- /**Return true if the requested cache allows the user to round-trip data in the current environment.
32
- * Security settings can prevent it and the app may need to know if "not found" means "never set" or "not supported"
33
- */
34
- isCacheAvailable(sessionOnly = false) {
35
- return sessionOnly ? this.sessionStorageAvailable : this.localStorageAvailable;
36
- }
37
- /**
38
- * Retrieve an item from cache
39
- */
40
- getItem(key, sessionOnly = false) {
41
- let storage = this.getStorage(sessionOnly);
42
- if (storage) {
43
- let result = storage.getItem(key);
44
- if (result) {
45
- return JSON.parse(result);
46
- }
47
- }
48
- return null;
49
- }
50
- /**
51
- * Retrieves all keys from cache
52
- */
53
- keys(sessionOnly = false) {
54
- let result = new Array();
55
- let storage = this.getStorage(sessionOnly);
56
- if (storage) {
57
- for (var i = 0, len = storage.length; i < len; ++i) {
58
- result.push(storage.key(i));
59
- }
60
- }
61
- return result;
62
- }
63
- /**
64
- * Removes an item from the cache
65
- */
66
- removeItem(key, sessionOnly = false) {
67
- let storage = this.getStorage(sessionOnly);
68
- if (storage) {
69
- storage.removeItem(key);
70
- }
71
- }
72
- /**
73
- * Persists an item to cache
74
- */
75
- setItem(key, value, sessionOnly = false) {
76
- let storage = this.getStorage(sessionOnly);
77
- if (storage) {
78
- storage.setItem(key, JSON.stringify(value));
79
- }
80
- }
81
- /**Returns the local or session storage to use for backing the given cache request.
82
- * If the browser does not support the requested storage the result will be null.
83
- * This can happen if the user is in Firefox for example with the setting dom.storage.enabled = false
84
- */
85
- getStorage(sessionOnly) {
86
- if (sessionOnly && this.sessionStorageAvailable) {
87
- return window.sessionStorage;
88
- }
89
- else if (this.localStorageAvailable) {
90
- return window.localStorage;
91
- }
92
- else {
93
- return null;
94
- }
95
- }
96
- }
97
- CacheServicefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CacheService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
98
- CacheService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CacheService, providedIn: 'root' });
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CacheService, decorators: [{
100
- type: Injectable,
101
- args: [{
102
- providedIn: 'root'
103
- }]
104
- }], ctorParameters: function () { return []; } });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlL2NhY2hlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLFlBQVk7SUFLckI7UUFIUSwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDdkMsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBRzdDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJO1lBQ0EsSUFBSSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2RCxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBRS9CLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXZDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUNwRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUM7WUFFeEUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBRXRDO1FBQUMsT0FBTSxLQUFLLEVBQUU7WUFDWCxVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQ3RCO2dCQUFTO1lBQ04sSUFBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBQztnQkFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyx1RkFBdUYsRUFDaEc7b0JBQ0ksS0FBSyxFQUFFLElBQUksQ0FBQyxxQkFBcUI7b0JBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsdUJBQXVCO29CQUNyQyxLQUFLLEVBQUUsVUFBVTtpQkFDcEIsQ0FDSixDQUFDO2FBQ0w7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxLQUFLO1FBQ3ZDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNuRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPLENBQUksR0FBVyxFQUFFLFdBQVcsR0FBRyxLQUFLO1FBQzlDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsSUFBSSxPQUFPLEVBQUU7WUFDVCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksTUFBTSxFQUFFO2dCQUNSLE9BQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNoQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLO1FBQzNCLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDakMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUzQyxJQUFJLE9BQU8sRUFBRTtZQUNULEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO2FBQ2hDO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsR0FBVyxFQUFFLFdBQVcsR0FBRyxLQUFLO1FBQzlDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0MsSUFBSSxPQUFPLEVBQUU7WUFDVCxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxDQUFDLEdBQVcsRUFBRSxLQUFhLEVBQUUsV0FBVyxHQUFHLEtBQUs7UUFDMUQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxJQUFJLE9BQU8sRUFBRTtZQUNULE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRDs7O01BR0U7SUFDTSxVQUFVLENBQUMsV0FBb0I7UUFDbkMsSUFBRyxXQUFXLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFDO1lBQzNDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQztTQUNoQzthQUFNLElBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFDO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQztTQUM5QjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7O3lHQXhHUSxZQUFZOzZHQUFaLFlBQVksY0FGWCxNQUFNOzJGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FjaGVTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGxvY2FsU3RvcmFnZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBzZXNzaW9uU3RvcmFnZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGxldCBjYWNoZUVycm9yID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgZGF0ZVN0ciA9ICdyb3VuZHRyaXAtdGVzdC0nICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gJ3ZhbC0nICsgZGF0ZVN0cjtcclxuXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGRhdGVTdHIsIHZhbHVlKTtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShkYXRlU3RyLCB2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUF2YWlsYWJsZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGRhdGVTdHIpID09IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlQXZhaWxhYmxlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShkYXRlU3RyKSA9PSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGRhdGVTdHIpO1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGRhdGVTdHIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNhY2hlRXJyb3IgPSBlcnJvcjtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBpZighdGhpcy5sb2NhbFN0b3JhZ2VBdmFpbGFibGUgfHwgIXRoaXMuc2Vzc2lvblN0b3JhZ2VBdmFpbGFibGUpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdzdG9yYWdlIHVuYXZhaWxhYmxlIGZvciBjYWNoaW5nIHB1cnBvc2VzLiBTb21lIGZlYXR1cmVzIHdpbGwgbm90IGJlIGZ1bGx5IHN1cHBvcnRlZC4gJyxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsOiB0aGlzLmxvY2FsU3RvcmFnZUF2YWlsYWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uU3RvcmFnZUF2YWlsYWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGNhY2hlRXJyb3JcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgY2FjaGUgYWxsb3dzIHRoZSB1c2VyIHRvIHJvdW5kLXRyaXAgZGF0YSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cclxuICAgICAqIFNlY3VyaXR5IHNldHRpbmdzIGNhbiBwcmV2ZW50IGl0IGFuZCB0aGUgYXBwIG1heSBuZWVkIHRvIGtub3cgaWYgXCJub3QgZm91bmRcIiBtZWFucyBcIm5ldmVyIHNldFwiIG9yIFwibm90IHN1cHBvcnRlZFwiXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0NhY2hlQXZhaWxhYmxlKHNlc3Npb25Pbmx5ID0gZmFsc2UpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gc2Vzc2lvbk9ubHkgPyB0aGlzLnNlc3Npb25TdG9yYWdlQXZhaWxhYmxlIDogdGhpcy5sb2NhbFN0b3JhZ2VBdmFpbGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhbiBpdGVtIGZyb20gY2FjaGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEl0ZW08VD4oa2V5OiBzdHJpbmcsIHNlc3Npb25Pbmx5ID0gZmFsc2UpOiBUIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSB0aGlzLmdldFN0b3JhZ2Uoc2Vzc2lvbk9ubHkpO1xyXG4gICAgICAgIGlmIChzdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxUPkpTT04ucGFyc2UocmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBhbGwga2V5cyBmcm9tIGNhY2hlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBrZXlzKHNlc3Npb25Pbmx5ID0gZmFsc2UpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgICAgICBsZXQgc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZShzZXNzaW9uT25seSk7XHJcblxyXG4gICAgICAgIGlmIChzdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdG9yYWdlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdG9yYWdlLmtleShpKSEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgY2FjaGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcsIHNlc3Npb25Pbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZShzZXNzaW9uT25seSk7XHJcblxyXG4gICAgICAgIGlmIChzdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcnNpc3RzIGFuIGl0ZW0gdG8gY2FjaGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBvYmplY3QsIHNlc3Npb25Pbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZShzZXNzaW9uT25seSk7XHJcbiAgICAgICAgaWYgKHN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqUmV0dXJucyB0aGUgbG9jYWwgb3Igc2Vzc2lvbiBzdG9yYWdlIHRvIHVzZSBmb3IgYmFja2luZyB0aGUgZ2l2ZW4gY2FjaGUgcmVxdWVzdC5cclxuICAgICAqIElmIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBzdG9yYWdlIHRoZSByZXN1bHQgd2lsbCBiZSBudWxsLlxyXG4gICAgICogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB1c2VyIGlzIGluIEZpcmVmb3ggZm9yIGV4YW1wbGUgd2l0aCB0aGUgc2V0dGluZyBkb20uc3RvcmFnZS5lbmFibGVkID0gZmFsc2VcclxuICAgICovXHJcbiAgICBwcml2YXRlIGdldFN0b3JhZ2Uoc2Vzc2lvbk9ubHk6IGJvb2xlYW4pIDogU3RvcmFnZSB8IG51bGwge1xyXG4gICAgICAgIGlmKHNlc3Npb25Pbmx5ICYmIHRoaXMuc2Vzc2lvblN0b3JhZ2VBdmFpbGFibGUpe1xyXG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlO1xyXG4gICAgICAgIH0gZWxzZSBpZih0aGlzLmxvY2FsU3RvcmFnZUF2YWlsYWJsZSl7XHJcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE86IGFkZCB1c2VyIGluZm8gdG8gaXNvbGF0ZSBjYWNoZSB2YWx1ZXMgZnJvbSBlYWNoIG90aGVyXHJcbn0iXX0=
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class CacheService {
4
+ constructor() {
5
+ this.localStorageAvailable = false;
6
+ this.sessionStorageAvailable = false;
7
+ let cacheError = null;
8
+ try {
9
+ let dateStr = 'roundtrip-test-' + new Date().getTime();
10
+ const value = 'val-' + dateStr;
11
+ localStorage.setItem(dateStr, value);
12
+ sessionStorage.setItem(dateStr, value);
13
+ this.localStorageAvailable = localStorage.getItem(dateStr) == value;
14
+ this.sessionStorageAvailable = sessionStorage.getItem(dateStr) == value;
15
+ localStorage.removeItem(dateStr);
16
+ sessionStorage.removeItem(dateStr);
17
+ }
18
+ catch (error) {
19
+ cacheError = error;
20
+ }
21
+ finally {
22
+ if (!this.localStorageAvailable || !this.sessionStorageAvailable) {
23
+ console.warn('storage unavailable for caching purposes. Some features will not be fully supported. ', {
24
+ local: this.localStorageAvailable,
25
+ session: this.sessionStorageAvailable,
26
+ error: cacheError
27
+ });
28
+ }
29
+ }
30
+ }
31
+ /**Return true if the requested cache allows the user to round-trip data in the current environment.
32
+ * Security settings can prevent it and the app may need to know if "not found" means "never set" or "not supported"
33
+ */
34
+ isCacheAvailable(sessionOnly = false) {
35
+ return sessionOnly ? this.sessionStorageAvailable : this.localStorageAvailable;
36
+ }
37
+ /**
38
+ * Retrieve an item from cache
39
+ */
40
+ getItem(key, sessionOnly = false) {
41
+ let storage = this.getStorage(sessionOnly);
42
+ if (storage) {
43
+ let result = storage.getItem(key);
44
+ if (result) {
45
+ return JSON.parse(result);
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+ /**
51
+ * Retrieves all keys from cache
52
+ */
53
+ keys(sessionOnly = false) {
54
+ let result = new Array();
55
+ let storage = this.getStorage(sessionOnly);
56
+ if (storage) {
57
+ for (var i = 0, len = storage.length; i < len; ++i) {
58
+ result.push(storage.key(i));
59
+ }
60
+ }
61
+ return result;
62
+ }
63
+ /**
64
+ * Removes an item from the cache
65
+ */
66
+ removeItem(key, sessionOnly = false) {
67
+ let storage = this.getStorage(sessionOnly);
68
+ if (storage) {
69
+ storage.removeItem(key);
70
+ }
71
+ }
72
+ /**
73
+ * Persists an item to cache
74
+ */
75
+ setItem(key, value, sessionOnly = false) {
76
+ let storage = this.getStorage(sessionOnly);
77
+ if (storage) {
78
+ storage.setItem(key, JSON.stringify(value));
79
+ }
80
+ }
81
+ /**Returns the local or session storage to use for backing the given cache request.
82
+ * If the browser does not support the requested storage the result will be null.
83
+ * This can happen if the user is in Firefox for example with the setting dom.storage.enabled = false
84
+ */
85
+ getStorage(sessionOnly) {
86
+ if (sessionOnly && this.sessionStorageAvailable) {
87
+ return window.sessionStorage;
88
+ }
89
+ else if (this.localStorageAvailable) {
90
+ return window.localStorage;
91
+ }
92
+ else {
93
+ return null;
94
+ }
95
+ }
96
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CacheService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
97
+ static { thisprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CacheService, providedIn: 'root' }); }
98
+ }
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CacheService, decorators: [{
100
+ type: Injectable,
101
+ args: [{
102
+ providedIn: 'root'
103
+ }]
104
+ }], ctorParameters: function () { return []; } });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlL2NhY2hlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLFlBQVk7SUFLckI7UUFIUSwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDdkMsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBRzdDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJO1lBQ0EsSUFBSSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2RCxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBRS9CLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXZDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUNwRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUM7WUFFeEUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBRXRDO1FBQUMsT0FBTSxLQUFLLEVBQUU7WUFDWCxVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQ3RCO2dCQUFTO1lBQ04sSUFBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBQztnQkFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyx1RkFBdUYsRUFDaEc7b0JBQ0ksS0FBSyxFQUFFLElBQUksQ0FBQyxxQkFBcUI7b0JBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsdUJBQXVCO29CQUNyQyxLQUFLLEVBQUUsVUFBVTtpQkFDcEIsQ0FDSixDQUFDO2FBQ0w7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxLQUFLO1FBQ3ZDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNuRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPLENBQUksR0FBVyxFQUFFLFdBQVcsR0FBRyxLQUFLO1FBQzlDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsSUFBSSxPQUFPLEVBQUU7WUFDVCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksTUFBTSxFQUFFO2dCQUNSLE9BQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNoQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLO1FBQzNCLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDakMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUzQyxJQUFJLE9BQU8sRUFBRTtZQUNULEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO2FBQ2hDO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsR0FBVyxFQUFFLFdBQVcsR0FBRyxLQUFLO1FBQzlDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0MsSUFBSSxPQUFPLEVBQUU7WUFDVCxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxDQUFDLEdBQVcsRUFBRSxLQUFhLEVBQUUsV0FBVyxHQUFHLEtBQUs7UUFDMUQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxJQUFJLE9BQU8sRUFBRTtZQUNULE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRDs7O01BR0U7SUFDTSxVQUFVLENBQUMsV0FBb0I7UUFDbkMsSUFBRyxXQUFXLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFDO1lBQzNDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQztTQUNoQzthQUFNLElBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFDO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQztTQUM5QjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7K0dBeEdRLFlBQVk7bUhBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FjaGVTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGxvY2FsU3RvcmFnZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBzZXNzaW9uU3RvcmFnZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGxldCBjYWNoZUVycm9yID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgZGF0ZVN0ciA9ICdyb3VuZHRyaXAtdGVzdC0nICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gJ3ZhbC0nICsgZGF0ZVN0cjtcclxuXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGRhdGVTdHIsIHZhbHVlKTtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShkYXRlU3RyLCB2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUF2YWlsYWJsZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGRhdGVTdHIpID09IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlQXZhaWxhYmxlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShkYXRlU3RyKSA9PSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGRhdGVTdHIpO1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGRhdGVTdHIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNhY2hlRXJyb3IgPSBlcnJvcjtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBpZighdGhpcy5sb2NhbFN0b3JhZ2VBdmFpbGFibGUgfHwgIXRoaXMuc2Vzc2lvblN0b3JhZ2VBdmFpbGFibGUpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdzdG9yYWdlIHVuYXZhaWxhYmxlIGZvciBjYWNoaW5nIHB1cnBvc2VzLiBTb21lIGZlYXR1cmVzIHdpbGwgbm90IGJlIGZ1bGx5IHN1cHBvcnRlZC4gJyxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsOiB0aGlzLmxvY2FsU3RvcmFnZUF2YWlsYWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uU3RvcmFnZUF2YWlsYWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGNhY2hlRXJyb3JcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgY2FjaGUgYWxsb3dzIHRoZSB1c2VyIHRvIHJvdW5kLXRyaXAgZGF0YSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cclxuICAgICAqIFNlY3VyaXR5IHNldHRpbmdzIGNhbiBwcmV2ZW50IGl0IGFuZCB0aGUgYXBwIG1heSBuZWVkIHRvIGtub3cgaWYgXCJub3QgZm91bmRcIiBtZWFucyBcIm5ldmVyIHNldFwiIG9yIFwibm90IHN1cHBvcnRlZFwiXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0NhY2hlQXZhaWxhYmxlKHNlc3Npb25Pbmx5ID0gZmFsc2UpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gc2Vzc2lvbk9ubHkgPyB0aGlzLnNlc3Npb25TdG9yYWdlQXZhaWxhYmxlIDogdGhpcy5sb2NhbFN0b3JhZ2VBdmFpbGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhbiBpdGVtIGZyb20gY2FjaGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEl0ZW08VD4oa2V5OiBzdHJpbmcsIHNlc3Npb25Pbmx5ID0gZmFsc2UpOiBUIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSB0aGlzLmdldFN0b3JhZ2Uoc2Vzc2lvbk9ubHkpO1xyXG4gICAgICAgIGlmIChzdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxUPkpTT04ucGFyc2UocmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBhbGwga2V5cyBmcm9tIGNhY2hlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBrZXlzKHNlc3Npb25Pbmx5ID0gZmFsc2UpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgICAgICBsZXQgc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZShzZXNzaW9uT25seSk7XHJcblxyXG4gICAgICAgIGlmIChzdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdG9yYWdlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdG9yYWdlLmtleShpKSEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgY2FjaGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcsIHNlc3Npb25Pbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZShzZXNzaW9uT25seSk7XHJcblxyXG4gICAgICAgIGlmIChzdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcnNpc3RzIGFuIGl0ZW0gdG8gY2FjaGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBvYmplY3QsIHNlc3Npb25Pbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZShzZXNzaW9uT25seSk7XHJcbiAgICAgICAgaWYgKHN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqUmV0dXJucyB0aGUgbG9jYWwgb3Igc2Vzc2lvbiBzdG9yYWdlIHRvIHVzZSBmb3IgYmFja2luZyB0aGUgZ2l2ZW4gY2FjaGUgcmVxdWVzdC5cclxuICAgICAqIElmIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBzdG9yYWdlIHRoZSByZXN1bHQgd2lsbCBiZSBudWxsLlxyXG4gICAgICogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB1c2VyIGlzIGluIEZpcmVmb3ggZm9yIGV4YW1wbGUgd2l0aCB0aGUgc2V0dGluZyBkb20uc3RvcmFnZS5lbmFibGVkID0gZmFsc2VcclxuICAgICovXHJcbiAgICBwcml2YXRlIGdldFN0b3JhZ2Uoc2Vzc2lvbk9ubHk6IGJvb2xlYW4pIDogU3RvcmFnZSB8IG51bGwge1xyXG4gICAgICAgIGlmKHNlc3Npb25Pbmx5ICYmIHRoaXMuc2Vzc2lvblN0b3JhZ2VBdmFpbGFibGUpe1xyXG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlO1xyXG4gICAgICAgIH0gZWxzZSBpZih0aGlzLmxvY2FsU3RvcmFnZUF2YWlsYWJsZSl7XHJcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE86IGFkZCB1c2VyIGluZm8gdG8gaXNvbGF0ZSBjYWNoZSB2YWx1ZXMgZnJvbSBlYWNoIG90aGVyXHJcbn0iXX0=
@@ -0,0 +1,29 @@
1
+ import { Validators } from '@angular/forms';
2
+ import { JsonHelper } from '../shared/json-helper';
3
+ import { domainPattern } from './validation-patterns';
4
+ export class CustomValidators {
5
+ /**
6
+ * Tests the control using Angular's required validator, except returns
7
+ * an error map that triggers the plural 'are required' validation message
8
+ * instead of 'is required'
9
+ *
10
+ * @returns An error map with the `requiredPlural` property
11
+ * if the validation check fails, otherwise `null`.
12
+ */
13
+ static { this.requiredPlural = (control) => {
14
+ return Validators.required(control) !== null ? { requiredPlural: true } : null;
15
+ }; }
16
+ /**
17
+ * Returns a validation error if the control's value is not valid JSON.
18
+ */
19
+ static { this.json = (control) => {
20
+ return (control.value && JsonHelper.tryParseJSON(control.value) === undefined) ? { json: true } : null;
21
+ }; }
22
+ /**
23
+ * Returns a validation error if the control's value is not a valid domain.
24
+ */
25
+ static { this.domain = (control) => {
26
+ return (control.value && domainPattern.test(control.value) === false) ? { domain: true } : null;
27
+ }; }
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXZhbGlkYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29yZS9jdXN0b20tdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjs7Ozs7OztPQU9HO2FBQ1csbUJBQWMsR0FBZ0IsQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDdkUsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqRixDQUFDLENBQUE7SUFFRDs7T0FFRzthQUNXLFNBQUksR0FBZ0IsQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDN0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekcsQ0FBQyxDQUFBO0lBRUQ7O09BRUc7YUFDVyxXQUFNLEdBQWdCLENBQUMsT0FBd0IsRUFBRSxFQUFFO1FBQy9ELE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2xHLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBKc29uSGVscGVyIH0gZnJvbSAnLi4vc2hhcmVkL2pzb24taGVscGVyJztcclxuaW1wb3J0IHsgZG9tYWluUGF0dGVybiB9IGZyb20gJy4vdmFsaWRhdGlvbi1wYXR0ZXJucyc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tVmFsaWRhdG9ycyB7XHJcbiAgLyoqXHJcbiAgICogVGVzdHMgdGhlIGNvbnRyb2wgdXNpbmcgQW5ndWxhcidzIHJlcXVpcmVkIHZhbGlkYXRvciwgZXhjZXB0IHJldHVybnNcclxuICAgKiBhbiBlcnJvciBtYXAgdGhhdCB0cmlnZ2VycyB0aGUgcGx1cmFsICdhcmUgcmVxdWlyZWQnIHZhbGlkYXRpb24gbWVzc2FnZVxyXG4gICAqIGluc3RlYWQgb2YgJ2lzIHJlcXVpcmVkJ1xyXG4gICAqXHJcbiAgICogQHJldHVybnMgQW4gZXJyb3IgbWFwIHdpdGggdGhlIGByZXF1aXJlZFBsdXJhbGAgcHJvcGVydHlcclxuICAgKiBpZiB0aGUgdmFsaWRhdGlvbiBjaGVjayBmYWlscywgb3RoZXJ3aXNlIGBudWxsYC5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIHJlcXVpcmVkUGx1cmFsOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgIHJldHVybiBWYWxpZGF0b3JzLnJlcXVpcmVkKGNvbnRyb2wpICE9PSBudWxsID8geyByZXF1aXJlZFBsdXJhbDogdHJ1ZSB9IDogbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSB2YWxpZGF0aW9uIGVycm9yIGlmIHRoZSBjb250cm9sJ3MgdmFsdWUgaXMgbm90IHZhbGlkIEpTT04uXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBqc29uOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbC52YWx1ZSAmJiBKc29uSGVscGVyLnRyeVBhcnNlSlNPTihjb250cm9sLnZhbHVlKSA9PT0gdW5kZWZpbmVkKSA/IHsganNvbjogdHJ1ZSB9IDogbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSB2YWxpZGF0aW9uIGVycm9yIGlmIHRoZSBjb250cm9sJ3MgdmFsdWUgaXMgbm90IGEgdmFsaWQgZG9tYWluLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZG9tYWluOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbC52YWx1ZSAmJiBkb21haW5QYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSkgPT09IGZhbHNlKSA/IHsgZG9tYWluOiB0cnVlIH0gOiBudWxsO1xyXG4gIH1cclxufSJdfQ==
@@ -0,0 +1,220 @@
1
+ import moment from 'moment';
2
+ /**
3
+ * Helper class that provides common date constants and helpful date functions
4
+ */
5
+ export class DateTimeHelper {
6
+ ///////////////////////////////////////////////////////
7
+ // CONSTANTS
8
+ ///////////////////////////////////////////////////////
9
+ static { this.beginningOfTime = new Date(1899, 11, 31); }
10
+ /** 3000-01-01 */
11
+ static { this.endOfTime = new Date(3000, 0, 1); }
12
+ /** 3000-01-01 UTC */
13
+ static { this.endOfTimeUTC = moment.utc('3000-01-01').toDate(); }
14
+ /** Default effective date for new AccountMeter relationships: 2010-01-01 */
15
+ static { this.defaultAccountMeterEffectiveDate = new Date(2010, 0, 1); }
16
+ /** The default date that a newly created account becomes effective: 2010-01-01 */
17
+ static { this.defaultAccountServiceEffectiveDate = new Date(2010, 0, 1); }
18
+ /** Minimum date for all datepickers: 1980-01-01 */
19
+ static { this.minDatePickerDate = new Date(1980, 0, 1); }
20
+ /** Maximum date for all datepickers: 3000-01-01 11:59:59 PM to allow for local time offset working in for 3000-01-01 dates, which we store in the db to represent "end of time" */
21
+ static { this.maxDatePickerDate = new Date(3000, 0, 1, 23, 59, 59); }
22
+ /** Timestamp formats */
23
+ static { this.defaultDateFormat = "yyyy-MM-dd"; }
24
+ static { this.defaultTimeFormat = "HH:mm:ss"; }
25
+ static { this.defaultTimestampFormat = `${DateTimeHelper.defaultDateFormat} ${DateTimeHelper.defaultTimeFormat}`; }
26
+ /** List of valid bill import date formats
27
+ * Warning! Do not use these for actual formatting of dates
28
+ */
29
+ static { this.billImportFormatDateFormats = [
30
+ { label: "mm/dd/yyyy", value: "mm/dd/yyyy" }, { label: "Month dd yyyy", value: "Month dd yyyy" },
31
+ { label: "dd/mm/yyyy", value: "dd/mm/yyyy" }, { label: "dd Month yyyy", value: "dd Month yyyy" }, { label: "yyyymmdd", value: "yyyymmdd" }
32
+ ]; }
33
+ /**
34
+ * User input formats that we will parse into a date
35
+ * when the users date format preference has month before day
36
+ */
37
+ static { this.monthFirstParseFormats = [
38
+ "yyyy/MM/dd",
39
+ "MM/dd/yyyy",
40
+ "MMddyyyy",
41
+ "MM/dd/yy",
42
+ "MMddyy",
43
+ "MM/dd",
44
+ "yyyy.MM.dd",
45
+ "MM.dd.yyyy",
46
+ "MM.dd.yy",
47
+ "MM.dd",
48
+ "yyyy-MM-dd",
49
+ "MM-dd-yyyy",
50
+ "MM-dd-yy",
51
+ "MM-dd",
52
+ "yyyyMMdd"
53
+ ]; }
54
+ /**
55
+ * User input formats that we will parse into a date
56
+ * when the users date format preference has month before day.
57
+ * To be used with moment.js. Moment ignores non-alphanumeric characters
58
+ * so dates like 2020/09/10 will be parsed the same as 2020-09-10
59
+ */
60
+ static { this.momentMonthFirstParseFormats = [
61
+ 'M-D',
62
+ 'MM-DD',
63
+ 'M-D-YY',
64
+ 'MM-DD-YY',
65
+ 'MMDDYYYY',
66
+ 'YYYYMMDD',
67
+ 'YYYY-MM-DD',
68
+ 'MM-DD-YYYY'
69
+ ]; }
70
+ /**
71
+ * User input formats that we will parse into a date
72
+ * when the users date format preference has day before month
73
+ */
74
+ static { this.dateFirstParseFormats = [
75
+ "yyyy/dd/MM",
76
+ "dd/MM/yyyy",
77
+ "ddMMyyyy",
78
+ "dd/MM/yy",
79
+ "ddMMyy",
80
+ "dd/MM",
81
+ "yyyy.dd.MM",
82
+ "dd.MM.yyyy",
83
+ "dd.MM.yy",
84
+ "dd.MM",
85
+ "yyyy-dd-MM",
86
+ "dd-MM-yyyy",
87
+ "dd-MM-yy",
88
+ "dd-MM",
89
+ "yyyyDDmm"
90
+ ]; }
91
+ /**
92
+ * User input formats that we will parse into a date
93
+ * when the users date format preference has day before month.
94
+ * To be used with moment.js. Moment ignores non-alphanumeric characters
95
+ * so dates like 2020/09/10 will be parsed the same as 2020-09-10
96
+ */
97
+ static { this.momentDateFirstParseFormats = [
98
+ 'D-M',
99
+ 'DD-MM',
100
+ 'D-M-YY',
101
+ 'DD-MM-YY',
102
+ 'DDMMYYYY',
103
+ 'YYYYMMDD',
104
+ 'YYYY-MM-DD',
105
+ 'DD-MM-YYYY'
106
+ ]; }
107
+ /**
108
+ * Formats used to parse dates that are in the medium or long format by moment js.
109
+ * These are shared by date-first and month-first date formats. The date can't be
110
+ * parsed differently based on the date preference since the month is not numeric.
111
+ * This is not an exhaustive list of formats, but it should cover most common formats.
112
+ */
113
+ static { this.momentMedAndLongDateFormats = [
114
+ 'DD MMM YY',
115
+ 'DD MMM YYYY',
116
+ 'DD MMMM YYYY',
117
+ 'MMM D, YY',
118
+ 'MMM D, YYYY',
119
+ 'MMM DD, YYYY',
120
+ 'MMMM D, YYYY',
121
+ 'MMMM DD, YYYY'
122
+ ]; }
123
+ /**
124
+ * Format to display the time portion of a datetime
125
+ */
126
+ static { this.timeFormat = 'HH:mm:ss'; }
127
+ ///////////////////////////////////////////////////////
128
+ // METHODS
129
+ ///////////////////////////////////////////////////////
130
+ /**
131
+ * Return true if @see date is equal to the @see endOfTime
132
+ */
133
+ static isEndOfTime(date, timeZoneOffset = false) {
134
+ const endOfTime = timeZoneOffset ? this.endOfTimeUTC : this.endOfTime;
135
+ return this.isSameDay(date, endOfTime);
136
+ }
137
+ /**
138
+ * Compare two dates and return true if they represent the same year, month, and day (time is ignored).
139
+ */
140
+ static isSameDay(date1, date2) {
141
+ return moment(date1).isSame(moment(date2), 'day');
142
+ }
143
+ /**
144
+ * Get the parse formats based on the given date format. If no date format is
145
+ * given, or we don't recognize the format, return the month first parse formats.
146
+ *
147
+ */
148
+ static getParseFormats(dateFormat) {
149
+ let map = {
150
+ 'MM/DD/YYYY': this.monthFirstParseFormats,
151
+ 'MM-DD-YYYY': this.monthFirstParseFormats,
152
+ 'DD/MM/YYYY': this.dateFirstParseFormats,
153
+ 'DD-MM-YYYY': this.dateFirstParseFormats,
154
+ 'YYYY/MM/DD': this.monthFirstParseFormats,
155
+ 'YYYY-MM-DD': this.monthFirstParseFormats
156
+ };
157
+ return dateFormat ? map[dateFormat] : this.monthFirstParseFormats;
158
+ }
159
+ /**
160
+ * Get the moment parse formats based on the given date format. If no date format is
161
+ * given, or we don't recognize the format, return the month first parse formats.
162
+ */
163
+ static getMomentParseFormats(dateFormat) {
164
+ let map = {
165
+ 'MM/DD/YYYY': [...this.momentMonthFirstParseFormats, ...this.momentMedAndLongDateFormats],
166
+ 'MM-DD-YYYY': [...this.momentMonthFirstParseFormats, ...this.momentMedAndLongDateFormats],
167
+ 'DD/MM/YYYY': [...this.momentDateFirstParseFormats, ...this.momentMedAndLongDateFormats],
168
+ 'DD-MM-YYYY': [...this.momentDateFirstParseFormats, ...this.momentMedAndLongDateFormats],
169
+ 'YYYY/MM/DD': [...this.momentMonthFirstParseFormats, ...this.momentMedAndLongDateFormats],
170
+ 'YYYY-MM-DD': [...this.momentMonthFirstParseFormats, ...this.momentMedAndLongDateFormats]
171
+ };
172
+ return dateFormat ? map[dateFormat] : this.momentMonthFirstParseFormats;
173
+ }
174
+ /**
175
+ * Get relationship start date (favoring date in partialFormState if exists)
176
+ * * return default account-meter effective date if no start date found
177
+ *
178
+ */
179
+ static getAccountMeterStartDate(partialFormState, accountMeter) {
180
+ let startDate = partialFormState.effectiveFrom || accountMeter.startDate;
181
+ return startDate ? new Date(startDate) : DateTimeHelper.defaultAccountMeterEffectiveDate;
182
+ }
183
+ /**
184
+ * Get relationship end date (favoring date in partialFormState if exists)
185
+ * * return null if no stored date or end date is 1/1/3000
186
+ */
187
+ static getAccountMeterEndDate(partialFormState, accountMeter) {
188
+ let endDate = partialFormState.effectiveTo || accountMeter.endDate;
189
+ if (endDate && !DateTimeHelper.isEndOfTime(endDate)) {
190
+ return new Date(endDate);
191
+ }
192
+ return null;
193
+ }
194
+ static isDateBetween(date, startDate, endDate, includeStart, includeEnd) {
195
+ let inclusivity = '()';
196
+ if (includeStart && includeEnd) {
197
+ inclusivity = '[]';
198
+ }
199
+ else if (includeStart) {
200
+ inclusivity = '[)';
201
+ }
202
+ else if (includeEnd) {
203
+ inclusivity = '(]';
204
+ }
205
+ // If a start date is not provide, we'll use our beginning of time instead
206
+ startDate = startDate || this.beginningOfTime;
207
+ // If an end date is not provided, we'll use our end of time instead
208
+ endDate = endDate || this.endOfTime;
209
+ return moment(date).isBetween(startDate, endDate, 'day', inclusivity);
210
+ }
211
+ static stringToDate(dateString) {
212
+ if (dateString === null || dateString === undefined) {
213
+ return dateString;
214
+ }
215
+ else {
216
+ return moment(dateString).toDate();
217
+ }
218
+ }
219
+ }
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlL2RhdGUtdGltZS1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBSTVCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFFdkIsdURBQXVEO0lBQ3ZELFlBQVk7SUFDWix1REFBdUQ7YUFFekMsb0JBQWUsR0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTNELGlCQUFpQjthQUNILGNBQVMsR0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXJELHFCQUFxQjthQUNQLGlCQUFZLEdBQVMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUVyRSw0RUFBNEU7YUFDOUQscUNBQWdDLEdBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1RSxrRkFBa0Y7YUFDcEUsdUNBQWtDLEdBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU5RSxtREFBbUQ7YUFDckMsc0JBQWlCLEdBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU3RCxtTEFBbUw7YUFDckssc0JBQWlCLEdBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUVwRSx3QkFBd0I7YUFDVixzQkFBaUIsR0FBVyxZQUFZLENBQUM7YUFDekMsc0JBQWlCLEdBQVcsVUFB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QUFVLEtBQUssU0FBUyxFQUFFO1lBQ25ELE9BQU8sVUFBVSxDQUFDO1NBQ25CO2FBQU07WUFDTCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNwQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcblxyXG50eXBlIERhdGVGb3JtYXRNYXAgPSB7IFtmb3JtYXQ6IHN0cmluZ106IHN0cmluZ1tdIH07XHJcblxyXG4vKipcclxuICogSGVscGVyIGNsYXNzIHRoYXQgcHJvdmlkZXMgY29tbW9uIGRhdGUgY29uc3RhbnRzIGFuZCBoZWxwZnVsIGRhdGUgZnVuY3Rpb25zXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0ZVRpbWVIZWxwZXIge1xyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIENPTlNUQU5UU1xyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgYmVnaW5uaW5nT2ZUaW1lOiBEYXRlID0gbmV3IERhdGUoMTg5OSwxMSwzMSk7XHJcbiAgICAgXHJcbiAgICAvKiogMzAwMC0wMS0wMSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBlbmRPZlRpbWU6IERhdGUgPSBuZXcgRGF0ZSgzMDAwLCAwLCAxKTtcclxuXHJcbiAgICAvKiogMzAwMC0wMS0wMSBVVEMgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZW5kT2ZUaW1lVVRDOiBEYXRlID0gbW9tZW50LnV0YygnMzAwMC0wMS0wMScpLnRvRGF0ZSgpO1xyXG5cclxuICAgIC8qKiBEZWZhdWx0IGVmZmVjdGl2ZSBkYXRlIGZvciBuZXcgQWNjb3VudE1ldGVyIHJlbGF0aW9uc2hpcHM6IDIwMTAtMDEtMDEgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmYXVsdEFjY291bnRNZXRlckVmZmVjdGl2ZURhdGU6IERhdGUgPSBuZXcgRGF0ZSgyMDEwLCAwLCAxKTtcclxuXHJcbiAgICAvKiogVGhlIGRlZmF1bHQgZGF0ZSB0aGF0IGEgbmV3bHkgY3JlYXRlZCBhY2NvdW50IGJlY29tZXMgZWZmZWN0aXZlOiAyMDEwLTAxLTAxICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRBY2NvdW50U2VydmljZUVmZmVjdGl2ZURhdGU6IERhdGUgPSBuZXcgRGF0ZSgyMDEwLCAwLCAxKTtcclxuXHJcbiAgICAvKiogTWluaW11bSBkYXRlIGZvciBhbGwgZGF0ZXBpY2tlcnM6IDE5ODAtMDEtMDEgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbWluRGF0ZVBpY2tlckRhdGU6IERhdGUgPSBuZXcgRGF0ZSgxOTgwLCAwLCAxKTtcclxuXHJcbiAgICAvKiogTWF4aW11bSBkYXRlIGZvciBhbGwgZGF0ZXBpY2tlcnM6IDMwMDAtMDEtMDEgMTE6NTk6NTkgUE0gdG8gYWxsb3cgZm9yIGxvY2FsIHRpbWUgb2Zmc2V0IHdvcmtpbmcgaW4gZm9yIDMwMDAtMDEtMDEgZGF0ZXMsIHdoaWNoIHdlIHN0b3JlIGluIHRoZSBkYiB0byByZXByZXNlbnQgXCJlbmQgb2YgdGltZVwiICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG1heERhdGVQaWNrZXJEYXRlOiBEYXRlID0gbmV3IERhdGUoMzAwMCwwLDEsMjMsNTksNTkpO1xyXG5cclxuICAgIC8qKiBUaW1lc3RhbXAgZm9ybWF0cyAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0RGF0ZUZvcm1hdDogc3RyaW5nID0gXCJ5eXl5LU1NLWRkXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRUaW1lRm9ybWF0OiBzdHJpbmcgPSBcIkhIOm1tOnNzXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRUaW1lc3RhbXBGb3JtYXQ6IHN0cmluZyA9IGAke0RhdGVUaW1lSGVscGVyLmRlZmF1bHREYXRlRm9ybWF0fSAke0RhdGVUaW1lSGVscGVyLmRlZmF1bHRUaW1lRm9ybWF0fWA7XHJcblxyXG4gICAgLyoqIExpc3Qgb2YgdmFsaWQgYmlsbCBpbXBvcnQgZGF0ZSBmb3JtYXRzXHJcbiAgICAgKiAgV2FybmluZyEgRG8gbm90IHVzZSB0aGVzZSBmb3IgYWN0dWFsIGZvcm1hdHRpbmcgb2YgZGF0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBiaWxsSW1wb3J0Rm9ybWF0RGF0ZUZvcm1hdHMgPSBbXHJcbiAgICAgICAgeyBsYWJlbDogXCJtbS9kZC95eXl5XCIsIHZhbHVlOiBcIm1tL2RkL3l5eXlcIiB9LCB7IGxhYmVsOiBcIk1vbnRoIGRkIHl5eXlcIiwgdmFsdWU6IFwiTW9udGggZGQgeXl5eVwiIH0sIFxyXG4gICAgICAgIHsgbGFiZWw6IFwiZGQvbW0veXl5eVwiLCB2YWx1ZTogXCJkZC9tbS95eXl5XCIgfSwgeyBsYWJlbDogXCJkZCBNb250aCB5eXl5XCIsIHZhbHVlOiBcImRkIE1vbnRoIHl5eXlcIiB9LCB7IGxhYmVsOiBcInl5eXltbWRkXCIsIHZhbHVlOiBcInl5eXltbWRkXCIgfV07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VyIGlucHV0IGZvcm1hdHMgdGhhdCB3ZSB3aWxsIHBhcnNlIGludG8gYSBkYXRlXHJcbiAgICAgKiB3aGVuIHRoZSB1c2VycyBkYXRlIGZvcm1hdCBwcmVmZXJlbmNlIGhhcyBtb250aCBiZWZvcmUgZGF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbW9udGhGaXJzdFBhcnNlRm9ybWF0czogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgXCJ5eXl5L01NL2RkXCIsXHJcbiAgICAgICAgXCJNTS9kZC95eXl5XCIsXHJcbiAgICAgICAgXCJNTWRkeXl5eVwiLFxyXG4gICAgICAgIFwiTU0vZGQveXlcIixcclxuICAgICAgICBcIk1NZGR5eVwiLFxyXG4gICAgICAgIFwiTU0vZGRcIixcclxuICAgICAgICBcInl5eXkuTU0uZGRcIixcclxuICAgICAgICBcIk1NLmRkLnl5eXlcIixcclxuICAgICAgICBcIk1NLmRkLnl5XCIsXHJcbiAgICAgICAgXCJNTS5kZFwiLFxyXG4gICAgICAgIFwieXl5eS1NTS1kZFwiLFxyXG4gICAgICAgIFwiTU0tZGQteXl5eVwiLFxyXG4gICAgICAgIFwiTU0tZGQteXlcIixcclxuICAgICAgICBcIk1NLWRkXCIsXHJcbiAgICAgICAgXCJ5eXl5TU1kZFwiXHJcbiAgICBdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXNlciBpbnB1dCBmb3JtYXRzIHRoYXQgd2Ugd2lsbCBwYXJzZSBpbnRvIGEgZGF0ZVxyXG4gICAgICogd2hlbiB0aGUgdXNlcnMgZGF0ZSBmb3JtYXQgcHJlZmVyZW5jZSBoYXMgbW9udGggYmVmb3JlIGRheS5cclxuICAgICAqIFRvIGJlIHVzZWQgd2l0aCBtb21lbnQuanMuIE1vbWVudCBpZ25vcmVzIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xyXG4gICAgICogc28gZGF0ZXMgbGlrZSAyMDIwLzA5LzEwIHdpbGwgYmUgcGFyc2VkIHRoZSBzYW1lIGFzIDIwMjAtMDktMTBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBtb21lbnRNb250aEZpcnN0UGFyc2VGb3JtYXRzOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICAnTS1EJyxcclxuICAgICAgICAnTU0tREQnLFxyXG4gICAgICAgICdNLUQtWVknLFxyXG4gICAgICAgICdNTS1ERC1ZWScsXHJcbiAgICAgICAgJ01NRERZWVlZJyxcclxuICAgICAgICAnWVlZWU1NREQnLFxyXG4gICAgICAgICdZWVlZLU1NLUREJyxcclxuICAgICAgICAnTU0tREQtWVlZWSdcclxuICAgIF07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VyIGlucHV0IGZvcm1hdHMgdGhhdCB3ZSB3aWxsIHBhcnNlIGludG8gYSBkYXRlXHJcbiAgICAgKiB3aGVuIHRoZSB1c2VycyBkYXRlIGZvcm1hdCBwcmVmZXJlbmNlIGhhcyBkYXkgYmVmb3JlIG1vbnRoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGF0ZUZpcnN0UGFyc2VGb3JtYXRzOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICBcInl5eXkvZGQvTU1cIixcclxuICAgICAgICBcImRkL01NL3l5eXlcIixcclxuICAgICAgICBcImRkTU15eXl5XCIsXHJcbiAgICAgICAgXCJkZC9NTS95eVwiLFxyXG4gICAgICAgIFwiZGRNTXl5XCIsXHJcbiAgICAgICAgXCJkZC9NTVwiLFxyXG4gICAgICAgIFwieXl5eS5kZC5NTVwiLFxyXG4gICAgICAgIFwiZGQuTU0ueXl5eVwiLFxyXG4gICAgICAgIFwiZGQuTU0ueXlcIixcclxuICAgICAgICBcImRkLk1NXCIsXHJcbiAgICAgICAgXCJ5eXl5LWRkLU1NXCIsXHJcbiAgICAgICAgXCJkZC1NTS15eXl5XCIsXHJcbiAgICAgICAgXCJkZC1NTS15eVwiLFxyXG4gICAgICAgIFwiZGQtTU1cIixcclxuICAgICAgICBcInl5eXlERG1tXCJcclxuICAgIF07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VyIGlucHV0IGZvcm1hdHMgdGhhdCB3ZSB3aWxsIHBhcnNlIGludG8gYSBkYXRlXHJcbiAgICAgKiB3aGVuIHRoZSB1c2VycyBkYXRlIGZvcm1hdCBwcmVmZXJlbmNlIGhhcyBkYXkgYmVmb3JlIG1vbnRoLlxyXG4gICAgICogVG8gYmUgdXNlZCB3aXRoIG1vbWVudC5qcy4gTW9tZW50IGlnbm9yZXMgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXHJcbiAgICAgKiBzbyBkYXRlcyBsaWtlIDIwMjAvMDkvMTAgd2lsbCBiZSBwYXJzZWQgdGhlIHNhbWUgYXMgMjAyMC0wOS0xMFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG1vbWVudERhdGVGaXJzdFBhcnNlRm9ybWF0czogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgJ0QtTScsXHJcbiAgICAgICAgJ0RELU1NJyxcclxuICAgICAgICAnRC1NLVlZJyxcclxuICAgICAgICAnREQtTU0tWVknLFxyXG4gICAgICAgICdERE1NWVlZWScsXHJcbiAgICAgICAgJ1lZWVlNTUREJyxcclxuICAgICAgICAnWVlZWS1NTS1ERCcsXHJcbiAgICAgICAgJ0RELU1NLVlZWVknXHJcbiAgICBdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9ybWF0cyB1c2VkIHRvIHBhcnNlIGRhdGVzIHRoYXQgYXJlIGluIHRoZSBtZWRpdW0gb3IgbG9uZyBmb3JtYXQgYnkgbW9tZW50IGpzLlxyXG4gICAgICogVGhlc2UgYXJlIHNoYXJlZCBieSBkYXRlLWZpcnN0IGFuZCBtb250aC1maXJzdCBkYXRlIGZvcm1hdHMuIFRoZSBkYXRlIGNhbid0IGJlXHJcbiAgICAgKiBwYXJzZWQgZGlmZmVyZW50bHkgYmFzZWQgb24gdGhlIGRhdGUgcHJlZmVyZW5jZSBzaW5jZSB0aGUgbW9udGggaXMgbm90IG51bWVyaWMuXHJcbiAgICAgKiBUaGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3Qgb2YgZm9ybWF0cywgYnV0IGl0IHNob3VsZCBjb3ZlciBtb3N0IGNvbW1vbiBmb3JtYXRzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG1vbWVudE1lZEFuZExvbmdEYXRlRm9ybWF0czogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgJ0REIE1NTSBZWScsXHJcbiAgICAgICAgJ0REIE1NTSBZWVlZJyxcclxuICAgICAgICAnREQgTU1NTSBZWVlZJyxcclxuICAgICAgICAnTU1NIEQsIFlZJyxcclxuICAgICAgICAnTU1NIEQsIFlZWVknLFxyXG4gICAgICAgICdNTU0gREQsIFlZWVknLFxyXG4gICAgICAgICdNTU1NIEQsIFlZWVknLFxyXG4gICAgICAgICdNTU1NIERELCBZWVlZJ1xyXG4gICAgXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvcm1hdCB0byBkaXNwbGF5IHRoZSB0aW1lIHBvcnRpb24gb2YgYSBkYXRldGltZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHRpbWVGb3JtYXQ6IHN0cmluZyA9ICdISDptbTpzcyc7XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgLy8gTUVUSE9EU1xyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRydWUgaWYgQHNlZSBkYXRlIGlzIGVxdWFsIHRvIHRoZSBAc2VlIGVuZE9mVGltZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzRW5kT2ZUaW1lKGRhdGU6IERhdGUgfCBtb21lbnQuTW9tZW50IHwgc3RyaW5nLCB0aW1lWm9uZU9mZnNldDogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZW5kT2ZUaW1lID0gdGltZVpvbmVPZmZzZXQgPyB0aGlzLmVuZE9mVGltZVVUQyA6IHRoaXMuZW5kT2ZUaW1lO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZURheShkYXRlLCBlbmRPZlRpbWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXBhcmUgdHdvIGRhdGVzIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSB5ZWFyLCBtb250aCwgYW5kIGRheSAodGltZSBpcyBpZ25vcmVkKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpc1NhbWVEYXkoZGF0ZTE6IERhdGUgfCBtb21lbnQuTW9tZW50IHwgc3RyaW5nLCBkYXRlMjogRGF0ZSB8IG1vbWVudC5Nb21lbnQgfCBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUxKS5pc1NhbWUobW9tZW50KGRhdGUyKSwgJ2RheScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBwYXJzZSBmb3JtYXRzIGJhc2VkIG9uIHRoZSBnaXZlbiBkYXRlIGZvcm1hdC4gSWYgbm8gZGF0ZSBmb3JtYXQgaXNcclxuICAgICAqIGdpdmVuLCBvciB3ZSBkb24ndCByZWNvZ25pemUgdGhlIGZvcm1hdCwgcmV0dXJuIHRoZSBtb250aCBmaXJzdCBwYXJzZSBmb3JtYXRzLlxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGFyc2VGb3JtYXRzKGRhdGVGb3JtYXQ/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGxldCBtYXA6IERhdGVGb3JtYXRNYXAgPSB7XHJcbiAgICAgICAgICAgICdNTS9ERC9ZWVlZJzogdGhpcy5tb250aEZpcnN0UGFyc2VGb3JtYXRzLFxyXG4gICAgICAgICAgICAnTU0tREQtWVlZWSc6IHRoaXMubW9udGhGaXJzdFBhcnNlRm9ybWF0cyxcclxuICAgICAgICAgICAgJ0REL01NL1lZWVknOiB0aGlzLmRhdGVGaXJzdFBhcnNlRm9ybWF0cyxcclxuICAgICAgICAgICAgJ0RELU1NLVlZWVknOiB0aGlzLmRhdGVGaXJzdFBhcnNlRm9ybWF0cyxcclxuICAgICAgICAgICAgJ1lZWVkvTU0vREQnOiB0aGlzLm1vbnRoRmlyc3RQYXJzZUZvcm1hdHMsXHJcbiAgICAgICAgICAgICdZWVlZLU1NLUREJzogdGhpcy5tb250aEZpcnN0UGFyc2VGb3JtYXRzXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGVGb3JtYXQgPyBtYXBbZGF0ZUZvcm1hdF0gOiB0aGlzLm1vbnRoRmlyc3RQYXJzZUZvcm1hdHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1vbWVudCBwYXJzZSBmb3JtYXRzIGJhc2VkIG9uIHRoZSBnaXZlbiBkYXRlIGZvcm1hdC4gSWYgbm8gZGF0ZSBmb3JtYXQgaXNcclxuICAgICAqIGdpdmVuLCBvciB3ZSBkb24ndCByZWNvZ25pemUgdGhlIGZvcm1hdCwgcmV0dXJuIHRoZSBtb250aCBmaXJzdCBwYXJzZSBmb3JtYXRzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE1vbWVudFBhcnNlRm9ybWF0cyhkYXRlRm9ybWF0Pzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBsZXQgbWFwOiBEYXRlRm9ybWF0TWFwID0ge1xyXG4gICAgICAgICAgICAnTU0vREQvWVlZWSc6IFsuLi50aGlzLm1vbWVudE1vbnRoRmlyc3RQYXJzZUZvcm1hdHMsIC4uLnRoaXMubW9tZW50TWVkQW5kTG9uZ0RhdGVGb3JtYXRzXSxcclxuICAgICAgICAgICAgJ01NLURELVlZWVknOiBbLi4udGhpcy5tb21lbnRNb250aEZpcnN0UGFyc2VGb3JtYXRzLCAuLi50aGlzLm1vbWVudE1lZEFuZExvbmdEYXRlRm9ybWF0c10sXHJcbiAgICAgICAgICAgICdERC9NTS9ZWVlZJzogWy4uLnRoaXMubW9tZW50RGF0ZUZpcnN0UGFyc2VGb3JtYXRzLCAuLi50aGlzLm1vbWVudE1lZEFuZExvbmdEYXRlRm9ybWF0c10sXHJcbiAgICAgICAgICAgICdERC1NTS1ZWVlZJzogWy4uLnRoaXMubW9tZW50RGF0ZUZpcnN0UGFyc2VGb3JtYXRzLCAuLi50aGlzLm1vbWVudE1lZEFuZExvbmdEYXRlRm9ybWF0c10sXHJcbiAgICAgICAgICAgICdZWVlZL01NL0REJzogWy4uLnRoaXMubW9tZW50TW9udGhGaXJzdFBhcnNlRm9ybWF0cywgLi4udGhpcy5tb21lbnRNZWRBbmRMb25nRGF0ZUZvcm1hdHNdLFxyXG4gICAgICAgICAgICAnWVlZWS1NTS1ERCc6IFsuLi50aGlzLm1vbWVudE1vbnRoRmlyc3RQYXJzZUZvcm1hdHMsIC4uLnRoaXMubW9tZW50TWVkQW5kTG9uZ0RhdGVGb3JtYXRzXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRlRm9ybWF0ID8gbWFwW2RhdGVGb3JtYXRdIDogdGhpcy5tb21lbnRNb250aEZpcnN0UGFyc2VGb3JtYXRzO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgcmVsYXRpb25zaGlwIHN0YXJ0IGRhdGUgKGZhdm9yaW5nIGRhdGUgaW4gcGFydGlhbEZvcm1TdGF0ZSBpZiBleGlzdHMpXHJcbiAgICAgKiAqIHJldHVybiBkZWZhdWx0IGFjY291bnQtbWV0ZXIgZWZmZWN0aXZlIGRhdGUgaWYgbm8gc3RhcnQgZGF0ZSBmb3VuZFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWNjb3VudE1ldGVyU3RhcnREYXRlKHBhcnRpYWxGb3JtU3RhdGU6IGFueSwgYWNjb3VudE1ldGVyOiB7IHN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfSk6IERhdGUge1xyXG4gICAgICAgIGxldCBzdGFydERhdGUgPSBwYXJ0aWFsRm9ybVN0YXRlLmVmZmVjdGl2ZUZyb20gfHwgYWNjb3VudE1ldGVyLnN0YXJ0RGF0ZTtcclxuICAgICAgICByZXR1cm4gc3RhcnREYXRlID8gbmV3IERhdGUoc3RhcnREYXRlKSA6IERhdGVUaW1lSGVscGVyLmRlZmF1bHRBY2NvdW50TWV0ZXJFZmZlY3RpdmVEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgcmVsYXRpb25zaGlwIGVuZCBkYXRlIChmYXZvcmluZyBkYXRlIGluIHBhcnRpYWxGb3JtU3RhdGUgaWYgZXhpc3RzKVxyXG4gICAgICogKiByZXR1cm4gbnVsbCBpZiBubyBzdG9yZWQgZGF0ZSBvciBlbmQgZGF0ZSBpcyAxLzEvMzAwMFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEFjY291bnRNZXRlckVuZERhdGUocGFydGlhbEZvcm1TdGF0ZTogYW55LCBhY2NvdW50TWV0ZXI6IHsgZW5kRGF0ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfSk6IERhdGUgfCBudWxsIHtcclxuICAgICAgICBsZXQgZW5kRGF0ZSA9IHBhcnRpYWxGb3JtU3RhdGUuZWZmZWN0aXZlVG8gfHwgYWNjb3VudE1ldGVyLmVuZERhdGU7XHJcbiAgICAgICAgaWYgKGVuZERhdGUgJiYgIURhdGVUaW1lSGVscGVyLmlzRW5kT2ZUaW1lKGVuZERhdGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShlbmREYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBzdGF0aWMgaXNEYXRlQmV0d2VlbihcclxuICAgICAgICBkYXRlOiBEYXRlLCBcclxuICAgICAgICBzdGFydERhdGU/OiBEYXRlIHwgbnVsbCwgXHJcbiAgICAgICAgZW5kRGF0ZT86IERhdGUgfCBudWxsLCBcclxuICAgICAgICBpbmNsdWRlU3RhcnQ/OiBib29sZWFuLCBcclxuICAgICAgICBpbmNsdWRlRW5kPzogYm9vbGVhblxyXG4gICAgKTpib29sZWFuIHtcclxuICAgICAgICBsZXQgaW5jbHVzaXZpdHk6ICcoKScgfCAnWyknIHwgJyhdJyB8ICdbXScgPSAnKCknO1xyXG4gICAgICAgIGlmIChpbmNsdWRlU3RhcnQgJiYgaW5jbHVkZUVuZCApIHtcclxuICAgICAgICAgICAgaW5jbHVzaXZpdHkgPSAnW10nO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZVN0YXJ0KSB7XHJcbiAgICAgICAgICAgIGluY2x1c2l2aXR5ID0gJ1spJztcclxuICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVFbmQpIHtcclxuICAgICAgICAgICAgaW5jbHVzaXZpdHkgPSAnKF0nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgYSBzdGFydCBkYXRlIGlzIG5vdCBwcm92aWRlLCB3ZSdsbCB1c2Ugb3VyIGJlZ2lubmluZyBvZiB0aW1lIGluc3RlYWRcclxuICAgICAgICBzdGFydERhdGUgPSBzdGFydERhdGUgfHwgdGhpcy5iZWdpbm5pbmdPZlRpbWU7XHJcblxyXG4gICAgICAgIC8vIElmIGFuIGVuZCBkYXRlIGlzIG5vdCBwcm92aWRlZCwgd2UnbGwgdXNlIG91ciBlbmQgb2YgdGltZSBpbnN0ZWFkXHJcbiAgICAgICAgZW5kRGF0ZSA9IGVuZERhdGUgfHwgdGhpcy5lbmRPZlRpbWU7XHJcblxyXG4gICAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuaXNCZXR3ZWVuKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgJ2RheScsIGluY2x1c2l2aXR5KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0cmluZ1RvRGF0ZShkYXRlU3RyaW5nOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQge1xyXG4gICAgICBpZiAoZGF0ZVN0cmluZyA9PT0gbnVsbCB8fCBkYXRlU3RyaW5nID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gZGF0ZVN0cmluZztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGVTdHJpbmcpLnRvRGF0ZSgpO1xyXG4gICAgICB9ICAgICAgXHJcbiAgICB9XHJcbn0iXX0=