@sbb-esta/lyne-elements-dev 0.0.0 → 4.5.1-dev.1771859294

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 (1979) hide show
  1. package/README.md +55 -0
  2. package/_index.scss +2 -0
  3. package/a11y.css +22 -0
  4. package/accordion/accordion.component.js +97 -0
  5. package/accordion.js +4 -0
  6. package/action-group/action-group.component.js +106 -0
  7. package/action-group.js +4 -0
  8. package/alert/alert/alert.component.js +143 -0
  9. package/alert/alert-group/alert-group.component.js +103 -0
  10. package/alert/alert-group.js +4 -0
  11. package/alert/alert.js +4 -0
  12. package/alert.js +6 -0
  13. package/animation.css +14 -0
  14. package/autocomplete/autocomplete-base-element.js +371 -0
  15. package/autocomplete/autocomplete.component.js +59 -0
  16. package/autocomplete.js +6 -0
  17. package/badge.css +32 -0
  18. package/breadcrumb/breadcrumb/breadcrumb.component.js +29 -0
  19. package/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +134 -0
  20. package/breadcrumb/breadcrumb-group.js +4 -0
  21. package/breadcrumb/breadcrumb.js +4 -0
  22. package/breadcrumb.js +6 -0
  23. package/button/accent-button/accent-button.component.js +22 -0
  24. package/button/accent-button-link/accent-button-link.component.js +22 -0
  25. package/button/accent-button-link.js +4 -0
  26. package/button/accent-button-static/accent-button-static.component.js +22 -0
  27. package/button/accent-button-static.js +4 -0
  28. package/button/accent-button.js +4 -0
  29. package/button/button/button.component.js +22 -0
  30. package/button/button-link/button-link.component.js +22 -0
  31. package/button/button-link.js +4 -0
  32. package/button/button-static/button-static.component.js +22 -0
  33. package/button/button-static.js +4 -0
  34. package/button/button.js +4 -0
  35. package/button/common/button-common.js +73 -0
  36. package/button/common.js +12 -0
  37. package/button/mini-button/mini-button.component.js +32 -0
  38. package/button/mini-button-group/mini-button-group.component.js +67 -0
  39. package/button/mini-button-group.js +4 -0
  40. package/button/mini-button-link/mini-button-link.component.js +35 -0
  41. package/button/mini-button-link.js +4 -0
  42. package/button/mini-button.js +4 -0
  43. package/button/secondary-button/secondary-button.component.js +22 -0
  44. package/button/secondary-button-link/secondary-button-link.component.js +22 -0
  45. package/button/secondary-button-link.js +4 -0
  46. package/button/secondary-button-static/secondary-button-static.component.js +22 -0
  47. package/button/secondary-button-static.js +4 -0
  48. package/button/secondary-button.js +4 -0
  49. package/button/transparent-button/transparent-button.component.js +22 -0
  50. package/button/transparent-button-link/transparent-button-link.component.js +22 -0
  51. package/button/transparent-button-link.js +4 -0
  52. package/button/transparent-button-static/transparent-button-static.component.js +22 -0
  53. package/button/transparent-button-static.js +4 -0
  54. package/button/transparent-button.js +4 -0
  55. package/button.js +42 -0
  56. package/calendar/calendar.component.js +1214 -0
  57. package/calendar.js +4 -0
  58. package/card/card/card.component.js +48 -0
  59. package/card/card-badge/card-badge.component.js +48 -0
  60. package/card/card-badge.js +4 -0
  61. package/card/card-button/card-button.component.js +19 -0
  62. package/card/card-button.js +4 -0
  63. package/card/card-link/card-link.component.js +19 -0
  64. package/card/card-link.js +4 -0
  65. package/card/card.js +4 -0
  66. package/card/common/card-action-common.js +63 -0
  67. package/card/common.js +4 -0
  68. package/card.js +12 -0
  69. package/carousel/carousel/carousel.component.js +88 -0
  70. package/carousel/carousel-item/carousel-item.component.js +26 -0
  71. package/carousel/carousel-item.js +4 -0
  72. package/carousel/carousel-list/carousel-list.component.js +98 -0
  73. package/carousel/carousel-list.js +4 -0
  74. package/carousel/carousel.js +4 -0
  75. package/carousel.js +8 -0
  76. package/checkbox/checkbox/checkbox.component.js +90 -0
  77. package/checkbox/checkbox-group/checkbox-group.component.js +100 -0
  78. package/checkbox/checkbox-group.js +4 -0
  79. package/checkbox/checkbox-panel/checkbox-panel.component.js +75 -0
  80. package/checkbox/checkbox-panel.js +4 -0
  81. package/checkbox/checkbox.js +4 -0
  82. package/checkbox/common/checkbox-common.js +54 -0
  83. package/checkbox/common.js +6 -0
  84. package/checkbox-common-t04WeA36.js +5 -0
  85. package/checkbox.js +12 -0
  86. package/chip/chip/chip.component.js +72 -0
  87. package/chip/chip-group/chip-group.component.js +232 -0
  88. package/chip/chip-group.js +4 -0
  89. package/chip/chip.js +4 -0
  90. package/chip-label/chip-label.component.js +55 -0
  91. package/chip-label.js +4 -0
  92. package/chip.js +6 -0
  93. package/clock/clock.component.js +153 -0
  94. package/clock.js +4 -0
  95. package/container/container/container.component.js +75 -0
  96. package/container/container.js +4 -0
  97. package/container/sticky-bar/sticky-bar.component.js +121 -0
  98. package/container/sticky-bar.js +4 -0
  99. package/container.js +6 -0
  100. package/core/a11y/arrow-navigation.js +33 -0
  101. package/core/a11y/fake-event-detection.js +11 -0
  102. package/core/a11y/focus-trap-controller.js +92 -0
  103. package/core/a11y/focus-visible-within-controller.js +20 -0
  104. package/core/a11y/focus.js +13 -0
  105. package/core/a11y/input-modality-detector.js +47 -0
  106. package/core/a11y/interactivity-checker.js +96 -0
  107. package/core/a11y/live-announcer.js +40 -0
  108. package/core/a11y.js +26 -0
  109. package/core/base-elements/action-base-element.js +39 -0
  110. package/core/base-elements/button-base-element.js +146 -0
  111. package/core/base-elements/link-base-element.js +126 -0
  112. package/core/base-elements/open-close-base-element.js +44 -0
  113. package/core/base-elements.js +11 -0
  114. package/core/config/config.js +11 -0
  115. package/core/config.js +5 -0
  116. package/core/controllers/escapable-overlay-controller.js +27 -0
  117. package/core/controllers/id-reference-controller.js +60 -0
  118. package/core/controllers/inert-controller.js +58 -0
  119. package/core/controllers/language-controller.js +39 -0
  120. package/core/controllers/media-matchers-controller.js +97 -0
  121. package/core/controllers/overlay-position-controller.js +224 -0
  122. package/core/controllers/property-watcher-controller.js +60 -0
  123. package/core/controllers/slot-state-controller.js +37 -0
  124. package/core/controllers.js +30 -0
  125. package/core/datetime/date-adapter.js +136 -0
  126. package/core/datetime/native-date-adapter.js +140 -0
  127. package/core/datetime/temporal-date-adapter.js +145 -0
  128. package/core/datetime.js +16 -0
  129. package/core/decorators/base.js +1 -0
  130. package/core/decorators/force-type.js +17 -0
  131. package/core/decorators/get-override.js +14 -0
  132. package/core/decorators/handle-distinct-change.js +16 -0
  133. package/core/decorators/host-attributes.js +18 -0
  134. package/core/decorators/id-reference.js +76 -0
  135. package/core/decorators/omit-empty-converter.js +9 -0
  136. package/core/decorators/plain-date.js +26 -0
  137. package/core/decorators.js +17 -0
  138. package/core/dom/animation.js +10 -0
  139. package/core/dom/contains-pierce-shadow-dom.js +12 -0
  140. package/core/dom/lean-context.js +7 -0
  141. package/core/dom/platform.js +21 -0
  142. package/core/dom/queue-dom-content-loaded.js +7 -0
  143. package/core/dom/scroll.js +19 -0
  144. package/core/dom/set-or-remove-attribute.js +6 -0
  145. package/core/dom.js +27 -0
  146. package/core/eventing/composed-path-has-attribute.js +8 -0
  147. package/core/eventing/event-target.js +6 -0
  148. package/core/eventing/form-element-handlers.js +6 -0
  149. package/core/eventing/forward-event.js +7 -0
  150. package/core/eventing/is-event-prevented.js +6 -0
  151. package/core/eventing/throttle.js +11 -0
  152. package/core/eventing.js +14 -0
  153. package/core/i18n/i18n.js +778 -0
  154. package/core/i18n.js +104 -0
  155. package/core/images.js +15 -0
  156. package/core/interfaces.js +1 -0
  157. package/core/mixins/animation-complete-mixin.js +43 -0
  158. package/core/mixins/constructor.js +1 -0
  159. package/core/mixins/disabled-mixin.js +75 -0
  160. package/core/mixins/element-internals-mixin.js +159 -0
  161. package/core/mixins/form-associated-checkbox-mixin.js +91 -0
  162. package/core/mixins/form-associated-input-mixin.js +191 -0
  163. package/core/mixins/form-associated-mixin.js +230 -0
  164. package/core/mixins/form-associated-radio-button-mixin.js +166 -0
  165. package/core/mixins/hydration-mixin.js +38 -0
  166. package/core/mixins/named-slot-list-mixin.js +102 -0
  167. package/core/mixins/negative-mixin.js +34 -0
  168. package/core/mixins/panel-mixin.js +71 -0
  169. package/core/mixins/readonly-mixin.js +35 -0
  170. package/core/mixins/required-mixin.js +36 -0
  171. package/core/mixins/selection-panel-mixin.js +39 -0
  172. package/core/mixins/update-scheduler-mixin.js +22 -0
  173. package/core/mixins.js +41 -0
  174. package/core/overlay/overlay-option-panel.js +17 -0
  175. package/core/overlay/overlay-outside-pointer-event-listener.js +37 -0
  176. package/core/overlay/overlay-trigger-attributes.js +18 -0
  177. package/core/overlay/overlay.js +14 -0
  178. package/core/overlay/position.js +53 -0
  179. package/core/overlay.js +19 -0
  180. package/core/styles/_index.scss +26 -0
  181. package/core/styles/a11y.scss +15 -0
  182. package/core/styles/animation.scss +17 -0
  183. package/core/styles/badge.scss +3 -0
  184. package/core/styles/box-sizing.scss +3 -0
  185. package/core/styles/core/functions.scss +26 -0
  186. package/core/styles/core/mediaqueries.scss +98 -0
  187. package/core/styles/core/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +371 -0
  188. package/core/styles/core.scss +819 -0
  189. package/core/styles/disable-animation.scss +5 -0
  190. package/core/styles/font-characters-extension.scss +3 -0
  191. package/core/styles/image.scss +66 -0
  192. package/core/styles/layout.scss +20 -0
  193. package/core/styles/lean-theme.scss +3 -0
  194. package/core/styles/lists.scss +14 -0
  195. package/core/styles/mixins/a11y.scss +42 -0
  196. package/core/styles/mixins/animation.scss +11 -0
  197. package/core/styles/mixins/badge.scss +42 -0
  198. package/core/styles/mixins/buttons.scss +12 -0
  199. package/core/styles/mixins/card.scss +203 -0
  200. package/core/styles/mixins/chip.scss +95 -0
  201. package/core/styles/mixins/dev_and_debug.scss +8 -0
  202. package/core/styles/mixins/font-face.scss +45 -0
  203. package/core/styles/mixins/helpers.scss +68 -0
  204. package/core/styles/mixins/image.scss +43 -0
  205. package/core/styles/mixins/inputs.scss +11 -0
  206. package/core/styles/mixins/layout.scss +38 -0
  207. package/core/styles/mixins/link.scss +125 -0
  208. package/core/styles/mixins/lists.scss +271 -0
  209. package/core/styles/mixins/overlay.scss +165 -0
  210. package/core/styles/mixins/panel.scss +76 -0
  211. package/core/styles/mixins/pearl-chain-bullet.scss +133 -0
  212. package/core/styles/mixins/popover.scss +14 -0
  213. package/core/styles/mixins/scrollbar.scss +117 -0
  214. package/core/styles/mixins/table.scss +175 -0
  215. package/core/styles/mixins/timetable-form.scss +63 -0
  216. package/core/styles/mixins/typo.scss +255 -0
  217. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables-as-css.scss +1183 -0
  218. package/core/styles/normalize.scss +145 -0
  219. package/core/styles/off-brand-theme.scss +3 -0
  220. package/core/styles/safety-theme.scss +3 -0
  221. package/core/styles/scrollbar.scss +44 -0
  222. package/core/styles/standard-theme.scss +3 -0
  223. package/core/styles/table.scss +122 -0
  224. package/core/styles/theme.scss +18 -0
  225. package/core/styles/timetable-form.scss +27 -0
  226. package/core/styles/typography.scss +50 -0
  227. package/core/styles.js +5 -0
  228. package/core/testing/event-spy.js +51 -0
  229. package/core/testing/mocha-extensions.js +11 -0
  230. package/core/testing/wait-for-condition.js +13 -0
  231. package/core/testing/wait-for-image-ready.js +17 -0
  232. package/core/testing/wait-for-render.js +14 -0
  233. package/core/testing.js +14 -0
  234. package/core.css +2207 -0
  235. package/custom-elements.json +111854 -0
  236. package/date-input/date-input.component.js +165 -0
  237. package/date-input.js +4 -0
  238. package/datepicker/common/datepicker-button.js +96 -0
  239. package/datepicker/common.js +7 -0
  240. package/datepicker/datepicker/datepicker.component.js +120 -0
  241. package/datepicker/datepicker-next-day/datepicker-next-day.component.js +40 -0
  242. package/datepicker/datepicker-next-day.js +4 -0
  243. package/datepicker/datepicker-previous-day/datepicker-previous-day.component.js +40 -0
  244. package/datepicker/datepicker-previous-day.js +4 -0
  245. package/datepicker/datepicker-toggle/datepicker-toggle.component.js +52 -0
  246. package/datepicker/datepicker-toggle.js +4 -0
  247. package/datepicker/datepicker.js +4 -0
  248. package/datepicker-button-Debzp_As.js +5 -0
  249. package/datepicker.js +15 -0
  250. package/development/accordion/accordion.component.d.ts +38 -0
  251. package/development/accordion/accordion.component.d.ts.map +1 -0
  252. package/development/accordion/accordion.component.js +138 -0
  253. package/development/accordion.d.ts +5 -0
  254. package/development/accordion.d.ts.map +1 -0
  255. package/development/accordion.js +5 -0
  256. package/development/action-group/action-group.component.d.ts +46 -0
  257. package/development/action-group/action-group.component.d.ts.map +1 -0
  258. package/development/action-group/action-group.component.js +311 -0
  259. package/development/action-group.d.ts +5 -0
  260. package/development/action-group.d.ts.map +1 -0
  261. package/development/action-group.js +5 -0
  262. package/development/alert/alert/alert.component.d.ts +51 -0
  263. package/development/alert/alert/alert.component.d.ts.map +1 -0
  264. package/development/alert/alert/alert.component.js +392 -0
  265. package/development/alert/alert-group/alert-group.component.d.ts +39 -0
  266. package/development/alert/alert-group/alert-group.component.d.ts.map +1 -0
  267. package/development/alert/alert-group/alert-group.component.js +173 -0
  268. package/development/alert/alert-group.d.ts +5 -0
  269. package/development/alert/alert-group.d.ts.map +1 -0
  270. package/development/alert/alert-group.js +5 -0
  271. package/development/alert/alert.d.ts +5 -0
  272. package/development/alert/alert.d.ts.map +1 -0
  273. package/development/alert/alert.js +5 -0
  274. package/development/alert.d.ts +6 -0
  275. package/development/alert.d.ts.map +1 -0
  276. package/development/alert.js +7 -0
  277. package/development/autocomplete/autocomplete-base-element.d.ts +137 -0
  278. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -0
  279. package/development/autocomplete/autocomplete-base-element.js +891 -0
  280. package/development/autocomplete/autocomplete.component.d.ts +30 -0
  281. package/development/autocomplete/autocomplete.component.d.ts.map +1 -0
  282. package/development/autocomplete/autocomplete.component.js +88 -0
  283. package/development/autocomplete.d.ts +6 -0
  284. package/development/autocomplete.d.ts.map +1 -0
  285. package/development/autocomplete.js +7 -0
  286. package/development/breadcrumb/breadcrumb/breadcrumb.component.d.ts +20 -0
  287. package/development/breadcrumb/breadcrumb/breadcrumb.component.d.ts.map +1 -0
  288. package/development/breadcrumb/breadcrumb/breadcrumb.component.js +91 -0
  289. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.d.ts +50 -0
  290. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.d.ts.map +1 -0
  291. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +269 -0
  292. package/development/breadcrumb/breadcrumb-group.d.ts +5 -0
  293. package/development/breadcrumb/breadcrumb-group.d.ts.map +1 -0
  294. package/development/breadcrumb/breadcrumb-group.js +5 -0
  295. package/development/breadcrumb/breadcrumb.d.ts +5 -0
  296. package/development/breadcrumb/breadcrumb.d.ts.map +1 -0
  297. package/development/breadcrumb/breadcrumb.js +5 -0
  298. package/development/breadcrumb.d.ts +6 -0
  299. package/development/breadcrumb.d.ts.map +1 -0
  300. package/development/breadcrumb.js +7 -0
  301. package/development/button/accent-button/accent-button.component.d.ts +20 -0
  302. package/development/button/accent-button/accent-button.component.d.ts.map +1 -0
  303. package/development/button/accent-button/accent-button.component.js +30 -0
  304. package/development/button/accent-button-link/accent-button-link.component.d.ts +20 -0
  305. package/development/button/accent-button-link/accent-button-link.component.d.ts.map +1 -0
  306. package/development/button/accent-button-link/accent-button-link.component.js +30 -0
  307. package/development/button/accent-button-link.d.ts +5 -0
  308. package/development/button/accent-button-link.d.ts.map +1 -0
  309. package/development/button/accent-button-link.js +5 -0
  310. package/development/button/accent-button-static/accent-button-static.component.d.ts +20 -0
  311. package/development/button/accent-button-static/accent-button-static.component.d.ts.map +1 -0
  312. package/development/button/accent-button-static/accent-button-static.component.js +30 -0
  313. package/development/button/accent-button-static.d.ts +5 -0
  314. package/development/button/accent-button-static.d.ts.map +1 -0
  315. package/development/button/accent-button-static.js +5 -0
  316. package/development/button/accent-button.d.ts +5 -0
  317. package/development/button/accent-button.d.ts.map +1 -0
  318. package/development/button/accent-button.js +5 -0
  319. package/development/button/button/button.component.d.ts +20 -0
  320. package/development/button/button/button.component.d.ts.map +1 -0
  321. package/development/button/button/button.component.js +30 -0
  322. package/development/button/button-link/button-link.component.d.ts +20 -0
  323. package/development/button/button-link/button-link.component.d.ts.map +1 -0
  324. package/development/button/button-link/button-link.component.js +30 -0
  325. package/development/button/button-link.d.ts +5 -0
  326. package/development/button/button-link.d.ts.map +1 -0
  327. package/development/button/button-link.js +5 -0
  328. package/development/button/button-static/button-static.component.d.ts +20 -0
  329. package/development/button/button-static/button-static.component.d.ts.map +1 -0
  330. package/development/button/button-static/button-static.component.js +30 -0
  331. package/development/button/button-static.d.ts +5 -0
  332. package/development/button/button-static.d.ts.map +1 -0
  333. package/development/button/button-static.js +5 -0
  334. package/development/button/button.d.ts +5 -0
  335. package/development/button/button.d.ts.map +1 -0
  336. package/development/button/button.js +5 -0
  337. package/development/button/common/button-common.d.ts +11 -0
  338. package/development/button/common/button-common.d.ts.map +1 -0
  339. package/development/button/common/button-common.js +98 -0
  340. package/development/button/common.d.ts +5 -0
  341. package/development/button/common.d.ts.map +1 -0
  342. package/development/button/common.js +13 -0
  343. package/development/button/mini-button/mini-button.component.d.ts +21 -0
  344. package/development/button/mini-button/mini-button.component.d.ts.map +1 -0
  345. package/development/button/mini-button/mini-button.component.js +40 -0
  346. package/development/button/mini-button-group/mini-button-group.component.d.ts +31 -0
  347. package/development/button/mini-button-group/mini-button-group.component.d.ts.map +1 -0
  348. package/development/button/mini-button-group/mini-button-group.component.js +147 -0
  349. package/development/button/mini-button-group.d.ts +5 -0
  350. package/development/button/mini-button-group.d.ts.map +1 -0
  351. package/development/button/mini-button-group.js +5 -0
  352. package/development/button/mini-button-link/mini-button-link.component.d.ts +21 -0
  353. package/development/button/mini-button-link/mini-button-link.component.d.ts.map +1 -0
  354. package/development/button/mini-button-link/mini-button-link.component.js +47 -0
  355. package/development/button/mini-button-link.d.ts +5 -0
  356. package/development/button/mini-button-link.d.ts.map +1 -0
  357. package/development/button/mini-button-link.js +5 -0
  358. package/development/button/mini-button.d.ts +5 -0
  359. package/development/button/mini-button.d.ts.map +1 -0
  360. package/development/button/mini-button.js +5 -0
  361. package/development/button/secondary-button/secondary-button.component.d.ts +20 -0
  362. package/development/button/secondary-button/secondary-button.component.d.ts.map +1 -0
  363. package/development/button/secondary-button/secondary-button.component.js +30 -0
  364. package/development/button/secondary-button-link/secondary-button-link.component.d.ts +20 -0
  365. package/development/button/secondary-button-link/secondary-button-link.component.d.ts.map +1 -0
  366. package/development/button/secondary-button-link/secondary-button-link.component.js +30 -0
  367. package/development/button/secondary-button-link.d.ts +5 -0
  368. package/development/button/secondary-button-link.d.ts.map +1 -0
  369. package/development/button/secondary-button-link.js +5 -0
  370. package/development/button/secondary-button-static/secondary-button-static.component.d.ts +20 -0
  371. package/development/button/secondary-button-static/secondary-button-static.component.d.ts.map +1 -0
  372. package/development/button/secondary-button-static/secondary-button-static.component.js +30 -0
  373. package/development/button/secondary-button-static.d.ts +5 -0
  374. package/development/button/secondary-button-static.d.ts.map +1 -0
  375. package/development/button/secondary-button-static.js +5 -0
  376. package/development/button/secondary-button.d.ts +5 -0
  377. package/development/button/secondary-button.d.ts.map +1 -0
  378. package/development/button/secondary-button.js +5 -0
  379. package/development/button/transparent-button/transparent-button.component.d.ts +20 -0
  380. package/development/button/transparent-button/transparent-button.component.d.ts.map +1 -0
  381. package/development/button/transparent-button/transparent-button.component.js +30 -0
  382. package/development/button/transparent-button-link/transparent-button-link.component.d.ts +20 -0
  383. package/development/button/transparent-button-link/transparent-button-link.component.d.ts.map +1 -0
  384. package/development/button/transparent-button-link/transparent-button-link.component.js +30 -0
  385. package/development/button/transparent-button-link.d.ts +5 -0
  386. package/development/button/transparent-button-link.d.ts.map +1 -0
  387. package/development/button/transparent-button-link.js +5 -0
  388. package/development/button/transparent-button-static/transparent-button-static.component.d.ts +20 -0
  389. package/development/button/transparent-button-static/transparent-button-static.component.d.ts.map +1 -0
  390. package/development/button/transparent-button-static/transparent-button-static.component.js +30 -0
  391. package/development/button/transparent-button-static.d.ts +5 -0
  392. package/development/button/transparent-button-static.d.ts.map +1 -0
  393. package/development/button/transparent-button-static.js +5 -0
  394. package/development/button/transparent-button.d.ts +5 -0
  395. package/development/button/transparent-button.d.ts.map +1 -0
  396. package/development/button/transparent-button.js +5 -0
  397. package/development/button.d.ts +20 -0
  398. package/development/button.d.ts.map +1 -0
  399. package/development/button.js +43 -0
  400. package/development/calendar/calendar.component.d.ts +310 -0
  401. package/development/calendar/calendar.component.d.ts.map +1 -0
  402. package/development/calendar/calendar.component.js +1957 -0
  403. package/development/calendar.d.ts +5 -0
  404. package/development/calendar.d.ts.map +1 -0
  405. package/development/calendar.js +5 -0
  406. package/development/card/card/card.component.d.ts +22 -0
  407. package/development/card/card/card.component.d.ts.map +1 -0
  408. package/development/card/card/card.component.js +240 -0
  409. package/development/card/card-badge/card-badge.component.d.ts +23 -0
  410. package/development/card/card-badge/card-badge.component.d.ts.map +1 -0
  411. package/development/card/card-badge/card-badge.component.js +126 -0
  412. package/development/card/card-badge.d.ts +5 -0
  413. package/development/card/card-badge.d.ts.map +1 -0
  414. package/development/card/card-badge.js +5 -0
  415. package/development/card/card-button/card-button.component.d.ts +18 -0
  416. package/development/card/card-button/card-button.component.d.ts.map +1 -0
  417. package/development/card/card-button/card-button.component.js +29 -0
  418. package/development/card/card-button.d.ts +5 -0
  419. package/development/card/card-button.d.ts.map +1 -0
  420. package/development/card/card-button.js +5 -0
  421. package/development/card/card-link/card-link.component.d.ts +18 -0
  422. package/development/card/card-link/card-link.component.d.ts.map +1 -0
  423. package/development/card/card-link/card-link.component.js +29 -0
  424. package/development/card/card-link.d.ts +5 -0
  425. package/development/card/card-link.d.ts.map +1 -0
  426. package/development/card/card-link.js +5 -0
  427. package/development/card/card.d.ts +5 -0
  428. package/development/card/card.d.ts.map +1 -0
  429. package/development/card/card.js +5 -0
  430. package/development/card/common/card-action-common.d.ts +8 -0
  431. package/development/card/common/card-action-common.d.ts.map +1 -0
  432. package/development/card/common/card-action-common.js +121 -0
  433. package/development/card/common.d.ts +5 -0
  434. package/development/card/common.d.ts.map +1 -0
  435. package/development/card/common.js +5 -0
  436. package/development/card.d.ts +9 -0
  437. package/development/card.d.ts.map +1 -0
  438. package/development/card.js +13 -0
  439. package/development/carousel/carousel/carousel.component.d.ts +34 -0
  440. package/development/carousel/carousel/carousel.component.d.ts.map +1 -0
  441. package/development/carousel/carousel/carousel.component.js +167 -0
  442. package/development/carousel/carousel-item/carousel-item.component.d.ts +29 -0
  443. package/development/carousel/carousel-item/carousel-item.component.d.ts.map +1 -0
  444. package/development/carousel/carousel-item/carousel-item.component.js +44 -0
  445. package/development/carousel/carousel-item.d.ts +5 -0
  446. package/development/carousel/carousel-item.d.ts.map +1 -0
  447. package/development/carousel/carousel-item.js +5 -0
  448. package/development/carousel/carousel-list/carousel-list.component.d.ts +35 -0
  449. package/development/carousel/carousel-list/carousel-list.component.d.ts.map +1 -0
  450. package/development/carousel/carousel-list/carousel-list.component.js +170 -0
  451. package/development/carousel/carousel-list.d.ts +5 -0
  452. package/development/carousel/carousel-list.d.ts.map +1 -0
  453. package/development/carousel/carousel-list.js +5 -0
  454. package/development/carousel/carousel.d.ts +5 -0
  455. package/development/carousel/carousel.d.ts.map +1 -0
  456. package/development/carousel/carousel.js +5 -0
  457. package/development/carousel.d.ts +7 -0
  458. package/development/carousel.d.ts.map +1 -0
  459. package/development/carousel.js +9 -0
  460. package/development/checkbox/checkbox/checkbox.component.d.ts +33 -0
  461. package/development/checkbox/checkbox/checkbox.component.d.ts.map +1 -0
  462. package/development/checkbox/checkbox/checkbox.component.js +147 -0
  463. package/development/checkbox/checkbox-group/checkbox-group.component.d.ts +39 -0
  464. package/development/checkbox/checkbox-group/checkbox-group.component.d.ts.map +1 -0
  465. package/development/checkbox/checkbox-group/checkbox-group.component.js +218 -0
  466. package/development/checkbox/checkbox-group.d.ts +5 -0
  467. package/development/checkbox/checkbox-group.d.ts.map +1 -0
  468. package/development/checkbox/checkbox-group.js +5 -0
  469. package/development/checkbox/checkbox-panel/checkbox-panel.component.d.ts +27 -0
  470. package/development/checkbox/checkbox-panel/checkbox-panel.component.d.ts.map +1 -0
  471. package/development/checkbox/checkbox-panel/checkbox-panel.component.js +94 -0
  472. package/development/checkbox/checkbox-panel.d.ts +5 -0
  473. package/development/checkbox/checkbox-panel.d.ts.map +1 -0
  474. package/development/checkbox/checkbox-panel.js +5 -0
  475. package/development/checkbox/checkbox.d.ts +5 -0
  476. package/development/checkbox/checkbox.d.ts.map +1 -0
  477. package/development/checkbox/checkbox.js +5 -0
  478. package/development/checkbox/common/checkbox-common.d.ts +12 -0
  479. package/development/checkbox/common/checkbox-common.d.ts.map +1 -0
  480. package/development/checkbox/common/checkbox-common.js +73 -0
  481. package/development/checkbox/common.d.ts +5 -0
  482. package/development/checkbox/common.d.ts.map +1 -0
  483. package/development/checkbox/common.js +7 -0
  484. package/development/checkbox-common-D2-QcV8n.js +66 -0
  485. package/development/checkbox.d.ts +8 -0
  486. package/development/checkbox.d.ts.map +1 -0
  487. package/development/checkbox.js +13 -0
  488. package/development/chip/chip/chip.component.d.ts +30 -0
  489. package/development/chip/chip/chip.component.d.ts.map +1 -0
  490. package/development/chip/chip/chip.component.js +170 -0
  491. package/development/chip/chip-group/chip-group.component.d.ts +102 -0
  492. package/development/chip/chip-group/chip-group.component.d.ts.map +1 -0
  493. package/development/chip/chip-group/chip-group.component.js +424 -0
  494. package/development/chip/chip-group.d.ts +5 -0
  495. package/development/chip/chip-group.d.ts.map +1 -0
  496. package/development/chip/chip-group.js +5 -0
  497. package/development/chip/chip.d.ts +5 -0
  498. package/development/chip/chip.d.ts.map +1 -0
  499. package/development/chip/chip.js +5 -0
  500. package/development/chip-label/chip-label.component.d.ts +20 -0
  501. package/development/chip-label/chip-label.component.d.ts.map +1 -0
  502. package/development/chip-label/chip-label.component.js +137 -0
  503. package/development/chip-label.d.ts +5 -0
  504. package/development/chip-label.d.ts.map +1 -0
  505. package/development/chip-label.js +5 -0
  506. package/development/chip.d.ts +6 -0
  507. package/development/chip.d.ts.map +1 -0
  508. package/development/chip.js +7 -0
  509. package/development/clock/clock.component.d.ts +77 -0
  510. package/development/clock/clock.component.d.ts.map +1 -0
  511. package/development/clock/clock.component.js +369 -0
  512. package/development/clock.d.ts +5 -0
  513. package/development/clock.d.ts.map +1 -0
  514. package/development/clock.js +5 -0
  515. package/development/container/container/container.component.d.ts +27 -0
  516. package/development/container/container/container.component.d.ts.map +1 -0
  517. package/development/container/container/container.component.js +188 -0
  518. package/development/container/container.d.ts +5 -0
  519. package/development/container/container.d.ts.map +1 -0
  520. package/development/container/container.js +5 -0
  521. package/development/container/sticky-bar/sticky-bar.component.d.ts +58 -0
  522. package/development/container/sticky-bar/sticky-bar.component.d.ts.map +1 -0
  523. package/development/container/sticky-bar/sticky-bar.component.js +363 -0
  524. package/development/container/sticky-bar.d.ts +5 -0
  525. package/development/container/sticky-bar.d.ts.map +1 -0
  526. package/development/container/sticky-bar.js +5 -0
  527. package/development/container.d.ts +6 -0
  528. package/development/container.d.ts.map +1 -0
  529. package/development/container.js +7 -0
  530. package/development/core/a11y/arrow-navigation.d.ts +32 -0
  531. package/development/core/a11y/arrow-navigation.d.ts.map +1 -0
  532. package/development/core/a11y/arrow-navigation.js +43 -0
  533. package/development/core/a11y/fake-event-detection.d.ts +5 -0
  534. package/development/core/a11y/fake-event-detection.d.ts.map +1 -0
  535. package/development/core/a11y/fake-event-detection.js +12 -0
  536. package/development/core/a11y/focus-trap-controller.d.ts +35 -0
  537. package/development/core/a11y/focus-trap-controller.d.ts.map +1 -0
  538. package/development/core/a11y/focus-trap-controller.js +122 -0
  539. package/development/core/a11y/focus-visible-within-controller.d.ts +11 -0
  540. package/development/core/a11y/focus-visible-within-controller.d.ts.map +1 -0
  541. package/development/core/a11y/focus-visible-within-controller.js +26 -0
  542. package/development/core/a11y/focus.d.ts +2 -0
  543. package/development/core/a11y/focus.d.ts.map +1 -0
  544. package/development/core/a11y/focus.js +14 -0
  545. package/development/core/a11y/input-modality-detector.d.ts +58 -0
  546. package/development/core/a11y/input-modality-detector.d.ts.map +1 -0
  547. package/development/core/a11y/input-modality-detector.js +79 -0
  548. package/development/core/a11y/interactivity-checker.d.ts +52 -0
  549. package/development/core/a11y/interactivity-checker.d.ts.map +1 -0
  550. package/development/core/a11y/interactivity-checker.js +129 -0
  551. package/development/core/a11y/live-announcer.d.ts +62 -0
  552. package/development/core/a11y/live-announcer.d.ts.map +1 -0
  553. package/development/core/a11y/live-announcer.js +82 -0
  554. package/development/core/a11y.d.ts +12 -0
  555. package/development/core/a11y.d.ts.map +1 -0
  556. package/development/core/a11y.js +27 -0
  557. package/development/core/base-elements/action-base-element.d.ts +15 -0
  558. package/development/core/base-elements/action-base-element.d.ts.map +1 -0
  559. package/development/core/base-elements/action-base-element.js +44 -0
  560. package/development/core/base-elements/button-base-element.d.ts +66 -0
  561. package/development/core/base-elements/button-base-element.d.ts.map +1 -0
  562. package/development/core/base-elements/button-base-element.js +212 -0
  563. package/development/core/base-elements/link-base-element.d.ts +34 -0
  564. package/development/core/base-elements/link-base-element.d.ts.map +1 -0
  565. package/development/core/base-elements/link-base-element.js +173 -0
  566. package/development/core/base-elements/open-close-base-element.d.ts +41 -0
  567. package/development/core/base-elements/open-close-base-element.d.ts.map +1 -0
  568. package/development/core/base-elements/open-close-base-element.js +52 -0
  569. package/development/core/base-elements.d.ts +8 -0
  570. package/development/core/base-elements.d.ts.map +1 -0
  571. package/development/core/base-elements.js +12 -0
  572. package/development/core/config/config.d.ts +40 -0
  573. package/development/core/config/config.d.ts.map +1 -0
  574. package/development/core/config/config.js +15 -0
  575. package/development/core/config.d.ts +5 -0
  576. package/development/core/config.d.ts.map +1 -0
  577. package/development/core/config.js +6 -0
  578. package/development/core/controllers/escapable-overlay-controller.d.ts +14 -0
  579. package/development/core/controllers/escapable-overlay-controller.d.ts.map +1 -0
  580. package/development/core/controllers/escapable-overlay-controller.js +38 -0
  581. package/development/core/controllers/id-reference-controller.d.ts +21 -0
  582. package/development/core/controllers/id-reference-controller.d.ts.map +1 -0
  583. package/development/core/controllers/id-reference-controller.js +83 -0
  584. package/development/core/controllers/inert-controller.d.ts +27 -0
  585. package/development/core/controllers/inert-controller.d.ts.map +1 -0
  586. package/development/core/controllers/inert-controller.js +106 -0
  587. package/development/core/controllers/language-controller.d.ts +32 -0
  588. package/development/core/controllers/language-controller.d.ts.map +1 -0
  589. package/development/core/controllers/language-controller.js +69 -0
  590. package/development/core/controllers/media-matchers-controller.d.ts +65 -0
  591. package/development/core/controllers/media-matchers-controller.d.ts.map +1 -0
  592. package/development/core/controllers/media-matchers-controller.js +141 -0
  593. package/development/core/controllers/overlay-position-controller.d.ts +61 -0
  594. package/development/core/controllers/overlay-position-controller.d.ts.map +1 -0
  595. package/development/core/controllers/overlay-position-controller.js +287 -0
  596. package/development/core/controllers/property-watcher-controller.d.ts +16 -0
  597. package/development/core/controllers/property-watcher-controller.d.ts.map +1 -0
  598. package/development/core/controllers/property-watcher-controller.js +121 -0
  599. package/development/core/controllers/slot-state-controller.d.ts +45 -0
  600. package/development/core/controllers/slot-state-controller.d.ts.map +1 -0
  601. package/development/core/controllers/slot-state-controller.js +65 -0
  602. package/development/core/controllers.d.ts +12 -0
  603. package/development/core/controllers.d.ts.map +1 -0
  604. package/development/core/controllers.js +31 -0
  605. package/development/core/datetime/date-adapter.d.ts +181 -0
  606. package/development/core/datetime/date-adapter.d.ts.map +1 -0
  607. package/development/core/datetime/date-adapter.js +167 -0
  608. package/development/core/datetime/native-date-adapter.d.ts +68 -0
  609. package/development/core/datetime/native-date-adapter.d.ts.map +1 -0
  610. package/development/core/datetime/native-date-adapter.js +150 -0
  611. package/development/core/datetime/temporal-date-adapter.d.ts +73 -0
  612. package/development/core/datetime/temporal-date-adapter.d.ts.map +1 -0
  613. package/development/core/datetime/temporal-date-adapter.js +151 -0
  614. package/development/core/datetime.d.ts +7 -0
  615. package/development/core/datetime.d.ts.map +1 -0
  616. package/development/core/datetime.js +17 -0
  617. package/development/core/decorators/base.d.ts +14 -0
  618. package/development/core/decorators/base.d.ts.map +1 -0
  619. package/development/core/decorators/base.js +2 -0
  620. package/development/core/decorators/force-type.d.ts +8 -0
  621. package/development/core/decorators/force-type.d.ts.map +1 -0
  622. package/development/core/decorators/force-type.js +28 -0
  623. package/development/core/decorators/get-override.d.ts +7 -0
  624. package/development/core/decorators/get-override.d.ts.map +1 -0
  625. package/development/core/decorators/get-override.js +18 -0
  626. package/development/core/decorators/handle-distinct-change.d.ts +8 -0
  627. package/development/core/decorators/handle-distinct-change.d.ts.map +1 -0
  628. package/development/core/decorators/handle-distinct-change.js +22 -0
  629. package/development/core/decorators/host-attributes.d.ts +21 -0
  630. package/development/core/decorators/host-attributes.d.ts.map +1 -0
  631. package/development/core/decorators/host-attributes.js +30 -0
  632. package/development/core/decorators/id-reference.d.ts +11 -0
  633. package/development/core/decorators/id-reference.d.ts.map +1 -0
  634. package/development/core/decorators/id-reference.js +116 -0
  635. package/development/core/decorators/omit-empty-converter.d.ts +8 -0
  636. package/development/core/decorators/omit-empty-converter.d.ts.map +1 -0
  637. package/development/core/decorators/omit-empty-converter.js +10 -0
  638. package/development/core/decorators/plain-date.d.ts +23 -0
  639. package/development/core/decorators/plain-date.d.ts.map +1 -0
  640. package/development/core/decorators/plain-date.js +34 -0
  641. package/development/core/decorators.d.ts +11 -0
  642. package/development/core/decorators.d.ts.map +1 -0
  643. package/development/core/decorators.js +18 -0
  644. package/development/core/dom/animation.d.ts +2 -0
  645. package/development/core/dom/animation.d.ts.map +1 -0
  646. package/development/core/dom/animation.js +12 -0
  647. package/development/core/dom/contains-pierce-shadow-dom.d.ts +3 -0
  648. package/development/core/dom/contains-pierce-shadow-dom.d.ts.map +1 -0
  649. package/development/core/dom/contains-pierce-shadow-dom.js +14 -0
  650. package/development/core/dom/lean-context.d.ts +5 -0
  651. package/development/core/dom/lean-context.d.ts.map +1 -0
  652. package/development/core/dom/lean-context.js +8 -0
  653. package/development/core/dom/platform.d.ts +28 -0
  654. package/development/core/dom/platform.d.ts.map +1 -0
  655. package/development/core/dom/platform.js +32 -0
  656. package/development/core/dom/queue-dom-content-loaded.d.ts +5 -0
  657. package/development/core/dom/queue-dom-content-loaded.d.ts.map +1 -0
  658. package/development/core/dom/queue-dom-content-loaded.js +12 -0
  659. package/development/core/dom/scroll.d.ts +14 -0
  660. package/development/core/dom/scroll.d.ts.map +1 -0
  661. package/development/core/dom/scroll.js +37 -0
  662. package/development/core/dom/set-or-remove-attribute.d.ts +8 -0
  663. package/development/core/dom/set-or-remove-attribute.d.ts.map +1 -0
  664. package/development/core/dom/set-or-remove-attribute.js +11 -0
  665. package/development/core/dom.d.ts +11 -0
  666. package/development/core/dom.d.ts.map +1 -0
  667. package/development/core/dom.js +28 -0
  668. package/development/core/eventing/composed-path-has-attribute.d.ts +10 -0
  669. package/development/core/eventing/composed-path-has-attribute.d.ts.map +1 -0
  670. package/development/core/eventing/composed-path-has-attribute.js +12 -0
  671. package/development/core/eventing/event-target.d.ts +3 -0
  672. package/development/core/eventing/event-target.d.ts.map +1 -0
  673. package/development/core/eventing/event-target.js +7 -0
  674. package/development/core/eventing/form-element-handlers.d.ts +6 -0
  675. package/development/core/eventing/form-element-handlers.d.ts.map +1 -0
  676. package/development/core/eventing/form-element-handlers.js +9 -0
  677. package/development/core/eventing/forward-event.d.ts +6 -0
  678. package/development/core/eventing/forward-event.d.ts.map +1 -0
  679. package/development/core/eventing/forward-event.js +9 -0
  680. package/development/core/eventing/is-event-prevented.d.ts +3 -0
  681. package/development/core/eventing/is-event-prevented.d.ts.map +1 -0
  682. package/development/core/eventing/is-event-prevented.js +8 -0
  683. package/development/core/eventing/throttle.d.ts +2 -0
  684. package/development/core/eventing/throttle.d.ts.map +1 -0
  685. package/development/core/eventing/throttle.js +18 -0
  686. package/development/core/eventing.d.ts +10 -0
  687. package/development/core/eventing.d.ts.map +1 -0
  688. package/development/core/eventing.js +15 -0
  689. package/development/core/i18n/i18n.d.ts +103 -0
  690. package/development/core/i18n/i18n.d.ts.map +1 -0
  691. package/development/core/i18n/i18n.js +884 -0
  692. package/development/core/i18n.d.ts +5 -0
  693. package/development/core/i18n.d.ts.map +1 -0
  694. package/development/core/i18n.js +105 -0
  695. package/development/core/images.d.ts +7 -0
  696. package/development/core/images.d.ts.map +1 -0
  697. package/development/core/images.js +16 -0
  698. package/development/core/interfaces/overlay-close-details.d.ts +6 -0
  699. package/development/core/interfaces/overlay-close-details.d.ts.map +1 -0
  700. package/development/core/interfaces/paginator-page.d.ts +7 -0
  701. package/development/core/interfaces/paginator-page.d.ts.map +1 -0
  702. package/development/core/interfaces/types.d.ts +9 -0
  703. package/development/core/interfaces/types.d.ts.map +1 -0
  704. package/development/core/interfaces.d.ts +7 -0
  705. package/development/core/interfaces.d.ts.map +1 -0
  706. package/development/core/interfaces.js +2 -0
  707. package/development/core/mixins/animation-complete-mixin.d.ts +13 -0
  708. package/development/core/mixins/animation-complete-mixin.d.ts.map +1 -0
  709. package/development/core/mixins/animation-complete-mixin.js +52 -0
  710. package/development/core/mixins/constructor.d.ts +8 -0
  711. package/development/core/mixins/constructor.d.ts.map +1 -0
  712. package/development/core/mixins/constructor.js +2 -0
  713. package/development/core/mixins/disabled-mixin.d.ts +20 -0
  714. package/development/core/mixins/disabled-mixin.d.ts.map +1 -0
  715. package/development/core/mixins/disabled-mixin.js +107 -0
  716. package/development/core/mixins/element-internals-mixin.d.ts +49 -0
  717. package/development/core/mixins/element-internals-mixin.d.ts.map +1 -0
  718. package/development/core/mixins/element-internals-mixin.js +235 -0
  719. package/development/core/mixins/form-associated-checkbox-mixin.d.ts +20 -0
  720. package/development/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -0
  721. package/development/core/mixins/form-associated-checkbox-mixin.js +147 -0
  722. package/development/core/mixins/form-associated-input-mixin.d.ts +32 -0
  723. package/development/core/mixins/form-associated-input-mixin.d.ts.map +1 -0
  724. package/development/core/mixins/form-associated-input-mixin.js +319 -0
  725. package/development/core/mixins/form-associated-mixin.d.ts +53 -0
  726. package/development/core/mixins/form-associated-mixin.d.ts.map +1 -0
  727. package/development/core/mixins/form-associated-mixin.js +286 -0
  728. package/development/core/mixins/form-associated-radio-button-mixin.d.ts +28 -0
  729. package/development/core/mixins/form-associated-radio-button-mixin.d.ts.map +1 -0
  730. package/development/core/mixins/form-associated-radio-button-mixin.js +252 -0
  731. package/development/core/mixins/hydration-mixin.d.ts +23 -0
  732. package/development/core/mixins/hydration-mixin.d.ts.map +1 -0
  733. package/development/core/mixins/hydration-mixin.js +56 -0
  734. package/development/core/mixins/named-slot-list-mixin.d.ts +36 -0
  735. package/development/core/mixins/named-slot-list-mixin.d.ts.map +1 -0
  736. package/development/core/mixins/named-slot-list-mixin.js +133 -0
  737. package/development/core/mixins/negative-mixin.d.ts +10 -0
  738. package/development/core/mixins/negative-mixin.d.ts.map +1 -0
  739. package/development/core/mixins/negative-mixin.js +45 -0
  740. package/development/core/mixins/panel-mixin.d.ts +21 -0
  741. package/development/core/mixins/panel-mixin.d.ts.map +1 -0
  742. package/development/core/mixins/panel-mixin.js +98 -0
  743. package/development/core/mixins/readonly-mixin.d.ts +10 -0
  744. package/development/core/mixins/readonly-mixin.d.ts.map +1 -0
  745. package/development/core/mixins/readonly-mixin.js +46 -0
  746. package/development/core/mixins/required-mixin.d.ts +12 -0
  747. package/development/core/mixins/required-mixin.d.ts.map +1 -0
  748. package/development/core/mixins/required-mixin.js +48 -0
  749. package/development/core/mixins/selection-panel-mixin.d.ts +17 -0
  750. package/development/core/mixins/selection-panel-mixin.d.ts.map +1 -0
  751. package/development/core/mixins/selection-panel-mixin.js +56 -0
  752. package/development/core/mixins/update-scheduler-mixin.d.ts +13 -0
  753. package/development/core/mixins/update-scheduler-mixin.d.ts.map +1 -0
  754. package/development/core/mixins/update-scheduler-mixin.js +26 -0
  755. package/development/core/mixins.d.ts +20 -0
  756. package/development/core/mixins.d.ts.map +1 -0
  757. package/development/core/mixins.js +148 -0
  758. package/development/core/overlay/overlay-option-panel.d.ts +12 -0
  759. package/development/core/overlay/overlay-option-panel.d.ts.map +1 -0
  760. package/development/core/overlay/overlay-option-panel.js +29 -0
  761. package/development/core/overlay/overlay-outside-pointer-event-listener.d.ts +26 -0
  762. package/development/core/overlay/overlay-outside-pointer-event-listener.d.ts.map +1 -0
  763. package/development/core/overlay/overlay-outside-pointer-event-listener.js +61 -0
  764. package/development/core/overlay/overlay-trigger-attributes.d.ts +18 -0
  765. package/development/core/overlay/overlay-trigger-attributes.d.ts.map +1 -0
  766. package/development/core/overlay/overlay-trigger-attributes.js +47 -0
  767. package/development/core/overlay/overlay.d.ts +7 -0
  768. package/development/core/overlay/overlay.d.ts.map +1 -0
  769. package/development/core/overlay/overlay.js +15 -0
  770. package/development/core/overlay/position.d.ts +63 -0
  771. package/development/core/overlay/position.d.ts.map +1 -0
  772. package/development/core/overlay/position.js +125 -0
  773. package/development/core/overlay.d.ts +9 -0
  774. package/development/core/overlay.d.ts.map +1 -0
  775. package/development/core/overlay.js +20 -0
  776. package/development/core/styles.d.ts +4 -0
  777. package/development/core/styles.d.ts.map +1 -0
  778. package/development/core/styles.js +10 -0
  779. package/development/core/testing/event-spy.d.ts +22 -0
  780. package/development/core/testing/event-spy.d.ts.map +1 -0
  781. package/development/core/testing/event-spy.js +68 -0
  782. package/development/core/testing/mocha-extensions.d.ts +10 -0
  783. package/development/core/testing/mocha-extensions.d.ts.map +1 -0
  784. package/development/core/testing/mocha-extensions.js +15 -0
  785. package/development/core/testing/wait-for-condition.d.ts +2 -0
  786. package/development/core/testing/wait-for-condition.d.ts.map +1 -0
  787. package/development/core/testing/wait-for-condition.js +19 -0
  788. package/development/core/testing/wait-for-image-ready.d.ts +3 -0
  789. package/development/core/testing/wait-for-image-ready.d.ts.map +1 -0
  790. package/development/core/testing/wait-for-image-ready.js +30 -0
  791. package/development/core/testing/wait-for-render.d.ts +17 -0
  792. package/development/core/testing/wait-for-render.d.ts.map +1 -0
  793. package/development/core/testing/wait-for-render.js +20 -0
  794. package/development/core/testing.d.ts +9 -0
  795. package/development/core/testing.d.ts.map +1 -0
  796. package/development/core/testing.js +15 -0
  797. package/development/date-input/date-input.component.d.ts +88 -0
  798. package/development/date-input/date-input.component.d.ts.map +1 -0
  799. package/development/date-input/date-input.component.js +284 -0
  800. package/development/date-input.d.ts +5 -0
  801. package/development/date-input.d.ts.map +1 -0
  802. package/development/date-input.js +5 -0
  803. package/development/datepicker/common/datepicker-button.d.ts +42 -0
  804. package/development/datepicker/common/datepicker-button.d.ts.map +1 -0
  805. package/development/datepicker/common/datepicker-button.js +146 -0
  806. package/development/datepicker/common.d.ts +5 -0
  807. package/development/datepicker/common.d.ts.map +1 -0
  808. package/development/datepicker/common.js +8 -0
  809. package/development/datepicker/datepicker/datepicker.component.d.ts +41 -0
  810. package/development/datepicker/datepicker/datepicker.component.d.ts.map +1 -0
  811. package/development/datepicker/datepicker/datepicker.component.js +186 -0
  812. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts +19 -0
  813. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts.map +1 -0
  814. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.js +55 -0
  815. package/development/datepicker/datepicker-next-day.d.ts +5 -0
  816. package/development/datepicker/datepicker-next-day.d.ts.map +1 -0
  817. package/development/datepicker/datepicker-next-day.js +5 -0
  818. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts +19 -0
  819. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts.map +1 -0
  820. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.js +55 -0
  821. package/development/datepicker/datepicker-previous-day.d.ts +5 -0
  822. package/development/datepicker/datepicker-previous-day.d.ts.map +1 -0
  823. package/development/datepicker/datepicker-previous-day.js +5 -0
  824. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts +21 -0
  825. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts.map +1 -0
  826. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.js +80 -0
  827. package/development/datepicker/datepicker-toggle.d.ts +5 -0
  828. package/development/datepicker/datepicker-toggle.d.ts.map +1 -0
  829. package/development/datepicker/datepicker-toggle.js +5 -0
  830. package/development/datepicker/datepicker.d.ts +5 -0
  831. package/development/datepicker/datepicker.d.ts.map +1 -0
  832. package/development/datepicker/datepicker.js +5 -0
  833. package/development/datepicker-button-BDlxIp9r.js +9 -0
  834. package/development/datepicker.d.ts +9 -0
  835. package/development/datepicker.d.ts.map +1 -0
  836. package/development/datepicker.js +16 -0
  837. package/development/dialog/dialog/dialog.component.d.ts +51 -0
  838. package/development/dialog/dialog/dialog.component.d.ts.map +1 -0
  839. package/development/dialog/dialog/dialog.component.js +403 -0
  840. package/development/dialog/dialog-actions/dialog-actions.component.d.ts +17 -0
  841. package/development/dialog/dialog-actions/dialog-actions.component.d.ts.map +1 -0
  842. package/development/dialog/dialog-actions/dialog-actions.component.js +55 -0
  843. package/development/dialog/dialog-actions.d.ts +5 -0
  844. package/development/dialog/dialog-actions.d.ts.map +1 -0
  845. package/development/dialog/dialog-actions.js +5 -0
  846. package/development/dialog/dialog-close-button/dialog-close-button.component.d.ts +22 -0
  847. package/development/dialog/dialog-close-button/dialog-close-button.component.d.ts.map +1 -0
  848. package/development/dialog/dialog-close-button/dialog-close-button.component.js +49 -0
  849. package/development/dialog/dialog-close-button.d.ts +5 -0
  850. package/development/dialog/dialog-close-button.d.ts.map +1 -0
  851. package/development/dialog/dialog-close-button.js +5 -0
  852. package/development/dialog/dialog-content/dialog-content.component.d.ts +17 -0
  853. package/development/dialog/dialog-content/dialog-content.component.d.ts.map +1 -0
  854. package/development/dialog/dialog-content/dialog-content.component.js +43 -0
  855. package/development/dialog/dialog-content.d.ts +5 -0
  856. package/development/dialog/dialog-content.d.ts.map +1 -0
  857. package/development/dialog/dialog-content.js +5 -0
  858. package/development/dialog/dialog-title/dialog-title.component.d.ts +19 -0
  859. package/development/dialog/dialog-title/dialog-title.component.d.ts.map +1 -0
  860. package/development/dialog/dialog-title/dialog-title.component.js +52 -0
  861. package/development/dialog/dialog-title.d.ts +5 -0
  862. package/development/dialog/dialog-title.d.ts.map +1 -0
  863. package/development/dialog/dialog-title.js +5 -0
  864. package/development/dialog/dialog.d.ts +5 -0
  865. package/development/dialog/dialog.d.ts.map +1 -0
  866. package/development/dialog/dialog.js +8 -0
  867. package/development/dialog.d.ts +9 -0
  868. package/development/dialog.d.ts.map +1 -0
  869. package/development/dialog.js +16 -0
  870. package/development/divider/divider.component.d.ts +21 -0
  871. package/development/divider/divider.component.d.ts.map +1 -0
  872. package/development/divider/divider.component.js +79 -0
  873. package/development/divider.d.ts +5 -0
  874. package/development/divider.d.ts.map +1 -0
  875. package/development/divider.js +5 -0
  876. package/development/expansion-panel/expansion-panel/expansion-panel.component.d.ts +64 -0
  877. package/development/expansion-panel/expansion-panel/expansion-panel.component.d.ts.map +1 -0
  878. package/development/expansion-panel/expansion-panel/expansion-panel.component.js +423 -0
  879. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.d.ts +22 -0
  880. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.d.ts.map +1 -0
  881. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +82 -0
  882. package/development/expansion-panel/expansion-panel-content.d.ts +5 -0
  883. package/development/expansion-panel/expansion-panel-content.d.ts.map +1 -0
  884. package/development/expansion-panel/expansion-panel-content.js +5 -0
  885. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts +36 -0
  886. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts.map +1 -0
  887. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +182 -0
  888. package/development/expansion-panel/expansion-panel-header.d.ts +5 -0
  889. package/development/expansion-panel/expansion-panel-header.d.ts.map +1 -0
  890. package/development/expansion-panel/expansion-panel-header.js +5 -0
  891. package/development/expansion-panel/expansion-panel.d.ts +5 -0
  892. package/development/expansion-panel/expansion-panel.d.ts.map +1 -0
  893. package/development/expansion-panel/expansion-panel.js +5 -0
  894. package/development/expansion-panel.d.ts +7 -0
  895. package/development/expansion-panel.d.ts.map +1 -0
  896. package/development/expansion-panel.js +9 -0
  897. package/development/file-selector/common/file-selector-common.d.ts +25 -0
  898. package/development/file-selector/common/file-selector-common.d.ts.map +1 -0
  899. package/development/file-selector/common/file-selector-common.js +332 -0
  900. package/development/file-selector/common.d.ts +5 -0
  901. package/development/file-selector/common.d.ts.map +1 -0
  902. package/development/file-selector/common.js +7 -0
  903. package/development/file-selector/file-selector/file-selector.component.d.ts +21 -0
  904. package/development/file-selector/file-selector/file-selector.component.d.ts.map +1 -0
  905. package/development/file-selector/file-selector/file-selector.component.js +47 -0
  906. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts +23 -0
  907. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts.map +1 -0
  908. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +132 -0
  909. package/development/file-selector/file-selector-dropzone.d.ts +5 -0
  910. package/development/file-selector/file-selector-dropzone.d.ts.map +1 -0
  911. package/development/file-selector/file-selector-dropzone.js +5 -0
  912. package/development/file-selector/file-selector.d.ts +5 -0
  913. package/development/file-selector/file-selector.d.ts.map +1 -0
  914. package/development/file-selector/file-selector.js +5 -0
  915. package/development/file-selector-common-B-9Eiig3.js +102 -0
  916. package/development/file-selector.d.ts +7 -0
  917. package/development/file-selector.d.ts.map +1 -0
  918. package/development/file-selector.js +11 -0
  919. package/development/flip-card/flip-card/flip-card.component.d.ts +47 -0
  920. package/development/flip-card/flip-card/flip-card.component.d.ts.map +1 -0
  921. package/development/flip-card/flip-card/flip-card.component.js +322 -0
  922. package/development/flip-card/flip-card-details/flip-card-details.component.d.ts +21 -0
  923. package/development/flip-card/flip-card-details/flip-card-details.component.d.ts.map +1 -0
  924. package/development/flip-card/flip-card-details/flip-card-details.component.js +88 -0
  925. package/development/flip-card/flip-card-details.d.ts +5 -0
  926. package/development/flip-card/flip-card-details.d.ts.map +1 -0
  927. package/development/flip-card/flip-card-details.js +5 -0
  928. package/development/flip-card/flip-card-summary/flip-card-summary.component.d.ts +21 -0
  929. package/development/flip-card/flip-card-summary/flip-card-summary.component.d.ts.map +1 -0
  930. package/development/flip-card/flip-card-summary/flip-card-summary.component.js +137 -0
  931. package/development/flip-card/flip-card-summary.d.ts +5 -0
  932. package/development/flip-card/flip-card-summary.d.ts.map +1 -0
  933. package/development/flip-card/flip-card-summary.js +5 -0
  934. package/development/flip-card/flip-card.d.ts +5 -0
  935. package/development/flip-card/flip-card.d.ts.map +1 -0
  936. package/development/flip-card/flip-card.js +5 -0
  937. package/development/flip-card.d.ts +7 -0
  938. package/development/flip-card.d.ts.map +1 -0
  939. package/development/flip-card.js +9 -0
  940. package/development/footer/footer.component.d.ts +34 -0
  941. package/development/footer/footer.component.d.ts.map +1 -0
  942. package/development/footer/footer.component.js +272 -0
  943. package/development/footer.d.ts +5 -0
  944. package/development/footer.d.ts.map +1 -0
  945. package/development/footer.js +5 -0
  946. package/development/form-field/error/error.component.d.ts +20 -0
  947. package/development/form-field/error/error.component.d.ts.map +1 -0
  948. package/development/form-field/error/error.component.js +101 -0
  949. package/development/form-field/error.d.ts +5 -0
  950. package/development/form-field/error.d.ts.map +1 -0
  951. package/development/form-field/error.js +5 -0
  952. package/development/form-field/form-field/form-field.component.d.ts +125 -0
  953. package/development/form-field/form-field/form-field.component.d.ts.map +1 -0
  954. package/development/form-field/form-field/form-field.component.js +922 -0
  955. package/development/form-field/form-field-clear/form-field-clear.component.d.ts +23 -0
  956. package/development/form-field/form-field-clear/form-field-clear.component.d.ts.map +1 -0
  957. package/development/form-field/form-field-clear/form-field-clear.component.js +60 -0
  958. package/development/form-field/form-field-clear.d.ts +5 -0
  959. package/development/form-field/form-field-clear.d.ts.map +1 -0
  960. package/development/form-field/form-field-clear.js +5 -0
  961. package/development/form-field/form-field.d.ts +5 -0
  962. package/development/form-field/form-field.d.ts.map +1 -0
  963. package/development/form-field/form-field.js +6 -0
  964. package/development/form-field.d.ts +7 -0
  965. package/development/form-field.d.ts.map +1 -0
  966. package/development/form-field.js +10 -0
  967. package/development/header/common/header-action-common.d.ts +10 -0
  968. package/development/header/common/header-action-common.d.ts.map +1 -0
  969. package/development/header/common/header-action-common.js +350 -0
  970. package/development/header/common.d.ts +5 -0
  971. package/development/header/common.d.ts.map +1 -0
  972. package/development/header/common.js +5 -0
  973. package/development/header/header/header.component.d.ts +65 -0
  974. package/development/header/header/header.component.d.ts.map +1 -0
  975. package/development/header/header/header.component.js +392 -0
  976. package/development/header/header-button/header-button.component.d.ts +17 -0
  977. package/development/header/header-button/header-button.component.d.ts.map +1 -0
  978. package/development/header/header-button/header-button.component.js +25 -0
  979. package/development/header/header-button.d.ts +5 -0
  980. package/development/header/header-button.d.ts.map +1 -0
  981. package/development/header/header-button.js +5 -0
  982. package/development/header/header-environment/header-environment.component.d.ts +24 -0
  983. package/development/header/header-environment/header-environment.component.d.ts.map +1 -0
  984. package/development/header/header-environment/header-environment.component.js +109 -0
  985. package/development/header/header-environment.d.ts +5 -0
  986. package/development/header/header-environment.d.ts.map +1 -0
  987. package/development/header/header-environment.js +5 -0
  988. package/development/header/header-link/header-link.component.d.ts +17 -0
  989. package/development/header/header-link/header-link.component.d.ts.map +1 -0
  990. package/development/header/header-link/header-link.component.js +25 -0
  991. package/development/header/header-link.d.ts +5 -0
  992. package/development/header/header-link.d.ts.map +1 -0
  993. package/development/header/header-link.js +5 -0
  994. package/development/header/header.d.ts +5 -0
  995. package/development/header/header.d.ts.map +1 -0
  996. package/development/header/header.js +5 -0
  997. package/development/header.d.ts +8 -0
  998. package/development/header.d.ts.map +1 -0
  999. package/development/header.js +11 -0
  1000. package/development/icon/icon-base.d.ts +29 -0
  1001. package/development/icon/icon-base.d.ts.map +1 -0
  1002. package/development/icon/icon-base.js +174 -0
  1003. package/development/icon/icon-name-mixin.d.ts +12 -0
  1004. package/development/icon/icon-name-mixin.d.ts.map +1 -0
  1005. package/development/icon/icon-name-mixin.js +67 -0
  1006. package/development/icon/icon-request.d.ts +3 -0
  1007. package/development/icon/icon-request.d.ts.map +1 -0
  1008. package/development/icon/icon-request.js +41 -0
  1009. package/development/icon/icon-validate.d.ts +12 -0
  1010. package/development/icon/icon-validate.d.ts.map +1 -0
  1011. package/development/icon/icon-validate.js +47 -0
  1012. package/development/icon/icon.component.d.ts +36 -0
  1013. package/development/icon/icon.component.d.ts.map +1 -0
  1014. package/development/icon/icon.component.js +107 -0
  1015. package/development/icon-sidebar/icon-sidebar/icon-sidebar.component.d.ts +25 -0
  1016. package/development/icon-sidebar/icon-sidebar/icon-sidebar.component.d.ts.map +1 -0
  1017. package/development/icon-sidebar/icon-sidebar/icon-sidebar.component.js +78 -0
  1018. package/development/icon-sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts +22 -0
  1019. package/development/icon-sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -0
  1020. package/development/icon-sidebar/icon-sidebar-button/icon-sidebar-button.component.js +33 -0
  1021. package/development/icon-sidebar/icon-sidebar-button.d.ts +5 -0
  1022. package/development/icon-sidebar/icon-sidebar-button.d.ts.map +1 -0
  1023. package/development/icon-sidebar/icon-sidebar-button.js +5 -0
  1024. package/development/icon-sidebar/icon-sidebar-container/icon-sidebar-container.component.d.ts +23 -0
  1025. package/development/icon-sidebar/icon-sidebar-container/icon-sidebar-container.component.d.ts.map +1 -0
  1026. package/development/icon-sidebar/icon-sidebar-container/icon-sidebar-container.component.js +42 -0
  1027. package/development/icon-sidebar/icon-sidebar-container.d.ts +5 -0
  1028. package/development/icon-sidebar/icon-sidebar-container.d.ts.map +1 -0
  1029. package/development/icon-sidebar/icon-sidebar-container.js +5 -0
  1030. package/development/icon-sidebar/icon-sidebar-content/icon-sidebar-content.component.d.ts +17 -0
  1031. package/development/icon-sidebar/icon-sidebar-content/icon-sidebar-content.component.d.ts.map +1 -0
  1032. package/development/icon-sidebar/icon-sidebar-content/icon-sidebar-content.component.js +34 -0
  1033. package/development/icon-sidebar/icon-sidebar-content.d.ts +5 -0
  1034. package/development/icon-sidebar/icon-sidebar-content.d.ts.map +1 -0
  1035. package/development/icon-sidebar/icon-sidebar-content.js +5 -0
  1036. package/development/icon-sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts +22 -0
  1037. package/development/icon-sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts.map +1 -0
  1038. package/development/icon-sidebar/icon-sidebar-link/icon-sidebar-link.component.js +33 -0
  1039. package/development/icon-sidebar/icon-sidebar-link.d.ts +5 -0
  1040. package/development/icon-sidebar/icon-sidebar-link.d.ts.map +1 -0
  1041. package/development/icon-sidebar/icon-sidebar-link.js +5 -0
  1042. package/development/icon-sidebar/icon-sidebar.d.ts +5 -0
  1043. package/development/icon-sidebar/icon-sidebar.d.ts.map +1 -0
  1044. package/development/icon-sidebar/icon-sidebar.js +5 -0
  1045. package/development/icon-sidebar-button-common-DR6eQvkq.js +93 -0
  1046. package/development/icon-sidebar.d.ts +9 -0
  1047. package/development/icon-sidebar.d.ts.map +1 -0
  1048. package/development/icon-sidebar.js +13 -0
  1049. package/development/icon.d.ts +9 -0
  1050. package/development/icon.d.ts.map +1 -0
  1051. package/development/icon.js +14 -0
  1052. package/development/image/image.component.d.ts +214 -0
  1053. package/development/image/image.component.d.ts.map +1 -0
  1054. package/development/image/image.component.js +655 -0
  1055. package/development/image.d.ts +5 -0
  1056. package/development/image.d.ts.map +1 -0
  1057. package/development/image.js +5 -0
  1058. package/development/journey-header/journey-header.component.d.ts +32 -0
  1059. package/development/journey-header/journey-header.component.d.ts.map +1 -0
  1060. package/development/journey-header/journey-header.component.js +162 -0
  1061. package/development/journey-header.d.ts +5 -0
  1062. package/development/journey-header.d.ts.map +1 -0
  1063. package/development/journey-header.js +5 -0
  1064. package/development/lead-container/lead-container.component.d.ts +21 -0
  1065. package/development/lead-container/lead-container.component.d.ts.map +1 -0
  1066. package/development/lead-container/lead-container.component.js +140 -0
  1067. package/development/lead-container.d.ts +5 -0
  1068. package/development/lead-container.d.ts.map +1 -0
  1069. package/development/lead-container.js +5 -0
  1070. package/development/link/block-link/block-link.component.d.ts +17 -0
  1071. package/development/link/block-link/block-link.component.d.ts.map +1 -0
  1072. package/development/link/block-link/block-link.component.js +26 -0
  1073. package/development/link/block-link-button/block-link-button.component.d.ts +17 -0
  1074. package/development/link/block-link-button/block-link-button.component.d.ts.map +1 -0
  1075. package/development/link/block-link-button/block-link-button.component.js +26 -0
  1076. package/development/link/block-link-button.d.ts +5 -0
  1077. package/development/link/block-link-button.d.ts.map +1 -0
  1078. package/development/link/block-link-button.js +5 -0
  1079. package/development/link/block-link-static/block-link-static.component.d.ts +17 -0
  1080. package/development/link/block-link-static/block-link-static.component.d.ts.map +1 -0
  1081. package/development/link/block-link-static/block-link-static.component.js +26 -0
  1082. package/development/link/block-link-static.d.ts +5 -0
  1083. package/development/link/block-link-static.d.ts.map +1 -0
  1084. package/development/link/block-link-static.js +5 -0
  1085. package/development/link/block-link.d.ts +5 -0
  1086. package/development/link/block-link.d.ts.map +1 -0
  1087. package/development/link/block-link.js +5 -0
  1088. package/development/link/common/block-link-common.d.ts +10 -0
  1089. package/development/link/common/block-link-common.d.ts.map +1 -0
  1090. package/development/link/common/block-link-common.js +135 -0
  1091. package/development/link/common/inline-link-common.d.ts +8 -0
  1092. package/development/link/common/inline-link-common.d.ts.map +1 -0
  1093. package/development/link/common/inline-link-common.js +44 -0
  1094. package/development/link/common/link-common.d.ts +10 -0
  1095. package/development/link/common/link-common.d.ts.map +1 -0
  1096. package/development/link/common/link-common.js +10 -0
  1097. package/development/link/common.d.ts +7 -0
  1098. package/development/link/common.d.ts.map +1 -0
  1099. package/development/link/common.js +9 -0
  1100. package/development/link/link/link.component.d.ts +16 -0
  1101. package/development/link/link/link.component.d.ts.map +1 -0
  1102. package/development/link/link/link.component.js +26 -0
  1103. package/development/link/link-button/link-button.component.d.ts +16 -0
  1104. package/development/link/link-button/link-button.component.d.ts.map +1 -0
  1105. package/development/link/link-button/link-button.component.js +26 -0
  1106. package/development/link/link-button.d.ts +5 -0
  1107. package/development/link/link-button.d.ts.map +1 -0
  1108. package/development/link/link-button.js +5 -0
  1109. package/development/link/link-static/link-static.component.d.ts +16 -0
  1110. package/development/link/link-static/link-static.component.d.ts.map +1 -0
  1111. package/development/link/link-static/link-static.component.js +26 -0
  1112. package/development/link/link-static.d.ts +5 -0
  1113. package/development/link/link-static.d.ts.map +1 -0
  1114. package/development/link/link-static.js +5 -0
  1115. package/development/link/link.d.ts +5 -0
  1116. package/development/link/link.d.ts.map +1 -0
  1117. package/development/link/link.js +5 -0
  1118. package/development/link-common-d27fHmQw.js +111 -0
  1119. package/development/link-list/common/link-list-base.d.ts +28 -0
  1120. package/development/link-list/common/link-list-base.d.ts.map +1 -0
  1121. package/development/link-list/common/link-list-base.js +113 -0
  1122. package/development/link-list/common.d.ts +5 -0
  1123. package/development/link-list/common.d.ts.map +1 -0
  1124. package/development/link-list/common.js +7 -0
  1125. package/development/link-list/link-list/link-list.component.d.ts +22 -0
  1126. package/development/link-list/link-list/link-list.component.d.ts.map +1 -0
  1127. package/development/link-list/link-list/link-list.component.js +159 -0
  1128. package/development/link-list/link-list-anchor/link-list-anchor.component.d.ts +17 -0
  1129. package/development/link-list/link-list-anchor/link-list-anchor.component.d.ts.map +1 -0
  1130. package/development/link-list/link-list-anchor/link-list-anchor.component.js +74 -0
  1131. package/development/link-list/link-list-anchor.d.ts +5 -0
  1132. package/development/link-list/link-list-anchor.d.ts.map +1 -0
  1133. package/development/link-list/link-list-anchor.js +5 -0
  1134. package/development/link-list/link-list.d.ts +5 -0
  1135. package/development/link-list/link-list.d.ts.map +1 -0
  1136. package/development/link-list/link-list.js +5 -0
  1137. package/development/link-list-base-CJJ3qdD7.js +21 -0
  1138. package/development/link-list.d.ts +7 -0
  1139. package/development/link-list.d.ts.map +1 -0
  1140. package/development/link-list.js +11 -0
  1141. package/development/link.d.ts +11 -0
  1142. package/development/link.d.ts.map +1 -0
  1143. package/development/link.js +21 -0
  1144. package/development/loading-indicator/loading-indicator.component.d.ts +22 -0
  1145. package/development/loading-indicator/loading-indicator.component.d.ts.map +1 -0
  1146. package/development/loading-indicator/loading-indicator.component.js +255 -0
  1147. package/development/loading-indicator-circle/loading-indicator-circle.component.d.ts +20 -0
  1148. package/development/loading-indicator-circle/loading-indicator-circle.component.d.ts.map +1 -0
  1149. package/development/loading-indicator-circle/loading-indicator-circle.component.js +142 -0
  1150. package/development/loading-indicator-circle.d.ts +5 -0
  1151. package/development/loading-indicator-circle.d.ts.map +1 -0
  1152. package/development/loading-indicator-circle.js +5 -0
  1153. package/development/loading-indicator.d.ts +5 -0
  1154. package/development/loading-indicator.d.ts.map +1 -0
  1155. package/development/loading-indicator.js +5 -0
  1156. package/development/logo/logo.component.d.ts +23 -0
  1157. package/development/logo/logo.component.d.ts.map +1 -0
  1158. package/development/logo/logo.component.js +152 -0
  1159. package/development/logo.d.ts +5 -0
  1160. package/development/logo.d.ts.map +1 -0
  1161. package/development/logo.js +5 -0
  1162. package/development/map-container/map-container.component.d.ts +47 -0
  1163. package/development/map-container/map-container.component.d.ts.map +1 -0
  1164. package/development/map-container/map-container.component.js +288 -0
  1165. package/development/map-container.d.ts +5 -0
  1166. package/development/map-container.d.ts.map +1 -0
  1167. package/development/map-container.js +5 -0
  1168. package/development/menu/common/menu-action-common.d.ts +8 -0
  1169. package/development/menu/common/menu-action-common.d.ts.map +1 -0
  1170. package/development/menu/common/menu-action-common.js +144 -0
  1171. package/development/menu/common.d.ts +5 -0
  1172. package/development/menu/common.d.ts.map +1 -0
  1173. package/development/menu/common.js +5 -0
  1174. package/development/menu/menu/menu.component.d.ts +79 -0
  1175. package/development/menu/menu/menu.component.d.ts.map +1 -0
  1176. package/development/menu/menu/menu.component.js +689 -0
  1177. package/development/menu/menu-button/menu-button.component.d.ts +20 -0
  1178. package/development/menu/menu-button/menu-button.component.d.ts.map +1 -0
  1179. package/development/menu/menu-button/menu-button.component.js +25 -0
  1180. package/development/menu/menu-button.d.ts +5 -0
  1181. package/development/menu/menu-button.d.ts.map +1 -0
  1182. package/development/menu/menu-button.js +5 -0
  1183. package/development/menu/menu-link/menu-link.component.d.ts +20 -0
  1184. package/development/menu/menu-link/menu-link.component.d.ts.map +1 -0
  1185. package/development/menu/menu-link/menu-link.component.js +30 -0
  1186. package/development/menu/menu-link.d.ts +5 -0
  1187. package/development/menu/menu-link.d.ts.map +1 -0
  1188. package/development/menu/menu-link.js +5 -0
  1189. package/development/menu/menu.d.ts +5 -0
  1190. package/development/menu/menu.d.ts.map +1 -0
  1191. package/development/menu/menu.js +5 -0
  1192. package/development/menu.d.ts +8 -0
  1193. package/development/menu.d.ts.map +1 -0
  1194. package/development/menu.js +11 -0
  1195. package/development/message/message.component.d.ts +21 -0
  1196. package/development/message/message.component.d.ts.map +1 -0
  1197. package/development/message/message.component.js +94 -0
  1198. package/development/message.d.ts +5 -0
  1199. package/development/message.d.ts.map +1 -0
  1200. package/development/message.js +5 -0
  1201. package/development/mini-button-label-common-BaMSfSTe.js +558 -0
  1202. package/development/mini-calendar/mini-calendar/mini-calendar.component.d.ts +35 -0
  1203. package/development/mini-calendar/mini-calendar/mini-calendar.component.d.ts.map +1 -0
  1204. package/development/mini-calendar/mini-calendar/mini-calendar.component.js +194 -0
  1205. package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts +23 -0
  1206. package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts.map +1 -0
  1207. package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +175 -0
  1208. package/development/mini-calendar/mini-calendar-day.d.ts +5 -0
  1209. package/development/mini-calendar/mini-calendar-day.d.ts.map +1 -0
  1210. package/development/mini-calendar/mini-calendar-day.js +5 -0
  1211. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts +25 -0
  1212. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts.map +1 -0
  1213. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +118 -0
  1214. package/development/mini-calendar/mini-calendar-month.d.ts +5 -0
  1215. package/development/mini-calendar/mini-calendar-month.d.ts.map +1 -0
  1216. package/development/mini-calendar/mini-calendar-month.js +5 -0
  1217. package/development/mini-calendar/mini-calendar.d.ts +5 -0
  1218. package/development/mini-calendar/mini-calendar.d.ts.map +1 -0
  1219. package/development/mini-calendar/mini-calendar.js +5 -0
  1220. package/development/mini-calendar.d.ts +7 -0
  1221. package/development/mini-calendar.d.ts.map +1 -0
  1222. package/development/mini-calendar.js +9 -0
  1223. package/development/navigation/common/navigation-action-common.d.ts +13 -0
  1224. package/development/navigation/common/navigation-action-common.d.ts.map +1 -0
  1225. package/development/navigation/common/navigation-action-common.js +165 -0
  1226. package/development/navigation/common.d.ts +5 -0
  1227. package/development/navigation/common.d.ts.map +1 -0
  1228. package/development/navigation/common.js +5 -0
  1229. package/development/navigation/navigation/navigation.component.d.ts +73 -0
  1230. package/development/navigation/navigation/navigation.component.d.ts.map +1 -0
  1231. package/development/navigation/navigation/navigation.component.js +578 -0
  1232. package/development/navigation/navigation-button/navigation-button.component.d.ts +16 -0
  1233. package/development/navigation/navigation-button/navigation-button.component.d.ts.map +1 -0
  1234. package/development/navigation/navigation-button/navigation-button.component.js +25 -0
  1235. package/development/navigation/navigation-button.d.ts +5 -0
  1236. package/development/navigation/navigation-button.d.ts.map +1 -0
  1237. package/development/navigation/navigation-button.js +5 -0
  1238. package/development/navigation/navigation-link/navigation-link.component.d.ts +16 -0
  1239. package/development/navigation/navigation-link/navigation-link.component.d.ts.map +1 -0
  1240. package/development/navigation/navigation-link/navigation-link.component.js +25 -0
  1241. package/development/navigation/navigation-link.d.ts +5 -0
  1242. package/development/navigation/navigation-link.d.ts.map +1 -0
  1243. package/development/navigation/navigation-link.js +5 -0
  1244. package/development/navigation/navigation-list/navigation-list.component.d.ts +28 -0
  1245. package/development/navigation/navigation-list/navigation-list.component.d.ts.map +1 -0
  1246. package/development/navigation/navigation-list/navigation-list.component.js +108 -0
  1247. package/development/navigation/navigation-list.d.ts +5 -0
  1248. package/development/navigation/navigation-list.d.ts.map +1 -0
  1249. package/development/navigation/navigation-list.js +5 -0
  1250. package/development/navigation/navigation-marker/navigation-marker.component.d.ts +37 -0
  1251. package/development/navigation/navigation-marker/navigation-marker.component.d.ts.map +1 -0
  1252. package/development/navigation/navigation-marker/navigation-marker.component.js +205 -0
  1253. package/development/navigation/navigation-marker.d.ts +5 -0
  1254. package/development/navigation/navigation-marker.d.ts.map +1 -0
  1255. package/development/navigation/navigation-marker.js +5 -0
  1256. package/development/navigation/navigation-section/navigation-section.component.d.ts +77 -0
  1257. package/development/navigation/navigation-section/navigation-section.component.d.ts.map +1 -0
  1258. package/development/navigation/navigation-section/navigation-section.component.js +595 -0
  1259. package/development/navigation/navigation-section.d.ts +5 -0
  1260. package/development/navigation/navigation-section.d.ts.map +1 -0
  1261. package/development/navigation/navigation-section.js +5 -0
  1262. package/development/navigation/navigation.d.ts +5 -0
  1263. package/development/navigation/navigation.d.ts.map +1 -0
  1264. package/development/navigation/navigation.js +5 -0
  1265. package/development/navigation.d.ts +11 -0
  1266. package/development/navigation.d.ts.map +1 -0
  1267. package/development/navigation.js +17 -0
  1268. package/development/notification/notification.component.d.ts +60 -0
  1269. package/development/notification/notification.component.d.ts.map +1 -0
  1270. package/development/notification/notification.component.js +502 -0
  1271. package/development/notification.d.ts +5 -0
  1272. package/development/notification.d.ts.map +1 -0
  1273. package/development/notification.js +5 -0
  1274. package/development/option/optgroup/optgroup-base-element.d.ts +22 -0
  1275. package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -0
  1276. package/development/option/optgroup/optgroup-base-element.js +167 -0
  1277. package/development/option/optgroup/optgroup.component.d.ts +21 -0
  1278. package/development/option/optgroup/optgroup.component.d.ts.map +1 -0
  1279. package/development/option/optgroup/optgroup.component.js +54 -0
  1280. package/development/option/optgroup.d.ts +6 -0
  1281. package/development/option/optgroup.d.ts.map +1 -0
  1282. package/development/option/optgroup.js +7 -0
  1283. package/development/option/option/option-base-element.d.ts +63 -0
  1284. package/development/option/option/option-base-element.d.ts.map +1 -0
  1285. package/development/option/option/option-base-element.js +300 -0
  1286. package/development/option/option/option.component.d.ts +45 -0
  1287. package/development/option/option/option.component.d.ts.map +1 -0
  1288. package/development/option/option/option.component.js +276 -0
  1289. package/development/option/option-hint/option-hint.component.d.ts +18 -0
  1290. package/development/option/option-hint/option-hint.component.d.ts.map +1 -0
  1291. package/development/option/option-hint/option-hint.component.js +71 -0
  1292. package/development/option/option-hint.d.ts +5 -0
  1293. package/development/option/option-hint.d.ts.map +1 -0
  1294. package/development/option/option-hint.js +5 -0
  1295. package/development/option/option.d.ts +6 -0
  1296. package/development/option/option.d.ts.map +1 -0
  1297. package/development/option/option.js +7 -0
  1298. package/development/option.d.ts +7 -0
  1299. package/development/option.d.ts.map +1 -0
  1300. package/development/option.js +13 -0
  1301. package/development/overlay/overlay-base-element.d.ts +93 -0
  1302. package/development/overlay/overlay-base-element.d.ts.map +1 -0
  1303. package/development/overlay/overlay-base-element.js +256 -0
  1304. package/development/overlay/overlay.component.d.ts +43 -0
  1305. package/development/overlay/overlay.component.d.ts.map +1 -0
  1306. package/development/overlay/overlay.component.js +381 -0
  1307. package/development/overlay.d.ts +6 -0
  1308. package/development/overlay.d.ts.map +1 -0
  1309. package/development/overlay.js +10 -0
  1310. package/development/paginator/common/paginator-common.d.ts +35 -0
  1311. package/development/paginator/common/paginator-common.d.ts.map +1 -0
  1312. package/development/paginator/common/paginator-common.js +300 -0
  1313. package/development/paginator/common.d.ts +5 -0
  1314. package/development/paginator/common.d.ts.map +1 -0
  1315. package/development/paginator/common.js +5 -0
  1316. package/development/paginator/compact-paginator/compact-paginator.component.d.ts +18 -0
  1317. package/development/paginator/compact-paginator/compact-paginator.component.d.ts.map +1 -0
  1318. package/development/paginator/compact-paginator/compact-paginator.component.js +98 -0
  1319. package/development/paginator/compact-paginator.d.ts +5 -0
  1320. package/development/paginator/compact-paginator.d.ts.map +1 -0
  1321. package/development/paginator/compact-paginator.js +5 -0
  1322. package/development/paginator/paginator/paginator.component.d.ts +45 -0
  1323. package/development/paginator/paginator/paginator.component.d.ts.map +1 -0
  1324. package/development/paginator/paginator/paginator.component.js +450 -0
  1325. package/development/paginator/paginator.d.ts +5 -0
  1326. package/development/paginator/paginator.d.ts.map +1 -0
  1327. package/development/paginator/paginator.js +5 -0
  1328. package/development/paginator.d.ts +7 -0
  1329. package/development/paginator.d.ts.map +1 -0
  1330. package/development/paginator.js +9 -0
  1331. package/development/popover/popover.component.d.ts +109 -0
  1332. package/development/popover/popover.component.d.ts.map +1 -0
  1333. package/development/popover/popover.component.js +726 -0
  1334. package/development/popover.d.ts +5 -0
  1335. package/development/popover.d.ts.map +1 -0
  1336. package/development/popover.js +6 -0
  1337. package/development/radio-button/common/radio-button-common.d.ts +14 -0
  1338. package/development/radio-button/common/radio-button-common.d.ts.map +1 -0
  1339. package/development/radio-button/common/radio-button-common.js +89 -0
  1340. package/development/radio-button/common.d.ts +5 -0
  1341. package/development/radio-button/common.d.ts.map +1 -0
  1342. package/development/radio-button/common.js +7 -0
  1343. package/development/radio-button/radio-button/radio-button.component.d.ts +35 -0
  1344. package/development/radio-button/radio-button/radio-button.component.d.ts.map +1 -0
  1345. package/development/radio-button/radio-button/radio-button.component.js +103 -0
  1346. package/development/radio-button/radio-button-group/radio-button-group.component.d.ts +78 -0
  1347. package/development/radio-button/radio-button-group/radio-button-group.component.d.ts.map +1 -0
  1348. package/development/radio-button/radio-button-group/radio-button-group.component.js +314 -0
  1349. package/development/radio-button/radio-button-group.d.ts +5 -0
  1350. package/development/radio-button/radio-button-group.d.ts.map +1 -0
  1351. package/development/radio-button/radio-button-group.js +5 -0
  1352. package/development/radio-button/radio-button-panel/radio-button-panel.component.d.ts +44 -0
  1353. package/development/radio-button/radio-button-panel/radio-button-panel.component.d.ts.map +1 -0
  1354. package/development/radio-button/radio-button-panel/radio-button-panel.component.js +108 -0
  1355. package/development/radio-button/radio-button-panel.d.ts +5 -0
  1356. package/development/radio-button/radio-button-panel.d.ts.map +1 -0
  1357. package/development/radio-button/radio-button-panel.js +5 -0
  1358. package/development/radio-button/radio-button.d.ts +5 -0
  1359. package/development/radio-button/radio-button.d.ts.map +1 -0
  1360. package/development/radio-button/radio-button.js +5 -0
  1361. package/development/radio-button-common-4_yg7r8b.js +116 -0
  1362. package/development/radio-button.d.ts +8 -0
  1363. package/development/radio-button.d.ts.map +1 -0
  1364. package/development/radio-button.js +13 -0
  1365. package/development/sbb-tokens-DQT_xEIZ.js +19 -0
  1366. package/development/screen-reader-only/screen-reader-only.component.d.ts +16 -0
  1367. package/development/screen-reader-only/screen-reader-only.component.d.ts.map +1 -0
  1368. package/development/screen-reader-only/screen-reader-only.component.js +37 -0
  1369. package/development/screen-reader-only.d.ts +5 -0
  1370. package/development/screen-reader-only.d.ts.map +1 -0
  1371. package/development/screen-reader-only.js +5 -0
  1372. package/development/select/select.component.d.ts +171 -0
  1373. package/development/select/select.component.d.ts.map +1 -0
  1374. package/development/select/select.component.js +1099 -0
  1375. package/development/select.d.ts +5 -0
  1376. package/development/select.d.ts.map +1 -0
  1377. package/development/select.js +5 -0
  1378. package/development/selection-action-panel/selection-action-panel.component.d.ts +22 -0
  1379. package/development/selection-action-panel/selection-action-panel.component.d.ts.map +1 -0
  1380. package/development/selection-action-panel/selection-action-panel.component.js +137 -0
  1381. package/development/selection-action-panel.d.ts +5 -0
  1382. package/development/selection-action-panel.d.ts.map +1 -0
  1383. package/development/selection-action-panel.js +5 -0
  1384. package/development/selection-expansion-panel/selection-expansion-panel.component.d.ts +45 -0
  1385. package/development/selection-expansion-panel/selection-expansion-panel.component.d.ts.map +1 -0
  1386. package/development/selection-expansion-panel/selection-expansion-panel.component.js +312 -0
  1387. package/development/selection-expansion-panel.d.ts +5 -0
  1388. package/development/selection-expansion-panel.d.ts.map +1 -0
  1389. package/development/selection-expansion-panel.js +5 -0
  1390. package/development/sidebar/common.d.ts +4 -0
  1391. package/development/sidebar/common.d.ts.map +1 -0
  1392. package/development/sidebar/common.js +7 -0
  1393. package/development/sidebar/sidebar/sidebar.component.d.ts +66 -0
  1394. package/development/sidebar/sidebar/sidebar.component.d.ts.map +1 -0
  1395. package/development/sidebar/sidebar/sidebar.component.js +480 -0
  1396. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts +23 -0
  1397. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts.map +1 -0
  1398. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.js +49 -0
  1399. package/development/sidebar/sidebar-close-button.d.ts +5 -0
  1400. package/development/sidebar/sidebar-close-button.d.ts.map +1 -0
  1401. package/development/sidebar/sidebar-close-button.js +5 -0
  1402. package/development/sidebar/sidebar-container/sidebar-container.component.d.ts +34 -0
  1403. package/development/sidebar/sidebar-container/sidebar-container.component.d.ts.map +1 -0
  1404. package/development/sidebar/sidebar-container/sidebar-container.component.js +159 -0
  1405. package/development/sidebar/sidebar-container.d.ts +5 -0
  1406. package/development/sidebar/sidebar-container.d.ts.map +1 -0
  1407. package/development/sidebar/sidebar-container.js +5 -0
  1408. package/development/sidebar/sidebar-content/sidebar-content.component.d.ts +18 -0
  1409. package/development/sidebar/sidebar-content/sidebar-content.component.d.ts.map +1 -0
  1410. package/development/sidebar/sidebar-content/sidebar-content.component.js +37 -0
  1411. package/development/sidebar/sidebar-content.d.ts +5 -0
  1412. package/development/sidebar/sidebar-content.d.ts.map +1 -0
  1413. package/development/sidebar/sidebar-content.js +5 -0
  1414. package/development/sidebar/sidebar-title/sidebar-title.component.d.ts +20 -0
  1415. package/development/sidebar/sidebar-title/sidebar-title.component.d.ts.map +1 -0
  1416. package/development/sidebar/sidebar-title/sidebar-title.component.js +60 -0
  1417. package/development/sidebar/sidebar-title.d.ts +5 -0
  1418. package/development/sidebar/sidebar-title.d.ts.map +1 -0
  1419. package/development/sidebar/sidebar-title.js +5 -0
  1420. package/development/sidebar/sidebar.d.ts +5 -0
  1421. package/development/sidebar/sidebar.d.ts.map +1 -0
  1422. package/development/sidebar/sidebar.js +5 -0
  1423. package/development/sidebar.d.ts +10 -0
  1424. package/development/sidebar.d.ts.map +1 -0
  1425. package/development/sidebar.js +17 -0
  1426. package/development/signet/signet.component.d.ts +22 -0
  1427. package/development/signet/signet.component.d.ts.map +1 -0
  1428. package/development/signet/signet.component.js +157 -0
  1429. package/development/signet.d.ts +5 -0
  1430. package/development/signet.d.ts.map +1 -0
  1431. package/development/signet.js +5 -0
  1432. package/development/skiplink-list/skiplink-list.component.d.ts +33 -0
  1433. package/development/skiplink-list/skiplink-list.component.d.ts.map +1 -0
  1434. package/development/skiplink-list/skiplink-list.component.js +166 -0
  1435. package/development/skiplink-list.d.ts +5 -0
  1436. package/development/skiplink-list.d.ts.map +1 -0
  1437. package/development/skiplink-list.js +5 -0
  1438. package/development/slider/slider.component.d.ts +79 -0
  1439. package/development/slider/slider.component.d.ts.map +1 -0
  1440. package/development/slider/slider.component.js +398 -0
  1441. package/development/slider.d.ts +5 -0
  1442. package/development/slider.d.ts.map +1 -0
  1443. package/development/slider.js +5 -0
  1444. package/development/status/status.component.d.ts +31 -0
  1445. package/development/status/status.component.d.ts.map +1 -0
  1446. package/development/status/status.component.js +157 -0
  1447. package/development/status.d.ts +5 -0
  1448. package/development/status.d.ts.map +1 -0
  1449. package/development/status.js +5 -0
  1450. package/development/stepper/step/step.component.d.ts +75 -0
  1451. package/development/stepper/step/step.component.d.ts.map +1 -0
  1452. package/development/stepper/step/step.component.js +226 -0
  1453. package/development/stepper/step-label/step-label.component.d.ts +56 -0
  1454. package/development/stepper/step-label/step-label.component.d.ts.map +1 -0
  1455. package/development/stepper/step-label/step-label.component.js +310 -0
  1456. package/development/stepper/step-label.d.ts +5 -0
  1457. package/development/stepper/step-label.d.ts.map +1 -0
  1458. package/development/stepper/step-label.js +5 -0
  1459. package/development/stepper/step.d.ts +5 -0
  1460. package/development/stepper/step.d.ts.map +1 -0
  1461. package/development/stepper/step.js +5 -0
  1462. package/development/stepper/stepper/stepper.component.d.ts +96 -0
  1463. package/development/stepper/stepper/stepper.component.d.ts.map +1 -0
  1464. package/development/stepper/stepper/stepper.component.js +472 -0
  1465. package/development/stepper/stepper.d.ts +5 -0
  1466. package/development/stepper/stepper.d.ts.map +1 -0
  1467. package/development/stepper/stepper.js +6 -0
  1468. package/development/stepper.d.ts +7 -0
  1469. package/development/stepper.d.ts.map +1 -0
  1470. package/development/stepper.js +10 -0
  1471. package/development/table/table-wrapper/table-wrapper.component.d.ts +31 -0
  1472. package/development/table/table-wrapper/table-wrapper.component.d.ts.map +1 -0
  1473. package/development/table/table-wrapper/table-wrapper.component.js +126 -0
  1474. package/development/table/table-wrapper.d.ts +5 -0
  1475. package/development/table/table-wrapper.d.ts.map +1 -0
  1476. package/development/table/table-wrapper.js +5 -0
  1477. package/development/table.d.ts +5 -0
  1478. package/development/table.d.ts.map +1 -0
  1479. package/development/table.js +5 -0
  1480. package/development/tabs/common.d.ts +4 -0
  1481. package/development/tabs/common.d.ts.map +1 -0
  1482. package/development/tabs/common.js +171 -0
  1483. package/development/tabs/tab/tab.component.d.ts +36 -0
  1484. package/development/tabs/tab/tab.component.d.ts.map +1 -0
  1485. package/development/tabs/tab/tab.component.js +98 -0
  1486. package/development/tabs/tab-group/tab-group.component.d.ts +82 -0
  1487. package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -0
  1488. package/development/tabs/tab-group/tab-group.component.js +242 -0
  1489. package/development/tabs/tab-group.d.ts +5 -0
  1490. package/development/tabs/tab-group.d.ts.map +1 -0
  1491. package/development/tabs/tab-group.js +5 -0
  1492. package/development/tabs/tab-label/tab-label.component.d.ts +51 -0
  1493. package/development/tabs/tab-label/tab-label.component.d.ts.map +1 -0
  1494. package/development/tabs/tab-label/tab-label.component.js +375 -0
  1495. package/development/tabs/tab-label.d.ts +5 -0
  1496. package/development/tabs/tab-label.d.ts.map +1 -0
  1497. package/development/tabs/tab-label.js +5 -0
  1498. package/development/tabs/tab-nav-bar/tab-nav-bar.component.d.ts +30 -0
  1499. package/development/tabs/tab-nav-bar/tab-nav-bar.component.d.ts.map +1 -0
  1500. package/development/tabs/tab-nav-bar/tab-nav-bar.component.js +105 -0
  1501. package/development/tabs/tab-nav-bar.d.ts +5 -0
  1502. package/development/tabs/tab-nav-bar.d.ts.map +1 -0
  1503. package/development/tabs/tab-nav-bar.js +5 -0
  1504. package/development/tabs/tab.d.ts +5 -0
  1505. package/development/tabs/tab.d.ts.map +1 -0
  1506. package/development/tabs/tab.js +5 -0
  1507. package/development/tabs.d.ts +8 -0
  1508. package/development/tabs.d.ts.map +1 -0
  1509. package/development/tabs.js +11 -0
  1510. package/development/tag/tag/tag.component.d.ts +58 -0
  1511. package/development/tag/tag/tag.component.d.ts.map +1 -0
  1512. package/development/tag/tag/tag.component.js +358 -0
  1513. package/development/tag/tag-group/tag-group.component.d.ts +50 -0
  1514. package/development/tag/tag-group/tag-group.component.d.ts.map +1 -0
  1515. package/development/tag/tag-group/tag-group.component.js +185 -0
  1516. package/development/tag/tag-group.d.ts +5 -0
  1517. package/development/tag/tag-group.d.ts.map +1 -0
  1518. package/development/tag/tag-group.js +5 -0
  1519. package/development/tag/tag.d.ts +5 -0
  1520. package/development/tag/tag.d.ts.map +1 -0
  1521. package/development/tag/tag.js +5 -0
  1522. package/development/tag.d.ts +6 -0
  1523. package/development/tag.d.ts.map +1 -0
  1524. package/development/tag.js +7 -0
  1525. package/development/teaser/teaser.component.d.ts +26 -0
  1526. package/development/teaser/teaser.component.d.ts.map +1 -0
  1527. package/development/teaser/teaser.component.js +231 -0
  1528. package/development/teaser-hero/teaser-hero.component.d.ts +23 -0
  1529. package/development/teaser-hero/teaser-hero.component.d.ts.map +1 -0
  1530. package/development/teaser-hero/teaser-hero.component.js +179 -0
  1531. package/development/teaser-hero.d.ts +5 -0
  1532. package/development/teaser-hero.d.ts.map +1 -0
  1533. package/development/teaser-hero.js +5 -0
  1534. package/development/teaser-product/common/teaser-product-common.d.ts +9 -0
  1535. package/development/teaser-product/common/teaser-product-common.d.ts.map +1 -0
  1536. package/development/teaser-product/common/teaser-product-common.js +64 -0
  1537. package/development/teaser-product/common.d.ts +5 -0
  1538. package/development/teaser-product/common.d.ts.map +1 -0
  1539. package/development/teaser-product/common.js +7 -0
  1540. package/development/teaser-product/teaser-product/teaser-product.component.d.ts +23 -0
  1541. package/development/teaser-product/teaser-product/teaser-product.component.d.ts.map +1 -0
  1542. package/development/teaser-product/teaser-product/teaser-product.component.js +76 -0
  1543. package/development/teaser-product/teaser-product-static/teaser-product-static.component.d.ts +22 -0
  1544. package/development/teaser-product/teaser-product-static/teaser-product-static.component.d.ts.map +1 -0
  1545. package/development/teaser-product/teaser-product-static/teaser-product-static.component.js +25 -0
  1546. package/development/teaser-product/teaser-product-static.d.ts +5 -0
  1547. package/development/teaser-product/teaser-product-static.d.ts.map +1 -0
  1548. package/development/teaser-product/teaser-product-static.js +5 -0
  1549. package/development/teaser-product/teaser-product.d.ts +5 -0
  1550. package/development/teaser-product/teaser-product.d.ts.map +1 -0
  1551. package/development/teaser-product/teaser-product.js +5 -0
  1552. package/development/teaser-product-common-CJfmvweQ.js +150 -0
  1553. package/development/teaser-product.d.ts +7 -0
  1554. package/development/teaser-product.d.ts.map +1 -0
  1555. package/development/teaser-product.js +11 -0
  1556. package/development/teaser.d.ts +5 -0
  1557. package/development/teaser.d.ts.map +1 -0
  1558. package/development/teaser.js +5 -0
  1559. package/development/time-input/time-input.component.d.ts +49 -0
  1560. package/development/time-input/time-input.component.d.ts.map +1 -0
  1561. package/development/time-input/time-input.component.js +219 -0
  1562. package/development/time-input.d.ts +5 -0
  1563. package/development/time-input.d.ts.map +1 -0
  1564. package/development/time-input.js +5 -0
  1565. package/development/timetable-form/timetable-form/timetable-form.component.d.ts +17 -0
  1566. package/development/timetable-form/timetable-form/timetable-form.component.d.ts.map +1 -0
  1567. package/development/timetable-form/timetable-form/timetable-form.component.js +34 -0
  1568. package/development/timetable-form/timetable-form-details/timetable-form-details.component.d.ts +16 -0
  1569. package/development/timetable-form/timetable-form-details/timetable-form-details.component.d.ts.map +1 -0
  1570. package/development/timetable-form/timetable-form-details/timetable-form-details.component.js +51 -0
  1571. package/development/timetable-form/timetable-form-details.d.ts +5 -0
  1572. package/development/timetable-form/timetable-form-details.d.ts.map +1 -0
  1573. package/development/timetable-form/timetable-form-details.js +5 -0
  1574. package/development/timetable-form/timetable-form-field/timetable-form-field.component.d.ts +18 -0
  1575. package/development/timetable-form/timetable-form-field/timetable-form-field.component.d.ts.map +1 -0
  1576. package/development/timetable-form/timetable-form-field/timetable-form-field.component.js +124 -0
  1577. package/development/timetable-form/timetable-form-field.d.ts +5 -0
  1578. package/development/timetable-form/timetable-form-field.d.ts.map +1 -0
  1579. package/development/timetable-form/timetable-form-field.js +5 -0
  1580. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.d.ts +24 -0
  1581. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.d.ts.map +1 -0
  1582. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.js +76 -0
  1583. package/development/timetable-form/timetable-form-swap-button.d.ts +5 -0
  1584. package/development/timetable-form/timetable-form-swap-button.d.ts.map +1 -0
  1585. package/development/timetable-form/timetable-form-swap-button.js +5 -0
  1586. package/development/timetable-form/timetable-form.d.ts +5 -0
  1587. package/development/timetable-form/timetable-form.d.ts.map +1 -0
  1588. package/development/timetable-form/timetable-form.js +5 -0
  1589. package/development/timetable-form.d.ts +8 -0
  1590. package/development/timetable-form.d.ts.map +1 -0
  1591. package/development/timetable-form.js +11 -0
  1592. package/development/timetable-occupancy/timetable-occupancy.component.d.ts +22 -0
  1593. package/development/timetable-occupancy/timetable-occupancy.component.d.ts.map +1 -0
  1594. package/development/timetable-occupancy/timetable-occupancy.component.js +146 -0
  1595. package/development/timetable-occupancy-icon/timetable-occupancy-icon.component.d.ts +28 -0
  1596. package/development/timetable-occupancy-icon/timetable-occupancy-icon.component.d.ts.map +1 -0
  1597. package/development/timetable-occupancy-icon/timetable-occupancy-icon.component.js +96 -0
  1598. package/development/timetable-occupancy-icon.d.ts +5 -0
  1599. package/development/timetable-occupancy-icon.d.ts.map +1 -0
  1600. package/development/timetable-occupancy-icon.js +5 -0
  1601. package/development/timetable-occupancy.d.ts +5 -0
  1602. package/development/timetable-occupancy.d.ts.map +1 -0
  1603. package/development/timetable-occupancy.js +5 -0
  1604. package/development/title/title-base.d.ts +18 -0
  1605. package/development/title/title-base.d.ts.map +1 -0
  1606. package/development/title/title-base.js +109 -0
  1607. package/development/title/title.component.d.ts +20 -0
  1608. package/development/title/title.component.d.ts.map +1 -0
  1609. package/development/title/title.component.js +96 -0
  1610. package/development/title.d.ts +6 -0
  1611. package/development/title.d.ts.map +1 -0
  1612. package/development/title.js +7 -0
  1613. package/development/toast/toast.component.d.ts +73 -0
  1614. package/development/toast/toast.component.d.ts.map +1 -0
  1615. package/development/toast/toast.component.js +408 -0
  1616. package/development/toast.d.ts +5 -0
  1617. package/development/toast.d.ts.map +1 -0
  1618. package/development/toast.js +5 -0
  1619. package/development/toggle/toggle/toggle.component.d.ts +72 -0
  1620. package/development/toggle/toggle/toggle.component.d.ts.map +1 -0
  1621. package/development/toggle/toggle/toggle.component.js +338 -0
  1622. package/development/toggle/toggle-option/toggle-option.component.d.ts +35 -0
  1623. package/development/toggle/toggle-option/toggle-option.component.d.ts.map +1 -0
  1624. package/development/toggle/toggle-option/toggle-option.component.js +185 -0
  1625. package/development/toggle/toggle-option.d.ts +5 -0
  1626. package/development/toggle/toggle-option.d.ts.map +1 -0
  1627. package/development/toggle/toggle-option.js +5 -0
  1628. package/development/toggle/toggle.d.ts +5 -0
  1629. package/development/toggle/toggle.d.ts.map +1 -0
  1630. package/development/toggle/toggle.js +5 -0
  1631. package/development/toggle-check/toggle-check.component.d.ts +33 -0
  1632. package/development/toggle-check/toggle-check.component.d.ts.map +1 -0
  1633. package/development/toggle-check/toggle-check.component.js +280 -0
  1634. package/development/toggle-check.d.ts +5 -0
  1635. package/development/toggle-check.d.ts.map +1 -0
  1636. package/development/toggle-check.js +5 -0
  1637. package/development/toggle.d.ts +6 -0
  1638. package/development/toggle.d.ts.map +1 -0
  1639. package/development/toggle.js +7 -0
  1640. package/development/tooltip/tooltip.component.d.ts +96 -0
  1641. package/development/tooltip/tooltip.component.d.ts.map +1 -0
  1642. package/development/tooltip/tooltip.component.js +447 -0
  1643. package/development/tooltip.d.ts +5 -0
  1644. package/development/tooltip.d.ts.map +1 -0
  1645. package/development/tooltip.js +5 -0
  1646. package/development/train/train/train.component.d.ts +42 -0
  1647. package/development/train/train/train.component.d.ts.map +1 -0
  1648. package/development/train/train/train.component.js +235 -0
  1649. package/development/train/train-blocked-passage/train-blocked-passage.component.d.ts +14 -0
  1650. package/development/train/train-blocked-passage/train-blocked-passage.component.d.ts.map +1 -0
  1651. package/development/train/train-blocked-passage/train-blocked-passage.component.js +82 -0
  1652. package/development/train/train-blocked-passage.d.ts +5 -0
  1653. package/development/train/train-blocked-passage.d.ts.map +1 -0
  1654. package/development/train/train-blocked-passage.js +5 -0
  1655. package/development/train/train-formation/train-formation.component.d.ts +29 -0
  1656. package/development/train/train-formation/train-formation.component.d.ts.map +1 -0
  1657. package/development/train/train-formation/train-formation.component.js +280 -0
  1658. package/development/train/train-formation.d.ts +5 -0
  1659. package/development/train/train-formation.d.ts.map +1 -0
  1660. package/development/train/train-formation.js +5 -0
  1661. package/development/train/train-wagon/train-wagon.component.d.ts +44 -0
  1662. package/development/train/train-wagon/train-wagon.component.d.ts.map +1 -0
  1663. package/development/train/train-wagon/train-wagon.component.js +393 -0
  1664. package/development/train/train-wagon.d.ts +5 -0
  1665. package/development/train/train-wagon.d.ts.map +1 -0
  1666. package/development/train/train-wagon.js +5 -0
  1667. package/development/train/train.d.ts +5 -0
  1668. package/development/train/train.d.ts.map +1 -0
  1669. package/development/train/train.js +5 -0
  1670. package/development/train.d.ts +8 -0
  1671. package/development/train.d.ts.map +1 -0
  1672. package/development/train.js +11 -0
  1673. package/development/visual-checkbox/visual-checkbox.component.d.ts +26 -0
  1674. package/development/visual-checkbox/visual-checkbox.component.d.ts.map +1 -0
  1675. package/development/visual-checkbox/visual-checkbox.component.js +170 -0
  1676. package/development/visual-checkbox.d.ts +5 -0
  1677. package/development/visual-checkbox.d.ts.map +1 -0
  1678. package/development/visual-checkbox.js +5 -0
  1679. package/dialog/dialog/dialog.component.js +148 -0
  1680. package/dialog/dialog-actions/dialog-actions.component.js +21 -0
  1681. package/dialog/dialog-actions.js +4 -0
  1682. package/dialog/dialog-close-button/dialog-close-button.component.js +31 -0
  1683. package/dialog/dialog-close-button.js +4 -0
  1684. package/dialog/dialog-content/dialog-content.component.js +22 -0
  1685. package/dialog/dialog-content.js +4 -0
  1686. package/dialog/dialog-title/dialog-title.component.js +21 -0
  1687. package/dialog/dialog-title.js +4 -0
  1688. package/dialog/dialog.js +7 -0
  1689. package/dialog.js +15 -0
  1690. package/disable-animation.css +3 -0
  1691. package/divider/divider.component.js +43 -0
  1692. package/divider.js +4 -0
  1693. package/expansion-panel/expansion-panel/expansion-panel.component.js +155 -0
  1694. package/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +32 -0
  1695. package/expansion-panel/expansion-panel-content.js +4 -0
  1696. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +65 -0
  1697. package/expansion-panel/expansion-panel-header.js +4 -0
  1698. package/expansion-panel/expansion-panel.js +4 -0
  1699. package/expansion-panel.js +8 -0
  1700. package/file-selector/common/file-selector-common.js +243 -0
  1701. package/file-selector/common.js +6 -0
  1702. package/file-selector/file-selector/file-selector.component.js +39 -0
  1703. package/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +74 -0
  1704. package/file-selector/file-selector-dropzone.js +4 -0
  1705. package/file-selector/file-selector.js +4 -0
  1706. package/file-selector-common-DbYkpr-x.js +5 -0
  1707. package/file-selector.js +10 -0
  1708. package/flip-card/flip-card/flip-card.component.js +119 -0
  1709. package/flip-card/flip-card-details/flip-card-details.component.js +46 -0
  1710. package/flip-card/flip-card-details.js +4 -0
  1711. package/flip-card/flip-card-summary/flip-card-summary.component.js +49 -0
  1712. package/flip-card/flip-card-summary.js +4 -0
  1713. package/flip-card/flip-card.js +4 -0
  1714. package/flip-card.js +8 -0
  1715. package/font-characters-extension.css +18 -0
  1716. package/footer/footer.component.js +88 -0
  1717. package/footer.js +4 -0
  1718. package/form-field/error/error.component.js +47 -0
  1719. package/form-field/error.js +4 -0
  1720. package/form-field/form-field/form-field.component.js +343 -0
  1721. package/form-field/form-field-clear/form-field-clear.component.js +38 -0
  1722. package/form-field/form-field-clear.js +4 -0
  1723. package/form-field/form-field.js +5 -0
  1724. package/form-field.js +9 -0
  1725. package/header/common/header-action-common.js +51 -0
  1726. package/header/common.js +4 -0
  1727. package/header/header/header.component.js +154 -0
  1728. package/header/header-button/header-button.component.js +16 -0
  1729. package/header/header-button.js +4 -0
  1730. package/header/header-environment/header-environment.component.js +37 -0
  1731. package/header/header-environment.js +4 -0
  1732. package/header/header-link/header-link.component.js +16 -0
  1733. package/header/header-link.js +4 -0
  1734. package/header/header.js +4 -0
  1735. package/header.js +10 -0
  1736. package/icon/icon-base.js +105 -0
  1737. package/icon/icon-name-mixin.js +55 -0
  1738. package/icon/icon-request.js +30 -0
  1739. package/icon/icon-validate.js +26 -0
  1740. package/icon/icon.component.js +77 -0
  1741. package/icon-sidebar/icon-sidebar/icon-sidebar.component.js +46 -0
  1742. package/icon-sidebar/icon-sidebar-button/icon-sidebar-button.component.js +24 -0
  1743. package/icon-sidebar/icon-sidebar-button.js +4 -0
  1744. package/icon-sidebar/icon-sidebar-container/icon-sidebar-container.component.js +32 -0
  1745. package/icon-sidebar/icon-sidebar-container.js +4 -0
  1746. package/icon-sidebar/icon-sidebar-content/icon-sidebar-content.component.js +23 -0
  1747. package/icon-sidebar/icon-sidebar-content.js +4 -0
  1748. package/icon-sidebar/icon-sidebar-link/icon-sidebar-link.component.js +24 -0
  1749. package/icon-sidebar/icon-sidebar-link.js +4 -0
  1750. package/icon-sidebar/icon-sidebar.js +4 -0
  1751. package/icon-sidebar-button-common-ffAscVDk.js +7 -0
  1752. package/icon-sidebar.js +12 -0
  1753. package/icon.js +13 -0
  1754. package/image/image.component.js +455 -0
  1755. package/image.js +4 -0
  1756. package/index.d.ts +317 -0
  1757. package/index.js +316 -0
  1758. package/journey-header/journey-header.component.js +95 -0
  1759. package/journey-header.js +4 -0
  1760. package/layout.css +30 -0
  1761. package/lead-container/lead-container.component.js +33 -0
  1762. package/lead-container.js +4 -0
  1763. package/link/block-link/block-link.component.js +17 -0
  1764. package/link/block-link-button/block-link-button.component.js +17 -0
  1765. package/link/block-link-button.js +4 -0
  1766. package/link/block-link-static/block-link-static.component.js +17 -0
  1767. package/link/block-link-static.js +4 -0
  1768. package/link/block-link.js +4 -0
  1769. package/link/common/block-link-common.js +44 -0
  1770. package/link/common/inline-link-common.js +13 -0
  1771. package/link/common/link-common.js +9 -0
  1772. package/link/common.js +8 -0
  1773. package/link/link/link.component.js +17 -0
  1774. package/link/link-button/link-button.component.js +17 -0
  1775. package/link/link-button.js +4 -0
  1776. package/link/link-static/link-static.component.js +17 -0
  1777. package/link/link-static.js +4 -0
  1778. package/link/link.js +4 -0
  1779. package/link-common-7IiqjmPD.js +45 -0
  1780. package/link-list/common/link-list-base.js +87 -0
  1781. package/link-list/common.js +6 -0
  1782. package/link-list/link-list/link-list.component.js +47 -0
  1783. package/link-list/link-list-anchor/link-list-anchor.component.js +18 -0
  1784. package/link-list/link-list-anchor.js +4 -0
  1785. package/link-list/link-list.js +4 -0
  1786. package/link-list-base-3v7CHEei.js +5 -0
  1787. package/link-list.js +10 -0
  1788. package/link.js +20 -0
  1789. package/lists.css +194 -0
  1790. package/loading-indicator/loading-indicator.component.js +67 -0
  1791. package/loading-indicator-circle/loading-indicator-circle.component.js +47 -0
  1792. package/loading-indicator-circle.js +4 -0
  1793. package/loading-indicator.js +4 -0
  1794. package/logo/logo.component.js +68 -0
  1795. package/logo.js +4 -0
  1796. package/map-container/map-container.component.js +110 -0
  1797. package/map-container.js +4 -0
  1798. package/menu/common/menu-action-common.js +28 -0
  1799. package/menu/common.js +4 -0
  1800. package/menu/menu/menu.component.js +272 -0
  1801. package/menu/menu-button/menu-button.component.js +17 -0
  1802. package/menu/menu-button.js +4 -0
  1803. package/menu/menu-link/menu-link.component.js +20 -0
  1804. package/menu/menu-link.js +4 -0
  1805. package/menu/menu.js +4 -0
  1806. package/menu.js +10 -0
  1807. package/message/message.component.js +32 -0
  1808. package/message.js +4 -0
  1809. package/mini-button-label-common-Dx9JhmQ6.js +11 -0
  1810. package/mini-calendar/mini-calendar/mini-calendar.component.js +130 -0
  1811. package/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +66 -0
  1812. package/mini-calendar/mini-calendar-day.js +4 -0
  1813. package/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +60 -0
  1814. package/mini-calendar/mini-calendar-month.js +4 -0
  1815. package/mini-calendar/mini-calendar.js +4 -0
  1816. package/mini-calendar.js +8 -0
  1817. package/navigation/common/navigation-action-common.js +57 -0
  1818. package/navigation/common.js +4 -0
  1819. package/navigation/navigation/navigation.component.js +188 -0
  1820. package/navigation/navigation-button/navigation-button.component.js +16 -0
  1821. package/navigation/navigation-button.js +4 -0
  1822. package/navigation/navigation-link/navigation-link.component.js +16 -0
  1823. package/navigation/navigation-link.js +4 -0
  1824. package/navigation/navigation-list/navigation-list.component.js +58 -0
  1825. package/navigation/navigation-list.js +4 -0
  1826. package/navigation/navigation-marker/navigation-marker.component.js +81 -0
  1827. package/navigation/navigation-marker.js +4 -0
  1828. package/navigation/navigation-section/navigation-section.component.js +224 -0
  1829. package/navigation/navigation-section.js +4 -0
  1830. package/navigation/navigation.js +4 -0
  1831. package/navigation.js +16 -0
  1832. package/normalize.css +95 -0
  1833. package/notification/notification.component.js +164 -0
  1834. package/notification.js +4 -0
  1835. package/off-brand-theme.css +3299 -0
  1836. package/option/optgroup/optgroup-base-element.js +82 -0
  1837. package/option/optgroup/optgroup.component.js +38 -0
  1838. package/option/optgroup.js +6 -0
  1839. package/option/option/option-base-element.js +217 -0
  1840. package/option/option/option.component.js +95 -0
  1841. package/option/option-hint/option-hint.component.js +28 -0
  1842. package/option/option-hint.js +4 -0
  1843. package/option/option.js +6 -0
  1844. package/option.js +12 -0
  1845. package/overlay/overlay-base-element.js +152 -0
  1846. package/overlay/overlay.component.js +138 -0
  1847. package/overlay.js +9 -0
  1848. package/package.json +1193 -1
  1849. package/paginator/common/paginator-common.js +223 -0
  1850. package/paginator/common.js +4 -0
  1851. package/paginator/compact-paginator/compact-paginator.component.js +47 -0
  1852. package/paginator/compact-paginator.js +4 -0
  1853. package/paginator/paginator/paginator.component.js +174 -0
  1854. package/paginator/paginator.js +4 -0
  1855. package/paginator.js +8 -0
  1856. package/popover/popover.component.js +316 -0
  1857. package/popover.js +5 -0
  1858. package/radio-button/common/radio-button-common.js +60 -0
  1859. package/radio-button/common.js +6 -0
  1860. package/radio-button/radio-button/radio-button.component.js +70 -0
  1861. package/radio-button/radio-button-group/radio-button-group.component.js +166 -0
  1862. package/radio-button/radio-button-group.js +4 -0
  1863. package/radio-button/radio-button-panel/radio-button-panel.component.js +82 -0
  1864. package/radio-button/radio-button-panel.js +4 -0
  1865. package/radio-button/radio-button.js +4 -0
  1866. package/radio-button-common-Bf2b18jm.js +5 -0
  1867. package/radio-button.js +12 -0
  1868. package/safety-theme.css +3299 -0
  1869. package/sbb-tokens-HiNSQasB.js +11 -0
  1870. package/screen-reader-only/screen-reader-only.component.js +19 -0
  1871. package/screen-reader-only.js +4 -0
  1872. package/scrollbar.css +190 -0
  1873. package/select/select.component.js +498 -0
  1874. package/select.js +4 -0
  1875. package/selection-action-panel/selection-action-panel.component.js +40 -0
  1876. package/selection-action-panel.js +4 -0
  1877. package/selection-expansion-panel/selection-expansion-panel.component.js +115 -0
  1878. package/selection-expansion-panel.js +4 -0
  1879. package/sidebar/common.js +6 -0
  1880. package/sidebar/sidebar/sidebar.component.js +182 -0
  1881. package/sidebar/sidebar-close-button/sidebar-close-button.component.js +34 -0
  1882. package/sidebar/sidebar-close-button.js +4 -0
  1883. package/sidebar/sidebar-container/sidebar-container.component.js +83 -0
  1884. package/sidebar/sidebar-container.js +4 -0
  1885. package/sidebar/sidebar-content/sidebar-content.component.js +23 -0
  1886. package/sidebar/sidebar-content.js +4 -0
  1887. package/sidebar/sidebar-title/sidebar-title.component.js +39 -0
  1888. package/sidebar/sidebar-title.js +4 -0
  1889. package/sidebar/sidebar.js +4 -0
  1890. package/sidebar.js +16 -0
  1891. package/signet/signet.component.js +73 -0
  1892. package/signet.js +4 -0
  1893. package/skiplink-list/skiplink-list.component.js +76 -0
  1894. package/skiplink-list.js +4 -0
  1895. package/slider/slider.component.js +199 -0
  1896. package/slider.js +4 -0
  1897. package/standard-theme.css +3299 -0
  1898. package/status/status.component.js +71 -0
  1899. package/status.js +4 -0
  1900. package/stepper/step/step.component.js +116 -0
  1901. package/stepper/step-label/step-label.component.js +102 -0
  1902. package/stepper/step-label.js +4 -0
  1903. package/stepper/step.js +4 -0
  1904. package/stepper/stepper/stepper.component.js +236 -0
  1905. package/stepper/stepper.js +5 -0
  1906. package/stepper.js +9 -0
  1907. package/table/table-wrapper/table-wrapper.component.js +69 -0
  1908. package/table/table-wrapper.js +4 -0
  1909. package/table.css +249 -0
  1910. package/table.js +4 -0
  1911. package/tabs/common.js +6 -0
  1912. package/tabs/tab/tab.component.js +52 -0
  1913. package/tabs/tab-group/tab-group.component.js +166 -0
  1914. package/tabs/tab-group.js +4 -0
  1915. package/tabs/tab-label/tab-label.component.js +127 -0
  1916. package/tabs/tab-label.js +4 -0
  1917. package/tabs/tab-nav-bar/tab-nav-bar.component.js +66 -0
  1918. package/tabs/tab-nav-bar.js +4 -0
  1919. package/tabs/tab.js +4 -0
  1920. package/tabs.js +10 -0
  1921. package/tag/tag/tag.component.js +128 -0
  1922. package/tag/tag-group/tag-group.component.js +118 -0
  1923. package/tag/tag-group.js +4 -0
  1924. package/tag/tag.js +4 -0
  1925. package/tag.js +6 -0
  1926. package/teaser/teaser.component.js +80 -0
  1927. package/teaser-hero/teaser-hero.component.js +62 -0
  1928. package/teaser-hero.js +4 -0
  1929. package/teaser-product/common/teaser-product-common.js +53 -0
  1930. package/teaser-product/common.js +6 -0
  1931. package/teaser-product/teaser-product/teaser-product.component.js +36 -0
  1932. package/teaser-product/teaser-product-static/teaser-product-static.component.js +17 -0
  1933. package/teaser-product/teaser-product-static.js +4 -0
  1934. package/teaser-product/teaser-product.js +4 -0
  1935. package/teaser-product-common-DwaWdQEh.js +5 -0
  1936. package/teaser-product.js +10 -0
  1937. package/teaser.js +4 -0
  1938. package/time-input/time-input.component.js +127 -0
  1939. package/time-input.js +4 -0
  1940. package/timetable-form/timetable-form/timetable-form.component.js +19 -0
  1941. package/timetable-form/timetable-form-details/timetable-form-details.component.js +19 -0
  1942. package/timetable-form/timetable-form-details.js +4 -0
  1943. package/timetable-form/timetable-form-field/timetable-form-field.component.js +32 -0
  1944. package/timetable-form/timetable-form-field.js +4 -0
  1945. package/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.js +41 -0
  1946. package/timetable-form/timetable-form-swap-button.js +4 -0
  1947. package/timetable-form/timetable-form.js +4 -0
  1948. package/timetable-form.css +73 -0
  1949. package/timetable-form.js +10 -0
  1950. package/timetable-occupancy/timetable-occupancy.component.js +76 -0
  1951. package/timetable-occupancy-icon/timetable-occupancy-icon.component.js +61 -0
  1952. package/timetable-occupancy-icon.js +4 -0
  1953. package/timetable-occupancy.js +4 -0
  1954. package/title/title-base.js +53 -0
  1955. package/title/title.component.js +37 -0
  1956. package/title.js +6 -0
  1957. package/toast/toast.component.js +180 -0
  1958. package/toast.js +4 -0
  1959. package/toggle/toggle/toggle.component.js +147 -0
  1960. package/toggle/toggle-option/toggle-option.component.js +89 -0
  1961. package/toggle/toggle-option.js +4 -0
  1962. package/toggle/toggle.js +4 -0
  1963. package/toggle-check/toggle-check.component.js +84 -0
  1964. package/toggle-check.js +4 -0
  1965. package/toggle.js +6 -0
  1966. package/tooltip/tooltip.component.js +197 -0
  1967. package/tooltip.js +4 -0
  1968. package/train/train/train.component.js +122 -0
  1969. package/train/train-blocked-passage/train-blocked-passage.component.js +26 -0
  1970. package/train/train-blocked-passage.js +4 -0
  1971. package/train/train-formation/train-formation.component.js +92 -0
  1972. package/train/train-formation.js +4 -0
  1973. package/train/train-wagon/train-wagon.component.js +173 -0
  1974. package/train/train-wagon.js +4 -0
  1975. package/train/train.js +4 -0
  1976. package/train.js +10 -0
  1977. package/typography.css +67 -0
  1978. package/visual-checkbox/visual-checkbox.component.js +80 -0
  1979. package/visual-checkbox.js +4 -0
@@ -0,0 +1,1957 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
+ import { __esDecorate, __runInitializers } from "tslib";
9
+ import { css, LitElement, isServer, nothing, html } from "lit";
10
+ import { customElement, property, state } from "lit/decorators.js";
11
+ import { classMap } from "lit/directives/class-map.js";
12
+ import { isArrowKeyOrPageKeysPressed } from "../core/a11y.js";
13
+ import { readConfig } from "../core/config.js";
14
+ import { SbbLanguageController, SbbMediaMatcherController, SbbMediaQueryBreakpointLargeAndAbove } from "../core/controllers.js";
15
+ import { defaultDateAdapter, YEARS_PER_PAGE, DAYS_PER_ROW, MONTHS_PER_ROW, YEARS_PER_ROW, MONTHS_PER_PAGE } from "../core/datetime.js";
16
+ import { forceType, plainDate, handleDistinctChange } from "../core/decorators.js";
17
+ import { i18nPreviousMonth, i18nNextMonth, i18nYearMonthSelection, i18nCalendarWeekNumber, i18nPreviousYear, i18nNextYear, i18nCalendarDateSelection, i18nPreviousYearRange, i18nNextYearRange } from "../core/i18n.js";
18
+ import { SbbHydrationMixin, SbbElementInternalsMixin } from "../core/mixins.js";
19
+ import { boxSizingStyles } from "../core/styles.js";
20
+ import "../button/secondary-button.js";
21
+ import "../icon.js";
22
+ import "../screen-reader-only.js";
23
+ const millisecondsInWeek = 6048e5;
24
+ const constructFromSymbol = /* @__PURE__ */ Symbol.for("constructDateFrom");
25
+ function constructFrom(date, value) {
26
+ if (typeof date === "function") return date(value);
27
+ if (date && typeof date === "object" && constructFromSymbol in date)
28
+ return date[constructFromSymbol](value);
29
+ if (date instanceof Date) return new date.constructor(value);
30
+ return new Date(value);
31
+ }
32
+ function toDate(argument, context) {
33
+ return constructFrom(context || argument, argument);
34
+ }
35
+ function addDays(date, amount, options) {
36
+ const _date = toDate(date, options?.in);
37
+ if (isNaN(amount)) return constructFrom(date, NaN);
38
+ if (!amount) return _date;
39
+ _date.setDate(_date.getDate() + amount);
40
+ return _date;
41
+ }
42
+ let defaultOptions = {};
43
+ function getDefaultOptions() {
44
+ return defaultOptions;
45
+ }
46
+ function startOfWeek(date, options) {
47
+ const defaultOptions2 = getDefaultOptions();
48
+ const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
49
+ const _date = toDate(date, options?.in);
50
+ const day = _date.getDay();
51
+ const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
52
+ _date.setDate(_date.getDate() - diff);
53
+ _date.setHours(0, 0, 0, 0);
54
+ return _date;
55
+ }
56
+ function normalizeDates(context, ...dates) {
57
+ const normalize = constructFrom.bind(
58
+ null,
59
+ context || dates.find((date) => typeof date === "object")
60
+ );
61
+ return dates.map(normalize);
62
+ }
63
+ function addWeeks(date, amount, options) {
64
+ return addDays(date, amount * 7, options);
65
+ }
66
+ function endOfMonth(date, options) {
67
+ const _date = toDate(date, options?.in);
68
+ const month = _date.getMonth();
69
+ _date.setFullYear(_date.getFullYear(), month + 1, 0);
70
+ _date.setHours(23, 59, 59, 999);
71
+ return _date;
72
+ }
73
+ function normalizeInterval(context, interval) {
74
+ const [start, end] = normalizeDates(context, interval.start, interval.end);
75
+ return { start, end };
76
+ }
77
+ function eachWeekOfInterval(interval, options) {
78
+ const { start, end } = normalizeInterval(options?.in, interval);
79
+ let reversed = +start > +end;
80
+ const startDateWeek = reversed ? startOfWeek(end, options) : startOfWeek(start, options);
81
+ const endDateWeek = reversed ? startOfWeek(start, options) : startOfWeek(end, options);
82
+ startDateWeek.setHours(15);
83
+ endDateWeek.setHours(15);
84
+ const endTime = +endDateWeek.getTime();
85
+ let currentDate = startDateWeek;
86
+ let step = options?.step ?? 1;
87
+ if (!step) return [];
88
+ if (step < 0) {
89
+ step = -step;
90
+ reversed = !reversed;
91
+ }
92
+ const dates = [];
93
+ while (+currentDate <= endTime) {
94
+ currentDate.setHours(0);
95
+ dates.push(constructFrom(start, currentDate));
96
+ currentDate = addWeeks(currentDate, step);
97
+ currentDate.setHours(15);
98
+ }
99
+ return reversed ? dates.reverse() : dates;
100
+ }
101
+ function startOfMonth(date, options) {
102
+ const _date = toDate(date, options?.in);
103
+ _date.setDate(1);
104
+ _date.setHours(0, 0, 0, 0);
105
+ return _date;
106
+ }
107
+ function getWeekYear(date, options) {
108
+ const _date = toDate(date, options?.in);
109
+ const year = _date.getFullYear();
110
+ const defaultOptions2 = getDefaultOptions();
111
+ const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
112
+ const firstWeekOfNextYear = constructFrom(options?.in || date, 0);
113
+ firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
114
+ firstWeekOfNextYear.setHours(0, 0, 0, 0);
115
+ const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
116
+ const firstWeekOfThisYear = constructFrom(options?.in || date, 0);
117
+ firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
118
+ firstWeekOfThisYear.setHours(0, 0, 0, 0);
119
+ const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
120
+ if (+_date >= +startOfNextYear) {
121
+ return year + 1;
122
+ } else if (+_date >= +startOfThisYear) {
123
+ return year;
124
+ } else {
125
+ return year - 1;
126
+ }
127
+ }
128
+ function startOfWeekYear(date, options) {
129
+ const defaultOptions2 = getDefaultOptions();
130
+ const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
131
+ const year = getWeekYear(date, options);
132
+ const firstWeek = constructFrom(options?.in || date, 0);
133
+ firstWeek.setFullYear(year, 0, firstWeekContainsDate);
134
+ firstWeek.setHours(0, 0, 0, 0);
135
+ const _date = startOfWeek(firstWeek, options);
136
+ return _date;
137
+ }
138
+ function getWeek(date, options) {
139
+ const _date = toDate(date, options?.in);
140
+ const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);
141
+ return Math.round(diff / millisecondsInWeek) + 1;
142
+ }
143
+ const style = css`:host {
144
+ display: block;
145
+ width: max-content;
146
+ --sbb-calendar-cell-size: 2.5rem;
147
+ --sbb-calendar-hover-shift: 0.0625rem;
148
+ --sbb-calendar-wide-cell-size: 4.375rem;
149
+ --sbb-calendar-header-color: var(--sbb-color-granite);
150
+ --sbb-calendar-header-color: light-dark(var(--sbb-color-granite), var(--sbb-color-smoke));
151
+ --sbb-calendar-cell-background-color: transparent;
152
+ --sbb-calendar-cell-padding: 0.125rem;
153
+ --sbb-calendar-cell-color: var(--sbb-color-2);
154
+ --sbb-calendar-cell-selected-color: var(--sbb-color-1-inverted);
155
+ --sbb-calendar-cell-selected-background-color: var(--sbb-background-color-2-inverted);
156
+ --sbb-calendar-cell-disabled-height: 0.09375rem;
157
+ --sbb-calendar-cell-disabled-width: 1.59375rem;
158
+ --sbb-calendar-cell-disabled-color: var(--sbb-color-granite);
159
+ --sbb-calendar-cell-disabled-color: light-dark(var(--sbb-color-granite), var(--sbb-color-smoke));
160
+ --sbb-calendar-cell-transition-duration: var(
161
+ --sbb-disable-animation-duration,
162
+ var(--sbb-animation-duration-2x)
163
+ );
164
+ --sbb-calendar-cell-transition-easing-function: var(--sbb-animation-easing);
165
+ --sbb-calendar-tables-gap: var(--sbb-spacing-fixed-10x);
166
+ --sbb-calendar-table-animation-shift: 0.00625rem;
167
+ --sbb-calendar-table-animation-duration: 0.1ms;
168
+ --sbb-calendar-table-column-spaces: 12;
169
+ --sbb-calendar-control-view-change-height: 2.75rem;
170
+ --sbb-calendar-control-view-change-color: var(--sbb-color-3);
171
+ --sbb-calendar-control-view-change-background: var(--sbb-background-color-1);
172
+ }
173
+ @media (min-width: calc(37.5rem)) {
174
+ :host {
175
+ --sbb-calendar-cell-size: 2.75rem;
176
+ --sbb-calendar-wide-cell-size: 4.8125rem;
177
+ --sbb-calendar-control-view-change-height: 3rem;
178
+ }
179
+ }
180
+
181
+ .sbb-calendar__wrapper {
182
+ width: 100%;
183
+ display: block;
184
+ transition-duration: var(--sbb-calendar-cell-transition-duration);
185
+ }
186
+
187
+ .sbb-calendar__controls {
188
+ width: 100%;
189
+ display: inline-flex;
190
+ align-items: center;
191
+ gap: var(--sbb-spacing-fixed-2x);
192
+ margin-block-end: var(--sbb-spacing-fixed-4x);
193
+ }
194
+
195
+ .sbb-calendar__controls-month {
196
+ width: 100%;
197
+ display: flex;
198
+ gap: var(--sbb-calendar-tables-gap);
199
+ }
200
+
201
+ #sbb-calendar__controls-previous,
202
+ #sbb-calendar__controls-next {
203
+ -webkit-tap-highlight-color: transparent;
204
+ }
205
+
206
+ .sbb-calendar__controls-change-date {
207
+ appearance: none;
208
+ box-sizing: border-box;
209
+ margin: 0;
210
+ outline: none;
211
+ border: none;
212
+ border-radius: 0;
213
+ padding: 0;
214
+ background: none;
215
+ -webkit-tap-highlight-color: transparent;
216
+ color: inherit;
217
+ --sbb-text-font-size: var(--sbb-text-font-size-s);
218
+ font-family: var(--sbb-typo-font-family);
219
+ font-weight: normal;
220
+ line-height: var(--sbb-typo-line-height-text);
221
+ letter-spacing: var(--sbb-typo-letter-spacing-text);
222
+ font-size: var(--sbb-text-font-size);
223
+ display: flex;
224
+ align-items: center;
225
+ margin: auto;
226
+ height: var(--sbb-calendar-control-view-change-height);
227
+ text-transform: capitalize;
228
+ cursor: var(--sbb-cursor-pointer);
229
+ padding-inline: var(--sbb-spacing-fixed-5x) var(--sbb-spacing-fixed-2x);
230
+ border-radius: var(--sbb-border-radius-infinity);
231
+ background-color: var(--sbb-calendar-control-view-change-background);
232
+ color: var(--sbb-calendar-control-view-change-color);
233
+ transition-duration: var(--sbb-calendar-cell-transition-duration);
234
+ transition-timing-function: var(--sbb-calendar-cell-transition-easing-function);
235
+ transition-property: background-color, padding-block-end;
236
+ }
237
+ .sbb-calendar__controls-change-date:disabled {
238
+ --sbb-calendar-control-view-change-background: var(--sbb-color-milk);
239
+ --sbb-calendar-control-view-change-background: light-dark(
240
+ var(--sbb-color-milk),
241
+ var(--sbb-color-anthracite)
242
+ );
243
+ --sbb-calendar-control-view-change-color: var(--sbb-color-granite);
244
+ --sbb-calendar-control-view-change-color: light-dark(
245
+ var(--sbb-color-granite),
246
+ var(--sbb-color-aluminium)
247
+ );
248
+ cursor: unset;
249
+ }
250
+ .sbb-calendar__controls-change-date:focus-visible {
251
+ outline-offset: var(--sbb-focus-outline-offset);
252
+ outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);
253
+ outline-offset: var(--sbb-spacing-fixed-1x);
254
+ }
255
+ @media (any-hover: hover) {
256
+ .sbb-calendar__controls-change-date:not(:active, :disabled):hover {
257
+ padding-block-end: var(--sbb-calendar-hover-shift);
258
+ }
259
+ }
260
+ .sbb-calendar__controls-change-date:not(:disabled):active {
261
+ --sbb-calendar-control-view-change-background: var(--sbb-background-color-3);
262
+ }
263
+
264
+ .sbb-calendar__table-month-view,
265
+ .sbb-calendar__table-year-view {
266
+ --sbb-calendar-table-column-spaces: 6;
267
+ }
268
+
269
+ .sbb-calendar__table-overflow-break {
270
+ contain: layout;
271
+ }
272
+
273
+ .sbb-calendar__table-container {
274
+ display: flex;
275
+ gap: var(--sbb-calendar-tables-gap);
276
+ margin-inline: var(--sbb-calendar-margin);
277
+ --sbb-calendar-min-width: calc(7 * var(--sbb-calendar-cell-size));
278
+ --sbb-calendar-overflow: calc(100% - var(--sbb-calendar-min-width));
279
+ --sbb-calendar-start-offset: min(
280
+ 0px,
281
+ -1 * (var(--sbb-calendar-overflow) / var(--sbb-calendar-table-column-spaces))
282
+ );
283
+ --sbb-calendar-margin: var(--sbb-calendar-start-offset);
284
+ }
285
+ :host(:is(:state(wide),[state--wide])) .sbb-calendar__table-container {
286
+ --sbb-calendar-min-width: calc(
287
+ 2 * 7 * var(--sbb-calendar-cell-size) + var(--sbb-calendar-tables-gap)
288
+ );
289
+ --sbb-calendar-margin: calc(0.5 * var(--sbb-calendar-start-offset));
290
+ }
291
+ :host([orientation=horizontal][week-numbers]) .sbb-calendar__table-container {
292
+ --sbb-calendar-min-width: calc(8 * var(--sbb-calendar-cell-size));
293
+ }
294
+ :host([orientation=horizontal][week-numbers]:is(:state(wide),[state--wide])) .sbb-calendar__table-container {
295
+ --sbb-calendar-min-width: calc(
296
+ 2 * 8 * var(--sbb-calendar-cell-size) + var(--sbb-calendar-tables-gap)
297
+ );
298
+ }
299
+ :host([orientation=vertical]) .sbb-calendar__table-container {
300
+ min-width: var(--sbb-calendar-min-width);
301
+ --sbb-calendar-start-offset: 0;
302
+ }
303
+ :host([orientation=vertical]:is(:state(wide),[state--wide])) .sbb-calendar__table-container {
304
+ --sbb-calendar-min-width: calc(
305
+ 13 * var(--sbb-calendar-cell-size) + var(--sbb-calendar-tables-gap)
306
+ );
307
+ }
308
+
309
+ .sbb-calendar__table {
310
+ width: 100%;
311
+ border-collapse: collapse;
312
+ height: max-content;
313
+ animation-name: show;
314
+ animation-duration: var(--sbb-calendar-table-animation-duration);
315
+ }
316
+ .sbb-calendar__table.sbb-calendar__table-hide {
317
+ --sbb-calendar-cell-transition-duration: 0ms;
318
+ animation-name: hide;
319
+ animation-duration: var(--sbb-calendar-table-animation-duration);
320
+ }
321
+ :host(:not(:is(:state(wide),[state--wide]))) .sbb-calendar__table {
322
+ min-width: 100%;
323
+ }
324
+
325
+ .sbb-calendar__table-header {
326
+ text-align: center;
327
+ }
328
+
329
+ .sbb-calendar__table-body {
330
+ text-align: center;
331
+ }
332
+
333
+ .sbb-calendar__table-header-cell {
334
+ --sbb-text-font-size: var(--sbb-text-font-size-xs);
335
+ font-family: var(--sbb-typo-font-family);
336
+ font-weight: normal;
337
+ line-height: var(--sbb-typo-line-height-text);
338
+ letter-spacing: var(--sbb-typo-letter-spacing-text);
339
+ font-size: var(--sbb-text-font-size);
340
+ width: var(--sbb-calendar-cell-size);
341
+ color: var(--sbb-calendar-header-color);
342
+ padding: 0;
343
+ }
344
+ :host(:not([multiple])) .sbb-calendar__table-header-cell {
345
+ height: var(--sbb-calendar-cell-size);
346
+ }
347
+
348
+ .sbb-calendar__table-data {
349
+ position: relative;
350
+ padding: 0;
351
+ text-align: center;
352
+ }
353
+
354
+ .sbb-calendar__header-cell,
355
+ .sbb-calendar__cell {
356
+ appearance: none;
357
+ box-sizing: border-box;
358
+ margin: 0;
359
+ outline: none;
360
+ border: none;
361
+ border-radius: 0;
362
+ padding: 0;
363
+ background: none;
364
+ -webkit-tap-highlight-color: transparent;
365
+ color: inherit;
366
+ --sbb-text-font-size: var(--sbb-text-font-size-s);
367
+ font-family: var(--sbb-typo-font-family);
368
+ font-weight: normal;
369
+ line-height: var(--sbb-typo-line-height-text);
370
+ letter-spacing: var(--sbb-typo-letter-spacing-text);
371
+ font-size: var(--sbb-text-font-size);
372
+ height: var(--sbb-calendar-cell-size);
373
+ color: var(--sbb-calendar-cell-color);
374
+ cursor: var(--sbb-cursor-pointer);
375
+ position: relative;
376
+ z-index: 0;
377
+ }
378
+ .sbb-calendar__header-cell::before,
379
+ .sbb-calendar__cell::before {
380
+ content: "";
381
+ position: absolute;
382
+ inset: var(--sbb-calendar-cell-padding);
383
+ background-color: var(--sbb-calendar-cell-background-color);
384
+ border-radius: 50%;
385
+ z-index: -1;
386
+ transition-duration: var(--sbb-calendar-cell-transition-duration);
387
+ transition-timing-function: var(--sbb-calendar-cell-transition-easing-function);
388
+ transition-property: background-color;
389
+ }
390
+ @media (any-hover: hover) {
391
+ .sbb-calendar__header-cell:not(.sbb-calendar__selected, :active, :disabled):hover,
392
+ .sbb-calendar__cell:not(.sbb-calendar__selected, :active, :disabled):hover {
393
+ --sbb-calendar-cell-background-color: var(--sbb-background-color-3);
394
+ padding-block-end: var(--sbb-calendar-hover-shift);
395
+ }
396
+ }
397
+ @media (any-hover: hover) and (forced-colors: active) {
398
+ .sbb-calendar__header-cell:not(.sbb-calendar__selected, :active, :disabled):hover::before,
399
+ .sbb-calendar__cell:not(.sbb-calendar__selected, :active, :disabled):hover::before {
400
+ outline-offset: var(--sbb-focus-outline-offset);
401
+ outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);
402
+ --sbb-focus-outline-style: initial;
403
+ }
404
+ }
405
+ .sbb-calendar__header-cell:disabled,
406
+ .sbb-calendar__cell:disabled {
407
+ --sbb-calendar-cell-color: var(--sbb-calendar-cell-disabled-color);
408
+ cursor: unset;
409
+ }
410
+ .sbb-calendar__header-cell:focus-visible::before,
411
+ .sbb-calendar__cell:focus-visible::before {
412
+ outline-offset: var(--sbb-focus-outline-offset);
413
+ outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);
414
+ }
415
+ .sbb-calendar__header-cell:not(.sbb-calendar__selected, :disabled):active,
416
+ .sbb-calendar__cell:not(.sbb-calendar__selected, :disabled):active {
417
+ --sbb-calendar-cell-background-color: var(--sbb-background-color-4);
418
+ }
419
+ @media (forced-colors: active) {
420
+ .sbb-calendar__header-cell:not(.sbb-calendar__selected, :disabled):active::before,
421
+ .sbb-calendar__cell:not(.sbb-calendar__selected, :disabled):active::before {
422
+ outline-offset: var(--sbb-focus-outline-offset);
423
+ outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);
424
+ --sbb-focus-outline-style: initial;
425
+ }
426
+ }
427
+
428
+ .sbb-calendar__header-cell {
429
+ --sbb-text-font-size: var(--sbb-text-font-size-xs);
430
+ font-family: var(--sbb-typo-font-family);
431
+ font-weight: normal;
432
+ line-height: var(--sbb-typo-line-height-text);
433
+ letter-spacing: var(--sbb-typo-letter-spacing-text);
434
+ font-size: var(--sbb-text-font-size);
435
+ color: var(--sbb-calendar-header-color);
436
+ }
437
+
438
+ .sbb-calendar__weekday,
439
+ .sbb-calendar__day {
440
+ border-radius: 50%;
441
+ width: var(--sbb-calendar-cell-size);
442
+ }
443
+ .sbb-calendar__weekday::before,
444
+ .sbb-calendar__day::before {
445
+ border-radius: 50%;
446
+ }
447
+
448
+ .sbb-calendar__pill {
449
+ width: var(--sbb-calendar-wide-cell-size);
450
+ border-radius: var(--sbb-border-radius-infinity);
451
+ }
452
+ .sbb-calendar__pill::before {
453
+ border-radius: var(--sbb-border-radius-infinity);
454
+ }
455
+
456
+ .sbb-calendar__crossed-out::after {
457
+ content: "";
458
+ height: var(--sbb-calendar-cell-disabled-height);
459
+ width: var(--sbb-calendar-cell-disabled-width);
460
+ position: absolute;
461
+ background-color: var(--sbb-calendar-cell-disabled-color);
462
+ top: 50%;
463
+ left: 50%;
464
+ transform: translate(-50%, -50%) rotate(-45deg);
465
+ }
466
+
467
+ .sbb-calendar__cell-current {
468
+ --sbb-text-font-size: var(--sbb-text-font-size-s);
469
+ font-family: var(--sbb-typo-font-family);
470
+ font-weight: normal;
471
+ line-height: var(--sbb-typo-line-height-text);
472
+ letter-spacing: var(--sbb-typo-letter-spacing-text);
473
+ font-size: var(--sbb-text-font-size);
474
+ font-weight: bold;
475
+ }
476
+
477
+ .sbb-calendar__selected {
478
+ --sbb-calendar-cell-color: var(--sbb-calendar-cell-selected-color);
479
+ --sbb-calendar-cell-background-color: var(--sbb-calendar-cell-selected-background-color);
480
+ }
481
+ @media (forced-colors: active) {
482
+ .sbb-calendar__selected {
483
+ --sbb-calendar-cell-background-color: ButtonText !important;
484
+ }
485
+ }
486
+
487
+ @keyframes show {
488
+ from {
489
+ opacity: 0;
490
+ transform: translateY(var(--sbb-calendar-table-animation-shift));
491
+ }
492
+ to {
493
+ opacity: 1;
494
+ transform: translateY(0%);
495
+ }
496
+ }
497
+ @keyframes hide {
498
+ from {
499
+ opacity: 1;
500
+ transform: translateY(0%);
501
+ }
502
+ to {
503
+ opacity: 0;
504
+ transform: translateY(var(--sbb-calendar-table-animation-shift));
505
+ }
506
+ }`;
507
+ let SbbCalendarElement = (() => {
508
+ var _wide_accessor_storage, _view_accessor_storage, _min_accessor_storage, _max_accessor_storage, _multiple_accessor_storage, __selected_accessor_storage, _dateFilter_accessor_storage, _orientation_accessor_storage, _weekNumbers_accessor_storage, __activeDate_accessor_storage, __calendarView_accessor_storage, __initialized_accessor_storage, _a;
509
+ let _classDecorators = [customElement("sbb-calendar")];
510
+ let _classDescriptor;
511
+ let _classExtraInitializers = [];
512
+ let _classThis;
513
+ let _classSuper = SbbHydrationMixin(SbbElementInternalsMixin(LitElement));
514
+ let _instanceExtraInitializers = [];
515
+ let _wide_decorators;
516
+ let _wide_initializers = [];
517
+ let _wide_extraInitializers = [];
518
+ let _view_decorators;
519
+ let _view_initializers = [];
520
+ let _view_extraInitializers = [];
521
+ let _min_decorators;
522
+ let _min_initializers = [];
523
+ let _min_extraInitializers = [];
524
+ let _max_decorators;
525
+ let _max_initializers = [];
526
+ let _max_extraInitializers = [];
527
+ let _multiple_decorators;
528
+ let _multiple_initializers = [];
529
+ let _multiple_extraInitializers = [];
530
+ let _set_selected_decorators;
531
+ let __selected_decorators;
532
+ let __selected_initializers = [];
533
+ let __selected_extraInitializers = [];
534
+ let _dateFilter_decorators;
535
+ let _dateFilter_initializers = [];
536
+ let _dateFilter_extraInitializers = [];
537
+ let _orientation_decorators;
538
+ let _orientation_initializers = [];
539
+ let _orientation_extraInitializers = [];
540
+ let _weekNumbers_decorators;
541
+ let _weekNumbers_initializers = [];
542
+ let _weekNumbers_extraInitializers = [];
543
+ let __activeDate_decorators;
544
+ let __activeDate_initializers = [];
545
+ let __activeDate_extraInitializers = [];
546
+ let _set__wide_decorators;
547
+ let __calendarView_decorators;
548
+ let __calendarView_initializers = [];
549
+ let __calendarView_extraInitializers = [];
550
+ let __initialized_decorators;
551
+ let __initialized_initializers = [];
552
+ let __initialized_extraInitializers = [];
553
+ _a = class extends _classSuper {
554
+ constructor() {
555
+ super();
556
+ __privateAdd(this, _wide_accessor_storage);
557
+ __privateAdd(this, _view_accessor_storage);
558
+ __privateAdd(this, _min_accessor_storage);
559
+ __privateAdd(this, _max_accessor_storage);
560
+ __privateAdd(this, _multiple_accessor_storage);
561
+ __privateAdd(this, __selected_accessor_storage);
562
+ __privateAdd(this, _dateFilter_accessor_storage);
563
+ __privateAdd(this, _orientation_accessor_storage);
564
+ __privateAdd(this, _weekNumbers_accessor_storage);
565
+ __privateAdd(this, __activeDate_accessor_storage);
566
+ __privateAdd(this, __calendarView_accessor_storage);
567
+ __privateAdd(this, __initialized_accessor_storage);
568
+ __privateSet(this, _wide_accessor_storage, (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _wide_initializers, false)));
569
+ __privateSet(this, _view_accessor_storage, (__runInitializers(this, _wide_extraInitializers), __runInitializers(this, _view_initializers, "day")));
570
+ __privateSet(this, _min_accessor_storage, (__runInitializers(this, _view_extraInitializers), __runInitializers(this, _min_initializers, null)));
571
+ __privateSet(this, _max_accessor_storage, (__runInitializers(this, _min_extraInitializers), __runInitializers(this, _max_initializers, null)));
572
+ __privateSet(this, _multiple_accessor_storage, (__runInitializers(this, _max_extraInitializers), __runInitializers(this, _multiple_initializers, false)));
573
+ __privateSet(this, __selected_accessor_storage, (__runInitializers(this, _multiple_extraInitializers), __runInitializers(this, __selected_initializers, null)));
574
+ __privateSet(this, _dateFilter_accessor_storage, (__runInitializers(this, __selected_extraInitializers), __runInitializers(this, _dateFilter_initializers, null)));
575
+ __privateSet(this, _orientation_accessor_storage, (__runInitializers(this, _dateFilter_extraInitializers), __runInitializers(this, _orientation_initializers, "horizontal")));
576
+ __privateSet(this, _weekNumbers_accessor_storage, (__runInitializers(this, _orientation_extraInitializers), __runInitializers(this, _weekNumbers_initializers, false)));
577
+ this._dateAdapter = (__runInitializers(this, _weekNumbers_extraInitializers), readConfig().datetime?.dateAdapter ?? defaultDateAdapter);
578
+ __privateSet(this, __activeDate_accessor_storage, __runInitializers(this, __activeDate_initializers, this._dateAdapter.today()));
579
+ this._wideInternal = (__runInitializers(this, __activeDate_extraInitializers), false);
580
+ __privateSet(this, __calendarView_accessor_storage, __runInitializers(this, __calendarView_initializers, "day"));
581
+ this._nextCalendarView = (__runInitializers(this, __calendarView_extraInitializers), "day");
582
+ this._keyboardNavigationDayViewParameters = {
583
+ firstDayInView: null,
584
+ lastDayInView: null,
585
+ firstMonthOffset: 0,
586
+ firstMonthLength: 0,
587
+ secondMonthOffset: 0
588
+ };
589
+ this._weeks = [];
590
+ this._monthNames = this._dateAdapter.getMonthNames("long");
591
+ this._resetFocus = false;
592
+ this._containingFocus = false;
593
+ __privateSet(this, __initialized_accessor_storage, __runInitializers(this, __initialized_initializers, false));
594
+ this._language = (__runInitializers(this, __initialized_extraInitializers), new SbbLanguageController(this).withHandler(() => {
595
+ this._monthNames = this._dateAdapter.getMonthNames("long");
596
+ this._createMonthRows();
597
+ }));
598
+ this._mediaMatcher = new SbbMediaMatcherController(this, {
599
+ [SbbMediaQueryBreakpointLargeAndAbove]: () => this._init()
600
+ });
601
+ this._createMonthRows();
602
+ this._setWeekdays();
603
+ this.addEventListener("focusin", () => this._containingFocus = true);
604
+ this.addEventListener("focusout", () => this._containingFocus = false);
605
+ }
606
+ /** If set to true, two months are displayed */
607
+ get wide() {
608
+ return __privateGet(this, _wide_accessor_storage);
609
+ }
610
+ set wide(value) {
611
+ __privateSet(this, _wide_accessor_storage, value);
612
+ }
613
+ /** The initial view of the calendar which should be displayed on opening. */
614
+ get view() {
615
+ return __privateGet(this, _view_accessor_storage);
616
+ }
617
+ set view(value) {
618
+ __privateSet(this, _view_accessor_storage, value);
619
+ }
620
+ /**
621
+ * The minimum valid date. Accepts a date object or null.
622
+ * Accepts an ISO8601 formatted string (e.g. 2024-12-24) as attribute.
623
+ */
624
+ get min() {
625
+ return __privateGet(this, _min_accessor_storage);
626
+ }
627
+ set min(value) {
628
+ __privateSet(this, _min_accessor_storage, value);
629
+ }
630
+ /**
631
+ * The maximum valid date. Accepts a date object or null.
632
+ * Accepts an ISO8601 formatted string (e.g. 2024-12-24) as attribute.
633
+ */
634
+ get max() {
635
+ return __privateGet(this, _max_accessor_storage);
636
+ }
637
+ set max(value) {
638
+ __privateSet(this, _max_accessor_storage, value);
639
+ }
640
+ /** Whether the calendar allows for multiple date selection. */
641
+ get multiple() {
642
+ return __privateGet(this, _multiple_accessor_storage);
643
+ }
644
+ set multiple(value) {
645
+ __privateSet(this, _multiple_accessor_storage, value);
646
+ }
647
+ /**
648
+ * The selected date: accepts a date object, or, if `multiple`, an array of dates.
649
+ */
650
+ set selected(value) {
651
+ if (Array.isArray(value)) {
652
+ this._selected = value.map((dateLike) => this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(dateLike))).filter((date) => date !== null).filter((date) => !this._isDayInRange(this._dateAdapter.toIso8601(date)) || this._dateFilter(date));
653
+ } else {
654
+ const selectedDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
655
+ if (!!selectedDate && (!this._isDayInRange(this._dateAdapter.toIso8601(selectedDate)) || this._dateFilter(selectedDate))) {
656
+ this._selected = selectedDate;
657
+ } else {
658
+ this._selected = null;
659
+ }
660
+ }
661
+ }
662
+ get selected() {
663
+ return this._selected;
664
+ }
665
+ get _selected() {
666
+ return __privateGet(this, __selected_accessor_storage);
667
+ }
668
+ set _selected(value) {
669
+ __privateSet(this, __selected_accessor_storage, value);
670
+ }
671
+ /** A function used to filter out dates. */
672
+ get dateFilter() {
673
+ return __privateGet(this, _dateFilter_accessor_storage);
674
+ }
675
+ set dateFilter(value) {
676
+ __privateSet(this, _dateFilter_accessor_storage, value);
677
+ }
678
+ /** The orientation of days in the calendar. */
679
+ get orientation() {
680
+ return __privateGet(this, _orientation_accessor_storage);
681
+ }
682
+ set orientation(value) {
683
+ __privateSet(this, _orientation_accessor_storage, value);
684
+ }
685
+ /** Whether it has to display the week numbers in addition to week days. */
686
+ get weekNumbers() {
687
+ return __privateGet(this, _weekNumbers_accessor_storage);
688
+ }
689
+ set weekNumbers(value) {
690
+ __privateSet(this, _weekNumbers_accessor_storage, value);
691
+ }
692
+ /** The currently active date. */
693
+ get _activeDate() {
694
+ return __privateGet(this, __activeDate_accessor_storage);
695
+ }
696
+ set _activeDate(value) {
697
+ __privateSet(this, __activeDate_accessor_storage, value);
698
+ }
699
+ /** The current wide property considering property value and breakpoints. From zero to small `wide` has always to be false. */
700
+ set _wide(wide) {
701
+ this.toggleState("wide", wide);
702
+ this._wideInternal = wide;
703
+ }
704
+ get _wide() {
705
+ return this._wideInternal;
706
+ }
707
+ get _calendarView() {
708
+ return __privateGet(this, __calendarView_accessor_storage);
709
+ }
710
+ set _calendarView(value) {
711
+ __privateSet(this, __calendarView_accessor_storage, value);
712
+ }
713
+ /** A list of buttons corresponding to days, months or years depending on the view. */
714
+ get _cells() {
715
+ return Array.from(this.shadowRoot.querySelectorAll(".sbb-calendar__cell") ?? []);
716
+ }
717
+ get _initialized() {
718
+ return __privateGet(this, __initialized_accessor_storage);
719
+ }
720
+ set _initialized(value) {
721
+ __privateSet(this, __initialized_accessor_storage, value);
722
+ }
723
+ _dateFilter(date) {
724
+ return this.dateFilter?.(date) ?? true;
725
+ }
726
+ /** Resets the active month according to the new state of the calendar. */
727
+ resetPosition() {
728
+ this._resetCalendarView();
729
+ this._init();
730
+ }
731
+ connectedCallback() {
732
+ super.connectedCallback();
733
+ this.resetPosition();
734
+ }
735
+ /** @internal */
736
+ focus() {
737
+ this._resetFocus = true;
738
+ this._focusCell();
739
+ }
740
+ willUpdate(changedProperties) {
741
+ super.willUpdate(changedProperties);
742
+ if (!this._initialized) {
743
+ return;
744
+ }
745
+ if (changedProperties.has("wide") || changedProperties.has("orientation")) {
746
+ this.resetPosition();
747
+ }
748
+ if (changedProperties.has("view")) {
749
+ this._setChosenYear();
750
+ this._chosenMonth = void 0;
751
+ this._nextCalendarView = this._calendarView = this.view;
752
+ }
753
+ }
754
+ updated(changedProperties) {
755
+ super.updated(changedProperties);
756
+ this._setTabIndex();
757
+ this._focusCell();
758
+ }
759
+ /**
760
+ * The `_selected` state should be adapted when the `multiple` property changes:
761
+ * - if it changes to true, the '_selected' is set to an array;
762
+ * - if it changes to false, the first available option is set as 'value' otherwise it's set to null.
763
+ */
764
+ _onMultipleChanged(isMultiple) {
765
+ if (isMultiple && !Array.isArray(this._selected)) {
766
+ this._selected = this._selected ? [this._selected] : [];
767
+ }
768
+ if (!isMultiple && Array.isArray(this._selected)) {
769
+ this._selected = this._selected.length ? this._selected[0] : null;
770
+ }
771
+ }
772
+ /** Initializes the component. */
773
+ _init(activeDate) {
774
+ if (isServer) {
775
+ return;
776
+ } else if (this.hydrationRequired) {
777
+ this.hydrationComplete.then(() => this._init());
778
+ return;
779
+ }
780
+ if (activeDate) {
781
+ this._assignActiveDate(activeDate);
782
+ }
783
+ this._wide = (this._mediaMatcher.matches(SbbMediaQueryBreakpointLargeAndAbove) ?? false) && this.wide;
784
+ this._weeks = this._createWeekRows(this._activeDate);
785
+ this._years = this._createYearRows();
786
+ this._weekNumbers = this._createWeekNumbers(this._activeDate);
787
+ this._nextMonthWeeks = [[]];
788
+ this._nextMonthYears = [[]];
789
+ if (this._wide) {
790
+ const nextMonthDate = this._dateAdapter.addCalendarMonths(this._activeDate, 1);
791
+ this._nextMonthWeeks = this._createWeekRows(nextMonthDate, true);
792
+ this._nextMonthYears = this._createYearRows(YEARS_PER_PAGE);
793
+ this._nextMonthWeekNumbers = this._createWeekNumbers(nextMonthDate);
794
+ }
795
+ this._initialized = true;
796
+ }
797
+ /** Focuses on a day cell prioritizing the selected day, the current day, and lastly, the first selectable day. */
798
+ _focusCell() {
799
+ if (this._resetFocus) {
800
+ this._getFirstFocusable()?.focus();
801
+ this._resetFocus = false;
802
+ }
803
+ }
804
+ /** Creates the array of weekdays. */
805
+ _setWeekdays() {
806
+ const narrowWeekdays = this._dateAdapter.getDayOfWeekNames("narrow");
807
+ const longWeekdays = this._dateAdapter.getDayOfWeekNames("long");
808
+ const weekdays = longWeekdays.map((long, i) => ({
809
+ long,
810
+ narrow: narrowWeekdays[i]
811
+ }));
812
+ const firstDayOfWeek = this._dateAdapter.getFirstDayOfWeek();
813
+ this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
814
+ }
815
+ /**
816
+ * Given a date, it returns the week numbers for the month the date belongs to.
817
+ * TODO: check if date-fns can be replaced with custom logic.
818
+ *
819
+ * Since the calculation is not simple (see https://en.wikipedia.org/wiki/Week#Numbering),
820
+ * the date-fns library has been used this way:
821
+ * the first and the last day of the month are calculated and then passed to the `eachWeekOfInterval` function,
822
+ * which returns an array containing the starting day of every ISO week of the month,
823
+ * considering Monday as the first day.
824
+ * Then, this array is mapped via the `getWeek` function, which returns the ISO week number for that date.
825
+ */
826
+ _createWeekNumbers(date) {
827
+ return eachWeekOfInterval({ start: startOfMonth(date), end: endOfMonth(date) }, { weekStartsOn: 1 }).map((firstDayOfWeek) => getWeek(firstDayOfWeek, { weekStartsOn: 1, firstWeekContainsDate: 4 }));
828
+ }
829
+ /** Creates the rows along the horizontal direction and sets the parameters used in keyboard navigation. */
830
+ _createWeekRows(value, isSecondMonthInView = false) {
831
+ const dateNames = this._dateAdapter.getDateNames();
832
+ const daysInMonth = this._dateAdapter.getNumDaysInMonth(value);
833
+ const weekOffset = this._dateAdapter.getFirstWeekOffset(value);
834
+ if (!isSecondMonthInView) {
835
+ this._keyboardNavigationDayViewParameters.firstMonthLength = daysInMonth;
836
+ this._keyboardNavigationDayViewParameters.firstMonthOffset = weekOffset;
837
+ this._keyboardNavigationDayViewParameters.firstDayInView = this._dateAdapter.toIso8601(this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), 1));
838
+ this._keyboardNavigationDayViewParameters.lastDayInView = this._dateAdapter.toIso8601(this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), daysInMonth));
839
+ } else {
840
+ this._keyboardNavigationDayViewParameters.secondMonthOffset = weekOffset;
841
+ this._keyboardNavigationDayViewParameters.lastDayInView = this._dateAdapter.toIso8601(this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), daysInMonth));
842
+ }
843
+ return this.orientation === "horizontal" ? this._createWeekRowsHorizontal(value, dateNames, daysInMonth, weekOffset) : this._createWeekRowsVertical(value, dateNames, daysInMonth, weekOffset);
844
+ }
845
+ /**
846
+ * Creates the rows for each week in orientation='horizontal'.
847
+ *
848
+ * Iterates through the days of the months, creates a Day object for each and pushes it into and array.
849
+ * Each seven days (considering the offset at the beginning of the month) restarts from an empty array.
850
+ *
851
+ * The result is a matrix in which every row is a week (or part of it, considering offset).
852
+ */
853
+ _createWeekRowsHorizontal(value, dateNames, daysInMonth, weekOffset) {
854
+ const weeks = [[]];
855
+ for (let i = 0, cell = weekOffset; i < daysInMonth; i++, cell++) {
856
+ if (cell === DAYS_PER_ROW) {
857
+ weeks.push([]);
858
+ cell = 0;
859
+ }
860
+ const date = this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), i + 1);
861
+ const isoDate = this._dateAdapter.toIso8601(date);
862
+ weeks[weeks.length - 1].push({
863
+ value: isoDate,
864
+ dateValue: date,
865
+ dayValue: dateNames[i],
866
+ monthValue: String(this._dateAdapter.getMonth(date)),
867
+ yearValue: String(this._dateAdapter.getYear(date)),
868
+ weekValue: getWeek(isoDate, { weekStartsOn: 1, firstWeekContainsDate: 4 }),
869
+ weekDayValue: this._dateAdapter.getDayOfWeek(date)
870
+ });
871
+ }
872
+ return weeks;
873
+ }
874
+ /**
875
+ * Creates the rows for each week in orientation='vertical'.
876
+ *
877
+ * Creates a matrix with seven empty rows.
878
+ * Iterates through the days of the months, creates a Day object for each
879
+ * and pushes it into the correct array considering the offset at the beginning of the month.
880
+ * Each seven days (including offset) restarts from the first.
881
+ *
882
+ * The result is a matrix in which every row is a set of weekdays, so:
883
+ * - row 0: all the Mondays;
884
+ * - row 1: all the Tuesdays;
885
+ * - ...
886
+ * - row 7: all the Sundays.
887
+ */
888
+ _createWeekRowsVertical(value, dateNames, daysInMonth, weekOffset) {
889
+ const weeks = Array.from({ length: DAYS_PER_ROW }, () => []);
890
+ for (let i = 0, cell = weekOffset; i < daysInMonth; i++, cell++) {
891
+ if (cell === DAYS_PER_ROW) {
892
+ cell = 0;
893
+ }
894
+ const date = this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), i + 1);
895
+ const isoDate = this._dateAdapter.toIso8601(date);
896
+ weeks[cell].push({
897
+ value: isoDate,
898
+ dateValue: date,
899
+ dayValue: dateNames[i],
900
+ monthValue: String(this._dateAdapter.getMonth(date)),
901
+ yearValue: String(this._dateAdapter.getYear(date)),
902
+ weekValue: getWeek(isoDate, { weekStartsOn: 1, firstWeekContainsDate: 4 }),
903
+ weekDayValue: this._dateAdapter.getDayOfWeek(date)
904
+ });
905
+ }
906
+ return weeks;
907
+ }
908
+ /** Creates the rows for the month selection view. */
909
+ _createMonthRows() {
910
+ const shortNames = this._dateAdapter.getMonthNames("short");
911
+ const months = new Array(12).fill(null).map((_, i) => ({
912
+ value: shortNames[i],
913
+ longValue: this._monthNames[i],
914
+ monthValue: i + 1
915
+ }));
916
+ const rows = 12 / MONTHS_PER_ROW;
917
+ const monthArray = [];
918
+ for (let i = 0; i < rows; i++) {
919
+ monthArray.push(months.slice(MONTHS_PER_ROW * i, MONTHS_PER_ROW * (i + 1)));
920
+ }
921
+ this._months = monthArray;
922
+ }
923
+ /** Creates the rows for the year selection view. */
924
+ _createYearRows(offset = 0) {
925
+ const startValueYearView = this._getStartValueYearView();
926
+ const allYears = new Array(YEARS_PER_PAGE).fill(0).map((_, i) => startValueYearView + offset + i);
927
+ const rows = YEARS_PER_PAGE / YEARS_PER_ROW;
928
+ const yearArray = [];
929
+ for (let i = 0; i < rows; i++) {
930
+ yearArray.push(allYears.slice(YEARS_PER_ROW * i, YEARS_PER_ROW * (i + 1)));
931
+ }
932
+ return yearArray;
933
+ }
934
+ /**
935
+ * Calculates the first year that will be shown in the year selection panel.
936
+ * If `minDate` and `maxDate` are both null, the starting year is calculated as
937
+ * the multiple of YEARS_PER_PAGE closest to and less than activeDate,
938
+ * e.g., with `YEARS_PER_PAGE` = 24 and `activeDate` = 2020, the function will return 2016 (24 * 83),
939
+ * while with `activeDate` = 2000, the function will return 1992 (24 * 82).
940
+ * If `minDate` is not null, it returns the corresponding year; if `maxDate` is not null,
941
+ * it returns the corresponding year minus `YEARS_PER_PAGE`, so that the `maxDate` is the last rendered year.
942
+ * If both are not null, `maxDate` has priority over `minDate`.
943
+ */
944
+ _getStartValueYearView() {
945
+ let startingYear = 0;
946
+ if (this.max) {
947
+ startingYear = this._dateAdapter.getYear(this.max) - YEARS_PER_PAGE + 1;
948
+ } else if (this.min) {
949
+ startingYear = this._dateAdapter.getYear(this.min);
950
+ }
951
+ const activeYear = this._dateAdapter.getYear(this._activeDate);
952
+ return activeYear - ((activeYear - startingYear) % YEARS_PER_PAGE + YEARS_PER_PAGE) % YEARS_PER_PAGE;
953
+ }
954
+ /** Checks if date is within the min-max range. */
955
+ _isDayInRange(date) {
956
+ if (!this.min && !this.max) {
957
+ return true;
958
+ }
959
+ const isBeforeMin = this._dateAdapter.isValid(this.min) && this._dateAdapter.compareDate(this.min, this._dateAdapter.deserialize(date)) > 0;
960
+ const isAfterMax = this._dateAdapter.isValid(this.max) && this._dateAdapter.compareDate(this.max, this._dateAdapter.deserialize(date)) < 0;
961
+ return !(isBeforeMin || isAfterMax);
962
+ }
963
+ /** Checks if date is within the min-max range in month view. */
964
+ _isMonthInRange(month, year) {
965
+ if (!this.min && !this.max) {
966
+ return true;
967
+ }
968
+ const isBeforeMin = this._dateAdapter.isValid(this.min) && (year < this._dateAdapter.getYear(this.min) || year === this._dateAdapter.getYear(this.min) && month < this._dateAdapter.getMonth(this.min));
969
+ const isAfterMax = this._dateAdapter.isValid(this.max) && (year > this._dateAdapter.getYear(this.max) || year === this._dateAdapter.getYear(this.max) && month > this._dateAdapter.getMonth(this.max));
970
+ return !(isBeforeMin || isAfterMax);
971
+ }
972
+ /** Checks if date is within the min-max range in year view. */
973
+ _isYearInRange(year) {
974
+ if (!this.min && !this.max) {
975
+ return true;
976
+ }
977
+ const isBeforeMin = this._dateAdapter.isValid(this.min) && this._dateAdapter.getYear(this.min) > year;
978
+ const isAfterMax = this._dateAdapter.isValid(this.max) && this._dateAdapter.getYear(this.max) < year;
979
+ return !(isBeforeMin || isAfterMax);
980
+ }
981
+ // Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/year-view.ts#L366
982
+ _isMonthFilteredOut(month, year) {
983
+ if (!this.dateFilter) {
984
+ return true;
985
+ }
986
+ const firstOfMonth = this._dateAdapter.createDate(year, month, 1);
987
+ for (let date = firstOfMonth; this._dateAdapter.getMonth(date) == month; date = this._dateAdapter.addCalendarDays(date, 1)) {
988
+ if (this.dateFilter(date)) {
989
+ return true;
990
+ }
991
+ }
992
+ return false;
993
+ }
994
+ // Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/multi-year-view.ts#L351
995
+ _isYearFilteredOut(year) {
996
+ if (!this.dateFilter) {
997
+ return true;
998
+ }
999
+ const firstOfYear = this._dateAdapter.createDate(year, 1, 1);
1000
+ for (let date = firstOfYear; this._dateAdapter.getYear(date) == year; date = this._dateAdapter.addCalendarDays(date, 1)) {
1001
+ if (this.dateFilter(date)) {
1002
+ return true;
1003
+ }
1004
+ }
1005
+ return false;
1006
+ }
1007
+ /** Emits the selected date and sets it internally. */
1008
+ _selectDate(day) {
1009
+ this._chosenMonth = void 0;
1010
+ this._setChosenYear();
1011
+ if (this.multiple) {
1012
+ if (this._selected && this._selected.length > 0) {
1013
+ const indexOfSelectedDay = this._selected.findIndex((sel) => this._dateAdapter.compareDate(sel, day) === 0);
1014
+ if (indexOfSelectedDay !== -1) {
1015
+ this._selected = this._selected.filter((_, i) => i !== indexOfSelectedDay);
1016
+ } else {
1017
+ this._selected = [...this._selected, day];
1018
+ }
1019
+ } else {
1020
+ this._selected = [day];
1021
+ }
1022
+ this._emitDateSelectedEvent(this._selected.map((e) => this._dateAdapter.deserialize(e)));
1023
+ } else {
1024
+ if (!this._selected || this._dateAdapter.compareDate(this._selected, day) !== 0) {
1025
+ this._selected = day;
1026
+ this._emitDateSelectedEvent(this._dateAdapter.deserialize(day));
1027
+ }
1028
+ }
1029
+ }
1030
+ /**
1031
+ * Handle multiple dates selection via weekNumber / weekDay buttons:
1032
+ * - if Cmd or Ctrl are pressed, add the new date to the current ones;
1033
+ * - if not,
1034
+ * - if the new dates are the same of the current ones, it means that the same button has been clicked twice, so do nothing;
1035
+ * - if not, the selected dates are the new ones.
1036
+ */
1037
+ _selectMultipleDates(days) {
1038
+ const enabledDays = this._cells.filter((e) => !e.disabled).map((e) => e.value);
1039
+ const daysToAdd = days.map((e) => e.value).filter((isoDate) => enabledDays.includes(isoDate));
1040
+ const daysToAddSet = new Set(daysToAdd);
1041
+ const selectedSet = new Set(this._selected.map((s) => this._dateAdapter.toIso8601(s)));
1042
+ const selStrings = this._updateSelectedWithMultipleDates(daysToAdd, daysToAddSet, selectedSet);
1043
+ this._selected = selStrings.map((s) => this._dateAdapter.deserialize(s));
1044
+ this._emitDateSelectedEvent(this._selected.map((e) => this._dateAdapter.deserialize(e)));
1045
+ }
1046
+ /**
1047
+ * Emits the dateselected event given the detail (as T or T[] based on the value of the multiple flag).
1048
+ */
1049
+ _emitDateSelectedEvent(detail) {
1050
+ this.dispatchEvent(new CustomEvent("dateselected", {
1051
+ detail,
1052
+ composed: true,
1053
+ bubbles: true
1054
+ }));
1055
+ }
1056
+ /**
1057
+ * In case of multiple selection, newly added days must be added to the existing ones, without duplication.
1058
+ * If the days to add are exactly the same as the selected ones, the set must be emptied.
1059
+ */
1060
+ _updateSelectedWithMultipleDates(daysToAdd, daysToAddSet, selectedSet) {
1061
+ if (daysToAdd.every((day) => selectedSet.has(day))) {
1062
+ daysToAddSet.forEach((day) => selectedSet.delete(day));
1063
+ } else {
1064
+ daysToAddSet.forEach((day) => selectedSet.add(day));
1065
+ }
1066
+ return Array.from(selectedSet);
1067
+ }
1068
+ _setChosenYear() {
1069
+ if (this.view === "month") {
1070
+ let selectedDate;
1071
+ if (this.multiple) {
1072
+ selectedDate = this.selected.at(-1);
1073
+ } else {
1074
+ selectedDate = this.selected;
1075
+ }
1076
+ this._chosenYear = this._dateAdapter.getYear(selectedDate ?? this._dateAdapter.today());
1077
+ } else {
1078
+ this._chosenYear = void 0;
1079
+ }
1080
+ }
1081
+ _assignActiveDate(date) {
1082
+ if (this.min && this._dateAdapter.compareDate(this.min, date) > 0) {
1083
+ this._activeDate = this.min;
1084
+ return;
1085
+ }
1086
+ if (this.max && this._dateAdapter.compareDate(this.max, date) < 0) {
1087
+ this._activeDate = this.max;
1088
+ return;
1089
+ }
1090
+ this._activeDate = date;
1091
+ }
1092
+ /** Goes to the month identified by the shift. */
1093
+ _goToDifferentMonth(months) {
1094
+ this._init(this._dateAdapter.addCalendarMonths(this._activeDate, months));
1095
+ }
1096
+ _goToDifferentYear(years) {
1097
+ this._chosenYear += years;
1098
+ this._activeDate = this._dateAdapter.createDate(this._chosenYear, this._dateAdapter.getMonth(this._activeDate), this._dateAdapter.getDate(this._activeDate));
1099
+ this._init();
1100
+ }
1101
+ _goToDifferentYearRange(years) {
1102
+ this._init(this._dateAdapter.addCalendarYears(this._activeDate, years));
1103
+ }
1104
+ _prevDisabled(prevDate) {
1105
+ if (!this.min) {
1106
+ return false;
1107
+ }
1108
+ return this._dateAdapter.compareDate(prevDate, this.min) < 0;
1109
+ }
1110
+ _nextDisabled(nextDate) {
1111
+ if (!this.max) {
1112
+ return false;
1113
+ }
1114
+ return this._dateAdapter.compareDate(nextDate, this.max) > 0;
1115
+ }
1116
+ /** Checks if the "previous month" button should be disabled. */
1117
+ _previousMonthDisabled() {
1118
+ const prevMonth = this._dateAdapter.addCalendarDays(this._activeDate, this._dateAdapter.getDate(this._activeDate) * -1);
1119
+ return this._prevDisabled(prevMonth);
1120
+ }
1121
+ /** Checks if the "next month" button should be disabled. */
1122
+ _nextMonthDisabled() {
1123
+ let nextMonth = this._dateAdapter.addCalendarMonths(this._activeDate, this._wide ? 2 : 1);
1124
+ nextMonth = this._dateAdapter.createDate(this._dateAdapter.getYear(nextMonth), this._dateAdapter.getMonth(nextMonth), 1);
1125
+ return this._nextDisabled(nextMonth);
1126
+ }
1127
+ /** Checks if the "previous year" button should be disabled. */
1128
+ _previousYearDisabled() {
1129
+ const prevYear = this._dateAdapter.createDate(this._dateAdapter.getYear(this._activeDate) - 1, 12, 31);
1130
+ return this._prevDisabled(prevYear);
1131
+ }
1132
+ /** Checks if the "next year" button should be disabled. */
1133
+ _nextYearDisabled() {
1134
+ const nextYear = this._dateAdapter.createDate(this._dateAdapter.getYear(this._activeDate) + (this._wide ? 2 : 1), 1, 1);
1135
+ return this._nextDisabled(nextYear);
1136
+ }
1137
+ /** Checks if the "previous year" button should be disabled in year view. */
1138
+ _previousYearRangeDisabled() {
1139
+ const prevYear = this._dateAdapter.createDate(this._years[0][0] - 1, 12, 31);
1140
+ return this._prevDisabled(prevYear);
1141
+ }
1142
+ /** Checks if the "next year" button should be disabled in year view. */
1143
+ _nextYearRangeDisabled() {
1144
+ const years = this._wide ? this._nextMonthYears : this._years;
1145
+ const lastYearRange = years[years.length - 1];
1146
+ const lastYear = lastYearRange[lastYearRange.length - 1];
1147
+ const nextYear = this._dateAdapter.createDate(lastYear + 1, 1, 1);
1148
+ return this._nextDisabled(nextYear);
1149
+ }
1150
+ _handleTableBlur(eventTarget) {
1151
+ if (eventTarget?.localName !== "button") {
1152
+ this._setTabIndex();
1153
+ }
1154
+ }
1155
+ _setTabIndex() {
1156
+ Array.from(this.shadowRoot.querySelectorAll('.sbb-calendar__cell[tabindex="0"]') ?? []).forEach((day) => day.tabIndex = -1);
1157
+ const firstFocusable = this._getFirstFocusable();
1158
+ if (firstFocusable) {
1159
+ firstFocusable.tabIndex = 0;
1160
+ }
1161
+ }
1162
+ /** Get the element in the calendar to assign focus. */
1163
+ _getFirstFocusable() {
1164
+ const selectedOrCurrent = this.shadowRoot.querySelector(".sbb-calendar__selected") ?? this.shadowRoot.querySelector(".sbb-calendar__cell-current");
1165
+ return selectedOrCurrent && !selectedOrCurrent.disabled ? selectedOrCurrent : this._calendarView === "day" ? this._getFirstFocusableDay() : this.shadowRoot.querySelector(".sbb-calendar__cell:not([disabled])");
1166
+ }
1167
+ /**
1168
+ * In `day` view in `vertical` orientation,
1169
+ * if the first of the month is not a Monday, it is not the first rendered element in the table,
1170
+ * so `this.shadowRoot!.querySelector('.sbb-calendar__cell:not([disabled])')` will return a wrong value.
1171
+ *
1172
+ * To solve this, the element with the lowest `value` is taken (ISO String are ordered).
1173
+ */
1174
+ _getFirstFocusableDay() {
1175
+ const daysInView = Array.from(this.shadowRoot.querySelectorAll(".sbb-calendar__cell:not([disabled])"));
1176
+ if (!daysInView || daysInView.length === 0) {
1177
+ return null;
1178
+ } else {
1179
+ const firstElement = daysInView.map((e) => e.value).sort()[0];
1180
+ return this.shadowRoot.querySelector(`.sbb-calendar__cell[value="${firstElement}"]`);
1181
+ }
1182
+ }
1183
+ _handleKeyboardEvent(event, day) {
1184
+ if (isArrowKeyOrPageKeysPressed(event)) {
1185
+ event.preventDefault();
1186
+ }
1187
+ const cells = this._cells;
1188
+ const index = cells.findIndex((e) => e === event.target);
1189
+ let nextEl;
1190
+ if (day) {
1191
+ nextEl = this._navigateByKeyboardDayView(event, index, cells, day);
1192
+ } else {
1193
+ nextEl = this._navigateByKeyboard(event, index, cells);
1194
+ }
1195
+ const activeEl = this.shadowRoot.activeElement;
1196
+ if (nextEl !== activeEl) {
1197
+ nextEl.tabIndex = 0;
1198
+ nextEl?.focus();
1199
+ activeEl.tabIndex = -1;
1200
+ }
1201
+ }
1202
+ _navigateByKeyboardDayView(evt, index, cells, day) {
1203
+ const arrowsOffset = this.orientation === "horizontal" ? { leftRight: 1, upDown: DAYS_PER_ROW } : { leftRight: DAYS_PER_ROW, upDown: 1 };
1204
+ const offsetForVertical = index < this._keyboardNavigationDayViewParameters.firstMonthLength ? this._keyboardNavigationDayViewParameters.firstMonthOffset : this._keyboardNavigationDayViewParameters.secondMonthOffset;
1205
+ switch (evt.key) {
1206
+ case "ArrowUp":
1207
+ return this._findDayArrows(cells, index, day.dateValue, -arrowsOffset.upDown);
1208
+ case "ArrowDown":
1209
+ return this._findDayArrows(cells, index, day.dateValue, arrowsOffset.upDown);
1210
+ case "ArrowLeft":
1211
+ return this._findDayArrows(cells, index, day.dateValue, -arrowsOffset.leftRight);
1212
+ case "ArrowRight":
1213
+ return this._findDayArrows(cells, index, day.dateValue, arrowsOffset.leftRight);
1214
+ case "PageUp": {
1215
+ if (this.orientation === "horizontal") {
1216
+ const firstOfWeek = +day.dayValue % DAYS_PER_ROW || DAYS_PER_ROW;
1217
+ const delta = firstOfWeek - +day.dayValue;
1218
+ return this._findDayPageUpDown(cells, index, day, delta, arrowsOffset.upDown);
1219
+ } else {
1220
+ const weekNumber = Math.ceil((+day.dayValue + offsetForVertical) / DAYS_PER_ROW);
1221
+ const firstOfWeek = (weekNumber - 1) * DAYS_PER_ROW - offsetForVertical + 1;
1222
+ const delta = firstOfWeek - +day.dayValue;
1223
+ return this._findDayPageUpDown(cells, index, day, delta, arrowsOffset.upDown);
1224
+ }
1225
+ }
1226
+ case "PageDown": {
1227
+ if (this.orientation === "horizontal") {
1228
+ const monthInBounds = +day.monthValue + 1 > 12 ? 1 : +day.monthValue + 1;
1229
+ const yearInBounds = +day.monthValue + 1 > 12 ? +day.yearValue + 1 : +day.yearValue;
1230
+ const firstNextMonth = this._dateAdapter.createDate(yearInBounds, monthInBounds, 1);
1231
+ const lastOfMonth = this._dateAdapter.getDate(this._dateAdapter.addCalendarDays(firstNextMonth, -1));
1232
+ const delta = Math.trunc((lastOfMonth - +day.dayValue) / DAYS_PER_ROW) * DAYS_PER_ROW;
1233
+ return this._findDayPageUpDown(cells, index, day, delta, -arrowsOffset.upDown);
1234
+ } else {
1235
+ const weekNumber = Math.ceil((+day.dayValue + offsetForVertical) / DAYS_PER_ROW);
1236
+ const lastOfWeek = weekNumber * DAYS_PER_ROW - offsetForVertical;
1237
+ const delta = lastOfWeek - +day.dayValue;
1238
+ return this._findDayPageUpDown(cells, index, day, delta, -arrowsOffset.upDown);
1239
+ }
1240
+ }
1241
+ case "Home": {
1242
+ return this._findDayFirst(cells, index, day, 1);
1243
+ }
1244
+ case "End": {
1245
+ const monthInBounds = +day.monthValue + 1 > 12 ? 1 : +day.monthValue + 1;
1246
+ const yearInBounds = +day.monthValue + 1 > 12 ? +day.yearValue + 1 : +day.yearValue;
1247
+ const firstNextMonth = this._dateAdapter.createDate(yearInBounds, monthInBounds, 1);
1248
+ return this._findDayLast(cells, index, firstNextMonth);
1249
+ }
1250
+ default:
1251
+ return cells[index];
1252
+ }
1253
+ }
1254
+ _isDayOutOfView(date) {
1255
+ return date < this._keyboardNavigationDayViewParameters.firstDayInView || date > this._keyboardNavigationDayViewParameters.lastDayInView;
1256
+ }
1257
+ _findDayArrows(cells, index, date, delta) {
1258
+ const newDateValue = this._dateAdapter.toIso8601(this._dateAdapter.addCalendarDays(date, delta));
1259
+ if (this._isDayOutOfView(newDateValue)) {
1260
+ return cells[index];
1261
+ }
1262
+ const nextCell = cells.find((e) => e.value === newDateValue);
1263
+ if (!nextCell || nextCell.disabled) {
1264
+ return this._findDayArrows(cells, index, this._dateAdapter.deserialize(newDateValue), delta);
1265
+ }
1266
+ return nextCell;
1267
+ }
1268
+ _findDayPageUpDown(cells, index, day, delta, deltaIfDisabled) {
1269
+ const newDateValue = this._dateAdapter.toIso8601(this._dateAdapter.addCalendarDays(day.dateValue, delta));
1270
+ if (this._isDayOutOfView(newDateValue)) {
1271
+ return cells[index];
1272
+ }
1273
+ const nextCell = cells.find((e) => e.value === newDateValue);
1274
+ if (!nextCell || nextCell.disabled) {
1275
+ return this._findDayPageUpDown(cells, index, day, delta + deltaIfDisabled, deltaIfDisabled);
1276
+ }
1277
+ return nextCell;
1278
+ }
1279
+ _findDayFirst(cells, index, day, date) {
1280
+ const newDateValue = this._dateAdapter.toIso8601(this._dateAdapter.createDate(+day.yearValue, +day.monthValue, date));
1281
+ if (this._isDayOutOfView(newDateValue)) {
1282
+ return cells[index];
1283
+ }
1284
+ const nextCell = cells.find((e) => e.value === newDateValue);
1285
+ if (!nextCell || nextCell.disabled) {
1286
+ return this._findDayFirst(cells, index, day, date + 1);
1287
+ }
1288
+ return nextCell;
1289
+ }
1290
+ _findDayLast(cells, index, firstNextMonth) {
1291
+ const newDateValue = this._dateAdapter.toIso8601(this._dateAdapter.addCalendarDays(firstNextMonth, -1));
1292
+ if (this._isDayOutOfView(newDateValue)) {
1293
+ return cells[index];
1294
+ }
1295
+ const nextCell = cells.find((e) => e.value === newDateValue);
1296
+ if (!nextCell || nextCell.disabled) {
1297
+ return this._findDayLast(cells, index, this._dateAdapter.deserialize(newDateValue));
1298
+ }
1299
+ return nextCell;
1300
+ }
1301
+ /**
1302
+ * Gets the index of the element to move to, based on a list of elements (which can be potentially disabled),
1303
+ * the keyboard input and the position of the current element in the list.
1304
+ * In the day view, the `day?: Day` parameter is mandatory for calculation,
1305
+ * while in month and year view it's not due to the fixed amount of rendered cells.
1306
+ */
1307
+ _navigateByKeyboard(evt, index, cells) {
1308
+ const { elementIndexForWideMode, offsetForWideMode, lastElementIndexForWideMode, verticalOffset } = this._calculateParametersForKeyboardNavigation(index, this._calendarView === "year");
1309
+ switch (evt.key) {
1310
+ case "ArrowUp":
1311
+ return this._findNext(cells, index, -verticalOffset);
1312
+ case "ArrowDown":
1313
+ return this._findNext(cells, index, verticalOffset);
1314
+ case "ArrowLeft":
1315
+ return this._findNext(cells, index, -1);
1316
+ case "ArrowRight":
1317
+ return this._findNext(cells, index, 1);
1318
+ case "Home":
1319
+ return this._findFirst(cells, offsetForWideMode);
1320
+ case "PageUp":
1321
+ return this._findFirstOnColumn(cells, elementIndexForWideMode, offsetForWideMode, verticalOffset);
1322
+ case "PageDown":
1323
+ return this._findLastOnColumn(cells, index, lastElementIndexForWideMode, verticalOffset);
1324
+ case "End":
1325
+ return this._findLast(cells, lastElementIndexForWideMode - 1);
1326
+ default:
1327
+ return cells[index];
1328
+ }
1329
+ }
1330
+ /**
1331
+ * Calculates the parameters needed in keyboard navigation in year and month view.
1332
+ * @param index The starting element's index in the cell array.
1333
+ * @param isYearView Whether the displayed `view` is the year one.
1334
+ */
1335
+ _calculateParametersForKeyboardNavigation(index, isYearView) {
1336
+ const elementsPerPage = isYearView ? YEARS_PER_PAGE : MONTHS_PER_PAGE;
1337
+ const offset = Math.trunc(index / elementsPerPage) * elementsPerPage;
1338
+ const indexInView = offset === 0 ? index : index - elementsPerPage;
1339
+ return {
1340
+ verticalOffset: isYearView ? YEARS_PER_ROW : MONTHS_PER_ROW,
1341
+ elementIndexForWideMode: indexInView,
1342
+ offsetForWideMode: index - indexInView,
1343
+ lastElementIndexForWideMode: offset === 0 ? elementsPerPage : elementsPerPage * 2
1344
+ };
1345
+ }
1346
+ /**
1347
+ * Gets the next element of the provided array starting from `index` by adding `delta`.
1348
+ * If the found element is disabled, it continues adding `delta` until it finds an enabled one in the array bounds.
1349
+ */
1350
+ _findNext(days, index, delta) {
1351
+ let nextIndex = index + delta;
1352
+ while (nextIndex < days.length && days[nextIndex]?.disabled) {
1353
+ nextIndex += delta;
1354
+ }
1355
+ return days[nextIndex] ?? days[index];
1356
+ }
1357
+ /** Find the first enabled element in the provided array. */
1358
+ _findFirst(days, firstOfCurrentMonth) {
1359
+ return !days[firstOfCurrentMonth].disabled ? days[firstOfCurrentMonth] : this._findNext(days, firstOfCurrentMonth, 1);
1360
+ }
1361
+ /** Find the last enabled element in the provided array. */
1362
+ _findLast(days, lastOfCurrentMonth) {
1363
+ return !days[lastOfCurrentMonth].disabled ? days[lastOfCurrentMonth] : this._findNext(days, lastOfCurrentMonth, -1);
1364
+ }
1365
+ /** Find the first enabled element in the same column of the provided array. */
1366
+ _findFirstOnColumn(days, index, offset, verticalOffset) {
1367
+ const nextIndex = index % verticalOffset + offset;
1368
+ return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, verticalOffset);
1369
+ }
1370
+ /** Find the last enabled element in the same column of the provided array. */
1371
+ _findLastOnColumn(days, index, offset, verticalOffset) {
1372
+ const nextIndex = index + Math.trunc((offset - index - 1) / verticalOffset) * verticalOffset;
1373
+ return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, -verticalOffset);
1374
+ }
1375
+ _resetCalendarView(initTransition = false) {
1376
+ if (this._containingFocus) {
1377
+ this._resetFocus = true;
1378
+ }
1379
+ this._activeDate = (this.multiple ? this._selected.at(-1) : this._selected) ?? this._dateAdapter.today();
1380
+ this._setChosenYear();
1381
+ this._chosenMonth = void 0;
1382
+ this._init();
1383
+ this._nextCalendarView = this._calendarView = this.view;
1384
+ if (initTransition) {
1385
+ this._startTableTransition();
1386
+ }
1387
+ }
1388
+ /** Render the view for the day selection. */
1389
+ _renderDayView() {
1390
+ const nextMonthActiveDate = this._wide ? this._dateAdapter.addCalendarMonths(this._activeDate, 1) : void 0;
1391
+ return html`
1392
+ <div class="sbb-calendar__controls">
1393
+ ${this._getArrow("left", () => this._goToDifferentMonth(-1), i18nPreviousMonth[this._language.current], this._previousMonthDisabled())}
1394
+ <div class="sbb-calendar__controls-month">
1395
+ ${this._createLabelForDayView(this._activeDate)}
1396
+ ${this._wide ? this._createLabelForDayView(nextMonthActiveDate) : nothing}
1397
+ <sbb-screen-reader-only role="status">
1398
+ ${this._createAriaLabelForDayView(this._activeDate, nextMonthActiveDate)}
1399
+ </sbb-screen-reader-only>
1400
+ </div>
1401
+ ${this._getArrow("right", () => this._goToDifferentMonth(1), i18nNextMonth[this._language.current], this._nextMonthDisabled())}
1402
+ </div>
1403
+ <div class="sbb-calendar__table-overflow-break">
1404
+ <div class="sbb-calendar__table-container sbb-calendar__table-day-view">
1405
+ ${this.orientation === "horizontal" ? html`
1406
+ ${this._createDayTable(this._weeks, this._weekNumbers)}
1407
+ ${this._wide ? this._createDayTable(this._nextMonthWeeks, this._nextMonthWeekNumbers, true) : nothing}
1408
+ ` : html`
1409
+ ${this._createDayTableVertical(this._weeks, this._weekNumbers)}
1410
+ ${this._wide ? this._createDayTableVertical(this._nextMonthWeeks, this._nextMonthWeekNumbers, nextMonthActiveDate) : nothing}
1411
+ `}
1412
+ </div>
1413
+ </div>
1414
+ `;
1415
+ }
1416
+ /** Creates the label with the month for the daily view. */
1417
+ _createLabelForDayView(d) {
1418
+ const monthLabel = `${this._monthNames[this._dateAdapter.getMonth(d) - 1]} ${this._dateAdapter.getYear(d)}`;
1419
+ return html`
1420
+ <button
1421
+ type="button"
1422
+ class="sbb-calendar__date-selection sbb-calendar__controls-change-date"
1423
+ aria-label="${i18nYearMonthSelection[this._language.current]} ${monthLabel}"
1424
+ @click=${() => {
1425
+ this._resetFocus = true;
1426
+ this._nextCalendarView = "year";
1427
+ this._startTableTransition();
1428
+ }}
1429
+ >
1430
+ ${monthLabel}
1431
+ <sbb-icon name="chevron-small-down-small"></sbb-icon>
1432
+ </button>
1433
+ `;
1434
+ }
1435
+ /** Creates the aria-label for the daily view. */
1436
+ _createAriaLabelForDayView(...dates) {
1437
+ let monthLabel = "";
1438
+ for (const d of dates) {
1439
+ if (d) {
1440
+ monthLabel += `${this._monthNames[this._dateAdapter.getMonth(d) - 1]} ${this._dateAdapter.getYear(d)} `;
1441
+ }
1442
+ }
1443
+ return monthLabel;
1444
+ }
1445
+ /** Creates the calendar table for the daily view. */
1446
+ _createDayTable(weeks, weekNumbers, isWideNextMonth = false) {
1447
+ const today = this._dateAdapter.toIso8601(this._dateAdapter.today());
1448
+ const weeksForSelectMultipleWeekNumbers = (this._wide ? [...this._weeks, ...this._nextMonthWeeks] : isWideNextMonth ? this._nextMonthWeeks : this._weeks).flat();
1449
+ const weeksForSelectMultipleWeekDays = (isWideNextMonth ? this._nextMonthWeeks : this._weeks).flat();
1450
+ return html`
1451
+ <table
1452
+ class="sbb-calendar__table"
1453
+ @focusout=${(event) => this._handleTableBlur(event.relatedTarget)}
1454
+ @animationend=${(e) => this._tableAnimationEnd(e)}
1455
+ >
1456
+ <thead class="sbb-calendar__table-header">
1457
+ <tr>
1458
+ ${this.weekNumbers ? html`<th class="sbb-calendar__table-header-cell"></th>` : nothing}
1459
+ ${this._weekdays.map((day, index) => html`
1460
+ <th class="sbb-calendar__table-header-cell">
1461
+ ${this.multiple ? html`
1462
+ <button
1463
+ class="sbb-calendar__header-cell sbb-calendar__weekday"
1464
+ aria-label=${day.long}
1465
+ @click=${() => {
1466
+ const days = weeksForSelectMultipleWeekDays.filter((day2) => day2.weekDayValue === (index + 1) % 7);
1467
+ this._selectMultipleDates(days);
1468
+ }}
1469
+ >
1470
+ ${day.narrow}
1471
+ </button>
1472
+ ` : html`
1473
+ <sbb-screen-reader-only>${day.long}</sbb-screen-reader-only>
1474
+ <span aria-hidden="true">${day.narrow}</span>
1475
+ `}
1476
+ </th>
1477
+ `)}
1478
+ </tr>
1479
+ </thead>
1480
+ <tbody class="sbb-calendar__table-body">
1481
+ ${weeks.map((week, rowIndex) => {
1482
+ const firstRowOffset = DAYS_PER_ROW - week.length;
1483
+ if (rowIndex === 0 && firstRowOffset) {
1484
+ return html`
1485
+ <tr>
1486
+ ${this.weekNumbers ? html`
1487
+ <td class="sbb-calendar__table-header-cell">
1488
+ ${this.multiple ? html`
1489
+ <button
1490
+ class="sbb-calendar__header-cell sbb-calendar__weekday"
1491
+ aria-label=${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumbers[0]}`}
1492
+ @click=${() => {
1493
+ const days = weeksForSelectMultipleWeekNumbers.filter((day) => day.weekValue === weekNumbers[0]);
1494
+ this._selectMultipleDates(days);
1495
+ }}
1496
+ >
1497
+ ${weekNumbers[0]}
1498
+ </button>
1499
+ ` : html`
1500
+ <sbb-screen-reader-only
1501
+ >${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumbers[0]}`}</sbb-screen-reader-only
1502
+ >
1503
+ <span aria-hidden="true">${weekNumbers[0]}</span>
1504
+ `}
1505
+ </td>
1506
+ ` : nothing}
1507
+ ${[...Array(firstRowOffset).keys()].map(() => html`<td class="sbb-calendar__table-data"></td>`)}
1508
+ ${this._createDayCells(week, today)}
1509
+ </tr>
1510
+ `;
1511
+ }
1512
+ return html`
1513
+ <tr>
1514
+ ${this.weekNumbers ? html`
1515
+ <td class="sbb-calendar__table-header-cell">
1516
+ ${this.multiple ? html`
1517
+ <button
1518
+ class="sbb-calendar__header-cell sbb-calendar__weekday"
1519
+ aria-label=${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumbers[rowIndex]}`}
1520
+ @click=${() => {
1521
+ const days = weeksForSelectMultipleWeekNumbers.filter((day) => day.weekValue === weekNumbers[rowIndex]);
1522
+ this._selectMultipleDates(days);
1523
+ }}
1524
+ >
1525
+ ${weekNumbers[rowIndex]}
1526
+ </button>
1527
+ ` : html`
1528
+ <sbb-screen-reader-only
1529
+ >${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumbers[rowIndex]}`}</sbb-screen-reader-only
1530
+ >
1531
+ <span aria-hidden="true">${weekNumbers[rowIndex]}</span>
1532
+ `}
1533
+ </td>
1534
+ ` : nothing}
1535
+ ${this._createDayCells(week, today)}
1536
+ </tr>
1537
+ `;
1538
+ })}
1539
+ </tbody>
1540
+ </table>
1541
+ `;
1542
+ }
1543
+ /** Creates the table in orientation='vertical'. */
1544
+ _createDayTableVertical(weeks, weekNumbers, nextMonthActiveDate) {
1545
+ const today = this._dateAdapter.toIso8601(this._dateAdapter.today());
1546
+ const weekOffset = this._dateAdapter.getFirstWeekOffset(nextMonthActiveDate ?? this._activeDate);
1547
+ const weeksForSelectMultipleWeekNumbers = (this._wide ? [...this._weeks, ...this._nextMonthWeeks] : nextMonthActiveDate ? this._nextMonthWeeks : this._weeks).flat();
1548
+ return html`
1549
+ <table
1550
+ class="sbb-calendar__table"
1551
+ @focusout=${(event) => this._handleTableBlur(event.relatedTarget)}
1552
+ @animationend=${(e) => this._tableAnimationEnd(e)}
1553
+ >
1554
+ ${this.weekNumbers ? html`
1555
+ <thead class="sbb-calendar__table-header">
1556
+ <tr>
1557
+ ${nextMonthActiveDate ? nothing : html`<th class="sbb-calendar__table-data"></th>`}
1558
+ ${weekNumbers.map((weekNumber) => html`
1559
+ <th class="sbb-calendar__table-header-cell">
1560
+ ${this.multiple ? html`
1561
+ <button
1562
+ class="sbb-calendar__header-cell sbb-calendar__weekday"
1563
+ aria-label=${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumber}`}
1564
+ @click=${() => {
1565
+ const days = weeksForSelectMultipleWeekNumbers.filter((day) => day.weekValue === weekNumber);
1566
+ this._selectMultipleDates(days);
1567
+ }}
1568
+ >
1569
+ ${weekNumber}
1570
+ </button>
1571
+ ` : html`
1572
+ <sbb-screen-reader-only
1573
+ >${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumber}`}</sbb-screen-reader-only
1574
+ >
1575
+ <span aria-hidden="true">${weekNumber}</span>
1576
+ `}
1577
+ </th>
1578
+ `)}
1579
+ </tr>
1580
+ </thead>
1581
+ ` : nothing}
1582
+ <tbody class="sbb-calendar__table-body">
1583
+ ${weeks.map((week, rowIndex) => {
1584
+ const weekday = this._weekdays[rowIndex];
1585
+ const selectableDays = this._wide ? [...week, ...this._nextMonthWeeks[rowIndex]] : week;
1586
+ return html`
1587
+ <tr>
1588
+ ${nextMonthActiveDate ? nothing : html`
1589
+ <td class="sbb-calendar__table-header-cell">
1590
+ ${this.multiple ? html`
1591
+ <button
1592
+ class="sbb-calendar__header-cell sbb-calendar__weekday"
1593
+ aria-label=${weekday.long}
1594
+ @click=${() => this._selectMultipleDates(selectableDays)}
1595
+ >
1596
+ ${weekday.narrow}
1597
+ </button>
1598
+ ` : html`
1599
+ <sbb-screen-reader-only>${weekday.long}</sbb-screen-reader-only>
1600
+ <span aria-hidden="true">${weekday.narrow}</span>
1601
+ `}
1602
+ </td>
1603
+ `}
1604
+ ${rowIndex < weekOffset ? html`<td class="sbb-calendar__table-data"></td>` : nothing}
1605
+ ${this._createDayCells(week, today)}
1606
+ </tr>
1607
+ `;
1608
+ })}
1609
+ </tbody>
1610
+ </table>
1611
+ `;
1612
+ }
1613
+ /** Creates the cells for the daily view. */
1614
+ _createDayCells(week, today) {
1615
+ return week.map((day) => {
1616
+ const isOutOfRange = !this._isDayInRange(day.value);
1617
+ const isFilteredOut = !this._dateFilter(this._dateAdapter.deserialize(day.value));
1618
+ const isToday = day.value === today;
1619
+ let selected;
1620
+ if (this.multiple) {
1621
+ selected = this._selected.find((selDay) => this._dateAdapter.compareDate(day.dateValue, selDay) === 0) !== void 0;
1622
+ } else {
1623
+ selected = !!this._selected && this._dateAdapter.compareDate(day.dateValue, this._selected) === 0;
1624
+ }
1625
+ return html`
1626
+ <td
1627
+ class=${classMap({
1628
+ "sbb-calendar__table-data": true,
1629
+ "sbb-calendar__table-data-selected": selected
1630
+ })}
1631
+ >
1632
+ <button
1633
+ class=${classMap({
1634
+ "sbb-calendar__cell": true,
1635
+ "sbb-calendar__day": true,
1636
+ "sbb-calendar__cell-current": isToday,
1637
+ "sbb-calendar__selected": selected,
1638
+ "sbb-calendar__crossed-out": !isOutOfRange && isFilteredOut
1639
+ })}
1640
+ @click=${() => this._selectDate(day.dateValue)}
1641
+ ?disabled=${isOutOfRange || isFilteredOut}
1642
+ value=${day.value}
1643
+ type="button"
1644
+ aria-label=${this._dateAdapter.getAccessibilityFormatDate(day.value)}
1645
+ aria-pressed=${selected}
1646
+ aria-disabled=${isOutOfRange || isFilteredOut}
1647
+ aria-current=${isToday ? "date" : nothing}
1648
+ tabindex="-1"
1649
+ @keydown=${(evt) => this._handleKeyboardEvent(evt, day)}
1650
+ sbb-popover-close
1651
+ >
1652
+ ${day.dayValue}
1653
+ </button>
1654
+ </td>
1655
+ `;
1656
+ });
1657
+ }
1658
+ /** Render the view for the month selection. */
1659
+ _renderMonthView() {
1660
+ return html`
1661
+ <div class="sbb-calendar__controls">
1662
+ ${this._getArrow("left", () => this._goToDifferentYear(-1), i18nPreviousYear[this._language.current], this._previousYearDisabled())}
1663
+ <div class="sbb-calendar__controls-month">${this._createLabelForMonthView()}</div>
1664
+ ${this._getArrow("right", () => this._goToDifferentYear(1), i18nNextYear[this._language.current], this._nextYearDisabled())}
1665
+ </div>
1666
+ <div class="sbb-calendar__table-overflow-break">
1667
+ <div class="sbb-calendar__table-container sbb-calendar__table-month-view">
1668
+ ${this._createMonthTable(this._months, this._chosenYear)}
1669
+ ${this._wide ? this._createMonthTable(this._months, this._chosenYear + 1) : nothing}
1670
+ </div>
1671
+ </div>
1672
+ `;
1673
+ }
1674
+ /** Creates the label with the year for the monthly view. */
1675
+ _createLabelForMonthView() {
1676
+ return html` <button
1677
+ type="button"
1678
+ id="sbb-calendar__month-selection"
1679
+ class="sbb-calendar__controls-change-date"
1680
+ aria-label=${`${i18nCalendarDateSelection[this._language.current]} ${this._chosenYear}`}
1681
+ @click=${() => this._resetCalendarView(true)}
1682
+ >
1683
+ ${this._chosenYear} ${this._wide ? ` - ${this._chosenYear + 1}` : nothing}
1684
+ <sbb-icon name="chevron-small-up-small"></sbb-icon>
1685
+ </button>
1686
+ <sbb-screen-reader-only role="status"> ${this._chosenYear} </sbb-screen-reader-only>`;
1687
+ }
1688
+ /** Creates the table for the month selection view. */
1689
+ _createMonthTable(months, year) {
1690
+ return html`
1691
+ <table
1692
+ class="sbb-calendar__table"
1693
+ @animationend=${(e) => this._tableAnimationEnd(e)}
1694
+ >
1695
+ ${this._wide ? html`<thead class="sbb-calendar__table-header" aria-hidden="true">
1696
+ <tr>
1697
+ <th class="sbb-calendar__table-header-cell" colspan=${MONTHS_PER_ROW}>${year}</th>
1698
+ </tr>
1699
+ </thead>` : nothing}
1700
+ <tbody class="sbb-calendar__table-body">
1701
+ ${months.map((row) => html`
1702
+ <tr>
1703
+ ${row.map((month) => {
1704
+ let selected;
1705
+ if (this.multiple) {
1706
+ selected = this._selected.find((date) => year === this._dateAdapter.getYear(date) && month.monthValue === this._dateAdapter.getMonth(date)) !== void 0;
1707
+ } else {
1708
+ const selectedMonth = this._selected ? this._dateAdapter.getMonth(this._selected) : void 0;
1709
+ const selectedYear = this._selected ? this._dateAdapter.getYear(this._selected) : void 0;
1710
+ selected = !!this._selected && year === selectedYear && month.monthValue === selectedMonth;
1711
+ }
1712
+ const isOutOfRange = !this._isMonthInRange(month.monthValue, year);
1713
+ const isFilteredOut = !this._isMonthFilteredOut(month.monthValue, year);
1714
+ const isCurrentMonth = year === this._dateAdapter.getYear(this._dateAdapter.today()) && this._dateAdapter.getMonth(this._dateAdapter.today()) === month.monthValue;
1715
+ return html` <td
1716
+ class=${classMap({
1717
+ "sbb-calendar__table-data": true,
1718
+ "sbb-calendar__table-month": true
1719
+ })}
1720
+ >
1721
+ <button
1722
+ class=${classMap({
1723
+ "sbb-calendar__cell": true,
1724
+ "sbb-calendar__pill": true,
1725
+ "sbb-calendar__cell-current": isCurrentMonth,
1726
+ "sbb-calendar__crossed-out": !isOutOfRange && isFilteredOut,
1727
+ "sbb-calendar__selected": selected
1728
+ })}
1729
+ @click=${() => this._onMonthSelection(month.monthValue, year)}
1730
+ ?disabled=${isOutOfRange || isFilteredOut}
1731
+ aria-label=${`${month.longValue} ${year}`}
1732
+ aria-pressed=${selected}
1733
+ aria-disabled=${String(isOutOfRange || isFilteredOut)}
1734
+ tabindex="-1"
1735
+ data-month=${month.monthValue || nothing}
1736
+ @keydown=${(evt) => this._handleKeyboardEvent(evt)}
1737
+ >
1738
+ ${month.value}
1739
+ </button>
1740
+ </td>`;
1741
+ })}
1742
+ </tr>
1743
+ `)}
1744
+ </tbody>
1745
+ </table>
1746
+ `;
1747
+ }
1748
+ /** Select the month and change the view to day selection. */
1749
+ _onMonthSelection(month, year) {
1750
+ this._chosenMonth = month;
1751
+ this._nextCalendarView = "day";
1752
+ this._init(this._dateAdapter.createDate(year, this._chosenMonth, this._dateAdapter.getDate(this._activeDate)));
1753
+ this._startTableTransition();
1754
+ }
1755
+ /** Render the view for the year selection. */
1756
+ _renderYearView() {
1757
+ return html`
1758
+ <div class="sbb-calendar__controls">
1759
+ ${this._getArrow("left", () => this._goToDifferentYearRange(-YEARS_PER_PAGE), i18nPreviousYearRange(YEARS_PER_PAGE)[this._language.current], this._previousYearRangeDisabled())}
1760
+ <div class="sbb-calendar__controls-month">${this._createLabelForYearView()}</div>
1761
+ ${this._getArrow("right", () => this._goToDifferentYearRange(YEARS_PER_PAGE), i18nNextYearRange(YEARS_PER_PAGE)[this._language.current], this._nextYearRangeDisabled())}
1762
+ </div>
1763
+ <div class="sbb-calendar__table-overflow-break">
1764
+ <div class="sbb-calendar__table-container sbb-calendar__table-year-view">
1765
+ ${this._createYearTable(this._years)}
1766
+ ${this._wide ? this._createYearTable(this._nextMonthYears, true) : nothing}
1767
+ </div>
1768
+ </div>
1769
+ `;
1770
+ }
1771
+ /** Creates the button arrow for all the views. */
1772
+ _getArrow(direction, click, ariaLabel, disabled) {
1773
+ return html`<sbb-secondary-button
1774
+ size="m"
1775
+ icon-name="chevron-small-${direction}-small"
1776
+ aria-label=${ariaLabel}
1777
+ @click=${click}
1778
+ ?disabled=${disabled}
1779
+ id="sbb-calendar__controls-${direction === "left" ? "previous" : "next"}"
1780
+ ></sbb-secondary-button>`;
1781
+ }
1782
+ /** Creates the label with the year range for the yearly view. */
1783
+ _createLabelForYearView() {
1784
+ const firstYear = this._years.flat()[0];
1785
+ const lastYearArray = (this._wide ? this._nextMonthYears : this._years).flat();
1786
+ const lastYear = lastYearArray[lastYearArray.length - 1];
1787
+ const yearLabel = `${firstYear} - ${lastYear}`;
1788
+ return html`
1789
+ <button
1790
+ type="button"
1791
+ id="sbb-calendar__year-selection"
1792
+ class="sbb-calendar__controls-change-date"
1793
+ aria-label="${i18nCalendarDateSelection[this._language.current]} ${yearLabel}"
1794
+ @click=${() => this._resetCalendarView(true)}
1795
+ >
1796
+ ${yearLabel}
1797
+ <sbb-icon name="chevron-small-up-small"></sbb-icon>
1798
+ </button>
1799
+ <sbb-screen-reader-only role="status"> ${yearLabel} </sbb-screen-reader-only>
1800
+ `;
1801
+ }
1802
+ /** Creates the table for the year selection view. */
1803
+ _createYearTable(years, shiftRight = false) {
1804
+ const now = this._dateAdapter.today();
1805
+ return html` <table
1806
+ class="sbb-calendar__table"
1807
+ @animationend=${(e) => this._tableAnimationEnd(e)}
1808
+ >
1809
+ <tbody class="sbb-calendar__table-body">
1810
+ ${years.map((row) => html` <tr>
1811
+ ${row.map((year) => {
1812
+ let selected;
1813
+ if (this.multiple) {
1814
+ selected = this._selected.find((date) => year === this._dateAdapter.getYear(date)) !== void 0;
1815
+ } else {
1816
+ const selectedYear = this._selected ? this._dateAdapter.getYear(this._selected) : void 0;
1817
+ selected = !!this._selected && year === selectedYear;
1818
+ }
1819
+ const isOutOfRange = !this._isYearInRange(year);
1820
+ const isFilteredOut = !this._isYearFilteredOut(year);
1821
+ const isCurrentYear = this._dateAdapter.getYear(now) === year;
1822
+ return html` <td class="sbb-calendar__table-data sbb-calendar__table-year">
1823
+ <button
1824
+ class=${classMap({
1825
+ "sbb-calendar__cell": true,
1826
+ "sbb-calendar__pill": true,
1827
+ "sbb-calendar__cell-current": isCurrentYear,
1828
+ "sbb-calendar__crossed-out": !isOutOfRange && isFilteredOut,
1829
+ "sbb-calendar__selected": selected
1830
+ })}
1831
+ @click=${() => this._onYearSelection(year, shiftRight)}
1832
+ ?disabled=${isOutOfRange || isFilteredOut}
1833
+ aria-label=${year}
1834
+ aria-pressed=${selected}
1835
+ aria-disabled=${String(isOutOfRange || isFilteredOut)}
1836
+ tabindex="-1"
1837
+ data-year=${year || nothing}
1838
+ @keydown=${(evt) => this._handleKeyboardEvent(evt)}
1839
+ >
1840
+ ${year}
1841
+ </button>
1842
+ </td>`;
1843
+ })}
1844
+ </tr>`)}
1845
+ </tbody>
1846
+ </table>`;
1847
+ }
1848
+ /** Select the year and change the view to month selection. */
1849
+ _onYearSelection(year, rightSide) {
1850
+ this._chosenYear = rightSide ? year - 1 : year;
1851
+ this._nextCalendarView = "month";
1852
+ this._assignActiveDate(this._dateAdapter.createDate(this._chosenYear, this._dateAdapter.getMonth(this._activeDate), this._dateAdapter.getDate(this._activeDate)));
1853
+ this._startTableTransition();
1854
+ }
1855
+ _getView() {
1856
+ if (isServer || this.hydrationRequired) {
1857
+ return html`${nothing}`;
1858
+ }
1859
+ switch (this._calendarView) {
1860
+ case "year":
1861
+ return this._renderYearView();
1862
+ case "month":
1863
+ return this._renderMonthView();
1864
+ case "day":
1865
+ default:
1866
+ return this._renderDayView();
1867
+ }
1868
+ }
1869
+ _tableAnimationEnd(event) {
1870
+ const table = event.target;
1871
+ if (event.animationName === "hide") {
1872
+ table.classList.remove("sbb-calendar__table-hide");
1873
+ if (this._containingFocus) {
1874
+ this._resetFocus = true;
1875
+ }
1876
+ this._calendarView = this._nextCalendarView;
1877
+ } else if (event.animationName === "show") {
1878
+ this.internals.states.delete("transition");
1879
+ }
1880
+ }
1881
+ _startTableTransition() {
1882
+ this.internals.states.add("transition");
1883
+ this.shadowRoot?.querySelectorAll("table")?.forEach((e) => e.classList.toggle("sbb-calendar__table-hide"));
1884
+ }
1885
+ render() {
1886
+ return html`<div class="sbb-calendar__wrapper">${this._getView()}</div>`;
1887
+ }
1888
+ }, _wide_accessor_storage = new WeakMap(), _view_accessor_storage = new WeakMap(), _min_accessor_storage = new WeakMap(), _max_accessor_storage = new WeakMap(), _multiple_accessor_storage = new WeakMap(), __selected_accessor_storage = new WeakMap(), _dateFilter_accessor_storage = new WeakMap(), _orientation_accessor_storage = new WeakMap(), _weekNumbers_accessor_storage = new WeakMap(), __activeDate_accessor_storage = new WeakMap(), __calendarView_accessor_storage = new WeakMap(), __initialized_accessor_storage = new WeakMap(), _classThis = _a, (() => {
1889
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1890
+ _wide_decorators = [forceType(), property({ type: Boolean })];
1891
+ _view_decorators = [property()];
1892
+ _min_decorators = [plainDate(), property()];
1893
+ _max_decorators = [plainDate(), property()];
1894
+ _multiple_decorators = [forceType(), handleDistinctChange((e, newValue) => e._onMultipleChanged(newValue)), property({ type: Boolean })];
1895
+ _set_selected_decorators = [property()];
1896
+ __selected_decorators = [state()];
1897
+ _dateFilter_decorators = [property({ attribute: "date-filter" })];
1898
+ _orientation_decorators = [property({ reflect: true })];
1899
+ _weekNumbers_decorators = [forceType(), property({ attribute: "week-numbers", type: Boolean })];
1900
+ __activeDate_decorators = [state()];
1901
+ _set__wide_decorators = [state()];
1902
+ __calendarView_decorators = [state()];
1903
+ __initialized_decorators = [state()];
1904
+ __esDecorate(_a, null, _wide_decorators, { kind: "accessor", name: "wide", static: false, private: false, access: { has: (obj) => "wide" in obj, get: (obj) => obj.wide, set: (obj, value) => {
1905
+ obj.wide = value;
1906
+ } }, metadata: _metadata }, _wide_initializers, _wide_extraInitializers);
1907
+ __esDecorate(_a, null, _view_decorators, { kind: "accessor", name: "view", static: false, private: false, access: { has: (obj) => "view" in obj, get: (obj) => obj.view, set: (obj, value) => {
1908
+ obj.view = value;
1909
+ } }, metadata: _metadata }, _view_initializers, _view_extraInitializers);
1910
+ __esDecorate(_a, null, _min_decorators, { kind: "accessor", name: "min", static: false, private: false, access: { has: (obj) => "min" in obj, get: (obj) => obj.min, set: (obj, value) => {
1911
+ obj.min = value;
1912
+ } }, metadata: _metadata }, _min_initializers, _min_extraInitializers);
1913
+ __esDecorate(_a, null, _max_decorators, { kind: "accessor", name: "max", static: false, private: false, access: { has: (obj) => "max" in obj, get: (obj) => obj.max, set: (obj, value) => {
1914
+ obj.max = value;
1915
+ } }, metadata: _metadata }, _max_initializers, _max_extraInitializers);
1916
+ __esDecorate(_a, null, _multiple_decorators, { kind: "accessor", name: "multiple", static: false, private: false, access: { has: (obj) => "multiple" in obj, get: (obj) => obj.multiple, set: (obj, value) => {
1917
+ obj.multiple = value;
1918
+ } }, metadata: _metadata }, _multiple_initializers, _multiple_extraInitializers);
1919
+ __esDecorate(_a, null, _set_selected_decorators, { kind: "setter", name: "selected", static: false, private: false, access: { has: (obj) => "selected" in obj, set: (obj, value) => {
1920
+ obj.selected = value;
1921
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
1922
+ __esDecorate(_a, null, __selected_decorators, { kind: "accessor", name: "_selected", static: false, private: false, access: { has: (obj) => "_selected" in obj, get: (obj) => obj._selected, set: (obj, value) => {
1923
+ obj._selected = value;
1924
+ } }, metadata: _metadata }, __selected_initializers, __selected_extraInitializers);
1925
+ __esDecorate(_a, null, _dateFilter_decorators, { kind: "accessor", name: "dateFilter", static: false, private: false, access: { has: (obj) => "dateFilter" in obj, get: (obj) => obj.dateFilter, set: (obj, value) => {
1926
+ obj.dateFilter = value;
1927
+ } }, metadata: _metadata }, _dateFilter_initializers, _dateFilter_extraInitializers);
1928
+ __esDecorate(_a, null, _orientation_decorators, { kind: "accessor", name: "orientation", static: false, private: false, access: { has: (obj) => "orientation" in obj, get: (obj) => obj.orientation, set: (obj, value) => {
1929
+ obj.orientation = value;
1930
+ } }, metadata: _metadata }, _orientation_initializers, _orientation_extraInitializers);
1931
+ __esDecorate(_a, null, _weekNumbers_decorators, { kind: "accessor", name: "weekNumbers", static: false, private: false, access: { has: (obj) => "weekNumbers" in obj, get: (obj) => obj.weekNumbers, set: (obj, value) => {
1932
+ obj.weekNumbers = value;
1933
+ } }, metadata: _metadata }, _weekNumbers_initializers, _weekNumbers_extraInitializers);
1934
+ __esDecorate(_a, null, __activeDate_decorators, { kind: "accessor", name: "_activeDate", static: false, private: false, access: { has: (obj) => "_activeDate" in obj, get: (obj) => obj._activeDate, set: (obj, value) => {
1935
+ obj._activeDate = value;
1936
+ } }, metadata: _metadata }, __activeDate_initializers, __activeDate_extraInitializers);
1937
+ __esDecorate(_a, null, _set__wide_decorators, { kind: "setter", name: "_wide", static: false, private: false, access: { has: (obj) => "_wide" in obj, set: (obj, value) => {
1938
+ obj._wide = value;
1939
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
1940
+ __esDecorate(_a, null, __calendarView_decorators, { kind: "accessor", name: "_calendarView", static: false, private: false, access: { has: (obj) => "_calendarView" in obj, get: (obj) => obj._calendarView, set: (obj, value) => {
1941
+ obj._calendarView = value;
1942
+ } }, metadata: _metadata }, __calendarView_initializers, __calendarView_extraInitializers);
1943
+ __esDecorate(_a, null, __initialized_decorators, { kind: "accessor", name: "_initialized", static: false, private: false, access: { has: (obj) => "_initialized" in obj, get: (obj) => obj._initialized, set: (obj, value) => {
1944
+ obj._initialized = value;
1945
+ } }, metadata: _metadata }, __initialized_initializers, __initialized_extraInitializers);
1946
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1947
+ _classThis = _classDescriptor.value;
1948
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1949
+ })(), _a.styles = [boxSizingStyles, style], _a.events = {
1950
+ dateselected: "dateselected"
1951
+ }, __runInitializers(_classThis, _classExtraInitializers), _a;
1952
+ return _classThis;
1953
+ })();
1954
+ export {
1955
+ SbbCalendarElement
1956
+ };
1957
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RhbnRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0cnVjdEZyb20uanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvdG9EYXRlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZERheXMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0T3B0aW9ucy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vlay5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL25vcm1hbGl6ZURhdGVzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFdlZWtzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mTW9udGguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9ub3JtYWxpemVJbnRlcnZhbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla09mSW50ZXJ2YWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1vbnRoLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtZZWFyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrWWVhci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrLmpzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBVc2VmdWwgY29uc3RhbnRzXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbGxlY3Rpb24gb2YgdXNlZnVsIGRhdGUgY29uc3RhbnRzLlxuICpcbiAqIFRoZSBjb25zdGFudHMgY291bGQgYmUgaW1wb3J0ZWQgZnJvbSBgZGF0ZS1mbnMvY29uc3RhbnRzYDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbWF4VGltZSwgbWluVGltZSB9IGZyb20gXCIuL2NvbnN0YW50cy9kYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBmdW5jdGlvbiBpc0FsbG93ZWRUaW1lKHRpbWUpIHtcbiAqICAgcmV0dXJuIHRpbWUgPD0gbWF4VGltZSAmJiB0aW1lID49IG1pblRpbWU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luV2Vla1xuICogQHN1bW1hcnkgRGF5cyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBkYXlzSW5XZWVrID0gNztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGRheXNJblllYXJcbiAqIEBzdW1tYXJ5IERheXMgaW4gMSB5ZWFyLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSG93IG1hbnkgZGF5cyBpbiBhIHllYXIuXG4gKlxuICogT25lIHllYXJzIGVxdWFscyAzNjUuMjQyNSBkYXlzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYTpcbiAqXG4gKiA+IExlYXAgeWVhciBvY2N1cnMgZXZlcnkgNCB5ZWFycywgZXhjZXB0IGZvciB5ZWFycyB0aGF0IGFyZSBkaXZpc2libGUgYnkgMTAwIGFuZCBub3QgZGl2aXNpYmxlIGJ5IDQwMC5cbiAqID4gMSBtZWFuIHllYXIgPSAoMzY1KzEvNC0xLzEwMCsxLzQwMCkgZGF5cyA9IDM2NS4yNDI1IGRheXNcbiAqL1xuZXhwb3J0IGNvbnN0IGRheXNJblllYXIgPSAzNjUuMjQyNTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1heFRpbWVcbiAqIEBzdW1tYXJ5IE1heGltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtYXhUaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSA4NjQwMDAwMDAwMDAwMDAxIDw9IG1heFRpbWU7XG4gKiAvLz0+IGZhbHNlXG4gKlxuICogbmV3IERhdGUoODY0MDAwMDAwMDAwMDAwMSk7XG4gKiAvLz0+IEludmFsaWQgRGF0ZVxuICovXG5leHBvcnQgY29uc3QgbWF4VGltZSA9IE1hdGgucG93KDEwLCA4KSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW5UaW1lXG4gKiBAc3VtbWFyeSBNaW5pbXVtIGFsbG93ZWQgdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbWluVGltZSB9IGZyb20gXCIuL2NvbnN0YW50cy9kYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBjb25zdCBpc1ZhbGlkID0gLTg2NDAwMDAwMDAwMDAwMDEgPj0gbWluVGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSgtODY0MDAwMDAwMDAwMDAwMSlcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmV4cG9ydCBjb25zdCBtaW5UaW1lID0gLW1heFRpbWU7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbldlZWsgPSA2MDQ4MDAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5EYXkgPSA4NjQwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luTWludXRlXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBtaW51dGVcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luTWludXRlID0gNjAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIGhvdXJcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luSG91ciA9IDM2MDAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJblNlY29uZFxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgc2Vjb25kXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJblNlY29uZCA9IDEwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5ZZWFyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJblllYXIgPSA1MjU2MDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Nb250aFxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIG1vbnRoLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luTW9udGggPSA0MzIwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkRheVxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIGRheS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJbkRheSA9IDE0NDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Ib3VyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgaG91ci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJbkhvdXIgPSA2MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luUXVhcnRlclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgcXVhcnRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vbnRoc0luUXVhcnRlciA9IDM7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtb250aHNJblllYXJcbiAqIEBzdW1tYXJ5IE1vbnRocyBpbiAxIHllYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBtb250aHNJblllYXIgPSAxMjtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHF1YXJ0ZXJzSW5ZZWFyXG4gKiBAc3VtbWFyeSBRdWFydGVycyBpbiAxIHllYXJcbiAqL1xuZXhwb3J0IGNvbnN0IHF1YXJ0ZXJzSW5ZZWFyID0gNDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBob3VyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luSG91ciA9IDM2MDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtaW51dGUuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5NaW51dGUgPSA2MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGRheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB3ZWVrLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luV2VlayA9IHNlY29uZHNJbkRheSAqIDc7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5ZZWFyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJblllYXIgPSBzZWNvbmRzSW5EYXkgKiBkYXlzSW5ZZWFyO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luTW9udGhcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtb250aFxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luTW9udGggPSBzZWNvbmRzSW5ZZWFyIC8gMTI7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgcXVhcnRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJblF1YXJ0ZXIgPSBzZWNvbmRzSW5Nb250aCAqIDM7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tU3ltYm9sXG4gKiBAc3VtbWFyeSBTeW1ib2wgZW5hYmxpbmcgRGF0ZSBleHRlbnNpb25zIHRvIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIHRoZSByZWZlcmVuY2UgZGF0ZS5cbiAqXG4gKiBUaGUgc3ltYm9sIGlzIHVzZWQgdG8gZW5hYmxlIHRoZSBgY29uc3RydWN0RnJvbWAgZnVuY3Rpb24gdG8gY29uc3RydWN0IGEgZGF0ZVxuICogdXNpbmcgYSByZWZlcmVuY2UgZGF0ZSBhbmQgYSB2YWx1ZS4gSXQgYWxsb3dzIHRvIHRyYW5zZmVyIGV4dHJhIHByb3BlcnRpZXNcbiAqIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS4gSXQncyB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgbGlrZVxuICogW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopIHRoYXQgYWNjZXB0IGEgdGltZSB6b25lIGFzXG4gKiBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICovXG5leHBvcnQgY29uc3QgY29uc3RydWN0RnJvbVN5bWJvbCA9IFN5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKTtcbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb21TeW1ib2wgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tXG4gKiBAY2F0ZWdvcnkgR2VuZXJpYyBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZGF0ZSB1c2luZyB0aGUgcmVmZXJlbmNlIGRhdGUgYW5kIHRoZSB2YWx1ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZ1bmN0aW9uIGNvbnN0cnVjdHMgYSBuZXcgZGF0ZSB1c2luZyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgcmVmZXJlbmNlXG4gKiBkYXRlIGFuZCB0aGUgZ2l2ZW4gdmFsdWUuIEl0IGhlbHBzIHRvIGJ1aWxkIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgYWNjZXB0XG4gKiBkYXRlIGV4dGVuc2lvbnMuXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gYERhdGVgIGlmIHRoZSBwYXNzZWQgcmVmZXJlbmNlIGRhdGUgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuXG4gKlxuICogU3RhcnRpbmcgZnJvbSB2My43LjAsIGl0IGFsbG93cyB0byBjb25zdHJ1Y3QgYSBkYXRlIHVzaW5nIGBbU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpXWBcbiAqIGVuYWJsaW5nIHRvIHRyYW5zZmVyIGV4dHJhIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLlxuICogSXQncyB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgbGlrZSBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eilcbiAqIHRoYXQgYWNjZXB0IGEgdGltZSB6b25lIGFzIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgcmVmZXJlbmNlIGRhdGUgdG8gdGFrZSBjb25zdHJ1Y3RvciBmcm9tXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY3JlYXRlIHRoZSBkYXRlXG4gKlxuICogQHJldHVybnMgRGF0ZSBpbml0aWFsaXplZCB1c2luZyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20vZGF0ZS1mbnNcIjtcbiAqXG4gKiAvLyBBIGZ1bmN0aW9uIHRoYXQgY2xvbmVzIGEgZGF0ZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCB0eXBlXG4gKiBmdW5jdGlvbiBjbG9uZURhdGU8RGF0ZVR5cGUgZXh0ZW5kcyBEYXRlPihkYXRlOiBEYXRlVHlwZSk6IERhdGVUeXBlIHtcbiAqICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oXG4gKiAgICAgZGF0ZSwgLy8gVXNlIGNvbnN0cnVjdG9yIGZyb20gdGhlIGdpdmVuIGRhdGVcbiAqICAgICBkYXRlLmdldFRpbWUoKSAvLyBVc2UgdGhlIGRhdGUgdmFsdWUgdG8gY3JlYXRlIGEgbmV3IGRhdGVcbiAqICAgKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdEZyb20oZGF0ZSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBkYXRlID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBkYXRlKHZhbHVlKTtcblxuICBpZiAoZGF0ZSAmJiB0eXBlb2YgZGF0ZSA9PT0gXCJvYmplY3RcIiAmJiBjb25zdHJ1Y3RGcm9tU3ltYm9sIGluIGRhdGUpXG4gICAgcmV0dXJuIGRhdGVbY29uc3RydWN0RnJvbVN5bWJvbF0odmFsdWUpO1xuXG4gIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBkYXRlLmNvbnN0cnVjdG9yKHZhbHVlKTtcblxuICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGNvbnN0cnVjdEZyb207XG4iLCJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBTdGFydGluZyBmcm9tIHYzLjcuMCwgaXQgY2xvbmVzIGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gIC8vIFtUT0RPXSBHZXQgcmlkIG9mIGB0b0RhdGVgIG9yIGBjb25zdHJ1Y3RGcm9tYD9cbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dCB8fCBhcmd1bWVudCwgYXJndW1lbnQpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHRvRGF0ZTtcbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGFkZERheXN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBhZGREYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgZGF5cyB0byBiZSBhZGRlZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXlzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAxMCBkYXlzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGREYXlzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxMClcbiAqIC8vPT4gVGh1IFNlcCAxMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGlmIChpc05hTihhbW91bnQpKSByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBOYU4pO1xuXG4gIC8vIElmIDAgZGF5cywgbm8tb3AgdG8gYXZvaWQgY2hhbmdpbmcgdGltZXMgaW4gdGhlIGhvdXIgYmVmb3JlIGVuZCBvZiBEU1RcbiAgaWYgKCFhbW91bnQpIHJldHVybiBfZGF0ZTtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIGFtb3VudCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBhZGREYXlzO1xuIiwibGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG4iLCJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZldlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBzdGFydCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCksIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcbiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG5cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mV2VlaztcbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0ZXMoY29udGV4dCwgLi4uZGF0ZXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplID0gY29uc3RydWN0RnJvbS5iaW5kKFxuICAgIG51bGwsXG4gICAgY29udGV4dCB8fCBkYXRlcy5maW5kKChkYXRlKSA9PiB0eXBlb2YgZGF0ZSA9PT0gXCJvYmplY3RcIiksXG4gICk7XG4gIHJldHVybiBkYXRlcy5tYXAobm9ybWFsaXplKTtcbn1cbiIsImltcG9ydCB7IGFkZERheXMgfSBmcm9tIFwiLi9hZGREYXlzLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBhZGRXZWVrc30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGFkZFdlZWtzXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2Ygd2Vla3MgdG8gYmUgYWRkZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgd2Vla3MgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDQgd2Vla3MgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFdlZWtzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA0KVxuICogLy89PiBNb24gU2VwIDI5IDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdlZWtzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykge1xuICByZXR1cm4gYWRkRGF5cyhkYXRlLCBhbW91bnQgKiA3LCBvcHRpb25zKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBhZGRXZWVrcztcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZW5kT2ZNb250aH0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSBtb250aCBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAzMCAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kT2ZNb250aChkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpO1xuICBfZGF0ZS5zZXRGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZW5kT2ZNb250aDtcbiIsImltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vbm9ybWFsaXplRGF0ZXMuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUludGVydmFsKGNvbnRleHQsIGludGVydmFsKSB7XG4gIGNvbnN0IFtzdGFydCwgZW5kXSA9IG5vcm1hbGl6ZURhdGVzKGNvbnRleHQsIGludGVydmFsLnN0YXJ0LCBpbnRlcnZhbC5lbmQpO1xuICByZXR1cm4geyBzdGFydCwgZW5kIH07XG59XG4iLCJpbXBvcnQgeyBub3JtYWxpemVJbnRlcnZhbCB9IGZyb20gXCIuL19saWIvbm9ybWFsaXplSW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7IGFkZFdlZWtzIH0gZnJvbSBcIi4vYWRkV2Vla3MuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBlYWNoV2Vla09mSW50ZXJ2YWx9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBUaGUge0BsaW5rIGVhY2hXZWVrT2ZJbnRlcnZhbH0gZnVuY3Rpb24gcmVzdWx0IHR5cGUuIEl0IHJlc29sdmVzIHRoZSBwcm9wZXIgZGF0YSB0eXBlLlxuICogSXQgdXNlcyB0aGUgZmlyc3QgYXJndW1lbnQgZGF0ZSBvYmplY3QgdHlwZSwgc3RhcnRpbmcgZnJvbSB0aGUgaW50ZXJ2YWwgc3RhcnQgZGF0ZSxcbiAqIHRoZW4gdGhlIGVuZCBpbnRlcnZhbCBkYXRlLiBJZiBhIGNvbnRleHQgZnVuY3Rpb24gaXMgcGFzc2VkLCBpdCB1c2VzIHRoZSBjb250ZXh0IGZ1bmN0aW9uIHJldHVybiB0eXBlLlxuICovXG5cbi8qKlxuICogQG5hbWUgZWFjaFdlZWtPZkludGVydmFsXG4gKiBAY2F0ZWdvcnkgSW50ZXJ2YWwgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBhcnJheSBvZiB3ZWVrcyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lIGludGVydmFsLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBhcnJheSBvZiB3ZWVrcyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lIGludGVydmFsLlxuICpcbiAqIEBwYXJhbSBpbnRlcnZhbCAtIFRoZSBpbnRlcnZhbC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYXJyYXkgd2l0aCBzdGFydHMgb2Ygd2Vla3MgZnJvbSB0aGUgd2VlayBvZiB0aGUgaW50ZXJ2YWwgc3RhcnQgdG8gdGhlIHdlZWsgb2YgdGhlIGludGVydmFsIGVuZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFYWNoIHdlZWsgd2l0aGluIGludGVydmFsIDYgT2N0b2JlciAyMDE0IC0gMjMgTm92ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVhY2hXZWVrT2ZJbnRlcnZhbCh7XG4gKiAgIHN0YXJ0OiBuZXcgRGF0ZSgyMDE0LCA5LCA2KSxcbiAqICAgZW5kOiBuZXcgRGF0ZSgyMDE0LCAxMCwgMjMpXG4gKiB9KVxuICogLy89PiBbXG4gKiAvLyAgIFN1biBPY3QgMDUgMjAxNCAwMDowMDowMCxcbiAqIC8vICAgU3VuIE9jdCAxMiAyMDE0IDAwOjAwOjAwLFxuICogLy8gICBTdW4gT2N0IDE5IDIwMTQgMDA6MDA6MDAsXG4gKiAvLyAgIFN1biBPY3QgMjYgMjAxNCAwMDowMDowMCxcbiAqIC8vICAgU3VuIE5vdiAwMiAyMDE0IDAwOjAwOjAwLFxuICogLy8gICBTdW4gTm92IDA5IDIwMTQgMDA6MDA6MDAsXG4gKiAvLyAgIFN1biBOb3YgMTYgMjAxNCAwMDowMDowMCxcbiAqIC8vICAgU3VuIE5vdiAyMyAyMDE0IDAwOjAwOjAwXG4gKiAvLyBdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlYWNoV2Vla09mSW50ZXJ2YWwoaW50ZXJ2YWwsIG9wdGlvbnMpIHtcbiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwpO1xuXG4gIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQ7XG4gIGNvbnN0IHN0YXJ0RGF0ZVdlZWsgPSByZXZlcnNlZFxuICAgID8gc3RhcnRPZldlZWsoZW5kLCBvcHRpb25zKVxuICAgIDogc3RhcnRPZldlZWsoc3RhcnQsIG9wdGlvbnMpO1xuICBjb25zdCBlbmREYXRlV2VlayA9IHJldmVyc2VkXG4gICAgPyBzdGFydE9mV2VlayhzdGFydCwgb3B0aW9ucylcbiAgICA6IHN0YXJ0T2ZXZWVrKGVuZCwgb3B0aW9ucyk7XG5cbiAgc3RhcnREYXRlV2Vlay5zZXRIb3VycygxNSk7XG4gIGVuZERhdGVXZWVrLnNldEhvdXJzKDE1KTtcblxuICBjb25zdCBlbmRUaW1lID0gK2VuZERhdGVXZWVrLmdldFRpbWUoKTtcbiAgbGV0IGN1cnJlbnREYXRlID0gc3RhcnREYXRlV2VlaztcblxuICBsZXQgc3RlcCA9IG9wdGlvbnM/LnN0ZXAgPz8gMTtcbiAgaWYgKCFzdGVwKSByZXR1cm4gW107XG4gIGlmIChzdGVwIDwgMCkge1xuICAgIHN0ZXAgPSAtc3RlcDtcbiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDtcbiAgfVxuXG4gIGNvbnN0IGRhdGVzID0gW107XG5cbiAgd2hpbGUgKCtjdXJyZW50RGF0ZSA8PSBlbmRUaW1lKSB7XG4gICAgY3VycmVudERhdGUuc2V0SG91cnMoMCk7XG4gICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBjdXJyZW50RGF0ZSkpO1xuICAgIGN1cnJlbnREYXRlID0gYWRkV2Vla3MoY3VycmVudERhdGUsIHN0ZXApO1xuICAgIGN1cnJlbnREYXRlLnNldEhvdXJzKDE1KTtcbiAgfVxuXG4gIHJldHVybiByZXZlcnNlZCA/IGRhdGVzLnJldmVyc2UoKSA6IGRhdGVzO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGVhY2hXZWVrT2ZJbnRlcnZhbDtcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZk1vbnRofSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy5cbiAqIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsXG4gKiBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgbW9udGhcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mTW9udGgoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIF9kYXRlLnNldERhdGUoMSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3RhcnRPZk1vbnRoO1xuIiwiaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXRXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSlcbiAqIC8vPT4gMjAwNVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgd2VlayBzdGFydHMgb24gU2F0dXJkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IHdlZWtTdGFydHNPbjogNiB9KVxuICogLy89PiAyMDA0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB0aGUgZmlyc3Qgd2VlayBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9KVxuICogLy89PiAyMDA0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZk5leHRZZWFyLCBvcHRpb25zKTtcblxuICBjb25zdCBmaXJzdFdlZWtPZlRoaXNZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTtcblxuICBpZiAoK19kYXRlID49ICtzdGFydE9mTmV4dFllYXIpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoK19kYXRlID49ICtzdGFydE9mVGhpc1llYXIpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrWWVhcjtcbiIsImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldFdlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0V2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZXZWVrIH0gZnJvbSBcIi4vc3RhcnRPZldlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDUgd2l0aCBkZWZhdWx0IHNldHRpbmdzOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBTdW4gRGVjIDI2IDIwMDQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDVcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHdlZWtcbiAqIC8vIGFuZCA0IEphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB5ZWFyID0gZ2V0V2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7XG4gIGNvbnN0IGZpcnN0V2VlayA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IF9kYXRlID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrLCBvcHRpb25zKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZXZWVrWWVhcjtcbiIsImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZldlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mV2VlayhfZGF0ZSwgb3B0aW9ucykgLSArc3RhcnRPZldlZWtZZWFyKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrO1xuIiwiaW1wb3J0IHsgZWFjaFdlZWtPZkludGVydmFsLCBlbmRPZk1vbnRoLCBnZXRXZWVrLCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgTGl0RWxlbWVudCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcblxuaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkIH0gZnJvbSAnLi4vY29yZS9hMTF5LnRzJztcbmltcG9ydCB7IHJlYWRDb25maWcgfSBmcm9tICcuLi9jb3JlL2NvbmZpZy50cyc7XG5pbXBvcnQge1xuICBTYmJMYW5ndWFnZUNvbnRyb2xsZXIsXG4gIFNiYk1lZGlhTWF0Y2hlckNvbnRyb2xsZXIsXG4gIFNiYk1lZGlhUXVlcnlCcmVha3BvaW50TGFyZ2VBbmRBYm92ZSxcbn0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy50cyc7XG5pbXBvcnQgdHlwZSB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vY29yZS9kYXRldGltZS50cyc7XG5pbXBvcnQge1xuICBEQVlTX1BFUl9ST1csXG4gIGRlZmF1bHREYXRlQWRhcHRlcixcbiAgTU9OVEhTX1BFUl9QQUdFLFxuICBNT05USFNfUEVSX1JPVyxcbiAgWUVBUlNfUEVSX1BBR0UsXG4gIFlFQVJTX1BFUl9ST1csXG59IGZyb20gJy4uL2NvcmUvZGF0ZXRpbWUudHMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlLCBoYW5kbGVEaXN0aW5jdENoYW5nZSwgcGxhaW5EYXRlIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLnRzJztcbmltcG9ydCB7XG4gIGkxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb24sXG4gIGkxOG5DYWxlbmRhcldlZWtOdW1iZXIsXG4gIGkxOG5OZXh0TW9udGgsXG4gIGkxOG5OZXh0WWVhcixcbiAgaTE4bk5leHRZZWFyUmFuZ2UsXG4gIGkxOG5QcmV2aW91c01vbnRoLFxuICBpMThuUHJldmlvdXNZZWFyLFxuICBpMThuUHJldmlvdXNZZWFyUmFuZ2UsXG4gIGkxOG5ZZWFyTW9udGhTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvcmUvaTE4bi50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYk9yaWVudGF0aW9uIH0gZnJvbSAnLi4vY29yZS9pbnRlcmZhY2VzLnRzJztcbmltcG9ydCB7IFNiYkVsZW1lbnRJbnRlcm5hbHNNaXhpbiwgU2JiSHlkcmF0aW9uTWl4aW4gfSBmcm9tICcuLi9jb3JlL21peGlucy50cyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICcuLi9jb3JlL3N0eWxlcy50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL2NhbGVuZGFyLnNjc3M/bGl0JmlubGluZSc7XG5cbmltcG9ydCAnLi4vYnV0dG9uL3NlY29uZGFyeS1idXR0b24udHMnO1xuaW1wb3J0ICcuLi9pY29uLnRzJztcbmltcG9ydCAnLi4vc2NyZWVuLXJlYWRlci1vbmx5LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIG5lZWRlZCBpbiB5ZWFyIGFuZCBtb250aCB2aWV3cyB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIHRoZSBuZXh0IGVsZW1lbnQgaW4ga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAqXG4gKiBUaGUgY2VsbCdzIGluZGV4IGFuZCB0aGUgZWxlbWVudCdzIGluZGV4IGluIGl0cyBtb250aCAvIHllYXIgYmF0Y2ggbXVzdCBiZSBkaXN0aW5ndWlzaGVkOlxuICogdGhlIGZpcnN0IGlzIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgYXJyYXkgb2YgYWxsIHRoZSByZW5kZXJlZCBjZWxscywgd2hpbGUgdGhlIHNlY29uZCBpcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIHRhYmxlLlxuICogSW4gbm9uLXdpZGUgbW9kZSwgdGhlIHd0byBhcmUgdGhlIHNhbWUsIHdoaWxlIGluIHdpZGUgbW9kZSB0aGUgY2VsbCdzIGluZGV4IGNhbiBnbyBmcm9tIDAgdG8gNDcgZm9yIHllYXJzIGFuZCBmcm9tIDAgdG8gMjMgZm9yIG1vbnRocyxcbiAqIHdoaWxlIHRoZSBlbGVtZW50IGluZGV4IGdvZXMgZnJvbSAwIHRvLCByZXNwZWN0aXZlbHksIDIzIGFuZCAxMS5cbiAqL1xuaW50ZXJmYWNlIENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uTW9udGhZZWFyVmlld3NQYXJhbWV0ZXJzIHtcbiAgLyoqIFRoZSBlbGVtZW50IGluZGV4IHdpdGhpbiBpdHMgeWVhciBvciBtb250aCByYW5nZS4gKi9cbiAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIEluIHdpZGUgbW9kZSwgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZWNvbmQgcGFuZWwsIG9yLCBhbHRlcm5hdGl2ZWx5LCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBwYW5lbC4gKi9cbiAgb2Zmc2V0Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbGVtZW50IHdpdGhpbiB0aGUgZWxlbWVudCdzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIGNlbGxzIGRpc3BsYXllZCBpbiBhIHNpbmdsZSByb3csIGRlcGVuZGluZyBvbiB0aGUgcmVuZGVyZWQgdmlldy4gKi9cbiAgdmVydGljYWxPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIG5lZWRlZCBpbiBkYXkgdmlldyB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIHRoZSBuZXh0IGVsZW1lbnQgaW4ga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAqXG4gKiBJbiBvcmllbnRhdGlvbj0ndmVydGljYWwnLCBpdCdzIG5vdCBwb3NzaWJsZSB0byByZWx5IG9uIGFueSBhcnJheS9pbmRleCB0byBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgdG8gbmF2aWdhdGUgdG8sXG4gKiBzbyBjYWxjdWxhdGlvbnMgb24gZGF0ZXMgbXVzdCBiZSBkb25lLCB3aGljaCBzaG91bGQgY29uc2lkZXIgdmlldyBib3VuZGFyaWVzLCBvZmZzZXRzIGFuZCBtb250aCdzIGxlbmd0aC5cbiAqL1xuaW50ZXJmYWNlIENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uRGF5Vmlld1BhcmFtZXRlcnMge1xuICAvKiogVGhlIGZpcnN0IGRheSByZW5kZXJlZC4gKi9cbiAgZmlyc3REYXlJblZpZXc6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgbGFzdCBkYXkgcmVuZGVyZWQuIEl0IGRlcGVuZHMgb24gdGhlICd3aWRlJyB2YWx1ZS4gKi9cbiAgbGFzdERheUluVmlldzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIChNb25kYXkpIG9mIHRoZSBmaXJzdCByZW5kZXJlZCBtb250aC4gKi9cbiAgZmlyc3RNb250aE9mZnNldDogbnVtYmVyO1xuICAvKiogVGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBmaXJzdCByZW5kZXJlZCBtb250aC4gKi9cbiAgZmlyc3RNb250aExlbmd0aDogbnVtYmVyO1xuICAvKiogVGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKE1vbmRheSkgb2YgdGhlIHNlY29uZCByZW5kZXJlZCBtb250aC4gSWYgd2lkZSBpcyBmYWxzZSwgaXQncyBlcXVhbCB0byB6ZXJvLiAqL1xuICBzZWNvbmRNb250aE9mZnNldDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERheTxUID0gRGF0ZT4ge1xuICAvKiogRGF0ZSBhcyBJU08gc3RyaW5nLiAqL1xuICB2YWx1ZTogc3RyaW5nO1xuICBkYXlWYWx1ZTogc3RyaW5nO1xuICBtb250aFZhbHVlOiBzdHJpbmc7XG4gIHllYXJWYWx1ZTogc3RyaW5nO1xuICBkYXRlVmFsdWU6IFQ7XG4gIHdlZWtWYWx1ZTogbnVtYmVyO1xuICB3ZWVrRGF5VmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aCB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxvbmdWYWx1ZTogc3RyaW5nO1xuICBtb250aFZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2Vla2RheSB7XG4gIGxvbmc6IHN0cmluZztcbiAgbmFycm93OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENhbGVuZGFyVmlldyA9ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJztcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIGNhbGVuZGFyIHdoaWNoIGFsbG93cyBjaG9vc2luZyBhIGRhdGUuXG4gKi9cbmV4cG9ydFxuQGN1c3RvbUVsZW1lbnQoJ3NiYi1jYWxlbmRhcicpXG5jbGFzcyBTYmJDYWxlbmRhckVsZW1lbnQ8VCA9IERhdGU+IGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW4oU2JiRWxlbWVudEludGVybmFsc01peGluKExpdEVsZW1lbnQpKSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHN0eWxlXTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgZGF0ZXNlbGVjdGVkOiAnZGF0ZXNlbGVjdGVkJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogSWYgc2V0IHRvIHRydWUsIHR3byBtb250aHMgYXJlIGRpc3BsYXllZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igd2lkZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCB2aWV3IG9mIHRoZSBjYWxlbmRhciB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIG9wZW5pbmcuICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyBhY2Nlc3NvciB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gQWNjZXB0cyBhIGRhdGUgb2JqZWN0IG9yIG51bGwuXG4gICAqIEFjY2VwdHMgYW4gSVNPODYwMSBmb3JtYXR0ZWQgc3RyaW5nIChlLmcuIDIwMjQtMTItMjQpIGFzIGF0dHJpYnV0ZS5cbiAgICovXG4gIEBwbGFpbkRhdGUoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgbWluOiBUIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHZhbGlkIGRhdGUuIEFjY2VwdHMgYSBkYXRlIG9iamVjdCBvciBudWxsLlxuICAgKiBBY2NlcHRzIGFuIElTTzg2MDEgZm9ybWF0dGVkIHN0cmluZyAoZS5nLiAyMDI0LTEyLTI0KSBhcyBhdHRyaWJ1dGUuXG4gICAqL1xuICBAcGxhaW5EYXRlKClcbiAgQHByb3BlcnR5KClcbiAgcHVibGljIGFjY2Vzc29yIG1heDogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBhbGxvd3MgZm9yIG11bHRpcGxlIGRhdGUgc2VsZWN0aW9uLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQGhhbmRsZURpc3RpbmN0Q2hhbmdlKChlOiBTYmJDYWxlbmRhckVsZW1lbnQ8VD4sIG5ld1ZhbHVlOiBib29sZWFuKSA9PlxuICAgIGUuX29uTXVsdGlwbGVDaGFuZ2VkKG5ld1ZhbHVlKSxcbiAgKVxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0ZWQgZGF0ZTogYWNjZXB0cyBhIGRhdGUgb2JqZWN0LCBvciwgaWYgYG11bHRpcGxlYCwgYW4gYXJyYXkgb2YgZGF0ZXMuXG4gICAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2YWx1ZVxuICAgICAgICAubWFwKChkYXRlTGlrZTogVCkgPT5cbiAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZUxpa2UpKSxcbiAgICAgICAgKVxuICAgICAgICAuZmlsdGVyKChkYXRlOiBUIHwgbnVsbCk6IGRhdGUgaXMgVCA9PiBkYXRlICE9PSBudWxsKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkYXRlOiBUKSA9PlxuICAgICAgICAgICAgIXRoaXMuX2lzRGF5SW5SYW5nZSh0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoZGF0ZSkpIHx8IHRoaXMuX2RhdGVGaWx0ZXIoZGF0ZSksXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbChcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgISFzZWxlY3RlZERhdGUgJiZcbiAgICAgICAgKCF0aGlzLl9pc0RheUluUmFuZ2UodGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKHNlbGVjdGVkRGF0ZSkpIHx8XG4gICAgICAgICAgdGhpcy5fZGF0ZUZpbHRlcihzZWxlY3RlZERhdGUpKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkID0gc2VsZWN0ZWREYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkKCk6IFQgfCBUW10gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gIH1cbiAgQHN0YXRlKCkgcHJpdmF0ZSBhY2Nlc3NvciBfc2VsZWN0ZWQ6IFQgfCBUW10gfCBudWxsID0gbnVsbDtcblxuICAvKiogQSBmdW5jdGlvbiB1c2VkIHRvIGZpbHRlciBvdXQgZGF0ZXMuICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RhdGUtZmlsdGVyJyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgZGF0ZUZpbHRlcjogKChkYXRlOiBUIHwgbnVsbCkgPT4gYm9vbGVhbikgfCBudWxsID0gbnVsbDtcblxuICAvKiogVGhlIG9yaWVudGF0aW9uIG9mIGRheXMgaW4gdGhlIGNhbGVuZGFyLiAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBvcmllbnRhdGlvbjogU2JiT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCc7XG5cbiAgLyoqIFdoZXRoZXIgaXQgaGFzIHRvIGRpc3BsYXkgdGhlIHdlZWsgbnVtYmVycyBpbiBhZGRpdGlvbiB0byB3ZWVrIGRheXMuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd3ZWVrLW51bWJlcnMnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciB3ZWVrTnVtYmVyczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxUPiA9IHJlYWRDb25maWcoKS5kYXRldGltZT8uZGF0ZUFkYXB0ZXIgPz8gZGVmYXVsdERhdGVBZGFwdGVyO1xuXG4gIC8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkYXRlLiAqL1xuICBAc3RhdGUoKSBwcml2YXRlIGFjY2Vzc29yIF9hY3RpdmVEYXRlOiBUID0gdGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKTtcblxuICAvKiogVGhlIGN1cnJlbnQgd2lkZSBwcm9wZXJ0eSBjb25zaWRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBhbmQgYnJlYWtwb2ludHMuIEZyb20gemVybyB0byBzbWFsbCBgd2lkZWAgaGFzIGFsd2F5cyB0byBiZSBmYWxzZS4gKi9cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBzZXQgX3dpZGUod2lkZTogYm9vbGVhbikge1xuICAgIHRoaXMudG9nZ2xlU3RhdGUoJ3dpZGUnLCB3aWRlKTtcbiAgICB0aGlzLl93aWRlSW50ZXJuYWwgPSB3aWRlO1xuICB9XG4gIHByaXZhdGUgZ2V0IF93aWRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl93aWRlSW50ZXJuYWw7XG4gIH1cbiAgLy8gV2Uga2VlcCB0aGUgc3RhdGUgaW4gYSBmaWVsZCBiZWNhdXNlIG9mIHRoZSBXZWJLaXQgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDM0NjcuXG4gIC8vIFRPRE86IHJlLWNoZWNrIHdoZXRoZXIgZmllbGQgaXMgbmVlZGVkXG4gIHByaXZhdGUgX3dpZGVJbnRlcm5hbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX2NhbGVuZGFyVmlldzogQ2FsZW5kYXJWaWV3ID0gJ2RheSc7XG5cbiAgcHJpdmF0ZSBfbmV4dENhbGVuZGFyVmlldzogQ2FsZW5kYXJWaWV3ID0gJ2RheSc7XG5cbiAgLyoqIEluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXJlZCBkYXkgdmlldzsgdXNlZCBpbiBrZXlib2FyZCBuYXZpZ2F0aW9uLiAqL1xuICBwcml2YXRlIF9rZXlib2FyZE5hdmlnYXRpb25EYXlWaWV3UGFyYW1ldGVyczogQ2FsZW5kYXJLZXlib2FyZE5hdmlnYXRpb25EYXlWaWV3UGFyYW1ldGVycyA9IHtcbiAgICBmaXJzdERheUluVmlldzogbnVsbCxcbiAgICBsYXN0RGF5SW5WaWV3OiBudWxsLFxuICAgIGZpcnN0TW9udGhPZmZzZXQ6IDAsXG4gICAgZmlyc3RNb250aExlbmd0aDogMCxcbiAgICBzZWNvbmRNb250aE9mZnNldDogMCxcbiAgfTtcblxuICAvKiogQSBsaXN0IG9mIGRheXMsIGluIHR3byBmb3JtYXRzIChsb25nIGFuZCBzaW5nbGUgY2hhcikuICovXG4gIHByaXZhdGUgX3dlZWtkYXlzITogV2Vla2RheVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB0aGUgZGF0ZXMgb2YgdGhlIG1vbnRoLiAqL1xuICBwcml2YXRlIF93ZWVrczogRGF5PFQ+W11bXSA9IFtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyBtb250aHMuICovXG4gIHByaXZhdGUgX21vbnRocyE6IE1vbnRoW11bXTtcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgeWVhcnMuICovXG4gIHByaXZhdGUgX3llYXJzITogbnVtYmVyW11bXTtcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgeWVhcnMgZm9yIHRoZSB3aWRlIHZpZXcuICovXG4gIHByaXZhdGUgX25leHRNb250aFllYXJzITogbnVtYmVyW11bXTtcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgdGhlIGRhdGVzIG9mIHRoZSBuZXh0IG1vbnRoLiAqL1xuICBwcml2YXRlIF9uZXh0TW9udGhXZWVrcyE6IERheTxUPltdW107XG5cbiAgLyoqIEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBtb250aCBuYW1lcyBpbiB0aGUgY3VycmVudCBsYW5ndWFnZS4gKi9cbiAgcHJpdmF0ZSBfbW9udGhOYW1lczogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdsb25nJyk7XG5cbiAgLyoqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHdlZWtzJyBudW1iZXJzIGZvciB0aGUgY3VycmVudCBtb250aC4gKi9cbiAgcHJpdmF0ZSBfd2Vla051bWJlcnMhOiBudW1iZXJbXTtcblxuICAvKiogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgd2Vla3MnIG51bWJlcnMgZm9yIHRoZSBuZXh0IG1vbnRoIGluIHdpZGUgbW9kZS4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoV2Vla051bWJlcnMhOiBudW1iZXJbXTtcblxuICAvKiogQSBsaXN0IG9mIGJ1dHRvbnMgY29ycmVzcG9uZGluZyB0byBkYXlzLCBtb250aHMgb3IgeWVhcnMgZGVwZW5kaW5nIG9uIHRoZSB2aWV3LiAqL1xuICBwcml2YXRlIGdldCBfY2VsbHMoKTogSFRNTEJ1dHRvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYmItY2FsZW5kYXJfX2NlbGwnKSA/PyBbXSxcbiAgICApIGFzIEhUTUxCdXR0b25FbGVtZW50W107XG4gIH1cblxuICAvKiogVGhlIGNob3NlbiB5ZWFyIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5ZZWFyPzogbnVtYmVyO1xuXG4gIC8qKiBUaGUgY2hvc2VuIG1vbnRoIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5Nb250aD86IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgZm9jdXMgc2hvdWxkIGJlIHJlc2V0IG9uIGZvY3VzQ2VsbC4gKi9cbiAgcHJpdmF0ZSBfcmVzZXRGb2N1cyA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIGFuIGVsZW1lbnQgaW5zaWRlIHRoZSBjYWxlbmRhciBpcyBjdXJyZW50bHkgZm9jdXNlZC4gKi9cbiAgcHJpdmF0ZSBfY29udGFpbmluZ0ZvY3VzID0gZmFsc2U7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBhY2Nlc3NvciBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcykud2l0aEhhbmRsZXIoKCkgPT4ge1xuICAgIHRoaXMuX21vbnRoTmFtZXMgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdsb25nJyk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gIH0pO1xuICBwcml2YXRlIF9tZWRpYU1hdGNoZXIgPSBuZXcgU2JiTWVkaWFNYXRjaGVyQ29udHJvbGxlcih0aGlzLCB7XG4gICAgW1NiYk1lZGlhUXVlcnlCcmVha3BvaW50TGFyZ2VBbmRBYm92ZV06ICgpID0+IHRoaXMuX2luaXQoKSxcbiAgfSk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gICAgdGhpcy5fc2V0V2Vla2RheXMoKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gdHJhY2sgdGhlIGZvY3VzIGFzIHdlIHNob3VsZCBvbmx5IHRha2UgZm9jdXMgaW50byB0aGUgY2FsZW5kYXIsIHdoZW4gdGhlXG4gICAgLy8gZm9jdXMgd2FzIG9uY2Ugc2V0IGludG8gdGhlIGNhbGVuZGFyLlxuICAgIC8vIEZvciBzaGFkb3cgRE9NIGNvbXBhdGliaWxpdHkgd2UgbmVlZCB0byB0cmFjayB0aGlzIHByb2dyYW1tYXRpY2FsbHkuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgKCkgPT4gKHRoaXMuX2NvbnRhaW5pbmdGb2N1cyA9IHRydWUpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgKCkgPT4gKHRoaXMuX2NvbnRhaW5pbmdGb2N1cyA9IGZhbHNlKSk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRlRmlsdGVyKGRhdGU6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRmlsdGVyPy4oZGF0ZSkgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZXNldHMgdGhlIGFjdGl2ZSBtb250aCBhY2NvcmRpbmcgdG8gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY2FsZW5kYXIuICovXG4gIHB1YmxpYyByZXNldFBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KCk7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBvdmVycmlkZSBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICB0aGlzLl9mb2N1c0NlbGwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3dpZGUnKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ29yaWVudGF0aW9uJykpIHtcbiAgICAgIHRoaXMucmVzZXRQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ZpZXcnKSkge1xuICAgICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgICAgdGhpcy5fY2hvc2VuTW9udGggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gdGhpcy5fY2FsZW5kYXJWaWV3ID0gdGhpcy52aWV3O1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIC8vIFRoZSBjYWxlbmRhciBuZWVkcyB0byBjYWxjdWxhdGUgdGFiLWluZGV4ZXMgb24gZmlyc3QgcmVuZGVyLFxuICAgIC8vIGFuZCBldmVyeSB0aW1lIGEgZGF0ZSBpcyBzZWxlY3RlZCBvciB0aGUgbW9udGggdmlldyBjaGFuZ2VzLlxuICAgIHRoaXMuX3NldFRhYkluZGV4KCk7XG5cbiAgICAvLyBXaGVuIGNoYW5naW5nIHZpZXcgdG8geWVhci9tb250aCwgdGhlIHRhYmluZGV4IGlzIGNoYW5nZWQsIGJ1dCB0aGUgZm9jdXNlZCBlbGVtZW50IGlzIGdldHRpbmcgbG9zdC5cbiAgICAvLyBXZSBuZWVkIHRvIGNhbGwgYF9mb2N1c0NlbGwoKWAgbWV0aG9kIGV4cGxpY2l0bHkgdG8gY29ycmVjdGx5IHNldCB0aGUgZm9jdXMuXG4gICAgdGhpcy5fZm9jdXNDZWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGBfc2VsZWN0ZWRgIHN0YXRlIHNob3VsZCBiZSBhZGFwdGVkIHdoZW4gdGhlIGBtdWx0aXBsZWAgcHJvcGVydHkgY2hhbmdlczpcbiAgICogICAtIGlmIGl0IGNoYW5nZXMgdG8gdHJ1ZSwgdGhlICdfc2VsZWN0ZWQnIGlzIHNldCB0byBhbiBhcnJheTtcbiAgICogICAtIGlmIGl0IGNoYW5nZXMgdG8gZmFsc2UsIHRoZSBmaXJzdCBhdmFpbGFibGUgb3B0aW9uIGlzIHNldCBhcyAndmFsdWUnIG90aGVyd2lzZSBpdCdzIHNldCB0byBudWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25NdWx0aXBsZUNoYW5nZWQoaXNNdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHRoaXMuX3NlbGVjdGVkKSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3RlZCA/IFt0aGlzLl9zZWxlY3RlZCBhcyBUXSA6IFtdO1xuICAgIH1cbiAgICBpZiAoIWlzTXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLl9zZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gKHRoaXMuX3NlbGVjdGVkIGFzIFRbXSkubGVuZ3RoID8gKHRoaXMuX3NlbGVjdGVkIGFzIFRbXSlbMF0gOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50LiAqL1xuICBwcml2YXRlIF9pbml0KGFjdGl2ZURhdGU/OiBUKTogdm9pZCB7XG4gICAgLy8gRHVlIHRvIGl0cyBjb21wbGV4aXR5LCB0aGUgY2FsZW5kYXIgaXMgb25seSBpbml0aWFsaXplZCBvbiBjbGllbnQgc2lkZVxuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgdGhpcy5oeWRyYXRpb25Db21wbGV0ZS50aGVuKCgpID0+IHRoaXMuX2luaXQoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZURhdGUpIHtcbiAgICAgIHRoaXMuX2Fzc2lnbkFjdGl2ZURhdGUoYWN0aXZlRGF0ZSk7XG4gICAgfVxuICAgIHRoaXMuX3dpZGUgPVxuICAgICAgKHRoaXMuX21lZGlhTWF0Y2hlci5tYXRjaGVzKFNiYk1lZGlhUXVlcnlCcmVha3BvaW50TGFyZ2VBbmRBYm92ZSkgPz8gZmFsc2UpICYmIHRoaXMud2lkZTtcbiAgICB0aGlzLl93ZWVrcyA9IHRoaXMuX2NyZWF0ZVdlZWtSb3dzKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHRoaXMuX3llYXJzID0gdGhpcy5fY3JlYXRlWWVhclJvd3MoKTtcbiAgICB0aGlzLl93ZWVrTnVtYmVycyA9IHRoaXMuX2NyZWF0ZVdlZWtOdW1iZXJzKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHRoaXMuX25leHRNb250aFdlZWtzID0gW1tdXTtcbiAgICB0aGlzLl9uZXh0TW9udGhZZWFycyA9IFtbXV07XG4gICAgaWYgKHRoaXMuX3dpZGUpIHtcbiAgICAgIGNvbnN0IG5leHRNb250aERhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxKTtcbiAgICAgIHRoaXMuX25leHRNb250aFdlZWtzID0gdGhpcy5fY3JlYXRlV2Vla1Jvd3MobmV4dE1vbnRoRGF0ZSwgdHJ1ZSk7XG4gICAgICB0aGlzLl9uZXh0TW9udGhZZWFycyA9IHRoaXMuX2NyZWF0ZVllYXJSb3dzKFlFQVJTX1BFUl9QQUdFKTtcbiAgICAgIHRoaXMuX25leHRNb250aFdlZWtOdW1iZXJzID0gdGhpcy5fY3JlYXRlV2Vla051bWJlcnMobmV4dE1vbnRoRGF0ZSk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIG9uIGEgZGF5IGNlbGwgcHJpb3JpdGl6aW5nIHRoZSBzZWxlY3RlZCBkYXksIHRoZSBjdXJyZW50IGRheSwgYW5kIGxhc3RseSwgdGhlIGZpcnN0IHNlbGVjdGFibGUgZGF5LiAqL1xuICBwcml2YXRlIF9mb2N1c0NlbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Jlc2V0Rm9jdXMpIHtcbiAgICAgIHRoaXMuX2dldEZpcnN0Rm9jdXNhYmxlKCk/LmZvY3VzKCk7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGFycmF5IG9mIHdlZWtkYXlzLiAqL1xuICBwcml2YXRlIF9zZXRXZWVrZGF5cygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXJyb3dXZWVrZGF5czogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbmFycm93Jyk7XG4gICAgY29uc3QgbG9uZ1dlZWtkYXlzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdsb25nJyk7XG4gICAgY29uc3Qgd2Vla2RheXM6IFdlZWtkYXlbXSA9IGxvbmdXZWVrZGF5cy5tYXAoKGxvbmc6IHN0cmluZywgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgbG9uZyxcbiAgICAgIG5hcnJvdzogbmFycm93V2Vla2RheXNbaV0sXG4gICAgfSkpO1xuXG4gICAgLy8gUm90YXRlcyB0aGUgbGFiZWxzIGZvciBkYXlzIG9mIHRoZSB3ZWVrIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICBjb25zdCBmaXJzdERheU9mV2VlazogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0Rmlyc3REYXlPZldlZWsoKTtcbiAgICB0aGlzLl93ZWVrZGF5cyA9IHdlZWtkYXlzLnNsaWNlKGZpcnN0RGF5T2ZXZWVrKS5jb25jYXQod2Vla2RheXMuc2xpY2UoMCwgZmlyc3REYXlPZldlZWspKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGRhdGUsIGl0IHJldHVybnMgdGhlIHdlZWsgbnVtYmVycyBmb3IgdGhlIG1vbnRoIHRoZSBkYXRlIGJlbG9uZ3MgdG8uXG4gICAqIFRPRE86IGNoZWNrIGlmIGRhdGUtZm5zIGNhbiBiZSByZXBsYWNlZCB3aXRoIGN1c3RvbSBsb2dpYy5cbiAgICpcbiAgICogU2luY2UgdGhlIGNhbGN1bGF0aW9uIGlzIG5vdCBzaW1wbGUgKHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI051bWJlcmluZyksXG4gICAqIHRoZSBkYXRlLWZucyBsaWJyYXJ5IGhhcyBiZWVuIHVzZWQgdGhpcyB3YXk6XG4gICAqIHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCBhcmUgY2FsY3VsYXRlZCBhbmQgdGhlbiBwYXNzZWQgdG8gdGhlIGBlYWNoV2Vla09mSW50ZXJ2YWxgIGZ1bmN0aW9uLFxuICAgKiB3aGljaCByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHN0YXJ0aW5nIGRheSBvZiBldmVyeSBJU08gd2VlayBvZiB0aGUgbW9udGgsXG4gICAqIGNvbnNpZGVyaW5nIE1vbmRheSBhcyB0aGUgZmlyc3QgZGF5LlxuICAgKiBUaGVuLCB0aGlzIGFycmF5IGlzIG1hcHBlZCB2aWEgdGhlIGBnZXRXZWVrYCBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyB0aGUgSVNPIHdlZWsgbnVtYmVyIGZvciB0aGF0IGRhdGUuXG4gICAqL1xuICBwcml2YXRlIF9jcmVhdGVXZWVrTnVtYmVycyhkYXRlOiBUKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBlYWNoV2Vla09mSW50ZXJ2YWwoXG4gICAgICB7IHN0YXJ0OiBzdGFydE9mTW9udGgoZGF0ZSBhcyBEYXRlKSwgZW5kOiBlbmRPZk1vbnRoKGRhdGUgYXMgRGF0ZSkgfSxcbiAgICAgIHsgd2Vla1N0YXJ0c09uOiAxIH0sXG4gICAgKS5tYXAoKGZpcnN0RGF5T2ZXZWVrOiBEYXRlKSA9PlxuICAgICAgZ2V0V2VlayhmaXJzdERheU9mV2VlaywgeyB3ZWVrU3RhcnRzT246IDEsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgYWxvbmcgdGhlIGhvcml6b250YWwgZGlyZWN0aW9uIGFuZCBzZXRzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgaW4ga2V5Ym9hcmQgbmF2aWdhdGlvbi4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlV2Vla1Jvd3ModmFsdWU6IFQsIGlzU2Vjb25kTW9udGhJblZpZXcgPSBmYWxzZSk6IERheTxUPltdW10ge1xuICAgIGNvbnN0IGRhdGVOYW1lczogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlTmFtZXMoKTtcbiAgICBjb25zdCBkYXlzSW5Nb250aDogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodmFsdWUpO1xuICAgIGNvbnN0IHdlZWtPZmZzZXQ6IG51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldEZpcnN0V2Vla09mZnNldCh2YWx1ZSk7XG4gICAgaWYgKCFpc1NlY29uZE1vbnRoSW5WaWV3KSB7XG4gICAgICB0aGlzLl9rZXlib2FyZE5hdmlnYXRpb25EYXlWaWV3UGFyYW1ldGVycy5maXJzdE1vbnRoTGVuZ3RoID0gZGF5c0luTW9udGg7XG4gICAgICB0aGlzLl9rZXlib2FyZE5hdmlnYXRpb25EYXlWaWV3UGFyYW1ldGVycy5maXJzdE1vbnRoT2Zmc2V0ID0gd2Vla09mZnNldDtcbiAgICAgIHRoaXMuX2tleWJvYXJkTmF2aWdhdGlvbkRheVZpZXdQYXJhbWV0ZXJzLmZpcnN0RGF5SW5WaWV3ID0gdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodmFsdWUpLFxuICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHZhbHVlKSxcbiAgICAgICAgICAxLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2tleWJvYXJkTmF2aWdhdGlvbkRheVZpZXdQYXJhbWV0ZXJzLmxhc3REYXlJblZpZXcgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih2YWx1ZSksXG4gICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodmFsdWUpLFxuICAgICAgICAgIGRheXNJbk1vbnRoLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fa2V5Ym9hcmROYXZpZ2F0aW9uRGF5Vmlld1BhcmFtZXRlcnMuc2Vjb25kTW9udGhPZmZzZXQgPSB3ZWVrT2Zmc2V0O1xuICAgICAgdGhpcy5fa2V5Ym9hcmROYXZpZ2F0aW9uRGF5Vmlld1BhcmFtZXRlcnMubGFzdERheUluVmlldyA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHZhbHVlKSxcbiAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh2YWx1ZSksXG4gICAgICAgICAgZGF5c0luTW9udGgsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICA/IHRoaXMuX2NyZWF0ZVdlZWtSb3dzSG9yaXpvbnRhbCh2YWx1ZSwgZGF0ZU5hbWVzLCBkYXlzSW5Nb250aCwgd2Vla09mZnNldClcbiAgICAgIDogdGhpcy5fY3JlYXRlV2Vla1Jvd3NWZXJ0aWNhbCh2YWx1ZSwgZGF0ZU5hbWVzLCBkYXlzSW5Nb250aCwgd2Vla09mZnNldCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcm93cyBmb3IgZWFjaCB3ZWVrIGluIG9yaWVudGF0aW9uPSdob3Jpem9udGFsJy5cbiAgICpcbiAgICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgZGF5cyBvZiB0aGUgbW9udGhzLCBjcmVhdGVzIGEgRGF5IG9iamVjdCBmb3IgZWFjaCBhbmQgcHVzaGVzIGl0IGludG8gYW5kIGFycmF5LlxuICAgKiBFYWNoIHNldmVuIGRheXMgKGNvbnNpZGVyaW5nIHRoZSBvZmZzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbW9udGgpIHJlc3RhcnRzIGZyb20gYW4gZW1wdHkgYXJyYXkuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgaXMgYSBtYXRyaXggaW4gd2hpY2ggZXZlcnkgcm93IGlzIGEgd2VlayAob3IgcGFydCBvZiBpdCwgY29uc2lkZXJpbmcgb2Zmc2V0KS5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZVdlZWtSb3dzSG9yaXpvbnRhbChcbiAgICB2YWx1ZTogVCxcbiAgICBkYXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgIGRheXNJbk1vbnRoOiBudW1iZXIsXG4gICAgd2Vla09mZnNldDogbnVtYmVyLFxuICApOiBEYXk8VD5bXVtdIHtcbiAgICBjb25zdCB3ZWVrczogRGF5PFQ+W11bXSA9IFtbXV07XG4gICAgZm9yIChsZXQgaSA9IDAsIGNlbGwgPSB3ZWVrT2Zmc2V0OyBpIDwgZGF5c0luTW9udGg7IGkrKywgY2VsbCsrKSB7XG4gICAgICBpZiAoY2VsbCA9PT0gREFZU19QRVJfUk9XKSB7XG4gICAgICAgIHdlZWtzLnB1c2goW10pO1xuICAgICAgICBjZWxsID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHZhbHVlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodmFsdWUpLFxuICAgICAgICBpICsgMSxcbiAgICAgICkhO1xuICAgICAgY29uc3QgaXNvRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShkYXRlKTtcbiAgICAgIHdlZWtzW3dlZWtzLmxlbmd0aCAtIDFdLnB1c2goe1xuICAgICAgICB2YWx1ZTogaXNvRGF0ZSxcbiAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLFxuICAgICAgICBkYXlWYWx1ZTogZGF0ZU5hbWVzW2ldLFxuICAgICAgICBtb250aFZhbHVlOiBTdHJpbmcodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSkpLFxuICAgICAgICB5ZWFyVmFsdWU6IFN0cmluZyh0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpKSxcbiAgICAgICAgd2Vla1ZhbHVlOiBnZXRXZWVrKGlzb0RhdGUsIHsgd2Vla1N0YXJ0c09uOiAxLCBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfSksXG4gICAgICAgIHdlZWtEYXlWYWx1ZTogdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKGRhdGUpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB3ZWVrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByb3dzIGZvciBlYWNoIHdlZWsgaW4gb3JpZW50YXRpb249J3ZlcnRpY2FsJy5cbiAgICpcbiAgICogQ3JlYXRlcyBhIG1hdHJpeCB3aXRoIHNldmVuIGVtcHR5IHJvd3MuXG4gICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGRheXMgb2YgdGhlIG1vbnRocywgY3JlYXRlcyBhIERheSBvYmplY3QgZm9yIGVhY2hcbiAgICogYW5kIHB1c2hlcyBpdCBpbnRvIHRoZSBjb3JyZWN0IGFycmF5IGNvbnNpZGVyaW5nIHRoZSBvZmZzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbW9udGguXG4gICAqIEVhY2ggc2V2ZW4gZGF5cyAoaW5jbHVkaW5nIG9mZnNldCkgcmVzdGFydHMgZnJvbSB0aGUgZmlyc3QuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgaXMgYSBtYXRyaXggaW4gd2hpY2ggZXZlcnkgcm93IGlzIGEgc2V0IG9mIHdlZWtkYXlzLCBzbzpcbiAgICogLSByb3cgMDogYWxsIHRoZSBNb25kYXlzO1xuICAgKiAtIHJvdyAxOiBhbGwgdGhlIFR1ZXNkYXlzO1xuICAgKiAtIC4uLlxuICAgKiAtIHJvdyA3OiBhbGwgdGhlIFN1bmRheXMuXG4gICAqL1xuICBwcml2YXRlIF9jcmVhdGVXZWVrUm93c1ZlcnRpY2FsKFxuICAgIHZhbHVlOiBULFxuICAgIGRhdGVOYW1lczogc3RyaW5nW10sXG4gICAgZGF5c0luTW9udGg6IG51bWJlcixcbiAgICB3ZWVrT2Zmc2V0OiBudW1iZXIsXG4gICk6IERheTxUPltdW10ge1xuICAgIGNvbnN0IHdlZWtzOiBEYXk8VD5bXVtdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogREFZU19QRVJfUk9XIH0sICgpID0+IFtdKTtcbiAgICBmb3IgKGxldCBpID0gMCwgY2VsbCA9IHdlZWtPZmZzZXQ7IGkgPCBkYXlzSW5Nb250aDsgaSsrLCBjZWxsKyspIHtcbiAgICAgIGlmIChjZWxsID09PSBEQVlTX1BFUl9ST1cpIHtcbiAgICAgICAgY2VsbCA9IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih2YWx1ZSksXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHZhbHVlKSxcbiAgICAgICAgaSArIDEsXG4gICAgICApITtcbiAgICAgIGNvbnN0IGlzb0RhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoZGF0ZSk7XG4gICAgICB3ZWVrc1tjZWxsXS5wdXNoKHtcbiAgICAgICAgdmFsdWU6IGlzb0RhdGUsXG4gICAgICAgIGRhdGVWYWx1ZTogZGF0ZSxcbiAgICAgICAgZGF5VmFsdWU6IGRhdGVOYW1lc1tpXSxcbiAgICAgICAgbW9udGhWYWx1ZTogU3RyaW5nKHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpKSxcbiAgICAgICAgeWVhclZhbHVlOiBTdHJpbmcodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSksXG4gICAgICAgIHdlZWtWYWx1ZTogZ2V0V2Vlayhpc29EYXRlLCB7IHdlZWtTdGFydHNPbjogMSwgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pLFxuICAgICAgICB3ZWVrRGF5VmFsdWU6IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2VlayhkYXRlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2Vla3M7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgcm93cyBmb3IgdGhlIG1vbnRoIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVNb250aFJvd3MoKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvcnROYW1lczogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdzaG9ydCcpO1xuICAgIGNvbnN0IG1vbnRoczogTW9udGhbXSA9IG5ldyBBcnJheSgxMikuZmlsbChudWxsKS5tYXAoXG4gICAgICAoXywgaTogbnVtYmVyKTogTW9udGggPT4gKHtcbiAgICAgICAgdmFsdWU6IHNob3J0TmFtZXNbaV0sXG4gICAgICAgIGxvbmdWYWx1ZTogdGhpcy5fbW9udGhOYW1lc1tpXSxcbiAgICAgICAgbW9udGhWYWx1ZTogaSArIDEsXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IDEyIC8gTU9OVEhTX1BFUl9ST1c7XG4gICAgY29uc3QgbW9udGhBcnJheTogTW9udGhbXVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgbW9udGhBcnJheS5wdXNoKG1vbnRocy5zbGljZShNT05USFNfUEVSX1JPVyAqIGksIE1PTlRIU19QRVJfUk9XICogKGkgKyAxKSkpO1xuICAgIH1cbiAgICB0aGlzLl9tb250aHMgPSBtb250aEFycmF5O1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyUm93cyhvZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXJbXVtdIHtcbiAgICBjb25zdCBzdGFydFZhbHVlWWVhclZpZXc6IG51bWJlciA9IHRoaXMuX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpO1xuICAgIGNvbnN0IGFsbFllYXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShZRUFSU19QRVJfUEFHRSlcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKChfLCBpOiBudW1iZXIpID0+IHN0YXJ0VmFsdWVZZWFyVmlldyArIG9mZnNldCArIGkpO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IFlFQVJTX1BFUl9QQUdFIC8gWUVBUlNfUEVSX1JPVztcbiAgICBjb25zdCB5ZWFyQXJyYXk6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICB5ZWFyQXJyYXkucHVzaChhbGxZZWFycy5zbGljZShZRUFSU19QRVJfUk9XICogaSwgWUVBUlNfUEVSX1JPVyAqIChpICsgMSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHllYXJBcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBmaXJzdCB5ZWFyIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgeWVhciBzZWxlY3Rpb24gcGFuZWwuXG4gICAqIElmIGBtaW5EYXRlYCBhbmQgYG1heERhdGVgIGFyZSBib3RoIG51bGwsIHRoZSBzdGFydGluZyB5ZWFyIGlzIGNhbGN1bGF0ZWQgYXNcbiAgICogdGhlIG11bHRpcGxlIG9mIFlFQVJTX1BFUl9QQUdFIGNsb3Nlc3QgdG8gYW5kIGxlc3MgdGhhbiBhY3RpdmVEYXRlLFxuICAgKiBlLmcuLCB3aXRoIGBZRUFSU19QRVJfUEFHRWAgPSAyNCBhbmQgYGFjdGl2ZURhdGVgID0gMjAyMCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDIwMTYgKDI0ICogODMpLFxuICAgKiB3aGlsZSB3aXRoIGBhY3RpdmVEYXRlYCA9IDIwMDAsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiAxOTkyICgyNCAqIDgyKS5cbiAgICogSWYgYG1pbkRhdGVgIGlzIG5vdCBudWxsLCBpdCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHllYXI7IGlmIGBtYXhEYXRlYCBpcyBub3QgbnVsbCxcbiAgICogaXQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB5ZWFyIG1pbnVzIGBZRUFSU19QRVJfUEFHRWAsIHNvIHRoYXQgdGhlIGBtYXhEYXRlYCBpcyB0aGUgbGFzdCByZW5kZXJlZCB5ZWFyLlxuICAgKiBJZiBib3RoIGFyZSBub3QgbnVsbCwgYG1heERhdGVgIGhhcyBwcmlvcml0eSBvdmVyIGBtaW5EYXRlYC5cbiAgICovXG4gIHByaXZhdGUgX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpOiBudW1iZXIge1xuICAgIGxldCBzdGFydGluZ1llYXIgPSAwO1xuICAgIGlmICh0aGlzLm1heCkge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1heCkgLSBZRUFSU19QRVJfUEFHRSArIDE7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1pbikge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1pbik7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZVllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHJldHVybiAoXG4gICAgICBhY3RpdmVZZWFyIC1cbiAgICAgICgoKChhY3RpdmVZZWFyIC0gc3RhcnRpbmdZZWFyKSAlIFlFQVJTX1BFUl9QQUdFKSArIFlFQVJTX1BFUl9QQUdFKSAlIFlFQVJTX1BFUl9QQUdFKVxuICAgICk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIGRhdGUgaXMgd2l0aGluIHRoZSBtaW4tbWF4IHJhbmdlLiAqL1xuICBwcml2YXRlIF9pc0RheUluUmFuZ2UoZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLm1pbiAmJiAhdGhpcy5tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMubWluKSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5taW4hLCB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXRlKSEpID4gMDtcbiAgICBjb25zdCBpc0FmdGVyTWF4OiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5tYXgpICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLm1heCEsIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpISkgPCAwO1xuICAgIHJldHVybiAhKGlzQmVmb3JlTWluIHx8IGlzQWZ0ZXJNYXgpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiBkYXRlIGlzIHdpdGhpbiB0aGUgbWluLW1heCByYW5nZSBpbiBtb250aCB2aWV3LiAqL1xuICBwcml2YXRlIF9pc01vbnRoSW5SYW5nZShtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWluICYmICF0aGlzLm1heCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgaXNCZWZvcmVNaW46IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLm1pbikgJiZcbiAgICAgICh5ZWFyIDwgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1pbiEpIHx8XG4gICAgICAgICh5ZWFyID09PSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubWluISkgJiZcbiAgICAgICAgICBtb250aCA8IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMubWluISkpKTtcblxuICAgIGNvbnN0IGlzQWZ0ZXJNYXg6IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLm1heCkgJiZcbiAgICAgICh5ZWFyID4gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1heCEpIHx8XG4gICAgICAgICh5ZWFyID09PSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubWF4ISkgJiZcbiAgICAgICAgICBtb250aCA+IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMubWF4ISkpKTtcblxuICAgIHJldHVybiAhKGlzQmVmb3JlTWluIHx8IGlzQWZ0ZXJNYXgpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiBkYXRlIGlzIHdpdGhpbiB0aGUgbWluLW1heCByYW5nZSBpbiB5ZWFyIHZpZXcuICovXG4gIHByaXZhdGUgX2lzWWVhckluUmFuZ2UoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLm1pbiAmJiAhdGhpcy5tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMubWluKSAmJiB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubWluISkgPiB5ZWFyO1xuICAgIGNvbnN0IGlzQWZ0ZXJNYXg6IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLm1heCkgJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1heCEpIDwgeWVhcjtcbiAgICByZXR1cm4gIShpc0JlZm9yZU1pbiB8fCBpc0FmdGVyTWF4KTtcbiAgfVxuXG4gIC8vIEltcGxlbWVudGF0aW9uIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFpbi9zcmMvbWF0ZXJpYWwvZGF0ZXBpY2tlci95ZWFyLXZpZXcudHMjTDM2NlxuICBwcml2YXRlIF9pc01vbnRoRmlsdGVyZWRPdXQobW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRhdGVGaWx0ZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0T2ZNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpITtcbiAgICBmb3IgKFxuICAgICAgbGV0IGRhdGU6IFQgPSBmaXJzdE9mTW9udGg7XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSA9PSBtb250aDtcbiAgICAgIGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgMSlcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW1wbGVtZW50YXRpb24gYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYWluL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL211bHRpLXllYXItdmlldy50cyNMMzUxXG4gIHByaXZhdGUgX2lzWWVhckZpbHRlcmVkT3V0KHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRlRmlsdGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE9mWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgMSwgMSkhO1xuICAgIGZvciAoXG4gICAgICBsZXQgZGF0ZTogVCA9IGZpcnN0T2ZZZWFyO1xuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSA9PSB5ZWFyO1xuICAgICAgZGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhkYXRlLCAxKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZGF0ZUZpbHRlcihkYXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIHNlbGVjdGVkIGRhdGUgYW5kIHNldHMgaXQgaW50ZXJuYWxseS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0RGF0ZShkYXk6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zZXRDaG9zZW5ZZWFyKCk7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIC8vIENoZWNrIGlmIF9zZWxlY3RlZCBoYXMgZWxlbWVudHNcbiAgICAgIGlmICh0aGlzLl9zZWxlY3RlZCAmJiAodGhpcy5fc2VsZWN0ZWQgYXMgVFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGluZGV4T2ZTZWxlY3RlZERheTogbnVtYmVyID0gKHRoaXMuX3NlbGVjdGVkIGFzIFRbXSkuZmluZEluZGV4KFxuICAgICAgICAgIChzZWwpID0+IHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHNlbCwgZGF5KSA9PT0gMCxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIGRhdGUgaXMgYWxyZWFkeSBpbiB0aGUgX3NlbGVjdGVkIGFycmF5LCByZW1vdmUgaXQsIG90aGVyd2lzZSBhZGQgaXRcbiAgICAgICAgaWYgKGluZGV4T2ZTZWxlY3RlZERheSAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9ICh0aGlzLl9zZWxlY3RlZCBhcyBUW10pLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXhPZlNlbGVjdGVkRGF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IFsuLi4odGhpcy5fc2VsZWN0ZWQgYXMgVFtdKSwgZGF5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgX3NlbGVjdGVkIGlzIGVtcHR5LCBzZXQgaXRcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBbZGF5XTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2VtaXREYXRlU2VsZWN0ZWRFdmVudCh0aGlzLl9zZWxlY3RlZC5tYXAoKGUpID0+IHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpISkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBzaW5nbGUgc2VsZWN0aW9uLCBjaGVjayBpZiB0aGUgZGF5IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWQgfHwgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fc2VsZWN0ZWQgYXMgVCwgZGF5KSAhPT0gMCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGRheTtcbiAgICAgICAgdGhpcy5fZW1pdERhdGVTZWxlY3RlZEV2ZW50KHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheSkhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG11bHRpcGxlIGRhdGVzIHNlbGVjdGlvbiB2aWEgd2Vla051bWJlciAvIHdlZWtEYXkgYnV0dG9uczpcbiAgICogLSBpZiBDbWQgb3IgQ3RybCBhcmUgcHJlc3NlZCwgYWRkIHRoZSBuZXcgZGF0ZSB0byB0aGUgY3VycmVudCBvbmVzO1xuICAgKiAtIGlmIG5vdCxcbiAgICogICAgIC0gaWYgdGhlIG5ldyBkYXRlcyBhcmUgdGhlIHNhbWUgb2YgdGhlIGN1cnJlbnQgb25lcywgaXQgbWVhbnMgdGhhdCB0aGUgc2FtZSBidXR0b24gaGFzIGJlZW4gY2xpY2tlZCB0d2ljZSwgc28gZG8gbm90aGluZztcbiAgICogICAgIC0gaWYgbm90LCB0aGUgc2VsZWN0ZWQgZGF0ZXMgYXJlIHRoZSBuZXcgb25lcy5cbiAgICovXG4gIHByaXZhdGUgX3NlbGVjdE11bHRpcGxlRGF0ZXMoZGF5czogRGF5PFQ+W10pOiB2b2lkIHtcbiAgICAvLyBGaWx0ZXIgZGlzYWJsZWQgZGF5cyBieSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgYGRheXNgIHBhcmFtZXRlciBhZ2FpbnN0IHRoZSBlbmFibGVkIGNlbGxzLlxuICAgIC8vIFNpbmNlIHRoZSBidXR0b25zJyB2YWx1ZSBpcyBzZXQgdG8gdGhlIERheSdzIGludGVyZmFjZSB2YWx1ZSAoSVNPIHN0cmluZyksIHRoZXJlJ3Mgbm8gbmVlZCB0byBkZXNlcmlhbGl6ZSBpdC5cbiAgICBjb25zdCBlbmFibGVkRGF5czogc3RyaW5nW10gPSB0aGlzLl9jZWxscy5maWx0ZXIoKGUpID0+ICFlLmRpc2FibGVkKS5tYXAoKGUpID0+IGUudmFsdWUpO1xuICAgIGNvbnN0IGRheXNUb0FkZDogc3RyaW5nW10gPSBkYXlzXG4gICAgICAubWFwKChlOiBEYXk8VD4pID0+IGUudmFsdWUpXG4gICAgICAuZmlsdGVyKChpc29EYXRlOiBzdHJpbmcpID0+IGVuYWJsZWREYXlzLmluY2x1ZGVzKGlzb0RhdGUpKTtcbiAgICBjb25zdCBkYXlzVG9BZGRTZXQgPSBuZXcgU2V0KGRheXNUb0FkZCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRTZXQgPSBuZXcgU2V0KCh0aGlzLl9zZWxlY3RlZCBhcyBUW10pLm1hcCgocykgPT4gdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKHMpKSk7XG4gICAgY29uc3Qgc2VsU3RyaW5ncyA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkV2l0aE11bHRpcGxlRGF0ZXMoZGF5c1RvQWRkLCBkYXlzVG9BZGRTZXQsIHNlbGVjdGVkU2V0KTtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHNlbFN0cmluZ3MubWFwKChzKSA9PiB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShzKSEpO1xuXG4gICAgdGhpcy5fZW1pdERhdGVTZWxlY3RlZEV2ZW50KHRoaXMuX3NlbGVjdGVkLm1hcCgoZSkgPT4gdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZSkhKSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIGRhdGVzZWxlY3RlZCBldmVudCBnaXZlbiB0aGUgZGV0YWlsIChhcyBUIG9yIFRbXSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG11bHRpcGxlIGZsYWcpLlxuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdERhdGVTZWxlY3RlZEV2ZW50KGRldGFpbDogVCB8IFRbXSk6IHZvaWQge1xuICAgIC8qKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8VCB8IFRbXT59IEV2ZW50IGVtaXR0ZWQgb24gZGF0ZSBzZWxlY3Rpb24uICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFQgfCBUW10+KCdkYXRlc2VsZWN0ZWQnLCB7XG4gICAgICAgIGRldGFpbCxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluIGNhc2Ugb2YgbXVsdGlwbGUgc2VsZWN0aW9uLCBuZXdseSBhZGRlZCBkYXlzIG11c3QgYmUgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIG9uZXMsIHdpdGhvdXQgZHVwbGljYXRpb24uXG4gICAqIElmIHRoZSBkYXlzIHRvIGFkZCBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgc2VsZWN0ZWQgb25lcywgdGhlIHNldCBtdXN0IGJlIGVtcHRpZWQuXG4gICAqL1xuICBwcml2YXRlIF91cGRhdGVTZWxlY3RlZFdpdGhNdWx0aXBsZURhdGVzKFxuICAgIGRheXNUb0FkZDogc3RyaW5nW10sXG4gICAgZGF5c1RvQWRkU2V0OiBTZXQ8c3RyaW5nPixcbiAgICBzZWxlY3RlZFNldDogU2V0PHN0cmluZz4sXG4gICk6IHN0cmluZ1tdIHtcbiAgICBpZiAoZGF5c1RvQWRkLmV2ZXJ5KChkYXk6IHN0cmluZykgPT4gc2VsZWN0ZWRTZXQuaGFzKGRheSkpKSB7XG4gICAgICBkYXlzVG9BZGRTZXQuZm9yRWFjaCgoZGF5OiBzdHJpbmcpID0+IHNlbGVjdGVkU2V0LmRlbGV0ZShkYXkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5c1RvQWRkU2V0LmZvckVhY2goKGRheTogc3RyaW5nKSA9PiBzZWxlY3RlZFNldC5hZGQoZGF5KSk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHNlbGVjdGVkU2V0KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldENob3NlblllYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgbGV0IHNlbGVjdGVkRGF0ZTogVCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHNlbGVjdGVkRGF0ZSA9ICh0aGlzLnNlbGVjdGVkIGFzIFRbXSkuYXQoLTEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWREYXRlID0gdGhpcy5zZWxlY3RlZCBhcyBUO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hvc2VuWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoc2VsZWN0ZWREYXRlID8/IHRoaXMuX2RhdGVBZGFwdGVyLnRvZGF5KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2lnbkFjdGl2ZURhdGUoZGF0ZTogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1pbiAmJiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLm1pbiwgZGF0ZSkgPiAwKSB7XG4gICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5taW47XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1heCAmJiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLm1heCwgZGF0ZSkgPCAwKSB7XG4gICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5tYXg7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSBkYXRlO1xuICB9XG5cbiAgLyoqIEdvZXMgdG8gdGhlIG1vbnRoIGlkZW50aWZpZWQgYnkgdGhlIHNoaWZ0LiAqL1xuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50TW9udGgobW9udGhzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0KHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIG1vbnRocykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ29Ub0RpZmZlcmVudFllYXIoeWVhcnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3NlblllYXIhICs9IHllYXJzO1xuICAgIC8vIENhbid0IHVzZSBgX2Fzc2lnbkFjdGl2ZURhdGUoLi4uKWAgaGVyZSwgYmVjYXVzZSBpdCB3aWxsIHNldCBpdCB0byBtaW4vbWF4IHZhbHVlIGlmIGFyZ3VtZW50IGlzIG91dCBvZiByYW5nZVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fY2hvc2VuWWVhciEsXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgKTtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50WWVhclJhbmdlKHllYXJzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0KHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgeWVhcnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXZEaXNhYmxlZChwcmV2RGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5taW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHByZXZEYXRlLCB0aGlzLm1pbikgPCAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmV4dERpc2FibGVkKG5leHREYXRlOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLm1heCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUobmV4dERhdGUsIHRoaXMubWF4KSA+IDA7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIHRoZSBcInByZXZpb3VzIG1vbnRoXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfcHJldmlvdXNNb250aERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUsXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpICogLTEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZNb250aCk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIHRoZSBcIm5leHQgbW9udGhcIiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLiAqL1xuICBwcml2YXRlIF9uZXh0TW9udGhEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBsZXQgbmV4dE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgdGhpcy5fd2lkZSA/IDIgOiAxKTtcbiAgICBuZXh0TW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihuZXh0TW9udGgpLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgobmV4dE1vbnRoKSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRNb250aCk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIHRoZSBcInByZXZpb3VzIHllYXJcIiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLiAqL1xuICBwcml2YXRlIF9wcmV2aW91c1llYXJEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpIC0gMSxcbiAgICAgIDEyLFxuICAgICAgMzEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZZZWFyKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdGhlIFwibmV4dCB5ZWFyXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfbmV4dFllYXJEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBuZXh0WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpICsgKHRoaXMuX3dpZGUgPyAyIDogMSksXG4gICAgICAxLFxuICAgICAgMSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9uZXh0RGlzYWJsZWQobmV4dFllYXIpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJwcmV2aW91cyB5ZWFyXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZCBpbiB5ZWFyIHZpZXcuICovXG4gIHByaXZhdGUgX3ByZXZpb3VzWWVhclJhbmdlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldlllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHRoaXMuX3llYXJzWzBdWzBdIC0gMSwgMTIsIDMxKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZZZWFyKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdGhlIFwibmV4dCB5ZWFyXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZCBpbiB5ZWFyIHZpZXcuICovXG4gIHByaXZhdGUgX25leHRZZWFyUmFuZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB5ZWFycyA9IHRoaXMuX3dpZGUgPyB0aGlzLl9uZXh0TW9udGhZZWFycyA6IHRoaXMuX3llYXJzO1xuICAgIGNvbnN0IGxhc3RZZWFyUmFuZ2UgPSB5ZWFyc1t5ZWFycy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBsYXN0WWVhciA9IGxhc3RZZWFyUmFuZ2VbbGFzdFllYXJSYW5nZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBuZXh0WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUobGFzdFllYXIgKyAxLCAxLCAxKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVRhYmxlQmx1cihldmVudFRhcmdldDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnRUYXJnZXQ/LmxvY2FsTmFtZSAhPT0gJ2J1dHRvbicpIHtcbiAgICAgIHRoaXMuX3NldFRhYkluZGV4KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VGFiSW5kZXgoKTogdm9pZCB7XG4gICAgQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvckFsbCgnLnNiYi1jYWxlbmRhcl9fY2VsbFt0YWJpbmRleD1cIjBcIl0nKSA/PyBbXSxcbiAgICApLmZvckVhY2goKGRheSkgPT4gKChkYXkgYXMgSFRNTEVsZW1lbnQpLnRhYkluZGV4ID0gLTEpKTtcbiAgICBjb25zdCBmaXJzdEZvY3VzYWJsZSA9IHRoaXMuX2dldEZpcnN0Rm9jdXNhYmxlKCk7XG4gICAgaWYgKGZpcnN0Rm9jdXNhYmxlKSB7XG4gICAgICBmaXJzdEZvY3VzYWJsZS50YWJJbmRleCA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldCB0aGUgZWxlbWVudCBpbiB0aGUgY2FsZW5kYXIgdG8gYXNzaWduIGZvY3VzLiAqL1xuICBwcml2YXRlIF9nZXRGaXJzdEZvY3VzYWJsZSgpOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdGVkT3JDdXJyZW50ID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oJy5zYmItY2FsZW5kYXJfX3NlbGVjdGVkJykgPz9cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oJy5zYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCcpO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkT3JDdXJyZW50ICYmICFzZWxlY3RlZE9yQ3VycmVudC5kaXNhYmxlZFxuICAgICAgPyBzZWxlY3RlZE9yQ3VycmVudFxuICAgICAgOiB0aGlzLl9jYWxlbmRhclZpZXcgPT09ICdkYXknXG4gICAgICAgID8gdGhpcy5fZ2V0Rmlyc3RGb2N1c2FibGVEYXkoKVxuICAgICAgICA6IHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1jYWxlbmRhcl9fY2VsbDpub3QoW2Rpc2FibGVkXSknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBgZGF5YCB2aWV3IGluIGB2ZXJ0aWNhbGAgb3JpZW50YXRpb24sXG4gICAqIGlmIHRoZSBmaXJzdCBvZiB0aGUgbW9udGggaXMgbm90IGEgTW9uZGF5LCBpdCBpcyBub3QgdGhlIGZpcnN0IHJlbmRlcmVkIGVsZW1lbnQgaW4gdGhlIHRhYmxlLFxuICAgKiBzbyBgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLWNhbGVuZGFyX19jZWxsOm5vdChbZGlzYWJsZWRdKScpYCB3aWxsIHJldHVybiBhIHdyb25nIHZhbHVlLlxuICAgKlxuICAgKiBUbyBzb2x2ZSB0aGlzLCB0aGUgZWxlbWVudCB3aXRoIHRoZSBsb3dlc3QgYHZhbHVlYCBpcyB0YWtlbiAoSVNPIFN0cmluZyBhcmUgb3JkZXJlZCkuXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdEZvY3VzYWJsZURheSgpOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGRheXNJblZpZXc6IEhUTUxCdXR0b25FbGVtZW50W10gPSBBcnJheS5mcm9tKFxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yQWxsKCcuc2JiLWNhbGVuZGFyX19jZWxsOm5vdChbZGlzYWJsZWRdKScpLFxuICAgICk7XG4gICAgaWYgKCFkYXlzSW5WaWV3IHx8IGRheXNJblZpZXcubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlyc3RFbGVtZW50ID0gZGF5c0luVmlldy5tYXAoKGU6IEhUTUxCdXR0b25FbGVtZW50KTogc3RyaW5nID0+IGUudmFsdWUpLnNvcnQoKVswXTtcbiAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoYC5zYmItY2FsZW5kYXJfX2NlbGxbdmFsdWU9XCIke2ZpcnN0RWxlbWVudH1cIl1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXk/OiBEYXk8VD4pOiB2b2lkIHtcbiAgICBpZiAoaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgLy8gR2V0cyB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHRhYmxlJ3MgY2VsbDtcbiAgICAvLyB0aGV5IGNvdWxkIGJlIGRheXMsIG1vbnRocyBvciB5ZWFycyBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gdmlldy5cbiAgICAvLyBJZiBgd2lkZWAgaXMgdHJ1ZSwgeWVhcnMgYXJlIGRvdWJsZWQgaW4gbnVtYmVyIGFuZCBkYXlzIGFyZSAocm91Z2hseSkgZG91YmxlZCB0b28sIGFmZmVjdGluZyB0aGUgYGluZGV4YCBjYWxjdWxhdGlvbi5cbiAgICBjb25zdCBjZWxsczogSFRNTEJ1dHRvbkVsZW1lbnRbXSA9IHRoaXMuX2NlbGxzO1xuICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBjZWxscy5maW5kSW5kZXgoKGU6IEhUTUxCdXR0b25FbGVtZW50KSA9PiBlID09PSBldmVudC50YXJnZXQpO1xuICAgIGxldCBuZXh0RWw6IEhUTUxCdXR0b25FbGVtZW50O1xuICAgIGlmIChkYXkpIHtcbiAgICAgIG5leHRFbCA9IHRoaXMuX25hdmlnYXRlQnlLZXlib2FyZERheVZpZXcoZXZlbnQsIGluZGV4LCBjZWxscywgZGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEVsID0gdGhpcy5fbmF2aWdhdGVCeUtleWJvYXJkKGV2ZW50LCBpbmRleCwgY2VsbHMpO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVFbDogSFRNTEJ1dHRvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QhLmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKG5leHRFbCAhPT0gYWN0aXZlRWwpIHtcbiAgICAgIChuZXh0RWwgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLnRhYkluZGV4ID0gMDtcbiAgICAgIG5leHRFbD8uZm9jdXMoKTtcbiAgICAgIChhY3RpdmVFbCBhcyBIVE1MQnV0dG9uRWxlbWVudCkudGFiSW5kZXggPSAtMTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZUJ5S2V5Ym9hcmREYXlWaWV3KFxuICAgIGV2dDogS2V5Ym9hcmRFdmVudCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGRheTogRGF5PFQ+LFxuICApOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgY29uc3QgYXJyb3dzT2Zmc2V0ID1cbiAgICAgIHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHsgbGVmdFJpZ2h0OiAxLCB1cERvd246IERBWVNfUEVSX1JPVyB9XG4gICAgICAgIDogeyBsZWZ0UmlnaHQ6IERBWVNfUEVSX1JPVywgdXBEb3duOiAxIH07XG4gICAgY29uc3Qgb2Zmc2V0Rm9yVmVydGljYWw6IG51bWJlciA9XG4gICAgICBpbmRleCA8IHRoaXMuX2tleWJvYXJkTmF2aWdhdGlvbkRheVZpZXdQYXJhbWV0ZXJzLmZpcnN0TW9udGhMZW5ndGhcbiAgICAgICAgPyB0aGlzLl9rZXlib2FyZE5hdmlnYXRpb25EYXlWaWV3UGFyYW1ldGVycy5maXJzdE1vbnRoT2Zmc2V0XG4gICAgICAgIDogdGhpcy5fa2V5Ym9hcmROYXZpZ2F0aW9uRGF5Vmlld1BhcmFtZXRlcnMuc2Vjb25kTW9udGhPZmZzZXQ7XG5cbiAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZERheUFycm93cyhjZWxscywgaW5kZXgsIGRheS5kYXRlVmFsdWUsIC1hcnJvd3NPZmZzZXQudXBEb3duKTtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5QXJyb3dzKGNlbGxzLCBpbmRleCwgZGF5LmRhdGVWYWx1ZSwgYXJyb3dzT2Zmc2V0LnVwRG93bik7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZERheUFycm93cyhjZWxscywgaW5kZXgsIGRheS5kYXRlVmFsdWUsIC1hcnJvd3NPZmZzZXQubGVmdFJpZ2h0KTtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZERheUFycm93cyhjZWxscywgaW5kZXgsIGRheS5kYXRlVmFsdWUsIGFycm93c09mZnNldC5sZWZ0UmlnaHQpO1xuICAgICAgY2FzZSAnUGFnZVVwJzoge1xuICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RPZldlZWs6IG51bWJlciA9ICtkYXkuZGF5VmFsdWUgJSBEQVlTX1BFUl9ST1cgfHwgREFZU19QRVJfUk9XO1xuICAgICAgICAgIGNvbnN0IGRlbHRhOiBudW1iZXIgPSBmaXJzdE9mV2VlayAtICtkYXkuZGF5VmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmREYXlQYWdlVXBEb3duKGNlbGxzLCBpbmRleCwgZGF5LCBkZWx0YSwgYXJyb3dzT2Zmc2V0LnVwRG93bik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgd2Vla051bWJlcjogbnVtYmVyID0gTWF0aC5jZWlsKCgrZGF5LmRheVZhbHVlICsgb2Zmc2V0Rm9yVmVydGljYWwpIC8gREFZU19QRVJfUk9XKTtcbiAgICAgICAgICBjb25zdCBmaXJzdE9mV2VlazogbnVtYmVyID0gKHdlZWtOdW1iZXIgLSAxKSAqIERBWVNfUEVSX1JPVyAtIG9mZnNldEZvclZlcnRpY2FsICsgMTtcbiAgICAgICAgICBjb25zdCBkZWx0YTogbnVtYmVyID0gZmlyc3RPZldlZWsgLSArZGF5LmRheVZhbHVlO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5UGFnZVVwRG93bihjZWxscywgaW5kZXgsIGRheSwgZGVsdGEsIGFycm93c09mZnNldC51cERvd24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdQYWdlRG93bic6IHtcbiAgICAgICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgIGNvbnN0IG1vbnRoSW5Cb3VuZHMgPSArZGF5Lm1vbnRoVmFsdWUgKyAxID4gMTIgPyAxIDogK2RheS5tb250aFZhbHVlICsgMTtcbiAgICAgICAgICBjb25zdCB5ZWFySW5Cb3VuZHMgPSArZGF5Lm1vbnRoVmFsdWUgKyAxID4gMTIgPyArZGF5LnllYXJWYWx1ZSArIDEgOiArZGF5LnllYXJWYWx1ZTtcbiAgICAgICAgICBjb25zdCBmaXJzdE5leHRNb250aDogVCA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhckluQm91bmRzLCBtb250aEluQm91bmRzLCAxKTtcbiAgICAgICAgICBjb25zdCBsYXN0T2ZNb250aDogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShcbiAgICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhmaXJzdE5leHRNb250aCwgLTEpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZGVsdGE6IG51bWJlciA9XG4gICAgICAgICAgICBNYXRoLnRydW5jKChsYXN0T2ZNb250aCAtICtkYXkuZGF5VmFsdWUhKSAvIERBWVNfUEVSX1JPVykgKiBEQVlTX1BFUl9ST1c7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmREYXlQYWdlVXBEb3duKGNlbGxzLCBpbmRleCwgZGF5LCBkZWx0YSwgLWFycm93c09mZnNldC51cERvd24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHdlZWtOdW1iZXI6IG51bWJlciA9IE1hdGguY2VpbCgoK2RheS5kYXlWYWx1ZSArIG9mZnNldEZvclZlcnRpY2FsKSAvIERBWVNfUEVSX1JPVyk7XG4gICAgICAgICAgY29uc3QgbGFzdE9mV2VlazogbnVtYmVyID0gd2Vla051bWJlciAqIERBWVNfUEVSX1JPVyAtIG9mZnNldEZvclZlcnRpY2FsO1xuICAgICAgICAgIGNvbnN0IGRlbHRhOiBudW1iZXIgPSBsYXN0T2ZXZWVrIC0gK2RheS5kYXlWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmluZERheVBhZ2VVcERvd24oY2VsbHMsIGluZGV4LCBkYXksIGRlbHRhLCAtYXJyb3dzT2Zmc2V0LnVwRG93bik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5Rmlyc3QoY2VsbHMsIGluZGV4LCBkYXksIDEpO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICBjb25zdCBtb250aEluQm91bmRzID0gK2RheS5tb250aFZhbHVlICsgMSA+IDEyID8gMSA6ICtkYXkubW9udGhWYWx1ZSArIDE7XG4gICAgICAgIGNvbnN0IHllYXJJbkJvdW5kcyA9ICtkYXkubW9udGhWYWx1ZSArIDEgPiAxMiA/ICtkYXkueWVhclZhbHVlICsgMSA6ICtkYXkueWVhclZhbHVlO1xuICAgICAgICBjb25zdCBmaXJzdE5leHRNb250aDogVCA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhckluQm91bmRzLCBtb250aEluQm91bmRzLCAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmREYXlMYXN0KGNlbGxzLCBpbmRleCwgZmlyc3ROZXh0TW9udGgpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNlbGxzW2luZGV4XTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc0RheU91dE9mVmlldyhkYXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZSA8IHRoaXMuX2tleWJvYXJkTmF2aWdhdGlvbkRheVZpZXdQYXJhbWV0ZXJzLmZpcnN0RGF5SW5WaWV3ISB8fFxuICAgICAgZGF0ZSA+IHRoaXMuX2tleWJvYXJkTmF2aWdhdGlvbkRheVZpZXdQYXJhbWV0ZXJzLmxhc3REYXlJblZpZXchXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmREYXlBcnJvd3MoXG4gICAgY2VsbHM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBkYXRlOiBULFxuICAgIGRlbHRhOiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXdEYXRlVmFsdWUgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgZGVsdGEpLFxuICAgICk7XG4gICAgaWYgKHRoaXMuX2lzRGF5T3V0T2ZWaWV3KG5ld0RhdGVWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsc1tpbmRleF07XG4gICAgfVxuICAgIGNvbnN0IG5leHRDZWxsID0gY2VsbHMuZmluZCgoZSkgPT4gZS52YWx1ZSA9PT0gbmV3RGF0ZVZhbHVlKTtcbiAgICBpZiAoIW5leHRDZWxsIHx8IG5leHRDZWxsLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmluZERheUFycm93cyhjZWxscywgaW5kZXgsIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKG5ld0RhdGVWYWx1ZSkhLCBkZWx0YSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Q2VsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmREYXlQYWdlVXBEb3duKFxuICAgIGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZGF5OiBEYXk8VD4sXG4gICAgZGVsdGE6IG51bWJlcixcbiAgICBkZWx0YUlmRGlzYWJsZWQ6IG51bWJlcixcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IG5ld0RhdGVWYWx1ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhkYXkuZGF0ZVZhbHVlLCBkZWx0YSksXG4gICAgKTtcbiAgICBpZiAodGhpcy5faXNEYXlPdXRPZlZpZXcobmV3RGF0ZVZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNlbGxzW2luZGV4XTtcbiAgICB9XG4gICAgY29uc3QgbmV4dENlbGwgPSBjZWxscy5maW5kKChlKSA9PiBlLnZhbHVlID09PSBuZXdEYXRlVmFsdWUpO1xuICAgIGlmICghbmV4dENlbGwgfHwgbmV4dENlbGwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5UGFnZVVwRG93bihjZWxscywgaW5kZXgsIGRheSwgZGVsdGEgKyBkZWx0YUlmRGlzYWJsZWQsIGRlbHRhSWZEaXNhYmxlZCk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Q2VsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmREYXlGaXJzdChcbiAgICBjZWxsczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGRheTogRGF5PFQ+LFxuICAgIGRhdGU6IG51bWJlcixcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IG5ld0RhdGVWYWx1ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoK2RheS55ZWFyVmFsdWUsICtkYXkubW9udGhWYWx1ZSwgZGF0ZSksXG4gICAgKTtcbiAgICBpZiAodGhpcy5faXNEYXlPdXRPZlZpZXcobmV3RGF0ZVZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNlbGxzW2luZGV4XTtcbiAgICB9XG4gICAgY29uc3QgbmV4dENlbGwgPSBjZWxscy5maW5kKChlKSA9PiBlLnZhbHVlID09PSBuZXdEYXRlVmFsdWUpO1xuICAgIGlmICghbmV4dENlbGwgfHwgbmV4dENlbGwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5Rmlyc3QoY2VsbHMsIGluZGV4LCBkYXksIGRhdGUgKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRDZWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZERheUxhc3QoXG4gICAgY2VsbHM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBmaXJzdE5leHRNb250aDogVCxcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IG5ld0RhdGVWYWx1ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhmaXJzdE5leHRNb250aCwgLTEpLFxuICAgICk7XG4gICAgaWYgKHRoaXMuX2lzRGF5T3V0T2ZWaWV3KG5ld0RhdGVWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsc1tpbmRleF07XG4gICAgfVxuICAgIGNvbnN0IG5leHRDZWxsID0gY2VsbHMuZmluZCgoZSkgPT4gZS52YWx1ZSA9PT0gbmV3RGF0ZVZhbHVlKTtcbiAgICBpZiAoIW5leHRDZWxsIHx8IG5leHRDZWxsLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmluZERheUxhc3QoY2VsbHMsIGluZGV4LCB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShuZXdEYXRlVmFsdWUpISk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Q2VsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRvLCBiYXNlZCBvbiBhIGxpc3Qgb2YgZWxlbWVudHMgKHdoaWNoIGNhbiBiZSBwb3RlbnRpYWxseSBkaXNhYmxlZCksXG4gICAqIHRoZSBrZXlib2FyZCBpbnB1dCBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGxpc3QuXG4gICAqIEluIHRoZSBkYXkgdmlldywgdGhlIGBkYXk/OiBEYXlgIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkgZm9yIGNhbGN1bGF0aW9uLFxuICAgKiB3aGlsZSBpbiBtb250aCBhbmQgeWVhciB2aWV3IGl0J3Mgbm90IGR1ZSB0byB0aGUgZml4ZWQgYW1vdW50IG9mIHJlbmRlcmVkIGNlbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBfbmF2aWdhdGVCeUtleWJvYXJkKFxuICAgIGV2dDogS2V5Ym9hcmRFdmVudCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICApOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICBvZmZzZXRGb3JXaWRlTW9kZSxcbiAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSxcbiAgICAgIHZlcnRpY2FsT2Zmc2V0LFxuICAgIH06IENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uTW9udGhZZWFyVmlld3NQYXJhbWV0ZXJzID1cbiAgICAgIHRoaXMuX2NhbGN1bGF0ZVBhcmFtZXRlcnNGb3JLZXlib2FyZE5hdmlnYXRpb24oaW5kZXgsIHRoaXMuX2NhbGVuZGFyVmlldyA9PT0gJ3llYXInKTtcblxuICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIC12ZXJ0aWNhbE9mZnNldCk7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCB2ZXJ0aWNhbE9mZnNldCk7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCAtMSk7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgMSk7XG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRGaXJzdChjZWxscywgb2Zmc2V0Rm9yV2lkZU1vZGUpO1xuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRGaXJzdE9uQ29sdW1uKFxuICAgICAgICAgIGNlbGxzLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlLFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlLFxuICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgICApO1xuICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZExhc3RPbkNvbHVtbihjZWxscywgaW5kZXgsIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSwgdmVydGljYWxPZmZzZXQpO1xuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRMYXN0KGNlbGxzLCBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGUgLSAxKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjZWxsc1tpbmRleF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIGluIGtleWJvYXJkIG5hdmlnYXRpb24gaW4geWVhciBhbmQgbW9udGggdmlldy5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBzdGFydGluZyBlbGVtZW50J3MgaW5kZXggaW4gdGhlIGNlbGwgYXJyYXkuXG4gICAqIEBwYXJhbSBpc1llYXJWaWV3IFdoZXRoZXIgdGhlIGRpc3BsYXllZCBgdmlld2AgaXMgdGhlIHllYXIgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlUGFyYW1ldGVyc0ZvcktleWJvYXJkTmF2aWdhdGlvbihcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGlzWWVhclZpZXc6IGJvb2xlYW4sXG4gICk6IENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uTW9udGhZZWFyVmlld3NQYXJhbWV0ZXJzIHtcbiAgICBjb25zdCBlbGVtZW50c1BlclBhZ2UgPSBpc1llYXJWaWV3ID8gWUVBUlNfUEVSX1BBR0UgOiBNT05USFNfUEVSX1BBR0U7XG4gICAgY29uc3Qgb2Zmc2V0OiBudW1iZXIgPSBNYXRoLnRydW5jKGluZGV4IC8gZWxlbWVudHNQZXJQYWdlKSAqIGVsZW1lbnRzUGVyUGFnZTtcbiAgICBjb25zdCBpbmRleEluVmlldzogbnVtYmVyID0gb2Zmc2V0ID09PSAwID8gaW5kZXggOiBpbmRleCAtIGVsZW1lbnRzUGVyUGFnZTtcbiAgICByZXR1cm4ge1xuICAgICAgdmVydGljYWxPZmZzZXQ6IGlzWWVhclZpZXcgPyBZRUFSU19QRVJfUk9XIDogTU9OVEhTX1BFUl9ST1csXG4gICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogaW5kZXhJblZpZXcsXG4gICAgICBvZmZzZXRGb3JXaWRlTW9kZTogaW5kZXggLSBpbmRleEluVmlldyxcbiAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogb2Zmc2V0ID09PSAwID8gZWxlbWVudHNQZXJQYWdlIDogZWxlbWVudHNQZXJQYWdlICogMixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgcHJvdmlkZWQgYXJyYXkgc3RhcnRpbmcgZnJvbSBgaW5kZXhgIGJ5IGFkZGluZyBgZGVsdGFgLlxuICAgKiBJZiB0aGUgZm91bmQgZWxlbWVudCBpcyBkaXNhYmxlZCwgaXQgY29udGludWVzIGFkZGluZyBgZGVsdGFgIHVudGlsIGl0IGZpbmRzIGFuIGVuYWJsZWQgb25lIGluIHRoZSBhcnJheSBib3VuZHMuXG4gICAqL1xuICBwcml2YXRlIF9maW5kTmV4dChkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLCBpbmRleDogbnVtYmVyLCBkZWx0YTogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGxldCBuZXh0SW5kZXggPSBpbmRleCArIGRlbHRhO1xuICAgIHdoaWxlIChuZXh0SW5kZXggPCBkYXlzLmxlbmd0aCAmJiBkYXlzW25leHRJbmRleF0/LmRpc2FibGVkKSB7XG4gICAgICBuZXh0SW5kZXggKz0gZGVsdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXlzW25leHRJbmRleF0gPz8gZGF5c1tpbmRleF07XG4gIH1cblxuICAvKiogRmluZCB0aGUgZmlyc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZEZpcnN0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGZpcnN0T2ZDdXJyZW50TW9udGg6IG51bWJlcik6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gIWRheXNbZmlyc3RPZkN1cnJlbnRNb250aF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tmaXJzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBmaXJzdE9mQ3VycmVudE1vbnRoLCAxKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsYXN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGxhc3RPZkN1cnJlbnRNb250aDogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiAhZGF5c1tsYXN0T2ZDdXJyZW50TW9udGhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbbGFzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBsYXN0T2ZDdXJyZW50TW9udGgsIC0xKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBmaXJzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHNhbWUgY29sdW1uIG9mIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZEZpcnN0T25Db2x1bW4oXG4gICAgZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXh0SW5kZXggPSAoaW5kZXggJSB2ZXJ0aWNhbE9mZnNldCkgKyBvZmZzZXQ7XG4gICAgcmV0dXJuICFkYXlzW25leHRJbmRleF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tuZXh0SW5kZXhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIG5leHRJbmRleCwgdmVydGljYWxPZmZzZXQpO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGxhc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBzYW1lIGNvbHVtbiBvZiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0T25Db2x1bW4oXG4gICAgZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXh0SW5kZXggPSBpbmRleCArIE1hdGgudHJ1bmMoKG9mZnNldCAtIGluZGV4IC0gMSkgLyB2ZXJ0aWNhbE9mZnNldCkgKiB2ZXJ0aWNhbE9mZnNldDtcbiAgICByZXR1cm4gIWRheXNbbmV4dEluZGV4XS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW25leHRJbmRleF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgbmV4dEluZGV4LCAtdmVydGljYWxPZmZzZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRDYWxlbmRhclZpZXcoaW5pdFRyYW5zaXRpb24gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jb250YWluaW5nRm9jdXMpIHtcbiAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVEYXRlID1cbiAgICAgICh0aGlzLm11bHRpcGxlID8gKHRoaXMuX3NlbGVjdGVkIGFzIFRbXSkuYXQoLTEpIDogKHRoaXMuX3NlbGVjdGVkIGFzIFQpKSA/P1xuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKTtcbiAgICB0aGlzLl9zZXRDaG9zZW5ZZWFyKCk7XG4gICAgdGhpcy5fY2hvc2VuTW9udGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5faW5pdCgpO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLnZpZXc7XG5cbiAgICBpZiAoaW5pdFRyYW5zaXRpb24pIHtcbiAgICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgdmlldyBmb3IgdGhlIGRheSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX3JlbmRlckRheVZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG5leHRNb250aEFjdGl2ZURhdGUgPSB0aGlzLl93aWRlXG4gICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIDEpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzXCI+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRNb250aCgtMSksXG4gICAgICAgICAgaTE4blByZXZpb3VzTW9udGhbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNNb250aERpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLW1vbnRoXCI+XG4gICAgICAgICAgJHt0aGlzLl9jcmVhdGVMYWJlbEZvckRheVZpZXcodGhpcy5fYWN0aXZlRGF0ZSl9XG4gICAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlTGFiZWxGb3JEYXlWaWV3KG5leHRNb250aEFjdGl2ZURhdGUhKSA6IG5vdGhpbmd9XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgJHt0aGlzLl9jcmVhdGVBcmlhTGFiZWxGb3JEYXlWaWV3KHRoaXMuX2FjdGl2ZURhdGUsIG5leHRNb250aEFjdGl2ZURhdGUhKX1cbiAgICAgICAgICA8L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudE1vbnRoKDEpLFxuICAgICAgICAgIGkxOG5OZXh0TW9udGhbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fbmV4dE1vbnRoRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtb3ZlcmZsb3ctYnJlYWtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtY29udGFpbmVyIHNiYi1jYWxlbmRhcl9fdGFibGUtZGF5LXZpZXdcIj5cbiAgICAgICAgICAke3RoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGUodGhpcy5fd2Vla3MsIHRoaXMuX3dlZWtOdW1iZXJzKX1cbiAgICAgICAgICAgICAgICAke3RoaXMuX3dpZGVcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5fY3JlYXRlRGF5VGFibGUodGhpcy5fbmV4dE1vbnRoV2Vla3MsIHRoaXMuX25leHRNb250aFdlZWtOdW1iZXJzLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICBgXG4gICAgICAgICAgICA6IGh0bWxgXG4gICAgICAgICAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlUYWJsZVZlcnRpY2FsKHRoaXMuX3dlZWtzLCB0aGlzLl93ZWVrTnVtYmVycyl9XG4gICAgICAgICAgICAgICAgJHt0aGlzLl93aWRlXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuX2NyZWF0ZURheVRhYmxlVmVydGljYWwoXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmV4dE1vbnRoV2Vla3MsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmV4dE1vbnRoV2Vla051bWJlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dE1vbnRoQWN0aXZlRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgbGFiZWwgd2l0aCB0aGUgbW9udGggZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvckRheVZpZXcoZDogVCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBtb250aExhYmVsID0gYCR7XG4gICAgICB0aGlzLl9tb250aE5hbWVzW3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGQpIC0gMV1cbiAgICB9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkKX1gO1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2RhdGUtc2VsZWN0aW9uIHNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiJHtpMThuWWVhck1vbnRoU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke21vbnRoTGFiZWx9XCJcbiAgICAgICAgQGNsaWNrPSR7KCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAneWVhcic7XG4gICAgICAgICAgdGhpcy5fc3RhcnRUYWJsZVRyYW5zaXRpb24oKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgJHttb250aExhYmVsfVxuICAgICAgICA8c2JiLWljb24gbmFtZT1cImNoZXZyb24tc21hbGwtZG93bi1zbWFsbFwiPjwvc2JiLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGFyaWEtbGFiZWwgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVBcmlhTGFiZWxGb3JEYXlWaWV3KC4uLmRhdGVzOiBUW10pOiBzdHJpbmcge1xuICAgIGxldCBtb250aExhYmVsID0gJyc7XG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGVzKSB7XG4gICAgICBpZiAoZCkge1xuICAgICAgICBtb250aExhYmVsICs9IGAke1xuICAgICAgICAgIHRoaXMuX21vbnRoTmFtZXNbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZCkgLSAxXVxuICAgICAgICB9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1vbnRoTGFiZWw7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgY2FsZW5kYXIgdGFibGUgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZShcbiAgICB3ZWVrczogRGF5PFQ+W11bXSxcbiAgICB3ZWVrTnVtYmVyczogbnVtYmVyW10sXG4gICAgaXNXaWRlTmV4dE1vbnRoOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCB0b2RheTogc3RyaW5nID0gdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKHRoaXMuX2RhdGVBZGFwdGVyLnRvZGF5KCkpO1xuICAgIGNvbnN0IHdlZWtzRm9yU2VsZWN0TXVsdGlwbGVXZWVrTnVtYmVyczogRGF5PFQ+W10gPSAoXG4gICAgICB0aGlzLl93aWRlXG4gICAgICAgID8gWy4uLnRoaXMuX3dlZWtzLCAuLi50aGlzLl9uZXh0TW9udGhXZWVrc11cbiAgICAgICAgOiBpc1dpZGVOZXh0TW9udGhcbiAgICAgICAgICA/IHRoaXMuX25leHRNb250aFdlZWtzXG4gICAgICAgICAgOiB0aGlzLl93ZWVrc1xuICAgICkuZmxhdCgpO1xuICAgIGNvbnN0IHdlZWtzRm9yU2VsZWN0TXVsdGlwbGVXZWVrRGF5czogRGF5PFQ+W10gPSAoXG4gICAgICBpc1dpZGVOZXh0TW9udGggPyB0aGlzLl9uZXh0TW9udGhXZWVrcyA6IHRoaXMuX3dlZWtzXG4gICAgKS5mbGF0KCk7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8dGFibGVcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlXCJcbiAgICAgICAgQGZvY3Vzb3V0PSR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PlxuICAgICAgICAgIHRoaXMuX2hhbmRsZVRhYmxlQmx1cihldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50KX1cbiAgICAgICAgQGFuaW1hdGlvbmVuZD0keyhlOiBBbmltYXRpb25FdmVudCkgPT4gdGhpcy5fdGFibGVBbmltYXRpb25FbmQoZSl9XG4gICAgICA+XG4gICAgICAgIDx0aGVhZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgJHt0aGlzLndlZWtOdW1iZXJzID8gaHRtbGA8dGggY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1jZWxsXCI+PC90aD5gIDogbm90aGluZ31cbiAgICAgICAgICAgICR7dGhpcy5fd2Vla2RheXMubWFwKFxuICAgICAgICAgICAgICAoZGF5OiBXZWVrZGF5LCBpbmRleDogbnVtYmVyKSA9PiBodG1sYFxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICR7dGhpcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19oZWFkZXItY2VsbCBzYmItY2FsZW5kYXJfX3dlZWtkYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7ZGF5Lmxvbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBTdW5kYXlzIGhhdmUgaW5kZXggNywgd2hpbGUgdGhlaXIgd2Vla0RheVZhbHVlIGlzIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXlzOiBEYXk8VD5bXSA9IHdlZWtzRm9yU2VsZWN0TXVsdGlwbGVXZWVrRGF5cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF5OiBEYXk8VD4pID0+IGRheS53ZWVrRGF5VmFsdWUgPT09IChpbmRleCArIDEpICUgNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RNdWx0aXBsZURhdGVzKGRheXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke2RheS5uYXJyb3d9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgIDogaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5PiR7ZGF5Lmxvbmd9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHtkYXkubmFycm93fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBgfVxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIGAsXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtYm9keVwiPlxuICAgICAgICAgICR7d2Vla3MubWFwKCh3ZWVrOiBEYXk8VD5bXSwgcm93SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RSb3dPZmZzZXQ6IG51bWJlciA9IERBWVNfUEVSX1JPVyAtIHdlZWsubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHJvd0luZGV4ID09PSAwICYmIGZpcnN0Um93T2Zmc2V0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICR7dGhpcy53ZWVrTnVtYmVyc1xuICAgICAgICAgICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19oZWFkZXItY2VsbCBzYmItY2FsZW5kYXJfX3dlZWtkYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtgJHtpMThuQ2FsZW5kYXJXZWVrTnVtYmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke3dlZWtOdW1iZXJzWzBdfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5czogRGF5PFQ+W10gPSB3ZWVrc0ZvclNlbGVjdE11bHRpcGxlV2Vla051bWJlcnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF5OiBEYXk8VD4pID0+IGRheS53ZWVrVmFsdWUgPT09IHdlZWtOdW1iZXJzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RNdWx0aXBsZURhdGVzKGRheXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3dlZWtOdW1iZXJzWzBdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiR7YCR7aTE4bkNhbGVuZGFyV2Vla051bWJlclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt3ZWVrTnVtYmVyc1swXX1gfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7d2Vla051bWJlcnNbMF19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAke1suLi5BcnJheShmaXJzdFJvd09mZnNldCkua2V5cygpXS5tYXAoXG4gICAgICAgICAgICAgICAgICAgICgpID0+IGh0bWxgPHRkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1kYXRhXCI+PC90ZD5gLFxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5Q2VsbHMod2VlaywgdG9kYXkpfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICR7dGhpcy53ZWVrTnVtYmVyc1xuICAgICAgICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19oZWFkZXItY2VsbCBzYmItY2FsZW5kYXJfX3dlZWtkYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7YCR7aTE4bkNhbGVuZGFyV2Vla051bWJlclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt3ZWVrTnVtYmVyc1tyb3dJbmRleF19YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheXM6IERheTxUPltdID0gd2Vla3NGb3JTZWxlY3RNdWx0aXBsZVdlZWtOdW1iZXJzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXk6IERheTxUPikgPT4gZGF5LndlZWtWYWx1ZSA9PT0gd2Vla051bWJlcnNbcm93SW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdE11bHRpcGxlRGF0ZXMoZGF5cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7d2Vla051bWJlcnNbcm93SW5kZXhdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+JHtgJHtpMThuQ2FsZW5kYXJXZWVrTnVtYmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke3dlZWtOdW1iZXJzW3Jvd0luZGV4XX1gfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHt3ZWVrTnVtYmVyc1tyb3dJbmRleF19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB9XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5Q2VsbHMod2VlaywgdG9kYXkpfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgYDtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBpbiBvcmllbnRhdGlvbj0ndmVydGljYWwnLiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZVZlcnRpY2FsKFxuICAgIHdlZWtzOiBEYXk8VD5bXVtdLFxuICAgIHdlZWtOdW1iZXJzOiBudW1iZXJbXSxcbiAgICBuZXh0TW9udGhBY3RpdmVEYXRlPzogVCxcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IHRvZGF5OiBzdHJpbmcgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEodGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKSk7XG4gICAgY29uc3Qgd2Vla09mZnNldCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldEZpcnN0V2Vla09mZnNldChcbiAgICAgIG5leHRNb250aEFjdGl2ZURhdGUgPz8gdGhpcy5fYWN0aXZlRGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHdlZWtzRm9yU2VsZWN0TXVsdGlwbGVXZWVrTnVtYmVyczogRGF5PFQ+W10gPSAoXG4gICAgICB0aGlzLl93aWRlXG4gICAgICAgID8gWy4uLnRoaXMuX3dlZWtzLCAuLi50aGlzLl9uZXh0TW9udGhXZWVrc11cbiAgICAgICAgOiBuZXh0TW9udGhBY3RpdmVEYXRlXG4gICAgICAgICAgPyB0aGlzLl9uZXh0TW9udGhXZWVrc1xuICAgICAgICAgIDogdGhpcy5fd2Vla3NcbiAgICApLmZsYXQoKTtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDx0YWJsZVxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgICBAZm9jdXNvdXQ9JHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+XG4gICAgICAgICAgdGhpcy5faGFuZGxlVGFibGVCbHVyKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpfVxuICAgICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICAgID5cbiAgICAgICAgJHt0aGlzLndlZWtOdW1iZXJzXG4gICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICA8dGhlYWQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICR7bmV4dE1vbnRoQWN0aXZlRGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgOiBodG1sYDx0aCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtZGF0YVwiPjwvdGg+YH1cbiAgICAgICAgICAgICAgICAgICR7d2Vla051bWJlcnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAod2Vla051bWJlcjogbnVtYmVyKSA9PiBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19oZWFkZXItY2VsbCBzYmItY2FsZW5kYXJfX3dlZWtkYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7YCR7aTE4bkNhbGVuZGFyV2Vla051bWJlclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt3ZWVrTnVtYmVyfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXlzOiBEYXk8VD5bXSA9IHdlZWtzRm9yU2VsZWN0TXVsdGlwbGVXZWVrTnVtYmVycy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF5OiBEYXk8VD4pID0+IGRheS53ZWVrVmFsdWUgPT09IHdlZWtOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0TXVsdGlwbGVEYXRlcyhkYXlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt3ZWVrTnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+JHtgJHtpMThuQ2FsZW5kYXJXZWVrTnVtYmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke3dlZWtOdW1iZXJ9YH08L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7d2Vla051bWJlcn08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICBgLFxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgYFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgPHRib2R5IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1ib2R5XCI+XG4gICAgICAgICAgJHt3ZWVrcy5tYXAoKHdlZWs6IERheTxUPltdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3ZWVrZGF5ID0gdGhpcy5fd2Vla2RheXNbcm93SW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0YWJsZURheXMgPSB0aGlzLl93aWRlID8gWy4uLndlZWssIC4uLnRoaXMuX25leHRNb250aFdlZWtzW3Jvd0luZGV4XV0gOiB3ZWVrO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAke25leHRNb250aEFjdGl2ZURhdGVcbiAgICAgICAgICAgICAgICAgID8gbm90aGluZ1xuICAgICAgICAgICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19oZWFkZXItY2VsbCBzYmItY2FsZW5kYXJfX3dlZWtkYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7d2Vla2RheS5sb25nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9zZWxlY3RNdWx0aXBsZURhdGVzKHNlbGVjdGFibGVEYXlzKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt3ZWVrZGF5Lm5hcnJvd31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHt3ZWVrZGF5Lmxvbmd9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHt3ZWVrZGF5Lm5hcnJvd308L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICBgfVxuICAgICAgICAgICAgICAgICR7cm93SW5kZXggPCB3ZWVrT2Zmc2V0XG4gICAgICAgICAgICAgICAgICA/IGh0bWxgPHRkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1kYXRhXCI+PC90ZD5gXG4gICAgICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlDZWxscyh3ZWVrLCB0b2RheSl9XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICBgO1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGNlbGxzIGZvciB0aGUgZGFpbHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5Q2VsbHMod2VlazogRGF5PFQ+W10sIHRvZGF5OiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdFtdIHtcbiAgICByZXR1cm4gd2Vlay5tYXAoKGRheTogRGF5PFQ+KSA9PiB7XG4gICAgICBjb25zdCBpc091dE9mUmFuZ2UgPSAhdGhpcy5faXNEYXlJblJhbmdlKGRheS52YWx1ZSk7XG4gICAgICBjb25zdCBpc0ZpbHRlcmVkT3V0ID0gIXRoaXMuX2RhdGVGaWx0ZXIodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF5LnZhbHVlKSEpO1xuICAgICAgY29uc3QgaXNUb2RheSA9IGRheS52YWx1ZSA9PT0gdG9kYXk7XG4gICAgICBsZXQgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICBzZWxlY3RlZCA9XG4gICAgICAgICAgKHRoaXMuX3NlbGVjdGVkIGFzIFRbXSkuZmluZChcbiAgICAgICAgICAgIChzZWxEYXk6IFQpID0+IHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKGRheS5kYXRlVmFsdWUsIHNlbERheSkgPT09IDAsXG4gICAgICAgICAgKSAhPT0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWQgPVxuICAgICAgICAgICEhdGhpcy5fc2VsZWN0ZWQgJiZcbiAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShkYXkuZGF0ZVZhbHVlLCB0aGlzLl9zZWxlY3RlZCBhcyBUKSA9PT0gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8dGRcbiAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEnOiB0cnVlLFxuICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtZGF0YS1zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgIH0pfVxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19kYXknOiB0cnVlLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsLWN1cnJlbnQnOiBpc1RvZGF5LFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jcm9zc2VkLW91dCc6ICFpc091dE9mUmFuZ2UgJiYgaXNGaWx0ZXJlZE91dCxcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fc2VsZWN0RGF0ZShkYXkuZGF0ZVZhbHVlKX1cbiAgICAgICAgICAgID9kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgdmFsdWU9JHtkYXkudmFsdWV9XG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9JHt0aGlzLl9kYXRlQWRhcHRlci5nZXRBY2Nlc3NpYmlsaXR5Rm9ybWF0RGF0ZShkYXkudmFsdWUpfVxuICAgICAgICAgICAgYXJpYS1wcmVzc2VkPSR7c2VsZWN0ZWR9XG4gICAgICAgICAgICBhcmlhLWRpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICBhcmlhLWN1cnJlbnQ9JHtpc1RvZGF5ID8gJ2RhdGUnIDogbm90aGluZ31cbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9oYW5kbGVLZXlib2FyZEV2ZW50KGV2dCwgZGF5KX1cbiAgICAgICAgICAgIHNiYi1wb3BvdmVyLWNsb3NlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgJHtkYXkuZGF5VmFsdWV9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgdmlldyBmb3IgdGhlIG1vbnRoIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfcmVuZGVyTW9udGhWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzXCI+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyKC0xKSxcbiAgICAgICAgICBpMThuUHJldmlvdXNZZWFyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzWWVhckRpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLW1vbnRoXCI+JHt0aGlzLl9jcmVhdGVMYWJlbEZvck1vbnRoVmlldygpfTwvZGl2PlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXIoMSksXG4gICAgICAgICAgaTE4bk5leHRZZWFyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX25leHRZZWFyRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtb3ZlcmZsb3ctYnJlYWtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtY29udGFpbmVyIHNiYi1jYWxlbmRhcl9fdGFibGUtbW9udGgtdmlld1wiPlxuICAgICAgICAgICR7dGhpcy5fY3JlYXRlTW9udGhUYWJsZSh0aGlzLl9tb250aHMsIHRoaXMuX2Nob3NlblllYXIhKX1cbiAgICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVNb250aFRhYmxlKHRoaXMuX21vbnRocywgdGhpcy5fY2hvc2VuWWVhciEgKyAxKSA6IG5vdGhpbmd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSB5ZWFyIGZvciB0aGUgbW9udGhseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvck1vbnRoVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19tb250aC1zZWxlY3Rpb25cIlxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPSR7YCR7aTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt0aGlzLl9jaG9zZW5ZZWFyfWB9XG4gICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KHRydWUpfVxuICAgICAgPlxuICAgICAgICAke3RoaXMuX2Nob3NlblllYXJ9ICR7dGhpcy5fd2lkZSA/IGAgLSAke3RoaXMuX2Nob3NlblllYXIhICsgMX1gIDogbm90aGluZ31cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLXVwLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPiAke3RoaXMuX2Nob3NlblllYXJ9IDwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5gO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHRhYmxlIGZvciB0aGUgbW9udGggc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZU1vbnRoVGFibGUobW9udGhzOiBNb250aFtdW10sIHllYXI6IG51bWJlcik6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDx0YWJsZVxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICAgID5cbiAgICAgICAgJHt0aGlzLl93aWRlXG4gICAgICAgICAgPyBodG1sYDx0aGVhZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1jZWxsXCIgY29sc3Bhbj0ke01PTlRIU19QRVJfUk9XfT4ke3llYXJ9PC90aD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgPHRib2R5IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1ib2R5XCI+XG4gICAgICAgICAgJHttb250aHMubWFwKFxuICAgICAgICAgICAgKHJvdzogTW9udGhbXSkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICR7cm93Lm1hcCgobW9udGg6IE1vbnRoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3NlbGVjdGVkIGFzIFRbXSkuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlOiBUKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09PSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoLm1vbnRoVmFsdWUgPT09IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpLFxuICAgICAgICAgICAgICAgICAgICAgICkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fc2VsZWN0ZWQgYXMgVClcbiAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fc2VsZWN0ZWQgYXMgVClcbiAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICEhdGhpcy5fc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09PSBzZWxlY3RlZFllYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICBtb250aC5tb250aFZhbHVlID09PSBzZWxlY3RlZE1vbnRoO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzTW9udGhJblJhbmdlKG1vbnRoLm1vbnRoVmFsdWUsIHllYXIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9pc01vbnRoRmlsdGVyZWRPdXQobW9udGgubW9udGhWYWx1ZSwgeWVhcik7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRNb250aCA9XG4gICAgICAgICAgICAgICAgICAgIHllYXIgPT09IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKSkgPT09IG1vbnRoLm1vbnRoVmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sYCA8dGRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtZGF0YSc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtbW9udGgnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19waWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCc6IGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX29uTW9udGhTZWxlY3Rpb24obW9udGgubW9udGhWYWx1ZSwgeWVhcil9XG4gICAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD0ke2Ake21vbnRoLmxvbmdWYWx1ZX0gJHt5ZWFyfWB9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1wcmVzc2VkPSR7c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke1N0cmluZyhpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dCl9XG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb250aD0ke21vbnRoLm1vbnRoVmFsdWUgfHwgbm90aGluZ31cbiAgICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZ0KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICR7bW9udGgudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICApfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG5cbiAgLyoqIFNlbGVjdCB0aGUgbW9udGggYW5kIGNoYW5nZSB0aGUgdmlldyB0byBkYXkgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9vbk1vbnRoU2VsZWN0aW9uKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gbW9udGg7XG4gICAgdGhpcy5fbmV4dENhbGVuZGFyVmlldyA9ICdkYXknO1xuICAgIHRoaXMuX2luaXQoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB5ZWFyLFxuICAgICAgICB0aGlzLl9jaG9zZW5Nb250aCxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgdmlldyBmb3IgdGhlIHllYXIgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9yZW5kZXJZZWFyVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9sc1wiPlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhclJhbmdlKC1ZRUFSU19QRVJfUEFHRSksXG4gICAgICAgICAgaTE4blByZXZpb3VzWWVhclJhbmdlKFlFQVJTX1BFUl9QQUdFKVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c1llYXJSYW5nZURpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLW1vbnRoXCI+JHt0aGlzLl9jcmVhdGVMYWJlbEZvclllYXJWaWV3KCl9PC9kaXY+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhclJhbmdlKFlFQVJTX1BFUl9QQUdFKSxcbiAgICAgICAgICBpMThuTmV4dFllYXJSYW5nZShZRUFSU19QRVJfUEFHRSlbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fbmV4dFllYXJSYW5nZURpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLW92ZXJmbG93LWJyZWFrXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWNvbnRhaW5lciBzYmItY2FsZW5kYXJfX3RhYmxlLXllYXItdmlld1wiPlxuICAgICAgICAgICR7dGhpcy5fY3JlYXRlWWVhclRhYmxlKHRoaXMuX3llYXJzKX1cbiAgICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVZZWFyVGFibGUodGhpcy5fbmV4dE1vbnRoWWVhcnMsIHRydWUpIDogbm90aGluZ31cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGJ1dHRvbiBhcnJvdyBmb3IgYWxsIHRoZSB2aWV3cy4gKi9cbiAgcHJpdmF0ZSBfZ2V0QXJyb3coXG4gICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnLFxuICAgIGNsaWNrOiAoKSA9PiB2b2lkLFxuICAgIGFyaWFMYWJlbDogc3RyaW5nLFxuICAgIGRpc2FibGVkOiBib29sZWFuLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICBzaXplPVwibVwiXG4gICAgICBpY29uLW5hbWU9XCJjaGV2cm9uLXNtYWxsLSR7ZGlyZWN0aW9ufS1zbWFsbFwiXG4gICAgICBhcmlhLWxhYmVsPSR7YXJpYUxhYmVsfVxuICAgICAgQGNsaWNrPSR7Y2xpY2t9XG4gICAgICA/ZGlzYWJsZWQ9JHtkaXNhYmxlZH1cbiAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19jb250cm9scy0ke2RpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ3ByZXZpb3VzJyA6ICduZXh0J31cIlxuICAgID48L3NiYi1zZWNvbmRhcnktYnV0dG9uPmA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgbGFiZWwgd2l0aCB0aGUgeWVhciByYW5nZSBmb3IgdGhlIHllYXJseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvclllYXJWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBmaXJzdFllYXI6IG51bWJlciA9IHRoaXMuX3llYXJzLmZsYXQoKVswXTtcbiAgICBjb25zdCBsYXN0WWVhckFycmF5OiBudW1iZXJbXSA9ICh0aGlzLl93aWRlID8gdGhpcy5fbmV4dE1vbnRoWWVhcnMgOiB0aGlzLl95ZWFycykuZmxhdCgpO1xuICAgIGNvbnN0IGxhc3RZZWFyOiBudW1iZXIgPSBsYXN0WWVhckFycmF5W2xhc3RZZWFyQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgeWVhckxhYmVsID0gYCR7Zmlyc3RZZWFyfSAtICR7bGFzdFllYXJ9YDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX195ZWFyLXNlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1jaGFuZ2UtZGF0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2kxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7eWVhckxhYmVsfVwiXG4gICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KHRydWUpfVxuICAgICAgPlxuICAgICAgICAke3llYXJMYWJlbH1cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLXVwLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPiAke3llYXJMYWJlbH0gPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyVGFibGUoeWVhcnM6IG51bWJlcltdW10sIHNoaWZ0UmlnaHQgPSBmYWxzZSk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBub3cgPSB0aGlzLl9kYXRlQWRhcHRlci50b2RheSgpO1xuICAgIHJldHVybiBodG1sYCA8dGFibGVcbiAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICA+XG4gICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgJHt5ZWFycy5tYXAoXG4gICAgICAgICAgKHJvdzogbnVtYmVyW10pID0+XG4gICAgICAgICAgICBodG1sYCA8dHI+XG4gICAgICAgICAgICAgICR7cm93Lm1hcCgoeWVhcjogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkOiBib29sZWFuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLl9zZWxlY3RlZCBhcyBUW10pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgKGRhdGU6IFQpID0+IHllYXIgPT09IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSksXG4gICAgICAgICAgICAgICAgICAgICkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX3NlbGVjdGVkIGFzIFQpXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSAhIXRoaXMuX3NlbGVjdGVkICYmIHllYXIgPT09IHNlbGVjdGVkWWVhcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzWWVhckluUmFuZ2UoeWVhcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9pc1llYXJGaWx0ZXJlZE91dCh5ZWFyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihub3cpID09PSB5ZWFyO1xuICAgICAgICAgICAgICAgIHJldHVybiBodG1sYCA8dGQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEgc2JiLWNhbGVuZGFyX190YWJsZS15ZWFyXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3BpbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCc6IGlzQ3VycmVudFllYXIsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX29uWWVhclNlbGVjdGlvbih5ZWFyLCBzaGlmdFJpZ2h0KX1cbiAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHt5ZWFyfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLXByZXNzZWQ9JHtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke1N0cmluZyhpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dCl9XG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXllYXI9JHt5ZWFyIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5faGFuZGxlS2V5Ym9hcmRFdmVudChldnQpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAke3llYXJ9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3RkPmA7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC90cj5gLFxuICAgICAgICApfVxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG4gIH1cblxuICAvKiogU2VsZWN0IHRoZSB5ZWFyIGFuZCBjaGFuZ2UgdGhlIHZpZXcgdG8gbW9udGggc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9vblllYXJTZWxlY3Rpb24oeWVhcjogbnVtYmVyLCByaWdodFNpZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5ZZWFyID0gcmlnaHRTaWRlID8geWVhciAtIDEgOiB5ZWFyO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAnbW9udGgnO1xuICAgIHRoaXMuX2Fzc2lnbkFjdGl2ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9jaG9zZW5ZZWFyLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgaWYgKGlzU2VydmVyIHx8IHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIC8vIFRPRE86IFdlIGRpc2FibGUgU1NSIGZvciBjYWxlbmRhciBmb3Igbm93LiBGaWd1cmUgb3V0LCBpZiB0aGVyZSBpcyBhIHdheVxuICAgICAgLy8gdG8gZW5hYmxlIGl0LCB3aGlsZSBjb25zaWRlcmluZyBpMThuIGFuZCBkYXRlIGluZm9ybWF0aW9uLlxuICAgICAgcmV0dXJuIGh0bWxgJHtub3RoaW5nfWA7XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5fY2FsZW5kYXJWaWV3KSB7XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclllYXJWaWV3KCk7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJNb250aFZpZXcoKTtcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRGF5VmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RhYmxlQW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYmxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnaGlkZScpIHtcbiAgICAgIHRhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ3NiYi1jYWxlbmRhcl9fdGFibGUtaGlkZScpO1xuICAgICAgaWYgKHRoaXMuX2NvbnRhaW5pbmdGb2N1cykge1xuICAgICAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhbGVuZGFyVmlldyA9IHRoaXMuX25leHRDYWxlbmRhclZpZXc7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnc2hvdycpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ3RyYW5zaXRpb24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdGFydFRhYmxlVHJhbnNpdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmludGVybmFscy5zdGF0ZXMuYWRkKCd0cmFuc2l0aW9uJyk7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJylcbiAgICAgID8uZm9yRWFjaCgoZSkgPT4gZS5jbGFzc0xpc3QudG9nZ2xlKCdzYmItY2FsZW5kYXJfX3RhYmxlLWhpZGUnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX193cmFwcGVyXCI+JHt0aGlzLl9nZXRWaWV3KCl9PC9kaXY+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLWNhbGVuZGFyJzogU2JiQ2FsZW5kYXJFbGVtZW50O1xuICB9XG59XG4iXSwibmFtZXMiOlsiZGVmYXVsdE9wdGlvbnMiLCJkYXkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0RU8sTUFBTSxxQkFBcUI7QUEySTNCLE1BQU0sc0JBQXNCLHVCQUFPLElBQUksbUJBQW1CO0FDbEwxRCxTQUFTLGNBQWMsTUFBTSxPQUFPO0FBQ3pDLE1BQUksT0FBTyxTQUFTLFdBQVksUUFBTyxLQUFLLEtBQUs7QUFFakQsTUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFZLHVCQUF1QjtBQUM3RCxXQUFPLEtBQUssbUJBQW1CLEVBQUUsS0FBSztBQUV4QyxNQUFJLGdCQUFnQixLQUFNLFFBQU8sSUFBSSxLQUFLLFlBQVksS0FBSztBQUUzRCxTQUFPLElBQUksS0FBSyxLQUFLO0FBQ3ZCO0FDTk8sU0FBUyxPQUFPLFVBQVUsU0FBUztBQUV4QyxTQUFPLGNBQWMsV0FBVyxVQUFVLFFBQVE7QUFDcEQ7QUNkTyxTQUFTLFFBQVEsTUFBTSxRQUFRLFNBQVM7QUFDN0MsUUFBTSxRQUFRLE9BQU8sTUFBTSxTQUFTLEVBQUU7QUFDdEMsTUFBSSxNQUFNLE1BQU0sRUFBRyxRQUFPLGNBQTZCLE1BQU0sR0FBRztBQUdoRSxNQUFJLENBQUMsT0FBUSxRQUFPO0FBRXBCLFFBQU0sUUFBUSxNQUFNLFFBQU8sSUFBSyxNQUFNO0FBQ3RDLFNBQU87QUFDVDtBQ3RDQSxJQUFJLGlCQUFpQixDQUFBO0FBRWQsU0FBUyxvQkFBb0I7QUFDbEMsU0FBTztBQUNUO0FDOEJPLFNBQVMsWUFBWSxNQUFNLFNBQVM7QUFDekMsUUFBTUEsa0JBQWlCLGtCQUFpQjtBQUN4QyxRQUFNLGVBQ0osU0FBUyxnQkFDVCxTQUFTLFFBQVEsU0FBUyxnQkFDMUJBLGdCQUFlLGdCQUNmQSxnQkFBZSxRQUFRLFNBQVMsZ0JBQ2hDO0FBRUYsUUFBTSxRQUFRLE9BQU8sTUFBTSxTQUFTLEVBQUU7QUFDdEMsUUFBTSxNQUFNLE1BQU0sT0FBTTtBQUN4QixRQUFNLFFBQVEsTUFBTSxlQUFlLElBQUksS0FBSyxNQUFNO0FBRWxELFFBQU0sUUFBUSxNQUFNLFFBQU8sSUFBSyxJQUFJO0FBQ3BDLFFBQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLFNBQU87QUFDVDtBQ2hETyxTQUFTLGVBQWUsWUFBWSxPQUFPO0FBQ2hELFFBQU0sWUFBWSxjQUFjO0FBQUEsSUFDOUI7QUFBQSxJQUNBLFdBQVcsTUFBTSxLQUFLLENBQUMsU0FBUyxPQUFPLFNBQVMsUUFBUTtBQUFBLEVBQzVEO0FBQ0UsU0FBTyxNQUFNLElBQUksU0FBUztBQUM1QjtBQ29CTyxTQUFTLFNBQVMsTUFBTSxRQUFRLFNBQVM7QUFDOUMsU0FBTyxRQUFRLE1BQU0sU0FBUyxHQUFHLE9BQU87QUFDMUM7QUNGTyxTQUFTLFdBQVcsTUFBTSxTQUFTO0FBQ3hDLFFBQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxFQUFFO0FBQ3RDLFFBQU0sUUFBUSxNQUFNLFNBQVE7QUFDNUIsUUFBTSxZQUFZLE1BQU0sWUFBVyxHQUFJLFFBQVEsR0FBRyxDQUFDO0FBQ25ELFFBQU0sU0FBUyxJQUFJLElBQUksSUFBSSxHQUFHO0FBQzlCLFNBQU87QUFDVDtBQ2hDTyxTQUFTLGtCQUFrQixTQUFTLFVBQVU7QUFDbkQsUUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQWUsU0FBUyxTQUFTLE9BQU8sU0FBUyxHQUFHO0FBQ3pFLFNBQU8sRUFBRSxPQUFPLElBQUc7QUFDckI7QUN3Q08sU0FBUyxtQkFBbUIsVUFBVSxTQUFTO0FBQ3BELFFBQU0sRUFBRSxPQUFPLElBQUcsSUFBSyxrQkFBa0IsU0FBUyxJQUFJLFFBQVE7QUFFOUQsTUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDO0FBQ3pCLFFBQU0sZ0JBQWdCLFdBQ2xCLFlBQVksS0FBSyxPQUFPLElBQ3hCLFlBQVksT0FBTyxPQUFPO0FBQzlCLFFBQU0sY0FBYyxXQUNoQixZQUFZLE9BQU8sT0FBTyxJQUMxQixZQUFZLEtBQUssT0FBTztBQUU1QixnQkFBYyxTQUFTLEVBQUU7QUFDekIsY0FBWSxTQUFTLEVBQUU7QUFFdkIsUUFBTSxVQUFVLENBQUMsWUFBWSxRQUFPO0FBQ3BDLE1BQUksY0FBYztBQUVsQixNQUFJLE9BQU8sU0FBUyxRQUFRO0FBQzVCLE1BQUksQ0FBQyxLQUFNLFFBQU8sQ0FBQTtBQUNsQixNQUFJLE9BQU8sR0FBRztBQUNaLFdBQU8sQ0FBQztBQUNSLGVBQVcsQ0FBQztBQUFBLEVBQ2Q7QUFFQSxRQUFNLFFBQVEsQ0FBQTtBQUVkLFNBQU8sQ0FBQyxlQUFlLFNBQVM7QUFDOUIsZ0JBQVksU0FBUyxDQUFDO0FBQ3RCLFVBQU0sS0FBSyxjQUFjLE9BQU8sV0FBVyxDQUFDO0FBQzVDLGtCQUFjLFNBQVMsYUFBYSxJQUFJO0FBQ3hDLGdCQUFZLFNBQVMsRUFBRTtBQUFBLEVBQ3pCO0FBRUEsU0FBTyxXQUFXLE1BQU0sUUFBTyxJQUFLO0FBQ3RDO0FDbERPLFNBQVMsYUFBYSxNQUFNLFNBQVM7QUFDMUMsUUFBTSxRQUFRLE9BQU8sTUFBTSxTQUFTLEVBQUU7QUFDdEMsUUFBTSxRQUFRLENBQUM7QUFDZixRQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6QixTQUFPO0FBQ1Q7QUNTTyxTQUFTLFlBQVksTUFBTSxTQUFTO0FBQ3pDLFFBQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxFQUFFO0FBQ3RDLFFBQU0sT0FBTyxNQUFNLFlBQVc7QUFFOUIsUUFBTUEsa0JBQWlCLGtCQUFpQjtBQUN4QyxRQUFNLHdCQUNKLFNBQVMseUJBQ1QsU0FBUyxRQUFRLFNBQVMseUJBQzFCQSxnQkFBZSx5QkFDZkEsZ0JBQWUsUUFBUSxTQUFTLHlCQUNoQztBQUVGLFFBQU0sc0JBQXNCLGNBQWMsU0FBUyxNQUFNLE1BQU0sQ0FBQztBQUNoRSxzQkFBb0IsWUFBWSxPQUFPLEdBQUcsR0FBRyxxQkFBcUI7QUFDbEUsc0JBQW9CLFNBQVMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN2QyxRQUFNLGtCQUFrQixZQUFZLHFCQUFxQixPQUFPO0FBRWhFLFFBQU0sc0JBQXNCLGNBQWMsU0FBUyxNQUFNLE1BQU0sQ0FBQztBQUNoRSxzQkFBb0IsWUFBWSxNQUFNLEdBQUcscUJBQXFCO0FBQzlELHNCQUFvQixTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdkMsUUFBTSxrQkFBa0IsWUFBWSxxQkFBcUIsT0FBTztBQUVoRSxNQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQjtBQUM5QixXQUFPLE9BQU87QUFBQSxFQUNoQixXQUFXLENBQUMsU0FBUyxDQUFDLGlCQUFpQjtBQUNyQyxXQUFPO0FBQUEsRUFDVCxPQUFPO0FBQ0wsV0FBTyxPQUFPO0FBQUEsRUFDaEI7QUFDRjtBQzFCTyxTQUFTLGdCQUFnQixNQUFNLFNBQVM7QUFDN0MsUUFBTUEsa0JBQWlCLGtCQUFpQjtBQUN4QyxRQUFNLHdCQUNKLFNBQVMseUJBQ1QsU0FBUyxRQUFRLFNBQVMseUJBQzFCQSxnQkFBZSx5QkFDZkEsZ0JBQWUsUUFBUSxTQUFTLHlCQUNoQztBQUVGLFFBQU0sT0FBTyxZQUFZLE1BQU0sT0FBTztBQUN0QyxRQUFNLFlBQVksY0FBYyxTQUFTLE1BQU0sTUFBTSxDQUFDO0FBQ3RELFlBQVUsWUFBWSxNQUFNLEdBQUcscUJBQXFCO0FBQ3BELFlBQVUsU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdCLFFBQU0sUUFBUSxZQUFZLFdBQVcsT0FBTztBQUM1QyxTQUFPO0FBQ1Q7QUNsQk8sU0FBUyxRQUFRLE1BQU0sU0FBUztBQUNyQyxRQUFNLFFBQVEsT0FBTyxNQUFNLFNBQVMsRUFBRTtBQUN0QyxRQUFNLE9BQU8sQ0FBQyxZQUFZLE9BQU8sT0FBTyxJQUFJLENBQUMsZ0JBQWdCLE9BQU8sT0FBTztBQUszRSxTQUFPLEtBQUssTUFBTSxPQUFPLGtCQUFrQixJQUFJO0FBQ2pEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ21FTSxzQkFBa0IsTUFBQTs7MEJBRHZCLGNBQWMsY0FBYyxDQUFDOzs7O0FBQ2EsTUFBQSxjQUFBLGtCQUFrQix5QkFBeUIsVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTlELEVBQUEsbUJBQVEsWUFBdUQ7QUFBQSxJQTZLaEcsY0FBQTtBQUNFLFlBQUE7QUFyS0Y7QUFHWTtBQVFaO0FBUUE7QUFRQTtBQW1DUztBQUlUO0FBRzZCO0FBSzdCO0FBS1M7QUFlQTtBQTREVDtBQTFKZ0IseUJBQUEseUJBVFosa0JBQUEsTUFBQSwwQkFBQSxHQUFrQixrQkFBQSxNQUFBLG9CQVNVLEtBQUs7QUFHVCx5QkFBQSx5QkFBQSxrQkFBQSxNQUFBLHVCQUFBLEdBQUEsa0JBQUEsTUFBQSxvQkFBcUIsS0FBSztBQVF0Qyx5QkFBQSx3QkFBQSxrQkFBQSxNQUFBLHVCQUFBLEdBQUEsa0JBQUEsTUFBQSxtQkFBZ0IsSUFBSTtBQVFwQix5QkFBQSx3QkFBQSxrQkFBQSxNQUFBLHNCQUFBLEdBQUEsa0JBQUEsTUFBQSxtQkFBZ0IsSUFBSTtBQVFwQix5QkFBQSw2QkFBQSxrQkFBQSxNQUFBLHNCQUFBLEdBQUEsa0JBQUEsTUFBQSx3QkFBb0IsS0FBSztBQW1DZix5QkFBQSw4QkFBQSxrQkFBQSxNQUFBLDJCQUFBLEdBQUEsa0JBQUEsTUFBQSx5QkFBNEIsSUFBSTtBQUkxQyx5QkFBQSwrQkFBQSxrQkFBQSxNQUFBLDRCQUFBLEdBQUEsa0JBQUEsTUFBQSwwQkFBbUQsSUFBSTtBQUcxQix5QkFBQSxnQ0FBQSxrQkFBQSxNQUFBLDZCQUFBLEdBQUEsa0JBQUEsTUFBQSwyQkFBOEIsWUFBWTtBQUt2RSx5QkFBQSxnQ0FBQSxrQkFBQSxNQUFBLDhCQUFBLEdBQUEsa0JBQUEsTUFBQSwyQkFBdUIsS0FBSztBQUVwQyxXQUFBLGdCQUFZLGtCQUFBLE1BQUEsOEJBQUEsR0FBbUIsYUFBYSxVQUFVLGVBQWU7QUFHbkQseUJBQUEsK0JBQUEsa0JBQUEsTUFBQSwyQkFBaUIsS0FBSyxhQUFhLE9BQU87QUFhNUQsV0FBQSxpQkFBYSxrQkFBQSxNQUFBLDhCQUFBLEdBQVk7QUFFUCx5QkFBQSxpQ0FBQSxrQkFBQSxNQUFBLDZCQUE4QixLQUFLO0FBRXJELFdBQUEscUJBQWlCLGtCQUFBLE1BQUEsZ0NBQUEsR0FBaUI7QUFHbEMsV0FBQSx1Q0FBb0Y7QUFBQSxRQUMxRixnQkFBZ0I7QUFBQSxRQUNoQixlQUFlO0FBQUEsUUFDZixrQkFBa0I7QUFBQSxRQUNsQixrQkFBa0I7QUFBQSxRQUNsQixtQkFBbUI7QUFBQSxNQUFBO0FBT2IsV0FBQSxTQUFxQixDQUFBO0FBZXJCLFdBQUEsY0FBd0IsS0FBSyxhQUFhLGNBQWMsTUFBTTtBQXNCOUQsV0FBQSxjQUFjO0FBR2QsV0FBQSxtQkFBbUI7QUFHVix5QkFBQSxnQ0FBQSxrQkFBQSxNQUFBLDRCQUFlLEtBQUs7QUFFN0IsV0FBQSxhQUFTLGtCQUFBLE1BQUEsK0JBQUEsR0FBRyxJQUFJLHNCQUFzQixJQUFJLEVBQUUsWUFBWSxNQUFLO0FBQ25FLGFBQUssY0FBYyxLQUFLLGFBQWEsY0FBYyxNQUFNO0FBQ3pELGFBQUssaUJBQUE7QUFBQSxNQUNQLENBQUM7QUFDTyxXQUFBLGdCQUFnQixJQUFJLDBCQUEwQixNQUFNO0FBQUEsUUFDMUQsQ0FBQyxvQ0FBb0MsR0FBRyxNQUFNLEtBQUssTUFBQTtBQUFBLE1BQUssQ0FDekQ7QUFJQyxXQUFLLGlCQUFBO0FBQ0wsV0FBSyxhQUFBO0FBS0wsV0FBSyxpQkFBaUIsV0FBVyxNQUFPLEtBQUssbUJBQW1CLElBQUs7QUFDckUsV0FBSyxpQkFBaUIsWUFBWSxNQUFPLEtBQUssbUJBQW1CLEtBQU07QUFBQSxJQUN6RTtBQUFBO0FBQUEsSUE5S0EsSUFBZ0IsT0FBSTtBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBcEIsSUFBZ0IsS0FBSSxPQUFBO0FBQUEseUJBQUEsd0JBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQUdSLElBQWdCLE9BQUk7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQXBCLElBQWdCLEtBQUksT0FBQTtBQUFBLHlCQUFBLHdCQUFBO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFRaEMsSUFBZ0IsTUFBRztBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBbkIsSUFBZ0IsSUFBRyxPQUFBO0FBQUEseUJBQUEsdUJBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVFuQixJQUFnQixNQUFHO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUFuQixJQUFnQixJQUFHLE9BQUE7QUFBQSx5QkFBQSx1QkFBQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBUW5CLElBQWdCLFdBQVE7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQXhCLElBQWdCLFNBQVEsT0FBQTtBQUFBLHlCQUFBLDRCQUFBO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTXhCLElBQVcsU0FBUyxPQUFxQjtBQUN2QyxVQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDeEIsYUFBSyxZQUFZLE1BQ2QsSUFBSSxDQUFDLGFBQ0osS0FBSyxhQUFhLG1CQUFtQixLQUFLLGFBQWEsWUFBWSxRQUFRLENBQUMsQ0FBQyxFQUU5RSxPQUFPLENBQUMsU0FBOEIsU0FBUyxJQUFJLEVBQ25ELE9BQ0MsQ0FBQyxTQUNDLENBQUMsS0FBSyxjQUFjLEtBQUssYUFBYSxVQUFVLElBQUksQ0FBQyxLQUFLLEtBQUssWUFBWSxJQUFJLENBQUM7QUFBQSxNQUV4RixPQUFPO0FBQ0wsY0FBTSxlQUFlLEtBQUssYUFBYSxtQkFDckMsS0FBSyxhQUFhLFlBQVksS0FBSyxDQUFDO0FBRXRDLFlBQ0UsQ0FBQyxDQUFDLGlCQUNELENBQUMsS0FBSyxjQUFjLEtBQUssYUFBYSxVQUFVLFlBQVksQ0FBQyxLQUM1RCxLQUFLLFlBQVksWUFBWSxJQUMvQjtBQUNBLGVBQUssWUFBWTtBQUFBLFFBQ25CLE9BQU87QUFDTCxlQUFLLFlBQVk7QUFBQSxRQUNuQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxJQUFXLFdBQVE7QUFDakIsYUFBTyxLQUFLO0FBQUEsSUFDZDtBQUFBLElBQ1MsSUFBaUIsWUFBUztBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBMUIsSUFBaUIsVUFBUyxPQUFBO0FBQUEseUJBQUEsNkJBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQUluQyxJQUFnQixhQUFVO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUExQixJQUFnQixXQUFVLE9BQUE7QUFBQSx5QkFBQSw4QkFBQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBR0csSUFBZ0IsY0FBVztBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBM0IsSUFBZ0IsWUFBVyxPQUFBO0FBQUEseUJBQUEsK0JBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQUt4RCxJQUFnQixjQUFXO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUEzQixJQUFnQixZQUFXLE9BQUE7QUFBQSx5QkFBQSwrQkFBQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBS2xCLElBQWlCLGNBQVc7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQTVCLElBQWlCLFlBQVcsT0FBQTtBQUFBLHlCQUFBLCtCQUFBO0FBQUEsSUFBQTtBQUFBO0FBQUEsSUFJckMsSUFBWSxNQUFNLE1BQWE7QUFDN0IsV0FBSyxZQUFZLFFBQVEsSUFBSTtBQUM3QixXQUFLLGdCQUFnQjtBQUFBLElBQ3ZCO0FBQUEsSUFDQSxJQUFZLFFBQUs7QUFDZixhQUFPLEtBQUs7QUFBQSxJQUNkO0FBQUEsSUFLUyxJQUFpQixnQkFBYTtBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBOUIsSUFBaUIsY0FBYSxPQUFBO0FBQUEseUJBQUEsaUNBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQXlDdkMsSUFBWSxTQUFNO0FBQ2hCLGFBQU8sTUFBTSxLQUNYLEtBQUssV0FBWSxpQkFBaUIscUJBQXFCLEtBQUssRUFBRTtBQUFBLElBRWxFO0FBQUEsSUFlQSxJQUFpQixlQUFZO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUE3QixJQUFpQixhQUFZLE9BQUE7QUFBQSx5QkFBQSxnQ0FBQTtBQUFBLElBQUE7QUFBQSxJQXNCckIsWUFBWSxNQUFPO0FBQ3pCLGFBQU8sS0FBSyxhQUFhLElBQUksS0FBSztBQUFBLElBQ3BDO0FBQUE7QUFBQSxJQUdPLGdCQUFhO0FBQ2xCLFdBQUssbUJBQUE7QUFDTCxXQUFLLE1BQUE7QUFBQSxJQUNQO0FBQUEsSUFFZ0Isb0JBQWlCO0FBQy9CLFlBQU0sa0JBQUE7QUFDTixXQUFLLGNBQUE7QUFBQSxJQUNQO0FBQUE7QUFBQSxJQUdnQixRQUFLO0FBQ25CLFdBQUssY0FBYztBQUNuQixXQUFLLFdBQUE7QUFBQSxJQUNQO0FBQUEsSUFFbUIsV0FBVyxtQkFBdUM7QUFDbkUsWUFBTSxXQUFXLGlCQUFpQjtBQUVsQyxVQUFJLENBQUMsS0FBSyxjQUFjO0FBQ3RCO0FBQUEsTUFDRjtBQUVBLFVBQUksa0JBQWtCLElBQUksTUFBTSxLQUFLLGtCQUFrQixJQUFJLGFBQWEsR0FBRztBQUN6RSxhQUFLLGNBQUE7QUFBQSxNQUNQO0FBRUEsVUFBSSxrQkFBa0IsSUFBSSxNQUFNLEdBQUc7QUFDakMsYUFBSyxlQUFBO0FBQ0wsYUFBSyxlQUFlO0FBQ3BCLGFBQUssb0JBQW9CLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxNQUNyRDtBQUFBLElBQ0Y7QUFBQSxJQUVtQixRQUFRLG1CQUF1QztBQUNoRSxZQUFNLFFBQVEsaUJBQWlCO0FBRy9CLFdBQUssYUFBQTtBQUlMLFdBQUssV0FBQTtBQUFBLElBQ1A7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPUSxtQkFBbUIsWUFBbUI7QUFDNUMsVUFBSSxjQUFjLENBQUMsTUFBTSxRQUFRLEtBQUssU0FBUyxHQUFHO0FBQ2hELGFBQUssWUFBWSxLQUFLLFlBQVksQ0FBQyxLQUFLLFNBQWMsSUFBSSxDQUFBO0FBQUEsTUFDNUQ7QUFDQSxVQUFJLENBQUMsY0FBYyxNQUFNLFFBQVEsS0FBSyxTQUFTLEdBQUc7QUFDaEQsYUFBSyxZQUFhLEtBQUssVUFBa0IsU0FBVSxLQUFLLFVBQWtCLENBQUMsSUFBSTtBQUFBLE1BQ2pGO0FBQUEsSUFDRjtBQUFBO0FBQUEsSUFHUSxNQUFNLFlBQWM7QUFFMUIsVUFBSSxVQUFVO0FBQ1o7QUFBQSxNQUNGLFdBQVcsS0FBSyxtQkFBbUI7QUFDakMsYUFBSyxrQkFBa0IsS0FBSyxNQUFNLEtBQUssT0FBTztBQUM5QztBQUFBLE1BQ0Y7QUFFQSxVQUFJLFlBQVk7QUFDZCxhQUFLLGtCQUFrQixVQUFVO0FBQUEsTUFDbkM7QUFDQSxXQUFLLFNBQ0YsS0FBSyxjQUFjLFFBQVEsb0NBQW9DLEtBQUssVUFBVSxLQUFLO0FBQ3RGLFdBQUssU0FBUyxLQUFLLGdCQUFnQixLQUFLLFdBQVc7QUFDbkQsV0FBSyxTQUFTLEtBQUssZ0JBQUE7QUFDbkIsV0FBSyxlQUFlLEtBQUssbUJBQW1CLEtBQUssV0FBVztBQUM1RCxXQUFLLGtCQUFrQixDQUFDLEVBQUU7QUFDMUIsV0FBSyxrQkFBa0IsQ0FBQyxFQUFFO0FBQzFCLFVBQUksS0FBSyxPQUFPO0FBQ2QsY0FBTSxnQkFBZ0IsS0FBSyxhQUFhLGtCQUFrQixLQUFLLGFBQWEsQ0FBQztBQUM3RSxhQUFLLGtCQUFrQixLQUFLLGdCQUFnQixlQUFlLElBQUk7QUFDL0QsYUFBSyxrQkFBa0IsS0FBSyxnQkFBZ0IsY0FBYztBQUMxRCxhQUFLLHdCQUF3QixLQUFLLG1CQUFtQixhQUFhO0FBQUEsTUFDcEU7QUFDQSxXQUFLLGVBQWU7QUFBQSxJQUN0QjtBQUFBO0FBQUEsSUFHUSxhQUFVO0FBQ2hCLFVBQUksS0FBSyxhQUFhO0FBQ3BCLGFBQUssbUJBQUEsR0FBc0IsTUFBQTtBQUMzQixhQUFLLGNBQWM7QUFBQSxNQUNyQjtBQUFBLElBQ0Y7QUFBQTtBQUFBLElBR1EsZUFBWTtBQUNsQixZQUFNLGlCQUEyQixLQUFLLGFBQWEsa0JBQWtCLFFBQVE7QUFDN0UsWUFBTSxlQUF5QixLQUFLLGFBQWEsa0JBQWtCLE1BQU07QUFDekUsWUFBTSxXQUFzQixhQUFhLElBQUksQ0FBQyxNQUFjLE9BQWU7QUFBQSxRQUN6RTtBQUFBLFFBQ0EsUUFBUSxlQUFlLENBQUM7QUFBQSxNQUFBLEVBQ3hCO0FBR0YsWUFBTSxpQkFBeUIsS0FBSyxhQUFhLGtCQUFBO0FBQ2pELFdBQUssWUFBWSxTQUFTLE1BQU0sY0FBYyxFQUFFLE9BQU8sU0FBUyxNQUFNLEdBQUcsY0FBYyxDQUFDO0FBQUEsSUFDMUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFhUSxtQkFBbUIsTUFBTztBQUNoQyxhQUFPLG1CQUNMLEVBQUUsT0FBTyxhQUFhLElBQVksR0FBRyxLQUFLLFdBQVcsSUFBWSxFQUFBLEdBQ2pFLEVBQUUsY0FBYyxFQUFBLENBQUcsRUFDbkIsSUFBSSxDQUFDLG1CQUNMLFFBQVEsZ0JBQWdCLEVBQUUsY0FBYyxHQUFHLHVCQUF1QixFQUFBLENBQUcsQ0FBQztBQUFBLElBRTFFO0FBQUE7QUFBQSxJQUdRLGdCQUFnQixPQUFVLHNCQUFzQixPQUFLO0FBQzNELFlBQU0sWUFBc0IsS0FBSyxhQUFhLGFBQUE7QUFDOUMsWUFBTSxjQUFzQixLQUFLLGFBQWEsa0JBQWtCLEtBQUs7QUFDckUsWUFBTSxhQUFxQixLQUFLLGFBQWEsbUJBQW1CLEtBQUs7QUFDckUsVUFBSSxDQUFDLHFCQUFxQjtBQUN4QixhQUFLLHFDQUFxQyxtQkFBbUI7QUFDN0QsYUFBSyxxQ0FBcUMsbUJBQW1CO0FBQzdELGFBQUsscUNBQXFDLGlCQUFpQixLQUFLLGFBQWEsVUFDM0UsS0FBSyxhQUFhLFdBQ2hCLEtBQUssYUFBYSxRQUFRLEtBQUssR0FDL0IsS0FBSyxhQUFhLFNBQVMsS0FBSyxHQUNoQyxDQUFDLENBQ0Y7QUFFSCxhQUFLLHFDQUFxQyxnQkFBZ0IsS0FBSyxhQUFhLFVBQzFFLEtBQUssYUFBYSxXQUNoQixLQUFLLGFBQWEsUUFBUSxLQUFLLEdBQy9CLEtBQUssYUFBYSxTQUFTLEtBQUssR0FDaEMsV0FBVyxDQUNaO0FBQUEsTUFFTCxPQUFPO0FBQ0wsYUFBSyxxQ0FBcUMsb0JBQW9CO0FBQzlELGFBQUsscUNBQXFDLGdCQUFnQixLQUFLLGFBQWEsVUFDMUUsS0FBSyxhQUFhLFdBQ2hCLEtBQUssYUFBYSxRQUFRLEtBQUssR0FDL0IsS0FBSyxhQUFhLFNBQVMsS0FBSyxHQUNoQyxXQUFXLENBQ1o7QUFBQSxNQUVMO0FBQ0EsYUFBTyxLQUFLLGdCQUFnQixlQUN4QixLQUFLLDBCQUEwQixPQUFPLFdBQVcsYUFBYSxVQUFVLElBQ3hFLEtBQUssd0JBQXdCLE9BQU8sV0FBVyxhQUFhLFVBQVU7QUFBQSxJQUM1RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVVRLDBCQUNOLE9BQ0EsV0FDQSxhQUNBLFlBQWtCO0FBRWxCLFlBQU0sUUFBb0IsQ0FBQyxFQUFFO0FBQzdCLGVBQVMsSUFBSSxHQUFHLE9BQU8sWUFBWSxJQUFJLGFBQWEsS0FBSyxRQUFRO0FBQy9ELFlBQUksU0FBUyxjQUFjO0FBQ3pCLGdCQUFNLEtBQUssRUFBRTtBQUNiLGlCQUFPO0FBQUEsUUFDVDtBQUNBLGNBQU0sT0FBTyxLQUFLLGFBQWEsV0FDN0IsS0FBSyxhQUFhLFFBQVEsS0FBSyxHQUMvQixLQUFLLGFBQWEsU0FBUyxLQUFLLEdBQ2hDLElBQUksQ0FBQztBQUVQLGNBQU0sVUFBVSxLQUFLLGFBQWEsVUFBVSxJQUFJO0FBQ2hELGNBQU0sTUFBTSxTQUFTLENBQUMsRUFBRSxLQUFLO0FBQUEsVUFDM0IsT0FBTztBQUFBLFVBQ1AsV0FBVztBQUFBLFVBQ1gsVUFBVSxVQUFVLENBQUM7QUFBQSxVQUNyQixZQUFZLE9BQU8sS0FBSyxhQUFhLFNBQVMsSUFBSSxDQUFDO0FBQUEsVUFDbkQsV0FBVyxPQUFPLEtBQUssYUFBYSxRQUFRLElBQUksQ0FBQztBQUFBLFVBQ2pELFdBQVcsUUFBUSxTQUFTLEVBQUUsY0FBYyxHQUFHLHVCQUF1QixHQUFHO0FBQUEsVUFDekUsY0FBYyxLQUFLLGFBQWEsYUFBYSxJQUFJO0FBQUEsUUFBQSxDQUNsRDtBQUFBLE1BQ0g7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQWdCUSx3QkFDTixPQUNBLFdBQ0EsYUFDQSxZQUFrQjtBQUVsQixZQUFNLFFBQW9CLE1BQU0sS0FBSyxFQUFFLFFBQVEsYUFBQSxHQUFnQixNQUFNLEVBQUU7QUFDdkUsZUFBUyxJQUFJLEdBQUcsT0FBTyxZQUFZLElBQUksYUFBYSxLQUFLLFFBQVE7QUFDL0QsWUFBSSxTQUFTLGNBQWM7QUFDekIsaUJBQU87QUFBQSxRQUNUO0FBQ0EsY0FBTSxPQUFPLEtBQUssYUFBYSxXQUM3QixLQUFLLGFBQWEsUUFBUSxLQUFLLEdBQy9CLEtBQUssYUFBYSxTQUFTLEtBQUssR0FDaEMsSUFBSSxDQUFDO0FBRVAsY0FBTSxVQUFVLEtBQUssYUFBYSxVQUFVLElBQUk7QUFDaEQsY0FBTSxJQUFJLEVBQUUsS0FBSztBQUFBLFVBQ2YsT0FBTztBQUFBLFVBQ1AsV0FBVztBQUFBLFVBQ1gsVUFBVSxVQUFVLENBQUM7QUFBQSxVQUNyQixZQUFZLE9BQU8sS0FBSyxhQUFhLFNBQVMsSUFBSSxDQUFDO0FBQUEsVUFDbkQsV0FBVyxPQUFPLEtBQUssYUFBYSxRQUFRLElBQUksQ0FBQztBQUFBLFVBQ2pELFdBQVcsUUFBUSxTQUFTLEVBQUUsY0FBYyxHQUFHLHVCQUF1QixHQUFHO0FBQUEsVUFDekUsY0FBYyxLQUFLLGFBQWEsYUFBYSxJQUFJO0FBQUEsUUFBQSxDQUNsRDtBQUFBLE1BQ0g7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUEsSUFHUSxtQkFBZ0I7QUFDdEIsWUFBTSxhQUF1QixLQUFLLGFBQWEsY0FBYyxPQUFPO0FBQ3BFLFlBQU0sU0FBa0IsSUFBSSxNQUFNLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxJQUMvQyxDQUFDLEdBQUcsT0FBc0I7QUFBQSxRQUN4QixPQUFPLFdBQVcsQ0FBQztBQUFBLFFBQ25CLFdBQVcsS0FBSyxZQUFZLENBQUM7QUFBQSxRQUM3QixZQUFZLElBQUk7QUFBQSxNQUFBLEVBQ2hCO0FBRUosWUFBTSxPQUFlLEtBQUs7QUFDMUIsWUFBTSxhQUF3QixDQUFBO0FBQzlCLGVBQVMsSUFBWSxHQUFHLElBQUksTUFBTSxLQUFLO0FBQ3JDLG1CQUFXLEtBQUssT0FBTyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztBQUFBLE1BQzVFO0FBQ0EsV0FBSyxVQUFVO0FBQUEsSUFDakI7QUFBQTtBQUFBLElBR1EsZ0JBQWdCLFNBQWlCLEdBQUM7QUFDeEMsWUFBTSxxQkFBNkIsS0FBSyx1QkFBQTtBQUN4QyxZQUFNLFdBQXFCLElBQUksTUFBTSxjQUFjLEVBQ2hELEtBQUssQ0FBQyxFQUNOLElBQUksQ0FBQyxHQUFHLE1BQWMscUJBQXFCLFNBQVMsQ0FBQztBQUN4RCxZQUFNLE9BQWUsaUJBQWlCO0FBQ3RDLFlBQU0sWUFBd0IsQ0FBQTtBQUM5QixlQUFTLElBQVksR0FBRyxJQUFJLE1BQU0sS0FBSztBQUNyQyxrQkFBVSxLQUFLLFNBQVMsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7QUFBQSxNQUMzRTtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVlRLHlCQUFzQjtBQUM1QixVQUFJLGVBQWU7QUFDbkIsVUFBSSxLQUFLLEtBQUs7QUFDWix1QkFBZSxLQUFLLGFBQWEsUUFBUSxLQUFLLEdBQUcsSUFBSSxpQkFBaUI7QUFBQSxNQUN4RSxXQUFXLEtBQUssS0FBSztBQUNuQix1QkFBZSxLQUFLLGFBQWEsUUFBUSxLQUFLLEdBQUc7QUFBQSxNQUNuRDtBQUNBLFlBQU0sYUFBYSxLQUFLLGFBQWEsUUFBUSxLQUFLLFdBQVc7QUFDN0QsYUFDRSxlQUNJLGFBQWEsZ0JBQWdCLGlCQUFrQixrQkFBa0I7QUFBQSxJQUV6RTtBQUFBO0FBQUEsSUFHUSxjQUFjLE1BQVk7QUFDaEMsVUFBSSxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssS0FBSztBQUMxQixlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sY0FDSixLQUFLLGFBQWEsUUFBUSxLQUFLLEdBQUcsS0FDbEMsS0FBSyxhQUFhLFlBQVksS0FBSyxLQUFNLEtBQUssYUFBYSxZQUFZLElBQUksQ0FBRSxJQUFJO0FBQ25GLFlBQU0sYUFDSixLQUFLLGFBQWEsUUFBUSxLQUFLLEdBQUcsS0FDbEMsS0FBSyxhQUFhLFlBQVksS0FBSyxLQUFNLEtBQUssYUFBYSxZQUFZLElBQUksQ0FBRSxJQUFJO0FBQ25GLGFBQU8sRUFBRSxlQUFlO0FBQUEsSUFDMUI7QUFBQTtBQUFBLElBR1EsZ0JBQWdCLE9BQWUsTUFBWTtBQUNqRCxVQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxLQUFLO0FBQzFCLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxjQUNKLEtBQUssYUFBYSxRQUFRLEtBQUssR0FBRyxNQUNqQyxPQUFPLEtBQUssYUFBYSxRQUFRLEtBQUssR0FBSSxLQUN4QyxTQUFTLEtBQUssYUFBYSxRQUFRLEtBQUssR0FBSSxLQUMzQyxRQUFRLEtBQUssYUFBYSxTQUFTLEtBQUssR0FBSTtBQUVsRCxZQUFNLGFBQ0osS0FBSyxhQUFhLFFBQVEsS0FBSyxHQUFHLE1BQ2pDLE9BQU8sS0FBSyxhQUFhLFFBQVEsS0FBSyxHQUFJLEtBQ3hDLFNBQVMsS0FBSyxhQUFhLFFBQVEsS0FBSyxHQUFJLEtBQzNDLFFBQVEsS0FBSyxhQUFhLFNBQVMsS0FBSyxHQUFJO0FBRWxELGFBQU8sRUFBRSxlQUFlO0FBQUEsSUFDMUI7QUFBQTtBQUFBLElBR1EsZUFBZSxNQUFZO0FBQ2pDLFVBQUksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLEtBQUs7QUFDMUIsZUFBTztBQUFBLE1BQ1Q7QUFDQSxZQUFNLGNBQ0osS0FBSyxhQUFhLFFBQVEsS0FBSyxHQUFHLEtBQUssS0FBSyxhQUFhLFFBQVEsS0FBSyxHQUFJLElBQUk7QUFDaEYsWUFBTSxhQUNKLEtBQUssYUFBYSxRQUFRLEtBQUssR0FBRyxLQUFLLEtBQUssYUFBYSxRQUFRLEtBQUssR0FBSSxJQUFJO0FBQ2hGLGFBQU8sRUFBRSxlQUFlO0FBQUEsSUFDMUI7QUFBQTtBQUFBLElBR1Esb0JBQW9CLE9BQWUsTUFBWTtBQUNyRCxVQUFJLENBQUMsS0FBSyxZQUFZO0FBQ3BCLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxlQUFlLEtBQUssYUFBYSxXQUFXLE1BQU0sT0FBTyxDQUFDO0FBQ2hFLGVBQ00sT0FBVSxjQUNkLEtBQUssYUFBYSxTQUFTLElBQUksS0FBSyxPQUNwQyxPQUFPLEtBQUssYUFBYSxnQkFBZ0IsTUFBTSxDQUFDLEdBQ2hEO0FBQ0EsWUFBSSxLQUFLLFdBQVcsSUFBSSxHQUFHO0FBQ3pCLGlCQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUEsSUFHUSxtQkFBbUIsTUFBWTtBQUNyQyxVQUFJLENBQUMsS0FBSyxZQUFZO0FBQ3BCLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxjQUFjLEtBQUssYUFBYSxXQUFXLE1BQU0sR0FBRyxDQUFDO0FBQzNELGVBQ00sT0FBVSxhQUNkLEtBQUssYUFBYSxRQUFRLElBQUksS0FBSyxNQUNuQyxPQUFPLEtBQUssYUFBYSxnQkFBZ0IsTUFBTSxDQUFDLEdBQ2hEO0FBQ0EsWUFBSSxLQUFLLFdBQVcsSUFBSSxHQUFHO0FBQ3pCLGlCQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUEsSUFHUSxZQUFZLEtBQU07QUFDeEIsV0FBSyxlQUFlO0FBQ3BCLFdBQUssZUFBQTtBQUNMLFVBQUksS0FBSyxVQUFVO0FBRWpCLFlBQUksS0FBSyxhQUFjLEtBQUssVUFBa0IsU0FBUyxHQUFHO0FBQ3hELGdCQUFNLHFCQUE4QixLQUFLLFVBQWtCLFVBQ3pELENBQUMsUUFBUSxLQUFLLGFBQWEsWUFBWSxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBR3hELGNBQUksdUJBQXVCLElBQUk7QUFDN0IsaUJBQUssWUFBYSxLQUFLLFVBQWtCLE9BQU8sQ0FBQyxHQUFHLE1BQU0sTUFBTSxrQkFBa0I7QUFBQSxVQUNwRixPQUFPO0FBQ0wsaUJBQUssWUFBWSxDQUFDLEdBQUksS0FBSyxXQUFtQixHQUFHO0FBQUEsVUFDbkQ7QUFBQSxRQUNGLE9BQU87QUFFTCxlQUFLLFlBQVksQ0FBQyxHQUFHO0FBQUEsUUFDdkI7QUFDQSxhQUFLLHVCQUF1QixLQUFLLFVBQVUsSUFBSSxDQUFDLE1BQU0sS0FBSyxhQUFhLFlBQVksQ0FBQyxDQUFFLENBQUM7QUFBQSxNQUMxRixPQUFPO0FBRUwsWUFBSSxDQUFDLEtBQUssYUFBYSxLQUFLLGFBQWEsWUFBWSxLQUFLLFdBQWdCLEdBQUcsTUFBTSxHQUFHO0FBQ3BGLGVBQUssWUFBWTtBQUNqQixlQUFLLHVCQUF1QixLQUFLLGFBQWEsWUFBWSxHQUFHLENBQUU7QUFBQSxRQUNqRTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVNRLHFCQUFxQixNQUFjO0FBR3pDLFlBQU0sY0FBd0IsS0FBSyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLO0FBQ3ZGLFlBQU0sWUFBc0IsS0FDekIsSUFBSSxDQUFDLE1BQWMsRUFBRSxLQUFLLEVBQzFCLE9BQU8sQ0FBQyxZQUFvQixZQUFZLFNBQVMsT0FBTyxDQUFDO0FBQzVELFlBQU0sZUFBZSxJQUFJLElBQUksU0FBUztBQUN0QyxZQUFNLGNBQWMsSUFBSSxJQUFLLEtBQUssVUFBa0IsSUFBSSxDQUFDLE1BQU0sS0FBSyxhQUFhLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDOUYsWUFBTSxhQUFhLEtBQUssaUNBQWlDLFdBQVcsY0FBYyxXQUFXO0FBQzdGLFdBQUssWUFBWSxXQUFXLElBQUksQ0FBQyxNQUFNLEtBQUssYUFBYSxZQUFZLENBQUMsQ0FBRTtBQUV4RSxXQUFLLHVCQUF1QixLQUFLLFVBQVUsSUFBSSxDQUFDLE1BQU0sS0FBSyxhQUFhLFlBQVksQ0FBQyxDQUFFLENBQUM7QUFBQSxJQUMxRjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS1EsdUJBQXVCLFFBQWU7QUFFNUMsV0FBSyxjQUNILElBQUksWUFBcUIsZ0JBQWdCO0FBQUEsUUFDdkM7QUFBQSxRQUNBLFVBQVU7QUFBQSxRQUNWLFNBQVM7QUFBQSxNQUFBLENBQ1YsQ0FBQztBQUFBLElBRU47QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTVEsaUNBQ04sV0FDQSxjQUNBLGFBQXdCO0FBRXhCLFVBQUksVUFBVSxNQUFNLENBQUMsUUFBZ0IsWUFBWSxJQUFJLEdBQUcsQ0FBQyxHQUFHO0FBQzFELHFCQUFhLFFBQVEsQ0FBQyxRQUFnQixZQUFZLE9BQU8sR0FBRyxDQUFDO0FBQUEsTUFDL0QsT0FBTztBQUNMLHFCQUFhLFFBQVEsQ0FBQyxRQUFnQixZQUFZLElBQUksR0FBRyxDQUFDO0FBQUEsTUFDNUQ7QUFDQSxhQUFPLE1BQU0sS0FBSyxXQUFXO0FBQUEsSUFDL0I7QUFBQSxJQUVRLGlCQUFjO0FBQ3BCLFVBQUksS0FBSyxTQUFTLFNBQVM7QUFDekIsWUFBSTtBQUNKLFlBQUksS0FBSyxVQUFVO0FBQ2pCLHlCQUFnQixLQUFLLFNBQWlCLEdBQUcsRUFBRTtBQUFBLFFBQzdDLE9BQU87QUFDTCx5QkFBZSxLQUFLO0FBQUEsUUFDdEI7QUFDQSxhQUFLLGNBQWMsS0FBSyxhQUFhLFFBQVEsZ0JBQWdCLEtBQUssYUFBYSxPQUFPO0FBQUEsTUFDeEYsT0FBTztBQUNMLGFBQUssY0FBYztBQUFBLE1BQ3JCO0FBQUEsSUFDRjtBQUFBLElBRVEsa0JBQWtCLE1BQU87QUFDL0IsVUFBSSxLQUFLLE9BQU8sS0FBSyxhQUFhLFlBQVksS0FBSyxLQUFLLElBQUksSUFBSSxHQUFHO0FBQ2pFLGFBQUssY0FBYyxLQUFLO0FBQ3hCO0FBQUEsTUFDRjtBQUNBLFVBQUksS0FBSyxPQUFPLEtBQUssYUFBYSxZQUFZLEtBQUssS0FBSyxJQUFJLElBQUksR0FBRztBQUNqRSxhQUFLLGNBQWMsS0FBSztBQUN4QjtBQUFBLE1BQ0Y7QUFDQSxXQUFLLGNBQWM7QUFBQSxJQUNyQjtBQUFBO0FBQUEsSUFHUSxvQkFBb0IsUUFBYztBQUN4QyxXQUFLLE1BQU0sS0FBSyxhQUFhLGtCQUFrQixLQUFLLGFBQWEsTUFBTSxDQUFDO0FBQUEsSUFDMUU7QUFBQSxJQUVRLG1CQUFtQixPQUFhO0FBQ3RDLFdBQUssZUFBZ0I7QUFFckIsV0FBSyxjQUFjLEtBQUssYUFBYSxXQUNuQyxLQUFLLGFBQ0wsS0FBSyxhQUFhLFNBQVMsS0FBSyxXQUFXLEdBQzNDLEtBQUssYUFBYSxRQUFRLEtBQUssV0FBVyxDQUFDO0FBRTdDLFdBQUssTUFBQTtBQUFBLElBQ1A7QUFBQSxJQUVRLHdCQUF3QixPQUFhO0FBQzNDLFdBQUssTUFBTSxLQUFLLGFBQWEsaUJBQWlCLEtBQUssYUFBYSxLQUFLLENBQUM7QUFBQSxJQUN4RTtBQUFBLElBRVEsY0FBYyxVQUFXO0FBQy9CLFVBQUksQ0FBQyxLQUFLLEtBQUs7QUFDYixlQUFPO0FBQUEsTUFDVDtBQUNBLGFBQU8sS0FBSyxhQUFhLFlBQVksVUFBVSxLQUFLLEdBQUcsSUFBSTtBQUFBLElBQzdEO0FBQUEsSUFFUSxjQUFjLFVBQVc7QUFDL0IsVUFBSSxDQUFDLEtBQUssS0FBSztBQUNiLGVBQU87QUFBQSxNQUNUO0FBQ0EsYUFBTyxLQUFLLGFBQWEsWUFBWSxVQUFVLEtBQUssR0FBRyxJQUFJO0FBQUEsSUFDN0Q7QUFBQTtBQUFBLElBR1EseUJBQXNCO0FBQzVCLFlBQU0sWUFBWSxLQUFLLGFBQWEsZ0JBQ2xDLEtBQUssYUFDTCxLQUFLLGFBQWEsUUFBUSxLQUFLLFdBQVcsSUFBSSxFQUFFO0FBRWxELGFBQU8sS0FBSyxjQUFjLFNBQVM7QUFBQSxJQUNyQztBQUFBO0FBQUEsSUFHUSxxQkFBa0I7QUFDeEIsVUFBSSxZQUFZLEtBQUssYUFBYSxrQkFBa0IsS0FBSyxhQUFhLEtBQUssUUFBUSxJQUFJLENBQUM7QUFDeEYsa0JBQVksS0FBSyxhQUFhLFdBQzVCLEtBQUssYUFBYSxRQUFRLFNBQVMsR0FDbkMsS0FBSyxhQUFhLFNBQVMsU0FBUyxHQUNwQyxDQUFDO0FBRUgsYUFBTyxLQUFLLGNBQWMsU0FBUztBQUFBLElBQ3JDO0FBQUE7QUFBQSxJQUdRLHdCQUFxQjtBQUMzQixZQUFNLFdBQVcsS0FBSyxhQUFhLFdBQ2pDLEtBQUssYUFBYSxRQUFRLEtBQUssV0FBVyxJQUFJLEdBQzlDLElBQ0EsRUFBRTtBQUVKLGFBQU8sS0FBSyxjQUFjLFFBQVE7QUFBQSxJQUNwQztBQUFBO0FBQUEsSUFHUSxvQkFBaUI7QUFDdkIsWUFBTSxXQUFXLEtBQUssYUFBYSxXQUNqQyxLQUFLLGFBQWEsUUFBUSxLQUFLLFdBQVcsS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUNoRSxHQUNBLENBQUM7QUFFSCxhQUFPLEtBQUssY0FBYyxRQUFRO0FBQUEsSUFDcEM7QUFBQTtBQUFBLElBR1EsNkJBQTBCO0FBQ2hDLFlBQU0sV0FBVyxLQUFLLGFBQWEsV0FBVyxLQUFLLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRTtBQUMzRSxhQUFPLEtBQUssY0FBYyxRQUFRO0FBQUEsSUFDcEM7QUFBQTtBQUFBLElBR1EseUJBQXNCO0FBQzVCLFlBQU0sUUFBUSxLQUFLLFFBQVEsS0FBSyxrQkFBa0IsS0FBSztBQUN2RCxZQUFNLGdCQUFnQixNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQzVDLFlBQU0sV0FBVyxjQUFjLGNBQWMsU0FBUyxDQUFDO0FBQ3ZELFlBQU0sV0FBVyxLQUFLLGFBQWEsV0FBVyxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBQ2hFLGFBQU8sS0FBSyxjQUFjLFFBQVE7QUFBQSxJQUNwQztBQUFBLElBRVEsaUJBQWlCLGFBQXdCO0FBQy9DLFVBQUksYUFBYSxjQUFjLFVBQVU7QUFDdkMsYUFBSyxhQUFBO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFBQSxJQUVRLGVBQVk7QUFDbEIsWUFBTSxLQUNKLEtBQUssV0FBWSxpQkFBaUIsbUNBQW1DLEtBQUssRUFBRSxFQUM1RSxRQUFRLENBQUMsUUFBVSxJQUFvQixXQUFXLEVBQUc7QUFDdkQsWUFBTSxpQkFBaUIsS0FBSyxtQkFBQTtBQUM1QixVQUFJLGdCQUFnQjtBQUNsQix1QkFBZSxXQUFXO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUE7QUFBQSxJQUdRLHFCQUFrQjtBQUN4QixZQUFNLG9CQUNKLEtBQUssV0FBWSxjQUFpQyx5QkFBeUIsS0FDM0UsS0FBSyxXQUFZLGNBQWlDLDZCQUE2QjtBQUVqRixhQUFPLHFCQUFxQixDQUFDLGtCQUFrQixXQUMzQyxvQkFDQSxLQUFLLGtCQUFrQixRQUNyQixLQUFLLHNCQUFBLElBQ0wsS0FBSyxXQUFZLGNBQWMscUNBQXFDO0FBQUEsSUFDNUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBU1Esd0JBQXFCO0FBQzNCLFlBQU0sYUFBa0MsTUFBTSxLQUM1QyxLQUFLLFdBQVksaUJBQWlCLHFDQUFxQyxDQUFDO0FBRTFFLFVBQUksQ0FBQyxjQUFjLFdBQVcsV0FBVyxHQUFHO0FBQzFDLGVBQU87QUFBQSxNQUNULE9BQU87QUFDTCxjQUFNLGVBQWUsV0FBVyxJQUFJLENBQUMsTUFBaUMsRUFBRSxLQUFLLEVBQUUsS0FBQSxFQUFPLENBQUM7QUFDdkYsZUFBTyxLQUFLLFdBQVksY0FBYyw4QkFBOEIsWUFBWSxJQUFJO0FBQUEsTUFDdEY7QUFBQSxJQUNGO0FBQUEsSUFFUSxxQkFBcUIsT0FBc0IsS0FBWTtBQUM3RCxVQUFJLDRCQUE0QixLQUFLLEdBQUc7QUFDdEMsY0FBTSxlQUFBO0FBQUEsTUFDUjtBQUlBLFlBQU0sUUFBNkIsS0FBSztBQUN4QyxZQUFNLFFBQWdCLE1BQU0sVUFBVSxDQUFDLE1BQXlCLE1BQU0sTUFBTSxNQUFNO0FBQ2xGLFVBQUk7QUFDSixVQUFJLEtBQUs7QUFDUCxpQkFBUyxLQUFLLDJCQUEyQixPQUFPLE9BQU8sT0FBTyxHQUFHO0FBQUEsTUFDbkUsT0FBTztBQUNMLGlCQUFTLEtBQUssb0JBQW9CLE9BQU8sT0FBTyxLQUFLO0FBQUEsTUFDdkQ7QUFDQSxZQUFNLFdBQThCLEtBQUssV0FBWTtBQUNyRCxVQUFJLFdBQVcsVUFBVTtBQUN0QixlQUE2QixXQUFXO0FBQ3pDLGdCQUFRLE1BQUE7QUFDUCxpQkFBK0IsV0FBVztBQUFBLE1BQzdDO0FBQUEsSUFDRjtBQUFBLElBRVEsMkJBQ04sS0FDQSxPQUNBLE9BQ0EsS0FBVztBQUVYLFlBQU0sZUFDSixLQUFLLGdCQUFnQixlQUNqQixFQUFFLFdBQVcsR0FBRyxRQUFRLGFBQUEsSUFDeEIsRUFBRSxXQUFXLGNBQWMsUUFBUSxFQUFBO0FBQ3pDLFlBQU0sb0JBQ0osUUFBUSxLQUFLLHFDQUFxQyxtQkFDOUMsS0FBSyxxQ0FBcUMsbUJBQzFDLEtBQUsscUNBQXFDO0FBRWhELGNBQVEsSUFBSSxLQUFBO0FBQUEsUUFDVixLQUFLO0FBQ0gsaUJBQU8sS0FBSyxlQUFlLE9BQU8sT0FBTyxJQUFJLFdBQVcsQ0FBQyxhQUFhLE1BQU07QUFBQSxRQUM5RSxLQUFLO0FBQ0gsaUJBQU8sS0FBSyxlQUFlLE9BQU8sT0FBTyxJQUFJLFdBQVcsYUFBYSxNQUFNO0FBQUEsUUFDN0UsS0FBSztBQUNILGlCQUFPLEtBQUssZUFBZSxPQUFPLE9BQU8sSUFBSSxXQUFXLENBQUMsYUFBYSxTQUFTO0FBQUEsUUFDakYsS0FBSztBQUNILGlCQUFPLEtBQUssZUFBZSxPQUFPLE9BQU8sSUFBSSxXQUFXLGFBQWEsU0FBUztBQUFBLFFBQ2hGLEtBQUssVUFBVTtBQUNiLGNBQUksS0FBSyxnQkFBZ0IsY0FBYztBQUNyQyxrQkFBTSxjQUFzQixDQUFDLElBQUksV0FBVyxnQkFBZ0I7QUFDNUQsa0JBQU0sUUFBZ0IsY0FBYyxDQUFDLElBQUk7QUFDekMsbUJBQU8sS0FBSyxtQkFBbUIsT0FBTyxPQUFPLEtBQUssT0FBTyxhQUFhLE1BQU07QUFBQSxVQUM5RSxPQUFPO0FBQ0wsa0JBQU0sYUFBcUIsS0FBSyxNQUFNLENBQUMsSUFBSSxXQUFXLHFCQUFxQixZQUFZO0FBQ3ZGLGtCQUFNLGVBQXVCLGFBQWEsS0FBSyxlQUFlLG9CQUFvQjtBQUNsRixrQkFBTSxRQUFnQixjQUFjLENBQUMsSUFBSTtBQUN6QyxtQkFBTyxLQUFLLG1CQUFtQixPQUFPLE9BQU8sS0FBSyxPQUFPLGFBQWEsTUFBTTtBQUFBLFVBQzlFO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxZQUFZO0FBQ2YsY0FBSSxLQUFLLGdCQUFnQixjQUFjO0FBQ3JDLGtCQUFNLGdCQUFnQixDQUFDLElBQUksYUFBYSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksYUFBYTtBQUN2RSxrQkFBTSxlQUFlLENBQUMsSUFBSSxhQUFhLElBQUksS0FBSyxDQUFDLElBQUksWUFBWSxJQUFJLENBQUMsSUFBSTtBQUMxRSxrQkFBTSxpQkFBb0IsS0FBSyxhQUFhLFdBQVcsY0FBYyxlQUFlLENBQUM7QUFDckYsa0JBQU0sY0FBc0IsS0FBSyxhQUFhLFFBQzVDLEtBQUssYUFBYSxnQkFBZ0IsZ0JBQWdCLEVBQUUsQ0FBQztBQUV2RCxrQkFBTSxRQUNKLEtBQUssT0FBTyxjQUFjLENBQUMsSUFBSSxZQUFhLFlBQVksSUFBSTtBQUM5RCxtQkFBTyxLQUFLLG1CQUFtQixPQUFPLE9BQU8sS0FBSyxPQUFPLENBQUMsYUFBYSxNQUFNO0FBQUEsVUFDL0UsT0FBTztBQUNMLGtCQUFNLGFBQXFCLEtBQUssTUFBTSxDQUFDLElBQUksV0FBVyxxQkFBcUIsWUFBWTtBQUN2RixrQkFBTSxhQUFxQixhQUFhLGVBQWU7QUFDdkQsa0JBQU0sUUFBZ0IsYUFBYSxDQUFDLElBQUk7QUFDeEMsbUJBQU8sS0FBSyxtQkFBbUIsT0FBTyxPQUFPLEtBQUssT0FBTyxDQUFDLGFBQWEsTUFBTTtBQUFBLFVBQy9FO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxRQUFRO0FBQ1gsaUJBQU8sS0FBSyxjQUFjLE9BQU8sT0FBTyxLQUFLLENBQUM7QUFBQSxRQUNoRDtBQUFBLFFBQ0EsS0FBSyxPQUFPO0FBQ1YsZ0JBQU0sZ0JBQWdCLENBQUMsSUFBSSxhQUFhLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxhQUFhO0FBQ3ZFLGdCQUFNLGVBQWUsQ0FBQyxJQUFJLGFBQWEsSUFBSSxLQUFLLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJO0FBQzFFLGdCQUFNLGlCQUFvQixLQUFLLGFBQWEsV0FBVyxjQUFjLGVBQWUsQ0FBQztBQUNyRixpQkFBTyxLQUFLLGFBQWEsT0FBTyxPQUFPLGNBQWM7QUFBQSxRQUN2RDtBQUFBLFFBQ0E7QUFDRSxpQkFBTyxNQUFNLEtBQUs7QUFBQSxNQUFBO0FBQUEsSUFFeEI7QUFBQSxJQUVRLGdCQUFnQixNQUFZO0FBQ2xDLGFBQ0UsT0FBTyxLQUFLLHFDQUFxQyxrQkFDakQsT0FBTyxLQUFLLHFDQUFxQztBQUFBLElBRXJEO0FBQUEsSUFFUSxlQUNOLE9BQ0EsT0FDQSxNQUNBLE9BQWE7QUFFYixZQUFNLGVBQWUsS0FBSyxhQUFhLFVBQ3JDLEtBQUssYUFBYSxnQkFBZ0IsTUFBTSxLQUFLLENBQUM7QUFFaEQsVUFBSSxLQUFLLGdCQUFnQixZQUFZLEdBQUc7QUFDdEMsZUFBTyxNQUFNLEtBQUs7QUFBQSxNQUNwQjtBQUNBLFlBQU0sV0FBVyxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxZQUFZO0FBQzNELFVBQUksQ0FBQyxZQUFZLFNBQVMsVUFBVTtBQUNsQyxlQUFPLEtBQUssZUFBZSxPQUFPLE9BQU8sS0FBSyxhQUFhLFlBQVksWUFBWSxHQUFJLEtBQUs7QUFBQSxNQUM5RjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFUSxtQkFDTixPQUNBLE9BQ0EsS0FDQSxPQUNBLGlCQUF1QjtBQUV2QixZQUFNLGVBQWUsS0FBSyxhQUFhLFVBQ3JDLEtBQUssYUFBYSxnQkFBZ0IsSUFBSSxXQUFXLEtBQUssQ0FBQztBQUV6RCxVQUFJLEtBQUssZ0JBQWdCLFlBQVksR0FBRztBQUN0QyxlQUFPLE1BQU0sS0FBSztBQUFBLE1BQ3BCO0FBQ0EsWUFBTSxXQUFXLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLFlBQVk7QUFDM0QsVUFBSSxDQUFDLFlBQVksU0FBUyxVQUFVO0FBQ2xDLGVBQU8sS0FBSyxtQkFBbUIsT0FBTyxPQUFPLEtBQUssUUFBUSxpQkFBaUIsZUFBZTtBQUFBLE1BQzVGO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVRLGNBQ04sT0FDQSxPQUNBLEtBQ0EsTUFBWTtBQUVaLFlBQU0sZUFBZSxLQUFLLGFBQWEsVUFDckMsS0FBSyxhQUFhLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDO0FBRXJFLFVBQUksS0FBSyxnQkFBZ0IsWUFBWSxHQUFHO0FBQ3RDLGVBQU8sTUFBTSxLQUFLO0FBQUEsTUFDcEI7QUFDQSxZQUFNLFdBQVcsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsWUFBWTtBQUMzRCxVQUFJLENBQUMsWUFBWSxTQUFTLFVBQVU7QUFDbEMsZUFBTyxLQUFLLGNBQWMsT0FBTyxPQUFPLEtBQUssT0FBTyxDQUFDO0FBQUEsTUFDdkQ7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBLElBRVEsYUFDTixPQUNBLE9BQ0EsZ0JBQWlCO0FBRWpCLFlBQU0sZUFBZSxLQUFLLGFBQWEsVUFDckMsS0FBSyxhQUFhLGdCQUFnQixnQkFBZ0IsRUFBRSxDQUFDO0FBRXZELFVBQUksS0FBSyxnQkFBZ0IsWUFBWSxHQUFHO0FBQ3RDLGVBQU8sTUFBTSxLQUFLO0FBQUEsTUFDcEI7QUFDQSxZQUFNLFdBQVcsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsWUFBWTtBQUMzRCxVQUFJLENBQUMsWUFBWSxTQUFTLFVBQVU7QUFDbEMsZUFBTyxLQUFLLGFBQWEsT0FBTyxPQUFPLEtBQUssYUFBYSxZQUFZLFlBQVksQ0FBRTtBQUFBLE1BQ3JGO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVFRLG9CQUNOLEtBQ0EsT0FDQSxPQUEwQjtBQUUxQixZQUFNLEVBQ0oseUJBQ0EsbUJBQ0EsNkJBQ0EsZUFBQSxJQUVBLEtBQUssMENBQTBDLE9BQU8sS0FBSyxrQkFBa0IsTUFBTTtBQUVyRixjQUFRLElBQUksS0FBQTtBQUFBLFFBQ1YsS0FBSztBQUNILGlCQUFPLEtBQUssVUFBVSxPQUFPLE9BQU8sQ0FBQyxjQUFjO0FBQUEsUUFDckQsS0FBSztBQUNILGlCQUFPLEtBQUssVUFBVSxPQUFPLE9BQU8sY0FBYztBQUFBLFFBQ3BELEtBQUs7QUFDSCxpQkFBTyxLQUFLLFVBQVUsT0FBTyxPQUFPLEVBQUU7QUFBQSxRQUN4QyxLQUFLO0FBQ0gsaUJBQU8sS0FBSyxVQUFVLE9BQU8sT0FBTyxDQUFDO0FBQUEsUUFDdkMsS0FBSztBQUNILGlCQUFPLEtBQUssV0FBVyxPQUFPLGlCQUFpQjtBQUFBLFFBQ2pELEtBQUs7QUFDSCxpQkFBTyxLQUFLLG1CQUNWLE9BQ0EseUJBQ0EsbUJBQ0EsY0FBYztBQUFBLFFBRWxCLEtBQUs7QUFDSCxpQkFBTyxLQUFLLGtCQUFrQixPQUFPLE9BQU8sNkJBQTZCLGNBQWM7QUFBQSxRQUN6RixLQUFLO0FBQ0gsaUJBQU8sS0FBSyxVQUFVLE9BQU8sOEJBQThCLENBQUM7QUFBQSxRQUM5RDtBQUNFLGlCQUFPLE1BQU0sS0FBSztBQUFBLE1BQUE7QUFBQSxJQUV4QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU9RLDBDQUNOLE9BQ0EsWUFBbUI7QUFFbkIsWUFBTSxrQkFBa0IsYUFBYSxpQkFBaUI7QUFDdEQsWUFBTSxTQUFpQixLQUFLLE1BQU0sUUFBUSxlQUFlLElBQUk7QUFDN0QsWUFBTSxjQUFzQixXQUFXLElBQUksUUFBUSxRQUFRO0FBQzNELGFBQU87QUFBQSxRQUNMLGdCQUFnQixhQUFhLGdCQUFnQjtBQUFBLFFBQzdDLHlCQUF5QjtBQUFBLFFBQ3pCLG1CQUFtQixRQUFRO0FBQUEsUUFDM0IsNkJBQTZCLFdBQVcsSUFBSSxrQkFBa0Isa0JBQWtCO0FBQUEsTUFBQTtBQUFBLElBRXBGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU1RLFVBQVUsTUFBMkIsT0FBZSxPQUFhO0FBQ3ZFLFVBQUksWUFBWSxRQUFRO0FBQ3hCLGFBQU8sWUFBWSxLQUFLLFVBQVUsS0FBSyxTQUFTLEdBQUcsVUFBVTtBQUMzRCxxQkFBYTtBQUFBLE1BQ2Y7QUFDQSxhQUFPLEtBQUssU0FBUyxLQUFLLEtBQUssS0FBSztBQUFBLElBQ3RDO0FBQUE7QUFBQSxJQUdRLFdBQVcsTUFBMkIscUJBQTJCO0FBQ3ZFLGFBQU8sQ0FBQyxLQUFLLG1CQUFtQixFQUFFLFdBQzlCLEtBQUssbUJBQW1CLElBQ3hCLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQUEsSUFDakQ7QUFBQTtBQUFBLElBR1EsVUFBVSxNQUEyQixvQkFBMEI7QUFDckUsYUFBTyxDQUFDLEtBQUssa0JBQWtCLEVBQUUsV0FDN0IsS0FBSyxrQkFBa0IsSUFDdkIsS0FBSyxVQUFVLE1BQU0sb0JBQW9CLEVBQUU7QUFBQSxJQUNqRDtBQUFBO0FBQUEsSUFHUSxtQkFDTixNQUNBLE9BQ0EsUUFDQSxnQkFBc0I7QUFFdEIsWUFBTSxZQUFhLFFBQVEsaUJBQWtCO0FBQzdDLGFBQU8sQ0FBQyxLQUFLLFNBQVMsRUFBRSxXQUNwQixLQUFLLFNBQVMsSUFDZCxLQUFLLFVBQVUsTUFBTSxXQUFXLGNBQWM7QUFBQSxJQUNwRDtBQUFBO0FBQUEsSUFHUSxrQkFDTixNQUNBLE9BQ0EsUUFDQSxnQkFBc0I7QUFFdEIsWUFBTSxZQUFZLFFBQVEsS0FBSyxPQUFPLFNBQVMsUUFBUSxLQUFLLGNBQWMsSUFBSTtBQUM5RSxhQUFPLENBQUMsS0FBSyxTQUFTLEVBQUUsV0FDcEIsS0FBSyxTQUFTLElBQ2QsS0FBSyxVQUFVLE1BQU0sV0FBVyxDQUFDLGNBQWM7QUFBQSxJQUNyRDtBQUFBLElBRVEsbUJBQW1CLGlCQUFpQixPQUFLO0FBQy9DLFVBQUksS0FBSyxrQkFBa0I7QUFDekIsYUFBSyxjQUFjO0FBQUEsTUFDckI7QUFDQSxXQUFLLGVBQ0YsS0FBSyxXQUFZLEtBQUssVUFBa0IsR0FBRyxFQUFFLElBQUssS0FBSyxjQUN4RCxLQUFLLGFBQWEsTUFBQTtBQUNwQixXQUFLLGVBQUE7QUFDTCxXQUFLLGVBQWU7QUFDcEIsV0FBSyxNQUFBO0FBQ0wsV0FBSyxvQkFBb0IsS0FBSyxnQkFBZ0IsS0FBSztBQUVuRCxVQUFJLGdCQUFnQjtBQUNsQixhQUFLLHNCQUFBO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFBQTtBQUFBLElBR1EsaUJBQWM7QUFDcEIsWUFBTSxzQkFBc0IsS0FBSyxRQUM3QixLQUFLLGFBQWEsa0JBQWtCLEtBQUssYUFBYSxDQUFDLElBQ3ZEO0FBQ0osYUFBTztBQUFBO0FBQUEsVUFFRCxLQUFLLFVBQ0wsUUFDQSxNQUFNLEtBQUssb0JBQW9CLEVBQUUsR0FDakMsa0JBQWtCLEtBQUssVUFBVSxPQUFPLEdBQ3hDLEtBQUssdUJBQUEsQ0FBd0IsQ0FDOUI7QUFBQTtBQUFBLFlBRUcsS0FBSyx1QkFBdUIsS0FBSyxXQUFXLENBQUM7QUFBQSxZQUM3QyxLQUFLLFFBQVEsS0FBSyx1QkFBdUIsbUJBQW9CLElBQUksT0FBTztBQUFBO0FBQUEsY0FFdEUsS0FBSywyQkFBMkIsS0FBSyxhQUFhLG1CQUFvQixDQUFDO0FBQUE7QUFBQTtBQUFBLFVBRzNFLEtBQUssVUFDTCxTQUNBLE1BQU0sS0FBSyxvQkFBb0IsQ0FBQyxHQUNoQyxjQUFjLEtBQUssVUFBVSxPQUFPLEdBQ3BDLEtBQUssbUJBQUEsQ0FBb0IsQ0FDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUlHLEtBQUssZ0JBQWdCLGVBQ25CO0FBQUEsa0JBQ0ksS0FBSyxnQkFBZ0IsS0FBSyxRQUFRLEtBQUssWUFBWSxDQUFDO0FBQUEsa0JBQ3BELEtBQUssUUFDSCxLQUFLLGdCQUFnQixLQUFLLGlCQUFpQixLQUFLLHVCQUF1QixJQUFJLElBQzNFLE9BQU87QUFBQSxrQkFFYjtBQUFBLGtCQUNJLEtBQUssd0JBQXdCLEtBQUssUUFBUSxLQUFLLFlBQVksQ0FBQztBQUFBLGtCQUM1RCxLQUFLLFFBQ0gsS0FBSyx3QkFDSCxLQUFLLGlCQUNMLEtBQUssdUJBQ0wsbUJBQW1CLElBRXJCLE9BQU87QUFBQSxlQUNaO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJYjtBQUFBO0FBQUEsSUFHUSx1QkFBdUIsR0FBSTtBQUNqQyxZQUFNLGFBQWEsR0FDakIsS0FBSyxZQUFZLEtBQUssYUFBYSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQ3BELElBQUksS0FBSyxhQUFhLFFBQVEsQ0FBQyxDQUFDO0FBQ2hDLGFBQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFJVyx1QkFBdUIsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFJLFVBQVU7QUFBQSxpQkFDakUsTUFBSztBQUNaLGFBQUssY0FBYztBQUNuQixhQUFLLG9CQUFvQjtBQUN6QixhQUFLLHNCQUFBO0FBQUEsTUFDUCxDQUFDO0FBQUE7QUFBQSxVQUVDLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlsQjtBQUFBO0FBQUEsSUFHUSw4QkFBOEIsT0FBVTtBQUM5QyxVQUFJLGFBQWE7QUFDakIsaUJBQVcsS0FBSyxPQUFPO0FBQ3JCLFlBQUksR0FBRztBQUNMLHdCQUFjLEdBQ1osS0FBSyxZQUFZLEtBQUssYUFBYSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQ3BELElBQUksS0FBSyxhQUFhLFFBQVEsQ0FBQyxDQUFDO0FBQUEsUUFDbEM7QUFBQSxNQUNGO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFBQTtBQUFBLElBR1EsZ0JBQ04sT0FDQSxhQUNBLGtCQUEyQixPQUFLO0FBRWhDLFlBQU0sUUFBZ0IsS0FBSyxhQUFhLFVBQVUsS0FBSyxhQUFhLE9BQU87QUFDM0UsWUFBTSxxQ0FDSixLQUFLLFFBQ0QsQ0FBQyxHQUFHLEtBQUssUUFBUSxHQUFHLEtBQUssZUFBZSxJQUN4QyxrQkFDRSxLQUFLLGtCQUNMLEtBQUssUUFDWCxLQUFBO0FBQ0YsWUFBTSxrQ0FDSixrQkFBa0IsS0FBSyxrQkFBa0IsS0FBSyxRQUM5QyxLQUFBO0FBQ0YsYUFBTztBQUFBO0FBQUE7QUFBQSxvQkFHUyxDQUFDLFVBQ1gsS0FBSyxpQkFBaUIsTUFBTSxhQUE0QixDQUFDO0FBQUEsd0JBQzNDLENBQUMsTUFBc0IsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FJM0QsS0FBSyxjQUFjLDBEQUEwRCxPQUFPO0FBQUEsY0FDcEYsS0FBSyxVQUFVLElBQ2YsQ0FBQyxLQUFjLFVBQWtCO0FBQUE7QUFBQSxvQkFFM0IsS0FBSyxXQUNIO0FBQUE7QUFBQTtBQUFBLHVDQUdpQixJQUFJLElBQUk7QUFBQSxtQ0FDWixNQUFLO0FBRVosY0FBTSxPQUFpQiwrQkFBK0IsT0FDcEQsQ0FBQ0MsU0FBZ0JBLEtBQUksa0JBQWtCLFFBQVEsS0FBSyxDQUFDO0FBRXZELGFBQUsscUJBQXFCLElBQUk7QUFBQSxNQUNoQyxDQUFDO0FBQUE7QUFBQSw0QkFFQyxJQUFJLE1BQU07QUFBQTtBQUFBLDBCQUdoQjtBQUFBLGtEQUM0QixJQUFJLElBQUk7QUFBQSxtREFDUCxJQUFJLE1BQU07QUFBQSx1QkFDdEM7QUFBQTtBQUFBLGVBRVIsQ0FDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBSUQsTUFBTSxJQUFJLENBQUMsTUFBZ0IsYUFBb0I7QUFDL0MsY0FBTSxpQkFBeUIsZUFBZSxLQUFLO0FBQ25ELFlBQUksYUFBYSxLQUFLLGdCQUFnQjtBQUNwQyxpQkFBTztBQUFBO0FBQUEsb0JBRUQsS0FBSyxjQUNIO0FBQUE7QUFBQSw0QkFFTSxLQUFLLFdBQ0g7QUFBQTtBQUFBO0FBQUEsK0NBR2lCLEdBQUcsdUJBQXVCLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxFQUFFO0FBQUEsMkNBQ3pFLE1BQUs7QUFDWixrQkFBTSxPQUFpQixrQ0FBa0MsT0FDdkQsQ0FBQyxRQUFnQixJQUFJLGNBQWMsWUFBWSxDQUFDLENBQUM7QUFFbkQsaUJBQUsscUJBQXFCLElBQUk7QUFBQSxVQUNoQyxDQUFDO0FBQUE7QUFBQSxvQ0FFQyxZQUFZLENBQUMsQ0FBQztBQUFBO0FBQUEsa0NBR3BCO0FBQUE7QUFBQSxxQ0FFTyxHQUFHLHVCQUF1QixLQUFLLFVBQVUsT0FBTyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsRUFBRTtBQUFBO0FBQUEsMkRBRS9DLFlBQVksQ0FBQyxDQUFDO0FBQUEsK0JBQzFDO0FBQUE7QUFBQSwwQkFHVCxPQUFPO0FBQUEsb0JBQ1QsQ0FBQyxHQUFHLE1BQU0sY0FBYyxFQUFFLE1BQU0sRUFBRSxJQUNsQyxNQUFNLGdEQUFnRCxDQUN2RDtBQUFBLG9CQUNDLEtBQUssZ0JBQWdCLE1BQU0sS0FBSyxDQUFDO0FBQUE7QUFBQTtBQUFBLFFBR3pDO0FBQ0EsZUFBTztBQUFBO0FBQUEsa0JBRUQsS0FBSyxjQUNIO0FBQUE7QUFBQSwwQkFFTSxLQUFLLFdBQ0g7QUFBQTtBQUFBO0FBQUEsNkNBR2lCLEdBQUcsdUJBQXVCLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBSSxZQUFZLFFBQVEsQ0FBQyxFQUFFO0FBQUEseUNBQ2hGLE1BQUs7QUFDWixnQkFBTSxPQUFpQixrQ0FBa0MsT0FDdkQsQ0FBQyxRQUFnQixJQUFJLGNBQWMsWUFBWSxRQUFRLENBQUM7QUFFMUQsZUFBSyxxQkFBcUIsSUFBSTtBQUFBLFFBQ2hDLENBQUM7QUFBQTtBQUFBLGtDQUVDLFlBQVksUUFBUSxDQUFDO0FBQUE7QUFBQSxnQ0FHM0I7QUFBQTtBQUFBLG1DQUVPLEdBQUcsdUJBQXVCLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBSSxZQUFZLFFBQVEsQ0FBQyxFQUFFO0FBQUE7QUFBQSx5REFFdEQsWUFBWSxRQUFRLENBQUM7QUFBQSw2QkFDakQ7QUFBQTtBQUFBLHdCQUdULE9BQU87QUFBQSxrQkFDVCxLQUFLLGdCQUFnQixNQUFNLEtBQUssQ0FBQztBQUFBO0FBQUE7QUFBQSxNQUd6QyxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlWO0FBQUE7QUFBQSxJQUdRLHdCQUNOLE9BQ0EsYUFDQSxxQkFBdUI7QUFFdkIsWUFBTSxRQUFnQixLQUFLLGFBQWEsVUFBVSxLQUFLLGFBQWEsT0FBTztBQUMzRSxZQUFNLGFBQWEsS0FBSyxhQUFhLG1CQUNuQyx1QkFBdUIsS0FBSyxXQUFXO0FBRXpDLFlBQU0scUNBQ0osS0FBSyxRQUNELENBQUMsR0FBRyxLQUFLLFFBQVEsR0FBRyxLQUFLLGVBQWUsSUFDeEMsc0JBQ0UsS0FBSyxrQkFDTCxLQUFLLFFBQ1gsS0FBQTtBQUNGLGFBQU87QUFBQTtBQUFBO0FBQUEsb0JBR1MsQ0FBQyxVQUNYLEtBQUssaUJBQWlCLE1BQU0sYUFBNEIsQ0FBQztBQUFBLHdCQUMzQyxDQUFDLE1BQXNCLEtBQUssbUJBQW1CLENBQUMsQ0FBQztBQUFBO0FBQUEsVUFFL0QsS0FBSyxjQUNIO0FBQUE7QUFBQTtBQUFBLG9CQUdRLHNCQUNFLFVBQ0EsZ0RBQWdEO0FBQUEsb0JBQ2xELFlBQVksSUFDWixDQUFDLGVBQXVCO0FBQUE7QUFBQSwwQkFFbEIsS0FBSyxXQUNIO0FBQUE7QUFBQTtBQUFBLDZDQUdpQixHQUFHLHVCQUF1QixLQUFLLFVBQVUsT0FBTyxDQUFDLElBQUksVUFBVSxFQUFFO0FBQUEseUNBQ3JFLE1BQUs7QUFDWixjQUFNLE9BQWlCLGtDQUFrQyxPQUN2RCxDQUFDLFFBQWdCLElBQUksY0FBYyxVQUFVO0FBRS9DLGFBQUsscUJBQXFCLElBQUk7QUFBQSxNQUNoQyxDQUFDO0FBQUE7QUFBQSxrQ0FFQyxVQUFVO0FBQUE7QUFBQSxnQ0FHaEI7QUFBQTtBQUFBLG1DQUVPLEdBQUcsdUJBQXVCLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBSSxVQUFVLEVBQUU7QUFBQTtBQUFBLHlEQUUzQyxVQUFVO0FBQUEsNkJBQ3RDO0FBQUE7QUFBQSxxQkFFUixDQUNGO0FBQUE7QUFBQTtBQUFBLGdCQUlQLE9BQU87QUFBQTtBQUFBLFlBRVAsTUFBTSxJQUFJLENBQUMsTUFBZ0IsYUFBb0I7QUFDL0MsY0FBTSxVQUFVLEtBQUssVUFBVSxRQUFRO0FBQ3ZDLGNBQU0saUJBQWlCLEtBQUssUUFBUSxDQUFDLEdBQUcsTUFBTSxHQUFHLEtBQUssZ0JBQWdCLFFBQVEsQ0FBQyxJQUFJO0FBQ25GLGVBQU87QUFBQTtBQUFBLGtCQUVELHNCQUNFLFVBQ0E7QUFBQTtBQUFBLDBCQUVNLEtBQUssV0FDSDtBQUFBO0FBQUE7QUFBQSw2Q0FHaUIsUUFBUSxJQUFJO0FBQUEseUNBQ2hCLE1BQU0sS0FBSyxxQkFBcUIsY0FBYyxDQUFDO0FBQUE7QUFBQSxrQ0FFdEQsUUFBUSxNQUFNO0FBQUE7QUFBQSxnQ0FHcEI7QUFBQSx3REFDNEIsUUFBUSxJQUFJO0FBQUEseURBQ1gsUUFBUSxNQUFNO0FBQUEsNkJBQzFDO0FBQUE7QUFBQSxxQkFFUjtBQUFBLGtCQUNILFdBQVcsYUFDVCxtREFDQSxPQUFPO0FBQUEsa0JBQ1QsS0FBSyxnQkFBZ0IsTUFBTSxLQUFLLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHekMsQ0FBQyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJVjtBQUFBO0FBQUEsSUFHUSxnQkFBZ0IsTUFBZ0IsT0FBYTtBQUNuRCxhQUFPLEtBQUssSUFBSSxDQUFDLFFBQWU7QUFDOUIsY0FBTSxlQUFlLENBQUMsS0FBSyxjQUFjLElBQUksS0FBSztBQUNsRCxjQUFNLGdCQUFnQixDQUFDLEtBQUssWUFBWSxLQUFLLGFBQWEsWUFBWSxJQUFJLEtBQUssQ0FBRTtBQUNqRixjQUFNLFVBQVUsSUFBSSxVQUFVO0FBQzlCLFlBQUk7QUFDSixZQUFJLEtBQUssVUFBVTtBQUNqQixxQkFDRyxLQUFLLFVBQWtCLEtBQ3RCLENBQUMsV0FBYyxLQUFLLGFBQWEsWUFBWSxJQUFJLFdBQVcsTUFBTSxNQUFNLENBQUMsTUFDckU7QUFBQSxRQUNWLE9BQU87QUFDTCxxQkFDRSxDQUFDLENBQUMsS0FBSyxhQUNQLEtBQUssYUFBYSxZQUFZLElBQUksV0FBVyxLQUFLLFNBQWMsTUFBTTtBQUFBLFFBQzFFO0FBQ0EsZUFBTztBQUFBO0FBQUEsa0JBRUssU0FBUztBQUFBLFVBQ2YsNEJBQTRCO0FBQUEsVUFDNUIscUNBQXFDO0FBQUEsUUFBQSxDQUN0QyxDQUFDO0FBQUE7QUFBQTtBQUFBLG9CQUdRLFNBQVM7QUFBQSxVQUNmLHNCQUFzQjtBQUFBLFVBQ3RCLHFCQUFxQjtBQUFBLFVBQ3JCLDhCQUE4QjtBQUFBLFVBQzlCLDBCQUEwQjtBQUFBLFVBQzFCLDZCQUE2QixDQUFDLGdCQUFnQjtBQUFBLFFBQUEsQ0FDL0MsQ0FBQztBQUFBLHFCQUNPLE1BQU0sS0FBSyxZQUFZLElBQUksU0FBUyxDQUFDO0FBQUEsd0JBQ2xDLGdCQUFnQixhQUFhO0FBQUEsb0JBQ2pDLElBQUksS0FBSztBQUFBO0FBQUEseUJBRUosS0FBSyxhQUFhLDJCQUEyQixJQUFJLEtBQUssQ0FBQztBQUFBLDJCQUNyRCxRQUFRO0FBQUEsNEJBQ1AsZ0JBQWdCLGFBQWE7QUFBQSwyQkFDOUIsVUFBVSxTQUFTLE9BQU87QUFBQTtBQUFBLHVCQUU5QixDQUFDLFFBQXVCLEtBQUsscUJBQXFCLEtBQUssR0FBRyxDQUFDO0FBQUE7QUFBQTtBQUFBLGNBR3BFLElBQUksUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSXRCLENBQUM7QUFBQSxJQUNIO0FBQUE7QUFBQSxJQUdRLG1CQUFnQjtBQUN0QixhQUFPO0FBQUE7QUFBQSxVQUVELEtBQUssVUFDTCxRQUNBLE1BQU0sS0FBSyxtQkFBbUIsRUFBRSxHQUNoQyxpQkFBaUIsS0FBSyxVQUFVLE9BQU8sR0FDdkMsS0FBSyxzQkFBQSxDQUF1QixDQUM3QjtBQUFBLG9EQUMyQyxLQUFLLDBCQUEwQjtBQUFBLFVBQ3pFLEtBQUssVUFDTCxTQUNBLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxHQUMvQixhQUFhLEtBQUssVUFBVSxPQUFPLEdBQ25DLEtBQUssa0JBQUEsQ0FBbUIsQ0FDekI7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUlHLEtBQUssa0JBQWtCLEtBQUssU0FBUyxLQUFLLFdBQVksQ0FBQztBQUFBLFlBQ3ZELEtBQUssUUFBUSxLQUFLLGtCQUFrQixLQUFLLFNBQVMsS0FBSyxjQUFlLENBQUMsSUFBSSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJNUY7QUFBQTtBQUFBLElBR1EsMkJBQXdCO0FBQzlCLGFBQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFJVSxHQUFHLDBCQUEwQixLQUFLLFVBQVUsT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7QUFBQSxpQkFDOUUsTUFBTSxLQUFLLG1CQUFtQixJQUFJLENBQUM7QUFBQTtBQUFBLFVBRTFDLEtBQUssV0FBVyxJQUFJLEtBQUssUUFBUSxNQUFNLEtBQUssY0FBZSxDQUFDLEtBQUssT0FBTztBQUFBO0FBQUE7QUFBQSwrQ0FHbkMsS0FBSyxXQUFXO0FBQUEsSUFDN0Q7QUFBQTtBQUFBLElBR1Esa0JBQWtCLFFBQW1CLE1BQVk7QUFDdkQsYUFBTztBQUFBO0FBQUE7QUFBQSx3QkFHYSxDQUFDLE1BQXNCLEtBQUssbUJBQW1CLENBQUMsQ0FBQztBQUFBO0FBQUEsVUFFL0QsS0FBSyxRQUNIO0FBQUE7QUFBQSxzRUFFMEQsY0FBYyxJQUFJLElBQUk7QUFBQTtBQUFBLHdCQUdoRixPQUFPO0FBQUE7QUFBQSxZQUVQLE9BQU8sSUFDUCxDQUFDLFFBQWlCO0FBQUE7QUFBQSxrQkFFWixJQUFJLElBQUksQ0FBQyxVQUFnQjtBQUN6QixZQUFJO0FBQ0osWUFBSSxLQUFLLFVBQVU7QUFDakIscUJBQ0csS0FBSyxVQUFrQixLQUN0QixDQUFDLFNBQ0MsU0FBUyxLQUFLLGFBQWEsUUFBUSxJQUFJLEtBQ3ZDLE1BQU0sZUFBZSxLQUFLLGFBQWEsU0FBUyxJQUFJLENBQUMsTUFDbkQ7QUFBQSxRQUNWLE9BQU87QUFDTCxnQkFBTSxnQkFBZ0IsS0FBSyxZQUN2QixLQUFLLGFBQWEsU0FBUyxLQUFLLFNBQWMsSUFDOUM7QUFDSixnQkFBTSxlQUFlLEtBQUssWUFDdEIsS0FBSyxhQUFhLFFBQVEsS0FBSyxTQUFjLElBQzdDO0FBQ0oscUJBQ0UsQ0FBQyxDQUFDLEtBQUssYUFDUCxTQUFTLGdCQUNULE1BQU0sZUFBZTtBQUFBLFFBQ3pCO0FBQ0EsY0FBTSxlQUFlLENBQUMsS0FBSyxnQkFBZ0IsTUFBTSxZQUFZLElBQUk7QUFDakUsY0FBTSxnQkFBZ0IsQ0FBQyxLQUFLLG9CQUFvQixNQUFNLFlBQVksSUFBSTtBQUN0RSxjQUFNLGlCQUNKLFNBQVMsS0FBSyxhQUFhLFFBQVEsS0FBSyxhQUFhLE1BQUEsQ0FBTyxLQUM1RCxLQUFLLGFBQWEsU0FBUyxLQUFLLGFBQWEsTUFBQSxDQUFPLE1BQU0sTUFBTTtBQUVsRSxlQUFPO0FBQUEsNEJBQ0csU0FBUztBQUFBLFVBQ2YsNEJBQTRCO0FBQUEsVUFDNUIsNkJBQTZCO0FBQUEsUUFBQSxDQUM5QixDQUFDO0FBQUE7QUFBQTtBQUFBLDhCQUdRLFNBQVM7QUFBQSxVQUNmLHNCQUFzQjtBQUFBLFVBQ3RCLHNCQUFzQjtBQUFBLFVBQ3RCLDhCQUE4QjtBQUFBLFVBQzlCLDZCQUE2QixDQUFDLGdCQUFnQjtBQUFBLFVBQzlDLDBCQUEwQjtBQUFBLFFBQUEsQ0FDM0IsQ0FBQztBQUFBLCtCQUNPLE1BQU0sS0FBSyxrQkFBa0IsTUFBTSxZQUFZLElBQUksQ0FBQztBQUFBLGtDQUNqRCxnQkFBZ0IsYUFBYTtBQUFBLG1DQUM1QixHQUFHLE1BQU0sU0FBUyxJQUFJLElBQUksRUFBRTtBQUFBLHFDQUMxQixRQUFRO0FBQUEsc0NBQ1AsT0FBTyxnQkFBZ0IsYUFBYSxDQUFDO0FBQUE7QUFBQSxtQ0FFeEMsTUFBTSxjQUFjLE9BQU87QUFBQSxpQ0FDN0IsQ0FBQyxRQUF1QixLQUFLLHFCQUFxQixHQUFHLENBQUM7QUFBQTtBQUFBLHdCQUUvRCxNQUFNLEtBQUs7QUFBQTtBQUFBO0FBQUEsTUFHbkIsQ0FBQyxDQUFDO0FBQUE7QUFBQSxhQUVMLENBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlUO0FBQUE7QUFBQSxJQUdRLGtCQUFrQixPQUFlLE1BQVk7QUFDbkQsV0FBSyxlQUFlO0FBQ3BCLFdBQUssb0JBQW9CO0FBQ3pCLFdBQUssTUFDSCxLQUFLLGFBQWEsV0FDaEIsTUFDQSxLQUFLLGNBQ0wsS0FBSyxhQUFhLFFBQVEsS0FBSyxXQUFXLENBQUMsQ0FDNUM7QUFFSCxXQUFLLHNCQUFBO0FBQUEsSUFDUDtBQUFBO0FBQUEsSUFHUSxrQkFBZTtBQUNyQixhQUFPO0FBQUE7QUFBQSxVQUVELEtBQUssVUFDTCxRQUNBLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxjQUFjLEdBQ2xELHNCQUFzQixjQUFjLEVBQUUsS0FBSyxVQUFVLE9BQU8sR0FDNUQsS0FBSyw0QkFBNEIsQ0FDbEM7QUFBQSxvREFDMkMsS0FBSyx5QkFBeUI7QUFBQSxVQUN4RSxLQUFLLFVBQ0wsU0FDQSxNQUFNLEtBQUssd0JBQXdCLGNBQWMsR0FDakQsa0JBQWtCLGNBQWMsRUFBRSxLQUFLLFVBQVUsT0FBTyxHQUN4RCxLQUFLLHdCQUF3QixDQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBSUcsS0FBSyxpQkFBaUIsS0FBSyxNQUFNLENBQUM7QUFBQSxZQUNsQyxLQUFLLFFBQVEsS0FBSyxpQkFBaUIsS0FBSyxpQkFBaUIsSUFBSSxJQUFJLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlsRjtBQUFBO0FBQUEsSUFHUSxVQUNOLFdBQ0EsT0FDQSxXQUNBLFVBQWlCO0FBRWpCLGFBQU87QUFBQTtBQUFBLGlDQUVzQixTQUFTO0FBQUEsbUJBQ3ZCLFNBQVM7QUFBQSxlQUNiLEtBQUs7QUFBQSxrQkFDRixRQUFRO0FBQUEsbUNBQ1MsY0FBYyxTQUFTLGFBQWEsTUFBTTtBQUFBO0FBQUEsSUFFM0U7QUFBQTtBQUFBLElBR1EsMEJBQXVCO0FBQzdCLFlBQU0sWUFBb0IsS0FBSyxPQUFPLEtBQUEsRUFBTyxDQUFDO0FBQzlDLFlBQU0saUJBQTJCLEtBQUssUUFBUSxLQUFLLGtCQUFrQixLQUFLLFFBQVEsS0FBQTtBQUNsRixZQUFNLFdBQW1CLGNBQWMsY0FBYyxTQUFTLENBQUM7QUFDL0QsWUFBTSxZQUFZLEdBQUcsU0FBUyxNQUFNLFFBQVE7QUFDNUMsYUFBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBS1csMEJBQTBCLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBSSxTQUFTO0FBQUEsaUJBQ25FLE1BQU0sS0FBSyxtQkFBbUIsSUFBSSxDQUFDO0FBQUE7QUFBQSxVQUUxQyxTQUFTO0FBQUE7QUFBQTtBQUFBLCtDQUc0QixTQUFTO0FBQUE7QUFBQSxJQUV0RDtBQUFBO0FBQUEsSUFHUSxpQkFBaUIsT0FBbUIsYUFBYSxPQUFLO0FBQzVELFlBQU0sTUFBTSxLQUFLLGFBQWEsTUFBQTtBQUM5QixhQUFPO0FBQUE7QUFBQSxzQkFFVyxDQUFDLE1BQXNCLEtBQUssbUJBQW1CLENBQUMsQ0FBQztBQUFBO0FBQUE7QUFBQSxVQUc3RCxNQUFNLElBQ04sQ0FBQyxRQUNDO0FBQUEsZ0JBQ0ksSUFBSSxJQUFJLENBQUMsU0FBZ0I7QUFDekIsWUFBSTtBQUNKLFlBQUksS0FBSyxVQUFVO0FBQ2pCLHFCQUNHLEtBQUssVUFBa0IsS0FDdEIsQ0FBQyxTQUFZLFNBQVMsS0FBSyxhQUFhLFFBQVEsSUFBSSxDQUFDLE1BQ2pEO0FBQUEsUUFDVixPQUFPO0FBQ0wsZ0JBQU0sZUFBZSxLQUFLLFlBQ3RCLEtBQUssYUFBYSxRQUFRLEtBQUssU0FBYyxJQUM3QztBQUNKLHFCQUFXLENBQUMsQ0FBQyxLQUFLLGFBQWEsU0FBUztBQUFBLFFBQzFDO0FBQ0EsY0FBTSxlQUFlLENBQUMsS0FBSyxlQUFlLElBQUk7QUFDOUMsY0FBTSxnQkFBZ0IsQ0FBQyxLQUFLLG1CQUFtQixJQUFJO0FBQ25ELGNBQU0sZ0JBQWdCLEtBQUssYUFBYSxRQUFRLEdBQUcsTUFBTTtBQUN6RCxlQUFPO0FBQUE7QUFBQSw0QkFFSyxTQUFTO0FBQUEsVUFDZixzQkFBc0I7QUFBQSxVQUN0QixzQkFBc0I7QUFBQSxVQUN0Qiw4QkFBOEI7QUFBQSxVQUM5Qiw2QkFBNkIsQ0FBQyxnQkFBZ0I7QUFBQSxVQUM5QywwQkFBMEI7QUFBQSxRQUFBLENBQzNCLENBQUM7QUFBQSw2QkFDTyxNQUFNLEtBQUssaUJBQWlCLE1BQU0sVUFBVSxDQUFDO0FBQUEsZ0NBQzFDLGdCQUFnQixhQUFhO0FBQUEsaUNBQzVCLElBQUk7QUFBQSxtQ0FDRixRQUFRO0FBQUEsb0NBQ1AsT0FBTyxnQkFBZ0IsYUFBYSxDQUFDO0FBQUE7QUFBQSxnQ0FFekMsUUFBUSxPQUFPO0FBQUEsK0JBQ2hCLENBQUMsUUFBdUIsS0FBSyxxQkFBcUIsR0FBRyxDQUFDO0FBQUE7QUFBQSxzQkFFL0QsSUFBSTtBQUFBO0FBQUE7QUFBQSxNQUdaLENBQUMsQ0FBQztBQUFBLGtCQUNFLENBQ1Q7QUFBQTtBQUFBO0FBQUEsSUFHUDtBQUFBO0FBQUEsSUFHUSxpQkFBaUIsTUFBYyxXQUFrQjtBQUN2RCxXQUFLLGNBQWMsWUFBWSxPQUFPLElBQUk7QUFDMUMsV0FBSyxvQkFBb0I7QUFDekIsV0FBSyxrQkFDSCxLQUFLLGFBQWEsV0FDaEIsS0FBSyxhQUNMLEtBQUssYUFBYSxTQUFTLEtBQUssV0FBVyxHQUMzQyxLQUFLLGFBQWEsUUFBUSxLQUFLLFdBQVcsQ0FBQyxDQUM1QztBQUVILFdBQUssc0JBQUE7QUFBQSxJQUNQO0FBQUEsSUFFUSxXQUFRO0FBQ2QsVUFBSSxZQUFZLEtBQUssbUJBQW1CO0FBR3RDLGVBQU8sT0FBTyxPQUFPO0FBQUEsTUFDdkI7QUFDQSxjQUFRLEtBQUssZUFBQTtBQUFBLFFBQ1gsS0FBSztBQUNILGlCQUFPLEtBQUssZ0JBQUE7QUFBQSxRQUNkLEtBQUs7QUFDSCxpQkFBTyxLQUFLLGlCQUFBO0FBQUEsUUFDZCxLQUFLO0FBQUEsUUFDTDtBQUNFLGlCQUFPLEtBQUssZUFBQTtBQUFBLE1BQWM7QUFBQSxJQUVoQztBQUFBLElBRVEsbUJBQW1CLE9BQXFCO0FBQzlDLFlBQU0sUUFBUSxNQUFNO0FBQ3BCLFVBQUksTUFBTSxrQkFBa0IsUUFBUTtBQUNsQyxjQUFNLFVBQVUsT0FBTywwQkFBMEI7QUFDakQsWUFBSSxLQUFLLGtCQUFrQjtBQUN6QixlQUFLLGNBQWM7QUFBQSxRQUNyQjtBQUNBLGFBQUssZ0JBQWdCLEtBQUs7QUFBQSxNQUM1QixXQUFXLE1BQU0sa0JBQWtCLFFBQVE7QUFDekMsYUFBSyxVQUFVLE9BQU8sT0FBTyxZQUFZO0FBQUEsTUFDM0M7QUFBQSxJQUNGO0FBQUEsSUFFUSx3QkFBcUI7QUFDM0IsV0FBSyxVQUFVLE9BQU8sSUFBSSxZQUFZO0FBQ3RDLFdBQUssWUFDRCxpQkFBaUIsT0FBTyxHQUN4QixRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsT0FBTywwQkFBMEIsQ0FBQztBQUFBLElBQ25FO0FBQUEsSUFFbUIsU0FBTTtBQUN2QixhQUFPLDBDQUEwQyxLQUFLLFNBQUEsQ0FBVTtBQUFBLElBQ2xFO0FBQUEsS0FoeERBLHdDQUdZLHdDQVFaLHVDQVFBLHVDQVFBLDRDQW1DUyw2Q0FJVCw4Q0FHNkIsK0NBSzdCLCtDQUtTLCtDQWVBLGlEQTREVDs7d0JBNUpDLGFBQ0EsU0FBUyxFQUFFLE1BQU0sUUFBQSxDQUFTLENBQUM7QUFJM0IsdUJBQUEsQ0FBQSxVQUFVO3VCQU1WLGFBQ0EsVUFBVTt1QkFPVixhQUNBLFVBQVU7NEJBSVYsVUFBQSxHQUNBLHFCQUFxQixDQUFDLEdBQTBCLGFBQy9DLEVBQUUsbUJBQW1CLFFBQVEsQ0FBQyxHQUUvQixTQUFTLEVBQUUsTUFBTSxRQUFBLENBQVMsQ0FBQztBQU0zQiwrQkFBQSxDQUFBLFVBQVU7QUE4QlYsNEJBQUEsQ0FBQSxPQUFPO0FBR1AsNkJBQUEsQ0FBQSxTQUFTLEVBQUUsV0FBVyxjQUFBLENBQWUsQ0FBQztBQUl0Qyw4QkFBQSxDQUFBLFNBQVMsRUFBRSxTQUFTLEtBQUEsQ0FBTSxDQUFDO0FBRzNCLDhCQUFBLENBQUEsVUFBQSxHQUNBLFNBQVMsRUFBRSxXQUFXLGdCQUFnQixNQUFNLFFBQUEsQ0FBUyxDQUFDO0FBTXRELDhCQUFBLENBQUEsT0FBTztBQUdQLDRCQUFBLENBQUEsT0FBTztBQVlQLGdDQUFBLENBQUEsT0FBTztBQTJEUCwrQkFBQSxDQUFBLE9BQU87QUF6SlIsaUJBQUEsSUFBQSxNQUFBLGtCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsUUFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxVQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBZ0IsTUFBSSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBSixPQUFJO0FBQUEsSUFBQSxLQUFBLFVBQUEsVUFBQSxHQUFBLG9CQUFBLHVCQUFBO0FBR1IsaUJBQUEsSUFBQSxNQUFBLGtCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsUUFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxVQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBZ0IsTUFBSSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBSixPQUFJO0FBQUEsSUFBQSxLQUFBLFVBQUEsVUFBQSxHQUFBLG9CQUFBLHVCQUFBO0FBUWhDLGlCQUFBLElBQUEsTUFBQSxpQkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLE9BQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsU0FBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQWdCLEtBQUcsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFVBQUgsTUFBRztBQUFBLElBQUEsS0FBQSxVQUFBLFVBQUEsR0FBQSxtQkFBQSxzQkFBQTtBQVFuQixpQkFBQSxJQUFBLE1BQUEsaUJBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxPQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLFNBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFnQixLQUFHLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFILE1BQUc7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsbUJBQUEsc0JBQUE7QUFRbkIsaUJBQUEsSUFBQSxNQUFBLHNCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsWUFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxjQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBZ0IsVUFBUSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBUixXQUFRO0FBQUEsSUFBQSxLQUFBLFVBQUEsVUFBQSxHQUFBLHdCQUFBLDJCQUFBO0FBTXhCLGlCQUFBLElBQUEsTUFBQSwwQkFBQSxFQUFBLE1BQUEsVUFBQSxNQUFBLFlBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsY0FBQSxLQUFBLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFXLFdBQVE7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsTUFBQSwwQkFBQTtBQTZCVixpQkFBQSxJQUFBLE1BQUEsdUJBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxhQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLGVBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFpQixXQUFTLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFULFlBQVM7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEseUJBQUEsNEJBQUE7QUFJbkMsaUJBQUEsSUFBQSxNQUFBLHdCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsY0FBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxnQkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQWdCLFlBQVUsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFVBQVYsYUFBVTtBQUFBLElBQUEsS0FBQSxVQUFBLFVBQUEsR0FBQSwwQkFBQSw2QkFBQTtBQUdHLGlCQUFBLElBQUEsTUFBQSx5QkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLGVBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsaUJBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFnQixhQUFXLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFYLGNBQVc7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsMkJBQUEsOEJBQUE7QUFLeEQsaUJBQUEsSUFBQSxNQUFBLHlCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsZUFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxpQkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQWdCLGFBQVcsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFVBQVgsY0FBVztBQUFBLElBQUEsS0FBQSxVQUFBLFVBQUEsR0FBQSwyQkFBQSw4QkFBQTtBQUtsQixpQkFBQSxJQUFBLE1BQUEseUJBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxlQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLGlCQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBaUIsYUFBVyxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBWCxjQUFXO0FBQUEsSUFBQSxLQUFBLFVBQUEsVUFBQSxHQUFBLDJCQUFBLDhCQUFBO0FBSXJDLGlCQUFBLElBQUEsTUFBQSx1QkFBQSxFQUFBLE1BQUEsVUFBQSxNQUFBLFNBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsV0FBQSxLQUFBLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFZLFFBQUs7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsTUFBQSwwQkFBQTtBQVdSLGlCQUFBLElBQUEsTUFBQSwyQkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLGlCQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLG1CQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBaUIsZUFBYSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBYixnQkFBYTtBQUFBLElBQUEsS0FBQSxVQUFBLFVBQUEsR0FBQSw2QkFBQSxnQ0FBQTtBQTREdkMsaUJBQUEsSUFBQSxNQUFBLDBCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsZ0JBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsa0JBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFpQixjQUFZLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFaLGVBQVk7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsNEJBQUEsK0JBQUE7QUFuSy9CLGlCQUFBLE1BQUEsbUJBQUEsRUFBQSxPQUFBLFdBQUEsR0FBQSxrQkFBQSxFQUFBLE1BQUEsU0FBQSxNQUFBLFdBQUEsTUFBQSxVQUFBLFVBQUEsR0FBQSxNQUFBLHVCQUFBOzs7UUFDeUIsR0FBQSxTQUF5QixDQUFDLGlCQUFpQixLQUFLLEdBQ2hELEdBQUEsU0FBUztBQUFBLElBQzlCLGNBQWM7QUFBQSxFQUFBLEdBSFosa0JBQUEsWUFBQSx1QkFBQSxHQUE2Qjs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0XX0=