@spicainternational/ngx-sds-components 7.12.0-beta.1 → 8.0.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 (624) hide show
  1. package/README.md +13 -57
  2. package/{esm2020 → esm2022}/public-api.mjs +35 -34
  3. package/{esm2020 → esm2022}/spicainternational-ngx-sds-components.mjs +4 -4
  4. package/esm2022/src/lib/app-switcher/app-switcher.component.mjs +116 -0
  5. package/{esm2020 → esm2022}/src/lib/app-switcher/app-switcher.model.mjs +1 -1
  6. package/esm2022/src/lib/app-switcher/public-api.mjs +3 -0
  7. package/{esm2020 → esm2022}/src/lib/app-switcher/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +4 -4
  8. package/esm2022/src/lib/avatar/avatar-group.component.mjs +82 -0
  9. package/{esm2020 → esm2022}/src/lib/avatar/avatar-group.model.mjs +1 -1
  10. package/esm2022/src/lib/avatar/avatar.component.mjs +151 -0
  11. package/esm2022/src/lib/avatar/public-api.mjs +4 -0
  12. package/{esm2020 → esm2022}/src/lib/avatar/spicainternational-ngx-sds-components-src-lib-avatar.mjs +4 -4
  13. package/esm2022/src/lib/badge/badge.directive.mjs +90 -0
  14. package/{esm2020 → esm2022}/src/lib/badge/badge.types.mjs +1 -1
  15. package/esm2022/src/lib/badge/components/badge.component.mjs +59 -0
  16. package/{esm2020 → esm2022}/src/lib/badge/public-api.mjs +2 -3
  17. package/{esm2020 → esm2022}/src/lib/badge/spicainternational-ngx-sds-components-src-lib-badge.mjs +4 -4
  18. package/esm2022/src/lib/callout/callout.component.mjs +20 -0
  19. package/{esm2020 → esm2022}/src/lib/callout/public-api.mjs +2 -3
  20. package/{esm2020 → esm2022}/src/lib/callout/spicainternational-ngx-sds-components-src-lib-callout.mjs +4 -4
  21. package/esm2022/src/lib/color-picker/color-picker.component.mjs +82 -0
  22. package/{esm2020 → esm2022}/src/lib/color-picker/public-api.mjs +2 -3
  23. package/{esm2020 → esm2022}/src/lib/color-picker/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +4 -4
  24. package/esm2022/src/lib/date-picker/date-picker.component.mjs +863 -0
  25. package/esm2022/src/lib/date-picker/date-picker.model.mjs +71 -0
  26. package/esm2022/src/lib/date-picker/public-api.mjs +3 -0
  27. package/esm2022/src/lib/date-picker/sds-date-picker.service.mjs +90 -0
  28. package/{esm2020 → esm2022}/src/lib/date-picker/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +4 -4
  29. package/esm2022/src/lib/date-pipes/date-compare.pipe.mjs +32 -0
  30. package/esm2022/src/lib/date-pipes/date-format.pipe.mjs +31 -0
  31. package/esm2022/src/lib/date-pipes/date-period-format.pipe.mjs +49 -0
  32. package/{esm2020 → esm2022}/src/lib/date-pipes/date-time-formats.constants.mjs +155 -155
  33. package/esm2022/src/lib/date-pipes/date-time-range-duration.pipe.mjs +33 -0
  34. package/esm2022/src/lib/date-pipes/date-time-range-format.pipe.mjs +49 -0
  35. package/{esm2020 → esm2022}/src/lib/date-pipes/public-api.mjs +8 -8
  36. package/{esm2020 → esm2022}/src/lib/date-pipes/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs +4 -4
  37. package/esm2022/src/lib/drawer/drawer.component.mjs +103 -0
  38. package/{esm2020 → esm2022}/src/lib/drawer/public-api.mjs +2 -3
  39. package/{esm2020 → esm2022}/src/lib/drawer/spicainternational-ngx-sds-components-src-lib-drawer.mjs +4 -4
  40. package/esm2022/src/lib/duration-box/duration-box.component.mjs +279 -0
  41. package/{esm2020 → esm2022}/src/lib/duration-box/duration-box.types.mjs +1 -1
  42. package/esm2022/src/lib/duration-box/duration.service.mjs +72 -0
  43. package/{esm2020 → esm2022}/src/lib/duration-box/public-api.mjs +2 -3
  44. package/{esm2020 → esm2022}/src/lib/duration-box/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +4 -4
  45. package/esm2022/src/lib/duration-pipe/duration-format.pipe.mjs +27 -0
  46. package/{esm2020 → esm2022}/src/lib/duration-pipe/public-api.mjs +2 -3
  47. package/{esm2020 → esm2022}/src/lib/duration-pipe/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +4 -4
  48. package/esm2022/src/lib/ellipsis/directives/ellipsis.directive.mjs +52 -0
  49. package/{esm2020 → esm2022}/src/lib/ellipsis/public-api.mjs +2 -3
  50. package/{esm2020 → esm2022}/src/lib/ellipsis/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +4 -4
  51. package/esm2022/src/lib/expansion-panel/expansion-panel.component.mjs +86 -0
  52. package/{esm2020 → esm2022}/src/lib/expansion-panel/expansion-panel.types.mjs +1 -1
  53. package/{esm2020 → esm2022}/src/lib/expansion-panel/public-api.mjs +2 -3
  54. package/{esm2020 → esm2022}/src/lib/expansion-panel/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +4 -4
  55. package/esm2022/src/lib/highlight-text/directives/highlight-text.directive.mjs +61 -0
  56. package/{esm2020 → esm2022}/src/lib/highlight-text/directives/index.mjs +1 -1
  57. package/esm2022/src/lib/highlight-text/pipes/highlight-text.pipe.mjs +30 -0
  58. package/{esm2020 → esm2022}/src/lib/highlight-text/pipes/index.mjs +1 -1
  59. package/esm2022/src/lib/highlight-text/public-api.mjs +3 -0
  60. package/{esm2020 → esm2022}/src/lib/highlight-text/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs +4 -4
  61. package/esm2022/src/lib/highlight-text/utils/highlight-text.utils.mjs +97 -0
  62. package/{esm2020 → esm2022}/src/lib/highlight-text/utils/index.mjs +1 -1
  63. package/{esm2020 → esm2022}/src/lib/intersection/directives/index.mjs +1 -1
  64. package/esm2022/src/lib/intersection/directives/intersection.directive.mjs +52 -0
  65. package/esm2022/src/lib/intersection/public-api.mjs +3 -0
  66. package/{esm2020 → esm2022}/src/lib/intersection/services/index.mjs +1 -1
  67. package/{esm2020 → esm2022}/src/lib/intersection/services/intersection.service.mjs +54 -54
  68. package/{esm2020 → esm2022}/src/lib/intersection/spicainternational-ngx-sds-components-src-lib-intersection.mjs +4 -4
  69. package/{esm2020 → esm2022}/src/lib/keyboard-shortcut/directives/index.mjs +1 -1
  70. package/esm2022/src/lib/keyboard-shortcut/directives/keyboard-shortcut.directive.mjs +57 -0
  71. package/{esm2020 → esm2022}/src/lib/keyboard-shortcut/public-api.mjs +2 -3
  72. package/{esm2020 → esm2022}/src/lib/keyboard-shortcut/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +4 -4
  73. package/esm2022/src/lib/layout/default-layout/default-layout.component.mjs +15 -0
  74. package/esm2022/src/lib/layout/extra-large-layout/extra-large-layout.component.mjs +15 -0
  75. package/esm2022/src/lib/layout/fluid-layout/fluid-layout.component.mjs +15 -0
  76. package/esm2022/src/lib/layout/medium-layout/medium-layout.component.mjs +15 -0
  77. package/esm2022/src/lib/layout/public-api.mjs +6 -0
  78. package/esm2022/src/lib/layout/small-layout/small-layout.component.mjs +15 -0
  79. package/{esm2020 → esm2022}/src/lib/layout/spicainternational-ngx-sds-components-src-lib-layout.mjs +4 -4
  80. package/esm2022/src/lib/message/message.component.mjs +60 -0
  81. package/{esm2020 → esm2022}/src/lib/message/public-api.mjs +2 -3
  82. package/{esm2020 → esm2022}/src/lib/message/spicainternational-ngx-sds-components-src-lib-message.mjs +4 -4
  83. package/esm2022/src/lib/modal/dialog/dialog.component.mjs +187 -0
  84. package/{esm2020 → esm2022}/src/lib/modal/dialog/dialog.types.mjs +1 -1
  85. package/esm2022/src/lib/modal/modal.component.mjs +153 -0
  86. package/{esm2020 → esm2022}/src/lib/modal/modal.model.mjs +1 -1
  87. package/{esm2020 → esm2022}/src/lib/modal/public-api.mjs +3 -4
  88. package/{esm2020 → esm2022}/src/lib/modal/spicainternational-ngx-sds-components-src-lib-modal.mjs +4 -4
  89. package/esm2022/src/lib/navigation/models/navigation-models.mjs +2 -0
  90. package/esm2022/src/lib/navigation/navigation-collapsible-frame/navigation-collapsible-frame.component.mjs +17 -0
  91. package/esm2022/src/lib/navigation/navigation-container/navigation-container.component.mjs +61 -0
  92. package/esm2022/src/lib/navigation/navigation-external-link/navigation-external-link.component.mjs +38 -0
  93. package/esm2022/src/lib/navigation/navigation-group/navigation-group.component.mjs +110 -0
  94. package/esm2022/src/lib/navigation/navigation-header/navigation-header.component.mjs +21 -0
  95. package/esm2022/src/lib/navigation/navigation-route-link/navigation-route-link.component.mjs +38 -0
  96. package/esm2022/src/lib/navigation/navigation-separator/navigation-separator.component.mjs +15 -0
  97. package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-action-button/user-profile-action-button.component.mjs +30 -0
  98. package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.component.mjs +45 -0
  99. package/{esm2020 → esm2022}/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.types.mjs +1 -1
  100. package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-tile/user-profile-tile.component.mjs +25 -0
  101. package/{esm2020 → esm2022}/src/lib/navigation/navigation-user-profile/navigation-profile.model.mjs +1 -1
  102. package/esm2022/src/lib/navigation/navigation-user-profile/navigation-user-profile.component.mjs +107 -0
  103. package/esm2022/src/lib/navigation/product-home/product-home.component.mjs +71 -0
  104. package/esm2022/src/lib/navigation/public-api.mjs +14 -0
  105. package/{esm2020 → esm2022}/src/lib/navigation/spicainternational-ngx-sds-components-src-lib-navigation.mjs +4 -4
  106. package/esm2022/src/lib/navigation/utils/navigation.utils.mjs +48 -0
  107. package/esm2022/src/lib/number-box/number-box.component.mjs +138 -0
  108. package/{esm2020 → esm2022}/src/lib/number-box/public-api.mjs +2 -3
  109. package/{esm2020 → esm2022}/src/lib/number-box/spicainternational-ngx-sds-components-src-lib-number-box.mjs +4 -4
  110. package/esm2022/src/lib/page-header/page-header.component.mjs +25 -0
  111. package/{esm2020 → esm2022}/src/lib/page-header/public-api.mjs +2 -3
  112. package/{esm2020 → esm2022}/src/lib/page-header/spicainternational-ngx-sds-components-src-lib-page-header.mjs +4 -4
  113. package/esm2022/src/lib/pane/pane.component.mjs +43 -0
  114. package/{esm2020 → esm2022}/src/lib/pane/pane.model.mjs +1 -1
  115. package/{esm2020 → esm2022}/src/lib/pane/public-api.mjs +3 -4
  116. package/{esm2020 → esm2022}/src/lib/pane/spicainternational-ngx-sds-components-src-lib-pane.mjs +4 -4
  117. package/{esm2020 → esm2022}/src/lib/quick-info/public-api.mjs +2 -3
  118. package/esm2022/src/lib/quick-info/quick-info.component.mjs +121 -0
  119. package/{esm2020 → esm2022}/src/lib/quick-info/quick-info.model.mjs +1 -1
  120. package/{esm2020 → esm2022}/src/lib/quick-info/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +4 -4
  121. package/{esm2020 → esm2022}/src/lib/segmented-control/public-api.mjs +2 -3
  122. package/esm2022/src/lib/segmented-control/segmented-control.component.mjs +60 -0
  123. package/{esm2020 → esm2022}/src/lib/segmented-control/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +4 -4
  124. package/{esm2020 → esm2022}/src/lib/side-bar/public-api.mjs +2 -3
  125. package/esm2022/src/lib/side-bar/side-bar.component.mjs +39 -0
  126. package/{esm2020 → esm2022}/src/lib/side-bar/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +4 -4
  127. package/{esm2020 → esm2022}/src/lib/static-value/public-api.mjs +2 -3
  128. package/{esm2020 → esm2022}/src/lib/static-value/spicainternational-ngx-sds-components-src-lib-static-value.mjs +4 -4
  129. package/esm2022/src/lib/static-value/static-value.component.mjs +25 -0
  130. package/{esm2020 → esm2022}/src/lib/table-actions/public-api.mjs +2 -3
  131. package/{esm2020 → esm2022}/src/lib/table-actions/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +4 -4
  132. package/esm2022/src/lib/table-actions/table-actions.component.mjs +49 -0
  133. package/esm2022/src/lib/timeline/components/timeline.component.mjs +388 -0
  134. package/{esm2020 → esm2022}/src/lib/timeline/models/timeline.model.mjs +1 -1
  135. package/{esm2020 → esm2022}/src/lib/timeline/public-api.mjs +2 -3
  136. package/esm2022/src/lib/timeline/services/timeline.service.mjs +152 -0
  137. package/{esm2020 → esm2022}/src/lib/timeline/spicainternational-ngx-sds-components-src-lib-timeline.mjs +4 -4
  138. package/{esm2020 → esm2022}/src/lib/timeline/types/timeline.types.mjs +1 -1
  139. package/{esm2020 → esm2022}/src/lib/timer/public-api.mjs +3 -4
  140. package/{esm2020 → esm2022}/src/lib/timer/services/index.mjs +1 -1
  141. package/esm2022/src/lib/timer/services/timer.service.mjs +99 -0
  142. package/{esm2020 → esm2022}/src/lib/timer/spicainternational-ngx-sds-components-src-lib-timer.mjs +4 -4
  143. package/{esm2020 → esm2022}/src/lib/timer/utils/index.mjs +1 -1
  144. package/{esm2020 → esm2022}/src/lib/timer/utils/timer.utils.mjs +96 -96
  145. package/esm2022/src/lib/tooltip/components/tooltip.component.mjs +26 -0
  146. package/{esm2020 → esm2022}/src/lib/tooltip/public-api.mjs +2 -3
  147. package/{esm2020 → esm2022}/src/lib/tooltip/spicainternational-ngx-sds-components-src-lib-tooltip.mjs +4 -4
  148. package/esm2022/src/lib/tooltip/tooltip.directive.mjs +192 -0
  149. package/{esm2020 → esm2022}/src/lib/tooltip/tooltip.types.mjs +1 -1
  150. package/{esm2020 → esm2022}/src/lib/tooltip/utils/index.mjs +1 -1
  151. package/{esm2020 → esm2022}/src/lib/tooltip/utils/tooltip.utils.mjs +16 -16
  152. package/esm2022/src/lib/utils/date-time/date-time-format.function.mjs +15 -0
  153. package/esm2022/src/lib/utils/date-time/intl-date-time-format-options-presets.mjs +29 -0
  154. package/esm2022/src/lib/utils/date-time/public-api.mjs +3 -0
  155. package/esm2022/src/lib/utils/date-time/spicainternational-ngx-sds-components-src-lib-utils-date-time.mjs +5 -0
  156. package/esm2022/src/lib/utils/public-api.mjs +2 -0
  157. package/esm2022/src/lib/utils/spicainternational-ngx-sds-components-src-lib-utils.mjs +5 -0
  158. package/fesm2022/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +122 -0
  159. package/fesm2022/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +1 -0
  160. package/fesm2022/spicainternational-ngx-sds-components-src-lib-avatar.mjs +236 -0
  161. package/fesm2022/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +1 -0
  162. package/fesm2022/spicainternational-ngx-sds-components-src-lib-badge.mjs +153 -0
  163. package/fesm2022/spicainternational-ngx-sds-components-src-lib-badge.mjs.map +1 -0
  164. package/fesm2022/spicainternational-ngx-sds-components-src-lib-callout.mjs +27 -0
  165. package/fesm2022/spicainternational-ngx-sds-components-src-lib-callout.mjs.map +1 -0
  166. package/fesm2022/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +89 -0
  167. package/fesm2022/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +1 -0
  168. package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +1025 -0
  169. package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +1 -0
  170. package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs +330 -399
  171. package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs.map +1 -0
  172. package/{fesm2015 → fesm2022}/spicainternational-ngx-sds-components-src-lib-drawer.mjs +103 -118
  173. package/fesm2022/spicainternational-ngx-sds-components-src-lib-drawer.mjs.map +1 -0
  174. package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +354 -0
  175. package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-box.mjs.map +1 -0
  176. package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +34 -0
  177. package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs.map +1 -0
  178. package/fesm2022/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +59 -0
  179. package/fesm2022/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs.map +1 -0
  180. package/fesm2022/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +93 -0
  181. package/fesm2022/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs.map +1 -0
  182. package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs +178 -201
  183. package/fesm2022/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs.map +1 -0
  184. package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-intersection.mjs +99 -114
  185. package/fesm2022/spicainternational-ngx-sds-components-src-lib-intersection.mjs.map +1 -0
  186. package/fesm2022/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +64 -0
  187. package/fesm2022/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs.map +1 -0
  188. package/fesm2022/spicainternational-ngx-sds-components-src-lib-layout.mjs +70 -0
  189. package/fesm2022/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +1 -0
  190. package/fesm2022/spicainternational-ngx-sds-components-src-lib-message.mjs +67 -0
  191. package/fesm2022/spicainternational-ngx-sds-components-src-lib-message.mjs.map +1 -0
  192. package/fesm2022/spicainternational-ngx-sds-components-src-lib-modal.mjs +343 -0
  193. package/fesm2022/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +1 -0
  194. package/fesm2022/spicainternational-ngx-sds-components-src-lib-navigation.mjs +579 -0
  195. package/fesm2022/spicainternational-ngx-sds-components-src-lib-navigation.mjs.map +1 -0
  196. package/fesm2022/spicainternational-ngx-sds-components-src-lib-number-box.mjs +145 -0
  197. package/fesm2022/spicainternational-ngx-sds-components-src-lib-number-box.mjs.map +1 -0
  198. package/fesm2022/spicainternational-ngx-sds-components-src-lib-page-header.mjs +32 -0
  199. package/fesm2022/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +1 -0
  200. package/fesm2022/spicainternational-ngx-sds-components-src-lib-pane.mjs +50 -0
  201. package/fesm2022/spicainternational-ngx-sds-components-src-lib-pane.mjs.map +1 -0
  202. package/fesm2022/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +128 -0
  203. package/fesm2022/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +1 -0
  204. package/fesm2022/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +67 -0
  205. package/fesm2022/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +1 -0
  206. package/fesm2022/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +46 -0
  207. package/fesm2022/spicainternational-ngx-sds-components-src-lib-side-bar.mjs.map +1 -0
  208. package/fesm2022/spicainternational-ngx-sds-components-src-lib-static-value.mjs +32 -0
  209. package/fesm2022/spicainternational-ngx-sds-components-src-lib-static-value.mjs.map +1 -0
  210. package/fesm2022/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +56 -0
  211. package/fesm2022/spicainternational-ngx-sds-components-src-lib-table-actions.mjs.map +1 -0
  212. package/fesm2022/spicainternational-ngx-sds-components-src-lib-timeline.mjs +546 -0
  213. package/fesm2022/spicainternational-ngx-sds-components-src-lib-timeline.mjs.map +1 -0
  214. package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-timer.mjs +192 -223
  215. package/fesm2022/spicainternational-ngx-sds-components-src-lib-timer.mjs.map +1 -0
  216. package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-tooltip.mjs +228 -250
  217. package/fesm2022/spicainternational-ngx-sds-components-src-lib-tooltip.mjs.map +1 -0
  218. package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils-date-time.mjs +49 -0
  219. package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils-date-time.mjs.map +1 -0
  220. package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils.mjs +49 -0
  221. package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils.mjs.map +1 -0
  222. package/{fesm2015 → fesm2022}/spicainternational-ngx-sds-components.mjs +5 -4
  223. package/{fesm2015 → fesm2022}/spicainternational-ngx-sds-components.mjs.map +1 -1
  224. package/index.d.ts +5 -5
  225. package/package.json +120 -172
  226. package/public-api.d.ts +31 -30
  227. package/src/lib/app-switcher/app-switcher.component.d.ts +34 -34
  228. package/src/lib/app-switcher/app-switcher.model.d.ts +8 -8
  229. package/src/lib/app-switcher/index.d.ts +5 -5
  230. package/src/lib/app-switcher/public-api.d.ts +2 -3
  231. package/src/lib/avatar/avatar-group.component.d.ts +28 -28
  232. package/src/lib/avatar/avatar-group.model.d.ts +6 -6
  233. package/src/lib/avatar/avatar.component.d.ts +53 -55
  234. package/src/lib/avatar/index.d.ts +5 -5
  235. package/src/lib/avatar/public-api.d.ts +3 -4
  236. package/src/lib/badge/badge.directive.d.ts +23 -23
  237. package/src/lib/badge/badge.types.d.ts +2 -2
  238. package/src/lib/badge/components/badge.component.d.ts +23 -23
  239. package/src/lib/badge/index.d.ts +5 -5
  240. package/src/lib/badge/public-api.d.ts +1 -2
  241. package/src/lib/callout/callout.component.d.ts +10 -10
  242. package/src/lib/callout/index.d.ts +5 -5
  243. package/src/lib/callout/public-api.d.ts +1 -2
  244. package/src/lib/color-picker/color-picker.component.d.ts +27 -28
  245. package/src/lib/color-picker/index.d.ts +5 -5
  246. package/src/lib/color-picker/public-api.d.ts +1 -2
  247. package/src/lib/date-picker/date-picker.component.d.ts +149 -149
  248. package/src/lib/date-picker/date-picker.model.d.ts +34 -34
  249. package/src/lib/date-picker/index.d.ts +5 -5
  250. package/src/lib/date-picker/public-api.d.ts +2 -3
  251. package/src/lib/date-picker/sds-date-picker.service.d.ts +9 -9
  252. package/src/lib/date-pipes/date-compare.pipe.d.ts +7 -7
  253. package/src/lib/date-pipes/date-format.pipe.d.ts +19 -18
  254. package/src/lib/date-pipes/date-period-format.pipe.d.ts +11 -7
  255. package/src/lib/date-pipes/date-time-formats.constants.d.ts +22 -22
  256. package/src/lib/date-pipes/date-time-range-duration.pipe.d.ts +7 -7
  257. package/src/lib/date-pipes/date-time-range-format.pipe.d.ts +15 -15
  258. package/src/lib/date-pipes/index.d.ts +5 -5
  259. package/src/lib/date-pipes/public-api.d.ts +7 -7
  260. package/src/lib/drawer/drawer.component.d.ts +24 -24
  261. package/src/lib/drawer/index.d.ts +5 -5
  262. package/src/lib/drawer/public-api.d.ts +1 -2
  263. package/src/lib/duration-box/duration-box.component.d.ts +137 -137
  264. package/src/lib/duration-box/duration-box.types.d.ts +1 -1
  265. package/src/lib/duration-box/duration.service.d.ts +10 -10
  266. package/src/lib/duration-box/index.d.ts +5 -5
  267. package/src/lib/duration-box/public-api.d.ts +1 -2
  268. package/src/lib/duration-pipe/duration-format.pipe.d.ts +7 -7
  269. package/src/lib/duration-pipe/index.d.ts +5 -5
  270. package/src/lib/duration-pipe/public-api.d.ts +1 -2
  271. package/src/lib/ellipsis/directives/ellipsis.directive.d.ts +13 -13
  272. package/src/lib/ellipsis/index.d.ts +5 -5
  273. package/src/lib/ellipsis/public-api.d.ts +1 -2
  274. package/src/lib/expansion-panel/expansion-panel.component.d.ts +52 -52
  275. package/src/lib/expansion-panel/expansion-panel.types.d.ts +2 -2
  276. package/src/lib/expansion-panel/index.d.ts +5 -5
  277. package/src/lib/expansion-panel/public-api.d.ts +1 -2
  278. package/src/lib/highlight-text/directives/highlight-text.directive.d.ts +33 -33
  279. package/src/lib/highlight-text/directives/index.d.ts +1 -1
  280. package/src/lib/highlight-text/index.d.ts +5 -5
  281. package/src/lib/highlight-text/pipes/highlight-text.pipe.d.ts +11 -11
  282. package/src/lib/highlight-text/pipes/index.d.ts +1 -1
  283. package/src/lib/highlight-text/public-api.d.ts +2 -3
  284. package/src/lib/highlight-text/utils/highlight-text.utils.d.ts +23 -23
  285. package/src/lib/highlight-text/utils/index.d.ts +1 -1
  286. package/src/lib/intersection/directives/index.d.ts +1 -1
  287. package/src/lib/intersection/directives/intersection.directive.d.ts +24 -24
  288. package/src/lib/intersection/index.d.ts +5 -5
  289. package/src/lib/intersection/public-api.d.ts +2 -3
  290. package/src/lib/intersection/services/index.d.ts +1 -1
  291. package/src/lib/intersection/services/intersection.service.d.ts +19 -19
  292. package/src/lib/keyboard-shortcut/directives/index.d.ts +1 -1
  293. package/src/lib/keyboard-shortcut/directives/keyboard-shortcut.directive.d.ts +22 -22
  294. package/src/lib/keyboard-shortcut/index.d.ts +5 -5
  295. package/src/lib/keyboard-shortcut/public-api.d.ts +1 -2
  296. package/src/lib/layout/default-layout/default-layout.component.d.ts +8 -8
  297. package/src/lib/layout/extra-large-layout/extra-large-layout.component.d.ts +8 -8
  298. package/src/lib/layout/fluid-layout/fluid-layout.component.d.ts +8 -8
  299. package/src/lib/layout/index.d.ts +5 -5
  300. package/src/lib/layout/medium-layout/medium-layout.component.d.ts +8 -8
  301. package/src/lib/layout/public-api.d.ts +5 -6
  302. package/src/lib/layout/small-layout/small-layout.component.d.ts +8 -8
  303. package/src/lib/message/index.d.ts +5 -5
  304. package/src/lib/message/message.component.d.ts +24 -24
  305. package/src/lib/message/public-api.d.ts +1 -2
  306. package/src/lib/modal/dialog/dialog.component.d.ts +61 -61
  307. package/src/lib/modal/dialog/dialog.types.d.ts +1 -1
  308. package/src/lib/modal/index.d.ts +5 -5
  309. package/src/lib/modal/modal.component.d.ts +54 -54
  310. package/src/lib/modal/modal.model.d.ts +3 -3
  311. package/src/lib/modal/public-api.d.ts +2 -3
  312. package/src/lib/navigation/index.d.ts +5 -5
  313. package/src/lib/navigation/models/navigation-models.d.ts +4 -0
  314. package/src/lib/navigation/navigation-collapsible-frame/navigation-collapsible-frame.component.d.ts +7 -0
  315. package/src/lib/navigation/navigation-container/navigation-container.component.d.ts +26 -9
  316. package/src/lib/navigation/navigation-external-link/navigation-external-link.component.d.ts +17 -15
  317. package/src/lib/navigation/navigation-group/navigation-group.component.d.ts +44 -40
  318. package/src/lib/navigation/navigation-header/navigation-header.component.d.ts +11 -9
  319. package/src/lib/navigation/navigation-route-link/navigation-route-link.component.d.ts +19 -17
  320. package/src/lib/navigation/navigation-separator/navigation-separator.component.d.ts +10 -8
  321. package/src/lib/navigation/navigation-user-profile/components/user-profile-action-button/user-profile-action-button.component.d.ts +11 -11
  322. package/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.component.d.ts +17 -17
  323. package/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.types.d.ts +1 -1
  324. package/src/lib/navigation/navigation-user-profile/components/user-profile-tile/user-profile-tile.component.d.ts +9 -9
  325. package/src/lib/navigation/navigation-user-profile/navigation-profile.model.d.ts +6 -6
  326. package/src/lib/navigation/navigation-user-profile/navigation-user-profile.component.d.ts +34 -31
  327. package/src/lib/navigation/product-home/product-home.component.d.ts +32 -23
  328. package/src/lib/navigation/public-api.d.ts +13 -12
  329. package/src/lib/navigation/utils/navigation.utils.d.ts +2 -2
  330. package/src/lib/number-box/index.d.ts +5 -5
  331. package/src/lib/number-box/number-box.component.d.ts +83 -83
  332. package/src/lib/number-box/public-api.d.ts +1 -2
  333. package/src/lib/page-header/index.d.ts +5 -5
  334. package/src/lib/page-header/page-header.component.d.ts +11 -11
  335. package/src/lib/page-header/public-api.d.ts +1 -2
  336. package/src/lib/pane/index.d.ts +5 -5
  337. package/src/lib/pane/pane.component.d.ts +19 -19
  338. package/src/lib/pane/pane.model.d.ts +8 -8
  339. package/src/lib/pane/public-api.d.ts +2 -3
  340. package/src/lib/quick-info/index.d.ts +5 -5
  341. package/src/lib/quick-info/public-api.d.ts +1 -2
  342. package/src/lib/quick-info/quick-info.component.d.ts +43 -43
  343. package/src/lib/quick-info/quick-info.model.d.ts +9 -9
  344. package/src/lib/segmented-control/index.d.ts +5 -5
  345. package/src/lib/segmented-control/public-api.d.ts +1 -2
  346. package/src/lib/segmented-control/segmented-control.component.d.ts +21 -21
  347. package/src/lib/side-bar/index.d.ts +5 -5
  348. package/src/lib/side-bar/public-api.d.ts +1 -2
  349. package/src/lib/side-bar/side-bar.component.d.ts +24 -74
  350. package/src/lib/static-value/index.d.ts +5 -5
  351. package/src/lib/static-value/public-api.d.ts +1 -2
  352. package/src/lib/static-value/static-value.component.d.ts +12 -12
  353. package/src/lib/table-actions/index.d.ts +5 -5
  354. package/src/lib/table-actions/public-api.d.ts +1 -2
  355. package/src/lib/table-actions/table-actions.component.d.ts +16 -16
  356. package/src/lib/timeline/components/timeline.component.d.ts +206 -198
  357. package/src/lib/timeline/index.d.ts +5 -5
  358. package/src/lib/timeline/models/timeline.model.d.ts +38 -38
  359. package/src/lib/timeline/public-api.d.ts +1 -2
  360. package/src/lib/timeline/services/timeline.service.d.ts +24 -21
  361. package/src/lib/timeline/types/timeline.types.d.ts +2 -2
  362. package/src/lib/timer/index.d.ts +5 -5
  363. package/src/lib/timer/public-api.d.ts +2 -3
  364. package/src/lib/timer/services/index.d.ts +1 -1
  365. package/src/lib/timer/services/timer.service.d.ts +78 -78
  366. package/src/lib/timer/utils/index.d.ts +1 -1
  367. package/src/lib/timer/utils/timer.utils.d.ts +61 -61
  368. package/src/lib/tooltip/components/tooltip.component.d.ts +18 -18
  369. package/src/lib/tooltip/index.d.ts +5 -5
  370. package/src/lib/tooltip/public-api.d.ts +1 -2
  371. package/src/lib/tooltip/tooltip.directive.d.ts +36 -36
  372. package/src/lib/tooltip/tooltip.types.d.ts +2 -2
  373. package/src/lib/tooltip/utils/index.d.ts +1 -1
  374. package/src/lib/tooltip/utils/tooltip.utils.d.ts +5 -5
  375. package/src/lib/utils/date-time/date-time-format.function.d.ts +2 -0
  376. package/src/lib/utils/date-time/index.d.ts +5 -0
  377. package/src/lib/utils/date-time/intl-date-time-format-options-presets.d.ts +4 -0
  378. package/src/lib/utils/date-time/public-api.d.ts +2 -0
  379. package/src/lib/utils/index.d.ts +5 -0
  380. package/src/lib/utils/public-api.d.ts +1 -0
  381. package/esm2020/src/lib/app-switcher/app-switcher.component.mjs +0 -107
  382. package/esm2020/src/lib/app-switcher/app-switcher.module.mjs +0 -36
  383. package/esm2020/src/lib/app-switcher/public-api.mjs +0 -4
  384. package/esm2020/src/lib/avatar/avatar-group.component.mjs +0 -80
  385. package/esm2020/src/lib/avatar/avatar.component.mjs +0 -162
  386. package/esm2020/src/lib/avatar/avatar.module.mjs +0 -41
  387. package/esm2020/src/lib/avatar/public-api.mjs +0 -5
  388. package/esm2020/src/lib/badge/badge.directive.mjs +0 -89
  389. package/esm2020/src/lib/badge/badge.module.mjs +0 -27
  390. package/esm2020/src/lib/badge/components/badge.component.mjs +0 -59
  391. package/esm2020/src/lib/callout/callout.component.mjs +0 -20
  392. package/esm2020/src/lib/callout/callout.module.mjs +0 -25
  393. package/esm2020/src/lib/color-picker/color-picker.component.mjs +0 -76
  394. package/esm2020/src/lib/color-picker/color-picker.module.mjs +0 -33
  395. package/esm2020/src/lib/date-picker/date-picker.component.mjs +0 -841
  396. package/esm2020/src/lib/date-picker/date-picker.model.mjs +0 -71
  397. package/esm2020/src/lib/date-picker/date-picker.module.mjs +0 -68
  398. package/esm2020/src/lib/date-picker/public-api.mjs +0 -4
  399. package/esm2020/src/lib/date-picker/sds-date-picker.service.mjs +0 -90
  400. package/esm2020/src/lib/date-pipes/date-compare.pipe.mjs +0 -31
  401. package/esm2020/src/lib/date-pipes/date-format.pipe.mjs +0 -73
  402. package/esm2020/src/lib/date-pipes/date-period-format.pipe.mjs +0 -44
  403. package/esm2020/src/lib/date-pipes/date-pipes.module.mjs +0 -43
  404. package/esm2020/src/lib/date-pipes/date-time-range-duration.pipe.mjs +0 -31
  405. package/esm2020/src/lib/date-pipes/date-time-range-format.pipe.mjs +0 -48
  406. package/esm2020/src/lib/drawer/drawer.component.mjs +0 -103
  407. package/esm2020/src/lib/drawer/drawer.module.mjs +0 -18
  408. package/esm2020/src/lib/duration-box/duration-box.component.mjs +0 -261
  409. package/esm2020/src/lib/duration-box/duration-box.module.mjs +0 -44
  410. package/esm2020/src/lib/duration-box/duration.service.mjs +0 -72
  411. package/esm2020/src/lib/duration-pipe/duration-format.pipe.mjs +0 -26
  412. package/esm2020/src/lib/duration-pipe/duration-pipe.module.mjs +0 -18
  413. package/esm2020/src/lib/ellipsis/directives/ellipsis.directive.mjs +0 -51
  414. package/esm2020/src/lib/ellipsis/ellipsis.module.mjs +0 -24
  415. package/esm2020/src/lib/expansion-panel/expansion-panel.component.mjs +0 -86
  416. package/esm2020/src/lib/expansion-panel/expansion-panel.module.mjs +0 -25
  417. package/esm2020/src/lib/highlight-text/directives/highlight-text.directive.mjs +0 -60
  418. package/esm2020/src/lib/highlight-text/highlight-text.module.mjs +0 -29
  419. package/esm2020/src/lib/highlight-text/pipes/highlight-text.pipe.mjs +0 -29
  420. package/esm2020/src/lib/highlight-text/public-api.mjs +0 -4
  421. package/esm2020/src/lib/highlight-text/utils/highlight-text.utils.mjs +0 -97
  422. package/esm2020/src/lib/intersection/directives/intersection.directive.mjs +0 -51
  423. package/esm2020/src/lib/intersection/intersection.module.mjs +0 -20
  424. package/esm2020/src/lib/intersection/public-api.mjs +0 -4
  425. package/esm2020/src/lib/keyboard-shortcut/directives/keyboard-shortcut.directive.mjs +0 -56
  426. package/esm2020/src/lib/keyboard-shortcut/keyboard-shortcut.module.mjs +0 -24
  427. package/esm2020/src/lib/layout/default-layout/default-layout.component.mjs +0 -15
  428. package/esm2020/src/lib/layout/extra-large-layout/extra-large-layout.component.mjs +0 -15
  429. package/esm2020/src/lib/layout/fluid-layout/fluid-layout.component.mjs +0 -15
  430. package/esm2020/src/lib/layout/layout.module.mjs +0 -47
  431. package/esm2020/src/lib/layout/medium-layout/medium-layout.component.mjs +0 -15
  432. package/esm2020/src/lib/layout/public-api.mjs +0 -7
  433. package/esm2020/src/lib/layout/small-layout/small-layout.component.mjs +0 -15
  434. package/esm2020/src/lib/message/message.component.mjs +0 -60
  435. package/esm2020/src/lib/message/message.module.mjs +0 -28
  436. package/esm2020/src/lib/modal/dialog/dialog.component.mjs +0 -187
  437. package/esm2020/src/lib/modal/modal.component.mjs +0 -147
  438. package/esm2020/src/lib/modal/modal.module.mjs +0 -43
  439. package/esm2020/src/lib/navigation/navigation-container/navigation-container.component.mjs +0 -17
  440. package/esm2020/src/lib/navigation/navigation-external-link/navigation-external-link.component.mjs +0 -37
  441. package/esm2020/src/lib/navigation/navigation-group/navigation-group.component.mjs +0 -100
  442. package/esm2020/src/lib/navigation/navigation-header/navigation-header.component.mjs +0 -17
  443. package/esm2020/src/lib/navigation/navigation-route-link/navigation-route-link.component.mjs +0 -33
  444. package/esm2020/src/lib/navigation/navigation-separator/navigation-separator.component.mjs +0 -14
  445. package/esm2020/src/lib/navigation/navigation-user-profile/components/user-profile-action-button/user-profile-action-button.component.mjs +0 -26
  446. package/esm2020/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.component.mjs +0 -40
  447. package/esm2020/src/lib/navigation/navigation-user-profile/components/user-profile-tile/user-profile-tile.component.mjs +0 -23
  448. package/esm2020/src/lib/navigation/navigation-user-profile/navigation-user-profile.component.mjs +0 -99
  449. package/esm2020/src/lib/navigation/navigation.module.mjs +0 -107
  450. package/esm2020/src/lib/navigation/pipes/navigation-route-active.pipe.mjs +0 -30
  451. package/esm2020/src/lib/navigation/product-home/product-home.component.mjs +0 -54
  452. package/esm2020/src/lib/navigation/public-api.mjs +0 -13
  453. package/esm2020/src/lib/navigation/utils/navigation.utils.mjs +0 -48
  454. package/esm2020/src/lib/number-box/number-box.component.mjs +0 -138
  455. package/esm2020/src/lib/number-box/number-box.module.mjs +0 -28
  456. package/esm2020/src/lib/page-header/page-header.component.mjs +0 -25
  457. package/esm2020/src/lib/page-header/page-header.module.mjs +0 -19
  458. package/esm2020/src/lib/pane/pane.component.mjs +0 -43
  459. package/esm2020/src/lib/pane/pane.module.mjs +0 -28
  460. package/esm2020/src/lib/quick-info/quick-info.component.mjs +0 -116
  461. package/esm2020/src/lib/quick-info/quick-info.module.mjs +0 -33
  462. package/esm2020/src/lib/segmented-control/segmented-control.component.mjs +0 -55
  463. package/esm2020/src/lib/segmented-control/segmented-control.module.mjs +0 -29
  464. package/esm2020/src/lib/side-bar/side-bar.component.mjs +0 -109
  465. package/esm2020/src/lib/side-bar/side-bar.module.mjs +0 -28
  466. package/esm2020/src/lib/static-value/static-value.component.mjs +0 -25
  467. package/esm2020/src/lib/static-value/static-value.module.mjs +0 -28
  468. package/esm2020/src/lib/table-actions/table-actions.component.mjs +0 -42
  469. package/esm2020/src/lib/table-actions/table-actions.module.mjs +0 -32
  470. package/esm2020/src/lib/timeline/components/timeline.component.mjs +0 -364
  471. package/esm2020/src/lib/timeline/services/timeline.service.mjs +0 -120
  472. package/esm2020/src/lib/timeline/timeline.module.mjs +0 -24
  473. package/esm2020/src/lib/timer/services/timer.service.mjs +0 -99
  474. package/esm2020/src/lib/timer/timer.module.mjs +0 -34
  475. package/esm2020/src/lib/tooltip/components/tooltip.component.mjs +0 -22
  476. package/esm2020/src/lib/tooltip/tooltip.directive.mjs +0 -191
  477. package/esm2020/src/lib/tooltip/tooltip.module.mjs +0 -31
  478. package/fesm2015/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +0 -150
  479. package/fesm2015/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +0 -1
  480. package/fesm2015/spicainternational-ngx-sds-components-src-lib-avatar.mjs +0 -284
  481. package/fesm2015/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +0 -1
  482. package/fesm2015/spicainternational-ngx-sds-components-src-lib-badge.mjs +0 -175
  483. package/fesm2015/spicainternational-ngx-sds-components-src-lib-badge.mjs.map +0 -1
  484. package/fesm2015/spicainternational-ngx-sds-components-src-lib-callout.mjs +0 -49
  485. package/fesm2015/spicainternational-ngx-sds-components-src-lib-callout.mjs.map +0 -1
  486. package/fesm2015/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +0 -113
  487. package/fesm2015/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +0 -1
  488. package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +0 -1071
  489. package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +0 -1
  490. package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs +0 -411
  491. package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs.map +0 -1
  492. package/fesm2015/spicainternational-ngx-sds-components-src-lib-drawer.mjs.map +0 -1
  493. package/fesm2015/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +0 -379
  494. package/fesm2015/spicainternational-ngx-sds-components-src-lib-duration-box.mjs.map +0 -1
  495. package/fesm2015/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +0 -48
  496. package/fesm2015/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs.map +0 -1
  497. package/fesm2015/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +0 -80
  498. package/fesm2015/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs.map +0 -1
  499. package/fesm2015/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +0 -115
  500. package/fesm2015/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs.map +0 -1
  501. package/fesm2015/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs +0 -215
  502. package/fesm2015/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs.map +0 -1
  503. package/fesm2015/spicainternational-ngx-sds-components-src-lib-intersection.mjs +0 -127
  504. package/fesm2015/spicainternational-ngx-sds-components-src-lib-intersection.mjs.map +0 -1
  505. package/fesm2015/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +0 -85
  506. package/fesm2015/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs.map +0 -1
  507. package/fesm2015/spicainternational-ngx-sds-components-src-lib-layout.mjs +0 -110
  508. package/fesm2015/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +0 -1
  509. package/fesm2015/spicainternational-ngx-sds-components-src-lib-message.mjs +0 -92
  510. package/fesm2015/spicainternational-ngx-sds-components-src-lib-message.mjs.map +0 -1
  511. package/fesm2015/spicainternational-ngx-sds-components-src-lib-modal.mjs +0 -378
  512. package/fesm2015/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +0 -1
  513. package/fesm2015/spicainternational-ngx-sds-components-src-lib-navigation.mjs +0 -595
  514. package/fesm2015/spicainternational-ngx-sds-components-src-lib-navigation.mjs.map +0 -1
  515. package/fesm2015/spicainternational-ngx-sds-components-src-lib-number-box.mjs +0 -170
  516. package/fesm2015/spicainternational-ngx-sds-components-src-lib-number-box.mjs.map +0 -1
  517. package/fesm2015/spicainternational-ngx-sds-components-src-lib-page-header.mjs +0 -48
  518. package/fesm2015/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +0 -1
  519. package/fesm2015/spicainternational-ngx-sds-components-src-lib-pane.mjs +0 -75
  520. package/fesm2015/spicainternational-ngx-sds-components-src-lib-pane.mjs.map +0 -1
  521. package/fesm2015/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +0 -155
  522. package/fesm2015/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +0 -1
  523. package/fesm2015/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +0 -88
  524. package/fesm2015/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +0 -1
  525. package/fesm2015/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +0 -141
  526. package/fesm2015/spicainternational-ngx-sds-components-src-lib-side-bar.mjs.map +0 -1
  527. package/fesm2015/spicainternational-ngx-sds-components-src-lib-static-value.mjs +0 -57
  528. package/fesm2015/spicainternational-ngx-sds-components-src-lib-static-value.mjs.map +0 -1
  529. package/fesm2015/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +0 -78
  530. package/fesm2015/spicainternational-ngx-sds-components-src-lib-table-actions.mjs.map +0 -1
  531. package/fesm2015/spicainternational-ngx-sds-components-src-lib-timeline.mjs +0 -515
  532. package/fesm2015/spicainternational-ngx-sds-components-src-lib-timeline.mjs.map +0 -1
  533. package/fesm2015/spicainternational-ngx-sds-components-src-lib-timer.mjs +0 -235
  534. package/fesm2015/spicainternational-ngx-sds-components-src-lib-timer.mjs.map +0 -1
  535. package/fesm2015/spicainternational-ngx-sds-components-src-lib-tooltip.mjs +0 -260
  536. package/fesm2015/spicainternational-ngx-sds-components-src-lib-tooltip.mjs.map +0 -1
  537. package/fesm2020/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +0 -146
  538. package/fesm2020/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +0 -1
  539. package/fesm2020/spicainternational-ngx-sds-components-src-lib-avatar.mjs +0 -282
  540. package/fesm2020/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +0 -1
  541. package/fesm2020/spicainternational-ngx-sds-components-src-lib-badge.mjs +0 -175
  542. package/fesm2020/spicainternational-ngx-sds-components-src-lib-badge.mjs.map +0 -1
  543. package/fesm2020/spicainternational-ngx-sds-components-src-lib-callout.mjs +0 -49
  544. package/fesm2020/spicainternational-ngx-sds-components-src-lib-callout.mjs.map +0 -1
  545. package/fesm2020/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +0 -113
  546. package/fesm2020/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +0 -1
  547. package/fesm2020/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +0 -1064
  548. package/fesm2020/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +0 -1
  549. package/fesm2020/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs.map +0 -1
  550. package/fesm2020/spicainternational-ngx-sds-components-src-lib-drawer.mjs +0 -125
  551. package/fesm2020/spicainternational-ngx-sds-components-src-lib-drawer.mjs.map +0 -1
  552. package/fesm2020/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +0 -377
  553. package/fesm2020/spicainternational-ngx-sds-components-src-lib-duration-box.mjs.map +0 -1
  554. package/fesm2020/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +0 -48
  555. package/fesm2020/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs.map +0 -1
  556. package/fesm2020/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +0 -79
  557. package/fesm2020/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs.map +0 -1
  558. package/fesm2020/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +0 -115
  559. package/fesm2020/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs.map +0 -1
  560. package/fesm2020/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs.map +0 -1
  561. package/fesm2020/spicainternational-ngx-sds-components-src-lib-intersection.mjs.map +0 -1
  562. package/fesm2020/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +0 -83
  563. package/fesm2020/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs.map +0 -1
  564. package/fesm2020/spicainternational-ngx-sds-components-src-lib-layout.mjs +0 -110
  565. package/fesm2020/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +0 -1
  566. package/fesm2020/spicainternational-ngx-sds-components-src-lib-message.mjs +0 -92
  567. package/fesm2020/spicainternational-ngx-sds-components-src-lib-message.mjs.map +0 -1
  568. package/fesm2020/spicainternational-ngx-sds-components-src-lib-modal.mjs +0 -376
  569. package/fesm2020/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +0 -1
  570. package/fesm2020/spicainternational-ngx-sds-components-src-lib-navigation.mjs +0 -595
  571. package/fesm2020/spicainternational-ngx-sds-components-src-lib-navigation.mjs.map +0 -1
  572. package/fesm2020/spicainternational-ngx-sds-components-src-lib-number-box.mjs +0 -170
  573. package/fesm2020/spicainternational-ngx-sds-components-src-lib-number-box.mjs.map +0 -1
  574. package/fesm2020/spicainternational-ngx-sds-components-src-lib-page-header.mjs +0 -48
  575. package/fesm2020/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +0 -1
  576. package/fesm2020/spicainternational-ngx-sds-components-src-lib-pane.mjs +0 -75
  577. package/fesm2020/spicainternational-ngx-sds-components-src-lib-pane.mjs.map +0 -1
  578. package/fesm2020/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +0 -153
  579. package/fesm2020/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +0 -1
  580. package/fesm2020/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +0 -88
  581. package/fesm2020/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +0 -1
  582. package/fesm2020/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +0 -141
  583. package/fesm2020/spicainternational-ngx-sds-components-src-lib-side-bar.mjs.map +0 -1
  584. package/fesm2020/spicainternational-ngx-sds-components-src-lib-static-value.mjs +0 -57
  585. package/fesm2020/spicainternational-ngx-sds-components-src-lib-static-value.mjs.map +0 -1
  586. package/fesm2020/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +0 -78
  587. package/fesm2020/spicainternational-ngx-sds-components-src-lib-table-actions.mjs.map +0 -1
  588. package/fesm2020/spicainternational-ngx-sds-components-src-lib-timeline.mjs +0 -511
  589. package/fesm2020/spicainternational-ngx-sds-components-src-lib-timeline.mjs.map +0 -1
  590. package/fesm2020/spicainternational-ngx-sds-components-src-lib-timer.mjs.map +0 -1
  591. package/fesm2020/spicainternational-ngx-sds-components-src-lib-tooltip.mjs.map +0 -1
  592. package/fesm2020/spicainternational-ngx-sds-components.mjs +0 -39
  593. package/fesm2020/spicainternational-ngx-sds-components.mjs.map +0 -1
  594. package/src/lib/app-switcher/app-switcher.module.d.ts +0 -11
  595. package/src/lib/avatar/avatar.module.d.ts +0 -11
  596. package/src/lib/badge/badge.module.d.ts +0 -9
  597. package/src/lib/callout/callout.module.d.ts +0 -8
  598. package/src/lib/color-picker/color-picker.module.d.ts +0 -10
  599. package/src/lib/date-picker/date-picker.module.d.ts +0 -12
  600. package/src/lib/date-pipes/date-pipes.module.d.ts +0 -12
  601. package/src/lib/drawer/drawer.module.d.ts +0 -8
  602. package/src/lib/duration-box/duration-box.module.d.ts +0 -10
  603. package/src/lib/duration-pipe/duration-pipe.module.d.ts +0 -8
  604. package/src/lib/ellipsis/ellipsis.module.d.ts +0 -8
  605. package/src/lib/expansion-panel/expansion-panel.module.d.ts +0 -15
  606. package/src/lib/highlight-text/highlight-text.module.d.ts +0 -9
  607. package/src/lib/intersection/intersection.module.d.ts +0 -8
  608. package/src/lib/keyboard-shortcut/keyboard-shortcut.module.d.ts +0 -8
  609. package/src/lib/layout/layout.module.d.ts +0 -13
  610. package/src/lib/message/message.module.d.ts +0 -9
  611. package/src/lib/modal/modal.module.d.ts +0 -12
  612. package/src/lib/navigation/navigation.module.d.ts +0 -28
  613. package/src/lib/navigation/pipes/navigation-route-active.pipe.d.ts +0 -7
  614. package/src/lib/number-box/number-box.module.d.ts +0 -9
  615. package/src/lib/page-header/page-header.module.d.ts +0 -8
  616. package/src/lib/pane/pane.module.d.ts +0 -9
  617. package/src/lib/quick-info/quick-info.module.d.ts +0 -10
  618. package/src/lib/segmented-control/segmented-control.module.d.ts +0 -9
  619. package/src/lib/side-bar/side-bar.module.d.ts +0 -9
  620. package/src/lib/static-value/static-value.module.d.ts +0 -9
  621. package/src/lib/table-actions/table-actions.module.d.ts +0 -10
  622. package/src/lib/timeline/timeline.module.d.ts +0 -8
  623. package/src/lib/timer/timer.module.d.ts +0 -10
  624. package/src/lib/tooltip/tooltip.module.d.ts +0 -10
@@ -1,841 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
- import { locale } from "devextreme/localization";
3
- import { isSameDay, isSameYear, isSameMonth, startOfDay, startOfMonth, endOfMonth, isAfter, isBefore, add, } from 'date-fns';
4
- import { faAngleLeft, faAngleRight, faCalendar, faLock } from '@fortawesome/pro-regular-svg-icons';
5
- import { faArrowRight } from '@fortawesome/pro-light-svg-icons';
6
- import { PeriodPickerDateRange, } from './date-picker.model';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "./sds-date-picker.service";
9
- import * as i2 from "@angular/cdk/a11y";
10
- import * as i3 from "@angular/common";
11
- import * as i4 from "@fortawesome/angular-fontawesome";
12
- import * as i5 from "devextreme-angular";
13
- import * as i6 from "devextreme-angular/ui/nested";
14
- import * as i7 from "devextreme-angular/core";
15
- import * as i8 from "@spicainternational/ngx-sds-components/src/lib/date-pipes";
16
- // import { faLock } from '@fortawesome/pro-solid-svg-icons';
17
- export class SdsDatePickerComponent {
18
- // public methods
19
- constructor(changeRef, datePickerService) {
20
- this.changeRef = changeRef;
21
- this.datePickerService = datePickerService;
22
- this.displayContent = undefined;
23
- // public interface
24
- this.selectionKind = 'period';
25
- this.dateRangeDefinitions = [];
26
- // single date selector
27
- this.selectedDate = new Date();
28
- this.selectedDateChange = new EventEmitter();
29
- this.selectedDateStartChange = new EventEmitter();
30
- // format function for displaying date when single date is selected
31
- this.singleDayFormatFn = undefined;
32
- // format function for displaying each date when date range is selected
33
- this.dateRangeFormatFn = undefined;
34
- this.selectedDateEndChange = new EventEmitter();
35
- this.periodChange = new EventEmitter();
36
- this.disabled = false;
37
- this.validationError = '';
38
- this.isValid = true;
39
- this.disabledDates = [];
40
- this.applyText = 'close';
41
- this.cancelText = 'close';
42
- this.firstDayOfWeek = 1;
43
- this.dateRangeDefinitionsWidth = '11rem';
44
- this.showPreviousAndNextButtons = true;
45
- this.width = '30rem';
46
- this.dropdownWrapperClass = '';
47
- this.dropdownWrapperId = '';
48
- this.getPreviousDateCallback = this.getPreviousDay;
49
- this.getNextDateCallback = this.getNextDay;
50
- this.getPreviousRangeCallback = this.getPreviousRange;
51
- this.getNextRangeCallback = this.getNextRange;
52
- this.useCustomDisplayContent = false;
53
- this.displayPredefinedDateRangeName = false;
54
- this.style = 'classic';
55
- this.compactStyleDisplay = 'predefinedRange';
56
- this.dateInputDisplayFormat = 'shortDate';
57
- // #region Aria inputs
58
- /**
59
- * @description
60
- * Component aria-label. Defaults to 'Date picker'
61
- */
62
- this.componentAriaLabel = 'Date picker';
63
- /**
64
- * @description
65
- * Predefined date range definitions dropdown button aria-label. Defaults to 'Open predefined date ranges pane'
66
- */
67
- this.openDateRangeDefinitionsAriaLabel = 'Open predefined date ranges pane';
68
- /**
69
- * @description
70
- * Next period button aria-label. Default to 'Next period'
71
- */
72
- this.nextPeriodAriaLabel = 'Next period';
73
- /**
74
- * @description
75
- * Previous period button aria-label. Defaults to 'Previous period'
76
- */
77
- this.previousPeriodAriaLabel = 'Previous period';
78
- // public properties
79
- this.previousPeriodIcon = faAngleLeft;
80
- this.nextPeriodIcon = faAngleRight;
81
- this.calendarIcon = faCalendar;
82
- this.toIcon = faArrowRight;
83
- this.lockIcon = faLock;
84
- this.predefinedDateRanges = [];
85
- this.predefinedDateRangesGeneratedDate = undefined;
86
- this.dateRanges = [];
87
- this.selectedDateRangeName = '';
88
- this.selectedDateRangeTextSegment1 = '';
89
- this.selectedDateRangeTextSegment2 = '';
90
- this.selectedDateCalendar = new Date();
91
- this.selectedDateInternal = new Date();
92
- this.dateStartOld = '';
93
- this.dateStart = '';
94
- this.dateEndOld = '';
95
- this.dateEnd = '';
96
- this.showPredefinedOptionsSelector = false;
97
- this.hidingConfirmedDate = false;
98
- this.isSettingNotPreprocessedDate = false;
99
- this.isSelectedPredefinedPeriod = false;
100
- this.selectedDateFocus = true;
101
- this.elementUUID = 'sds-as-' + crypto.randomUUID();
102
- this.initCalendarValue = true;
103
- this.singleDatePickerBox = undefined;
104
- this.selectedDateStartBox = undefined;
105
- this.selectedDateEndBox = undefined;
106
- this.calendar = undefined;
107
- this._selectedDateRangeButton = undefined;
108
- this.randomIdReference = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
109
- this.isDateDisabled = (args) => {
110
- if (this.lockBeforeDate && isBefore(args.date, this.lockBeforeDate)) {
111
- return true;
112
- }
113
- return this.disabledDates.some((day) => isSameDay(args.date, day));
114
- };
115
- this.dateRangeDefinitions = [];
116
- this.minDateDefault = new Date(1900, 1, 1);
117
- this.maxDateDefault = add(startOfDay(new Date()), { years: 50 });
118
- this.showDatepicker = false;
119
- this.translations = {
120
- cancel: 'Cancel',
121
- apply: 'Apply',
122
- custom: 'Custom',
123
- presets: 'Presets',
124
- };
125
- this.customDateRange = new PeriodPickerDateRange(this.translations.custom, undefined, undefined);
126
- this.selectedDateRange = this.customDateRange;
127
- this.selectedDateInternal = startOfDay(new Date());
128
- this.selectedDateStart = startOfMonth(new Date());
129
- this.selectedDateEnd = startOfDay(endOfMonth(new Date()));
130
- this.setSelectedDateRangeText();
131
- }
132
- ngOnInit() { }
133
- ngOnChanges(changes) {
134
- if (changes['dateRangeDefinitions']) {
135
- this.generateDateRanges(true);
136
- }
137
- if (changes['selectionKind']) {
138
- if (this.selectionKind == 'single') {
139
- const date = new Date(this.selectedDateInternal);
140
- this.matchDateRange(date, date);
141
- this.setDateRangeText(date, date);
142
- }
143
- else {
144
- const date1 = new Date(this.selectedDateStart);
145
- const date2 = new Date(this.selectedDateEnd);
146
- this.matchDateRange(date1, date2);
147
- this.setDateRangeText(date1, date2);
148
- }
149
- }
150
- if (changes['translations']) {
151
- this.updateCustomText();
152
- }
153
- if (changes['locales']) {
154
- this.handleLocalesChange();
155
- }
156
- if (changes['selectedDateStart'] || changes['selectedDateEnd']) {
157
- this.dateStartOld = this.selectedDateStart;
158
- this.dateEndOld = this.selectedDateEnd;
159
- }
160
- if (changes['selectedDate']) {
161
- const value = new Date(changes['selectedDate'].currentValue);
162
- this.selectedDateInternal = startOfDay(value);
163
- if (this.selectionKind == 'single') {
164
- this.dateStart = this.selectedDateInternal;
165
- this.dateEnd = this.selectedDateInternal;
166
- this.matchDateRange(this.selectedDateInternal, this.selectedDateInternal);
167
- this.setDateRangeText(this.selectedDateInternal, this.selectedDateInternal);
168
- }
169
- this.changeRef.detectChanges();
170
- }
171
- if (changes['selectedDateStart']) {
172
- const value = changes['selectedDateStart'].currentValue;
173
- const selectedValue = value instanceof Date ? value : new Date();
174
- if (this.selectionKind == 'period') {
175
- if (this.isSettingNotPreprocessedDate && this.showDatepicker) {
176
- this.dateStart = selectedValue;
177
- this.selectedDateInternal = selectedValue;
178
- this.isSettingNotPreprocessedDate = false;
179
- }
180
- else if (!this.isSelectedPredefinedPeriod &&
181
- this.showDatepicker) {
182
- if (this.selectedDateStartFocus) {
183
- this.dateStart = selectedValue;
184
- this.selectedDateInternal = selectedValue;
185
- if (this.dateEnd instanceof Date &&
186
- (isSameDay(selectedValue, this.dateEnd) ||
187
- isAfter(selectedValue, this.dateEnd))) {
188
- this.dateEnd = selectedValue;
189
- }
190
- }
191
- }
192
- else {
193
- this.dateStart = selectedValue;
194
- this.selectedDateFocus = false;
195
- }
196
- this.calendar?.instance?.repaint();
197
- this.removeDxDefaultCalendarFocus();
198
- if (this.selectedDateStart instanceof Date &&
199
- this.selectedDateEnd instanceof Date) {
200
- this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
201
- this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
202
- }
203
- }
204
- this.changeRef.detectChanges();
205
- }
206
- if (changes['selectedDateEnd']) {
207
- const value = changes['selectedDateEnd'].currentValue;
208
- const selectedValue = value instanceof Date ? value : new Date();
209
- if (this.selectionKind == 'period') {
210
- if (!this.isSelectedPredefinedPeriod) {
211
- if (this.selectedDateEndFocus) {
212
- this.dateEnd = selectedValue;
213
- this.selectedDateInternal = selectedValue;
214
- if (this.dateStart instanceof Date &&
215
- (isSameDay(selectedValue, this.dateStart) ||
216
- isAfter(this.dateStart, selectedValue))) {
217
- this.dateStart = selectedValue;
218
- }
219
- }
220
- }
221
- else {
222
- this.dateEnd = selectedValue;
223
- this.selectedDateInternal = selectedValue;
224
- }
225
- this.removeDxDefaultCalendarFocus();
226
- if (this.selectedDateStart instanceof Date &&
227
- this.selectedDateEnd instanceof Date) {
228
- this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
229
- this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
230
- }
231
- }
232
- }
233
- if (changes['firstDayOfWeek']) {
234
- this.generateDateRanges(true);
235
- }
236
- }
237
- setDateRangeDefinitions(definitions) {
238
- this.dateRangeDefinitions = definitions;
239
- this.generateDateRanges(true);
240
- }
241
- setTranslations(translations) {
242
- this.translations = translations;
243
- this.updateCustomText();
244
- }
245
- setLocales(locales) {
246
- this.locales = locales;
247
- this.handleLocalesChange();
248
- }
249
- get selectedDateStartFocus() {
250
- return this.selectedDateFocus;
251
- }
252
- get selectedDateEndFocus() {
253
- return !this.selectedDateFocus;
254
- }
255
- get isMinimumLimit() {
256
- if (this.minDate instanceof Date &&
257
- this.selectedDateInternal instanceof Date) {
258
- return (isSameDay(this.selectedDateInternal, this.minDate) ||
259
- isBefore(this.selectedDateInternal, this.minDate));
260
- }
261
- return false;
262
- }
263
- get isMaximumLimit() {
264
- if (this.maxDate instanceof Date &&
265
- this.selectedDateInternal instanceof Date) {
266
- return (isSameDay(this.selectedDateInternal, this.maxDate) ||
267
- isAfter(this.selectedDateInternal, this.maxDate));
268
- }
269
- return false;
270
- }
271
- onDateChange(event) {
272
- let selectedDateFromEvent = new Date(event.value);
273
- if (this.selectionKind == 'period') {
274
- const interactiveChange = event.event;
275
- if (interactiveChange) {
276
- if (this.selectedDateStartFocus) {
277
- this.handleStartDateChange(selectedDateFromEvent);
278
- }
279
- else if (this.selectedDateEndFocus) {
280
- this.handleEndDateChange(selectedDateFromEvent);
281
- }
282
- this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
283
- }
284
- }
285
- else if (this.selectionKind == 'single') {
286
- this.showDatepicker = false;
287
- this.selectedDateInternal = selectedDateFromEvent;
288
- }
289
- }
290
- handleStartDateChange(newDate) {
291
- this.selectedDateStart = newDate;
292
- this.selectedDateCalendar = newDate;
293
- if (!this.initCalendarValue) {
294
- this.selectedDateFocus = false;
295
- if (isAfter(newDate, this.selectedDateEnd)) {
296
- this.selectedDateEnd = newDate;
297
- }
298
- else {
299
- this.selectedDateCalendar = new Date(this.selectedDateEnd);
300
- }
301
- }
302
- }
303
- handleEndDateChange(newDate) {
304
- this.selectedDateEnd = newDate;
305
- this.selectedDateCalendar = newDate;
306
- if (
307
- // selected date is before start date -> set start date
308
- isBefore(newDate, this.selectedDateStart)) {
309
- this.selectedDateFocus = true;
310
- this.selectedDateStart = newDate;
311
- this.selectedDateFocus = false;
312
- }
313
- }
314
- onStartDateChange(event) {
315
- this.handleStartDateChange(event.value);
316
- this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
317
- }
318
- onEndDateChange(event) {
319
- this.handleEndDateChange(event.value);
320
- this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
321
- }
322
- onRangeKeyReleased(event, range) {
323
- if (event.key === 'Enter') {
324
- this.changDateRange(range);
325
- }
326
- }
327
- onStartDateFocus() {
328
- this.initCalendarValue = true;
329
- this.selectedDateFocus = true;
330
- if (this.selectedDateStart) {
331
- this.selectedDateInternal = new Date(this.selectedDateStart);
332
- this.selectedDateCalendar = new Date(this.selectedDateStart);
333
- }
334
- setTimeout(() => {
335
- this.initCalendarValue = false;
336
- });
337
- }
338
- onEndDateFocus() {
339
- this.selectedDateFocus = false;
340
- if (this.selectedDateEnd) {
341
- this.selectedDateInternal = new Date(this.selectedDateEnd);
342
- this.selectedDateCalendar = new Date(this.selectedDateEnd);
343
- }
344
- }
345
- applyPeriodPicker() {
346
- this.hidingConfirmedDate = true;
347
- this.showDatepicker = false;
348
- }
349
- onShowingCalendarPopover() {
350
- this.hidingConfirmedDate = false;
351
- if (this.selectionKind == 'single') {
352
- setTimeout(() => {
353
- this.singleDatePickerBox?.instance.focus();
354
- });
355
- }
356
- else {
357
- this.dateStartOld = this.selectedDateStart;
358
- this.dateEndOld = this.selectedDateEnd;
359
- this.isSettingNotPreprocessedDate = true;
360
- setTimeout(() => {
361
- this.selectedDateStartBox?.instance.focus();
362
- this.onStartDateFocus();
363
- });
364
- }
365
- }
366
- closeDatepickerPopup(emitChange = true) {
367
- // if (this.showDatepicker) {
368
- // this.showDatepicker = false;
369
- if (this.selectionKind == 'single') {
370
- this.setSelectedDate(this.selectedDateInternal, this.selectedDateInternal, emitChange);
371
- }
372
- else {
373
- if (this.hidingConfirmedDate) {
374
- this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, true);
375
- }
376
- else {
377
- // this.setSelectedDate(this.dateStartOld, this.dateEndOld, true);
378
- this.setSelectedDate(this.dateStartOld, this.dateEndOld, false);
379
- }
380
- // this.hidingConfirmedDate = false;
381
- }
382
- if (this._selectedDateRangeButton) {
383
- this._selectedDateRangeButton.nativeElement.focus({ focusVisible: false });
384
- }
385
- // }
386
- }
387
- onHiddenCalendarPopover() {
388
- this.closeDatepickerPopup();
389
- }
390
- setSelectedDate(dateStart, dateEnd, emitChange = true) {
391
- this.selectedDateStart = dateStart;
392
- this.selectedDateEnd = dateEnd;
393
- this.selectedDateInternal = this.selectionKind === 'single' ? dateStart : dateEnd;
394
- this.isSelectedPredefinedPeriod = false;
395
- if (emitChange) {
396
- if (this.selectionKind == 'single') {
397
- this.selectedDate = new Date(this.selectedDateInternal);
398
- this.selectedDateChange.emit(this.selectedDateInternal);
399
- }
400
- else {
401
- const dateStartNew = new Date(this.selectedDateStart);
402
- const dateEndNew = new Date(this.selectedDateEnd);
403
- const startDateChanged = (this.dateStartOld instanceof Date && !isSameDay(this.dateStartOld, dateStartNew)) ||
404
- (typeof this.dateStartOld === 'string' && this.dateStartOld === '');
405
- const endDateChanged = (this.dateEndOld instanceof Date && !isSameDay(this.dateEndOld, dateEndNew)) ||
406
- (typeof this.dateEndOld === 'string' && this.dateEndOld === '');
407
- if (startDateChanged) {
408
- this.dateStartOld = new Date(this.selectedDateStart);
409
- this.selectedDateStartChange.emit(this.selectedDateStart);
410
- }
411
- if (endDateChanged) {
412
- this.dateEndOld = new Date(this.selectedDateEnd);
413
- this.selectedDateEndChange.emit(this.selectedDateEnd);
414
- }
415
- if (startDateChanged || endDateChanged) {
416
- this.periodChange.emit([
417
- this.selectedDateStart,
418
- this.selectedDateEnd,
419
- ]);
420
- }
421
- }
422
- if (this.selectedDateStart instanceof Date &&
423
- this.selectedDateEnd instanceof Date) {
424
- this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
425
- this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
426
- }
427
- }
428
- this.changeRef.detectChanges();
429
- }
430
- goToNextDate() {
431
- if (this.selectionKind == 'single') {
432
- const newDate = this.getNextDateCallback(this.selectedDateInternal);
433
- this.selectedDateInternal = new Date(newDate);
434
- this.setSelectedDate(newDate, newDate);
435
- }
436
- else {
437
- if (!(this.selectedDateStart instanceof Date) || !(this.selectedDateEnd instanceof Date)) {
438
- return;
439
- }
440
- const range = this.getNextRangeCallback(this.selectedDateStart, this.selectedDateEnd);
441
- this.setSelectedDate(range[0], range[1]);
442
- }
443
- }
444
- goToPreviousDate() {
445
- if (this.selectionKind == 'single') {
446
- const newDate = this.getPreviousDateCallback(this.selectedDateInternal);
447
- this.selectedDateInternal = new Date(newDate);
448
- this.setSelectedDate(newDate, newDate);
449
- }
450
- else {
451
- if (!(this.selectedDateStart instanceof Date) || !(this.selectedDateEnd instanceof Date)) {
452
- return;
453
- }
454
- const range = this.getPreviousRangeCallback(this.selectedDateStart, this.selectedDateEnd);
455
- this.setSelectedDate(range[0], range[1]);
456
- }
457
- }
458
- // public setNextPreviousDay(setNext: any) {
459
- // this.isSelectedPredefinedPeriod = true;
460
- // let newDate = setNext
461
- // ? add(this.selectedDateInternal as Date, { days: 1 })
462
- // : add(this.selectedDateInternal as Date, { days: -1 });
463
- // this.selectedDateInternal = new Date(newDate);
464
- // this.setSelectedDate(newDate, newDate);
465
- // }
466
- getNextDay(currentDate) {
467
- this.isSelectedPredefinedPeriod = true;
468
- return add(this.selectedDateInternal, { days: 1 });
469
- }
470
- getPreviousDay(currentDate) {
471
- this.isSelectedPredefinedPeriod = true;
472
- return add(this.selectedDateInternal, { days: -1 });
473
- }
474
- getNextRange(currentStartDate, currentEndDate) {
475
- this.isSelectedPredefinedPeriod = true;
476
- return this.datePickerService.getRange(new Date(currentStartDate), new Date(currentEndDate), 'next');
477
- }
478
- getPreviousRange(currentStartDate, currentEndDate) {
479
- this.isSelectedPredefinedPeriod = true;
480
- return this.datePickerService.getRange(new Date(currentStartDate), new Date(currentEndDate), 'previous');
481
- }
482
- setNextPreviousRange(setNext) {
483
- this.isSelectedPredefinedPeriod = true;
484
- if (!(this.selectedDateStart instanceof Date) ||
485
- !(this.selectedDateEnd instanceof Date)) {
486
- return;
487
- }
488
- const range = this.datePickerService.getRange(this.selectedDateStart, this.selectedDateEnd, setNext ? 'next' : 'previous');
489
- this.setSelectedDate(range[0], range[1]);
490
- }
491
- getCellCssClass(date) {
492
- const calendarDate = new Date(date);
493
- let css = '';
494
- if (this.selectionKind == 'period') {
495
- const selectedDateStartAsDate = new Date(this.selectedDateStart);
496
- const selectedDateEndAsDate = new Date(this.selectedDateEnd);
497
- if (isAfter(calendarDate, startOfDay(selectedDateStartAsDate)) &&
498
- isBefore(calendarDate, startOfDay(selectedDateEndAsDate)) &&
499
- !this.disabledDates.some((day) => isSameDay(calendarDate, day))) {
500
- css += ' bg-primary-light text-dark rounded-0';
501
- }
502
- else {
503
- if (isSameDay(calendarDate, selectedDateStartAsDate)) {
504
- css += ' bg-primary text-white rounded-start';
505
- }
506
- if (isSameDay(calendarDate, selectedDateEndAsDate)) {
507
- css += ' bg-primary text-white rounded-end';
508
- }
509
- }
510
- }
511
- return css;
512
- }
513
- selectEndDate(event) {
514
- if (this.selectionKind == "period" && this.selectedDateStartFocus && this.calendarCellClicked(event)) {
515
- this.selectedDateFocus = false;
516
- this.selectedDateCalendar = new Date(this.selectedDateEnd);
517
- }
518
- }
519
- onKeydown(event) {
520
- if (this.showDatepicker) {
521
- if (event.code === 'Escape') {
522
- this.showDatepicker = false;
523
- event.stopImmediatePropagation();
524
- }
525
- else if (event.code === 'Enter' || event.code === 'NumpadEnter') {
526
- if (!this.disabled) {
527
- this.applyPeriodPicker();
528
- }
529
- event.stopImmediatePropagation();
530
- }
531
- }
532
- }
533
- calendarCellClicked(event) {
534
- // This check is tightly coupled with current DX implementation so it
535
- // must be re-checked after each major update of the DX components
536
- // Also check if dx-calendar provides info about clicked element by
537
- // design.
538
- const targetParentClassList = event.target?.offsetParent?.classList;
539
- if (!targetParentClassList) {
540
- return false;
541
- }
542
- const isCalendarCell = [...targetParentClassList].includes('dx-calendar-cell');
543
- return isCalendarCell;
544
- }
545
- handleLocalesChange() {
546
- // apply new locale to DX
547
- // if array of locales was provided use first one
548
- if (typeof this.locales === 'string') {
549
- locale(this.locales);
550
- }
551
- else if (Array.isArray(this.locales) && this.locales.length > 0) {
552
- locale(this.locales[0]);
553
- }
554
- ;
555
- this.selectedDateStartBox?.instance.repaint();
556
- this.selectedDateEndBox?.instance.repaint();
557
- this.singleDatePickerBox?.instance.repaint();
558
- this.calendar?.instance.repaint();
559
- this.setSelectedDateRangeText();
560
- }
561
- updateCustomText() {
562
- this.customDateRange.name = this.translations?.custom
563
- ? this.translations.custom
564
- : '';
565
- }
566
- removeDxDefaultCalendarFocus() {
567
- const element = document.querySelector('#datepickercomponent .dx-calendar-selected-date');
568
- if (element &&
569
- element?.classList?.contains('dx-calendar-selected-date')) {
570
- element?.classList?.remove('dx-calendar-selected-date');
571
- }
572
- }
573
- setSelectedDateRangeText() {
574
- if (this.selectionKind == 'single') {
575
- this.matchDateRange(new Date(this.selectedDateInternal), new Date(this.selectedDateInternal));
576
- this.setDateRangeText(new Date(this.selectedDateInternal), new Date(this.selectedDateInternal));
577
- }
578
- else {
579
- this.matchDateRange(new Date(this.selectedDateStart), new Date(this.selectedDateEnd));
580
- this.setDateRangeText(new Date(this.selectedDateStart), new Date(this.selectedDateEnd));
581
- }
582
- }
583
- toggleDateRangeSelectorVisibility() {
584
- if (!this.showPredefinedOptionsSelector) {
585
- this.generateDateRanges();
586
- }
587
- this.showPredefinedOptionsSelector =
588
- !this.showPredefinedOptionsSelector;
589
- }
590
- changDateRange(range) {
591
- this.showPredefinedOptionsSelector = false;
592
- this.showDatepicker = false;
593
- this.selectedDateRange = range;
594
- if (range === this.customDateRange) {
595
- // this.openDatepickerPopup();
596
- this.showDatepicker = true;
597
- }
598
- else {
599
- this.dateStart = range.dateFrom
600
- ? range.dateFrom
601
- : startOfDay(new Date());
602
- this.dateEnd = range.dateTo ? range.dateTo : startOfDay(new Date());
603
- this.setSelectedDate(this.dateStart, this.dateEnd, true);
604
- }
605
- }
606
- matchDateRange(dateFrom, dateTo) {
607
- if (!dateFrom || !dateTo) {
608
- this.selectedDateRange = this.customDateRange;
609
- return;
610
- }
611
- this.generateDateRanges();
612
- const dateRange = this.predefinedDateRanges.filter((x) => isSameDay(x.dateFrom, dateFrom) &&
613
- isSameDay(x.dateTo, dateTo));
614
- if (dateRange.length) {
615
- this.selectedDateRange = dateRange[0];
616
- }
617
- else {
618
- this.selectedDateRange = this.customDateRange;
619
- }
620
- }
621
- setDateRangeText(dateFrom, dateTo) {
622
- const today = new Date();
623
- this.selectedDateRangeName = '';
624
- this.selectedDateRangeTextSegment1 = '';
625
- this.selectedDateRangeTextSegment2 = '';
626
- if (!(dateFrom instanceof Date) || !(dateTo instanceof Date)) {
627
- return;
628
- }
629
- // RESOLVE PERIOD
630
- // one day
631
- if (isSameDay(dateFrom, dateTo)) {
632
- if (typeof this.singleDayFormatFn !== 'undefined') {
633
- this.selectedDateRangeTextSegment1 = this.singleDayFormatFn(dateFrom);
634
- }
635
- else {
636
- if (this.style == 'compact' && this.compactStyleDisplay == 'both' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
637
- this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom); //skip day name, as we have custom text.
638
- }
639
- else {
640
- this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, 'day-long');
641
- }
642
- }
643
- }
644
- // date range
645
- else {
646
- // date range - use provided dateRange format function (if defined)
647
- if (typeof this.dateRangeFormatFn !== 'undefined') {
648
- this.selectedDateRangeTextSegment1 = this.dateRangeFormatFn(dateFrom);
649
- this.selectedDateRangeTextSegment2 = this.dateRangeFormatFn(dateTo);
650
- }
651
- // full month
652
- else if (isSameDay(dateFrom, startOfMonth(dateFrom)) &&
653
- isSameDay(dateTo, endOfMonth(dateTo)) &&
654
- isSameMonth(dateFrom, dateTo)) {
655
- this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, 'month');
656
- }
657
- // date range - use default date format function
658
- else {
659
- this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, isSameYear(dateFrom, today) ? 'day-short' : 'day');
660
- this.selectedDateRangeTextSegment2 = this.formatDate(dateTo, isSameYear(dateTo, today) ? 'day-short' : 'day');
661
- }
662
- }
663
- if (this.style == 'compact' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
664
- if (this.compactStyleDisplay == 'predefinedRange') {
665
- this.selectedDateRangeName = this.selectedDateRange.name;
666
- this.selectedDateRangeTextSegment1 = '';
667
- this.selectedDateRangeTextSegment2 = '';
668
- }
669
- if (this.compactStyleDisplay == 'both') {
670
- this.selectedDateRangeName = this.selectedDateRange.name + ', ';
671
- }
672
- }
673
- // @Input() public style: 'classic' | 'compact' = 'classic';
674
- // @Input() public compactStyleDisplay: 'date' | 'predefinedRange' | 'both' = 'predefinedRange';
675
- // if (this.style == 'compact' && this.compactStyleDisplay == 'predefinedRange' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
676
- // this.selectedDateRangeTextSegment1 = this.selectedDateRange.name;
677
- // this.selectedDateRangeTextSegment2 = '';
678
- // return;
679
- // }
680
- // if (this.style == 'compact' && this.compactStyleDisplay == 'both' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
681
- // this.selectedDateRangeTextSegment1 = this.selectedDateRange.name;
682
- // this.selectedDateRangeTextSegment2 = '';
683
- // return;
684
- // }
685
- }
686
- formatDate(date, type) {
687
- switch (type) {
688
- case 'month':
689
- return date.toLocaleDateString(this.locales, {
690
- month: 'long',
691
- year: 'numeric',
692
- day: undefined,
693
- });
694
- case 'day-long':
695
- return date.toLocaleDateString(this.locales, {
696
- day: 'numeric',
697
- month: 'numeric',
698
- year: 'numeric',
699
- weekday: 'long',
700
- });
701
- case 'day-short':
702
- return date.toLocaleDateString(this.locales, {
703
- day: 'numeric',
704
- month: 'short',
705
- });
706
- case 'day':
707
- return date.toLocaleDateString(this.locales, {
708
- day: 'numeric',
709
- month: 'short',
710
- year: 'numeric',
711
- });
712
- default:
713
- return date.toLocaleDateString(this.locales, {
714
- day: 'numeric',
715
- month: 'numeric',
716
- year: 'numeric',
717
- });
718
- }
719
- }
720
- generateDateRanges(force) {
721
- const today = startOfDay(new Date());
722
- if (force ||
723
- !this.predefinedDateRangesGeneratedDate ||
724
- !isSameDay(this.predefinedDateRangesGeneratedDate, today)) {
725
- this.predefinedDateRangesGeneratedDate = today;
726
- this.predefinedDateRanges =
727
- this.datePickerService.getPredefinedDateRanges(this.dateRangeDefinitions, today, this.firstDayOfWeek);
728
- this.dateRanges = [...this.predefinedDateRanges];
729
- this.dateRanges.push(this.customDateRange);
730
- }
731
- }
732
- }
733
- SdsDatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SdsDatePickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SdsDatePickerService }], target: i0.ɵɵFactoryTarget.Component });
734
- SdsDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SdsDatePickerComponent, selector: "sds-date-picker", inputs: { selectionKind: "selectionKind", dateRangeDefinitions: "dateRangeDefinitions", selectedDate: "selectedDate", selectedDateStart: "selectedDateStart", singleDayFormatFn: "singleDayFormatFn", dateRangeFormatFn: "dateRangeFormatFn", selectedDateEnd: "selectedDateEnd", minDate: "minDate", maxDate: "maxDate", locales: "locales", disabled: "disabled", validationError: "validationError", isValid: "isValid", disabledDates: "disabledDates", applyText: "applyText", cancelText: "cancelText", translations: "translations", firstDayOfWeek: "firstDayOfWeek", dateRangeDefinitionsWidth: "dateRangeDefinitionsWidth", showPreviousAndNextButtons: "showPreviousAndNextButtons", width: "width", dropdownWrapperClass: "dropdownWrapperClass", dropdownWrapperId: "dropdownWrapperId", getPreviousDateCallback: "getPreviousDateCallback", getNextDateCallback: "getNextDateCallback", getPreviousRangeCallback: "getPreviousRangeCallback", getNextRangeCallback: "getNextRangeCallback", useCustomDisplayContent: "useCustomDisplayContent", displayPredefinedDateRangeName: "displayPredefinedDateRangeName", style: "style", compactStyleDisplay: "compactStyleDisplay", dateInputDisplayFormat: "dateInputDisplayFormat", componentAriaLabel: "componentAriaLabel", openDateRangeDefinitionsAriaLabel: "openDateRangeDefinitionsAriaLabel", nextPeriodAriaLabel: "nextPeriodAriaLabel", previousPeriodAriaLabel: "previousPeriodAriaLabel", lockBeforeDate: "lockBeforeDate", lockBeforeDateHint: "lockBeforeDateHint" }, outputs: { selectedDateChange: "selectedDateChange", selectedDateStartChange: "selectedDateStartChange", selectedDateEndChange: "selectedDateEndChange", periodChange: "periodChange" }, queries: [{ propertyName: "displayContent", first: true, predicate: ["display"], descendants: true }], viewQueries: [{ propertyName: "singleDatePickerBox", first: true, predicate: ["singleDatePickerBox"], descendants: true }, { propertyName: "selectedDateStartBox", first: true, predicate: ["selectedDateStartBox"], descendants: true }, { propertyName: "selectedDateEndBox", first: true, predicate: ["selectedDateEndBox"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "_selectedDateRangeButton", first: true, predicate: ["selectedDateRangeButton"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- <div id=\"datepickerbuttons\"> -->\r\n <div\r\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\r\n role=\"group\"\r\n [attr.aria-label]=\"componentAriaLabel\"\r\n [style.width]=\"width\"\r\n >\r\n\r\n <ng-container *ngIf=\"style == 'classic'\">\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n type=\"button\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end\r\n p-0\r\n sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\r\n {{selectedDateRange.name}}\r\n </div>\r\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\r\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\r\n <span class=\"dropdown-toggle\"></span>\r\n </button>\r\n </div>\r\n\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\r\n [minWidth]=\"dateRangeDefinitionsWidth\"\r\n\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n (keydown)=\"onRangeKeyReleased($event, range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\r\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\r\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\r\n type=\"button\"\r\n [attr.aria-label]=\"previousPeriodAriaLabel\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n #selectedDateRangeButton\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\r\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\r\n [class.border-end] = \"!showPreviousAndNextButtons\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker = !showDatepicker\"\r\n >\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeName}}</span>\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextPeriodAriaLabel\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sds-print-only h-100\">\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"onHiddenCalendarPopover()\"\r\n (onShowing)=\"onShowingCalendarPopover()\"\r\n class=\"m-0 p-0\"\r\n [wrapperAttr]=\"{\r\n class: 'sds-datepicker-popover ' + dropdownWrapperClass,\r\n id: dropdownWrapperId\r\n }\"\r\n>\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\r\n <dx-scroll-view>\r\n <div class=\"d-flex flex-row\">\r\n\r\n <div\r\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\r\n class=\"d-flex flex-column p-3 bg-gray-100\"\r\n style=\"border-right: 1px solid var(--bs-gray-200)\"\r\n >\r\n <div\r\n *ngIf=\"translations.presets\" class=\"px-3 py-2\">\r\n <label>{{ translations.presets }}</label>\r\n </div>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\r\n >\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateStart\"\r\n (onValueChanged)=\"onStartDateChange($event)\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateEnd\"\r\n (onValueChanged)=\"onEndDateChange($event)\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n >\r\n </dx-date-box>\r\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center align-items-center\"\r\n (click)=\"selectEndDate($event)\">\r\n\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"isDateDisabled\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n [style.line-height.px]=\"23\"\r\n\r\n >\r\n\r\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\r\n <ng-template #thenLockBlock>\r\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\r\n </ng-template>\r\n <ng-template #elseDefaultBlock>\r\n {{ cellData.text }}\r\n </ng-template>\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"showDatepicker = false\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <!-- (click)=\"closeDatepickerPopup()\" -->\r\n <button\r\n class=\"btn btn-primary ms-1 sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>\r\n<!-- </div> -->\r\n\r\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"], dependencies: [{ kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: i5.DxDateBoxComponent, selector: "dx-date-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "adaptivityEnabled", "applyButtonText", "applyValueMode", "buttons", "calendarOptions", "cancelButtonText", "dateOutOfRangeMessage", "dateSerializationFormat", "deferRendering", "disabled", "disabledDates", "displayFormat", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "interval", "invalidDateMessage", "isValid", "label", "labelMode", "max", "maxLength", "min", "name", "opened", "openOnFieldClick", "pickerType", "placeholder", "readOnly", "rtlEnabled", "showAnalogClock", "showClearButton", "showDropDownButton", "spellcheck", "stylingMode", "tabIndex", "text", "todayButtonText", "type", "useMaskBehavior", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "adaptivityEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "calendarOptionsChange", "cancelButtonTextChange", "dateOutOfRangeMessageChange", "dateSerializationFormatChange", "deferRenderingChange", "disabledChange", "disabledDatesChange", "displayFormatChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "intervalChange", "invalidDateMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "maxLengthChange", "minChange", "nameChange", "openedChange", "openOnFieldClickChange", "pickerTypeChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showAnalogClockChange", "showClearButtonChange", "showDropDownButtonChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "todayButtonTextChange", "typeChange", "useMaskBehaviorChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxoAnimationComponent, selector: "dxo-animation", inputs: ["hide", "show", "duration", "easing", "enabled", "maxPointCountSupported", "complete", "delay", "direction", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i6.DxoHideComponent, selector: "dxo-hide", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i6.DxoShowComponent, selector: "dxo-show", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i5.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i5.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i5.DxCalendarComponent, selector: "dx-calendar", inputs: ["accessKey", "activeStateEnabled", "cellTemplate", "dateSerializationFormat", "disabled", "disabledDates", "elementAttr", "firstDayOfWeek", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isValid", "max", "maxZoomLevel", "min", "minZoomLevel", "name", "readOnly", "rtlEnabled", "showTodayButton", "showWeekNumbers", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "visible", "weekNumberRule", "width", "zoomLevel"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "cellTemplateChange", "dateSerializationFormatChange", "disabledChange", "disabledDatesChange", "elementAttrChange", "firstDayOfWeekChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isValidChange", "maxChange", "maxZoomLevelChange", "minChange", "minZoomLevelChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "showTodayButtonChange", "showWeekNumbersChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "visibleChange", "weekNumberRuleChange", "widthChange", "zoomLevelChange", "onBlur"] }, { kind: "pipe", type: i8.SdsDateComparePipe, name: "sdsDateCompare" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
735
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SdsDatePickerComponent, decorators: [{
736
- type: Component,
737
- args: [{ selector: 'sds-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- <div id=\"datepickerbuttons\"> -->\r\n <div\r\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\r\n role=\"group\"\r\n [attr.aria-label]=\"componentAriaLabel\"\r\n [style.width]=\"width\"\r\n >\r\n\r\n <ng-container *ngIf=\"style == 'classic'\">\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n type=\"button\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end\r\n p-0\r\n sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\r\n {{selectedDateRange.name}}\r\n </div>\r\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\r\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\r\n <span class=\"dropdown-toggle\"></span>\r\n </button>\r\n </div>\r\n\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\r\n [minWidth]=\"dateRangeDefinitionsWidth\"\r\n\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n (keydown)=\"onRangeKeyReleased($event, range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\r\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\r\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\r\n type=\"button\"\r\n [attr.aria-label]=\"previousPeriodAriaLabel\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n #selectedDateRangeButton\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\r\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\r\n [class.border-end] = \"!showPreviousAndNextButtons\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker = !showDatepicker\"\r\n >\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeName}}</span>\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextPeriodAriaLabel\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sds-print-only h-100\">\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"onHiddenCalendarPopover()\"\r\n (onShowing)=\"onShowingCalendarPopover()\"\r\n class=\"m-0 p-0\"\r\n [wrapperAttr]=\"{\r\n class: 'sds-datepicker-popover ' + dropdownWrapperClass,\r\n id: dropdownWrapperId\r\n }\"\r\n>\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\r\n <dx-scroll-view>\r\n <div class=\"d-flex flex-row\">\r\n\r\n <div\r\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\r\n class=\"d-flex flex-column p-3 bg-gray-100\"\r\n style=\"border-right: 1px solid var(--bs-gray-200)\"\r\n >\r\n <div\r\n *ngIf=\"translations.presets\" class=\"px-3 py-2\">\r\n <label>{{ translations.presets }}</label>\r\n </div>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\r\n >\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateStart\"\r\n (onValueChanged)=\"onStartDateChange($event)\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateEnd\"\r\n (onValueChanged)=\"onEndDateChange($event)\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n >\r\n </dx-date-box>\r\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center align-items-center\"\r\n (click)=\"selectEndDate($event)\">\r\n\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"isDateDisabled\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n [style.line-height.px]=\"23\"\r\n\r\n >\r\n\r\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\r\n <ng-template #thenLockBlock>\r\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\r\n </ng-template>\r\n <ng-template #elseDefaultBlock>\r\n {{ cellData.text }}\r\n </ng-template>\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"showDatepicker = false\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <!-- (click)=\"closeDatepickerPopup()\" -->\r\n <button\r\n class=\"btn btn-primary ms-1 sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>\r\n<!-- </div> -->\r\n\r\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"] }]
738
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SdsDatePickerService }]; }, propDecorators: { displayContent: [{
739
- type: ContentChild,
740
- args: ['display']
741
- }], selectionKind: [{
742
- type: Input
743
- }], dateRangeDefinitions: [{
744
- type: Input
745
- }], selectedDate: [{
746
- type: Input
747
- }], selectedDateChange: [{
748
- type: Output
749
- }], selectedDateStart: [{
750
- type: Input
751
- }], selectedDateStartChange: [{
752
- type: Output
753
- }], singleDayFormatFn: [{
754
- type: Input
755
- }], dateRangeFormatFn: [{
756
- type: Input
757
- }], selectedDateEnd: [{
758
- type: Input
759
- }], selectedDateEndChange: [{
760
- type: Output
761
- }], periodChange: [{
762
- type: Output
763
- }], minDate: [{
764
- type: Input
765
- }], maxDate: [{
766
- type: Input
767
- }], locales: [{
768
- type: Input
769
- }], disabled: [{
770
- type: Input
771
- }], validationError: [{
772
- type: Input
773
- }], isValid: [{
774
- type: Input
775
- }], disabledDates: [{
776
- type: Input
777
- }], applyText: [{
778
- type: Input
779
- }], cancelText: [{
780
- type: Input
781
- }], translations: [{
782
- type: Input
783
- }], firstDayOfWeek: [{
784
- type: Input
785
- }], dateRangeDefinitionsWidth: [{
786
- type: Input
787
- }], showPreviousAndNextButtons: [{
788
- type: Input
789
- }], width: [{
790
- type: Input
791
- }], dropdownWrapperClass: [{
792
- type: Input
793
- }], dropdownWrapperId: [{
794
- type: Input
795
- }], getPreviousDateCallback: [{
796
- type: Input
797
- }], getNextDateCallback: [{
798
- type: Input
799
- }], getPreviousRangeCallback: [{
800
- type: Input
801
- }], getNextRangeCallback: [{
802
- type: Input
803
- }], useCustomDisplayContent: [{
804
- type: Input
805
- }], displayPredefinedDateRangeName: [{
806
- type: Input
807
- }], style: [{
808
- type: Input
809
- }], compactStyleDisplay: [{
810
- type: Input
811
- }], dateInputDisplayFormat: [{
812
- type: Input
813
- }], componentAriaLabel: [{
814
- type: Input
815
- }], openDateRangeDefinitionsAriaLabel: [{
816
- type: Input
817
- }], nextPeriodAriaLabel: [{
818
- type: Input
819
- }], previousPeriodAriaLabel: [{
820
- type: Input
821
- }], lockBeforeDate: [{
822
- type: Input
823
- }], lockBeforeDateHint: [{
824
- type: Input
825
- }], singleDatePickerBox: [{
826
- type: ViewChild,
827
- args: ['singleDatePickerBox', { static: false }]
828
- }], selectedDateStartBox: [{
829
- type: ViewChild,
830
- args: ['selectedDateStartBox', { static: false }]
831
- }], selectedDateEndBox: [{
832
- type: ViewChild,
833
- args: ['selectedDateEndBox', { static: false }]
834
- }], calendar: [{
835
- type: ViewChild,
836
- args: ['calendar', { static: false }]
837
- }], _selectedDateRangeButton: [{
838
- type: ViewChild,
839
- args: ['selectedDateRangeButton', { static: true }]
840
- }] } });
841
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakQsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sRUFDUCxRQUFRLEVBQ1IsR0FBRyxHQUNOLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ1QsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFaEUsT0FBTyxFQUNILHFCQUFxQixHQUd4QixNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7O0FBRzdCLDZEQUE2RDtBQVE3RCxNQUFNLE9BQU8sc0JBQXNCO0lBd0ovQixpQkFBaUI7SUFDakIsWUFDWSxTQUE0QixFQUM1QixpQkFBdUM7UUFEdkMsY0FBUyxHQUFULFNBQVMsQ0FBbUI7UUFDNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQTFKMUIsbUJBQWMsR0FBUSxTQUFTLENBQUM7UUFFekQsbUJB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QUlVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1Usa0JBQWtCO3NCQUFqQyxLQUFLO2dCQThDRSxtQkFBbUI7c0JBRDFCLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUczQyxvQkFBb0I7c0JBRDNCLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUc1QyxrQkFBa0I7c0JBRHpCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUdBLFFBQVE7c0JBQXpELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFLaEMsd0JBQXdCO3NCQUQvQixTQUFTO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIENvbnRlbnRDaGlsZCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IER4Q2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvY2FsZW5kYXInO1xyXG5pbXBvcnQgeyBEeERhdGVCb3hDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvZGF0ZS1ib3gnO1xyXG5pbXBvcnQgeyBsb2NhbGUgfSBmcm9tIFwiZGV2ZXh0cmVtZS9sb2NhbGl6YXRpb25cIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgICBpc1NhbWVEYXksXHJcbiAgICBpc1NhbWVZZWFyLFxyXG4gICAgaXNTYW1lTW9udGgsXHJcbiAgICBzdGFydE9mRGF5LFxyXG4gICAgc3RhcnRPZk1vbnRoLFxyXG4gICAgZW5kT2ZNb250aCxcclxuICAgIGlzQWZ0ZXIsXHJcbiAgICBpc0JlZm9yZSxcclxuICAgIGFkZCxcclxufSBmcm9tICdkYXRlLWZucyc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgZmFBbmdsZUxlZnQsXHJcbiAgICBmYUFuZ2xlUmlnaHQsXHJcbiAgICBmYUNhbGVuZGFyLFxyXG4gICAgZmFMb2NrXHJcbn0gZnJvbSAnQGZvcnRhd2Vzb21lL3Byby1yZWd1bGFyLXN2Zy1pY29ucyc7XHJcblxyXG5pbXBvcnQgeyBmYUFycm93UmlnaHQgfSBmcm9tICdAZm9ydGF3ZXNvbWUvcHJvLWxpZ2h0LXN2Zy1pY29ucyc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgUGVyaW9kUGlja2VyRGF0ZVJhbmdlLFxyXG4gICAgUGVyaW9kUGlja2VyRGF0ZVJhbmdlRGVmaW5pdGlvbixcclxuICAgIFBlcmlvZFBpY2tlclRyYW5zbGF0aW9ucyxcclxufSBmcm9tICcuL2RhdGUtcGlja2VyLm1vZGVsJztcclxuaW1wb3J0IHsgU2RzRGF0ZVBpY2tlclNlcnZpY2UgfSBmcm9tICcuL3Nkcy1kYXRlLXBpY2tlci5zZXJ2aWNlJztcclxuXHJcbi8vIGltcG9ydCB7IGZhTG9jayB9IGZyb20gJ0Bmb3J0YXdlc29tZS9wcm8tc29saWQtc3ZnLWljb25zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzZHMtZGF0ZS1waWNrZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNkc0RhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgICBAQ29udGVudENoaWxkKCdkaXNwbGF5JykgZGlzcGxheUNvbnRlbnQ6IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvLyBwdWJsaWMgaW50ZXJmYWNlXHJcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25LaW5kOiAncGVyaW9kJyB8ICdzaW5nbGUnID0gJ3BlcmlvZCc7XHJcblxyXG4gICAgQElucHV0KCkgZGF0ZVJhbmdlRGVmaW5pdGlvbnM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZURlZmluaXRpb24+ID0gW107XHJcblxyXG4gICAgLy8gc2luZ2xlIGRhdGUgc2VsZWN0b3JcclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICAvLyBwZXJpb2Qgc2VsZWN0b3JcclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZVN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xyXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkRGF0ZVN0YXJ0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIC8vIGZvcm1hdCBmdW5jdGlvbiBmb3IgZGlzcGxheWluZyBkYXRlIHdoZW4gc2luZ2xlIGRhdGUgaXMgc2VsZWN0ZWRcclxuICAgIEBJbnB1dCgpIHNpbmdsZURheUZvcm1hdEZuOiAoKGRhdGU6IERhdGUpID0+IHN0cmluZyApIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gZm9ybWF0IGZ1bmN0aW9uIGZvciBkaXNwbGF5aW5nIGVhY2ggZGF0ZSB3aGVuIGRhdGUgcmFuZ2UgaXMgc2VsZWN0ZWRcclxuICAgIEBJbnB1dCgpIGRhdGVSYW5nZUZvcm1hdEZuOiAoKGRhdGU6IERhdGUpID0+IHN0cmluZyApIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZUVuZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZERhdGVFbmRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcGVyaW9kQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBJbnB1dCgpIG1pbkRhdGU/OiBEYXRlO1xyXG4gICAgQElucHV0KCkgbWF4RGF0ZT86IERhdGU7XHJcblxyXG4gICAgQElucHV0KCkgbG9jYWxlcz86IHN0cmluZyB8IEFycmF5PHN0cmluZz47XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdmFsaWRhdGlvbkVycm9yOiBzdHJpbmcgPSAnJztcclxuICAgIEBJbnB1dCgpIGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpIGRpc2FibGVkRGF0ZXM6IERhdGVbXSA9IFtdO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBhcHBseVRleHQ/OiBzdHJpbmcgPSAnY2xvc2UnO1xyXG4gICAgQElucHV0KCkgcHVibGljIGNhbmNlbFRleHQ/OiBzdHJpbmcgPSAnY2xvc2UnO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0cmFuc2xhdGlvbnM6IFBlcmlvZFBpY2tlclRyYW5zbGF0aW9ucztcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZmlyc3REYXlPZldlZWs6IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgPSAxO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRlUmFuZ2VEZWZpbml0aW9uc1dpZHRoOiBzdHJpbmcgPSAnMTFyZW0nO1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgd2lkdGg6IHN0cmluZyA9ICczMHJlbSc7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGRyb3Bkb3duV3JhcHBlckNsYXNzOiBzdHJpbmcgPSAnJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93bldyYXBwZXJJZDogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGdldFByZXZpb3VzRGF0ZUNhbGxiYWNrOiAoY3VycmVudERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSB0aGlzLmdldFByZXZpb3VzRGF5O1xyXG4gICAgQElucHV0KCkgcHVibGljIGdldE5leHREYXRlQ2FsbGJhY2s6IChjdXJyZW50RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9IHRoaXMuZ2V0TmV4dERheTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZ2V0UHJldmlvdXNSYW5nZUNhbGxiYWNrOiAoY3VycmVudFN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgY3VycmVudEVuZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IFtzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBzdHJpbmcgfCBudW1iZXIgfCBEYXRlXSA9IHRoaXMuZ2V0UHJldmlvdXNSYW5nZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXROZXh0UmFuZ2VDYWxsYmFjazogKGN1cnJlbnRTdGFydERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIGN1cnJlbnRFbmREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSA9PiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0gPSB0aGlzLmdldE5leHRSYW5nZTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdXNlQ3VzdG9tRGlzcGxheUNvbnRlbnQgPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzcGxheVByZWRlZmluZWREYXRlUmFuZ2VOYW1lID0gZmFsc2VcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc3R5bGU6ICdjbGFzc2ljJyB8ICdjb21wYWN0JyA9ICdjbGFzc2ljJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjb21wYWN0U3R5bGVEaXNwbGF5OiAnZGF0ZScgfCAncHJlZGVmaW5lZFJhbmdlJyB8ICdib3RoJyA9ICdwcmVkZWZpbmVkUmFuZ2UnO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRlSW5wdXREaXNwbGF5Rm9ybWF0OiBzdHJpbmcgPSAnc2hvcnREYXRlJztcclxuXHJcbiAgICAvLyAjcmVnaW9uIEFyaWEgaW5wdXRzXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICogQ29tcG9uZW50IGFyaWEtbGFiZWwuIERlZmF1bHRzIHRvICdEYXRlIHBpY2tlcidcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNvbXBvbmVudEFyaWFMYWJlbCA9ICdEYXRlIHBpY2tlcidcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICogUHJlZGVmaW5lZCBkYXRlIHJhbmdlIGRlZmluaXRpb25zIGRyb3Bkb3duIGJ1dHRvbiBhcmlhLWxhYmVsLiBEZWZhdWx0cyB0byAnT3BlbiBwcmVkZWZpbmVkIGRhdGUgcmFuZ2VzIHBhbmUnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBvcGVuRGF0ZVJhbmdlRGVmaW5pdGlvbnNBcmlhTGFiZWwgPSAnT3BlbiBwcmVkZWZpbmVkIGRhdGUgcmFuZ2VzIHBhbmUnXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIE5leHQgcGVyaW9kIGJ1dHRvbiBhcmlhLWxhYmVsLiBEZWZhdWx0IHRvICdOZXh0IHBlcmlvZCdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG5leHRQZXJpb2RBcmlhTGFiZWwgPSAnTmV4dCBwZXJpb2QnXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIFByZXZpb3VzIHBlcmlvZCBidXR0b24gYXJpYS1sYWJlbC4gRGVmYXVsdHMgdG8gJ1ByZXZpb3VzIHBlcmlvZCdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHByZXZpb3VzUGVyaW9kQXJpYUxhYmVsID0gJ1ByZXZpb3VzIHBlcmlvZCdcclxuXHJcbiAgICAvLyAjZW5kcmVnaW9uIEFSSUEgaW5wdXRzXHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGxvY2tCZWZvcmVEYXRlPzogRGF0ZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2NrQmVmb3JlRGF0ZUhpbnQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8vIHB1YmxpYyBwcm9wZXJ0aWVzXHJcbiAgICBwcmV2aW91c1BlcmlvZEljb24gPSBmYUFuZ2xlTGVmdDtcclxuICAgIG5leHRQZXJpb2RJY29uID0gZmFBbmdsZVJpZ2h0O1xyXG4gICAgY2FsZW5kYXJJY29uID0gZmFDYWxlbmRhcjtcclxuICAgIHRvSWNvbiA9IGZhQXJyb3dSaWdodDtcclxuICAgIGxvY2tJY29uID0gZmFMb2NrO1xyXG5cclxuICAgIHByZWRlZmluZWREYXRlUmFuZ2VzOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2U+ID0gW107XHJcbiAgICBwcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBzZWxlY3RlZERhdGVSYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlO1xyXG4gICAgZGF0ZVJhbmdlczogQXJyYXk8UGVyaW9kUGlja2VyRGF0ZVJhbmdlPiA9IFtdO1xyXG5cclxuICAgIHNlbGVjdGVkRGF0ZVJhbmdlTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgICBzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MTogc3RyaW5nID0gJyc7XHJcbiAgICBzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50Mjogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgbWluRGF0ZURlZmF1bHQ6IERhdGU7XHJcbiAgICBtYXhEYXRlRGVmYXVsdDogRGF0ZTtcclxuXHJcbiAgICBzZWxlY3RlZERhdGVDYWxlbmRhcjogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBzZWxlY3RlZERhdGVJbnRlcm5hbDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgZGF0ZVN0YXJ0T2xkOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSAnJztcclxuICAgIGRhdGVFbmRPbGQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSAnJztcclxuICAgIGRhdGVFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSAnJztcclxuXHJcbiAgICBzaG93RGF0ZXBpY2tlcjogYm9vbGVhbjtcclxuICAgIHNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaGlkaW5nQ29uZmlybWVkRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBzZWxlY3RlZERhdGVGb2N1czogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHJvdGVjdGVkIGVsZW1lbnRVVUlEID0gJ3Nkcy1hcy0nICsgY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuXHJcbiAgICAvLyBwcml2YXRlIGZpZWxkc1xyXG4gICAgcHJpdmF0ZSBjdXN0b21EYXRlUmFuZ2U6IFBlcmlvZFBpY2tlckRhdGVSYW5nZTtcclxuICAgIHByaXZhdGUgaW5pdENhbGVuZGFyVmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NpbmdsZURhdGVQaWNrZXJCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICAgIHByaXZhdGUgc2luZ2xlRGF0ZVBpY2tlckJveDogRHhEYXRlQm94Q29tcG9uZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgQFZpZXdDaGlsZCgnc2VsZWN0ZWREYXRlU3RhcnRCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICAgIHByaXZhdGUgc2VsZWN0ZWREYXRlU3RhcnRCb3g6IER4RGF0ZUJveENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkRGF0ZUVuZEJveCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gICAgcHJpdmF0ZSBzZWxlY3RlZERhdGVFbmRCb3g6IER4RGF0ZUJveENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdjYWxlbmRhcicsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIGNhbGVuZGFyOlxyXG4gICAgICAgIHwgRHhDYWxlbmRhckNvbXBvbmVudFxyXG4gICAgICAgIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uJywgeyBzdGF0aWM6IHRydWV9KVxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWREYXRlUmFuZ2VCdXR0b246IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gcHVibGljIG1ldGhvZHNcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgY2hhbmdlUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIGRhdGVQaWNrZXJTZXJ2aWNlOiBTZHNEYXRlUGlja2VyU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VEZWZpbml0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLm1pbkRhdGVEZWZhdWx0ID0gbmV3IERhdGUoMTkwMCwgMSwgMSk7XHJcbiAgICAgICAgdGhpcy5tYXhEYXRlRGVmYXVsdCA9IGFkZChzdGFydE9mRGF5KG5ldyBEYXRlKCkpLCB7IHllYXJzOiA1MCB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9ucyA9IHtcclxuICAgICAgICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgYXBwbHk6ICdBcHBseScsXHJcbiAgICAgICAgICAgIGN1c3RvbTogJ0N1c3RvbScsXHJcbiAgICAgICAgICAgIHByZXNldHM6ICdQcmVzZXRzJyxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmN1c3RvbURhdGVSYW5nZSA9IG5ldyBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UoXHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25zLmN1c3RvbSxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gdGhpcy5jdXN0b21EYXRlUmFuZ2U7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0ID0gc3RhcnRPZk1vbnRoKG5ldyBEYXRlKCkpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gc3RhcnRPZkRheShlbmRPZk1vbnRoKG5ldyBEYXRlKCkpKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7fVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlc1snZGF0ZVJhbmdlRGVmaW5pdGlvbnMnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3Rpb25LaW5kJ10pe1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UoZGF0ZSwgZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQoZGF0ZSwgZGF0ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlMSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZTIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShkYXRlMSwgZGF0ZTIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KGRhdGUxLCBkYXRlMik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1sndHJhbnNsYXRpb25zJ10pIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDdXN0b21UZXh0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snbG9jYWxlcyddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTG9jYWxlc0NoYW5nZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZVN0YXJ0J10gfHwgY2hhbmdlc1snc2VsZWN0ZWREYXRlRW5kJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0O1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFbmRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZUVuZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGUnXSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyBEYXRlKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddLmN1cnJlbnRWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc3RhcnRPZkRheSh2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZVN0YXJ0J10pIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZERhdGVTdGFydCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXR0aW5nTm90UHJlcHJvY2Vzc2VkRGF0ZSAmJiB0aGlzLnNob3dEYXRlcGlja2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXR0aW5nTm90UHJlcHJvY2Vzc2VkRGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXJcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Rm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kIGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzU2FtZURheShzZWxlY3RlZFZhbHVlLCB0aGlzLmRhdGVFbmQpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcihzZWxlY3RlZFZhbHVlLCB0aGlzLmRhdGVFbmQpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhcj8uaW5zdGFuY2U/LnJlcGFpbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRHhEZWZhdWx0Q2FsZW5kYXJGb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGVFbmQnXSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZUVuZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlRW5kRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1NhbWVEYXkoc2VsZWN0ZWRWYWx1ZSwgdGhpcy5kYXRlU3RhcnQpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcih0aGlzLmRhdGVTdGFydCwgc2VsZWN0ZWRWYWx1ZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRHhEZWZhdWx0Q2FsZW5kYXJGb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snZmlyc3REYXlPZldlZWsnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyByYW5kb21JZFJlZmVyZW5jZTogbnVtYmVyID0gTWF0aC5mbG9vcihcclxuICAgICAgICBNYXRoLnJhbmRvbSgpICogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcclxuICAgICk7XHJcblxyXG4gICAgcHVibGljIHNldERhdGVSYW5nZURlZmluaXRpb25zKGRlZmluaXRpb25zOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2VEZWZpbml0aW9uPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlRGVmaW5pdGlvbnMgPSBkZWZpbml0aW9ucztcclxuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VHJhbnNsYXRpb25zKHRyYW5zbGF0aW9uczogUGVyaW9kUGlja2VyVHJhbnNsYXRpb25zKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDdXN0b21UZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldExvY2FsZXMobG9jYWxlczogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubG9jYWxlcyA9IGxvY2FsZXM7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVMb2NhbGVzQ2hhbmdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzZWxlY3RlZERhdGVTdGFydEZvY3VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBzZWxlY3RlZERhdGVFbmRGb2N1cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuc2VsZWN0ZWREYXRlRm9jdXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc01pbmltdW1MaW1pdCgpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBpbnN0YW5jZW9mIERhdGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLm1pbkRhdGUpIHx8XHJcbiAgICAgICAgICAgICAgICBpc0JlZm9yZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLm1pbkRhdGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzTWF4aW11bUxpbWl0KCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5tYXhEYXRlIGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMubWF4RGF0ZSkgfHxcclxuICAgICAgICAgICAgICAgIGlzQWZ0ZXIodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5tYXhEYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRGF0ZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZUZyb21FdmVudCA9IG5ldyBEYXRlKGV2ZW50LnZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcmFjdGl2ZUNoYW5nZSA9IGV2ZW50LmV2ZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGludGVyYWN0aXZlQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVTdGFydEZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdGFydERhdGVDaGFuZ2Uoc2VsZWN0ZWREYXRlRnJvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZERhdGVFbmRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShzZWxlY3RlZERhdGVGcm9tRXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVTdGFydERhdGVDaGFuZ2UobmV3RGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBuZXdEYXRlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXdEYXRlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaW5pdENhbGVuZGFyVmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzQWZ0ZXIobmV3RGF0ZSwgdGhpcy5zZWxlY3RlZERhdGVFbmQgYXMgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gbmV3RGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUVuZERhdGVDaGFuZ2UobmV3RGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gbmV3RGF0ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNhbGVuZGFyID0gbmV3RGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBkYXRlIGlzIGJlZm9yZSBzdGFydCBkYXRlIC0+IHNldCBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgIGlzQmVmb3JlKG5ld0RhdGUsIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgYXMgRGF0ZSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBuZXdEYXRlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN0YXJ0RGF0ZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTdGFydERhdGVDaGFuZ2UoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25FbmREYXRlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUVuZERhdGVDaGFuZ2UoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25SYW5nZUtleVJlbGVhc2VkKGV2ZW50OiBLZXlib2FyZEV2ZW50LCByYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nRGF0ZVJhbmdlKHJhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3RhcnREYXRlRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0Q2FsZW5kYXJWYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENhbGVuZGFyVmFsdWUgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25FbmREYXRlRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVFbmQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFwcGx5UGVyaW9kUGlja2VyKCkge1xyXG4gICAgICAgIHRoaXMuaGlkaW5nQ29uZmlybWVkRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNob3dpbmdDYWxlbmRhclBvcG92ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5oaWRpbmdDb25maXJtZWREYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbmdsZURhdGVQaWNrZXJCb3g/Lmluc3RhbmNlLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0T2xkID0gdGhpcy5zZWxlY3RlZERhdGVTdGFydDtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRW5kT2xkID0gdGhpcy5zZWxlY3RlZERhdGVFbmQ7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTZXR0aW5nTm90UHJlcHJvY2Vzc2VkRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydEJveD8uaW5zdGFuY2UuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TdGFydERhdGVGb2N1cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZURhdGVwaWNrZXJQb3B1cChlbWl0Q2hhbmdlID0gdHJ1ZSkge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLnNob3dEYXRlcGlja2VyKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWRpbmdDb25maXJtZWREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnRPbGQsIHRoaXMuZGF0ZUVuZE9sZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnRPbGQsIHRoaXMuZGF0ZUVuZE9sZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5oaWRpbmdDb25maXJtZWREYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERhdGVSYW5nZUJ1dHRvbil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGVSYW5nZUJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKHtmb2N1c1Zpc2libGU6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uSGlkZGVuQ2FsZW5kYXJQb3BvdmVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xvc2VEYXRlcGlja2VyUG9wdXAoKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRTZWxlY3RlZERhdGUoXHJcbiAgICAgICAgZGF0ZVN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLFxyXG4gICAgICAgIGRhdGVFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUsXHJcbiAgICAgICAgZW1pdENoYW5nZSA9IHRydWVcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBkYXRlU3RhcnQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBkYXRlRW5kO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gdGhpcy5zZWxlY3Rpb25LaW5kID09PSAnc2luZ2xlJyA/IGRhdGVTdGFydCA6IGRhdGVFbmQ7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGVtaXRDaGFuZ2UpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RhcnROZXcgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVFbmROZXcgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlQ2hhbmdlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGF0ZVN0YXJ0T2xkIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNTYW1lRGF5KHRoaXMuZGF0ZVN0YXJ0T2xkLCBkYXRlU3RhcnROZXcpKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRlU3RhcnRPbGQgPT09ICdzdHJpbmcnICYmIHRoaXMuZGF0ZVN0YXJ0T2xkID09PSAnJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlQ2hhbmdlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGF0ZUVuZE9sZCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzU2FtZURheSh0aGlzLmRhdGVFbmRPbGQsIGRhdGVFbmROZXcpKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRlRW5kT2xkID09PSAnc3RyaW5nJyAmJiB0aGlzLmRhdGVFbmRPbGQgPT09ICcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0T2xkID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbmREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZE9sZCA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRlQ2hhbmdlZCB8fCBlbmREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kQ2hhbmdlLmVtaXQoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnb1RvTmV4dERhdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5nZXROZXh0RGF0ZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUobmV3RGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoISh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSkgfHwgISh0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXROZXh0UmFuZ2VDYWxsYmFjayhcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ29Ub1ByZXZpb3VzRGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmdldFByZXZpb3VzRGF0ZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUobmV3RGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlKSB8fCAhKHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFByZXZpb3VzUmFuZ2VDYWxsYmFjayhcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc2V0TmV4dFByZXZpb3VzRGF5KHNldE5leHQ6IGFueSkge1xyXG4gICAgLy8gICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgLy8gICAgIGxldCBuZXdEYXRlID0gc2V0TmV4dFxyXG4gICAgLy8gICAgICAgICA/IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogMSB9KVxyXG4gICAgLy8gICAgICAgICA6IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogLTEgfSk7XHJcblxyXG4gICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZShuZXdEYXRlKTtcclxuICAgIC8vICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShuZXdEYXRlLCBuZXdEYXRlKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dERheShjdXJyZW50RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk6IHN0cmluZyB8IG51bWJlciB8IERhdGUge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBhZGQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBhcyBEYXRlLCB7IGRheXM6IDEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByZXZpb3VzRGF5KGN1cnJlbnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogLTEgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXROZXh0UmFuZ2UoY3VycmVudFN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgY3VycmVudEVuZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0ge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldFJhbmdlKFxyXG4gICAgICAgICAgICBuZXcgRGF0ZShjdXJyZW50U3RhcnREYXRlKSxcclxuICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudEVuZERhdGUpLFxyXG4gICAgICAgICAgICAnbmV4dCdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmV2aW91c1JhbmdlKGN1cnJlbnRTdGFydERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIGN1cnJlbnRFbmREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogW3N0cmluZyB8IG51bWJlciB8IERhdGUsIHN0cmluZyB8IG51bWJlciB8IERhdGVdIHtcclxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRSYW5nZShcclxuICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudFN0YXJ0RGF0ZSksXHJcbiAgICAgICAgICAgIG5ldyBEYXRlKGN1cnJlbnRFbmREYXRlKSxcclxuICAgICAgICAgICAgJ3ByZXZpb3VzJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldE5leHRQcmV2aW91c1JhbmdlKHNldE5leHQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICEodGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUpIHx8XHJcbiAgICAgICAgICAgICEodGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0UmFuZ2UoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxyXG4gICAgICAgICAgICBzZXROZXh0ID8gJ25leHQnIDogJ3ByZXZpb3VzJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VsbENzc0NsYXNzKGRhdGU6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgICAgIGxldCBjc3MgPSAnJztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGVFbmRBc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBpc0FmdGVyKGNhbGVuZGFyRGF0ZSwgc3RhcnRPZkRheShzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSkpICYmXHJcbiAgICAgICAgICAgICAgICBpc0JlZm9yZShjYWxlbmRhckRhdGUsIHN0YXJ0T2ZEYXkoc2VsZWN0ZWREYXRlRW5kQXNEYXRlKSkgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSgoZGF5KSA9PiBpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBkYXkpKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNzcyArPSAnIGJnLXByaW1hcnktbGlnaHQgdGV4dC1kYXJrIHJvdW5kZWQtMCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYW1lRGF5KGNhbGVuZGFyRGF0ZSwgc2VsZWN0ZWREYXRlU3RhcnRBc0RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3NzICs9ICcgYmctcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtc3RhcnQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZURheShjYWxlbmRhckRhdGUsIHNlbGVjdGVkRGF0ZUVuZEFzRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjc3MgKz0gJyBiZy1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1lbmQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdEVuZERhdGUoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gXCJwZXJpb2RcIiAmJiB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Rm9jdXMgJiYgdGhpcy5jYWxlbmRhckNlbGxDbGlja2VkKGV2ZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpe1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93RGF0ZXBpY2tlcikge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNvZGUgPT09ICdFbnRlcicgfHwgZXZlbnQuY29kZSA9PT0gJ051bXBhZEVudGVyJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVBlcmlvZFBpY2tlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxlbmRhckNlbGxDbGlja2VkKGV2ZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIGN1cnJlbnQgRFggaW1wbGVtZW50YXRpb24gc28gaXRcclxuICAgICAgICAvLyBtdXN0IGJlIHJlLWNoZWNrZWQgYWZ0ZXIgZWFjaCBtYWpvciB1cGRhdGUgb2YgdGhlIERYIGNvbXBvbmVudHNcclxuICAgICAgICAvLyBBbHNvIGNoZWNrIGlmIGR4LWNhbGVuZGFyIHByb3ZpZGVzIGluZm8gYWJvdXQgY2xpY2tlZCBlbGVtZW50IGJ5XHJcbiAgICAgICAgLy8gZGVzaWduLlxyXG4gICAgICAgIGNvbnN0IHRhcmdldFBhcmVudENsYXNzTGlzdCA9IGV2ZW50LnRhcmdldD8ub2Zmc2V0UGFyZW50Py5jbGFzc0xpc3Q7XHJcbiAgICAgICAgaWYgKCF0YXJnZXRQYXJlbnRDbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc0NhbGVuZGFyQ2VsbCA9IFsuLi50YXJnZXRQYXJlbnRDbGFzc0xpc3RdLmluY2x1ZGVzKCdkeC1jYWxlbmRhci1jZWxsJyk7XHJcbiAgICAgICAgcmV0dXJuIGlzQ2FsZW5kYXJDZWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTG9jYWxlc0NoYW5nZSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBhcHBseSBuZXcgbG9jYWxlIHRvIERYXHJcbiAgICAgICAgLy8gaWYgYXJyYXkgb2YgbG9jYWxlcyB3YXMgcHJvdmlkZWQgdXNlIGZpcnN0IG9uZVxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb2NhbGVzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBsb2NhbGUodGhpcy5sb2NhbGVzKTtcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5sb2NhbGVzKSAmJiB0aGlzLmxvY2FsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsb2NhbGUodGhpcy5sb2NhbGVzWzBdKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRCb3g/Lmluc3RhbmNlLnJlcGFpbnQoKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZEJveD8uaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgICAgIHRoaXMuc2luZ2xlRGF0ZVBpY2tlckJveD8uaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXI/Lmluc3RhbmNlLnJlcGFpbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUN1c3RvbVRleHQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRlUmFuZ2UubmFtZSA9IHRoaXMudHJhbnNsYXRpb25zPy5jdXN0b21cclxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9ucy5jdXN0b21cclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICcjZGF0ZXBpY2tlcmNvbXBvbmVudCAuZHgtY2FsZW5kYXItc2VsZWN0ZWQtZGF0ZSdcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbWVudCAmJlxyXG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdkeC1jYWxlbmRhci1zZWxlY3RlZC1kYXRlJylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0Py5yZW1vdmUoJ2R4LWNhbGVuZGFyLXNlbGVjdGVkLWRhdGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKXtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UobmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCksIG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KSwgbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9XHJcbiAgICAgICAgICAgICF0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ0RhdGVSYW5nZShyYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gcmFuZ2U7XHJcblxyXG4gICAgICAgIGlmIChyYW5nZSA9PT0gdGhpcy5jdXN0b21EYXRlUmFuZ2UpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5vcGVuRGF0ZXBpY2tlclBvcHVwKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgID8gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gcmFuZ2UuZGF0ZVRvID8gcmFuZ2UuZGF0ZVRvIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnQsIHRoaXMuZGF0ZUVuZCwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0RhdGVEaXNhYmxlZCA9IChhcmdzOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAgICAgICBpZiAodGhpcy5sb2NrQmVmb3JlRGF0ZSAmJiBpc0JlZm9yZShhcmdzLmRhdGUsIHRoaXMubG9ja0JlZm9yZURhdGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERhdGVzLnNvbWUoKGRheSkgPT4gaXNTYW1lRGF5KGFyZ3MuZGF0ZSwgZGF5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtYXRjaERhdGVSYW5nZShkYXRlRnJvbT86IERhdGUsIGRhdGVUbz86IERhdGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRhdGVGcm9tIHx8ICFkYXRlVG8pIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRlUmFuZ2UgPSB0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzLmZpbHRlcihcclxuICAgICAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoeC5kYXRlRnJvbSBhcyBEYXRlLCBkYXRlRnJvbSkgJiZcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh4LmRhdGVUbyBhcyBEYXRlLCBkYXRlVG8pXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZGF0ZVJhbmdlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gZGF0ZVJhbmdlWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB0aGlzLmN1c3RvbURhdGVSYW5nZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXREYXRlUmFuZ2VUZXh0KGRhdGVGcm9tPzogRGF0ZSwgZGF0ZVRvPzogRGF0ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlTmFtZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSAnJztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gJyc7XHJcblxyXG4gICAgICAgIGlmICghKGRhdGVGcm9tIGluc3RhbmNlb2YgRGF0ZSkgfHwgIShkYXRlVG8gaW5zdGFuY2VvZiBEYXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSRVNPTFZFIFBFUklPRFxyXG4gICAgICAgIC8vIG9uZSBkYXlcclxuICAgICAgICBpZiAoaXNTYW1lRGF5KGRhdGVGcm9tLCBkYXRlVG8pKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zaW5nbGVEYXlGb3JtYXRGbiAhPT0gJ3VuZGVmaW5lZCcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuc2luZ2xlRGF5Rm9ybWF0Rm4oZGF0ZUZyb20pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlRnJvbSk7ICAvL3NraXAgZGF5IG5hbWUsIGFzIHdlIGhhdmUgY3VzdG9tIHRleHQuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoZGF0ZUZyb20sICdkYXktbG9uZycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRhdGUgcmFuZ2VcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGF0ZSByYW5nZSAtIHVzZSBwcm92aWRlZCBkYXRlUmFuZ2UgZm9ybWF0IGZ1bmN0aW9uIChpZiBkZWZpbmVkKVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF0ZVJhbmdlRm9ybWF0Rm4gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5kYXRlUmFuZ2VGb3JtYXRGbihkYXRlRnJvbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gdGhpcy5kYXRlUmFuZ2VGb3JtYXRGbihkYXRlVG8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGZ1bGwgbW9udGhcclxuICAgICAgICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZUZyb20sIHN0YXJ0T2ZNb250aChkYXRlRnJvbSkpICYmXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZVRvLCBlbmRPZk1vbnRoKGRhdGVUbykpICYmXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVNb250aChkYXRlRnJvbSwgZGF0ZVRvKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZyb20sXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vbnRoJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIC0gdXNlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgZnVuY3Rpb25cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5mb3JtYXREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVGcm9tLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZUZyb20sIHRvZGF5KSA/ICdkYXktc2hvcnQnIDogJ2RheSdcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gdGhpcy5mb3JtYXREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVUbyxcclxuICAgICAgICAgICAgICAgICAgICBpc1NhbWVZZWFyKGRhdGVUbywgdG9kYXkpID8gJ2RheS1zaG9ydCcgOiAnZGF5J1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAhPSB0aGlzLmN1c3RvbURhdGVSYW5nZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdwcmVkZWZpbmVkUmFuZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlTmFtZSA9IHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UubmFtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VOYW1lID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lICsgJywgJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBASW5wdXQoKSBwdWJsaWMgc3R5bGU6ICdjbGFzc2ljJyB8ICdjb21wYWN0JyA9ICdjbGFzc2ljJztcclxuICAgICAgICAvLyBASW5wdXQoKSBwdWJsaWMgY29tcGFjdFN0eWxlRGlzcGxheTogJ2RhdGUnIHwgJ3ByZWRlZmluZWRSYW5nZScgfCAnYm90aCcgPSAncHJlZGVmaW5lZFJhbmdlJztcclxuICAgICAgICAvLyBpZiAodGhpcy5zdHlsZSA9PSAnY29tcGFjdCcgJiYgdGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdwcmVkZWZpbmVkUmFuZ2UnICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAhPSB0aGlzLmN1c3RvbURhdGVSYW5nZSkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lO1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gJyc7XHJcbiAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLm5hbWU7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcclxuICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvcm1hdERhdGUoXHJcbiAgICAgICAgZGF0ZTogRGF0ZSxcclxuICAgICAgICB0eXBlPzogJ21vbnRoJyB8ICdkYXknIHwgJ2RheS1sb25nJyB8ICdkYXktc2hvcnQnIHwgdW5kZWZpbmVkXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FzZSAnZGF5LWxvbmcnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjYXNlICdkYXktc2hvcnQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZURhdGVSYW5nZXMoZm9yY2U/OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgdG9kYXkgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGZvcmNlIHx8XHJcbiAgICAgICAgICAgICF0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZSB8fFxyXG4gICAgICAgICAgICAhaXNTYW1lRGF5KHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXNHZW5lcmF0ZWREYXRlLCB0b2RheSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGUgPSB0b2RheTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXMgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRQcmVkZWZpbmVkRGF0ZVJhbmdlcyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVSYW5nZURlZmluaXRpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5LFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REYXlPZldlZWtcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZXMgPSBbLi4udGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc107XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlcy5wdXNoKHRoaXMuY3VzdG9tRGF0ZVJhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzXHJcbn1cclxuIiwiPCEtLSA8ZGl2IGlkPVwiZGF0ZXBpY2tlcmJ1dHRvbnNcIj4gLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJkYXRlcGlja2VyIGQtaW5saW5lLWZsZXggYmctd2hpdGUgc2RzLW5vLXByaW50XCJcclxuICAgICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29tcG9uZW50QXJpYUxhYmVsXCJcclxuICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxyXG4gICAgPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGUgPT0gJ2NsYXNzaWMnXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWdyb3VwXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicGlja2VyUHJlZGVmaW5lZFJhbmdlRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnRuIGJ0bi13aGl0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRlZC1zdGFydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItZW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHAtMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJkYXRlUmFuZ2VEZWZpbml0aW9uc1dpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcy0yIG1zLTEgbWUtMSBkYXRlLXJhbmdlLXRleHQgdGV4dC10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZERhdGVSYW5nZS5uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBkYXRlLXJhbmdlLWRyb3Bkb3duLWJ1dHRvbiBzZHMtZnctNDAwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJvcGVuRGF0ZVJhbmdlRGVmaW5pdGlvbnNBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImVsZW1lbnRVVUlEICsgJ19wcmVkZWZpbmVkX3BlcmlvZHNfZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPGR4LXBvcG92ZXJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJlbGVtZW50VVVJRCArICdfcHJlZGVmaW5lZF9wZXJpb2RzX2Ryb3Bkb3duJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiI3BpY2tlclByZWRlZmluZWRSYW5nZURyb3Bkb3due3sgcmFuZG9tSWRSZWZlcmVuY2UgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICBbKHZpc2libGUpXT1cInNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbd3JhcHBlckF0dHJdPVwieyBjbGFzczogJ3Nkcy1kYXRlcGlja2VyLXJhbmdlcy1wb3BvdmVyIHNkcy1keC1wb3B1cC1uby1hcnJvdycgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21pbldpZHRoXT1cImRhdGVSYW5nZURlZmluaXRpb25zV2lkdGhcIlxyXG5cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCIgY2RrVHJhcEZvY3VzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByYW5nZSBvZiBkYXRlUmFuZ2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByZWRlZmluZWQtZGF0ZS1yYW5nZSBweC0zIHB5LTIgdy0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJyYW5nZSA9PT0gc2VsZWN0ZWREYXRlUmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ0RhdGVSYW5nZShyYW5nZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUmFuZ2VLZXlSZWxlYXNlZCgkZXZlbnQsIHJhbmdlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3JhbmdlLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9keC1wb3BvdmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXIgYm9yZGVyLWVuZC0wIHBlLTIgc2RzLWZ3LTQwMFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5yb3VuZGVkLXN0YXJ0XSA9IFwic3R5bGUgPT0gJ2NvbXBhY3QnIHx8ICghZGF0ZVJhbmdlRGVmaW5pdGlvbnMgfHwgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwKVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItc3RhcnQtMF0gPSBcInN0eWxlID09ICdjbGFzc2ljJyAmJiBkYXRlUmFuZ2VEZWZpbml0aW9ucy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicHJldmlvdXNQZXJpb2RBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNaW5pbXVtTGltaXQgfHwgZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub1ByZXZpb3VzRGF0ZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInByZXZpb3VzUGVyaW9kSWNvblwiPjwvZmEtaWNvbj5cclxuXHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uXHJcbiAgICAgICAgICAgIGlkPVwicGlja2VyRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXItdG9wIGJvcmRlci1ib3R0b20gdGV4dC10cnVuY2F0ZSBweC0wIHNlbGVjdGVkLXBlcmlvZCBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgW2NsYXNzLnJvdW5kZWQtc3RhcnRdID0gXCIoIWRhdGVSYW5nZURlZmluaXRpb25zIHx8IGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA9PT0gMCkgJiYgIXNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zXCJcclxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zdGFydF0gPSBcIighZGF0ZVJhbmdlRGVmaW5pdGlvbnMgfHwgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwKSAmJiAhc2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBbY2xhc3Mucm91bmRlZC1lbmRdID0gXCIhc2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWVuZF0gPSBcIiFzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVwaWNrZXIgPSAhc2hvd0RhdGVwaWNrZXJcIlxyXG4gICAgICAgID5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwidXNlQ3VzdG9tRGlzcGxheUNvbnRlbnRcIiBzZWxlY3Q9XCJkaXNwbGF5XCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXVzZUN1c3RvbURpc3BsYXlDb250ZW50XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJteC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiY2FsZW5kYXJJY29uXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTEgdGV4dC10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm14LTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ0b0ljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50Mn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgYm9yZGVyIHJvdW5kZWQtZW5kIGJvcmRlci1zdGFydC0wIHBzLTIgc2RzLWZ3LTQwMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5leHRQZXJpb2RBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNYXhpbXVtTGltaXQgfHwgZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub05leHREYXRlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwibmV4dFBlcmlvZEljb25cIj48L2ZhLWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic2RzLXByaW50LW9ubHkgaC0xMDBcIj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJ1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiIHNlbGVjdD1cImRpc3BsYXlcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiF1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm14LTFcIj5cclxuICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImNhbGVuZGFySWNvblwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMSB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXgtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwidG9JY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJ9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjxkeC1wb3BvdmVyXHJcbiAgICB0YXJnZXQ9XCIjcGlja2VyRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICBwb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICBbKHZpc2libGUpXT1cInNob3dEYXRlcGlja2VyXCJcclxuICAgIChvbkhpZGluZyk9XCJvbkhpZGRlbkNhbGVuZGFyUG9wb3ZlcigpXCJcclxuICAgIChvblNob3dpbmcpPVwib25TaG93aW5nQ2FsZW5kYXJQb3BvdmVyKClcIlxyXG4gICAgY2xhc3M9XCJtLTAgcC0wXCJcclxuICAgIFt3cmFwcGVyQXR0cl09XCJ7XHJcbiAgICAgICAgY2xhc3M6ICdzZHMtZGF0ZXBpY2tlci1wb3BvdmVyICcgKyBkcm9wZG93bldyYXBwZXJDbGFzcyxcclxuICAgICAgICBpZDogZHJvcGRvd25XcmFwcGVySWRcclxuICAgIH1cIlxyXG4+XHJcbiAgICA8ZHhvLWFuaW1hdGlvbj5cclxuICAgICAgICA8ZHhvLXNob3dcclxuICAgICAgICAgICAgdHlwZT1cInBvcFwiXHJcbiAgICAgICAgICAgIFtmcm9tXT1cInsgc2NhbGU6IDAuOSB9XCJcclxuICAgICAgICAgICAgW3RvXT1cInsgc2NhbGU6IDEgfVwiXHJcbiAgICAgICAgPjwvZHhvLXNob3c+XHJcbiAgICAgICAgPGR4by1oaWRlXHJcbiAgICAgICAgICAgIHR5cGU9XCJmYWRlXCJcclxuICAgICAgICAgICAgW2Zyb21dPVwiMVwiXHJcbiAgICAgICAgICAgIFt0b109XCIwXCJcclxuICAgICAgICA+PC9keG8taGlkZT5cclxuICAgIDwvZHhvLWFuaW1hdGlvbj5cclxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIiAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiIHRhYmluZGV4PVwiMVwiPlxyXG4gICAgICAgIDxkeC1zY3JvbGwtdmlldz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0eWxlID09ICdjb21wYWN0JyAmJiBkYXRlUmFuZ2VzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHAtMyBiZy1ncmF5LTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1icy1ncmF5LTIwMClcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidHJhbnNsYXRpb25zLnByZXNldHNcIiBjbGFzcz1cInB4LTMgcHktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgdHJhbnNsYXRpb25zLnByZXNldHMgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJhbmdlIG9mIGRhdGVSYW5nZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcmVkZWZpbmVkLWRhdGUtcmFuZ2UgcHgtMyBweS0yIHctMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJyYW5nZSA9PT0gc2VsZWN0ZWREYXRlUmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nRGF0ZVJhbmdlKHJhbmdlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tyYW5nZS5uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImRhdGVwaWNrZXJjb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkYXRlLWlucHV0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBweC0zIHB0LTMgcGItMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWRhdGUtYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZVN0YXJ0Qm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgcC0xIG0tMCB0ZXh0LWNlbnRlciByb3VuZGVkIGRhdGVwaWNrZXItaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVJbnB1dF09XCJzZWxlY3RlZERhdGVGb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEcm9wRG93bkJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJkYXRlSW5wdXREaXNwbGF5Rm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1ZhbGlkXT1cImlzVmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZERhdGVTdGFydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uU3RhcnREYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzSW4pPVwib25TdGFydERhdGVGb2N1cygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtZGF0ZS1ib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBweC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJ0b0ljb25cIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWRhdGUtYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZUVuZEJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZCBkYXRlcGlja2VyLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlSW5wdXRdPVwiIXNlbGVjdGVkRGF0ZUZvY3VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Ryb3BEb3duQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlTWFza0JlaGF2aW9yXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cImRhdGVJbnB1dERpc3BsYXlGb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGUgfHwgbWluRGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWF4RGF0ZSB8fCBtYXhEYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzVmFsaWRdPVwiaXNWYWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25FcnJvcl09XCJ2YWxpZGF0aW9uRXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRGF0ZUVuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uRW5kRGF0ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c0luKT1cIm9uRW5kRGF0ZUZvY3VzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy13aGl0ZSBteC0yIHB4LTIgcHktMiBkYXRlLXBpY2tlci1kYXRlLXNlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImRhdGUtaW5wdXRzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBwLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWRhdGUtYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzaW5nbGVEYXRlUGlja2VyQm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZCBkYXRlcGlja2VyLWlucHV0IGRhdGVwaWNrZXItaW5wdXQtbGFyZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlSW5wdXRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Ryb3BEb3duQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZGF0ZUlucHV0RGlzcGxheUZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzVmFsaWRdPVwiaXNWYWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyh2YWx1ZSldPVwic2VsZWN0ZWREYXRlSW50ZXJuYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWRhdGUtYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKG9uVmFsdWVDaGFuZ2VkKT1cIiBjbG9zZURhdGVwaWNrZXJQb3B1cCgpXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RW5kRGF0ZSgkZXZlbnQpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZERhdGVzXT1cImlzRGF0ZURpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnID8gc2VsZWN0ZWREYXRlQ2FsZW5kYXIgOiBzZWxlY3RlZERhdGVJbnRlcm5hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwiZmlyc3REYXlPZldlZWtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmR4VGVtcGxhdGU9XCJsZXQgY2VsbERhdGEgb2YgJ2NlbGwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidoLTEwMCBwdC0xJyArIGdldENlbGxDc3NDbGFzcyhjZWxsRGF0YS5kYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5saW5lLWhlaWdodC5weF09XCIyM1wiXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxvY2tCZWZvcmVEYXRlICYmIChjZWxsRGF0YS5kYXRlIHwgc2RzRGF0ZUNvbXBhcmU6IGxvY2tCZWZvcmVEYXRlIDogJ2x0ZScpOyB0aGVuIHRoZW5Mb2NrQmxvY2sgZWxzZSBlbHNlRGVmYXVsdEJsb2NrXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGhlbkxvY2tCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFt0aXRsZV09XCJsb2NrQmVmb3JlRGF0ZUhpbnRcIiBbaWNvbl09XCJsb2NrSWNvblwiICBjbGFzcz1cImxvY2tlZC1kYXkgcG9zaXRpb24tYWJzb2x1dGUteFwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlRGVmYXVsdEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbERhdGEudGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBweC0zIHB0LTIgcGItM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IHNkcy1mdy00MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RGF0ZXBpY2tlciA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0cmFuc2xhdGlvbnMuY2FuY2VsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKGNsaWNrKT1cImNsb3NlRGF0ZXBpY2tlclBvcHVwKClcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXMtMSBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQZXJpb2RQaWNrZXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdHJhbnNsYXRpb25zLmFwcGx5fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cclxuICAgIDwvZGl2PlxyXG48L2R4LXBvcG92ZXI+XHJcbjwhLS0gPC9kaXY+IC0tPlxyXG5cclxuIl19