@ardium-ui/ui 1.0.3 → 2.0.2

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 (445) hide show
  1. package/README.md +25 -25
  2. package/esm2022/lib/_internal/boolean-component.mjs +28 -42
  3. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +5 -5
  4. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +5 -5
  5. package/esm2022/lib/_internal/disablable-component.mjs +24 -22
  6. package/esm2022/lib/_internal/focusable-component.mjs +12 -25
  7. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +172 -169
  8. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +115 -120
  9. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +56 -53
  10. package/esm2022/lib/_internal/models/pagination.model.mjs +72 -106
  11. package/esm2022/lib/_internal/ngmodel-component.mjs +5 -5
  12. package/esm2022/lib/_internal/queue.mjs +1 -1
  13. package/esm2022/lib/_internal/selectable-list-component.mjs +74 -98
  14. package/esm2022/lib/badge/badge.directive.mjs +70 -99
  15. package/esm2022/lib/badge/badge.module.mjs +5 -5
  16. package/esm2022/lib/badge/badge.types.mjs +1 -1
  17. package/esm2022/lib/badge/index.mjs +4 -0
  18. package/esm2022/lib/buttons/_button-base.mjs +13 -35
  19. package/esm2022/lib/buttons/button/button.component.mjs +22 -37
  20. package/esm2022/lib/buttons/button/button.module.mjs +5 -5
  21. package/esm2022/lib/buttons/button/index.mjs +3 -0
  22. package/esm2022/lib/buttons/fab/fab.component.mjs +16 -28
  23. package/esm2022/lib/buttons/fab/fab.module.mjs +5 -5
  24. package/esm2022/lib/buttons/fab/index.mjs +3 -0
  25. package/esm2022/lib/buttons/general-button.types.mjs +1 -1
  26. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +17 -25
  27. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +5 -5
  28. package/esm2022/lib/buttons/icon-button/index.mjs +3 -0
  29. package/esm2022/lib/card/card.children.mjs +32 -33
  30. package/esm2022/lib/card/card.component.mjs +14 -17
  31. package/esm2022/lib/card/card.module.mjs +5 -5
  32. package/esm2022/lib/card/card.types.mjs +1 -1
  33. package/esm2022/lib/card/index.mjs +5 -0
  34. package/esm2022/lib/checkbox/checkbox.component.mjs +33 -46
  35. package/esm2022/lib/checkbox/checkbox.module.mjs +5 -5
  36. package/esm2022/lib/checkbox/checkbox.types.mjs +1 -1
  37. package/esm2022/lib/checkbox/index.mjs +4 -0
  38. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +31 -57
  39. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +5 -5
  40. package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +1 -1
  41. package/esm2022/lib/checkbox-list/index.mjs +4 -0
  42. package/esm2022/lib/chip/chip.component.mjs +22 -42
  43. package/esm2022/lib/chip/chip.module.mjs +5 -5
  44. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +28 -53
  45. package/esm2022/lib/chip/index.mjs +5 -0
  46. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +25 -49
  47. package/esm2022/lib/color/color-display/color-display.component.mjs +15 -32
  48. package/esm2022/lib/color/color-display/color-display.module.mjs +5 -5
  49. package/esm2022/lib/color/color-display/color-display.types.mjs +1 -1
  50. package/esm2022/lib/color/color-display/index.mjs +4 -0
  51. package/esm2022/lib/color/color-picker/color-picker.types.mjs +1 -1
  52. package/esm2022/lib/dialog/dialog.component.mjs +54 -130
  53. package/esm2022/lib/dialog/dialog.directives.mjs +4 -4
  54. package/esm2022/lib/dialog/dialog.module.mjs +5 -5
  55. package/esm2022/lib/dialog/dialog.types.mjs +1 -1
  56. package/esm2022/lib/dialog/index.mjs +5 -0
  57. package/esm2022/lib/divider/divider.component.mjs +9 -14
  58. package/esm2022/lib/divider/divider.module.mjs +5 -5
  59. package/esm2022/lib/divider/index.mjs +3 -0
  60. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +40 -59
  61. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +5 -5
  62. package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +1 -1
  63. package/esm2022/lib/dropdown-panel/index.mjs +4 -0
  64. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +12 -17
  65. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +10 -10
  66. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +6 -6
  67. package/esm2022/lib/file-inputs/file-drop-area/index.mjs +4 -0
  68. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +24 -50
  69. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +19 -19
  70. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +5 -5
  71. package/esm2022/lib/file-inputs/file-input/index.mjs +4 -0
  72. package/esm2022/lib/file-inputs/file-input-base.mjs +38 -72
  73. package/esm2022/lib/file-inputs/file-input-types.mjs +1 -1
  74. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +20 -47
  75. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +7 -7
  76. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +5 -5
  77. package/esm2022/lib/form-field-frame/index.mjs +4 -0
  78. package/esm2022/lib/icon/icon.component.mjs +32 -67
  79. package/esm2022/lib/icon/icon.module.mjs +5 -5
  80. package/esm2022/lib/icon/icon.pipe.mjs +4 -4
  81. package/esm2022/lib/icon/index.mjs +4 -0
  82. package/esm2022/lib/inputs/color-input/color-input.directives.mjs +25 -25
  83. package/esm2022/lib/inputs/color-input/color-input.types.mjs +1 -1
  84. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +65 -115
  85. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +83 -92
  86. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +5 -5
  87. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +1 -1
  88. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +1 -1
  89. package/esm2022/lib/inputs/digit-input/index.mjs +4 -0
  90. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +59 -122
  91. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +10 -10
  92. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +24 -8
  93. package/esm2022/lib/inputs/hex-input/index.mjs +4 -0
  94. package/esm2022/lib/inputs/hex-input.model.mjs +24 -33
  95. package/esm2022/lib/inputs/input/index.mjs +4 -0
  96. package/esm2022/lib/inputs/input/input.component.mjs +95 -154
  97. package/esm2022/lib/inputs/input/input.directives.mjs +16 -16
  98. package/esm2022/lib/inputs/input/input.module.mjs +21 -7
  99. package/esm2022/lib/inputs/input-transformers.mjs +6 -6
  100. package/esm2022/lib/inputs/input-types.mjs +1 -1
  101. package/esm2022/lib/inputs/input-utils.mjs +75 -94
  102. package/esm2022/lib/inputs/number-input/index.mjs +4 -0
  103. package/esm2022/lib/inputs/number-input/number-input.component.mjs +106 -170
  104. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +4 -4
  105. package/esm2022/lib/inputs/number-input/number-input.module.mjs +5 -5
  106. package/esm2022/lib/inputs/password-input/index.mjs +5 -0
  107. package/esm2022/lib/inputs/password-input/password-input.component.mjs +74 -144
  108. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +13 -13
  109. package/esm2022/lib/inputs/password-input/password-input.module.mjs +5 -5
  110. package/esm2022/lib/inputs/password-input/password-input.types.mjs +1 -1
  111. package/esm2022/lib/inputs/simple-input/index.mjs +4 -0
  112. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +57 -110
  113. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +10 -10
  114. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +5 -5
  115. package/esm2022/lib/kbd/index.mjs +4 -0
  116. package/esm2022/lib/kbd/kbd.component.mjs +15 -29
  117. package/esm2022/lib/kbd/kbd.module.mjs +5 -5
  118. package/esm2022/lib/kbd/kbd.pipe.mjs +4 -4
  119. package/esm2022/lib/kbd-shortcut/index.mjs +3 -0
  120. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +23 -40
  121. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +5 -5
  122. package/esm2022/lib/modal/index.mjs +3 -0
  123. package/esm2022/lib/modal/modal.component.mjs +42 -83
  124. package/esm2022/lib/modal/modal.module.mjs +5 -5
  125. package/esm2022/lib/option/index.mjs +3 -0
  126. package/esm2022/lib/option/option.component.mjs +24 -46
  127. package/esm2022/lib/option/option.module.mjs +5 -5
  128. package/esm2022/lib/progress-bar/index.mjs +5 -0
  129. package/esm2022/lib/progress-bar/progress-bar.component.mjs +43 -81
  130. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +4 -4
  131. package/esm2022/lib/progress-bar/progress-bar.module.mjs +5 -5
  132. package/esm2022/lib/progress-bar/progress-bar.types.mjs +1 -1
  133. package/esm2022/lib/progress-circle/index.mjs +5 -0
  134. package/esm2022/lib/progress-circle/progress-circle.component.mjs +33 -78
  135. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +4 -4
  136. package/esm2022/lib/progress-circle/progress-circle.module.mjs +5 -5
  137. package/esm2022/lib/progress-circle/progress-circle.types.mjs +1 -1
  138. package/esm2022/lib/radio/index.mjs +4 -0
  139. package/esm2022/lib/radio/radio/radio.component.mjs +16 -25
  140. package/esm2022/lib/radio/radio-group.component.mjs +71 -85
  141. package/esm2022/lib/radio/radio.module.mjs +5 -5
  142. package/esm2022/lib/search-functions.mjs +7 -7
  143. package/esm2022/lib/segment/index.mjs +5 -0
  144. package/esm2022/lib/segment/segment.component.mjs +70 -137
  145. package/esm2022/lib/segment/segment.directives.mjs +4 -4
  146. package/esm2022/lib/segment/segment.module.mjs +5 -5
  147. package/esm2022/lib/segment/segment.types.mjs +1 -1
  148. package/esm2022/lib/select/index.mjs +5 -0
  149. package/esm2022/lib/select/select.component.mjs +348 -655
  150. package/esm2022/lib/select/select.directive.mjs +46 -46
  151. package/esm2022/lib/select/select.module.mjs +5 -5
  152. package/esm2022/lib/select/select.types.mjs +1 -1
  153. package/esm2022/lib/slide-toggle/index.mjs +4 -0
  154. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +19 -24
  155. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +5 -5
  156. package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +5 -0
  157. package/esm2022/lib/slider/abstract-slider.mjs +111 -200
  158. package/esm2022/lib/slider/index.mjs +7 -0
  159. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +26 -23
  160. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +5 -5
  161. package/esm2022/lib/slider/slider.component.mjs +13 -10
  162. package/esm2022/lib/slider/slider.directive.mjs +4 -4
  163. package/esm2022/lib/slider/slider.module.mjs +7 -7
  164. package/esm2022/lib/slider/slider.types.mjs +1 -1
  165. package/esm2022/lib/snackbar/index.mjs +1 -1
  166. package/esm2022/lib/snackbar/snackbar-ref.mjs +1 -1
  167. package/esm2022/lib/snackbar/snackbar.component.mjs +8 -8
  168. package/esm2022/lib/snackbar/snackbar.service.mjs +13 -12
  169. package/esm2022/lib/snackbar/snackbar.token.mjs +1 -1
  170. package/esm2022/lib/snackbar/snackbar.types.mjs +1 -1
  171. package/esm2022/lib/spinner/index.mjs +3 -0
  172. package/esm2022/lib/spinner/spinner.component.mjs +9 -13
  173. package/esm2022/lib/spinner/spinner.module.mjs +5 -5
  174. package/esm2022/lib/star/index.mjs +4 -0
  175. package/esm2022/lib/star/star-button/index.mjs +3 -0
  176. package/esm2022/lib/star/star-button/star-button.component.mjs +17 -26
  177. package/esm2022/lib/star/star-button/star-button.module.mjs +5 -5
  178. package/esm2022/lib/star/star-display/index.mjs +3 -0
  179. package/esm2022/lib/star/star-display/star-display.component.mjs +48 -55
  180. package/esm2022/lib/star/star-display/star-display.module.mjs +5 -5
  181. package/esm2022/lib/star/star-input/index.mjs +3 -0
  182. package/esm2022/lib/star/star-input/star-input.component.mjs +70 -106
  183. package/esm2022/lib/star/star-input/star-input.module.mjs +5 -5
  184. package/esm2022/lib/star/star.component.mjs +12 -20
  185. package/esm2022/lib/star/star.module.mjs +5 -5
  186. package/esm2022/lib/star/star.types.mjs +1 -1
  187. package/esm2022/lib/statebox/index.mjs +3 -0
  188. package/esm2022/lib/statebox/statebox.component.mjs +64 -102
  189. package/esm2022/lib/statebox/statebox.module.mjs +5 -5
  190. package/esm2022/lib/statebox/statebox.types.mjs +1 -1
  191. package/esm2022/lib/tabber/index.mjs +4 -0
  192. package/esm2022/lib/tabber/tab/tab.component.mjs +42 -0
  193. package/esm2022/lib/tabber/tabber.component.mjs +83 -0
  194. package/esm2022/lib/tabber/tabber.module.mjs +19 -0
  195. package/esm2022/lib/table/index.mjs +5 -0
  196. package/esm2022/lib/table/table-item-storage.mjs +204 -200
  197. package/esm2022/lib/table/table.component.mjs +184 -304
  198. package/esm2022/lib/table/table.directives.mjs +19 -21
  199. package/esm2022/lib/table/table.module.mjs +5 -5
  200. package/esm2022/lib/table/table.types.mjs +1 -1
  201. package/esm2022/lib/table/utils.mjs +1 -1
  202. package/esm2022/lib/table-from-csv/index.mjs +3 -0
  203. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +85 -29
  204. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +5 -5
  205. package/esm2022/lib/table-pagination/index.mjs +4 -0
  206. package/esm2022/lib/table-pagination/table-pagination.component.mjs +46 -114
  207. package/esm2022/lib/table-pagination/table-pagination.module.mjs +5 -5
  208. package/esm2022/lib/table-pagination/table-pagination.types.mjs +1 -1
  209. package/esm2022/lib/types/alignment.types.mjs +1 -1
  210. package/esm2022/lib/types/colors.types.mjs +1 -1
  211. package/esm2022/lib/types/item-storage.types.mjs +1 -1
  212. package/esm2022/lib/types/theming.types.mjs +1 -1
  213. package/esm2022/lib/types/utility.types.mjs +2 -2
  214. package/esm2022/public-api.mjs +58 -182
  215. package/fesm2022/ardium-ui-ui.mjs +7847 -11692
  216. package/fesm2022/ardium-ui-ui.mjs.map +1 -1
  217. package/lib/_internal/boolean-component.d.ts +8 -9
  218. package/lib/_internal/clear-button/clear-button.component.d.ts +1 -1
  219. package/lib/_internal/disablable-component.d.ts +12 -7
  220. package/lib/_internal/focusable-component.d.ts +5 -7
  221. package/lib/_internal/item-storages/dropdown-item-storage.d.ts +43 -41
  222. package/lib/_internal/item-storages/simple-item-storage.d.ts +28 -25
  223. package/lib/_internal/item-storages/simplest-item-storage.d.ts +14 -9
  224. package/lib/_internal/models/pagination.model.d.ts +38 -42
  225. package/lib/_internal/ngmodel-component.d.ts +1 -1
  226. package/lib/_internal/selectable-list-component.d.ts +30 -30
  227. package/lib/badge/badge.directive.d.ts +15 -20
  228. package/lib/badge/index.d.ts +3 -0
  229. package/lib/buttons/_button-base.d.ts +9 -12
  230. package/lib/buttons/button/button.component.d.ts +6 -8
  231. package/lib/buttons/button/index.d.ts +2 -0
  232. package/lib/buttons/fab/fab.component.d.ts +4 -6
  233. package/lib/buttons/fab/index.d.ts +2 -0
  234. package/lib/buttons/icon-button/icon-button.component.d.ts +6 -7
  235. package/lib/buttons/icon-button/index.d.ts +2 -0
  236. package/lib/card/card.children.d.ts +4 -3
  237. package/lib/card/card.component.d.ts +5 -4
  238. package/lib/card/index.d.ts +4 -0
  239. package/lib/checkbox/checkbox.component.d.ts +8 -12
  240. package/lib/checkbox/index.d.ts +3 -0
  241. package/lib/checkbox-list/checkbox-list.component.d.ts +22 -21
  242. package/lib/checkbox-list/index.d.ts +3 -0
  243. package/lib/chip/chip.component.d.ts +8 -10
  244. package/lib/chip/deletable-chip/deletable-chip.component.d.ts +11 -14
  245. package/lib/chip/index.d.ts +4 -0
  246. package/lib/chip/selectable-chip/selectable-chip.component.d.ts +10 -12
  247. package/lib/color/color-display/color-display.component.d.ts +6 -9
  248. package/lib/color/color-display/index.d.ts +3 -0
  249. package/lib/color/color-picker/color-picker.types.d.ts +4 -4
  250. package/lib/dialog/dialog.component.d.ts +25 -35
  251. package/lib/dialog/dialog.types.d.ts +2 -2
  252. package/lib/dialog/index.d.ts +4 -0
  253. package/lib/divider/divider.component.d.ts +3 -4
  254. package/lib/divider/index.d.ts +2 -0
  255. package/lib/dropdown-panel/dropdown-panel.component.d.ts +17 -20
  256. package/lib/dropdown-panel/index.d.ts +3 -0
  257. package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +5 -4
  258. package/lib/file-inputs/file-drop-area/index.d.ts +3 -0
  259. package/lib/file-inputs/file-input/file-input.component.d.ts +13 -17
  260. package/lib/file-inputs/file-input/index.d.ts +3 -0
  261. package/lib/file-inputs/file-input-base.d.ts +13 -18
  262. package/lib/form-field-frame/form-field-frame.component.d.ts +12 -16
  263. package/lib/form-field-frame/index.d.ts +3 -0
  264. package/lib/icon/icon.component.d.ts +10 -19
  265. package/lib/icon/index.d.ts +3 -0
  266. package/lib/inputs/color-input/color-input.types.d.ts +2 -2
  267. package/lib/inputs/digit-input/digit-input.component.d.ts +22 -30
  268. package/lib/inputs/digit-input/digit-input.model.d.ts +8 -12
  269. package/lib/inputs/digit-input/digit-input.types.d.ts +4 -4
  270. package/lib/inputs/digit-input/digit-input.utils.d.ts +4 -5
  271. package/lib/inputs/digit-input/index.d.ts +3 -0
  272. package/lib/inputs/hex-input/hex-input.component.d.ts +32 -38
  273. package/lib/inputs/hex-input/index.d.ts +3 -0
  274. package/lib/inputs/hex-input.model.d.ts +10 -11
  275. package/lib/inputs/input/index.d.ts +3 -0
  276. package/lib/inputs/input/input.component.d.ts +34 -40
  277. package/lib/inputs/input/input.directives.d.ts +3 -3
  278. package/lib/inputs/input-utils.d.ts +24 -27
  279. package/lib/inputs/number-input/index.d.ts +3 -0
  280. package/lib/inputs/number-input/number-input.component.d.ts +38 -48
  281. package/lib/inputs/password-input/index.d.ts +4 -0
  282. package/lib/inputs/password-input/password-input.component.d.ts +28 -40
  283. package/lib/inputs/password-input/password-input.types.d.ts +2 -2
  284. package/lib/inputs/simple-input/index.d.ts +3 -0
  285. package/lib/inputs/simple-input/simple-input.component.d.ts +30 -35
  286. package/lib/kbd/index.d.ts +3 -0
  287. package/lib/kbd/kbd.component.d.ts +6 -8
  288. package/lib/kbd-shortcut/index.d.ts +2 -0
  289. package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +7 -10
  290. package/lib/modal/index.d.ts +2 -0
  291. package/lib/modal/modal.component.d.ts +22 -30
  292. package/lib/option/index.d.ts +2 -0
  293. package/lib/option/option.component.d.ts +11 -16
  294. package/lib/progress-bar/index.d.ts +4 -0
  295. package/lib/progress-bar/progress-bar.component.d.ts +14 -20
  296. package/lib/progress-bar/progress-bar.types.d.ts +2 -2
  297. package/lib/progress-circle/index.d.ts +4 -0
  298. package/lib/progress-circle/progress-circle.component.d.ts +12 -20
  299. package/lib/progress-circle/progress-circle.types.d.ts +2 -2
  300. package/lib/radio/index.d.ts +3 -0
  301. package/lib/radio/radio/radio.component.d.ts +7 -8
  302. package/lib/radio/radio-group.component.d.ts +13 -16
  303. package/lib/segment/index.d.ts +4 -0
  304. package/lib/segment/segment.component.d.ts +22 -34
  305. package/lib/segment/segment.directives.d.ts +2 -3
  306. package/lib/select/index.d.ts +4 -0
  307. package/lib/select/select.component.d.ts +114 -160
  308. package/lib/select/select.directive.d.ts +3 -3
  309. package/lib/select/select.types.d.ts +2 -76
  310. package/lib/slide-toggle/index.d.ts +3 -0
  311. package/lib/slide-toggle/slide-toggle.component.d.ts +9 -7
  312. package/lib/slide-toggle/slide-toggle.types.d.ts +5 -0
  313. package/lib/slider/abstract-slider.d.ts +38 -55
  314. package/lib/slider/index.d.ts +6 -0
  315. package/lib/slider/range-slider/range-slider.component.d.ts +3 -1
  316. package/lib/slider/slider.component.d.ts +2 -0
  317. package/lib/slider/slider.types.d.ts +8 -8
  318. package/lib/snackbar/snackbar-ref.d.ts +1 -2
  319. package/lib/snackbar/snackbar.component.d.ts +3 -3
  320. package/lib/snackbar/snackbar.service.d.ts +2 -2
  321. package/lib/snackbar/snackbar.types.d.ts +4 -4
  322. package/lib/spinner/index.d.ts +2 -0
  323. package/lib/spinner/spinner.component.d.ts +3 -3
  324. package/lib/star/index.d.ts +3 -0
  325. package/lib/star/star-button/index.d.ts +2 -0
  326. package/lib/star/star-button/star-button.component.d.ts +7 -7
  327. package/lib/star/star-display/index.d.ts +2 -0
  328. package/lib/star/star-display/star-display.component.d.ts +8 -12
  329. package/lib/star/star-input/index.d.ts +2 -0
  330. package/lib/star/star-input/star-input.component.d.ts +17 -22
  331. package/lib/star/star.component.d.ts +5 -5
  332. package/lib/statebox/index.d.ts +3 -0
  333. package/lib/statebox/statebox.component.d.ts +15 -21
  334. package/lib/statebox/statebox.types.d.ts +12 -8
  335. package/lib/tabber/index.d.ts +3 -0
  336. package/lib/tabber/tab/tab.component.d.ts +18 -0
  337. package/lib/tabber/tabber.component.d.ts +25 -0
  338. package/lib/tabber/tabber.module.d.ts +9 -0
  339. package/lib/table/index.d.ts +4 -0
  340. package/lib/table/table-item-storage.d.ts +70 -58
  341. package/lib/table/table.component.d.ts +59 -78
  342. package/lib/table/table.directives.d.ts +4 -3
  343. package/lib/table-from-csv/index.d.ts +2 -0
  344. package/lib/table-from-csv/table-from-csv.component.d.ts +46 -9
  345. package/lib/table-pagination/index.d.ts +3 -0
  346. package/lib/table-pagination/table-pagination.component.d.ts +21 -30
  347. package/lib/types/item-storage.types.d.ts +19 -18
  348. package/lib/types/utility.types.d.ts +2 -1
  349. package/package.json +8 -9
  350. package/prebuilt-themes/default/badge.css +5 -5
  351. package/prebuilt-themes/default/buttons/fab.css +4 -3
  352. package/prebuilt-themes/default/buttons/fab.css.map +1 -1
  353. package/prebuilt-themes/default/card.css +7 -7
  354. package/prebuilt-themes/default/chips.css +3 -8
  355. package/prebuilt-themes/default/chips.css.map +1 -1
  356. package/prebuilt-themes/default/core.css +6 -3
  357. package/prebuilt-themes/default/core.css.map +1 -1
  358. package/prebuilt-themes/default/inputs/color-input.css +1 -1
  359. package/prebuilt-themes/default/inputs/digit-input.css +1 -1
  360. package/prebuilt-themes/default/inputs/file-input.css +139 -2
  361. package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
  362. package/prebuilt-themes/default/inputs/hex-input.css +2 -2
  363. package/prebuilt-themes/default/inputs/input.css +1 -1
  364. package/prebuilt-themes/default/inputs/search-bar.css +1 -1
  365. package/prebuilt-themes/default/inputs/simple-input.css +1 -1
  366. package/prebuilt-themes/default/modal.css +1 -1
  367. package/prebuilt-themes/default/segment.css +2 -2
  368. package/prebuilt-themes/default/segment.css.map +1 -1
  369. package/prebuilt-themes/default/select.css +5 -3
  370. package/prebuilt-themes/default/select.css.map +1 -1
  371. package/prebuilt-themes/default/snackbar.css +0 -1
  372. package/prebuilt-themes/default/snackbar.css.map +1 -1
  373. package/prebuilt-themes/default/tabber.css +207 -0
  374. package/prebuilt-themes/default/tabber.css.map +1 -0
  375. package/public-api.d.ts +43 -136
  376. package/themes/_variables.scss +121 -121
  377. package/themes/default/_clear-button.scss +73 -73
  378. package/themes/default/_coloring.scss +137 -137
  379. package/themes/default/_dropdown-arrow.scss +12 -12
  380. package/themes/default/_mixins.scss +70 -70
  381. package/themes/default/badge.scss +94 -94
  382. package/themes/default/buttons/_button-mixins.scss +144 -144
  383. package/themes/default/buttons/button.scss +62 -62
  384. package/themes/default/buttons/fab.scss +74 -72
  385. package/themes/default/buttons/icon-button.scss +59 -59
  386. package/themes/default/calendar.scss +182 -182
  387. package/themes/default/card.scss +126 -126
  388. package/themes/default/checkbox-list.scss +83 -83
  389. package/themes/default/checkbox.scss +109 -109
  390. package/themes/default/chips.scss +200 -206
  391. package/themes/default/color-display.scss +41 -41
  392. package/themes/default/color-picker.scss +111 -111
  393. package/themes/default/core.scss +99 -96
  394. package/themes/default/dialog.scss +16 -16
  395. package/themes/default/divider.scss +13 -13
  396. package/themes/default/dropdown-panel.scss +45 -45
  397. package/themes/default/file-drop-area.scss +162 -162
  398. package/themes/default/form-field-frame.scss +78 -78
  399. package/themes/default/inputs/_shared.scss +46 -46
  400. package/themes/default/inputs/color-input.scss +46 -46
  401. package/themes/default/inputs/digit-input.scss +56 -56
  402. package/themes/default/inputs/file-input.scss +85 -78
  403. package/themes/default/inputs/hex-input.scss +27 -27
  404. package/themes/default/inputs/input.scss +52 -52
  405. package/themes/default/inputs/number-input.scss +121 -121
  406. package/themes/default/inputs/password-input.scss +43 -43
  407. package/themes/default/inputs/search-bar.scss +19 -19
  408. package/themes/default/inputs/simple-input.scss +19 -19
  409. package/themes/default/kbd-shortcut.scss +13 -13
  410. package/themes/default/kbd.scss +20 -20
  411. package/themes/default/modal.scss +93 -93
  412. package/themes/default/progress-bar.scss +166 -166
  413. package/themes/default/progress-circle.scss +56 -56
  414. package/themes/default/radio.scss +112 -112
  415. package/themes/default/segment.scss +340 -339
  416. package/themes/default/select.scss +255 -253
  417. package/themes/default/slide-toggle.scss +151 -151
  418. package/themes/default/slider.scss +224 -224
  419. package/themes/default/snackbar.scss +58 -60
  420. package/themes/default/spinner.scss +21 -21
  421. package/themes/default/stars.scss +122 -122
  422. package/themes/default/statebox.scss +109 -109
  423. package/themes/default/tabber.scss +86 -0
  424. package/themes/default/table-pagination.scss +56 -56
  425. package/themes/default/table.scss +403 -403
  426. package/esm2022/lib/calendar/calendar.component.mjs +0 -979
  427. package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
  428. package/esm2022/lib/calendar/calendar.helpers.mjs +0 -47
  429. package/esm2022/lib/calendar/calendar.module.mjs +0 -21
  430. package/esm2022/lib/calendar/calendar.types.mjs +0 -11
  431. package/esm2022/lib/color/color-picker/color-picker.component.mjs +0 -484
  432. package/esm2022/lib/color/color-picker/color-picker.directives.mjs +0 -55
  433. package/esm2022/lib/color/color-picker/color-picker.module.mjs +0 -43
  434. package/esm2022/lib/inputs/color-input/color-input.component.mjs +0 -421
  435. package/esm2022/lib/inputs/color-input/color-input.module.mjs +0 -85
  436. package/lib/calendar/calendar.component.d.ts +0 -155
  437. package/lib/calendar/calendar.directives.d.ts +0 -51
  438. package/lib/calendar/calendar.helpers.d.ts +0 -15
  439. package/lib/calendar/calendar.module.d.ts +0 -11
  440. package/lib/calendar/calendar.types.d.ts +0 -80
  441. package/lib/color/color-picker/color-picker.component.d.ts +0 -125
  442. package/lib/color/color-picker/color-picker.directives.d.ts +0 -27
  443. package/lib/color/color-picker/color-picker.module.d.ts +0 -13
  444. package/lib/inputs/color-input/color-input.component.d.ts +0 -147
  445. package/lib/inputs/color-input/color-input.module.d.ts +0 -16
@@ -1,979 +0,0 @@
1
- import { forwardRef } from '@angular/core';
2
- import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, HostListener, Input, Output, ViewEncapsulation, } from '@angular/core';
3
- import { coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
4
- import { roundToMultiple } from 'more-rounding';
5
- import { isDefined, isNull } from 'simple-bool';
6
- import { ComponentColor } from '../types/colors.types';
7
- import { _NgModelComponentBase } from '../_internal/ngmodel-component';
8
- import { ArdDaysViewHeaderTemplateDirective, ArdDayTemplateDirective, ArdFloatingMonthTemplateDirective, ArdMonthsViewHeaderTemplateDirective, ArdMonthTemplateDirective, ArdWeekdayTemplateDirective, ArdYearsViewHeaderTemplateDirective, ArdYearTemplateDirective, } from './calendar.directives';
9
- import { getMonthLayout } from './calendar.helpers';
10
- import { CalendarView, } from './calendar.types';
11
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/common";
14
- import * as i2 from "../buttons/button/button.component";
15
- import * as i3 from "../buttons/icon-button/icon-button.component";
16
- import * as i4 from "../icon/icon.component";
17
- function isLeapYear(year) {
18
- return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
19
- }
20
- export class ArdiumCalendarComponent extends _NgModelComponentBase {
21
- constructor() {
22
- super(...arguments);
23
- this._wasSelectedChecked = false;
24
- //! determining today state
25
- this.todayDate = new Date();
26
- //! color & wrapper classes
27
- this.color = ComponentColor.Primary;
28
- //! open year & month setters
29
- //pick a year range start so that the today date is always in the 3rd row
30
- this.todayYearRangeStart = this.todayDate.getFullYear() - (this.todayDate.getFullYear() % 4) - 8;
31
- this.displayedYearRangeStart = this.todayYearRangeStart;
32
- this.yearRangeArrayCache = null;
33
- this._activeDate = new Date(this.todayDate.getFullYear(), this.todayDate.getMonth(), this.todayDate.getDate());
34
- //! selection functions
35
- this._selected = null;
36
- //! output events
37
- this.yearSelected = new EventEmitter();
38
- this.monthSelected = new EventEmitter();
39
- this.selectedChange = new EventEmitter();
40
- this.activeYearChange = new EventEmitter();
41
- this.activeMonthChange = new EventEmitter();
42
- this.viewChange = new EventEmitter();
43
- this.changeEvent = new EventEmitter();
44
- //! calendar entry hover & click
45
- this._highlightedDay = null;
46
- this._highlightedMonth = null;
47
- this._highlightedYear = null;
48
- this._isUsingKeyboard = false;
49
- //! settings
50
- this._firstWeekday = 1;
51
- this._nointeract = false;
52
- this._staticHeight = false;
53
- //months view array
54
- this.monthsArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
55
- //years view array
56
- this._yearsArrayCache = null;
57
- this._yearsArrayCacheStartYear = null;
58
- //! change view functions
59
- this.activeView = CalendarView.Days;
60
- }
61
- ngOnInit() {
62
- this._updateCalendarArray();
63
- this._updateWeekdayArray();
64
- this._updateDisplayedYearRangeStart();
65
- }
66
- ngOnChanges(changes) {
67
- if (this._wasSelectedChecked)
68
- return;
69
- this._wasSelectedChecked = true;
70
- if (changes['selected']) {
71
- const v = this.selected;
72
- if (isNull(v))
73
- return;
74
- this.activeDate = new Date(v.getFullYear(), v.getMonth(), 1);
75
- }
76
- }
77
- isDayToday(day) {
78
- return this.activeYear == this.todayDate.getFullYear() && this.activeMonth == this.todayDate.getMonth() && day == this.todayDate.getDate();
79
- }
80
- isMonthToday(month) {
81
- return this.activeYear == this.todayDate.getFullYear() && month == this.todayDate.getMonth();
82
- }
83
- isYearToday(year) {
84
- return year == this.todayDate.getFullYear();
85
- }
86
- //! determining if an entry is selected
87
- isDaySelected(day) {
88
- if (day instanceof Date)
89
- day = day.getDate();
90
- return (this.selected != null && this.activeYear == this.selected.getFullYear() && this.activeMonth == this.selected.getMonth() && day == this.selected.getDate());
91
- }
92
- isMonthSelected(month) {
93
- if (month instanceof Date)
94
- month = month.getMonth();
95
- return this.selected != null && this.activeYear == this.selected.getFullYear() && month == this.selected.getMonth();
96
- }
97
- isYearSelected(year) {
98
- if (year instanceof Date)
99
- year = year.getFullYear();
100
- return this.selected != null && year == this.selected.getFullYear();
101
- }
102
- get ngClasses() {
103
- return [`ard-color-${this.color}`, this.nointeract ? 'ard-calendar-nointeract' : '', this.staticHeight ? 'ard-calendar-static-height' : ''].join(' ');
104
- }
105
- _updateDisplayedYearRangeStart(forcedYear) {
106
- if (isDefined(forcedYear))
107
- this.displayedYearRangeStart = forcedYear;
108
- //add the difference between the active year and the start of the range for the current year
109
- //rounded to a multiple of 24, towards the number zero
110
- //the difference may be negative, if the active year is before todayYearRangeStart
111
- this.displayedYearRangeStart = this.todayYearRangeStart + roundToMultiple(this.activeYear - this.todayYearRangeStart, 24, 'to_zero');
112
- }
113
- get yearRangeArray() {
114
- if (!this.yearRangeArrayCache) {
115
- let yearRangeStart = this.displayedYearRangeStart;
116
- const newArray = new Array(24).map(() => yearRangeStart++);
117
- this.yearRangeArrayCache = newArray;
118
- }
119
- return this.yearRangeArrayCache;
120
- }
121
- set activeDate(v) {
122
- const newDate = new Date(v);
123
- if (this.activeYear != newDate.getFullYear())
124
- this.yearRangeArrayCache = null;
125
- this._activeDate = newDate;
126
- this._updateCalendarArray();
127
- }
128
- get activeDate() {
129
- return this._activeDate;
130
- }
131
- get activeYear() {
132
- return this._activeDate.getFullYear();
133
- }
134
- set activeYear(v) {
135
- const year = coerceNumberProperty(v, new Date().getFullYear());
136
- this._activeDate.setFullYear(year);
137
- this.activeDate = new Date(year, this.activeMonth, 1);
138
- this.yearRangeArrayCache = null;
139
- this._updateCalendarArray();
140
- }
141
- get activeMonth() {
142
- return this._activeDate.getMonth();
143
- }
144
- set activeMonth(v) {
145
- const month = coerceNumberProperty(v, new Date().getMonth());
146
- const oldDateYear = this.activeYear;
147
- this.activeDate = new Date(this.activeYear, month, 1);
148
- if (oldDateYear != this.activeYear)
149
- this.yearRangeArrayCache = null;
150
- this._updateCalendarArray();
151
- }
152
- set selected(v) {
153
- this.writeValue(v);
154
- }
155
- get selected() {
156
- return this._selected;
157
- }
158
- writeValue(v) {
159
- if (typeof v == 'string') {
160
- //try to see if it is an array of numbers separated by a comma
161
- const vAsArray1 = v.split(',').map(v => Number(v));
162
- if (vAsArray1.length >= 1 && vAsArray1.length <= 3 && vAsArray1.every(v => !isNaN(v))) {
163
- v = new Date(vAsArray1[0], vAsArray1[1] ?? 0, vAsArray1[2] ?? 1);
164
- }
165
- else {
166
- //try to see if it is an array of numbers separated by some whitespace
167
- const vAsArray2 = v.split(/\s/).map(v => Number(v));
168
- if (vAsArray2.length >= 1 && vAsArray2.length <= 3 && vAsArray2.every(v => !isNaN(v))) {
169
- v = new Date(vAsArray2[0], vAsArray2[1] ?? 0, vAsArray2[2] ?? 1);
170
- }
171
- else {
172
- v = new Date(v);
173
- }
174
- }
175
- }
176
- //is a Date object && does not contain an error
177
- if (v instanceof Date && !isNaN(v.valueOf())) {
178
- this._selected = v;
179
- return;
180
- }
181
- if (v == null) {
182
- this._selected = null;
183
- return;
184
- }
185
- console.warn(`Could not parse [selected] value on <ard-calendar>, as it is not a valid value. Provided value: "${v}"`);
186
- this._selected = null;
187
- }
188
- _emitChange() {
189
- const v = this.selected;
190
- this._onChangeRegistered?.(v);
191
- this.selectedChange.emit(v);
192
- this.changeEvent.emit(v);
193
- }
194
- get highlightedDay() {
195
- return this._highlightedDay;
196
- }
197
- set highlightedDay(v) {
198
- if (isNull(v)) {
199
- this._highlightedDay = v;
200
- return;
201
- }
202
- const date = new Date(this.activeYear, this.activeMonth, v);
203
- this._highlightedDay = date.getDate();
204
- }
205
- setHighlightedDayAdjustDate(day) {
206
- this.highlightedDay = day;
207
- const date = new Date(this.activeYear, this.activeMonth, day);
208
- if (this.activeYear != date.getFullYear())
209
- this.activeYear = date.getFullYear();
210
- if (this.activeMonth != date.getMonth())
211
- this.activeMonth = date.getMonth();
212
- }
213
- get highlightedMonth() {
214
- return this._highlightedMonth;
215
- }
216
- set highlightedMonth(v) {
217
- if (isNull(v)) {
218
- this._highlightedMonth = v;
219
- return;
220
- }
221
- const date = new Date(this.activeYear, v, 1);
222
- this._highlightedMonth = date.getMonth();
223
- }
224
- setHighlightedMonthAdjustDate(month) {
225
- this.highlightedMonth = month;
226
- const date = new Date(this.activeYear, month, 1);
227
- if (this.activeYear != date.getFullYear())
228
- this.activeYear = date.getFullYear();
229
- }
230
- get highlightedYear() {
231
- return this._highlightedYear;
232
- }
233
- set highlightedYear(v) {
234
- this._highlightedYear = v;
235
- }
236
- setHighlightedYearAdjustPage(year) {
237
- this.highlightedYear = year;
238
- if (year < this.displayedYearRangeStart || year >= this.displayedYearRangeStart + 24) {
239
- //add the difference between the highlighted year and the displayed range start year
240
- //rounded to a multiple of 24, away from the number zero
241
- //the difference may be negative, if the first if condition is met
242
- this.displayedYearRangeStart += roundToMultiple(year - this.displayedYearRangeStart, 24, 'from_zero');
243
- }
244
- }
245
- get currentAriaLabel() {
246
- return new Date(this.activeYear, this.activeMonth, this.highlightedDay ?? 1).toLocaleDateString(undefined, {
247
- weekday: 'long',
248
- year: 'numeric',
249
- month: 'long',
250
- day: 'numeric',
251
- });
252
- }
253
- onCalendarDayMouseover(day) {
254
- if (day == null)
255
- return;
256
- if (this._isUsingKeyboard)
257
- return;
258
- this.highlightedDay = day;
259
- }
260
- onCalendarMonthMouseover(month) {
261
- if (this._isUsingKeyboard)
262
- return;
263
- this.highlightedMonth = month;
264
- }
265
- onCalendarYearMouseover(year) {
266
- if (this._isUsingKeyboard)
267
- return;
268
- this.highlightedYear = year;
269
- }
270
- onDocumentMousemove() {
271
- if (!this._isUsingKeyboard)
272
- this.highlightedDay = null;
273
- this._isUsingKeyboard = false;
274
- }
275
- onDocumentKeydown() {
276
- this._isUsingKeyboard = true;
277
- }
278
- onCalendarDayClick(day) {
279
- if (day == null)
280
- return;
281
- this.selectDay(day);
282
- this.focus();
283
- this.highlightedDay = day;
284
- }
285
- onCalendarMonthClick(month) {
286
- this.selectMonth(month);
287
- }
288
- onCalendarYearClick(year) {
289
- this.selectYear(year);
290
- }
291
- onDayGridFocus() {
292
- this.highlightedDay = 1;
293
- }
294
- onDayGridBlur() {
295
- this.highlightedDay = null;
296
- }
297
- onDayGridClick() {
298
- this.highlightedDay ??= 1;
299
- }
300
- onMonthGridFocus() {
301
- this.highlightedMonth = 0;
302
- }
303
- onMonthGridBlur() {
304
- this.highlightedMonth = null;
305
- }
306
- onMonthGridClick() {
307
- this.highlightedMonth ??= 0;
308
- }
309
- onYearGridFocus() {
310
- this.highlightedYear = this.displayedYearRangeStart;
311
- }
312
- onYearGridBlur() {
313
- this.highlightedYear = null;
314
- }
315
- onYearGridClick() {
316
- this.highlightedYear ??= this.displayedYearRangeStart;
317
- }
318
- //! main grid keyboard controls
319
- onMainGridKeydown(event) {
320
- switch (event.code) {
321
- case 'Space':
322
- case 'Enter':
323
- this._onEnterPress(event);
324
- break;
325
- case 'ArrowUp':
326
- this._onArrowUpPress(event);
327
- break;
328
- case 'ArrowDown':
329
- this._onArrowDownPress(event);
330
- break;
331
- case 'ArrowLeft':
332
- this._onArrowLeftPress(event);
333
- break;
334
- case 'ArrowRight':
335
- this._onArrowRightPress(event);
336
- break;
337
- case 'Home':
338
- this._onHomePress(event);
339
- break;
340
- case 'End':
341
- this._onEndPress(event);
342
- break;
343
- case 'PageUp':
344
- this._onPageUpPress(event);
345
- break;
346
- case 'PageDown':
347
- this._onPageDownPress(event);
348
- break;
349
- default:
350
- return;
351
- }
352
- }
353
- //select currently selected entry
354
- _onEnterPress(event) {
355
- event.preventDefault();
356
- this.selectCurrentlyHighlighted();
357
- }
358
- //highlight the entry one line above
359
- _onArrowUpPress(event) {
360
- event.preventDefault();
361
- switch (this.activeView) {
362
- case CalendarView.Days:
363
- this.highlightPreviousDay(7);
364
- break;
365
- case CalendarView.Months:
366
- this.highlightPreviousMonth(3); //3 months per line
367
- break;
368
- case CalendarView.Years:
369
- this.highlightPreviousYear(4); //4 years per line
370
- break;
371
- }
372
- }
373
- //highlight the entry one line below
374
- _onArrowDownPress(event) {
375
- event.preventDefault();
376
- switch (this.activeView) {
377
- case CalendarView.Days:
378
- this.highlightNextDay(7);
379
- break;
380
- case CalendarView.Months:
381
- this.highlightNextMonth(3); //3 months per line
382
- break;
383
- case CalendarView.Years:
384
- this.highlightNextYear(4); //4 years per line
385
- break;
386
- }
387
- }
388
- //highlight previous entry
389
- _onArrowLeftPress(event) {
390
- event.preventDefault();
391
- switch (this.activeView) {
392
- case CalendarView.Days:
393
- this.highlightPreviousDay();
394
- break;
395
- case CalendarView.Months:
396
- this.highlightPreviousMonth();
397
- break;
398
- case CalendarView.Years:
399
- this.highlightPreviousYear();
400
- break;
401
- }
402
- }
403
- //highlight next entry
404
- _onArrowRightPress(event) {
405
- event.preventDefault();
406
- switch (this.activeView) {
407
- case CalendarView.Days:
408
- this.highlightNextDay();
409
- break;
410
- case CalendarView.Months:
411
- this.highlightNextMonth();
412
- break;
413
- case CalendarView.Years:
414
- this.highlightNextYear();
415
- break;
416
- }
417
- }
418
- //highlight first entry on the page
419
- _onHomePress(event) {
420
- event.preventDefault();
421
- switch (this.activeView) {
422
- case CalendarView.Days:
423
- this.highlightFirstDay();
424
- break;
425
- case CalendarView.Months:
426
- this.highlightFirstMonth();
427
- break;
428
- case CalendarView.Years:
429
- this.highlightFirstYear();
430
- break;
431
- }
432
- }
433
- //highlight last entry on the page
434
- _onEndPress(event) {
435
- event.preventDefault();
436
- switch (this.activeView) {
437
- case CalendarView.Days:
438
- this.highlightLastDay();
439
- break;
440
- case CalendarView.Months:
441
- this.highlightLastMonth();
442
- break;
443
- case CalendarView.Years:
444
- this.highlightLastYear();
445
- break;
446
- }
447
- }
448
- //alone: highlight same entry on the previous page
449
- //with alt: highlight same entry multiple pages before (days view: 12 pages, months view: 10 pages, years view: 5 pages)
450
- _onPageUpPress(event) {
451
- event.preventDefault();
452
- switch (this.activeView) {
453
- case CalendarView.Days:
454
- if (event.altKey)
455
- this.highlightSameDayPreviousYear();
456
- else
457
- this.highlightSameDayPreviousMonth();
458
- break;
459
- case CalendarView.Months:
460
- this.highlightSameMonthPreviousYear(event.altKey);
461
- break;
462
- case CalendarView.Years:
463
- this.highlightSameYearPreviousPage(event.altKey);
464
- break;
465
- }
466
- }
467
- //alone: highlight same entry on the next page
468
- //with alt: highlight same entry multiple pages after (days view: 12 pages, months view: 10 pages, years view: 5 pages)
469
- _onPageDownPress(event) {
470
- event.preventDefault();
471
- switch (this.activeView) {
472
- case CalendarView.Days:
473
- if (event.altKey)
474
- this.highlightSameDayNextYear();
475
- else
476
- this.highlightSameDayNextMonth();
477
- break;
478
- case CalendarView.Months:
479
- this.highlightSameMonthNextYear(event.altKey);
480
- break;
481
- case CalendarView.Years:
482
- this.highlightSameYearNextPage(event.altKey);
483
- break;
484
- }
485
- }
486
- //! manipulation methods
487
- //selecting
488
- selectDay(day) {
489
- if (this.isDaySelected(day))
490
- return;
491
- if (isNull(day)) {
492
- if (!isDefined(this.selected))
493
- return;
494
- this.selected = null;
495
- this._emitChange();
496
- return;
497
- }
498
- if (day instanceof Date)
499
- day = day.getDate();
500
- this.selected = new Date(this.activeYear, this.activeMonth, day);
501
- this._emitChange();
502
- }
503
- selectMonth(month) {
504
- if (isNull(month)) {
505
- this.activeMonth = null;
506
- return;
507
- }
508
- if (month instanceof Date)
509
- month = month.getMonth();
510
- this.activeMonth = month;
511
- this.activeMonthChange.emit(month);
512
- this.monthSelected.emit(month);
513
- this.openDaysView();
514
- }
515
- selectYear(year) {
516
- if (isNull(year)) {
517
- this.activeYear = null;
518
- return;
519
- }
520
- if (year instanceof Date)
521
- year = year.getFullYear();
522
- this.activeYear = year;
523
- this.activeYearChange.emit(year);
524
- this.yearSelected.emit(year);
525
- this.openMonthsView();
526
- }
527
- selectCurrentlyHighlighted() {
528
- if (!isDefined(this.highlightedDay))
529
- return;
530
- switch (this.activeView) {
531
- case CalendarView.Days:
532
- this.selectDay(this.highlightedDay);
533
- return;
534
- case CalendarView.Months:
535
- this.selectMonth(this.highlightedMonth);
536
- return;
537
- case CalendarView.Years:
538
- this.selectYear(this.highlightedYear);
539
- return;
540
- default:
541
- return;
542
- }
543
- }
544
- //active months/years
545
- changeMonth(offset) {
546
- const oldyear = this.activeYear;
547
- this.activeMonth += offset;
548
- if (this.activeYear != oldyear)
549
- this.activeYearChange.emit(this.activeYear);
550
- this.activeMonthChange.emit(this.activeMonth);
551
- }
552
- changeYear(offset) {
553
- this.activeYear += offset;
554
- this.activeYearChange.emit(this.activeYear);
555
- }
556
- //changing year page
557
- changeYearsViewPage(pages) {
558
- this.displayedYearRangeStart += 24 * pages;
559
- }
560
- //next/prev highlighting
561
- highlightNextDay(offset = 1) {
562
- const currentDay = this.highlightedDay;
563
- if (!isDefined(currentDay)) {
564
- this.highlightedDay = 1;
565
- return;
566
- }
567
- this.setHighlightedDayAdjustDate(currentDay + offset);
568
- }
569
- highlightPreviousDay(offset = 1) {
570
- this.highlightNextDay(offset * -1);
571
- }
572
- highlightNextMonth(offset = 1) {
573
- const currentMonth = this.highlightedMonth;
574
- if (!isDefined(currentMonth)) {
575
- this.highlightedMonth = 0;
576
- return;
577
- }
578
- this.setHighlightedMonthAdjustDate(currentMonth + offset);
579
- }
580
- highlightPreviousMonth(offset = 1) {
581
- this.highlightNextMonth(offset * -1);
582
- }
583
- highlightNextYear(offset = 1) {
584
- const currentYear = this.highlightedYear;
585
- if (!isDefined(currentYear)) {
586
- this.highlightedYear = 0;
587
- return;
588
- }
589
- this.setHighlightedYearAdjustPage(currentYear + offset);
590
- }
591
- highlightPreviousYear(offset = 1) {
592
- this.highlightNextYear(offset * -1);
593
- }
594
- //first/last highlighting
595
- highlightFirstDay() {
596
- this.highlightedDay = 1;
597
- }
598
- highlightLastDay() {
599
- switch (this.activeMonth + 1) {
600
- case 1:
601
- case 3:
602
- case 5:
603
- case 7:
604
- case 8:
605
- case 10:
606
- case 12:
607
- this.highlightedDay = 31;
608
- break;
609
- case 4:
610
- case 6:
611
- case 9:
612
- case 11:
613
- this.highlightedDay = 30;
614
- break;
615
- case 2:
616
- if (isLeapYear(this.activeYear))
617
- this.highlightedDay = 29;
618
- else
619
- this.highlightedDay = 28;
620
- }
621
- }
622
- highlightFirstMonth() {
623
- this.highlightedMonth = 0;
624
- }
625
- highlightLastMonth() {
626
- this.highlightedMonth = 11;
627
- }
628
- highlightFirstYear() {
629
- this.highlightedYear = this.displayedYearRangeStart;
630
- }
631
- highlightLastYear() {
632
- this.highlightedYear = this.displayedYearRangeStart + 23; //24 years per page
633
- }
634
- //same day next/prev month/year
635
- highlightSameDayNextMonth() {
636
- this.activeMonth++;
637
- this._fixDateAfterMonthChange();
638
- }
639
- highlightSameDayPreviousMonth() {
640
- this.activeMonth--;
641
- this._fixDateAfterMonthChange();
642
- }
643
- _fixDateAfterMonthChange() {
644
- switch (this.activeMonth + 1) {
645
- case 1:
646
- case 3:
647
- case 5:
648
- case 7:
649
- case 8:
650
- case 10:
651
- case 12:
652
- //do nothing
653
- break;
654
- case 4:
655
- case 6:
656
- case 9:
657
- case 11:
658
- //only do if day is 31
659
- if (this.highlightedDay == 31)
660
- this.highlightedDay = 30;
661
- break;
662
- case 2: {
663
- //skip if below 29 or null
664
- if (!this.highlightedDay || this.highlightedDay < 29)
665
- break;
666
- if (isLeapYear(this.activeYear))
667
- this.highlightedDay = 29;
668
- else
669
- this.highlightedDay = 28;
670
- }
671
- }
672
- }
673
- highlightSameDayNextYear() {
674
- this.activeYear++;
675
- this._fixDateAfterYearChange();
676
- }
677
- highlightSameDayPreviousYear() {
678
- this.activeYear--;
679
- this._fixDateAfterYearChange();
680
- }
681
- _fixDateAfterYearChange() {
682
- if (this.highlightedDay != 29)
683
- return; //skip if not 29th day is selected
684
- if (isLeapYear(this.activeYear))
685
- return; //skip if nea year is a leap year
686
- if (this.activeMonth != 1)
687
- return; //skip if not february
688
- this.highlightedDay = 28;
689
- }
690
- //same month next/prev year
691
- highlightSameMonthNextYear(multiple) {
692
- this.activeYear += multiple ? 10 : 1;
693
- }
694
- highlightSameMonthPreviousYear(multiple) {
695
- this.activeYear -= multiple ? 10 : 1;
696
- }
697
- //same year next/prev page(s)
698
- highlightSameYearNextPage(multiple) {
699
- if (!isDefined(this.highlightedYear)) {
700
- this.highlightedYear = this.displayedYearRangeStart;
701
- return;
702
- }
703
- this.setHighlightedYearAdjustPage(this.highlightedYear + (multiple ? 60 : 24));
704
- }
705
- highlightSameYearPreviousPage(multiple) {
706
- if (!isDefined(this.highlightedYear)) {
707
- this.highlightedYear = this.displayedYearRangeStart;
708
- return;
709
- }
710
- this.setHighlightedYearAdjustPage(this.highlightedYear - (multiple ? 60 : 24));
711
- }
712
- get firstWeekday() {
713
- return this._firstWeekday;
714
- }
715
- set firstWeekday(v) {
716
- this._firstWeekday = coerceNumberProperty(v, 1) % 7;
717
- this._updateCalendarArray();
718
- this._updateWeekdayArray();
719
- }
720
- get nointeract() {
721
- return this._nointeract || this.disabled;
722
- }
723
- set nointeract(v) {
724
- this._nointeract = coerceBooleanProperty(v);
725
- }
726
- get staticHeight() {
727
- return this._staticHeight;
728
- }
729
- set staticHeight(v) {
730
- this._staticHeight = coerceBooleanProperty(v);
731
- }
732
- _updateCalendarArray() {
733
- const resultObj = getMonthLayout(this._activeDate, this.firstWeekday);
734
- this.reserveTopRow = resultObj.leadingSpaces < 3;
735
- this.calendarArray = resultObj.array;
736
- }
737
- getYearsArray() {
738
- const year = this.displayedYearRangeStart;
739
- if (this._yearsArrayCacheStartYear == year && isDefined(this._yearsArrayCache))
740
- return this._yearsArrayCache;
741
- const newArray = [];
742
- for (let i = year; i < year + 24; i++) {
743
- newArray.push(i);
744
- }
745
- this._yearsArrayCache = newArray;
746
- this._yearsArrayCacheStartYear = year;
747
- return newArray;
748
- }
749
- _updateWeekdayArray() {
750
- this.weekdayArray = [0, 1, 2, 3, 4, 5, 6].map(v => (v + this.firstWeekday) % 7);
751
- }
752
- set startView(v) {
753
- this.activeView = v;
754
- }
755
- openYearsView() {
756
- this.activeView = CalendarView.Years;
757
- this._updateDisplayedYearRangeStart();
758
- this.viewChange.emit(this.activeView);
759
- }
760
- openMonthsView() {
761
- this.activeView = CalendarView.Months;
762
- //bring back old value
763
- const oldYear = this.activeYear;
764
- this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
765
- //emit events
766
- this.viewChange.emit(this.activeView);
767
- if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
768
- this.activeYearChange.emit(this.activeYear);
769
- }
770
- openDaysView() {
771
- this.activeView = CalendarView.Days;
772
- //bring back old values
773
- const oldYear = this.activeYear;
774
- this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
775
- const oldMonth = this.activeMonth;
776
- this.activeMonth = this.activeMonth ?? this.todayDate.getMonth();
777
- //emit events
778
- this.viewChange.emit(this.activeView);
779
- if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
780
- this.activeYearChange.emit(this.activeYear);
781
- if (oldMonth != this.activeMonth && this.activeMonth == this.todayDate.getMonth())
782
- this.activeMonthChange.emit(this.activeMonth);
783
- }
784
- //! context getters
785
- //headers
786
- getYearsViewHeaderContext() {
787
- const yearRangeStart = this.displayedYearRangeStart;
788
- const yearRangeEnd = yearRangeStart + 23;
789
- const dateRange = {
790
- low: new Date(yearRangeStart, 0, 1),
791
- high: new Date(yearRangeEnd, 0, 1),
792
- };
793
- return {
794
- nextPage: () => {
795
- this.changeYearsViewPage(+1);
796
- },
797
- prevPage: () => {
798
- this.changeYearsViewPage(-1);
799
- },
800
- openDaysView: () => {
801
- this.openDaysView();
802
- },
803
- yearRange: {
804
- low: yearRangeStart,
805
- high: yearRangeEnd,
806
- },
807
- dateRange,
808
- $implicit: dateRange,
809
- };
810
- }
811
- getMonthsViewHeaderContext() {
812
- return {
813
- openYearsView: () => {
814
- this.openYearsView();
815
- },
816
- openDaysView: () => {
817
- this.openDaysView();
818
- },
819
- year: this.activeYear,
820
- date: this.activeDate,
821
- $implicit: this.activeYear,
822
- };
823
- }
824
- getDaysViewHeaderContext() {
825
- return {
826
- nextMonth: () => {
827
- this.changeMonth(+1);
828
- },
829
- prevMonth: () => {
830
- this.changeMonth(-1);
831
- },
832
- nextYear: () => {
833
- this.changeYear(+1);
834
- },
835
- prevYear: () => {
836
- this.changeYear(-1);
837
- },
838
- openYearsView: () => {
839
- this.openYearsView();
840
- },
841
- openMonthsView: () => {
842
- this.openMonthsView();
843
- },
844
- year: this.activeYear,
845
- month: this.activeMonth,
846
- date: this.activeDate,
847
- $implicit: this.activeDate,
848
- };
849
- }
850
- //weekday
851
- getWeekdayContext(dayIndex) {
852
- const date = new Date(1970, 0, 4 + dayIndex);
853
- return {
854
- dayIndex,
855
- date,
856
- $implicit: date,
857
- };
858
- }
859
- //floating month
860
- getFloatingMonthContext() {
861
- return {
862
- month: this.activeMonth,
863
- date: this.activeDate,
864
- $implicit: this.activeDate,
865
- };
866
- }
867
- //grid elements (year, month, day)
868
- getYearContext(year) {
869
- return {
870
- value: year,
871
- date: new Date(this.activeYear, 0, 1),
872
- $implicit: year,
873
- select: (year) => {
874
- this.selectYear(year);
875
- },
876
- };
877
- }
878
- getMonthContext(month) {
879
- const date = new Date(this.activeYear, month, 1);
880
- return {
881
- month,
882
- date,
883
- $implicit: date,
884
- select: (month) => {
885
- this.selectMonth(month);
886
- },
887
- };
888
- }
889
- getDayContext(day) {
890
- return {
891
- value: day,
892
- date: new Date(this.activeYear, this.activeMonth, day),
893
- $implicit: day,
894
- select: (day) => {
895
- this.selectDay(day);
896
- },
897
- };
898
- }
899
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ArdiumCalendarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
900
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ArdiumCalendarComponent, selector: "ard-calendar", inputs: { color: "color", activeYear: "activeYear", activeMonth: "activeMonth", selected: "selected", firstWeekday: "firstWeekday", nointeract: "nointeract", staticHeight: "staticHeight", startView: "startView" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", selectedChange: "selectedChange", activeYearChange: "activeYearChange", activeMonthChange: "activeMonthChange", viewChange: "viewChange", changeEvent: "change" }, host: { listeners: { "document:mousemove": "onDocumentMousemove()", "document:keydown": "onDocumentKeydown()" } }, providers: [
901
- {
902
- provide: NG_VALUE_ACCESSOR,
903
- useExisting: forwardRef(() => ArdiumCalendarComponent),
904
- multi: true,
905
- },
906
- ], queries: [{ propertyName: "yearsViewHeaderTemplate", first: true, predicate: ArdYearsViewHeaderTemplateDirective, descendants: true }, { propertyName: "monthsViewHeaderTemplate", first: true, predicate: ArdMonthsViewHeaderTemplateDirective, descendants: true }, { propertyName: "daysViewHeaderTemplate", first: true, predicate: ArdDaysViewHeaderTemplateDirective, descendants: true }, { propertyName: "weekdayTemplate", first: true, predicate: ArdWeekdayTemplateDirective, descendants: true }, { propertyName: "floatingMonthTemplate", first: true, predicate: ArdFloatingMonthTemplateDirective, descendants: true }, { propertyName: "yearTemplate", first: true, predicate: ArdYearTemplateDirective, descendants: true }, { propertyName: "monthTemplate", first: true, predicate: ArdMonthTemplateDirective, descendants: true }, { propertyName: "dayTemplate", first: true, predicate: ArdDayTemplateDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n &mdash;\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumButtonComponent, selector: "ard-button", inputs: ["variant", "alignIcon", "vertical", "icon"] }, { kind: "component", type: i3.ArdiumIconButtonComponent, selector: "ard-icon-button", inputs: ["wrapperClasses", "color", "compact"] }, { kind: "component", type: i4.ArdiumIconComponent, selector: "ard-icon", inputs: ["ariaLabel", "icon", "filled", "weight", "grade", "opticalSize"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
907
- }
908
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ArdiumCalendarComponent, decorators: [{
909
- type: Component,
910
- args: [{ selector: 'ard-calendar', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
911
- {
912
- provide: NG_VALUE_ACCESSOR,
913
- useExisting: forwardRef(() => ArdiumCalendarComponent),
914
- multi: true,
915
- },
916
- ], template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n &mdash;\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"] }]
917
- }], propDecorators: { color: [{
918
- type: Input
919
- }], activeYear: [{
920
- type: Input
921
- }], activeMonth: [{
922
- type: Input
923
- }], selected: [{
924
- type: Input
925
- }], yearSelected: [{
926
- type: Output
927
- }], monthSelected: [{
928
- type: Output
929
- }], selectedChange: [{
930
- type: Output
931
- }], activeYearChange: [{
932
- type: Output
933
- }], activeMonthChange: [{
934
- type: Output
935
- }], viewChange: [{
936
- type: Output
937
- }], changeEvent: [{
938
- type: Output,
939
- args: ['change']
940
- }], onDocumentMousemove: [{
941
- type: HostListener,
942
- args: ['document:mousemove']
943
- }], onDocumentKeydown: [{
944
- type: HostListener,
945
- args: ['document:keydown']
946
- }], firstWeekday: [{
947
- type: Input
948
- }], nointeract: [{
949
- type: Input
950
- }], staticHeight: [{
951
- type: Input
952
- }], startView: [{
953
- type: Input
954
- }], yearsViewHeaderTemplate: [{
955
- type: ContentChild,
956
- args: [ArdYearsViewHeaderTemplateDirective]
957
- }], monthsViewHeaderTemplate: [{
958
- type: ContentChild,
959
- args: [ArdMonthsViewHeaderTemplateDirective]
960
- }], daysViewHeaderTemplate: [{
961
- type: ContentChild,
962
- args: [ArdDaysViewHeaderTemplateDirective]
963
- }], weekdayTemplate: [{
964
- type: ContentChild,
965
- args: [ArdWeekdayTemplateDirective]
966
- }], floatingMonthTemplate: [{
967
- type: ContentChild,
968
- args: [ArdFloatingMonthTemplateDirective]
969
- }], yearTemplate: [{
970
- type: ContentChild,
971
- args: [ArdYearTemplateDirective]
972
- }], monthTemplate: [{
973
- type: ContentChild,
974
- args: [ArdMonthTemplateDirective]
975
- }], dayTemplate: [{
976
- type: ContentChild,
977
- args: [ArdDayTemplateDirective]
978
- }] } });
979
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxrQ0FBa0MsRUFDbEMsdUJBQXVCLEVBQ3ZCLGlDQUFpQyxFQUNqQyxvQ0FBb0MsRUFDcEMseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQixtQ0FBbUMsRUFDbkMsd0JBQXdCLEdBQ3pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxZQUFZLEdBVWIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7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b0NBQW9DO2dCQUdsRCxzQkFBc0I7c0JBRHJCLFlBQVk7dUJBQUMsa0NBQWtDO2dCQUloRCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsMkJBQTJCO2dCQUl6QyxxQkFBcUI7c0JBRHBCLFlBQVk7dUJBQUMsaUNBQWlDO2dCQUkvQyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsd0JBQXdCO2dCQUd0QyxhQUFhO3NCQURaLFlBQVk7dUJBQUMseUJBQXlCO2dCQUd2QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGhpc1JlY2VpdmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xyXG5pbXBvcnQgeyBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0BhcmRpdW0tdWkvZGV2a2l0JztcclxuaW1wb3J0IHsgcm91bmRUb011bHRpcGxlIH0gZnJvbSAnbW9yZS1yb3VuZGluZyc7XHJcbmltcG9ydCB7IGlzRGVmaW5lZCwgaXNOdWxsIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb2xvciB9IGZyb20gJy4uL3R5cGVzL2NvbG9ycy50eXBlcyc7XHJcbmltcG9ydCB7IF9OZ01vZGVsQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL19pbnRlcm5hbC9uZ21vZGVsLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQXJkRGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcclxuICBBcmREYXlUZW1wbGF0ZURpcmVjdGl2ZSxcclxuICBBcmRGbG9hdGluZ01vbnRoVGVtcGxhdGVEaXJlY3RpdmUsXHJcbiAgQXJkTW9udGhzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxyXG4gIEFyZE1vbnRoVGVtcGxhdGVEaXJlY3RpdmUsXHJcbiAgQXJkV2Vla2RheVRlbXBsYXRlRGlyZWN0aXZlLFxyXG4gIEFyZFllYXJzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxyXG4gIEFyZFllYXJUZW1wbGF0ZURpcmVjdGl2ZSxcclxufSBmcm9tICcuL2NhbGVuZGFyLmRpcmVjdGl2ZXMnO1xyXG5pbXBvcnQgeyBnZXRNb250aExheW91dCB9IGZyb20gJy4vY2FsZW5kYXIuaGVscGVycyc7XHJcbmltcG9ydCB7XHJcbiAgQ2FsZW5kYXJWaWV3LFxyXG4gIENhbGVuZGFyRGF5Q29udGV4dCxcclxuICBDYWxlbmRhckRheXNWaWV3SGVhZGVyQ29udGV4dCxcclxuICBDYWxlbmRhckZsb2F0aW5nTW9udGhDb250ZXh0LFxyXG4gIENhbGVuZGFyTW9udGhDb250ZXh0LFxyXG4gIENhbGVuZGFyTW9udGhzVmlld0hlYWRlckNvbnRleHQsXHJcbiAgQ2FsZW5kYXJXZWVrZGF5Q29udGV4dCxcclxuICBDYWxlbmRhclllYXJDb250ZXh0LFxyXG4gIENhbGVuZGFyWWVhcnNWaWV3SGVhZGVyQ29udGV4dCxcclxuICBEYXRlUmFuZ2UsXHJcbn0gZnJvbSAnLi9jYWxlbmRhci50eXBlcyc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcclxuICByZXR1cm4gKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKSB8fCB5ZWFyICUgNDAwID09IDA7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXJkLWNhbGVuZGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcmRpdW1DYWxlbmRhckNvbXBvbmVudCBleHRlbmRzIF9OZ01vZGVsQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3VwZGF0ZUNhbGVuZGFyQXJyYXkoKTtcclxuICAgIHRoaXMuX3VwZGF0ZVdlZWtkYXlBcnJheSgpO1xyXG4gICAgdGhpcy5fdXBkYXRlRGlzcGxheWVkWWVhclJhbmdlU3RhcnQoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfd2FzU2VsZWN0ZWRDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3dhc1NlbGVjdGVkQ2hlY2tlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5fd2FzU2VsZWN0ZWRDaGVja2VkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWQnXSkge1xyXG4gICAgICBjb25zdCB2ID0gdGhpcy5zZWxlY3RlZDtcclxuICAgICAgaWYgKGlzTnVsbCh2KSkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLCB2LmdldE1vbnRoKCksIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8hIGRldGVybWluaW5nIHRvZGF5IHN0YXRlXHJcbiAgdG9kYXlEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuXHJcbiAgaXNEYXlUb2RheShkYXk6IG51bWJlciB8IG51bGwpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSAmJiB0aGlzLmFjdGl2ZU1vbnRoID09IHRoaXMudG9kYXlEYXRlLmdldE1vbnRoKCkgJiYgZGF5ID09IHRoaXMudG9kYXlEYXRlLmdldERhdGUoKTtcclxuICB9XHJcbiAgaXNNb250aFRvZGF5KG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSAmJiBtb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpO1xyXG4gIH1cclxuICBpc1llYXJUb2RheSh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB5ZWFyID09IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvLyEgZGV0ZXJtaW5pbmcgaWYgYW4gZW50cnkgaXMgc2VsZWN0ZWRcclxuICBpc0RheVNlbGVjdGVkKGRheTogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiBib29sZWFuIHtcclxuICAgIGlmIChkYXkgaW5zdGFuY2VvZiBEYXRlKSBkYXkgPSBkYXkuZ2V0RGF0ZSgpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3RlZCAhPSBudWxsICYmIHRoaXMuYWN0aXZlWWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCkgJiYgdGhpcy5hY3RpdmVNb250aCA9PSB0aGlzLnNlbGVjdGVkLmdldE1vbnRoKCkgJiYgZGF5ID09IHRoaXMuc2VsZWN0ZWQuZ2V0RGF0ZSgpXHJcbiAgICApO1xyXG4gIH1cclxuICBpc01vbnRoU2VsZWN0ZWQobW9udGg6IG51bWJlciB8IERhdGUpOiBib29sZWFuIHtcclxuICAgIGlmIChtb250aCBpbnN0YW5jZW9mIERhdGUpIG1vbnRoID0gbW9udGguZ2V0TW9udGgoKTtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiYgdGhpcy5hY3RpdmVZZWFyID09IHRoaXMuc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSAmJiBtb250aCA9PSB0aGlzLnNlbGVjdGVkLmdldE1vbnRoKCk7XHJcbiAgfVxyXG4gIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlciB8IERhdGUpOiBib29sZWFuIHtcclxuICAgIGlmICh5ZWFyIGluc3RhbmNlb2YgRGF0ZSkgeWVhciA9IHllYXIuZ2V0RnVsbFllYXIoKTtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiYgeWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvLyEgY29sb3IgJiB3cmFwcGVyIGNsYXNzZXNcclxuICBASW5wdXQoKSBjb2xvcjogQ29tcG9uZW50Q29sb3IgPSBDb21wb25lbnRDb2xvci5QcmltYXJ5O1xyXG5cclxuICBnZXQgbmdDbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gW2BhcmQtY29sb3ItJHt0aGlzLmNvbG9yfWAsIHRoaXMubm9pbnRlcmFjdCA/ICdhcmQtY2FsZW5kYXItbm9pbnRlcmFjdCcgOiAnJywgdGhpcy5zdGF0aWNIZWlnaHQgPyAnYXJkLWNhbGVuZGFyLXN0YXRpYy1oZWlnaHQnIDogJyddLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIC8vISBvcGVuIHllYXIgJiBtb250aCBzZXR0ZXJzXHJcbiAgLy9waWNrIGEgeWVhciByYW5nZSBzdGFydCBzbyB0aGF0IHRoZSB0b2RheSBkYXRlIGlzIGFsd2F5cyBpbiB0aGUgM3JkIHJvd1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9kYXlZZWFyUmFuZ2VTdGFydDogbnVtYmVyID0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSAtICh0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpICUgNCkgLSA4O1xyXG5cclxuICBkaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDogbnVtYmVyID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0O1xyXG5cclxuICBwcml2YXRlIF91cGRhdGVEaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydChmb3JjZWRZZWFyPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZWZpbmVkKGZvcmNlZFllYXIpKSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gZm9yY2VkWWVhcjtcclxuXHJcbiAgICAvL2FkZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3RpdmUgeWVhciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgeWVhclxyXG4gICAgLy9yb3VuZGVkIHRvIGEgbXVsdGlwbGUgb2YgMjQsIHRvd2FyZHMgdGhlIG51bWJlciB6ZXJvXHJcbiAgICAvL3RoZSBkaWZmZXJlbmNlIG1heSBiZSBuZWdhdGl2ZSwgaWYgdGhlIGFjdGl2ZSB5ZWFyIGlzIGJlZm9yZSB0b2RheVllYXJSYW5nZVN0YXJ0XHJcbiAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0ICsgcm91bmRUb011bHRpcGxlKHRoaXMuYWN0aXZlWWVhciAtIHRoaXMudG9kYXlZZWFyUmFuZ2VTdGFydCwgMjQsICd0b196ZXJvJyk7XHJcbiAgfVxyXG5cclxuICB5ZWFyUmFuZ2VBcnJheUNhY2hlOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xyXG4gIGdldCB5ZWFyUmFuZ2VBcnJheSgpOiBudW1iZXJbXSB7XHJcbiAgICBpZiAoIXRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSkge1xyXG4gICAgICBsZXQgeWVhclJhbmdlU3RhcnQgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xyXG4gICAgICBjb25zdCBuZXdBcnJheSA9IG5ldyBBcnJheSgyNCkubWFwKCgpID0+IHllYXJSYW5nZVN0YXJ0KyspO1xyXG4gICAgICB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBuZXdBcnJheTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2FjdGl2ZURhdGU6IERhdGUgPSBuZXcgRGF0ZSh0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpLCB0aGlzLnRvZGF5RGF0ZS5nZXREYXRlKCkpO1xyXG4gIHNldCBhY3RpdmVEYXRlKHY6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2KTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gbmV3RGF0ZS5nZXRGdWxsWWVhcigpKSB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBudWxsO1xyXG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IG5ld0RhdGU7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xyXG4gIH1cclxuICBnZXQgYWN0aXZlRGF0ZSgpOiBEYXRlIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFjdGl2ZVllYXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGFjdGl2ZVllYXIodjogYW55KSB7XHJcbiAgICBjb25zdCB5ZWFyID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKTtcclxuICAgIHRoaXMuX2FjdGl2ZURhdGUuc2V0RnVsbFllYXIoeWVhcik7XHJcbiAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSh5ZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCAxKTtcclxuICAgIHRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFjdGl2ZU1vbnRoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZS5nZXRNb250aCgpO1xyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHNldCBhY3RpdmVNb250aCh2OiBhbnkpIHtcclxuICAgIGNvbnN0IG1vbnRoID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgbmV3IERhdGUoKS5nZXRNb250aCgpKTtcclxuICAgIGNvbnN0IG9sZERhdGVZZWFyID0gdGhpcy5hY3RpdmVZZWFyO1xyXG4gICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XHJcbiAgICBpZiAob2xkRGF0ZVllYXIgIT0gdGhpcy5hY3RpdmVZZWFyKSB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZUNhbGVuZGFyQXJyYXkoKTtcclxuICB9XHJcbiAgLy8hIHNlbGVjdGlvbiBmdW5jdGlvbnNcclxuICBwcm90ZWN0ZWQgX3NlbGVjdGVkOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KClcclxuICBzZXQgc2VsZWN0ZWQodjogYW55KSB7XHJcbiAgICB0aGlzLndyaXRlVmFsdWUodik7XHJcbiAgfVxyXG4gIGdldCBzZWxlY3RlZCgpOiBEYXRlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHY6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiB2ID09ICdzdHJpbmcnKSB7XHJcbiAgICAgIC8vdHJ5IHRvIHNlZSBpZiBpdCBpcyBhbiBhcnJheSBvZiBudW1iZXJzIHNlcGFyYXRlZCBieSBhIGNvbW1hXHJcbiAgICAgIGNvbnN0IHZBc0FycmF5MSA9IHYuc3BsaXQoJywnKS5tYXAodiA9PiBOdW1iZXIodikpO1xyXG4gICAgICBpZiAodkFzQXJyYXkxLmxlbmd0aCA+PSAxICYmIHZBc0FycmF5MS5sZW5ndGggPD0gMyAmJiB2QXNBcnJheTEuZXZlcnkodiA9PiAhaXNOYU4odikpKSB7XHJcbiAgICAgICAgdiA9IG5ldyBEYXRlKHZBc0FycmF5MVswXSwgdkFzQXJyYXkxWzFdID8/IDAsIHZBc0FycmF5MVsyXSA/PyAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL3RyeSB0byBzZWUgaWYgaXQgaXMgYW4gYXJyYXkgb2YgbnVtYmVycyBzZXBhcmF0ZWQgYnkgc29tZSB3aGl0ZXNwYWNlXHJcbiAgICAgICAgY29uc3QgdkFzQXJyYXkyID0gdi5zcGxpdCgvXFxzLykubWFwKHYgPT4gTnVtYmVyKHYpKTtcclxuICAgICAgICBpZiAodkFzQXJyYXkyLmxlbmd0aCA+PSAxICYmIHZBc0FycmF5Mi5sZW5ndGggPD0gMyAmJiB2QXNBcnJheTIuZXZlcnkodiA9PiAhaXNOYU4odikpKSB7XHJcbiAgICAgICAgICB2ID0gbmV3IERhdGUodkFzQXJyYXkyWzBdLCB2QXNBcnJheTJbMV0gPz8gMCwgdkFzQXJyYXkyWzJdID8/IDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2ID0gbmV3IERhdGUodik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL2lzIGEgRGF0ZSBvYmplY3QgJiYgZG9lcyBub3QgY29udGFpbiBhbiBlcnJvclxyXG4gICAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2LnZhbHVlT2YoKSkpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodiA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gbnVsbDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcGFyc2UgW3NlbGVjdGVkXSB2YWx1ZSBvbiA8YXJkLWNhbGVuZGFyPiwgYXMgaXQgaXMgbm90IGEgdmFsaWQgdmFsdWUuIFByb3ZpZGVkIHZhbHVlOiBcIiR7dn1cImApO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8hIG91dHB1dCBldmVudHNcclxuICBAT3V0cHV0KCkgeWVhclNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIG1vbnRoU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcclxuICBAT3V0cHV0KCkgYWN0aXZlWWVhckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSBhY3RpdmVNb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICBAT3V0cHV0KCkgdmlld0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJWaWV3PigpO1xyXG5cclxuICBAT3V0cHV0KCdjaGFuZ2UnKSBjaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XHJcblxyXG4gIHByb3RlY3RlZCBfZW1pdENoYW5nZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHYgPSB0aGlzLnNlbGVjdGVkO1xyXG4gICAgdGhpcy5fb25DaGFuZ2VSZWdpc3RlcmVkPy4odik7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodik7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodik7XHJcbiAgfVxyXG5cclxuICAvLyEgY2FsZW5kYXIgZW50cnkgaG92ZXIgJiBjbGlja1xyXG4gIHByaXZhdGUgX2hpZ2hsaWdodGVkRGF5OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBnZXQgaGlnaGxpZ2h0ZWREYXkoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWREYXk7XHJcbiAgfVxyXG4gIHNldCBoaWdobGlnaHRlZERheSh2OiBudW1iZXIgfCBudWxsKSB7XHJcbiAgICBpZiAoaXNOdWxsKHYpKSB7XHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodGVkRGF5ID0gdjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgdGhpcy5hY3RpdmVNb250aCwgdik7XHJcbiAgICB0aGlzLl9oaWdobGlnaHRlZERheSA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0SGlnaGxpZ2h0ZWREYXlBZGp1c3REYXRlKGRheTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gZGF5O1xyXG5cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIHRoaXMuYWN0aXZlTW9udGgsIGRheSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aXZlWWVhciAhPSBkYXRlLmdldEZ1bGxZZWFyKCkpIHRoaXMuYWN0aXZlWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmVNb250aCAhPSBkYXRlLmdldE1vbnRoKCkpIHRoaXMuYWN0aXZlTW9udGggPSBkYXRlLmdldE1vbnRoKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oaWdobGlnaHRlZE1vbnRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBnZXQgaGlnaGxpZ2h0ZWRNb250aCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRlZE1vbnRoO1xyXG4gIH1cclxuICBzZXQgaGlnaGxpZ2h0ZWRNb250aCh2OiBudW1iZXIgfCBudWxsKSB7XHJcbiAgICBpZiAoaXNOdWxsKHYpKSB7XHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodGVkTW9udGggPSB2O1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB2LCAxKTtcclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkTW9udGggPSBkYXRlLmdldE1vbnRoKCk7XHJcbiAgfVxyXG5cclxuICBzZXRIaWdobGlnaHRlZE1vbnRoQWRqdXN0RGF0ZShtb250aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSBtb250aDtcclxuXHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aXZlWWVhciAhPSBkYXRlLmdldEZ1bGxZZWFyKCkpIHRoaXMuYWN0aXZlWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hpZ2hsaWdodGVkWWVhcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgZ2V0IGhpZ2hsaWdodGVkWWVhcigpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRlZFllYXI7XHJcbiAgfVxyXG4gIHNldCBoaWdobGlnaHRlZFllYXIodjogbnVtYmVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy5faGlnaGxpZ2h0ZWRZZWFyID0gdjtcclxuICB9XHJcblxyXG4gIHNldEhpZ2hsaWdodGVkWWVhckFkanVzdFBhZ2UoeWVhcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHllYXI7XHJcblxyXG4gICAgaWYgKHllYXIgPCB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0IHx8IHllYXIgPj0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArIDI0KSB7XHJcbiAgICAgIC8vYWRkIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGhpZ2hsaWdodGVkIHllYXIgYW5kIHRoZSBkaXNwbGF5ZWQgcmFuZ2Ugc3RhcnQgeWVhclxyXG4gICAgICAvL3JvdW5kZWQgdG8gYSBtdWx0aXBsZSBvZiAyNCwgYXdheSBmcm9tIHRoZSBudW1iZXIgemVyb1xyXG4gICAgICAvL3RoZSBkaWZmZXJlbmNlIG1heSBiZSBuZWdhdGl2ZSwgaWYgdGhlIGZpcnN0IGlmIGNvbmRpdGlvbiBpcyBtZXRcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArPSByb3VuZFRvTXVsdGlwbGUoeWVhciAtIHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQsIDI0LCAnZnJvbV96ZXJvJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudEFyaWFMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgdGhpcy5hY3RpdmVNb250aCwgdGhpcy5oaWdobGlnaHRlZERheSA/PyAxKS50b0xvY2FsZURhdGVTdHJpbmcodW5kZWZpbmVkLCB7XHJcbiAgICAgIHdlZWtkYXk6ICdsb25nJyxcclxuICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICBtb250aDogJ2xvbmcnLFxyXG4gICAgICBkYXk6ICdudW1lcmljJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DYWxlbmRhckRheU1vdXNlb3ZlcihkYXk6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcclxuICAgIGlmIChkYXkgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMuX2lzVXNpbmdLZXlib2FyZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSBkYXk7XHJcbiAgfVxyXG4gIG9uQ2FsZW5kYXJNb250aE1vdXNlb3Zlcihtb250aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNVc2luZ0tleWJvYXJkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5oaWdobGlnaHRlZE1vbnRoID0gbW9udGg7XHJcbiAgfVxyXG4gIG9uQ2FsZW5kYXJZZWFyTW91c2VvdmVyKHllYXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzVXNpbmdLZXlib2FyZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0geWVhcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVXNpbmdLZXlib2FyZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScpXHJcbiAgb25Eb2N1bWVudE1vdXNlbW92ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5faXNVc2luZ0tleWJvYXJkKSB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLl9pc1VzaW5nS2V5Ym9hcmQgPSBmYWxzZTtcclxuICB9XHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicpXHJcbiAgb25Eb2N1bWVudEtleWRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pc1VzaW5nS2V5Ym9hcmQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25DYWxlbmRhckRheUNsaWNrKGRheTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKGRheSA9PSBudWxsKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5zZWxlY3REYXkoZGF5KTtcclxuXHJcbiAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gZGF5O1xyXG4gIH1cclxuICBvbkNhbGVuZGFyTW9udGhDbGljayhtb250aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdE1vbnRoKG1vbnRoKTtcclxuICB9XHJcbiAgb25DYWxlbmRhclllYXJDbGljayh5ZWFyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcclxuICB9XHJcblxyXG4gIG9uRGF5R3JpZEZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XHJcbiAgfVxyXG4gIG9uRGF5R3JpZEJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gbnVsbDtcclxuICB9XHJcbiAgb25EYXlHcmlkQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID8/PSAxO1xyXG4gIH1cclxuXHJcbiAgb25Nb250aEdyaWRGb2N1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IDA7XHJcbiAgfVxyXG4gIG9uTW9udGhHcmlkQmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG51bGw7XHJcbiAgfVxyXG4gIG9uTW9udGhHcmlkQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPz89IDA7XHJcbiAgfVxyXG5cclxuICBvblllYXJHcmlkRm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XHJcbiAgfVxyXG4gIG9uWWVhckdyaWRCbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSBudWxsO1xyXG4gIH1cclxuICBvblllYXJHcmlkQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA/Pz0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcclxuICB9XHJcblxyXG4gIC8vISBtYWluIGdyaWQga2V5Ym9hcmQgY29udHJvbHNcclxuICBvbk1haW5HcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XHJcbiAgICAgIGNhc2UgJ1NwYWNlJzpcclxuICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgIHRoaXMuX29uRW50ZXJQcmVzcyhldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgIHRoaXMuX29uQXJyb3dVcFByZXNzKGV2ZW50KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICB0aGlzLl9vbkFycm93RG93blByZXNzKGV2ZW50KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICB0aGlzLl9vbkFycm93TGVmdFByZXNzKGV2ZW50KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgdGhpcy5fb25BcnJvd1JpZ2h0UHJlc3MoZXZlbnQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIb21lJzpcclxuICAgICAgICB0aGlzLl9vbkhvbWVQcmVzcyhldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0VuZCc6XHJcbiAgICAgICAgdGhpcy5fb25FbmRQcmVzcyhldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XHJcbiAgICAgICAgdGhpcy5fb25QYWdlVXBQcmVzcyhldmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcclxuICAgICAgICB0aGlzLl9vblBhZ2VEb3duUHJlc3MoZXZlbnQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vc2VsZWN0IGN1cnJlbnRseSBzZWxlY3RlZCBlbnRyeVxyXG4gIHByaXZhdGUgX29uRW50ZXJQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdEN1cnJlbnRseUhpZ2hsaWdodGVkKCk7XHJcbiAgfVxyXG4gIC8vaGlnaGxpZ2h0IHRoZSBlbnRyeSBvbmUgbGluZSBhYm92ZVxyXG4gIHByaXZhdGUgX29uQXJyb3dVcFByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcclxuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuRGF5czpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFByZXZpb3VzRGF5KDcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c01vbnRoKDMpOyAvLzMgbW9udGhzIHBlciBsaW5lXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNZZWFyKDQpOyAvLzQgeWVhcnMgcGVyIGxpbmVcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgLy9oaWdobGlnaHQgdGhlIGVudHJ5IG9uZSBsaW5lIGJlbG93XHJcbiAgcHJpdmF0ZSBfb25BcnJvd0Rvd25QcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KDcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0TW9udGgoMyk7IC8vMyBtb250aHMgcGVyIGxpbmVcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0WWVhcig0KTsgLy80IHllYXJzIHBlciBsaW5lXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vaGlnaGxpZ2h0IHByZXZpb3VzIGVudHJ5XHJcbiAgcHJpdmF0ZSBfb25BcnJvd0xlZnRQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c0RheSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c01vbnRoKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNZZWFyKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vaGlnaGxpZ2h0IG5leHQgZW50cnlcclxuICBwcml2YXRlIF9vbkFycm93UmlnaHRQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHRNb250aCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHRZZWFyKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vaGlnaGxpZ2h0IGZpcnN0IGVudHJ5IG9uIHRoZSBwYWdlXHJcbiAgcHJpdmF0ZSBfb25Ib21lUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlVmlldykge1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3REYXkoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3RNb250aCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodEZpcnN0WWVhcigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICAvL2hpZ2hsaWdodCBsYXN0IGVudHJ5IG9uIHRoZSBwYWdlXHJcbiAgcHJpdmF0ZSBfb25FbmRQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRMYXN0RGF5KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodExhc3RNb250aCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodExhc3RZZWFyKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vYWxvbmU6IGhpZ2hsaWdodCBzYW1lIGVudHJ5IG9uIHRoZSBwcmV2aW91cyBwYWdlXHJcbiAgLy93aXRoIGFsdDogaGlnaGxpZ2h0IHNhbWUgZW50cnkgbXVsdGlwbGUgcGFnZXMgYmVmb3JlIChkYXlzIHZpZXc6IDEyIHBhZ2VzLCBtb250aHMgdmlldzogMTAgcGFnZXMsIHllYXJzIHZpZXc6IDUgcGFnZXMpXHJcbiAgcHJpdmF0ZSBfb25QYWdlVXBQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5UHJldmlvdXNZZWFyKCk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmhpZ2hsaWdodFNhbWVEYXlQcmV2aW91c01vbnRoKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNhbWVNb250aFByZXZpb3VzWWVhcihldmVudC5hbHRLZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNhbWVZZWFyUHJldmlvdXNQYWdlKGV2ZW50LmFsdEtleSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vYWxvbmU6IGhpZ2hsaWdodCBzYW1lIGVudHJ5IG9uIHRoZSBuZXh0IHBhZ2VcclxuICAvL3dpdGggYWx0OiBoaWdobGlnaHQgc2FtZSBlbnRyeSBtdWx0aXBsZSBwYWdlcyBhZnRlciAoZGF5cyB2aWV3OiAxMiBwYWdlcywgbW9udGhzIHZpZXc6IDEwIHBhZ2VzLCB5ZWFycyB2aWV3OiA1IHBhZ2VzKVxyXG4gIHByaXZhdGUgX29uUGFnZURvd25QcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XHJcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5TmV4dFllYXIoKTtcclxuICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0U2FtZURheU5leHRNb250aCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRTYW1lTW9udGhOZXh0WWVhcihldmVudC5hbHRLZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNhbWVZZWFyTmV4dFBhZ2UoZXZlbnQuYWx0S2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgLy8hIG1hbmlwdWxhdGlvbiBtZXRob2RzXHJcbiAgLy9zZWxlY3RpbmdcclxuICBzZWxlY3REYXkoZGF5OiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNEYXlTZWxlY3RlZChkYXkpKSByZXR1cm47XHJcbiAgICBpZiAoaXNOdWxsKGRheSkpIHtcclxuICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5zZWxlY3RlZCkpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF5IGluc3RhbmNlb2YgRGF0ZSkgZGF5ID0gZGF5LmdldERhdGUoKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpO1xyXG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xyXG4gIH1cclxuICBzZWxlY3RNb250aChtb250aDogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGwobW9udGgpKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlTW9udGggPSBudWxsO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAobW9udGggaW5zdGFuY2VvZiBEYXRlKSBtb250aCA9IG1vbnRoLmdldE1vbnRoKCk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVNb250aCA9IG1vbnRoO1xyXG5cclxuICAgIHRoaXMuYWN0aXZlTW9udGhDaGFuZ2UuZW1pdChtb250aCk7XHJcbiAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChtb250aCk7XHJcblxyXG4gICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcclxuICB9XHJcbiAgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbCh5ZWFyKSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVllYXIgPSBudWxsO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoeWVhciBpbnN0YW5jZW9mIERhdGUpIHllYXIgPSB5ZWFyLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVZZWFyID0geWVhcjtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh5ZWFyKTtcclxuICAgIHRoaXMueWVhclNlbGVjdGVkLmVtaXQoeWVhcik7XHJcblxyXG4gICAgdGhpcy5vcGVuTW9udGhzVmlldygpO1xyXG4gIH1cclxuICBzZWxlY3RDdXJyZW50bHlIaWdobGlnaHRlZCgpOiB2b2lkIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWREYXkpKSByZXR1cm47XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcclxuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuRGF5czpcclxuICAgICAgICB0aGlzLnNlbGVjdERheSh0aGlzLmhpZ2hsaWdodGVkRGF5KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcclxuICAgICAgICB0aGlzLnNlbGVjdE1vbnRoKHRoaXMuaGlnaGxpZ2h0ZWRNb250aCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcclxuICAgICAgICB0aGlzLnNlbGVjdFllYXIodGhpcy5oaWdobGlnaHRlZFllYXIpO1xyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuICAvL2FjdGl2ZSBtb250aHMveWVhcnNcclxuICBjaGFuZ2VNb250aChvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3Qgb2xkeWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcclxuICAgIHRoaXMuYWN0aXZlTW9udGggKz0gb2Zmc2V0O1xyXG5cclxuICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gb2xkeWVhcikgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcclxuICAgIHRoaXMuYWN0aXZlTW9udGhDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZU1vbnRoKTtcclxuICB9XHJcbiAgY2hhbmdlWWVhcihvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVZZWFyICs9IG9mZnNldDtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVllYXIpO1xyXG4gIH1cclxuICAvL2NoYW5naW5nIHllYXIgcGFnZVxyXG4gIGNoYW5nZVllYXJzVmlld1BhZ2UocGFnZXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArPSAyNCAqIHBhZ2VzO1xyXG4gIH1cclxuICAvL25leHQvcHJldiBoaWdobGlnaHRpbmdcclxuICBoaWdobGlnaHROZXh0RGF5KG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudERheSA9IHRoaXMuaGlnaGxpZ2h0ZWREYXk7XHJcbiAgICBpZiAoIWlzRGVmaW5lZChjdXJyZW50RGF5KSkge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZERheUFkanVzdERhdGUoY3VycmVudERheSArIG9mZnNldCk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodFByZXZpb3VzRGF5KG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KG9mZnNldCAqIC0xKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0TmV4dE1vbnRoKG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudE1vbnRoID0gdGhpcy5oaWdobGlnaHRlZE1vbnRoO1xyXG4gICAgaWYgKCFpc0RlZmluZWQoY3VycmVudE1vbnRoKSkge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAwO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkTW9udGhBZGp1c3REYXRlKGN1cnJlbnRNb250aCArIG9mZnNldCk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodFByZXZpb3VzTW9udGgob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodE5leHRNb250aChvZmZzZXQgKiAtMSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodE5leHRZZWFyKG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmhpZ2hsaWdodGVkWWVhcjtcclxuICAgIGlmICghaXNEZWZpbmVkKGN1cnJlbnRZZWFyKSkge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IDA7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZShjdXJyZW50WWVhciArIG9mZnNldCk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodFByZXZpb3VzWWVhcihvZmZzZXQ6IG51bWJlciA9IDEpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0TmV4dFllYXIob2Zmc2V0ICogLTEpO1xyXG4gIH1cclxuICAvL2ZpcnN0L2xhc3QgaGlnaGxpZ2h0aW5nXHJcbiAgaGlnaGxpZ2h0Rmlyc3REYXkoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0TGFzdERheSgpOiB2b2lkIHtcclxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVNb250aCArIDEpIHtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgIGNhc2UgNTpcclxuICAgICAgY2FzZSA3OlxyXG4gICAgICBjYXNlIDg6XHJcbiAgICAgIGNhc2UgMTA6XHJcbiAgICAgIGNhc2UgMTI6XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDMxO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgY2FzZSA5OlxyXG4gICAgICBjYXNlIDExOlxyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAzMDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGlmIChpc0xlYXBZZWFyKHRoaXMuYWN0aXZlWWVhcikpIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyOTtcclxuICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcclxuICAgIH1cclxuICB9XHJcbiAgaGlnaGxpZ2h0Rmlyc3RNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IDA7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodExhc3RNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IDExO1xyXG4gIH1cclxuICBoaWdobGlnaHRGaXJzdFllYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodExhc3RZZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ICsgMjM7IC8vMjQgeWVhcnMgcGVyIHBhZ2VcclxuICB9XHJcbiAgLy9zYW1lIGRheSBuZXh0L3ByZXYgbW9udGgveWVhclxyXG4gIGhpZ2hsaWdodFNhbWVEYXlOZXh0TW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vbnRoKys7XHJcblxyXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzTW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vbnRoLS07XHJcblxyXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlTW9udGggKyAxKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICBjYXNlIDU6XHJcbiAgICAgIGNhc2UgNzpcclxuICAgICAgY2FzZSA4OlxyXG4gICAgICBjYXNlIDEwOlxyXG4gICAgICBjYXNlIDEyOlxyXG4gICAgICAgIC8vZG8gbm90aGluZ1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgY2FzZSA5OlxyXG4gICAgICBjYXNlIDExOlxyXG4gICAgICAgIC8vb25seSBkbyBpZiBkYXkgaXMgMzFcclxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZERheSA9PSAzMSkgdGhpcy5oaWdobGlnaHRlZERheSA9IDMwO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6IHtcclxuICAgICAgICAvL3NraXAgaWYgYmVsb3cgMjkgb3IgbnVsbFxyXG4gICAgICAgIGlmICghdGhpcy5oaWdobGlnaHRlZERheSB8fCB0aGlzLmhpZ2hsaWdodGVkRGF5IDwgMjkpIGJyZWFrO1xyXG5cclxuICAgICAgICBpZiAoaXNMZWFwWWVhcih0aGlzLmFjdGl2ZVllYXIpKSB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMjk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMjg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZURheU5leHRZZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVZZWFyKys7XHJcblxyXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyWWVhckNoYW5nZSgpO1xyXG4gIH1cclxuICBoaWdobGlnaHRTYW1lRGF5UHJldmlvdXNZZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVZZWFyLS07XHJcblxyXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyWWVhckNoYW5nZSgpO1xyXG4gIH1cclxuICBwcml2YXRlIF9maXhEYXRlQWZ0ZXJZZWFyQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWREYXkgIT0gMjkpIHJldHVybjsgLy9za2lwIGlmIG5vdCAyOXRoIGRheSBpcyBzZWxlY3RlZFxyXG4gICAgaWYgKGlzTGVhcFllYXIodGhpcy5hY3RpdmVZZWFyKSkgcmV0dXJuOyAvL3NraXAgaWYgbmVhIHllYXIgaXMgYSBsZWFwIHllYXJcclxuICAgIGlmICh0aGlzLmFjdGl2ZU1vbnRoICE9IDEpIHJldHVybjsgLy9za2lwIGlmIG5vdCBmZWJydWFyeVxyXG5cclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcclxuICB9XHJcbiAgLy9zYW1lIG1vbnRoIG5leHQvcHJldiB5ZWFyXHJcbiAgaGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFllYXIobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlWWVhciArPSBtdWx0aXBsZSA/IDEwIDogMTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZU1vbnRoUHJldmlvdXNZZWFyKG11bHRpcGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZVllYXIgLT0gbXVsdGlwbGUgPyAxMCA6IDE7XHJcbiAgfVxyXG4gIC8vc2FtZSB5ZWFyIG5leHQvcHJldiBwYWdlKHMpXHJcbiAgaGlnaGxpZ2h0U2FtZVllYXJOZXh0UGFnZShtdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKCFpc0RlZmluZWQodGhpcy5oaWdobGlnaHRlZFllYXIpKSB7XHJcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZSh0aGlzLmhpZ2hsaWdodGVkWWVhciArIChtdWx0aXBsZSA/IDYwIDogMjQpKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2FtZVllYXJQcmV2aW91c1BhZ2UobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKSkge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkWWVhckFkanVzdFBhZ2UodGhpcy5oaWdobGlnaHRlZFllYXIgLSAobXVsdGlwbGUgPyA2MCA6IDI0KSk7XHJcbiAgfVxyXG5cclxuICAvLyEgc2V0dGluZ3NcclxuICBwcm90ZWN0ZWQgX2ZpcnN0V2Vla2RheTogbnVtYmVyID0gMTtcclxuICBASW5wdXQoKVxyXG4gIGdldCBmaXJzdFdlZWtkYXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFdlZWtkYXk7XHJcbiAgfVxyXG4gIHNldCBmaXJzdFdlZWtkYXkodjogYW55KSB7XHJcbiAgICB0aGlzLl9maXJzdFdlZWtkYXkgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCAxKSAlIDc7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xyXG4gICAgdGhpcy5fdXBkYXRlV2Vla2RheUFycmF5KCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX25vaW50ZXJhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIGdldCBub2ludGVyYWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX25vaW50ZXJhY3QgfHwgdGhpcy5kaXNhYmxlZDtcclxuICB9XHJcbiAgc2V0IG5vaW50ZXJhY3QodjogYW55KSB7XHJcbiAgICB0aGlzLl9ub2ludGVyYWN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9zdGF0aWNIZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIGdldCBzdGF0aWNIZWlnaHQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljSGVpZ2h0O1xyXG4gIH1cclxuICBzZXQgc3RhdGljSGVpZ2h0KHY6IGFueSkge1xyXG4gICAgdGhpcy5fc3RhdGljSGVpZ2h0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xyXG4gIH1cclxuXHJcbiAgLy8hIGNhbGVuZGFyIGFycmF5XHJcbiAgLy9kYXlzIHZpZXcgYXJyYXlcclxuICBjYWxlbmRhckFycmF5ITogKG51bWJlciB8IG51bGwpW11bXTtcclxuXHJcbiAgcmVzZXJ2ZVRvcFJvdyE6IGJvb2xlYW47XHJcblxyXG4gIHByb3RlY3RlZCBfdXBkYXRlQ2FsZW5kYXJBcnJheSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlc3VsdE9iaiA9IGdldE1vbnRoTGF5b3V0KHRoaXMuX2FjdGl2ZURhdGUsIHRoaXMuZmlyc3RXZWVrZGF5KTtcclxuXHJcbiAgICB0aGlzLnJlc2VydmVUb3BSb3cgPSByZXN1bHRPYmoubGVhZGluZ1NwYWNlcyA8IDM7XHJcbiAgICB0aGlzLmNhbGVuZGFyQXJyYXkgPSByZXN1bHRPYmouYXJyYXk7XHJcbiAgfVxyXG5cclxuICAvL21vbnRocyB2aWV3IGFycmF5XHJcbiAgcmVhZG9ubHkgbW9udGhzQXJyYXk6IG51bWJlcltdID0gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMV07XHJcblxyXG4gIC8veWVhcnMgdmlldyBhcnJheVxyXG4gIHByaXZhdGUgX3llYXJzQXJyYXlDYWNoZTogbnVtYmVyW10gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIGdldFllYXJzQXJyYXkoKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XHJcblxyXG4gICAgaWYgKHRoaXMuX3llYXJzQXJyYXlDYWNoZVN0YXJ0WWVhciA9PSB5ZWFyICYmIGlzRGVmaW5lZCh0aGlzLl95ZWFyc0FycmF5Q2FjaGUpKSByZXR1cm4gdGhpcy5feWVhcnNBcnJheUNhY2hlO1xyXG5cclxuICAgIGNvbnN0IG5ld0FycmF5OiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSB5ZWFyOyBpIDwgeWVhciArIDI0OyBpKyspIHtcclxuICAgICAgbmV3QXJyYXkucHVzaChpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl95ZWFyc0FycmF5Q2FjaGUgPSBuZXdBcnJheTtcclxuICAgIHRoaXMuX3llYXJzQXJyYXlDYWNoZVN0YXJ0WWVhciA9IHllYXI7XHJcbiAgICByZXR1cm4gbmV3QXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLyEgd2Vla2RheSBhcnJheVxyXG4gIHdlZWtkYXlBcnJheSE6IG51bWJlcltdO1xyXG5cclxuICBwcm90ZWN0ZWQgX3VwZGF0ZVdlZWtkYXlBcnJheSgpOiB2b2lkIHtcclxuICAgIHRoaXMud2Vla2RheUFycmF5ID0gWzAsIDEsIDIsIDMsIDQsIDUsIDZdLm1hcCh2ID0+ICh2ICsgdGhpcy5maXJzdFdlZWtkYXkpICUgNyk7XHJcbiAgfVxyXG5cclxuICAvLyEgY2hhbmdlIHZpZXcgZnVuY3Rpb25zXHJcbiAgYWN0aXZlVmlldzogQ2FsZW5kYXJWaWV3ID0gQ2FsZW5kYXJWaWV3LkRheXM7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHN0YXJ0Vmlldyh2OiBDYWxlbmRhclZpZXcpIHtcclxuICAgIHRoaXMuYWN0aXZlVmlldyA9IHY7XHJcbiAgfVxyXG5cclxuICBvcGVuWWVhcnNWaWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3LlllYXJzO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZURpc3BsYXllZFllYXJSYW5nZVN0YXJ0KCk7XHJcblxyXG4gICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQodGhpcy5hY3RpdmVWaWV3KTtcclxuICB9XHJcbiAgb3Blbk1vbnRoc1ZpZXcoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXcuTW9udGhzO1xyXG4gICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZVxyXG4gICAgY29uc3Qgb2xkWWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcclxuICAgIHRoaXMuYWN0aXZlWWVhciA9IHRoaXMuYWN0aXZlWWVhciA/PyB0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpO1xyXG5cclxuICAgIC8vZW1pdCBldmVudHNcclxuICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuYWN0aXZlVmlldyk7XHJcbiAgICBpZiAob2xkWWVhciAhPSB0aGlzLmFjdGl2ZVllYXIgJiYgdGhpcy5hY3RpdmVZZWFyID09IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkpIHRoaXMuYWN0aXZlWWVhckNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlWWVhcik7XHJcbiAgfVxyXG4gIG9wZW5EYXlzVmlldygpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlVmlldyA9IENhbGVuZGFyVmlldy5EYXlzO1xyXG4gICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZXNcclxuICAgIGNvbnN0IG9sZFllYXIgPSB0aGlzLmFjdGl2ZVllYXI7XHJcbiAgICB0aGlzLmFjdGl2ZVllYXIgPSB0aGlzLmFjdGl2ZVllYXIgPz8gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5hY3RpdmVNb250aDtcclxuICAgIHRoaXMuYWN0aXZlTW9udGggPSB0aGlzLmFjdGl2ZU1vbnRoID8/IHRoaXMudG9kYXlEYXRlLmdldE1vbnRoKCk7XHJcblxyXG4gICAgLy9lbWl0IGV2ZW50c1xyXG4gICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQodGhpcy5hY3RpdmVWaWV3KTtcclxuICAgIGlmIChvbGRZZWFyICE9IHRoaXMuYWN0aXZlWWVhciAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcclxuICAgIGlmIChvbGRNb250aCAhPSB0aGlzLmFjdGl2ZU1vbnRoICYmIHRoaXMuYWN0aXZlTW9udGggPT0gdGhpcy50b2RheURhdGUuZ2V0TW9udGgoKSkgdGhpcy5hY3RpdmVNb250aENoYW5nZS5lbWl0KHRoaXMuYWN0aXZlTW9udGgpO1xyXG4gIH1cclxuXHJcbiAgLy8hIHRlbXBsYXRlIGN1c3RvbWl6YXRpb25cclxuICAvL2hlYWRlcnNcclxuICBAQ29udGVudENoaWxkKEFyZFllYXJzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlKVxyXG4gIHllYXJzVmlld0hlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJZZWFyc1ZpZXdIZWFkZXJDb250ZXh0PjtcclxuICBAQ29udGVudENoaWxkKEFyZE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSlcclxuICBtb250aHNWaWV3SGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhck1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0PjtcclxuICBAQ29udGVudENoaWxkKEFyZERheXNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpXHJcbiAgZGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyRGF5c1ZpZXdIZWFkZXJDb250ZXh0PjtcclxuICAvL3dlZWtkYXlcclxuICBAQ29udGVudENoaWxkKEFyZFdlZWtkYXlUZW1wbGF0ZURpcmVjdGl2ZSlcclxuICB3ZWVrZGF5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhcldlZWtkYXlDb250ZXh0PjtcclxuICAvL2Zsb2F0aW5nIG1vbnRoXHJcbiAgQENvbnRlbnRDaGlsZChBcmRGbG9hdGluZ01vbnRoVGVtcGxhdGVEaXJlY3RpdmUpXHJcbiAgZmxvYXRpbmdNb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dD47XHJcbiAgLy9ncmlkIGVsZW1lbnRzICh5ZWFyLCBtb250aCwgZGF5KVxyXG4gIEBDb250ZW50Q2hpbGQoQXJkWWVhclRlbXBsYXRlRGlyZWN0aXZlKVxyXG4gIHllYXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyWWVhckNvbnRleHQ+O1xyXG4gIEBDb250ZW50Q2hpbGQoQXJkTW9udGhUZW1wbGF0ZURpcmVjdGl2ZSlcclxuICBtb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJNb250aENvbnRleHQ+O1xyXG4gIEBDb250ZW50Q2hpbGQoQXJkRGF5VGVtcGxhdGVEaXJlY3RpdmUpXHJcbiAgZGF5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhckRheUNvbnRleHQ+O1xyXG5cclxuICAvLyEgY29udGV4dCBnZXR0ZXJzXHJcbiAgLy9oZWFkZXJzXHJcbiAgZ2V0WWVhcnNWaWV3SGVhZGVyQ29udGV4dCgpOiBDYWxlbmRhclllYXJzVmlld0hlYWRlckNvbnRleHQge1xyXG4gICAgY29uc3QgeWVhclJhbmdlU3RhcnQgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xyXG4gICAgY29uc3QgeWVhclJhbmdlRW5kID0geWVhclJhbmdlU3RhcnQgKyAyMztcclxuICAgIGNvbnN0IGRhdGVSYW5nZTogRGF0ZVJhbmdlID0ge1xyXG4gICAgICBsb3c6IG5ldyBEYXRlKHllYXJSYW5nZVN0YXJ0LCAwLCAxKSxcclxuICAgICAgaGlnaDogbmV3IERhdGUoeWVhclJhbmdlRW5kLCAwLCAxKSxcclxuICAgIH07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZXh0UGFnZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlWWVhcnNWaWV3UGFnZSgrMSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHByZXZQYWdlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VZZWFyc1ZpZXdQYWdlKC0xKTtcclxuICAgICAgfSxcclxuICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcclxuICAgICAgfSxcclxuICAgICAgeWVhclJhbmdlOiB7XHJcbiAgICAgICAgbG93OiB5ZWFyUmFuZ2VTdGFydCxcclxuICAgICAgICBoaWdoOiB5ZWFyUmFuZ2VFbmQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGRhdGVSYW5nZSxcclxuICAgICAgJGltcGxpY2l0OiBkYXRlUmFuZ2UsXHJcbiAgICB9O1xyXG4gIH1cclxuICBnZXRNb250aHNWaWV3SGVhZGVyQ29udGV4dCgpOiBDYWxlbmRhck1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG9wZW5ZZWFyc1ZpZXc6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5ZZWFyc1ZpZXcoKTtcclxuICAgICAgfSxcclxuICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcclxuICAgICAgfSxcclxuICAgICAgeWVhcjogdGhpcy5hY3RpdmVZZWFyLFxyXG4gICAgICBkYXRlOiB0aGlzLmFjdGl2ZURhdGUsXHJcbiAgICAgICRpbXBsaWNpdDogdGhpcy5hY3RpdmVZZWFyLFxyXG4gICAgfTtcclxuICB9XHJcbiAgZ2V0RGF5c1ZpZXdIZWFkZXJDb250ZXh0KCk6IENhbGVuZGFyRGF5c1ZpZXdIZWFkZXJDb250ZXh0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5leHRNb250aDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlTW9udGgoKzEpO1xyXG4gICAgICB9LFxyXG4gICAgICBwcmV2TW9udGg6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKC0xKTtcclxuICAgICAgfSxcclxuICAgICAgbmV4dFllYXI6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZVllYXIoKzEpO1xyXG4gICAgICB9LFxyXG4gICAgICBwcmV2WWVhcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlWWVhcigtMSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9wZW5ZZWFyc1ZpZXc6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5ZZWFyc1ZpZXcoKTtcclxuICAgICAgfSxcclxuICAgICAgb3Blbk1vbnRoc1ZpZXc6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5Nb250aHNWaWV3KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHllYXI6IHRoaXMuYWN0aXZlWWVhcixcclxuICAgICAgbW9udGg6IHRoaXMuYWN0aXZlTW9udGgsXHJcbiAgICAgIGRhdGU6IHRoaXMuYWN0aXZlRGF0ZSxcclxuICAgICAgJGltcGxpY2l0OiB0aGlzLmFjdGl2ZURhdGUsXHJcbiAgICB9O1xyXG4gIH1cclxuICAvL3dlZWtkYXlcclxuICBnZXRXZWVrZGF5Q29udGV4dChkYXlJbmRleDogbnVtYmVyKTogQ2FsZW5kYXJXZWVrZGF5Q29udGV4dCB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMTk3MCwgMCwgNCArIGRheUluZGV4KTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRheUluZGV4LFxyXG4gICAgICBkYXRlLFxyXG4gICAgICAkaW1wbGljaXQ6IGRhdGUsXHJcbiAgICB9O1xyXG4gIH1cclxuICAvL2Zsb2F0aW5nIG1vbnRoXHJcbiAgZ2V0RmxvYXRpbmdNb250aENvbnRleHQoKTogQ2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtb250aDogdGhpcy5hY3RpdmVNb250aCxcclxuICAgICAgZGF0ZTogdGhpcy5hY3RpdmVEYXRlLFxyXG4gICAgICAkaW1wbGljaXQ6IHRoaXMuYWN0aXZlRGF0ZSxcclxuICAgIH07XHJcbiAgfVxyXG4gIC8vZ3JpZCBlbGVtZW50cyAoeWVhciwgbW9udGgsIGRheSlcclxuICBnZXRZZWFyQ29udGV4dCh5ZWFyOiBudW1iZXIpOiBDYWxlbmRhclllYXJDb250ZXh0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHZhbHVlOiB5ZWFyLFxyXG4gICAgICBkYXRlOiBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIDAsIDEpLFxyXG4gICAgICAkaW1wbGljaXQ6IHllYXIsXHJcbiAgICAgIHNlbGVjdDogKHllYXI6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG4gIGdldE1vbnRoQ29udGV4dChtb250aDogbnVtYmVyKTogQ2FsZW5kYXJNb250aENvbnRleHQge1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgbW9udGgsIDEpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbW9udGgsXHJcbiAgICAgIGRhdGUsXHJcbiAgICAgICRpbXBsaWNpdDogZGF0ZSxcclxuICAgICAgc2VsZWN0OiAobW9udGg6IG51bWJlciB8IERhdGUpID0+IHtcclxuICAgICAgICB0aGlzLnNlbGVjdE1vbnRoKG1vbnRoKTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG4gIGdldERheUNvbnRleHQoZGF5OiBudW1iZXIpOiBDYWxlbmRhckRheUNvbnRleHQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdmFsdWU6IGRheSxcclxuICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpLFxyXG4gICAgICAkaW1wbGljaXQ6IGRheSxcclxuICAgICAgc2VsZWN0OiAoZGF5OiBudW1iZXIgfCBEYXRlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3REYXkoZGF5KTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXJcIiBbbmdDbGFzc109XCJuZ0NsYXNzZXNcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3RpdmVWaWV3ID09ICdkYXlzJyA/IGRheXNWaWV3IDogYWN0aXZlVmlldyA9PSAnbW9udGhzJyA/IG1vbnRoc1ZpZXcgOiB5ZWFyc1ZpZXdcIi8+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICN5ZWFyc1ZpZXc+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRZZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQtY3VyclJhbmdlIGxldC1uZXh0UGFnZT1cIm5leHRQYWdlXCIgbGV0LXByZXZQYWdlPVwicHJldlBhZ2VcIiBsZXQtb3BlbkRheXNWaWV3PVwib3BlbkRheXNWaWV3XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZGF5cy12aWV3LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGFyZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkRheXNWaWV3KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJSYW5nZS5sb3cgfCBkYXRlOiAnWVlZWScgfX1cclxuICAgICAgICAgICAgICAgICAgICAmbWRhc2g7XHJcbiAgICAgICAgICAgICAgICAgICAge3sgY3VyclJhbmdlLmhpZ2ggfCBkYXRlOiAnWVlZWScgfX1cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2FyZC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWFycm93c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cInByZXZQYWdlKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fbGVmdDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwibmV4dFBhZ2UoKVwiIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YXJkLWljb24+Y2hldnJvbl9yaWdodDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInllYXJzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHRZZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRZZWFyc1ZpZXdIZWFkZXJDb250ZXh0KClcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItbWFpbi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICNmb2N1c2FibGVFbGVtZW50XHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLXNpbXBsZS1ncmlkXCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJjdXJyZW50QXJpYUxhYmVsXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvblllYXJHcmlkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25ZZWFyR3JpZEJsdXIoKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblllYXJHcmlkQ2xpY2soKVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uTWFpbkdyaWRLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB5ZWFyIG9mIGdldFllYXJzQXJyYXkoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1oaWdobGlnaHRlZF09XCJoaWdobGlnaHRlZFllYXIgPT0geWVhciB8fCBhY3RpdmVZZWFyID09IHllYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktc2VsZWN0ZWRdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItdG9kYXldPVwiaXNZZWFyVG9kYXkoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyWWVhckNsaWNrKHllYXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyWWVhck1vdXNlb3Zlcih5ZWFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5LWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtYnV0dG9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFllYXJUZW1wbGF0ZSBsZXQteWVhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwieWVhclRlbXBsYXRlIHx8IGRlZmF1bHRZZWFyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRZZWFyQ29udGV4dCh5ZWFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbW9udGhzVmlldz5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQteWVhciBsZXQtbmV4dFBhZ2U9XCJuZXh0UGFnZVwiIGxldC1wcmV2UGFnZT1cInByZXZQYWdlXCIgbGV0LW9wZW5EYXlzVmlldz1cIm9wZW5EYXlzVmlld1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWRheXMtdmlldy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxhcmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EYXlzVmlldygpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9hcmQtYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9udGhzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHRNb250aHNWaWV3SGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0TW9udGhzVmlld0hlYWRlckNvbnRleHQoKVwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1tYWluLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgI2ZvY3VzYWJsZUVsZW1lbnRcclxuICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItc2ltcGxlLWdyaWRcIlxyXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cImN1cnJlbnRBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uTW9udGhHcmlkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25Nb250aEdyaWRCbHVyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Nb250aEdyaWRDbGljaygpXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwib25NYWluR3JpZEtleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoc0FycmF5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LWhpZ2hsaWdodGVkXT1cImhpZ2hsaWdodGVkTW9udGggPT0gbW9udGggfHwgYWN0aXZlTW9udGggPT0gbW9udGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktc2VsZWN0ZWRdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci10b2RheV09XCJpc01vbnRoVG9kYXkobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYWxlbmRhck1vbnRoQ2xpY2sobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyTW9udGhNb3VzZW92ZXIobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhcmQtY2FsZW5kYXItZW50cnktYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWZvY3VzLW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1idXR0b24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TW9udGhUZW1wbGF0ZSBsZXQtbW9udGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGggfCBkYXRlOiBcIk1NTVwiIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9udGhUZW1wbGF0ZSB8fCBkZWZhdWx0TW9udGhUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldE1vbnRoQ29udGV4dChtb250aClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RheXNWaWV3PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQtY3VyckRhdGUgbGV0LW5leHRNb250aD1cIm5leHRNb250aFwiIGxldC1wcmV2TW9udGg9XCJwcmV2TW9udGhcIiBsZXQtb3BlblllYXJzVmlldz1cIm9wZW5ZZWFyc1ZpZXdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1kYXlzLXZpZXctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YXJkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuWWVhcnNWaWV3KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJEYXRlIHwgZGF0ZTogJ01NTSBZWVlZJyB8IHVwcGVyY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZHJvcGRvd24tYXJyb3dcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYXJkLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItYXJyb3dzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwicHJldk1vbnRoKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fbGVmdDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fcmlnaHQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJkYXlzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHREYXlzVmlld0hlYWRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldERheXNWaWV3SGVhZGVyQ29udGV4dCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLW1haW4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1kYXktbGFiZWxzIGFyZC1jYWxlbmRhci1ncmlkXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFdlZWtkYXlUZW1wbGF0ZSBsZXQtZGF0ZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItd2Vla2RheVwiPnt7IGRhdGUgfCBkYXRlOiAnRUVFRUUnIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdlZWtkYXlJbmRleCBvZiB3ZWVrZGF5QXJyYXlcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIndlZWtkYXlUZW1wbGF0ZSB8fCBkZWZhdWx0V2Vla2RheVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0V2Vla2RheUNvbnRleHQod2Vla2RheUluZGV4KVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAjZm9jdXNhYmxlRWxlbWVudFxyXG4gICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1tYWluLWdyaWQgYXJkLWNhbGVuZGFyLWdyaWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYXJkLXJlc2VydmUtdG9wLXJvd109XCJyZXNlcnZlVG9wUm93XCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJjdXJyZW50QXJpYUxhYmVsXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkRheUdyaWRGb2N1cygpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvbkRheUdyaWRCbHVyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25EYXlHcmlkQ2xpY2soKVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uTWFpbkdyaWRLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWZsb2F0aW5nLW1vbnRoXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRGbG9hdGluZ01vbnRoVGVtcGxhdGUgbGV0LWRhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZGF0ZSB8IGRhdGU6ICdMTEwnIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZsb2F0aW5nTW9udGhUZW1wbGF0ZSB8fCBkZWZhdWx0RmxvYXRpbmdNb250aFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0RmxvYXRpbmdNb250aENvbnRleHQoKVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdlZWsgb2YgY2FsZW5kYXJBcnJheVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1lbXB0eV09XCJkYXkgPT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktaGlnaGxpZ2h0ZWRdPVwiaGlnaGxpZ2h0ZWREYXkgPT0gZGF5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1zZWxlY3RlZF09XCJpc0RheVNlbGVjdGVkKGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLXRvZGF5XT1cImlzRGF5VG9kYXkoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyRGF5Q2xpY2soZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyRGF5TW91c2VvdmVyKGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXkgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWJ1dHRvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGF5VGVtcGxhdGUgbGV0LWRheT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF5VGVtcGxhdGUgfHwgZGVmYXVsdERheVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldERheUNvbnRleHQoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdTcGlubmVyVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsb2FkaW5nU3Bpbm5lclRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nU3Bpbm5lclRlbXBsYXRlXCI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L25nLWNvbnRhaW5lcj4gLS0+Il19