cmat 0.0.3

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 (680) hide show
  1. package/README.md +3 -0
  2. package/animations/defaults.d.ts +11 -0
  3. package/animations/drop.d.ts +2 -0
  4. package/animations/expand-collapse.d.ts +2 -0
  5. package/animations/fade.d.ts +11 -0
  6. package/animations/index.d.ts +5 -0
  7. package/animations/public-api.d.ts +1 -0
  8. package/animations/shake.d.ts +2 -0
  9. package/animations/slide.d.ts +9 -0
  10. package/animations/transform.d.ts +2 -0
  11. package/animations/zoom.d.ts +3 -0
  12. package/components/adapter/datetime-adapter.d.ts +45 -0
  13. package/components/adapter/datetime-formats.d.ts +22 -0
  14. package/components/adapter/dayjs-date-adapter.d.ts +63 -0
  15. package/components/adapter/dayjs-date-formats.d.ts +2 -0
  16. package/components/adapter/dayjs-datetime-adapter.d.ts +22 -0
  17. package/components/adapter/dayjs-datetime-formats.d.ts +2 -0
  18. package/components/adapter/index.d.ts +5 -0
  19. package/components/adapter/native-datetime-adapter.d.ts +31 -0
  20. package/components/adapter/native-datetime-formats.d.ts +2 -0
  21. package/components/adapter/public-api.d.ts +8 -0
  22. package/components/breadcrumb/breadcrumb-item.directive.d.ts +10 -0
  23. package/components/breadcrumb/breadcrumb.component.d.ts +57 -0
  24. package/components/breadcrumb/breadcrumb.component.scss +18 -0
  25. package/components/breadcrumb/breadcrumb.service.d.ts +126 -0
  26. package/components/breadcrumb/index.d.ts +5 -0
  27. package/components/breadcrumb/public-api.d.ts +3 -0
  28. package/components/breadcrumb/types/breadcrumb.config.d.ts +33 -0
  29. package/components/breadcrumb/types/breadcrumb.d.ts +23 -0
  30. package/components/card/card.component.d.ts +20 -0
  31. package/components/card/card.component.scss +63 -0
  32. package/components/card/card.types.d.ts +1 -0
  33. package/components/card/index.d.ts +5 -0
  34. package/components/card/public-api.d.ts +1 -0
  35. package/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.d.ts +14 -0
  36. package/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.scss +43 -0
  37. package/components/cascade/cascade-list/cascade-list.component.d.ts +52 -0
  38. package/components/cascade/cascade-list/cascade-list.component.scss +22 -0
  39. package/components/cascade/cascade-menu/cascade-menu.component.d.ts +10 -0
  40. package/components/cascade/cascade-menu/cascade-menu.component.scss +48 -0
  41. package/components/cascade/index.d.ts +5 -0
  42. package/components/cascade/options.interface.d.ts +8 -0
  43. package/components/cascade/public-api.d.ts +2 -0
  44. package/components/date-range/date-range.component.d.ts +134 -0
  45. package/components/date-range/date-range.component.scss +232 -0
  46. package/components/date-range/index.d.ts +5 -0
  47. package/components/date-range/public-api.d.ts +1 -0
  48. package/components/drawer/drawer.component.d.ts +75 -0
  49. package/components/drawer/drawer.component.scss +133 -0
  50. package/components/drawer/drawer.service.d.ts +26 -0
  51. package/components/drawer/drawer.types.d.ts +2 -0
  52. package/components/drawer/index.d.ts +5 -0
  53. package/components/drawer/public-api.d.ts +3 -0
  54. package/components/fullscreen/fullscreen.component.d.ts +18 -0
  55. package/components/fullscreen/fullscreen.types.d.ts +13 -0
  56. package/components/fullscreen/index.d.ts +5 -0
  57. package/components/fullscreen/public-api.d.ts +2 -0
  58. package/components/highlight/highlight.component.d.ts +21 -0
  59. package/components/highlight/highlight.component.scss +3 -0
  60. package/components/highlight/highlight.service.d.ts +7 -0
  61. package/components/highlight/index.d.ts +5 -0
  62. package/components/highlight/public-api.d.ts +2 -0
  63. package/components/masonry/index.d.ts +5 -0
  64. package/components/masonry/masonry.component.d.ts +13 -0
  65. package/components/masonry/public-api.d.ts +1 -0
  66. package/components/material-color-picker/base-color.d.ts +1 -0
  67. package/components/material-color-picker/index.d.ts +5 -0
  68. package/components/material-color-picker/material-color-picker.component.d.ts +35 -0
  69. package/components/material-color-picker/material-color-picker.component.scss +5 -0
  70. package/components/material-color-picker/public-api.d.ts +2 -0
  71. package/components/material-color-picker/selected-color.d.ts +5 -0
  72. package/components/material-datetimepicker/calendar-body.d.ts +43 -0
  73. package/components/material-datetimepicker/calendar-body.scss +58 -0
  74. package/components/material-datetimepicker/calendar.d.ts +146 -0
  75. package/components/material-datetimepicker/calendar.scss +194 -0
  76. package/components/material-datetimepicker/clock.d.ts +74 -0
  77. package/components/material-datetimepicker/clock.scss +90 -0
  78. package/components/material-datetimepicker/datetimepicker-animations.d.ts +4 -0
  79. package/components/material-datetimepicker/datetimepicker-content.scss +151 -0
  80. package/components/material-datetimepicker/datetimepicker-errors.d.ts +1 -0
  81. package/components/material-datetimepicker/datetimepicker-filtertype.d.ts +5 -0
  82. package/components/material-datetimepicker/datetimepicker-input.d.ts +106 -0
  83. package/components/material-datetimepicker/datetimepicker-intl.d.ts +51 -0
  84. package/components/material-datetimepicker/datetimepicker-toggle.d.ts +40 -0
  85. package/components/material-datetimepicker/datetimepicker-types.d.ts +13 -0
  86. package/components/material-datetimepicker/datetimepicker.d.ts +195 -0
  87. package/components/material-datetimepicker/datetimepicker.scss +145 -0
  88. package/components/material-datetimepicker/index.d.ts +5 -0
  89. package/components/material-datetimepicker/month-view.d.ts +64 -0
  90. package/components/material-datetimepicker/multi-year-view.d.ts +74 -0
  91. package/components/material-datetimepicker/public-api.d.ts +9 -0
  92. package/components/material-datetimepicker/time.d.ts +129 -0
  93. package/components/material-datetimepicker/time.scss +82 -0
  94. package/components/material-datetimepicker/year-view.d.ts +56 -0
  95. package/components/navigation/horizontal/components/basic/basic.component.d.ts +27 -0
  96. package/components/navigation/horizontal/components/branch/branch.component.d.ts +39 -0
  97. package/components/navigation/horizontal/components/divider/divider.component.d.ts +23 -0
  98. package/components/navigation/horizontal/components/spacer/spacer.component.d.ts +23 -0
  99. package/components/navigation/horizontal/horizontal.component.d.ts +43 -0
  100. package/components/navigation/horizontal/horizontal.component.scss +167 -0
  101. package/components/navigation/index.d.ts +5 -0
  102. package/components/navigation/navigation.service.d.ts +71 -0
  103. package/components/navigation/navigation.types.d.ts +34 -0
  104. package/components/navigation/public-api.d.ts +4 -0
  105. package/components/navigation/vertical/components/aside/aside.component.d.ts +63 -0
  106. package/components/navigation/vertical/components/basic/basic.component.d.ts +30 -0
  107. package/components/navigation/vertical/components/collapsable/collapsable.component.d.ts +74 -0
  108. package/components/navigation/vertical/components/divider/divider.component.d.ts +26 -0
  109. package/components/navigation/vertical/components/group/group.component.d.ts +36 -0
  110. package/components/navigation/vertical/components/spacer/spacer.component.d.ts +26 -0
  111. package/components/navigation/vertical/styles/appearances/compact.scss +103 -0
  112. package/components/navigation/vertical/styles/appearances/default.scss +550 -0
  113. package/components/navigation/vertical/styles/appearances/dense.scss +171 -0
  114. package/components/navigation/vertical/styles/appearances/thin.scss +91 -0
  115. package/components/navigation/vertical/vertical.component.d.ts +176 -0
  116. package/components/navigation/vertical/vertical.component.scss +4 -0
  117. package/components/pagination/index.d.ts +5 -0
  118. package/components/pagination/pagination.component.d.ts +24 -0
  119. package/components/pagination/pagination.directive.d.ts +40 -0
  120. package/components/pagination/pagination.instance.d.ts +11 -0
  121. package/components/pagination/pagination.pipe.d.ts +29 -0
  122. package/components/pagination/pagination.service.d.ts +20 -0
  123. package/components/pagination/public-api.d.ts +4 -0
  124. package/components/password-strength/animations/index.d.ts +4 -0
  125. package/components/password-strength/enum.d.ts +13 -0
  126. package/components/password-strength/index.d.ts +5 -0
  127. package/components/password-strength/mat-pass-toggle-visibility/mat-pass-toggle-visibility.component.d.ts +11 -0
  128. package/components/password-strength/mat-password-strength/mat-password-strength.component.d.ts +52 -0
  129. package/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.d.ts +16 -0
  130. package/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.scss +19 -0
  131. package/components/password-strength/mat-password-strength-validator.d.ts +6 -0
  132. package/components/password-strength/public-api.d.ts +3 -0
  133. package/components/password-strength/regexp.class.d.ts +6 -0
  134. package/components/popover/index.d.ts +5 -0
  135. package/components/popover/popover.component.d.ts +139 -0
  136. package/components/popover/popover.component.scss +174 -0
  137. package/components/popover/popover.errors.d.ts +14 -0
  138. package/components/popover/popover.interfaces.d.ts +44 -0
  139. package/components/popover/popover.type.d.ts +5 -0
  140. package/components/popover/public-api.d.ts +1 -0
  141. package/components/progress-bar/index.d.ts +5 -0
  142. package/components/progress-bar/progress-bar.component.d.ts +17 -0
  143. package/components/progress-bar/progress-bar.component.scss +7 -0
  144. package/components/progress-bar/public-api.d.ts +1 -0
  145. package/components/rating/index.d.ts +5 -0
  146. package/components/rating/public-api.d.ts +1 -0
  147. package/components/rating/rating.component.d.ts +28 -0
  148. package/components/rating/rating.component.scss +33 -0
  149. package/components/select-search/default-options.d.ts +8 -0
  150. package/components/select-search/index.d.ts +5 -0
  151. package/components/select-search/public-api.d.ts +2 -0
  152. package/components/select-search/select-no-entries-found.directive.d.ts +5 -0
  153. package/components/select-search/select-search-clear.directive.d.ts +5 -0
  154. package/components/select-search/select-search.component.d.ts +91 -0
  155. package/components/select-search/select-search.component.scss +126 -0
  156. package/components/select-tree/index.d.ts +5 -0
  157. package/components/select-tree/public-api.d.ts +1 -0
  158. package/components/select-tree/select-tree.component.d.ts +85 -0
  159. package/components/select-tree/select-tree.component.scss +54 -0
  160. package/components/select-tree/select-tree.flatnode.d.ts +6 -0
  161. package/components/select-tree/select-tree.node.d.ts +5 -0
  162. package/components/timeline/index.d.ts +5 -0
  163. package/components/timeline/public-api.d.ts +2 -0
  164. package/components/timeline/timeline-item/timeline-item.component.d.ts +25 -0
  165. package/components/timeline/timeline-item/timeline-item.component.scss +329 -0
  166. package/components/timeline/timeline.component.d.ts +32 -0
  167. package/components/timeline/timeline.component.scss +42 -0
  168. package/components/toast/index.d.ts +5 -0
  169. package/components/toast/models/global-config.model.d.ts +12 -0
  170. package/components/toast/models/toast.model.d.ts +6 -0
  171. package/components/toast/models/type.model.d.ts +12 -0
  172. package/components/toast/public-api.d.ts +2 -0
  173. package/components/toast/toast-modal.component.d.ts +18 -0
  174. package/components/toast/toast-modal.component.scss +119 -0
  175. package/components/toast/toast.component.d.ts +17 -0
  176. package/components/toast/toast.component.scss +62 -0
  177. package/components/toast/toast.service.d.ts +26 -0
  178. package/components/transfer-picker/filter/filter.component.d.ts +24 -0
  179. package/components/transfer-picker/filter/filter.component.scss +40 -0
  180. package/components/transfer-picker/index.d.ts +5 -0
  181. package/components/transfer-picker/interface.d.ts +42 -0
  182. package/components/transfer-picker/public-api.d.ts +7 -0
  183. package/components/transfer-picker/search/search.component.d.ts +14 -0
  184. package/components/transfer-picker/search/search.component.scss +7 -0
  185. package/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.d.ts +49 -0
  186. package/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.scss +25 -0
  187. package/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.d.ts +12 -0
  188. package/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.scss +27 -0
  189. package/components/transfer-picker/transfer-picker.component.d.ts +28 -0
  190. package/components/transfer-picker/transfer-picker.component.scss +8 -0
  191. package/components/transfer-picker/transfer-picker.service.d.ts +31 -0
  192. package/directives/animate-on-scroll/animate-on-scroll.directive.d.ts +29 -0
  193. package/directives/animate-on-scroll/index.d.ts +5 -0
  194. package/directives/animate-on-scroll/public-api.d.ts +1 -0
  195. package/directives/animate-on-scroll/scroll.service.d.ts +15 -0
  196. package/directives/autofocus/autofocus.directive.d.ts +10 -0
  197. package/directives/autofocus/index.d.ts +5 -0
  198. package/directives/autofocus/public-api.d.ts +1 -0
  199. package/directives/debounce/abstract-debounce.directive.d.ts +15 -0
  200. package/directives/debounce/debounce-click.directive.d.ts +8 -0
  201. package/directives/debounce/debounce-keyup.directive.d.ts +8 -0
  202. package/directives/debounce/index.d.ts +5 -0
  203. package/directives/debounce/public-api.d.ts +2 -0
  204. package/directives/digit-only/digit-only.directive.d.ts +34 -0
  205. package/directives/digit-only/index.d.ts +5 -0
  206. package/directives/digit-only/mask.directive.d.ts +14 -0
  207. package/directives/digit-only/public-api.d.ts +2 -0
  208. package/directives/equal-validator/equal-validator.directive.d.ts +14 -0
  209. package/directives/equal-validator/index.d.ts +5 -0
  210. package/directives/equal-validator/public-api.d.ts +1 -0
  211. package/esm2022/animations/cmat-animations.mjs +5 -0
  212. package/esm2022/animations/defaults.mjs +12 -0
  213. package/esm2022/animations/drop.mjs +26 -0
  214. package/esm2022/animations/expand-collapse.mjs +17 -0
  215. package/esm2022/animations/fade.mjs +170 -0
  216. package/esm2022/animations/public-api.mjs +19 -0
  217. package/esm2022/animations/shake.mjs +59 -0
  218. package/esm2022/animations/slide.mjs +124 -0
  219. package/esm2022/animations/transform.mjs +16 -0
  220. package/esm2022/animations/zoom.mjs +38 -0
  221. package/esm2022/cmat.mjs +5 -0
  222. package/esm2022/components/adapter/cmat-components-adapter.mjs +5 -0
  223. package/esm2022/components/adapter/datetime-adapter.mjs +127 -0
  224. package/esm2022/components/adapter/datetime-formats.mjs +3 -0
  225. package/esm2022/components/adapter/dayjs-date-adapter.mjs +198 -0
  226. package/esm2022/components/adapter/dayjs-date-formats.mjs +12 -0
  227. package/esm2022/components/adapter/dayjs-datetime-adapter.mjs +100 -0
  228. package/esm2022/components/adapter/dayjs-datetime-formats.mjs +21 -0
  229. package/esm2022/components/adapter/native-datetime-adapter.mjs +130 -0
  230. package/esm2022/components/adapter/native-datetime-formats.mjs +15 -0
  231. package/esm2022/components/adapter/public-api.mjs +9 -0
  232. package/esm2022/components/breadcrumb/breadcrumb-item.directive.mjs +19 -0
  233. package/esm2022/components/breadcrumb/breadcrumb.component.mjs +95 -0
  234. package/esm2022/components/breadcrumb/breadcrumb.service.mjs +336 -0
  235. package/esm2022/components/breadcrumb/cmat-components-breadcrumb.mjs +5 -0
  236. package/esm2022/components/breadcrumb/public-api.mjs +4 -0
  237. package/esm2022/components/breadcrumb/types/breadcrumb.config.mjs +2 -0
  238. package/esm2022/components/breadcrumb/types/breadcrumb.mjs +2 -0
  239. package/esm2022/components/card/card.component.mjs +58 -0
  240. package/esm2022/components/card/card.types.mjs +2 -0
  241. package/esm2022/components/card/cmat-components-card.mjs +5 -0
  242. package/esm2022/components/card/public-api.mjs +2 -0
  243. package/esm2022/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.mjs +53 -0
  244. package/esm2022/components/cascade/cascade-list/cascade-list.component.mjs +263 -0
  245. package/esm2022/components/cascade/cascade-menu/cascade-menu.component.mjs +29 -0
  246. package/esm2022/components/cascade/cmat-components-cascade.mjs +5 -0
  247. package/esm2022/components/cascade/options.interface.mjs +2 -0
  248. package/esm2022/components/cascade/public-api.mjs +3 -0
  249. package/esm2022/components/date-range/cmat-components-date-range.mjs +5 -0
  250. package/esm2022/components/date-range/date-range.component.mjs +540 -0
  251. package/esm2022/components/date-range/public-api.mjs +2 -0
  252. package/esm2022/components/drawer/cmat-components-drawer.mjs +5 -0
  253. package/esm2022/components/drawer/drawer.component.mjs +301 -0
  254. package/esm2022/components/drawer/drawer.service.mjs +41 -0
  255. package/esm2022/components/drawer/drawer.types.mjs +2 -0
  256. package/esm2022/components/drawer/public-api.mjs +4 -0
  257. package/esm2022/components/fullscreen/cmat-components-fullscreen.mjs +5 -0
  258. package/esm2022/components/fullscreen/fullscreen.component.mjs +101 -0
  259. package/esm2022/components/fullscreen/fullscreen.types.mjs +2 -0
  260. package/esm2022/components/fullscreen/public-api.mjs +3 -0
  261. package/esm2022/components/highlight/cmat-components-highlight.mjs +5 -0
  262. package/esm2022/components/highlight/highlight.component.mjs +80 -0
  263. package/esm2022/components/highlight/highlight.service.mjs +47 -0
  264. package/esm2022/components/highlight/public-api.mjs +3 -0
  265. package/esm2022/components/masonry/cmat-components-masonry.mjs +5 -0
  266. package/esm2022/components/masonry/masonry.component.mjs +54 -0
  267. package/esm2022/components/masonry/public-api.mjs +2 -0
  268. package/esm2022/components/material-color-picker/base-color.mjs +13 -0
  269. package/esm2022/components/material-color-picker/cmat-components-material-color-picker.mjs +5 -0
  270. package/esm2022/components/material-color-picker/material-color-picker.component.mjs +138 -0
  271. package/esm2022/components/material-color-picker/public-api.mjs +3 -0
  272. package/esm2022/components/material-color-picker/selected-color.mjs +3 -0
  273. package/esm2022/components/material-datetimepicker/calendar-body.mjs +80 -0
  274. package/esm2022/components/material-datetimepicker/calendar.mjs +678 -0
  275. package/esm2022/components/material-datetimepicker/clock.mjs +293 -0
  276. package/esm2022/components/material-datetimepicker/cmat-components-material-datetimepicker.mjs +5 -0
  277. package/esm2022/components/material-datetimepicker/datetimepicker-animations.mjs +34 -0
  278. package/esm2022/components/material-datetimepicker/datetimepicker-errors.mjs +6 -0
  279. package/esm2022/components/material-datetimepicker/datetimepicker-filtertype.mjs +8 -0
  280. package/esm2022/components/material-datetimepicker/datetimepicker-input.mjs +340 -0
  281. package/esm2022/components/material-datetimepicker/datetimepicker-intl.mjs +63 -0
  282. package/esm2022/components/material-datetimepicker/datetimepicker-toggle.mjs +88 -0
  283. package/esm2022/components/material-datetimepicker/datetimepicker-types.mjs +2 -0
  284. package/esm2022/components/material-datetimepicker/datetimepicker.mjs +534 -0
  285. package/esm2022/components/material-datetimepicker/month-view.mjs +146 -0
  286. package/esm2022/components/material-datetimepicker/multi-year-view.mjs +198 -0
  287. package/esm2022/components/material-datetimepicker/public-api.mjs +10 -0
  288. package/esm2022/components/material-datetimepicker/time.mjs +456 -0
  289. package/esm2022/components/material-datetimepicker/year-view.mjs +125 -0
  290. package/esm2022/components/navigation/cmat-components-navigation.mjs +5 -0
  291. package/esm2022/components/navigation/horizontal/components/basic/basic.component.mjs +70 -0
  292. package/esm2022/components/navigation/horizontal/components/branch/branch.component.mjs +83 -0
  293. package/esm2022/components/navigation/horizontal/components/divider/divider.component.mjs +47 -0
  294. package/esm2022/components/navigation/horizontal/components/spacer/spacer.component.mjs +47 -0
  295. package/esm2022/components/navigation/horizontal/horizontal.component.mjs +88 -0
  296. package/esm2022/components/navigation/navigation.service.mjs +140 -0
  297. package/esm2022/components/navigation/navigation.types.mjs +3 -0
  298. package/esm2022/components/navigation/public-api.mjs +5 -0
  299. package/esm2022/components/navigation/vertical/components/aside/aside.component.mjs +162 -0
  300. package/esm2022/components/navigation/vertical/components/basic/basic.component.mjs +76 -0
  301. package/esm2022/components/navigation/vertical/components/collapsable/collapsable.component.mjs +279 -0
  302. package/esm2022/components/navigation/vertical/components/divider/divider.component.mjs +56 -0
  303. package/esm2022/components/navigation/vertical/components/group/group.component.mjs +79 -0
  304. package/esm2022/components/navigation/vertical/components/spacer/spacer.component.mjs +56 -0
  305. package/esm2022/components/navigation/vertical/vertical.component.mjs +586 -0
  306. package/esm2022/components/pagination/cmat-components-pagination.mjs +5 -0
  307. package/esm2022/components/pagination/pagination.component.mjs +71 -0
  308. package/esm2022/components/pagination/pagination.directive.mjs +197 -0
  309. package/esm2022/components/pagination/pagination.instance.mjs +2 -0
  310. package/esm2022/components/pagination/pagination.pipe.mjs +100 -0
  311. package/esm2022/components/pagination/pagination.service.mjs +90 -0
  312. package/esm2022/components/pagination/public-api.mjs +5 -0
  313. package/esm2022/components/password-strength/animations/index.mjs +48 -0
  314. package/esm2022/components/password-strength/cmat-components-password-strength.mjs +5 -0
  315. package/esm2022/components/password-strength/enum.mjs +17 -0
  316. package/esm2022/components/password-strength/mat-pass-toggle-visibility/mat-pass-toggle-visibility.component.mjs +27 -0
  317. package/esm2022/components/password-strength/mat-password-strength/mat-password-strength.component.mjs +206 -0
  318. package/esm2022/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.mjs +151 -0
  319. package/esm2022/components/password-strength/mat-password-strength-validator.mjs +36 -0
  320. package/esm2022/components/password-strength/public-api.mjs +4 -0
  321. package/esm2022/components/password-strength/regexp.class.mjs +8 -0
  322. package/esm2022/components/popover/cmat-components-popover.mjs +5 -0
  323. package/esm2022/components/popover/popover.component.mjs +350 -0
  324. package/esm2022/components/popover/popover.errors.mjs +27 -0
  325. package/esm2022/components/popover/popover.interfaces.mjs +2 -0
  326. package/esm2022/components/popover/popover.type.mjs +2 -0
  327. package/esm2022/components/popover/public-api.mjs +2 -0
  328. package/esm2022/components/progress-bar/cmat-components-progress-bar.mjs +5 -0
  329. package/esm2022/components/progress-bar/progress-bar.component.mjs +55 -0
  330. package/esm2022/components/progress-bar/public-api.mjs +2 -0
  331. package/esm2022/components/rating/cmat-components-rating.mjs +5 -0
  332. package/esm2022/components/rating/public-api.mjs +2 -0
  333. package/esm2022/components/rating/rating.component.mjs +91 -0
  334. package/esm2022/components/select-search/cmat-components-select-search.mjs +5 -0
  335. package/esm2022/components/select-search/default-options.mjs +16 -0
  336. package/esm2022/components/select-search/public-api.mjs +3 -0
  337. package/esm2022/components/select-search/select-no-entries-found.directive.mjs +14 -0
  338. package/esm2022/components/select-search/select-search-clear.directive.mjs +14 -0
  339. package/esm2022/components/select-search/select-search.component.mjs +488 -0
  340. package/esm2022/components/select-tree/cmat-components-select-tree.mjs +5 -0
  341. package/esm2022/components/select-tree/public-api.mjs +2 -0
  342. package/esm2022/components/select-tree/select-tree.component.mjs +458 -0
  343. package/esm2022/components/select-tree/select-tree.flatnode.mjs +3 -0
  344. package/esm2022/components/select-tree/select-tree.node.mjs +3 -0
  345. package/esm2022/components/timeline/cmat-components-timeline.mjs +5 -0
  346. package/esm2022/components/timeline/public-api.mjs +3 -0
  347. package/esm2022/components/timeline/timeline-item/timeline-item.component.mjs +68 -0
  348. package/esm2022/components/timeline/timeline.component.mjs +114 -0
  349. package/esm2022/components/toast/cmat-components-toast.mjs +5 -0
  350. package/esm2022/components/toast/models/global-config.model.mjs +2 -0
  351. package/esm2022/components/toast/models/toast.model.mjs +2 -0
  352. package/esm2022/components/toast/models/type.model.mjs +2 -0
  353. package/esm2022/components/toast/public-api.mjs +3 -0
  354. package/esm2022/components/toast/toast-modal.component.mjs +53 -0
  355. package/esm2022/components/toast/toast.component.mjs +30 -0
  356. package/esm2022/components/toast/toast.service.mjs +122 -0
  357. package/esm2022/components/transfer-picker/cmat-components-transfer-picker.mjs +5 -0
  358. package/esm2022/components/transfer-picker/filter/filter.component.mjs +85 -0
  359. package/esm2022/components/transfer-picker/interface.mjs +17 -0
  360. package/esm2022/components/transfer-picker/public-api.mjs +8 -0
  361. package/esm2022/components/transfer-picker/search/search.component.mjs +34 -0
  362. package/esm2022/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.mjs +178 -0
  363. package/esm2022/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.mjs +34 -0
  364. package/esm2022/components/transfer-picker/transfer-picker.component.mjs +82 -0
  365. package/esm2022/components/transfer-picker/transfer-picker.service.mjs +134 -0
  366. package/esm2022/directives/animate-on-scroll/animate-on-scroll.directive.mjs +126 -0
  367. package/esm2022/directives/animate-on-scroll/cmat-directives-animate-on-scroll.mjs +5 -0
  368. package/esm2022/directives/animate-on-scroll/public-api.mjs +2 -0
  369. package/esm2022/directives/animate-on-scroll/scroll.service.mjs +38 -0
  370. package/esm2022/directives/autofocus/autofocus.directive.mjs +20 -0
  371. package/esm2022/directives/autofocus/cmat-directives-autofocus.mjs +5 -0
  372. package/esm2022/directives/autofocus/public-api.mjs +2 -0
  373. package/esm2022/directives/debounce/abstract-debounce.directive.mjs +34 -0
  374. package/esm2022/directives/debounce/cmat-directives-debounce.mjs +5 -0
  375. package/esm2022/directives/debounce/debounce-click.directive.mjs +25 -0
  376. package/esm2022/directives/debounce/debounce-keyup.directive.mjs +25 -0
  377. package/esm2022/directives/debounce/public-api.mjs +3 -0
  378. package/esm2022/directives/digit-only/cmat-directives-digit-only.mjs +5 -0
  379. package/esm2022/directives/digit-only/digit-only.directive.mjs +282 -0
  380. package/esm2022/directives/digit-only/mask.directive.mjs +69 -0
  381. package/esm2022/directives/digit-only/public-api.mjs +3 -0
  382. package/esm2022/directives/equal-validator/cmat-directives-equal-validator.mjs +5 -0
  383. package/esm2022/directives/equal-validator/equal-validator.directive.mjs +54 -0
  384. package/esm2022/directives/equal-validator/public-api.mjs +2 -0
  385. package/esm2022/lib/mock-api/cmat-lib-mock-api.mjs +5 -0
  386. package/esm2022/lib/mock-api/mock-api.constants.mjs +3 -0
  387. package/esm2022/lib/mock-api/mock-api.interceptor.mjs +73 -0
  388. package/esm2022/lib/mock-api/mock-api.request-handler.mjs +48 -0
  389. package/esm2022/lib/mock-api/mock-api.service.mjs +93 -0
  390. package/esm2022/lib/mock-api/mock-api.types.mjs +2 -0
  391. package/esm2022/lib/mock-api/mock-api.utils.mjs +17 -0
  392. package/esm2022/lib/mock-api/public-api.mjs +6 -0
  393. package/esm2022/pipes/bytes/bytes.pipe.mjs +25 -0
  394. package/esm2022/pipes/bytes/cmat-pipes-bytes.mjs +5 -0
  395. package/esm2022/pipes/bytes/public-api.mjs +2 -0
  396. package/esm2022/pipes/date-format/cmat-pipes-date-format.mjs +5 -0
  397. package/esm2022/pipes/date-format/date-format.pipe.mjs +18 -0
  398. package/esm2022/pipes/date-format/public-api.mjs +2 -0
  399. package/esm2022/pipes/find-by-key/cmat-pipes-find-by-key.mjs +5 -0
  400. package/esm2022/pipes/find-by-key/find-by-key.pipe.mjs +23 -0
  401. package/esm2022/pipes/find-by-key/public-api.mjs +2 -0
  402. package/esm2022/pipes/group-by/cmat-pipes-group-by.mjs +5 -0
  403. package/esm2022/pipes/group-by/group-by.pipe.mjs +29 -0
  404. package/esm2022/pipes/group-by/public-api.mjs +2 -0
  405. package/esm2022/pipes/keys/cmat-pipes-keys.mjs +5 -0
  406. package/esm2022/pipes/keys/keys.pipe.mjs +26 -0
  407. package/esm2022/pipes/keys/public-api.mjs +2 -0
  408. package/esm2022/pipes/secure/cmat-pipes-secure.mjs +5 -0
  409. package/esm2022/pipes/secure/public-api.mjs +2 -0
  410. package/esm2022/pipes/secure/secure-pipe.mjs +43 -0
  411. package/esm2022/pipes/uppercase/cmat-pipes-uppercase.mjs +5 -0
  412. package/esm2022/pipes/uppercase/public-api.mjs +2 -0
  413. package/esm2022/pipes/uppercase/uppercase.pipe.mjs +17 -0
  414. package/esm2022/public-api.mjs +2 -0
  415. package/esm2022/services/alert/alert.dialog.mjs +12 -0
  416. package/esm2022/services/alert/alert.message.mjs +9 -0
  417. package/esm2022/services/alert/alert.service.mjs +165 -0
  418. package/esm2022/services/alert/cmat-services-alert.mjs +5 -0
  419. package/esm2022/services/alert/enum.mjs +15 -0
  420. package/esm2022/services/alert/public-api.mjs +5 -0
  421. package/esm2022/services/config/cmat-services-config.mjs +5 -0
  422. package/esm2022/services/config/config.constants.mjs +3 -0
  423. package/esm2022/services/config/config.service.mjs +35 -0
  424. package/esm2022/services/config/public-api.mjs +4 -0
  425. package/esm2022/services/config/urlStateConfig.service.mjs +30 -0
  426. package/esm2022/services/confirmation/cmat-services-confirmation.mjs +5 -0
  427. package/esm2022/services/confirmation/confirmation.service.mjs +51 -0
  428. package/esm2022/services/confirmation/confirmation.types.mjs +2 -0
  429. package/esm2022/services/confirmation/dialog/dialog.component.mjs +25 -0
  430. package/esm2022/services/confirmation/public-api.mjs +3 -0
  431. package/esm2022/services/data/cmat-services-data.mjs +5 -0
  432. package/esm2022/services/data/data.service.mjs +169 -0
  433. package/esm2022/services/data/public-api.mjs +2 -0
  434. package/esm2022/services/loading/cmat-services-loading.mjs +5 -0
  435. package/esm2022/services/loading/loading.interceptor.mjs +29 -0
  436. package/esm2022/services/loading/loading.service.mjs +72 -0
  437. package/esm2022/services/loading/public-api.mjs +3 -0
  438. package/esm2022/services/local-storage/cmat-services-local-storage.mjs +5 -0
  439. package/esm2022/services/local-storage/local-storage.service.mjs +22 -0
  440. package/esm2022/services/local-storage/public-api.mjs +2 -0
  441. package/esm2022/services/media-watcher/cmat-services-media-watcher.mjs +5 -0
  442. package/esm2022/services/media-watcher/media-watcher.service.mjs +55 -0
  443. package/esm2022/services/media-watcher/public-api.mjs +2 -0
  444. package/esm2022/services/platform/cmat-services-platform.mjs +5 -0
  445. package/esm2022/services/platform/platform.service.mjs +46 -0
  446. package/esm2022/services/platform/public-api.mjs +2 -0
  447. package/esm2022/services/splash-screen/cmat-services-splash-screen.mjs +5 -0
  448. package/esm2022/services/splash-screen/public-api.mjs +2 -0
  449. package/esm2022/services/splash-screen/splash-screen.service.mjs +42 -0
  450. package/esm2022/services/title/cmat-services-title.mjs +5 -0
  451. package/esm2022/services/title/public-api.mjs +2 -0
  452. package/esm2022/services/title/title.service.mjs +46 -0
  453. package/esm2022/services/translation/cmat-services-translation.mjs +5 -0
  454. package/esm2022/services/translation/public-api.mjs +2 -0
  455. package/esm2022/services/translation/translation.service.mjs +62 -0
  456. package/esm2022/services/utils/cmat-services-utils.mjs +5 -0
  457. package/esm2022/services/utils/public-api.mjs +2 -0
  458. package/esm2022/services/utils/utils.service.mjs +391 -0
  459. package/esm2022/validators/cmat-validators.mjs +5 -0
  460. package/esm2022/validators/public-api.mjs +2 -0
  461. package/esm2022/validators/validators.mjs +33 -0
  462. package/esm2022/version/cmat-version.mjs +5 -0
  463. package/esm2022/version/public-api.mjs +2 -0
  464. package/esm2022/version/version.mjs +11 -0
  465. package/fesm2022/cmat-animations.mjs +466 -0
  466. package/fesm2022/cmat-animations.mjs.map +1 -0
  467. package/fesm2022/cmat-components-adapter.mjs +600 -0
  468. package/fesm2022/cmat-components-adapter.mjs.map +1 -0
  469. package/fesm2022/cmat-components-breadcrumb.mjs +449 -0
  470. package/fesm2022/cmat-components-breadcrumb.mjs.map +1 -0
  471. package/fesm2022/cmat-components-card.mjs +65 -0
  472. package/fesm2022/cmat-components-card.mjs.map +1 -0
  473. package/fesm2022/cmat-components-cascade.mjs +334 -0
  474. package/fesm2022/cmat-components-cascade.mjs.map +1 -0
  475. package/fesm2022/cmat-components-date-range.mjs +547 -0
  476. package/fesm2022/cmat-components-date-range.mjs.map +1 -0
  477. package/fesm2022/cmat-components-drawer.mjs +346 -0
  478. package/fesm2022/cmat-components-drawer.mjs.map +1 -0
  479. package/fesm2022/cmat-components-fullscreen.mjs +108 -0
  480. package/fesm2022/cmat-components-fullscreen.mjs.map +1 -0
  481. package/fesm2022/cmat-components-highlight.mjs +131 -0
  482. package/fesm2022/cmat-components-highlight.mjs.map +1 -0
  483. package/fesm2022/cmat-components-masonry.mjs +61 -0
  484. package/fesm2022/cmat-components-masonry.mjs.map +1 -0
  485. package/fesm2022/cmat-components-material-color-picker.mjs +160 -0
  486. package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -0
  487. package/fesm2022/cmat-components-material-datetimepicker.mjs +2976 -0
  488. package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -0
  489. package/fesm2022/cmat-components-navigation.mjs +1656 -0
  490. package/fesm2022/cmat-components-navigation.mjs.map +1 -0
  491. package/fesm2022/cmat-components-pagination.mjs +455 -0
  492. package/fesm2022/cmat-components-pagination.mjs.map +1 -0
  493. package/fesm2022/cmat-components-password-strength.mjs +489 -0
  494. package/fesm2022/cmat-components-password-strength.mjs.map +1 -0
  495. package/fesm2022/cmat-components-popover.mjs +383 -0
  496. package/fesm2022/cmat-components-popover.mjs.map +1 -0
  497. package/fesm2022/cmat-components-progress-bar.mjs +62 -0
  498. package/fesm2022/cmat-components-progress-bar.mjs.map +1 -0
  499. package/fesm2022/cmat-components-rating.mjs +98 -0
  500. package/fesm2022/cmat-components-rating.mjs.map +1 -0
  501. package/fesm2022/cmat-components-select-search.mjs +531 -0
  502. package/fesm2022/cmat-components-select-search.mjs.map +1 -0
  503. package/fesm2022/cmat-components-select-tree.mjs +467 -0
  504. package/fesm2022/cmat-components-select-tree.mjs.map +1 -0
  505. package/fesm2022/cmat-components-timeline.mjs +186 -0
  506. package/fesm2022/cmat-components-timeline.mjs.map +1 -0
  507. package/fesm2022/cmat-components-toast.mjs +205 -0
  508. package/fesm2022/cmat-components-toast.mjs.map +1 -0
  509. package/fesm2022/cmat-components-transfer-picker.mjs +536 -0
  510. package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -0
  511. package/fesm2022/cmat-directives-animate-on-scroll.mjs +166 -0
  512. package/fesm2022/cmat-directives-animate-on-scroll.mjs.map +1 -0
  513. package/fesm2022/cmat-directives-autofocus.mjs +27 -0
  514. package/fesm2022/cmat-directives-autofocus.mjs.map +1 -0
  515. package/fesm2022/cmat-directives-debounce.mjs +85 -0
  516. package/fesm2022/cmat-directives-debounce.mjs.map +1 -0
  517. package/fesm2022/cmat-directives-digit-only.mjs +356 -0
  518. package/fesm2022/cmat-directives-digit-only.mjs.map +1 -0
  519. package/fesm2022/cmat-directives-equal-validator.mjs +61 -0
  520. package/fesm2022/cmat-directives-equal-validator.mjs.map +1 -0
  521. package/fesm2022/cmat-lib-mock-api.mjs +232 -0
  522. package/fesm2022/cmat-lib-mock-api.mjs.map +1 -0
  523. package/fesm2022/cmat-pipes-bytes.mjs +32 -0
  524. package/fesm2022/cmat-pipes-bytes.mjs.map +1 -0
  525. package/fesm2022/cmat-pipes-date-format.mjs +25 -0
  526. package/fesm2022/cmat-pipes-date-format.mjs.map +1 -0
  527. package/fesm2022/cmat-pipes-find-by-key.mjs +30 -0
  528. package/fesm2022/cmat-pipes-find-by-key.mjs.map +1 -0
  529. package/fesm2022/cmat-pipes-group-by.mjs +36 -0
  530. package/fesm2022/cmat-pipes-group-by.mjs.map +1 -0
  531. package/fesm2022/cmat-pipes-keys.mjs +33 -0
  532. package/fesm2022/cmat-pipes-keys.mjs.map +1 -0
  533. package/fesm2022/cmat-pipes-secure.mjs +50 -0
  534. package/fesm2022/cmat-pipes-secure.mjs.map +1 -0
  535. package/fesm2022/cmat-pipes-uppercase.mjs +24 -0
  536. package/fesm2022/cmat-pipes-uppercase.mjs.map +1 -0
  537. package/fesm2022/cmat-services-alert.mjs +207 -0
  538. package/fesm2022/cmat-services-alert.mjs.map +1 -0
  539. package/fesm2022/cmat-services-config.mjs +69 -0
  540. package/fesm2022/cmat-services-config.mjs.map +1 -0
  541. package/fesm2022/cmat-services-confirmation.mjs +79 -0
  542. package/fesm2022/cmat-services-confirmation.mjs.map +1 -0
  543. package/fesm2022/cmat-services-data.mjs +176 -0
  544. package/fesm2022/cmat-services-data.mjs.map +1 -0
  545. package/fesm2022/cmat-services-loading.mjs +104 -0
  546. package/fesm2022/cmat-services-loading.mjs.map +1 -0
  547. package/fesm2022/cmat-services-local-storage.mjs +29 -0
  548. package/fesm2022/cmat-services-local-storage.mjs.map +1 -0
  549. package/fesm2022/cmat-services-media-watcher.mjs +62 -0
  550. package/fesm2022/cmat-services-media-watcher.mjs.map +1 -0
  551. package/fesm2022/cmat-services-platform.mjs +53 -0
  552. package/fesm2022/cmat-services-platform.mjs.map +1 -0
  553. package/fesm2022/cmat-services-splash-screen.mjs +49 -0
  554. package/fesm2022/cmat-services-splash-screen.mjs.map +1 -0
  555. package/fesm2022/cmat-services-title.mjs +53 -0
  556. package/fesm2022/cmat-services-title.mjs.map +1 -0
  557. package/fesm2022/cmat-services-translation.mjs +69 -0
  558. package/fesm2022/cmat-services-translation.mjs.map +1 -0
  559. package/fesm2022/cmat-services-utils.mjs +398 -0
  560. package/fesm2022/cmat-services-utils.mjs.map +1 -0
  561. package/fesm2022/cmat-validators.mjs +39 -0
  562. package/fesm2022/cmat-validators.mjs.map +1 -0
  563. package/fesm2022/cmat-version.mjs +17 -0
  564. package/fesm2022/cmat-version.mjs.map +1 -0
  565. package/fesm2022/cmat.mjs +4 -0
  566. package/fesm2022/cmat.mjs.map +1 -0
  567. package/icons/CSV.svg +3 -0
  568. package/icons/EXCEL.svg +3 -0
  569. package/icons/FILE.svg +3 -0
  570. package/icons/GIF.svg +3 -0
  571. package/icons/JPG.svg +3 -0
  572. package/icons/PDF.svg +3 -0
  573. package/icons/PNG.svg +3 -0
  574. package/icons/PPT.svg +3 -0
  575. package/icons/TEXT.svg +3 -0
  576. package/icons/VIDEO.svg +3 -0
  577. package/icons/WORD.svg +3 -0
  578. package/icons/ZIP.svg +3 -0
  579. package/icons/arrow-cursor.svg +3 -0
  580. package/icons/material-icons/heroicons-outline.svg +893 -0
  581. package/icons/material-icons/heroicons-solid.svg +958 -0
  582. package/icons/material-icons/material-outline.svg +3586 -0
  583. package/icons/material-icons/material-solid.svg +3586 -0
  584. package/index.d.ts +5 -0
  585. package/lib/mock-api/index.d.ts +5 -0
  586. package/lib/mock-api/mock-api.constants.d.ts +2 -0
  587. package/lib/mock-api/mock-api.interceptor.d.ts +12 -0
  588. package/lib/mock-api/mock-api.request-handler.d.ts +18 -0
  589. package/lib/mock-api/mock-api.service.d.ts +22 -0
  590. package/lib/mock-api/mock-api.types.d.ts +9 -0
  591. package/lib/mock-api/mock-api.utils.d.ts +3 -0
  592. package/lib/mock-api/public-api.d.ts +5 -0
  593. package/package.json +344 -0
  594. package/pipes/bytes/bytes.pipe.d.ts +7 -0
  595. package/pipes/bytes/index.d.ts +5 -0
  596. package/pipes/bytes/public-api.d.ts +1 -0
  597. package/pipes/date-format/date-format.pipe.d.ts +7 -0
  598. package/pipes/date-format/index.d.ts +5 -0
  599. package/pipes/date-format/public-api.d.ts +1 -0
  600. package/pipes/find-by-key/find-by-key.pipe.d.ts +7 -0
  601. package/pipes/find-by-key/index.d.ts +5 -0
  602. package/pipes/find-by-key/public-api.d.ts +1 -0
  603. package/pipes/group-by/group-by.pipe.d.ts +7 -0
  604. package/pipes/group-by/index.d.ts +5 -0
  605. package/pipes/group-by/public-api.d.ts +1 -0
  606. package/pipes/keys/index.d.ts +5 -0
  607. package/pipes/keys/keys.pipe.d.ts +7 -0
  608. package/pipes/keys/public-api.d.ts +1 -0
  609. package/pipes/secure/index.d.ts +5 -0
  610. package/pipes/secure/public-api.d.ts +1 -0
  611. package/pipes/secure/secure-pipe.d.ts +18 -0
  612. package/pipes/uppercase/index.d.ts +5 -0
  613. package/pipes/uppercase/public-api.d.ts +1 -0
  614. package/pipes/uppercase/uppercase.pipe.d.ts +7 -0
  615. package/public-api.d.ts +1 -0
  616. package/services/alert/alert.dialog.d.ts +11 -0
  617. package/services/alert/alert.message.d.ts +8 -0
  618. package/services/alert/alert.service.d.ts +37 -0
  619. package/services/alert/enum.d.ts +12 -0
  620. package/services/alert/index.d.ts +5 -0
  621. package/services/alert/public-api.d.ts +4 -0
  622. package/services/config/config.constants.d.ts +6 -0
  623. package/services/config/config.service.d.ts +11 -0
  624. package/services/config/index.d.ts +5 -0
  625. package/services/config/public-api.d.ts +3 -0
  626. package/services/config/urlStateConfig.service.d.ts +10 -0
  627. package/services/confirmation/confirmation.service.d.ts +12 -0
  628. package/services/confirmation/confirmation.types.d.ts +21 -0
  629. package/services/confirmation/dialog/dialog.component.d.ts +10 -0
  630. package/services/confirmation/index.d.ts +5 -0
  631. package/services/confirmation/public-api.d.ts +2 -0
  632. package/services/data/data.service.d.ts +20 -0
  633. package/services/data/index.d.ts +5 -0
  634. package/services/data/public-api.d.ts +1 -0
  635. package/services/loading/index.d.ts +5 -0
  636. package/services/loading/loading.interceptor.d.ts +12 -0
  637. package/services/loading/loading.service.d.ts +24 -0
  638. package/services/loading/public-api.d.ts +2 -0
  639. package/services/local-storage/index.d.ts +5 -0
  640. package/services/local-storage/local-storage.service.d.ts +8 -0
  641. package/services/local-storage/public-api.d.ts +1 -0
  642. package/services/media-watcher/index.d.ts +5 -0
  643. package/services/media-watcher/media-watcher.service.d.ts +20 -0
  644. package/services/media-watcher/public-api.d.ts +1 -0
  645. package/services/platform/index.d.ts +5 -0
  646. package/services/platform/platform.service.d.ts +9 -0
  647. package/services/platform/public-api.d.ts +1 -0
  648. package/services/splash-screen/index.d.ts +5 -0
  649. package/services/splash-screen/public-api.d.ts +1 -0
  650. package/services/splash-screen/splash-screen.service.d.ts +14 -0
  651. package/services/title/index.d.ts +5 -0
  652. package/services/title/public-api.d.ts +1 -0
  653. package/services/title/title.service.d.ts +13 -0
  654. package/services/translation/index.d.ts +5 -0
  655. package/services/translation/public-api.d.ts +1 -0
  656. package/services/translation/translation.service.d.ts +20 -0
  657. package/services/utils/index.d.ts +5 -0
  658. package/services/utils/public-api.d.ts +1 -0
  659. package/services/utils/utils.service.d.ts +57 -0
  660. package/styles/components/input.scss +42 -0
  661. package/styles/main.scss +9 -0
  662. package/styles/overrides/angular-material.scss +1403 -0
  663. package/styles/overrides/fullcalendar.scss +550 -0
  664. package/styles/overrides/highlightjs.scss +81 -0
  665. package/styles/styles.scss +3 -0
  666. package/styles/tailwind.scss +86 -0
  667. package/styles/themes.scss +164 -0
  668. package/styles/user-themes.scss +1 -0
  669. package/tailwind/plugins/icon-size.js +49 -0
  670. package/tailwind/plugins/theming.js +256 -0
  671. package/tailwind/plugins/utilities.js +66 -0
  672. package/tailwind/utils/generate-contrasts.js +29 -0
  673. package/tailwind/utils/generate-palette.js +100 -0
  674. package/tailwind/utils/json-to-sass-map.js +67 -0
  675. package/validators/index.d.ts +5 -0
  676. package/validators/public-api.d.ts +1 -0
  677. package/validators/validators.d.ts +5 -0
  678. package/version/index.d.ts +5 -0
  679. package/version/public-api.d.ts +1 -0
  680. package/version/version.d.ts +9 -0
@@ -0,0 +1,540 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
2
+ import { FormControl, NG_VALUE_ACCESSOR, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
3
+ import { TemplatePortal } from '@angular/cdk/portal';
4
+ import { MatDatepickerModule } from '@angular/material/datepicker';
5
+ import { Subject } from 'rxjs';
6
+ import dayjs from 'dayjs';
7
+ import isBetween from 'dayjs/plugin/isBetween';
8
+ import { MatInputModule } from '@angular/material/input';
9
+ import { MatFormFieldModule } from '@angular/material/form-field';
10
+ import { MatIconModule } from '@angular/material/icon';
11
+ import { MatButtonModule } from '@angular/material/button';
12
+ import { NgIf } from '@angular/common';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/cdk/overlay";
15
+ import * as i2 from "@angular/material/button";
16
+ import * as i3 from "@angular/material/icon";
17
+ import * as i4 from "@angular/material/datepicker";
18
+ import * as i5 from "@angular/material/form-field";
19
+ import * as i6 from "@angular/material/input";
20
+ import * as i7 from "@angular/forms";
21
+ export class CmatDateRangeComponent {
22
+ constructor(_overlay, _viewContainerRef) {
23
+ this._overlay = _overlay;
24
+ this._viewContainerRef = _viewContainerRef;
25
+ this.rangeChanged = new EventEmitter();
26
+ this.activeDates = {
27
+ month1: null,
28
+ month2: null
29
+ };
30
+ this.setWhichDate = 'start';
31
+ this._range = {
32
+ start: null,
33
+ end: null
34
+ };
35
+ this._timeRegExp = new RegExp('^(0[0-9]|1[0-9]|2[0-4]|[0-9]):([0-5][0-9])(A|(?:AM)|P|(?:PM))?$', 'i');
36
+ this._unsubscribeAll = new Subject();
37
+ dayjs.extend(isBetween);
38
+ this._onChange = () => { };
39
+ this._onTouched = () => { };
40
+ this.dateFormat = 'YYYY/MM/DD';
41
+ this.timeFormat = '12';
42
+ // Initialize the component
43
+ this._init();
44
+ }
45
+ // -----------------------------------------------------------------------------------------------------
46
+ // @ Accessors
47
+ // -----------------------------------------------------------------------------------------------------
48
+ /**
49
+ * Setter & getter for dateFormat input */
50
+ get dateFormat() {
51
+ return this._dateFormat;
52
+ }
53
+ set dateFormat(value) {
54
+ // Return if the values are the same
55
+ if (this._dateFormat === value) {
56
+ return;
57
+ }
58
+ // Store the value
59
+ this._dateFormat = value;
60
+ }
61
+ /**
62
+ * Setter & getter for timeFormat input */
63
+ // eslint-disable-next-line @typescript-eslint/member-ordering
64
+ get timeFormat() {
65
+ return this._timeFormat;
66
+ }
67
+ set timeFormat(value) {
68
+ // Return if the values are the same
69
+ if (this._timeFormat === value) {
70
+ return;
71
+ }
72
+ // Set format based on the time format input
73
+ this._timeFormat = value === '12' ? 'hh:mmA' : 'HH:mm';
74
+ }
75
+ /**
76
+ * Setter & getter for timeRange input */
77
+ // eslint-disable-next-line @typescript-eslint/member-ordering
78
+ get timeRange() {
79
+ return this._timeRange;
80
+ }
81
+ set timeRange(value) {
82
+ // Return if the values are the same
83
+ if (this._timeRange === value) {
84
+ return;
85
+ }
86
+ // Store the value
87
+ this._timeRange = value;
88
+ // If the time range turned off...
89
+ if (!value && this._range.start && this._range.end) {
90
+ this.range = {
91
+ start: this._range.start.clone().startOf('day'),
92
+ end: this._range.end.clone().endOf('day')
93
+ };
94
+ }
95
+ }
96
+ /**
97
+ * Setter & getter for range input */
98
+ // eslint-disable-next-line @typescript-eslint/member-ordering
99
+ get range() {
100
+ if (this._range.start && this._range.end) {
101
+ // Clone the range start and end
102
+ const start = this._range.start.clone();
103
+ const end = this._range.end.clone();
104
+ // Build and return the range object
105
+ return {
106
+ startDate: start.clone().format(this.dateFormat),
107
+ startTime: this.timeRange ? start.clone().format(this.timeFormat) : null,
108
+ endDate: end.clone().format(this.dateFormat),
109
+ endTime: this.timeRange ? end.clone().format(this.timeFormat) : null
110
+ };
111
+ }
112
+ return void 0;
113
+ }
114
+ set range(value) {
115
+ if (!value) {
116
+ return;
117
+ }
118
+ // Check if the value is an object and has 'start' and 'end' values
119
+ if (!value.start || !value.end) {
120
+ console.error('Range input must have "start" and "end" properties!');
121
+ return;
122
+ }
123
+ // Check if we are setting an individual date or both of them
124
+ const whichDate = value.whichDate || null;
125
+ // Get the start and end dates as moment
126
+ const start = dayjs(value.start);
127
+ const end = dayjs(value.end);
128
+ // If we are only setting the start date...
129
+ if (whichDate === 'start') {
130
+ // Set the start date
131
+ this._range.start = start.clone();
132
+ // If the selected start date is after the end date...
133
+ if (this._range.end && this._range.start.isAfter(this._range.end)) {
134
+ // Set the end date to the start date but keep the end date's time
135
+ const endDate = start.clone().hour(this._range.end.hour()).minute(this._range.end.minute()).second(this._range.end.second());
136
+ // Test this new end date to see if it's ahead of the start date
137
+ if (this._range.start.isBefore(endDate)) {
138
+ // If it's, set the new end date
139
+ this._range.end = endDate;
140
+ }
141
+ else {
142
+ // Otherwise, set the end date same as the start date
143
+ this._range.end = start.clone();
144
+ }
145
+ }
146
+ }
147
+ // If we are only setting the end date...
148
+ if (whichDate === 'end') {
149
+ // Set the end date
150
+ this._range.end = end.clone();
151
+ // If the selected end date is before the start date...
152
+ if (this._range.start && this._range.start.isAfter(this._range.end)) {
153
+ // Set the start date to the end date but keep the start date's time
154
+ const startDate = end.clone().hour(this._range.start.hour()).minute(this._range.start.minute()).second(this._range.start.second());
155
+ // Test this new end date to see if it's ahead of the start date
156
+ if (this._range.end.isAfter(startDate)) {
157
+ // If it's, set the new start date
158
+ this._range.start = startDate;
159
+ }
160
+ else {
161
+ // Otherwise, set the start date same as the end date
162
+ this._range.start = end.clone();
163
+ }
164
+ }
165
+ }
166
+ // If we are setting both dates...
167
+ if (!whichDate) {
168
+ // Set the start date
169
+ this._range.start = start.clone();
170
+ // If the start date is before the end date, set the end date as normal.
171
+ // If the start date is after the end date, set the end date same as the start date.
172
+ this._range.end = start.isBefore(end) ? end.clone() : start.clone();
173
+ }
174
+ if (this._range.start && this._range.end) {
175
+ // Prepare another range object that holds the ISO formatted range dates
176
+ const range = {
177
+ start: this._range.start.clone().toISOString(),
178
+ end: this._range.end.clone().toISOString()
179
+ };
180
+ // Emit the range changed event with the range
181
+ this.rangeChanged.emit(range);
182
+ // Update the model with the range if the change was not a programmatic change
183
+ // Because programmatic changes trigger writeValue which triggers onChange and onTouched
184
+ // internally causing them to trigger twice which breaks the form's pristine and touched
185
+ // statuses.
186
+ if (!this._programmaticChange) {
187
+ this._onTouched(range);
188
+ this._onChange(range);
189
+ }
190
+ // Set the active dates
191
+ this.activeDates = {
192
+ month1: this._range.start.clone(),
193
+ month2: this._range.start.clone().add(1, 'month')
194
+ };
195
+ // Set the time form controls
196
+ this.startTimeFormControl.setValue(this._range.start.clone().format(this._timeFormat).toString());
197
+ this.endTimeFormControl.setValue(this._range.end.clone().format(this._timeFormat).toString());
198
+ }
199
+ // Run ngAfterContentInit on month views to trigger
200
+ // re-render on month views if they are available
201
+ if (this._matMonthView1 && this._matMonthView2) {
202
+ this._matMonthView1.ngAfterContentInit();
203
+ this._matMonthView2.ngAfterContentInit();
204
+ }
205
+ // Reset the programmatic change status
206
+ this._programmaticChange = false;
207
+ }
208
+ // -----------------------------------------------------------------------------------------------------
209
+ // @ Control Value Accessor
210
+ // -----------------------------------------------------------------------------------------------------
211
+ /**
212
+ * Update the form model on change
213
+ *
214
+ * @param fn
215
+ */
216
+ registerOnChange(fn) {
217
+ this._onChange = fn;
218
+ }
219
+ /**
220
+ * Update the form model on blur
221
+ *
222
+ * @param fn
223
+ */
224
+ registerOnTouched(fn) {
225
+ this._onTouched = fn;
226
+ }
227
+ /**
228
+ * Write to view from model when the form model changes programmatically
229
+ *
230
+ * @param range
231
+ */
232
+ writeValue(range) {
233
+ // Set this change as a programmatic one
234
+ this._programmaticChange = true;
235
+ // Set the range
236
+ this.range = range;
237
+ }
238
+ /**
239
+ * On destroy
240
+ */
241
+ ngOnDestroy() {
242
+ this._unsubscribeAll.next(void 0);
243
+ this._unsubscribeAll.complete();
244
+ this.writeValue = () => { };
245
+ }
246
+ // -----------------------------------------------------------------------------------------------------
247
+ // @ Public methods
248
+ // -----------------------------------------------------------------------------------------------------
249
+ /**
250
+ * Open the picker panel
251
+ */
252
+ openPickerPanel() {
253
+ // Create the overlay
254
+ const overlayRef = this._overlay.create({
255
+ panelClass: 'cmat-date-range-panel',
256
+ backdropClass: '',
257
+ hasBackdrop: true,
258
+ scrollStrategy: this._overlay.scrollStrategies.reposition(),
259
+ positionStrategy: this._overlay.position()
260
+ .flexibleConnectedTo(this._pickerPanelOrigin)
261
+ .withPositions([
262
+ {
263
+ originX: 'start',
264
+ originY: 'bottom',
265
+ overlayX: 'start',
266
+ overlayY: 'top',
267
+ offsetY: 8
268
+ },
269
+ {
270
+ originX: 'start',
271
+ originY: 'top',
272
+ overlayX: 'start',
273
+ overlayY: 'bottom',
274
+ offsetY: -8
275
+ }
276
+ ])
277
+ });
278
+ // Create a portal from the template
279
+ const templatePortal = new TemplatePortal(this._pickerPanel, this._viewContainerRef);
280
+ // On backdrop click
281
+ overlayRef.backdropClick().subscribe(() => {
282
+ // If template portal exists and attached...
283
+ if (templatePortal && templatePortal.isAttached) {
284
+ // Detach it
285
+ templatePortal.detach();
286
+ }
287
+ // If overlay exists and attached...
288
+ if (overlayRef && overlayRef.hasAttached()) {
289
+ // Detach it
290
+ overlayRef.detach();
291
+ overlayRef.dispose();
292
+ }
293
+ });
294
+ // Attach the portal to the overlay
295
+ overlayRef.attach(templatePortal);
296
+ }
297
+ /**
298
+ * Get month label
299
+ *
300
+ * @param month
301
+ */
302
+ getMonthLabel(month) {
303
+ if (month === 1) {
304
+ return this.activeDates.month1?.clone().format('YYYY MMMM');
305
+ }
306
+ return this.activeDates.month2?.clone().format('YYYY MMMM');
307
+ }
308
+ /**
309
+ * Date class function to add/remove class names to calendar days
310
+ */
311
+ dateClass() {
312
+ return (date) => {
313
+ // If the date is both start and end date...
314
+ if (date.isSame(this._range.start, 'day') && date.isSame(this._range.end, 'day')) {
315
+ return ['cmat-date-range', 'cmat-date-range-start', 'cmat-date-range-end'];
316
+ }
317
+ // If the date is the start date...
318
+ if (date.isSame(this._range.start, 'day')) {
319
+ return ['cmat-date-range', 'cmat-date-range-start'];
320
+ }
321
+ // If the date is the end date...
322
+ if (date.isSame(this._range.end, 'day')) {
323
+ return ['cmat-date-range', 'cmat-date-range-end'];
324
+ }
325
+ // If the date is in between start and end dates...
326
+ if (date.isBetween(this._range.start, this._range.end, 'day')) {
327
+ return ['cmat-date-range', 'cmat-date-range-mid'];
328
+ }
329
+ return void 0;
330
+ };
331
+ }
332
+ /**
333
+ * Date filter to enable/disable calendar days
334
+ */
335
+ dateFilter() {
336
+ // If we are selecting the end date, disable all the dates that comes before the start date
337
+ return (date) => !(this.setWhichDate === 'end' && date.isBefore(this._range.start, 'day'));
338
+ }
339
+ /**
340
+ * On selected date change
341
+ *
342
+ * @param date
343
+ */
344
+ onSelectedDateChange(date) {
345
+ if (this._range.start && this._range.end) {
346
+ // Create a new range object
347
+ const newRange = {
348
+ start: this._range.start.clone().toISOString(),
349
+ end: this._range.end.clone().toISOString(),
350
+ whichDate: ''
351
+ };
352
+ // Replace either the start or the end date with the new one
353
+ // depending on which date we are setting
354
+ if (this.setWhichDate === 'start') {
355
+ newRange.start = dayjs(newRange.start).year(date.year()).month(date.month()).date(date.date()).toISOString();
356
+ }
357
+ else {
358
+ newRange.end = dayjs(newRange.end).year(date.year()).month(date.month()).date(date.date()).toISOString();
359
+ }
360
+ // Append the which date to the new range object
361
+ newRange.whichDate = this.setWhichDate;
362
+ // Switch which date to set on the next run
363
+ this.setWhichDate = this.setWhichDate === 'start' ? 'end' : 'start';
364
+ // Set the range
365
+ this.range = newRange;
366
+ }
367
+ }
368
+ /**
369
+ * Go to previous month on both views
370
+ */
371
+ prev() {
372
+ this.activeDates.month1 = dayjs(this.activeDates.month1).subtract(1, 'month');
373
+ this.activeDates.month2 = dayjs(this.activeDates.month2).subtract(1, 'month');
374
+ }
375
+ /**
376
+ * Go to next month on both views
377
+ */
378
+ next() {
379
+ this.activeDates.month1 = dayjs(this.activeDates.month1).add(1, 'month');
380
+ this.activeDates.month2 = dayjs(this.activeDates.month2).add(1, 'month');
381
+ }
382
+ /**
383
+ * Update the start time
384
+ *
385
+ * @param event
386
+ */
387
+ updateStartTime(event) {
388
+ // Parse the time
389
+ const parsedTime = this._parseTime(event.target.value);
390
+ // Go back to the previous value if the form control is not valid
391
+ if (this.startTimeFormControl.invalid) {
392
+ if (this._range.start) {
393
+ // Override the time
394
+ const time = this._range.start.clone().format(this._timeFormat);
395
+ // Set the time
396
+ this.startTimeFormControl.setValue(time);
397
+ }
398
+ // Do not update the range
399
+ return;
400
+ }
401
+ if (this._range.start && this._range.end) {
402
+ // Append the new time to the start date
403
+ const startDate = this._range.start.clone().hour(parsedTime.hour()).minute(parsedTime.minute());
404
+ // If the new start date is after the current end date,
405
+ // use the end date's time and set the start date again
406
+ if (startDate.isAfter(this._range.end)) {
407
+ const endDateHours = this._range.end.hour();
408
+ const endDateMinutes = this._range.end.minute();
409
+ // Set the start date
410
+ startDate.hour(endDateHours).minute(endDateMinutes);
411
+ }
412
+ // If everything is okay, set the new date
413
+ this.range = {
414
+ start: startDate.toISOString(),
415
+ end: this._range.end.clone().toISOString(),
416
+ whichDate: 'start'
417
+ };
418
+ }
419
+ }
420
+ /**
421
+ * Update the end time
422
+ *
423
+ * @param event
424
+ */
425
+ updateEndTime(event) {
426
+ // Parse the time
427
+ const parsedTime = this._parseTime(event.target.value);
428
+ // Go back to the previous value if the form control is not valid
429
+ if (this.endTimeFormControl.invalid) {
430
+ if (this._range.end) {
431
+ // Override the time
432
+ const time = this._range.end.clone().format(this._timeFormat);
433
+ // Set the time
434
+ this.endTimeFormControl.setValue(time);
435
+ }
436
+ // Do not update the range
437
+ return;
438
+ }
439
+ if (this._range.start && this._range.end) {
440
+ // Append the new time to the end date
441
+ const endDate = this._range.end.clone().hour(parsedTime.hour()).minute(parsedTime.minute());
442
+ // If the new end date is before the current start date,
443
+ // use the start date's time and set the end date again
444
+ if (endDate.isBefore(this._range.start)) {
445
+ const startDateHours = this._range.start.hour();
446
+ const startDateMinutes = this._range.start.minute();
447
+ // Set the end date
448
+ endDate.hour(startDateHours).minute(startDateMinutes);
449
+ }
450
+ // If everything is okay, set the new date
451
+ this.range = {
452
+ start: this._range.start.clone().toISOString(),
453
+ end: endDate.toISOString(),
454
+ whichDate: 'end'
455
+ };
456
+ }
457
+ }
458
+ // -----------------------------------------------------------------------------------------------------
459
+ // @ Private methods
460
+ // -----------------------------------------------------------------------------------------------------
461
+ /**
462
+ * Initialize
463
+ *
464
+ * @private
465
+ */
466
+ _init() {
467
+ // Start and end time form controls
468
+ this.startTimeFormControl = new FormControl('', [Validators.pattern(this._timeRegExp)]);
469
+ this.endTimeFormControl = new FormControl('', [Validators.pattern(this._timeRegExp)]);
470
+ // Set the default range
471
+ this._programmaticChange = true;
472
+ this.range = {
473
+ start: dayjs().startOf('day').toISOString(),
474
+ end: dayjs().add(1, 'day').endOf('day').toISOString()
475
+ };
476
+ // Set the default time range
477
+ this._programmaticChange = true;
478
+ this.timeRange = true;
479
+ }
480
+ /**
481
+ * Parse the time from the inputs
482
+ *
483
+ * @param value
484
+ * @private
485
+ */
486
+ _parseTime(value) {
487
+ // Parse the time using the time regexp
488
+ const timeArr = value.split(this._timeRegExp).filter(part => part !== '');
489
+ // Get the meridiem
490
+ const meridiem = timeArr[2] || null;
491
+ // If meridiem exists...
492
+ if (meridiem) {
493
+ // Create a moment using 12-hours format and return it
494
+ return dayjs(value, 'hh:mmA').second(0);
495
+ }
496
+ // If meridiem doesn't exist, create a moment using 24-hours format and return in
497
+ return dayjs(value, 'HH:mm').second(0);
498
+ }
499
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: CmatDateRangeComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
500
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: CmatDateRangeComponent, isStandalone: true, selector: "cmat-date-range", inputs: { dateFormat: "dateFormat", timeFormat: "timeFormat", timeRange: "timeRange", range: "range" }, outputs: { rangeChanged: "rangeChanged" }, providers: [
501
+ {
502
+ provide: NG_VALUE_ACCESSOR,
503
+ useExisting: forwardRef(() => CmatDateRangeComponent),
504
+ multi: true
505
+ }
506
+ ], viewQueries: [{ propertyName: "_matMonthView1", first: true, predicate: ["matMonthView1"], descendants: true }, { propertyName: "_matMonthView2", first: true, predicate: ["matMonthView2"], descendants: true }, { propertyName: "_pickerPanelOrigin", first: true, predicate: ["pickerPanelOrigin"], descendants: true, read: ElementRef }, { propertyName: "_pickerPanel", first: true, predicate: ["pickerPanel"], descendants: true }], exportAs: ["cmatDateRange"], ngImport: i0, template: "<div role=\"presentation\" class=\"range\" (click)=\"openPickerPanel()\" #pickerPanelOrigin>\r\n\r\n <div class=\"start\">\r\n <div class=\"date\">{{range.startDate}}</div>\r\n <div class=\"time\" *ngIf=\"range.startTime\">{{range.startTime}}</div>\r\n </div>\r\n\r\n <div class=\"separator\">-</div>\r\n\r\n <div class=\"end\">\r\n <div class=\"date\">{{range.endDate}}</div>\r\n <div class=\"time\" *ngIf=\"range.endTime\">{{range.endTime}}</div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #pickerPanel>\r\n\r\n <!-- Start -->\r\n <div class=\"start\">\r\n\r\n <div class=\"month\">\r\n <div class=\"month-header\">\r\n <button type=\"button\" class=\"previous-button\" mat-icon-button (click)=\"prev()\" tabindex=\"1\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-left'\"></mat-icon>\r\n </button>\r\n <div class=\"month-label\">{{getMonthLabel(1)}}</div>\r\n </div>\r\n <mat-month-view [(activeDate)]=\"activeDates.month1\" [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\r\n (click)=\"$event.stopImmediatePropagation()\" (selectedChange)=\"onSelectedDateChange($event)\"\r\n #matMonthView1>\r\n </mat-month-view>\r\n </div>\r\n\r\n <mat-form-field class=\"time start-time\" *ngIf=\"timeRange\">\r\n <input matInput [autocomplete]=\"'off'\" [formControl]=\"startTimeFormControl\" (blur)=\"updateStartTime($event)\"\r\n tabindex=\"3\">\r\n <mat-label>\u5F00\u59CB\u65F6\u95F4</mat-label>\r\n </mat-form-field>\r\n\r\n </div>\r\n\r\n <!-- End -->\r\n <div class=\"end\">\r\n\r\n <div class=\"month\">\r\n <div class=\"month-header\">\r\n <div class=\"month-label\">{{getMonthLabel(2)}}</div>\r\n <button type=\"button\" class=\"next-button\" mat-icon-button (click)=\"next()\" tabindex=\"2\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-right'\"></mat-icon>\r\n </button>\r\n </div>\r\n <mat-month-view [(activeDate)]=\"activeDates.month2\" [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\r\n (click)=\"$event.stopImmediatePropagation()\" (selectedChange)=\"onSelectedDateChange($event)\"\r\n #matMonthView2>\r\n </mat-month-view>\r\n </div>\r\n\r\n <mat-form-field class=\"time end-time\" *ngIf=\"timeRange\">\r\n <input matInput [formControl]=\"endTimeFormControl\" (blur)=\"updateEndTime($event)\" tabindex=\"4\">\r\n <mat-label>\u7ED3\u675F\u65F6\u95F4</mat-label>\r\n </mat-form-field>\r\n\r\n </div>\r\n\r\n</ng-template>", styles: ["cmat-date-range{display:flex}cmat-date-range .range{display:flex;width:100%;align-items:center;height:48px;min-height:48px;max-height:48px;cursor:pointer}cmat-date-range .range .start,cmat-date-range .range .end{display:flex;align-items:center;height:100%;padding:0 16px;border-radius:6px;border-width:1px;line-height:1;@apply shadow-sm bg-white border-slate-300 dark:bg-black dark:bg-opacity-5 dark:border-slate-500 !important;}@screen sm{cmat-date-range .range .start,cmat-date-range .range .end {max-width: calc((100% - 32px)/2) ; min-width: calc((100% - 32px)/2) ; width: calc((100% - 32px)/2) ;}}cmat-date-range .range .date{white-space:nowrap}cmat-date-range .range .date+.time{margin-left:8px}cmat-date-range .range .time{white-space:nowrap}cmat-date-range .separator{margin:0 8px}@screen sm{cmat-date-range .separator {margin: 0 12px;}}.cmat-date-range-panel{border-radius:4px;padding:24px;@apply shadow-2xl bg-card;}.cmat-date-range-panel .start,.cmat-date-range-panel .end{display:flex;flex-direction:column}.cmat-date-range-panel .start .month,.cmat-date-range-panel .end .month{max-width:196px;min-width:196px;width:196px}.cmat-date-range-panel .start .month .month-header,.cmat-date-range-panel .end .month .month-header{position:relative;display:flex;align-items:center;justify-content:center;height:32px;margin-bottom:16px}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .next-button{position:absolute;width:24px!important;height:24px!important;min-height:24px!important;max-height:24px!important;line-height:24px!important}.cmat-date-range-panel .start .month .month-header .previous-button .mat-icon,.cmat-date-range-panel .start .month .month-header .next-button .mat-icon,.cmat-date-range-panel .end .month .month-header .previous-button .mat-icon,.cmat-date-range-panel .end .month .month-header .next-button .mat-icon{@apply icon-size-5;}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .previous-button{left:0}.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .next-button{right:0}.cmat-date-range-panel .start .month .month-header .month-label,.cmat-date-range-panel .end .month .month-header .month-label{font-weight:500;@apply text-secondary;}.cmat-date-range-panel .start .month mat-month-view,.cmat-date-range-panel .end .month mat-month-view{display:flex;min-height:188px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table{width:100%;border-collapse:collapse}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true]{display:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true]{visibility:hidden;pointer-events:none;opacity:0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .cmat-date-range:before{@apply bg-primary-200 !important;}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content{background-color:transparent!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr .cmat-date-range-start .mat-calendar-body-cell-content,.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr .cmat-date-range-end .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr .cmat-date-range-start .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr .cmat-date-range-end .mat-calendar-body-cell-content{@apply bg-primary text-on-primary !important;}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today{border:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell{width:28px!important;height:28px!important;padding:2px!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before{content:\"\";position:absolute;inset:2px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before{border-radius:999px 0 0 999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before{right:2px;border-radius:999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before{border-radius:0 999px 999px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content{position:relative;top:0;left:0;width:24px;height:24px;font-size:12px}.cmat-date-range-panel .time{width:100%;max-width:196px}.cmat-date-range-panel .start{align-items:flex-start;margin-right:20px}.cmat-date-range-panel .start .month .month-label{margin-left:8px}.cmat-date-range-panel .end{align-items:flex-end;margin-left:20px}.cmat-date-range-panel .end .month .month-label{margin-right:8px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i4.MatMonthView, selector: "mat-month-view", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName", "activeDrag"], outputs: ["selectedChange", "_userSelection", "dragStarted", "dragEnded", "activeDateChange"], exportAs: ["matMonthView"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
507
+ }
508
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: CmatDateRangeComponent, decorators: [{
509
+ type: Component,
510
+ args: [{ selector: 'cmat-date-range', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatDateRange', providers: [
511
+ {
512
+ provide: NG_VALUE_ACCESSOR,
513
+ useExisting: forwardRef(() => CmatDateRangeComponent),
514
+ multi: true
515
+ }
516
+ ], standalone: true, imports: [NgIf, MatButtonModule, MatIconModule, MatDatepickerModule, MatFormFieldModule, MatInputModule, FormsModule, ReactiveFormsModule], template: "<div role=\"presentation\" class=\"range\" (click)=\"openPickerPanel()\" #pickerPanelOrigin>\r\n\r\n <div class=\"start\">\r\n <div class=\"date\">{{range.startDate}}</div>\r\n <div class=\"time\" *ngIf=\"range.startTime\">{{range.startTime}}</div>\r\n </div>\r\n\r\n <div class=\"separator\">-</div>\r\n\r\n <div class=\"end\">\r\n <div class=\"date\">{{range.endDate}}</div>\r\n <div class=\"time\" *ngIf=\"range.endTime\">{{range.endTime}}</div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #pickerPanel>\r\n\r\n <!-- Start -->\r\n <div class=\"start\">\r\n\r\n <div class=\"month\">\r\n <div class=\"month-header\">\r\n <button type=\"button\" class=\"previous-button\" mat-icon-button (click)=\"prev()\" tabindex=\"1\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-left'\"></mat-icon>\r\n </button>\r\n <div class=\"month-label\">{{getMonthLabel(1)}}</div>\r\n </div>\r\n <mat-month-view [(activeDate)]=\"activeDates.month1\" [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\r\n (click)=\"$event.stopImmediatePropagation()\" (selectedChange)=\"onSelectedDateChange($event)\"\r\n #matMonthView1>\r\n </mat-month-view>\r\n </div>\r\n\r\n <mat-form-field class=\"time start-time\" *ngIf=\"timeRange\">\r\n <input matInput [autocomplete]=\"'off'\" [formControl]=\"startTimeFormControl\" (blur)=\"updateStartTime($event)\"\r\n tabindex=\"3\">\r\n <mat-label>\u5F00\u59CB\u65F6\u95F4</mat-label>\r\n </mat-form-field>\r\n\r\n </div>\r\n\r\n <!-- End -->\r\n <div class=\"end\">\r\n\r\n <div class=\"month\">\r\n <div class=\"month-header\">\r\n <div class=\"month-label\">{{getMonthLabel(2)}}</div>\r\n <button type=\"button\" class=\"next-button\" mat-icon-button (click)=\"next()\" tabindex=\"2\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-right'\"></mat-icon>\r\n </button>\r\n </div>\r\n <mat-month-view [(activeDate)]=\"activeDates.month2\" [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\r\n (click)=\"$event.stopImmediatePropagation()\" (selectedChange)=\"onSelectedDateChange($event)\"\r\n #matMonthView2>\r\n </mat-month-view>\r\n </div>\r\n\r\n <mat-form-field class=\"time end-time\" *ngIf=\"timeRange\">\r\n <input matInput [formControl]=\"endTimeFormControl\" (blur)=\"updateEndTime($event)\" tabindex=\"4\">\r\n <mat-label>\u7ED3\u675F\u65F6\u95F4</mat-label>\r\n </mat-form-field>\r\n\r\n </div>\r\n\r\n</ng-template>", styles: ["cmat-date-range{display:flex}cmat-date-range .range{display:flex;width:100%;align-items:center;height:48px;min-height:48px;max-height:48px;cursor:pointer}cmat-date-range .range .start,cmat-date-range .range .end{display:flex;align-items:center;height:100%;padding:0 16px;border-radius:6px;border-width:1px;line-height:1;@apply shadow-sm bg-white border-slate-300 dark:bg-black dark:bg-opacity-5 dark:border-slate-500 !important;}@screen sm{cmat-date-range .range .start,cmat-date-range .range .end {max-width: calc((100% - 32px)/2) ; min-width: calc((100% - 32px)/2) ; width: calc((100% - 32px)/2) ;}}cmat-date-range .range .date{white-space:nowrap}cmat-date-range .range .date+.time{margin-left:8px}cmat-date-range .range .time{white-space:nowrap}cmat-date-range .separator{margin:0 8px}@screen sm{cmat-date-range .separator {margin: 0 12px;}}.cmat-date-range-panel{border-radius:4px;padding:24px;@apply shadow-2xl bg-card;}.cmat-date-range-panel .start,.cmat-date-range-panel .end{display:flex;flex-direction:column}.cmat-date-range-panel .start .month,.cmat-date-range-panel .end .month{max-width:196px;min-width:196px;width:196px}.cmat-date-range-panel .start .month .month-header,.cmat-date-range-panel .end .month .month-header{position:relative;display:flex;align-items:center;justify-content:center;height:32px;margin-bottom:16px}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .next-button{position:absolute;width:24px!important;height:24px!important;min-height:24px!important;max-height:24px!important;line-height:24px!important}.cmat-date-range-panel .start .month .month-header .previous-button .mat-icon,.cmat-date-range-panel .start .month .month-header .next-button .mat-icon,.cmat-date-range-panel .end .month .month-header .previous-button .mat-icon,.cmat-date-range-panel .end .month .month-header .next-button .mat-icon{@apply icon-size-5;}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .previous-button{left:0}.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .next-button{right:0}.cmat-date-range-panel .start .month .month-header .month-label,.cmat-date-range-panel .end .month .month-header .month-label{font-weight:500;@apply text-secondary;}.cmat-date-range-panel .start .month mat-month-view,.cmat-date-range-panel .end .month mat-month-view{display:flex;min-height:188px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table{width:100%;border-collapse:collapse}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true]{display:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true]{visibility:hidden;pointer-events:none;opacity:0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .cmat-date-range:before{@apply bg-primary-200 !important;}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content{background-color:transparent!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr .cmat-date-range-start .mat-calendar-body-cell-content,.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr .cmat-date-range-end .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr .cmat-date-range-start .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr .cmat-date-range-end .mat-calendar-body-cell-content{@apply bg-primary text-on-primary !important;}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today{border:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell{width:28px!important;height:28px!important;padding:2px!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before{content:\"\";position:absolute;inset:2px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before{border-radius:999px 0 0 999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before{right:2px;border-radius:999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before{border-radius:0 999px 999px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content{position:relative;top:0;left:0;width:24px;height:24px;font-size:12px}.cmat-date-range-panel .time{width:100%;max-width:196px}.cmat-date-range-panel .start{align-items:flex-start;margin-right:20px}.cmat-date-range-panel .start .month .month-label{margin-left:8px}.cmat-date-range-panel .end{align-items:flex-end;margin-left:20px}.cmat-date-range-panel .end .month .month-label{margin-right:8px}\n"] }]
517
+ }], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }], propDecorators: { rangeChanged: [{
518
+ type: Output
519
+ }], _matMonthView1: [{
520
+ type: ViewChild,
521
+ args: ['matMonthView1']
522
+ }], _matMonthView2: [{
523
+ type: ViewChild,
524
+ args: ['matMonthView2']
525
+ }], _pickerPanelOrigin: [{
526
+ type: ViewChild,
527
+ args: ['pickerPanelOrigin', { read: ElementRef }]
528
+ }], _pickerPanel: [{
529
+ type: ViewChild,
530
+ args: ['pickerPanel']
531
+ }], dateFormat: [{
532
+ type: Input
533
+ }], timeFormat: [{
534
+ type: Input
535
+ }], timeRange: [{
536
+ type: Input
537
+ }], range: [{
538
+ type: Input
539
+ }] } });
540
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbWF0L2NvbXBvbmVudHMvZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NtYXQvY29tcG9uZW50cy9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFlLFNBQVMsRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaE0sT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBJLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQTJDLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEtBQWdCLE1BQU0sT0FBTyxDQUFDO0FBQ3JDLE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBbUJ2QyxNQUFNLE9B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RSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNsQixZQUFZO3NCQUE3QyxTQUFTO3VCQUFDLGFBQWE7Z0JBK0NwQixVQUFVO3NCQURiLEtBQUs7Z0JBa0JGLFVBQVU7c0JBRGIsS0FBSztnQkFvQkYsU0FBUztzQkFEWixLQUFLO2dCQXlDRixLQUFLO3NCQURSLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9ycywgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IE1hdENhbGVuZGFyQ2VsbENzc0NsYXNzZXMsIE1hdE1vbnRoVmlldywgTWF0RGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCBkYXlqcywgeyBEYXlqcyB9IGZyb20gJ2RheWpzJztcclxuaW1wb3J0IGlzQmV0d2VlbiBmcm9tICdkYXlqcy9wbHVnaW4vaXNCZXR3ZWVuJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NtYXQtZGF0ZS1yYW5nZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1yYW5nZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRlLXJhbmdlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBleHBvcnRBczogJ2NtYXREYXRlUmFuZ2UnLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ21hdERhdGVSYW5nZUNvbXBvbmVudCksXHJcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbTmdJZiwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXREYXRlcGlja2VyTW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENtYXREYXRlUmFuZ2VDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSByYW5nZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjx7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0+KCk7XHJcbiAgICBAVmlld0NoaWxkKCdtYXRNb250aFZpZXcxJykgcHJpdmF0ZSBfbWF0TW9udGhWaWV3MTogTWF0TW9udGhWaWV3PGFueT47XHJcbiAgICBAVmlld0NoaWxkKCdtYXRNb250aFZpZXcyJykgcHJpdmF0ZSBfbWF0TW9udGhWaWV3MjogTWF0TW9udGhWaWV3PGFueT47XHJcbiAgICBAVmlld0NoaWxkKCdwaWNrZXJQYW5lbE9yaWdpbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIF9waWNrZXJQYW5lbE9yaWdpbjogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ3BpY2tlclBhbmVsJykgcHJpdmF0ZSBfcGlja2VyUGFuZWw6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgYWN0aXZlRGF0ZXM6IHsgbW9udGgxOiBEYXlqcyB8IG51bGw7IG1vbnRoMjogRGF5anMgfCBudWxsIH0gPSB7XHJcbiAgICAgICAgbW9udGgxOiBudWxsLFxyXG4gICAgICAgIG1vbnRoMjogbnVsbFxyXG4gICAgfTtcclxuICAgIHNldFdoaWNoRGF0ZTogJ3N0YXJ0JyB8ICdlbmQnID0gJ3N0YXJ0JztcclxuICAgIHN0YXJ0VGltZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcclxuICAgIGVuZFRpbWVGb3JtQ29udHJvbDogRm9ybUNvbnRyb2w7XHJcbiAgICBwcml2YXRlIF9kYXRlRm9ybWF0OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XHJcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSBfcHJvZ3JhbW1hdGljQ2hhbmdlITogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX3JhbmdlOiB7IHN0YXJ0OiBEYXlqcyB8IG51bGw7IGVuZDogRGF5anMgfCBudWxsIH0gPSB7XHJcbiAgICAgICAgc3RhcnQ6IG51bGwsXHJcbiAgICAgICAgZW5kOiBudWxsXHJcbiAgICB9O1xyXG4gICAgcHJpdmF0ZSBfdGltZUZvcm1hdDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfdGltZVJhbmdlOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGltZVJlZ0V4cDogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXigwWzAtOV18MVswLTldfDJbMC00XXxbMC05XSk6KFswLTVdWzAtOV0pKEF8KD86QU0pfFB8KD86UE0pKT8kJywgJ2knKTtcclxuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlQWxsOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcclxuICAgICAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmXHJcbiAgICApIHtcclxuICAgICAgICBkYXlqcy5leHRlbmQoaXNCZXR3ZWVuKTtcclxuXHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSAoKTogdm9pZCA9PiB7IH07XHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4geyB9O1xyXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9ICdZWVlZL01NL0REJztcclxuICAgICAgICB0aGlzLnRpbWVGb3JtYXQgPSAnMTInO1xyXG5cclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjb21wb25lbnRcclxuICAgICAgICB0aGlzLl9pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEAgQWNjZXNzb3JzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0dGVyICYgZ2V0dGVyIGZvciBkYXRlRm9ybWF0IGlucHV0ICovXHJcbiAgICBnZXQgZGF0ZUZvcm1hdCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0O1xyXG4gICAgfVxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBkYXRlRm9ybWF0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWVcclxuICAgICAgICBpZiAodGhpcy5fZGF0ZUZvcm1hdCA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU3RvcmUgdGhlIHZhbHVlXHJcbiAgICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0dGVyICYgZ2V0dGVyIGZvciB0aW1lRm9ybWF0IGlucHV0ICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IHRpbWVGb3JtYXQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGltZUZvcm1hdDtcclxuICAgIH1cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgdGltZUZvcm1hdCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVGb3JtYXQgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCBmb3JtYXQgYmFzZWQgb24gdGhlIHRpbWUgZm9ybWF0IGlucHV0XHJcbiAgICAgICAgdGhpcy5fdGltZUZvcm1hdCA9IHZhbHVlID09PSAnMTInID8gJ2hoOm1tQScgOiAnSEg6bW0nO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0ZXIgJiBnZXR0ZXIgZm9yIHRpbWVSYW5nZSBpbnB1dCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCB0aW1lUmFuZ2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVSYW5nZTtcclxuICAgIH1cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgdGltZVJhbmdlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVSYW5nZSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU3RvcmUgdGhlIHZhbHVlXHJcbiAgICAgICAgdGhpcy5fdGltZVJhbmdlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSB0aW1lIHJhbmdlIHR1cm5lZCBvZmYuLi5cclxuICAgICAgICBpZiAoIXZhbHVlICYmIHRoaXMuX3JhbmdlLnN0YXJ0ICYmIHRoaXMuX3JhbmdlLmVuZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkuc3RhcnRPZignZGF5JyksXHJcbiAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLmVuZE9mKCdkYXknKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHRlciAmIGdldHRlciBmb3IgcmFuZ2UgaW5wdXQgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgcmFuZ2UoKTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy5fcmFuZ2Uuc3RhcnQgJiYgdGhpcy5fcmFuZ2UuZW5kKSB7XHJcbiAgICAgICAgICAgIC8vIENsb25lIHRoZSByYW5nZSBzdGFydCBhbmQgZW5kXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKTtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBCdWlsZCBhbmQgcmV0dXJuIHRoZSByYW5nZSBvYmplY3RcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogc3RhcnQuY2xvbmUoKS5mb3JtYXQodGhpcy5kYXRlRm9ybWF0KSxcclxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogdGhpcy50aW1lUmFuZ2UgPyBzdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IGVuZC5jbG9uZSgpLmZvcm1hdCh0aGlzLmRhdGVGb3JtYXQpLFxyXG4gICAgICAgICAgICAgICAgZW5kVGltZTogdGhpcy50aW1lUmFuZ2UgPyBlbmQuY2xvbmUoKS5mb3JtYXQodGhpcy50aW1lRm9ybWF0KSA6IG51bGxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2b2lkIDA7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCByYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBhbmQgaGFzICdzdGFydCcgYW5kICdlbmQnIHZhbHVlc1xyXG4gICAgICAgIGlmICghdmFsdWUuc3RhcnQgfHwgIXZhbHVlLmVuZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSYW5nZSBpbnB1dCBtdXN0IGhhdmUgXCJzdGFydFwiIGFuZCBcImVuZFwiIHByb3BlcnRpZXMhJyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgc2V0dGluZyBhbiBpbmRpdmlkdWFsIGRhdGUgb3IgYm90aCBvZiB0aGVtXHJcbiAgICAgICAgY29uc3Qgd2hpY2hEYXRlID0gdmFsdWUud2hpY2hEYXRlIHx8IG51bGw7XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlcyBhcyBtb21lbnRcclxuICAgICAgICBjb25zdCBzdGFydCA9IGRheWpzKHZhbHVlLnN0YXJ0KTtcclxuICAgICAgICBjb25zdCBlbmQgPSBkYXlqcyh2YWx1ZS5lbmQpO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgb25seSBzZXR0aW5nIHRoZSBzdGFydCBkYXRlLi4uXHJcbiAgICAgICAgaWYgKHdoaWNoRGF0ZSA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgdGhpcy5fcmFuZ2Uuc3RhcnQgPSBzdGFydC5jbG9uZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIHN0YXJ0IGRhdGUgaXMgYWZ0ZXIgdGhlIGVuZCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5lbmQgJiYgdGhpcy5fcmFuZ2Uuc3RhcnQuaXNBZnRlcih0aGlzLl9yYW5nZS5lbmQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBkYXRlIHRvIHRoZSBzdGFydCBkYXRlIGJ1dCBrZWVwIHRoZSBlbmQgZGF0ZSdzIHRpbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBzdGFydC5jbG9uZSgpLmhvdXIodGhpcy5fcmFuZ2UuZW5kLmhvdXIoKSkubWludXRlKHRoaXMuX3JhbmdlLmVuZC5taW51dGUoKSkuc2Vjb25kKHRoaXMuX3JhbmdlLmVuZC5zZWNvbmQoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gVGVzdCB0aGlzIG5ldyBlbmQgZGF0ZSB0byBzZWUgaWYgaXQncyBhaGVhZCBvZiB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JhbmdlLnN0YXJ0LmlzQmVmb3JlKGVuZERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncywgc2V0IHRoZSBuZXcgZW5kIGRhdGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZS5lbmQgPSBlbmREYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgdGhlIGVuZCBkYXRlIHNhbWUgYXMgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZS5lbmQgPSBzdGFydC5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgb25seSBzZXR0aW5nIHRoZSBlbmQgZGF0ZS4uLlxyXG4gICAgICAgIGlmICh3aGljaERhdGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgdGhpcy5fcmFuZ2UuZW5kID0gZW5kLmNsb25lKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgZW5kIGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5zdGFydC5pc0FmdGVyKHRoaXMuX3JhbmdlLmVuZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgZGF0ZSB0byB0aGUgZW5kIGRhdGUgYnV0IGtlZXAgdGhlIHN0YXJ0IGRhdGUncyB0aW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBlbmQuY2xvbmUoKS5ob3VyKHRoaXMuX3JhbmdlLnN0YXJ0LmhvdXIoKSkubWludXRlKHRoaXMuX3JhbmdlLnN0YXJ0Lm1pbnV0ZSgpKS5zZWNvbmQodGhpcy5fcmFuZ2Uuc3RhcnQuc2Vjb25kKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhpcyBuZXcgZW5kIGRhdGUgdG8gc2VlIGlmIGl0J3MgYWhlYWQgb2YgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5lbmQuaXNBZnRlcihzdGFydERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncywgc2V0IHRoZSBuZXcgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlLnN0YXJ0ID0gc3RhcnREYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgdGhlIHN0YXJ0IGRhdGUgc2FtZSBhcyB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZS5zdGFydCA9IGVuZC5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgc2V0dGluZyBib3RoIGRhdGVzLi4uXHJcbiAgICAgICAgaWYgKCF3aGljaERhdGUpIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlLnN0YXJ0ID0gc3RhcnQuY2xvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdGFydCBkYXRlIGlzIGJlZm9yZSB0aGUgZW5kIGRhdGUsIHNldCB0aGUgZW5kIGRhdGUgYXMgbm9ybWFsLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgZW5kIGRhdGUsIHNldCB0aGUgZW5kIGRhdGUgc2FtZSBhcyB0aGUgc3RhcnQgZGF0ZS5cclxuICAgICAgICAgICAgdGhpcy5fcmFuZ2UuZW5kID0gc3RhcnQuaXNCZWZvcmUoZW5kKSA/IGVuZC5jbG9uZSgpIDogc3RhcnQuY2xvbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gUHJlcGFyZSBhbm90aGVyIHJhbmdlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBJU08gZm9ybWF0dGVkIHJhbmdlIGRhdGVzXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkudG9JU09TdHJpbmcoKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gRW1pdCB0aGUgcmFuZ2UgY2hhbmdlZCBldmVudCB3aXRoIHRoZSByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnJhbmdlQ2hhbmdlZC5lbWl0KHJhbmdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbW9kZWwgd2l0aCB0aGUgcmFuZ2UgaWYgdGhlIGNoYW5nZSB3YXMgbm90IGEgcHJvZ3JhbW1hdGljIGNoYW5nZVxyXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHByb2dyYW1tYXRpYyBjaGFuZ2VzIHRyaWdnZXIgd3JpdGVWYWx1ZSB3aGljaCB0cmlnZ2VycyBvbkNoYW5nZSBhbmQgb25Ub3VjaGVkXHJcbiAgICAgICAgICAgIC8vIGludGVybmFsbHkgY2F1c2luZyB0aGVtIHRvIHRyaWdnZXIgdHdpY2Ugd2hpY2ggYnJlYWtzIHRoZSBmb3JtJ3MgcHJpc3RpbmUgYW5kIHRvdWNoZWRcclxuICAgICAgICAgICAgLy8gc3RhdHVzZXMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQocmFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIGFjdGl2ZSBkYXRlc1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGVzID0ge1xyXG4gICAgICAgICAgICAgICAgbW9udGgxOiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLFxyXG4gICAgICAgICAgICAgICAgbW9udGgyOiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmFkZCgxLCAnbW9udGgnKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gU2V0IHRoZSB0aW1lIGZvcm0gY29udHJvbHNcclxuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkuZm9ybWF0KHRoaXMuX3RpbWVGb3JtYXQpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUnVuIG5nQWZ0ZXJDb250ZW50SW5pdCBvbiBtb250aCB2aWV3cyB0byB0cmlnZ2VyXHJcbiAgICAgICAgLy8gcmUtcmVuZGVyIG9uIG1vbnRoIHZpZXdzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmICh0aGlzLl9tYXRNb250aFZpZXcxICYmIHRoaXMuX21hdE1vbnRoVmlldzIpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF0TW9udGhWaWV3MS5uZ0FmdGVyQ29udGVudEluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWF0TW9udGhWaWV3Mi5uZ0FmdGVyQ29udGVudEluaXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHRoZSBwcm9ncmFtbWF0aWMgY2hhbmdlIHN0YXR1c1xyXG4gICAgICAgIHRoaXMuX3Byb2dyYW1tYXRpY0NoYW5nZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEAgQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCBvbiBjaGFuZ2VcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm5cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCBvbiBibHVyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlIHRvIHZpZXcgZnJvbSBtb2RlbCB3aGVuIHRoZSBmb3JtIG1vZGVsIGNoYW5nZXMgcHJvZ3JhbW1hdGljYWxseVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByYW5nZVxyXG4gICAgICovXHJcbiAgICB3cml0ZVZhbHVlKHJhbmdlOiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0pOiB2b2lkIHtcclxuICAgICAgICAvLyBTZXQgdGhpcyBjaGFuZ2UgYXMgYSBwcm9ncmFtbWF0aWMgb25lXHJcbiAgICAgICAgdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSByYW5nZVxyXG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9uIGRlc3Ryb3lcclxuICAgICAqL1xyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbGwubmV4dCh2b2lkIDApO1xyXG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQWxsLmNvbXBsZXRlKCk7XHJcblxyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSA9ICgpOiB2b2lkID0+IHsgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gQCBQdWJsaWMgbWV0aG9kc1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wZW4gdGhlIHBpY2tlciBwYW5lbFxyXG4gICAgICovXHJcbiAgICBvcGVuUGlja2VyUGFuZWwoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBvdmVybGF5XHJcbiAgICAgICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ2NtYXQtZGF0ZS1yYW5nZS1wYW5lbCcsXHJcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCksXHJcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkucG9zaXRpb24oKVxyXG4gICAgICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5fcGlja2VyUGFuZWxPcmlnaW4pXHJcbiAgICAgICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogOFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogLThcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBwb3J0YWwgZnJvbSB0aGUgdGVtcGxhdGVcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLl9waWNrZXJQYW5lbCwgdGhpcy5fdmlld0NvbnRhaW5lclJlZik7XHJcblxyXG4gICAgICAgIC8vIE9uIGJhY2tkcm9wIGNsaWNrXHJcbiAgICAgICAgb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRlbXBsYXRlIHBvcnRhbCBleGlzdHMgYW5kIGF0dGFjaGVkLi4uXHJcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBvcnRhbCAmJiB0ZW1wbGF0ZVBvcnRhbC5pc0F0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZXRhY2ggaXRcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlUG9ydGFsLmRldGFjaCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBvdmVybGF5IGV4aXN0cyBhbmQgYXR0YWNoZWQuLi5cclxuICAgICAgICAgICAgaWYgKG92ZXJsYXlSZWYgJiYgb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZXRhY2ggaXRcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWYuZGV0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBBdHRhY2ggdGhlIHBvcnRhbCB0byB0aGUgb3ZlcmxheVxyXG4gICAgICAgIG92ZXJsYXlSZWYuYXR0YWNoKHRlbXBsYXRlUG9ydGFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBtb250aCBsYWJlbFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBtb250aFxyXG4gICAgICovXHJcbiAgICBnZXRNb250aExhYmVsKG1vbnRoOiBudW1iZXIpOiBzdHJpbmcgfCB2b2lkIHtcclxuICAgICAgICBpZiAobW9udGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlRGF0ZXMubW9udGgxPy5jbG9uZSgpLmZvcm1hdCgnWVlZWSBNTU1NJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVEYXRlcy5tb250aDI/LmNsb25lKCkuZm9ybWF0KCdZWVlZIE1NTU0nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGUgY2xhc3MgZnVuY3Rpb24gdG8gYWRkL3JlbW92ZSBjbGFzcyBuYW1lcyB0byBjYWxlbmRhciBkYXlzXHJcbiAgICAgKi9cclxuICAgIGRhdGVDbGFzcygpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiAoZGF0ZTogRGF5anMpOiBNYXRDYWxlbmRhckNlbGxDc3NDbGFzc2VzIHwgdm9pZCA9PiB7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgZGF0ZSBpcyBib3RoIHN0YXJ0IGFuZCBlbmQgZGF0ZS4uLlxyXG4gICAgICAgICAgICBpZiAoZGF0ZS5pc1NhbWUodGhpcy5fcmFuZ2Uuc3RhcnQsICdkYXknKSAmJiBkYXRlLmlzU2FtZSh0aGlzLl9yYW5nZS5lbmQsICdkYXknKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnY21hdC1kYXRlLXJhbmdlJywgJ2NtYXQtZGF0ZS1yYW5nZS1zdGFydCcsICdjbWF0LWRhdGUtcmFuZ2UtZW5kJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBkYXRlIGlzIHRoZSBzdGFydCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmIChkYXRlLmlzU2FtZSh0aGlzLl9yYW5nZS5zdGFydCwgJ2RheScpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWydjbWF0LWRhdGUtcmFuZ2UnLCAnY21hdC1kYXRlLXJhbmdlLXN0YXJ0J107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBkYXRlIGlzIHRoZSBlbmQgZGF0ZS4uLlxyXG4gICAgICAgICAgICBpZiAoZGF0ZS5pc1NhbWUodGhpcy5fcmFuZ2UuZW5kLCAnZGF5JykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbJ2NtYXQtZGF0ZS1yYW5nZScsICdjbWF0LWRhdGUtcmFuZ2UtZW5kJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBkYXRlIGlzIGluIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBkYXRlcy4uLlxyXG4gICAgICAgICAgICBpZiAoZGF0ZS5pc0JldHdlZW4odGhpcy5fcmFuZ2Uuc3RhcnQsIHRoaXMuX3JhbmdlLmVuZCwgJ2RheScpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWydjbWF0LWRhdGUtcmFuZ2UnLCAnY21hdC1kYXRlLXJhbmdlLW1pZCddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRlIGZpbHRlciB0byBlbmFibGUvZGlzYWJsZSBjYWxlbmRhciBkYXlzXHJcbiAgICAgKi9cclxuICAgIGRhdGVGaWx0ZXIoKTogYW55IHtcclxuICAgICAgICAvLyBJZiB3ZSBhcmUgc2VsZWN0aW5nIHRoZSBlbmQgZGF0ZSwgZGlzYWJsZSBhbGwgdGhlIGRhdGVzIHRoYXQgY29tZXMgYmVmb3JlIHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgcmV0dXJuIChkYXRlOiBEYXlqcyk6IGJvb2xlYW4gPT4gISh0aGlzLnNldFdoaWNoRGF0ZSA9PT0gJ2VuZCcgJiYgZGF0ZS5pc0JlZm9yZSh0aGlzLl9yYW5nZS5zdGFydCwgJ2RheScpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9uIHNlbGVjdGVkIGRhdGUgY2hhbmdlXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRhdGVcclxuICAgICAqL1xyXG4gICAgb25TZWxlY3RlZERhdGVDaGFuZ2UoZGF0ZTogRGF5anMpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcmFuZ2Uuc3RhcnQgJiYgdGhpcy5fcmFuZ2UuZW5kKSB7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyByYW5nZSBvYmplY3RcclxuICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLl9yYW5nZS5lbmQuY2xvbmUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgd2hpY2hEYXRlOiAnJ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gUmVwbGFjZSBlaXRoZXIgdGhlIHN0YXJ0IG9yIHRoZSBlbmQgZGF0ZSB3aXRoIHRoZSBuZXcgb25lXHJcbiAgICAgICAgICAgIC8vIGRlcGVuZGluZyBvbiB3aGljaCBkYXRlIHdlIGFyZSBzZXR0aW5nXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldFdoaWNoRGF0ZSA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgICAgICAgICAgbmV3UmFuZ2Uuc3RhcnQgPSBkYXlqcyhuZXdSYW5nZS5zdGFydCkueWVhcihkYXRlLnllYXIoKSkubW9udGgoZGF0ZS5tb250aCgpKS5kYXRlKGRhdGUuZGF0ZSgpKS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3UmFuZ2UuZW5kID0gZGF5anMobmV3UmFuZ2UuZW5kKS55ZWFyKGRhdGUueWVhcigpKS5tb250aChkYXRlLm1vbnRoKCkpLmRhdGUoZGF0ZS5kYXRlKCkpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgd2hpY2ggZGF0ZSB0byB0aGUgbmV3IHJhbmdlIG9iamVjdFxyXG4gICAgICAgICAgICBuZXdSYW5nZS53aGljaERhdGUgPSB0aGlzLnNldFdoaWNoRGF0ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFN3aXRjaCB3aGljaCBkYXRlIHRvIHNldCBvbiB0aGUgbmV4dCBydW5cclxuICAgICAgICAgICAgdGhpcy5zZXRXaGljaERhdGUgPSB0aGlzLnNldFdoaWNoRGF0ZSA9PT0gJ3N0YXJ0JyA/ICdlbmQnIDogJ3N0YXJ0JztcclxuXHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5yYW5nZSA9IG5ld1JhbmdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdvIHRvIHByZXZpb3VzIG1vbnRoIG9uIGJvdGggdmlld3NcclxuICAgICAqL1xyXG4gICAgcHJldigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMSA9IGRheWpzKHRoaXMuYWN0aXZlRGF0ZXMubW9udGgxKS5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMiA9IGRheWpzKHRoaXMuYWN0aXZlRGF0ZXMubW9udGgyKS5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdvIHRvIG5leHQgbW9udGggb24gYm90aCB2aWV3c1xyXG4gICAgICovXHJcbiAgICBuZXh0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZXMubW9udGgxID0gZGF5anModGhpcy5hY3RpdmVEYXRlcy5tb250aDEpLmFkZCgxLCAnbW9udGgnKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMiA9IGRheWpzKHRoaXMuYWN0aXZlRGF0ZXMubW9udGgyKS5hZGQoMSwgJ21vbnRoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHN0YXJ0IHRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRcclxuICAgICAqL1xyXG4gICAgdXBkYXRlU3RhcnRUaW1lKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdGltZVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpbWUgPSB0aGlzLl9wYXJzZVRpbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgLy8gR28gYmFjayB0byB0aGUgcHJldmlvdXMgdmFsdWUgaWYgdGhlIGZvcm0gY29udHJvbCBpcyBub3QgdmFsaWRcclxuICAgICAgICBpZiAodGhpcy5zdGFydFRpbWVGb3JtQ29udHJvbC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCkge1xyXG4gICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIHRpbWUgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRpbWVcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgcmFuZ2VcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3JhbmdlLnN0YXJ0ICYmIHRoaXMuX3JhbmdlLmVuZCkge1xyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG5ldyB0aW1lIHRvIHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkuaG91cihwYXJzZWRUaW1lLmhvdXIoKSkubWludXRlKHBhcnNlZFRpbWUubWludXRlKCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBzdGFydCBkYXRlIGlzIGFmdGVyIHRoZSBjdXJyZW50IGVuZCBkYXRlLFxyXG4gICAgICAgICAgICAvLyB1c2UgdGhlIGVuZCBkYXRlJ3MgdGltZSBhbmQgc2V0IHRoZSBzdGFydCBkYXRlIGFnYWluXHJcbiAgICAgICAgICAgIGlmIChzdGFydERhdGUuaXNBZnRlcih0aGlzLl9yYW5nZS5lbmQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlSG91cnMgPSB0aGlzLl9yYW5nZS5lbmQuaG91cigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZU1pbnV0ZXMgPSB0aGlzLl9yYW5nZS5lbmQubWludXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGUuaG91cihlbmREYXRlSG91cnMpLm1pbnV0ZShlbmREYXRlTWludXRlcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgaXMgb2theSwgc2V0IHRoZSBuZXcgZGF0ZVxyXG4gICAgICAgICAgICB0aGlzLnJhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0RGF0ZS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLl9yYW5nZS5lbmQuY2xvbmUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgd2hpY2hEYXRlOiAnc3RhcnQnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBlbmQgdGltZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVFbmRUaW1lKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdGltZVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpbWUgPSB0aGlzLl9wYXJzZVRpbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgLy8gR28gYmFjayB0byB0aGUgcHJldmlvdXMgdmFsdWUgaWYgdGhlIGZvcm0gY29udHJvbCBpcyBub3QgdmFsaWRcclxuICAgICAgICBpZiAodGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2UuZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgdGltZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZSA9IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRpbWVcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5kVGltZUZvcm1Db250cm9sLnNldFZhbHVlKHRpbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1cGRhdGUgdGhlIHJhbmdlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgdGltZSB0byB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLmhvdXIocGFyc2VkVGltZS5ob3VyKCkpLm1pbnV0ZShwYXJzZWRUaW1lLm1pbnV0ZSgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgZW5kIGRhdGUgaXMgYmVmb3JlIHRoZSBjdXJyZW50IHN0YXJ0IGRhdGUsXHJcbiAgICAgICAgICAgIC8vIHVzZSB0aGUgc3RhcnQgZGF0ZSdzIHRpbWUgYW5kIHNldCB0aGUgZW5kIGRhdGUgYWdhaW5cclxuICAgICAgICAgICAgaWYgKGVuZERhdGUuaXNCZWZvcmUodGhpcy5fcmFuZ2Uuc3RhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGVIb3VycyA9IHRoaXMuX3JhbmdlLnN0YXJ0LmhvdXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZU1pbnV0ZXMgPSB0aGlzLl9yYW5nZS5zdGFydC5taW51dGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBkYXRlXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlLmhvdXIoc3RhcnREYXRlSG91cnMpLm1pbnV0ZShzdGFydERhdGVNaW51dGVzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgZXZlcnl0aGluZyBpcyBva2F5LCBzZXQgdGhlIG5ldyBkYXRlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgZW5kOiBlbmREYXRlLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICB3aGljaERhdGU6ICdlbmQnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBAIFByaXZhdGUgbWV0aG9kc1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVcclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9pbml0KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFN0YXJ0IGFuZCBlbmQgdGltZSBmb3JtIGNvbnRyb2xzXHJcbiAgICAgICAgdGhpcy5zdGFydFRpbWVGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucGF0dGVybih0aGlzLl90aW1lUmVnRXhwKV0pO1xyXG4gICAgICAgIHRoaXMuZW5kVGltZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5wYXR0ZXJuKHRoaXMuX3RpbWVSZWdFeHApXSk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCByYW5nZVxyXG4gICAgICAgIHRoaXMuX3Byb2dyYW1tYXRpY0NoYW5nZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yYW5nZSA9IHtcclxuICAgICAgICAgICAgc3RhcnQ6IGRheWpzKCkuc3RhcnRPZignZGF5JykudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgZW5kOiBkYXlqcygpLmFkZCgxLCAnZGF5JykuZW5kT2YoJ2RheScpLnRvSVNPU3RyaW5nKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdGltZSByYW5nZVxyXG4gICAgICAgIHRoaXMuX3Byb2dyYW1tYXRpY0NoYW5nZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50aW1lUmFuZ2UgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2UgdGhlIHRpbWUgZnJvbSB0aGUgaW5wdXRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9wYXJzZVRpbWUodmFsdWU6IHN0cmluZyk6IERheWpzIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdGltZSB1c2luZyB0aGUgdGltZSByZWdleHBcclxuICAgICAgICBjb25zdCB0aW1lQXJyID0gdmFsdWUuc3BsaXQodGhpcy5fdGltZVJlZ0V4cCkuZmlsdGVyKHBhcnQgPT4gcGFydCAhPT0gJycpO1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIG1lcmlkaWVtXHJcbiAgICAgICAgY29uc3QgbWVyaWRpZW0gPSB0aW1lQXJyWzJdIHx8IG51bGw7XHJcblxyXG4gICAgICAgIC8vIElmIG1lcmlkaWVtIGV4aXN0cy4uLlxyXG4gICAgICAgIGlmIChtZXJpZGllbSkge1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBtb21lbnQgdXNpbmcgMTItaG91cnMgZm9ybWF0IGFuZCByZXR1cm4gaXRcclxuICAgICAgICAgICAgcmV0dXJuIGRheWpzKHZhbHVlLCAnaGg6bW1BJykuc2Vjb25kKDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgbWVyaWRpZW0gZG9lc24ndCBleGlzdCwgY3JlYXRlIGEgbW9tZW50IHVzaW5nIDI0LWhvdXJzIGZvcm1hdCBhbmQgcmV0dXJuIGluXHJcbiAgICAgICAgcmV0dXJuIGRheWpzKHZhbHVlLCAnSEg6bW0nKS5zZWNvbmQoMCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiByb2xlPVwicHJlc2VudGF0aW9uXCIgY2xhc3M9XCJyYW5nZVwiIChjbGljayk9XCJvcGVuUGlja2VyUGFuZWwoKVwiICNwaWNrZXJQYW5lbE9yaWdpbj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhcnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZVwiPnt7cmFuZ2Uuc3RhcnREYXRlfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZVwiICpuZ0lmPVwicmFuZ2Uuc3RhcnRUaW1lXCI+e3tyYW5nZS5zdGFydFRpbWV9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiPi08L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZW5kXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVcIj57e3JhbmdlLmVuZERhdGV9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lXCIgKm5nSWY9XCJyYW5nZS5lbmRUaW1lXCI+e3tyYW5nZS5lbmRUaW1lfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI3BpY2tlclBhbmVsPlxyXG5cclxuICAgIDwhLS0gU3RhcnQgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhcnRcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJldmlvdXMtYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwcmV2KClcIiB0YWJpbmRleD1cIjFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwiJ2hlcm9pY29uc19vdXRsaW5lOmNoZXZyb24tbGVmdCdcIj48L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtbGFiZWxcIj57e2dldE1vbnRoTGFiZWwoMSl9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG1hdC1tb250aC12aWV3IFsoYWN0aXZlRGF0ZSldPVwiYWN0aXZlRGF0ZXMubW9udGgxXCIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlcigpXCIgW2RhdGVDbGFzc109XCJkYXRlQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXCIgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0ZWREYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgI21hdE1vbnRoVmlldzE+XHJcbiAgICAgICAgICAgIDwvbWF0LW1vbnRoLXZpZXc+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInRpbWUgc3RhcnQtdGltZVwiICpuZ0lmPVwidGltZVJhbmdlXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbYXV0b2NvbXBsZXRlXT1cIidvZmYnXCIgW2Zvcm1Db250cm9sXT1cInN0YXJ0VGltZUZvcm1Db250cm9sXCIgKGJsdXIpPVwidXBkYXRlU3RhcnRUaW1lKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIzXCI+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+5byA5aeL5pe26Ze0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEVuZCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJlbmRcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1sYWJlbFwiPnt7Z2V0TW9udGhMYWJlbCgyKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5leHQtYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJuZXh0KClcIiB0YWJpbmRleD1cIjJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwiJ2hlcm9pY29uc19vdXRsaW5lOmNoZXZyb24tcmlnaHQnXCI+PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG1hdC1tb250aC12aWV3IFsoYWN0aXZlRGF0ZSldPVwiYWN0aXZlRGF0ZXMubW9udGgyXCIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlcigpXCIgW2RhdGVDbGFzc109XCJkYXRlQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXCIgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0ZWREYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgI21hdE1vbnRoVmlldzI+XHJcbiAgICAgICAgICAgIDwvbWF0LW1vbnRoLXZpZXc+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInRpbWUgZW5kLXRpbWVcIiAqbmdJZj1cInRpbWVSYW5nZVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImVuZFRpbWVGb3JtQ29udHJvbFwiIChibHVyKT1cInVwZGF0ZUVuZFRpbWUoJGV2ZW50KVwiIHRhYmluZGV4PVwiNFwiPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPue7k+adn+aXtumXtDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG48L25nLXRlbXBsYXRlPiJdfQ==