@sbb-esta/lyne-elements 1.13.0 → 1.14.1

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 (889) hide show
  1. package/accordion/accordion.d.ts +4 -8
  2. package/accordion/accordion.d.ts.map +1 -1
  3. package/accordion.js +90 -81
  4. package/action-group/action-group.d.ts +5 -5
  5. package/action-group/action-group.d.ts.map +1 -1
  6. package/action-group.js +100 -50
  7. package/alert/alert/alert.d.ts +11 -11
  8. package/alert/alert/alert.d.ts.map +1 -1
  9. package/alert/alert-group/alert-group.d.ts +4 -4
  10. package/alert/alert-group/alert-group.d.ts.map +1 -1
  11. package/alert/alert-group.js +101 -69
  12. package/alert/alert.js +191 -104
  13. package/autocomplete/autocomplete-base-element.d.ts +3 -7
  14. package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  15. package/autocomplete/autocomplete.d.ts.map +1 -1
  16. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
  17. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -0
  18. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
  19. package/autocomplete-grid/autocomplete-grid-button.js +53 -60
  20. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.d.ts.map +1 -1
  21. package/autocomplete-grid/autocomplete-grid-cell.js +20 -22
  22. package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.d.ts.map +1 -1
  23. package/autocomplete-grid/autocomplete-grid-optgroup.js +31 -35
  24. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.d.ts.map +1 -1
  25. package/autocomplete-grid/autocomplete-grid-option.js +45 -63
  26. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.d.ts.map +1 -1
  27. package/autocomplete-grid/autocomplete-grid-row.js +23 -25
  28. package/autocomplete-grid/autocomplete-grid.js +112 -133
  29. package/autocomplete.js +283 -295
  30. package/breadcrumb/breadcrumb/breadcrumb.d.ts +1 -1
  31. package/breadcrumb/breadcrumb/breadcrumb.d.ts.map +1 -1
  32. package/breadcrumb/breadcrumb-group/breadcrumb-group.d.ts.map +1 -1
  33. package/breadcrumb/breadcrumb-group.js +107 -114
  34. package/breadcrumb/breadcrumb.js +44 -35
  35. package/button/button/button.d.ts.map +1 -1
  36. package/button/button-link/button-link.d.ts.map +1 -1
  37. package/button/button-link.js +15 -18
  38. package/button/button-static/button-static.d.ts.map +1 -1
  39. package/button/button-static.js +15 -18
  40. package/button/button.js +15 -18
  41. package/button/common/button-common.d.ts +4 -4
  42. package/button/common/button-common.d.ts.map +1 -1
  43. package/button/common.js +41 -30
  44. package/button/mini-button/mini-button-base-element.d.ts.map +1 -1
  45. package/button/mini-button/mini-button.d.ts.map +1 -1
  46. package/button/mini-button-group/mini-button-group.d.ts +2 -2
  47. package/button/mini-button-group/mini-button-group.d.ts.map +1 -1
  48. package/button/mini-button-group.js +55 -43
  49. package/button/mini-button.js +30 -34
  50. package/button/secondary-button/secondary-button.d.ts.map +1 -1
  51. package/button/secondary-button-link/secondary-button-link.d.ts.map +1 -1
  52. package/button/secondary-button-link.js +15 -18
  53. package/button/secondary-button-static/secondary-button-static.d.ts.map +1 -1
  54. package/button/secondary-button-static.js +15 -18
  55. package/button/secondary-button.js +15 -18
  56. package/button/tertiary-button/tertiary-button.d.ts.map +1 -1
  57. package/button/tertiary-button-link/tertiary-button-link.d.ts.map +1 -1
  58. package/button/tertiary-button-link.js +15 -18
  59. package/button/tertiary-button-static/tertiary-button-static.d.ts.map +1 -1
  60. package/button/tertiary-button-static.js +15 -18
  61. package/button/tertiary-button.js +15 -18
  62. package/button/transparent-button/transparent-button.d.ts.map +1 -1
  63. package/button/transparent-button-link/transparent-button-link.d.ts.map +1 -1
  64. package/button/transparent-button-link.js +15 -18
  65. package/button/transparent-button-static/transparent-button-static.d.ts.map +1 -1
  66. package/button/transparent-button-static.js +15 -18
  67. package/button/transparent-button.js +15 -18
  68. package/calendar/calendar.d.ts +7 -7
  69. package/calendar/calendar.d.ts.map +1 -1
  70. package/calendar.js +644 -699
  71. package/card/card/card.d.ts +2 -2
  72. package/card/card/card.d.ts.map +1 -1
  73. package/card/card-badge/card-badge.d.ts +1 -1
  74. package/card/card-badge/card-badge.d.ts.map +1 -1
  75. package/card/card-badge.js +45 -34
  76. package/card/card-button/card-button.d.ts.map +1 -1
  77. package/card/card-button.js +16 -16
  78. package/card/card-link/card-link.d.ts.map +1 -1
  79. package/card/card-link.js +17 -17
  80. package/card/card.js +55 -36
  81. package/card/common/card-action-common.d.ts +1 -1
  82. package/card/common/card-action-common.d.ts.map +1 -1
  83. package/card/common.js +27 -33
  84. package/checkbox/checkbox/checkbox.d.ts +3 -4
  85. package/checkbox/checkbox/checkbox.d.ts.map +1 -1
  86. package/checkbox/checkbox-group/checkbox-group.d.ts +4 -4
  87. package/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
  88. package/checkbox/checkbox-group.js +99 -76
  89. package/checkbox/checkbox-panel/checkbox-panel.d.ts +2 -3
  90. package/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
  91. package/checkbox/checkbox-panel.js +51 -50
  92. package/checkbox/checkbox.js +54 -43
  93. package/checkbox/common/checkbox-common.d.ts +1 -1
  94. package/checkbox/common/checkbox-common.d.ts.map +1 -1
  95. package/checkbox/common.js +39 -24
  96. package/chip/chip.d.ts +2 -2
  97. package/chip/chip.d.ts.map +1 -1
  98. package/chip.js +45 -26
  99. package/clock/clock.d.ts +1 -1
  100. package/clock/clock.d.ts.map +1 -1
  101. package/clock.js +136 -144
  102. package/container/container/container.d.ts +3 -3
  103. package/container/container/container.d.ts.map +1 -1
  104. package/container/container.js +60 -35
  105. package/container/sticky-bar/sticky-bar.d.ts +1 -1
  106. package/container/sticky-bar/sticky-bar.d.ts.map +1 -1
  107. package/container/sticky-bar.js +55 -47
  108. package/core/a11y.js +29 -51
  109. package/core/base-elements/action-base-element.d.ts.map +1 -1
  110. package/core/base-elements/button-base-element.d.ts +2 -2
  111. package/core/base-elements/button-base-element.d.ts.map +1 -1
  112. package/core/base-elements/link-base-element.d.ts +5 -5
  113. package/core/base-elements/link-base-element.d.ts.map +1 -1
  114. package/core/base-elements.js +243 -196
  115. package/core/controllers.js +8 -13
  116. package/core/decorators/base.d.ts +14 -0
  117. package/core/decorators/base.d.ts.map +1 -0
  118. package/core/decorators/force-type.d.ts +8 -0
  119. package/core/decorators/force-type.d.ts.map +1 -0
  120. package/core/decorators/get-override.d.ts +7 -0
  121. package/core/decorators/get-override.d.ts.map +1 -0
  122. package/core/decorators/handle-distinct-change.d.ts +8 -0
  123. package/core/decorators/handle-distinct-change.d.ts.map +1 -0
  124. package/core/decorators/omit-empty-converter.d.ts +8 -0
  125. package/core/decorators/omit-empty-converter.d.ts.map +1 -0
  126. package/core/decorators.d.ts +4 -0
  127. package/core/decorators.d.ts.map +1 -1
  128. package/core/decorators.js +59 -15
  129. package/core/dom.js +1 -5
  130. package/core/eventing.js +1 -4
  131. package/core/interfaces/paginator-page.d.ts +7 -0
  132. package/core/interfaces/paginator-page.d.ts.map +1 -0
  133. package/core/interfaces.d.ts +1 -0
  134. package/core/interfaces.d.ts.map +1 -1
  135. package/core/mixins/disabled-mixin.d.ts +2 -3
  136. package/core/mixins/disabled-mixin.d.ts.map +1 -1
  137. package/core/mixins/named-slot-list-mixin.d.ts +1 -1
  138. package/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
  139. package/core/mixins/negative-mixin.d.ts +1 -1
  140. package/core/mixins/negative-mixin.d.ts.map +1 -1
  141. package/core/mixins/panel-mixin.d.ts +3 -3
  142. package/core/mixins/panel-mixin.d.ts.map +1 -1
  143. package/core/mixins/required-mixin.d.ts +1 -2
  144. package/core/mixins/required-mixin.d.ts.map +1 -1
  145. package/core/mixins.js +290 -237
  146. package/core/testing/private.d.ts +1 -0
  147. package/core/testing/private.d.ts.map +1 -1
  148. package/core/testing.js +7 -13
  149. package/custom-elements.json +15974 -15154
  150. package/datepicker/common/datepicker-button.d.ts +2 -2
  151. package/datepicker/common/datepicker-button.d.ts.map +1 -1
  152. package/datepicker/common.js +110 -116
  153. package/datepicker/datepicker/datepicker.d.ts +6 -6
  154. package/datepicker/datepicker/datepicker.d.ts.map +1 -1
  155. package/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
  156. package/datepicker/datepicker-next-day.js +24 -26
  157. package/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
  158. package/datepicker/datepicker-previous-day.js +25 -27
  159. package/datepicker/datepicker-toggle/datepicker-toggle.d.ts +6 -6
  160. package/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
  161. package/datepicker/datepicker-toggle.js +154 -136
  162. package/datepicker/datepicker.js +248 -213
  163. package/development/accordion/accordion.d.ts +4 -8
  164. package/development/accordion/accordion.d.ts.map +1 -1
  165. package/development/accordion.js +118 -93
  166. package/development/action-group/action-group.d.ts +5 -5
  167. package/development/action-group/action-group.d.ts.map +1 -1
  168. package/development/action-group.js +138 -64
  169. package/development/alert/alert/alert.d.ts +11 -11
  170. package/development/alert/alert/alert.d.ts.map +1 -1
  171. package/development/alert/alert-group/alert-group.d.ts +4 -4
  172. package/development/alert/alert-group/alert-group.d.ts.map +1 -1
  173. package/development/alert/alert-group.js +135 -79
  174. package/development/alert/alert.js +259 -109
  175. package/development/autocomplete/autocomplete-base-element.d.ts +3 -7
  176. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  177. package/development/autocomplete/autocomplete.d.ts.map +1 -1
  178. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
  179. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -0
  180. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
  181. package/development/autocomplete-grid/autocomplete-grid-button.js +74 -75
  182. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.d.ts.map +1 -1
  183. package/development/autocomplete-grid/autocomplete-grid-cell.js +24 -24
  184. package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.d.ts.map +1 -1
  185. package/development/autocomplete-grid/autocomplete-grid-optgroup.js +38 -39
  186. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.d.ts.map +1 -1
  187. package/development/autocomplete-grid/autocomplete-grid-option.js +57 -73
  188. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.d.ts.map +1 -1
  189. package/development/autocomplete-grid/autocomplete-grid-row.js +28 -28
  190. package/development/autocomplete-grid/autocomplete-grid.js +142 -160
  191. package/development/autocomplete.js +394 -393
  192. package/development/breadcrumb/breadcrumb/breadcrumb.d.ts +1 -1
  193. package/development/breadcrumb/breadcrumb/breadcrumb.d.ts.map +1 -1
  194. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.d.ts.map +1 -1
  195. package/development/breadcrumb/breadcrumb-group.js +130 -130
  196. package/development/breadcrumb/breadcrumb.js +53 -36
  197. package/development/button/button/button.d.ts.map +1 -1
  198. package/development/button/button-link/button-link.d.ts.map +1 -1
  199. package/development/button/button-link.js +18 -19
  200. package/development/button/button-static/button-static.d.ts.map +1 -1
  201. package/development/button/button-static.js +18 -19
  202. package/development/button/button.js +18 -19
  203. package/development/button/common/button-common.d.ts +4 -4
  204. package/development/button/common/button-common.d.ts.map +1 -1
  205. package/development/button/common.js +50 -29
  206. package/development/button/mini-button/mini-button-base-element.d.ts.map +1 -1
  207. package/development/button/mini-button/mini-button.d.ts.map +1 -1
  208. package/development/button/mini-button-group/mini-button-group.d.ts +2 -2
  209. package/development/button/mini-button-group/mini-button-group.d.ts.map +1 -1
  210. package/development/button/mini-button-group.js +77 -50
  211. package/development/button/mini-button.js +38 -37
  212. package/development/button/secondary-button/secondary-button.d.ts.map +1 -1
  213. package/development/button/secondary-button-link/secondary-button-link.d.ts.map +1 -1
  214. package/development/button/secondary-button-link.js +18 -19
  215. package/development/button/secondary-button-static/secondary-button-static.d.ts.map +1 -1
  216. package/development/button/secondary-button-static.js +18 -19
  217. package/development/button/secondary-button.js +18 -19
  218. package/development/button/tertiary-button/tertiary-button.d.ts.map +1 -1
  219. package/development/button/tertiary-button-link/tertiary-button-link.d.ts.map +1 -1
  220. package/development/button/tertiary-button-link.js +18 -19
  221. package/development/button/tertiary-button-static/tertiary-button-static.d.ts.map +1 -1
  222. package/development/button/tertiary-button-static.js +18 -19
  223. package/development/button/tertiary-button.js +18 -19
  224. package/development/button/transparent-button/transparent-button.d.ts.map +1 -1
  225. package/development/button/transparent-button-link/transparent-button-link.d.ts.map +1 -1
  226. package/development/button/transparent-button-link.js +18 -19
  227. package/development/button/transparent-button-static/transparent-button-static.d.ts.map +1 -1
  228. package/development/button/transparent-button-static.js +18 -19
  229. package/development/button/transparent-button.js +18 -19
  230. package/development/calendar/calendar.d.ts +7 -7
  231. package/development/calendar/calendar.d.ts.map +1 -1
  232. package/development/calendar.js +774 -773
  233. package/development/card/card/card.d.ts +2 -2
  234. package/development/card/card/card.d.ts.map +1 -1
  235. package/development/card/card-badge/card-badge.d.ts +1 -1
  236. package/development/card/card-badge/card-badge.d.ts.map +1 -1
  237. package/development/card/card-badge.js +65 -45
  238. package/development/card/card-button/card-button.d.ts.map +1 -1
  239. package/development/card/card-button.js +23 -20
  240. package/development/card/card-link/card-link.d.ts.map +1 -1
  241. package/development/card/card-link.js +23 -20
  242. package/development/card/card.js +72 -41
  243. package/development/card/common/card-action-common.d.ts +1 -1
  244. package/development/card/common/card-action-common.d.ts.map +1 -1
  245. package/development/card/common.js +74 -73
  246. package/development/checkbox/checkbox/checkbox.d.ts +3 -4
  247. package/development/checkbox/checkbox/checkbox.d.ts.map +1 -1
  248. package/development/checkbox/checkbox-group/checkbox-group.d.ts +4 -4
  249. package/development/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
  250. package/development/checkbox/checkbox-group.js +139 -92
  251. package/development/checkbox/checkbox-panel/checkbox-panel.d.ts +2 -3
  252. package/development/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
  253. package/development/checkbox/checkbox-panel.js +68 -60
  254. package/development/checkbox/checkbox.js +69 -46
  255. package/development/checkbox/common/checkbox-common.d.ts +1 -1
  256. package/development/checkbox/common/checkbox-common.d.ts.map +1 -1
  257. package/development/checkbox/common.js +65 -46
  258. package/development/chip/chip.d.ts +2 -2
  259. package/development/chip/chip.d.ts.map +1 -1
  260. package/development/chip.js +64 -33
  261. package/development/clock/clock.d.ts +1 -1
  262. package/development/clock/clock.d.ts.map +1 -1
  263. package/development/clock.js +203 -201
  264. package/development/container/container/container.d.ts +3 -3
  265. package/development/container/container/container.d.ts.map +1 -1
  266. package/development/container/container.js +86 -45
  267. package/development/container/sticky-bar/sticky-bar.d.ts +1 -1
  268. package/development/container/sticky-bar/sticky-bar.d.ts.map +1 -1
  269. package/development/container/sticky-bar.js +76 -58
  270. package/development/core/a11y.js +40 -62
  271. package/development/core/base-elements/action-base-element.d.ts.map +1 -1
  272. package/development/core/base-elements/button-base-element.d.ts +2 -2
  273. package/development/core/base-elements/button-base-element.d.ts.map +1 -1
  274. package/development/core/base-elements/link-base-element.d.ts +5 -5
  275. package/development/core/base-elements/link-base-element.d.ts.map +1 -1
  276. package/development/core/base-elements.js +329 -226
  277. package/development/core/config.js +1 -1
  278. package/development/core/controllers.js +13 -21
  279. package/development/core/datetime.js +1 -1
  280. package/development/core/decorators/base.d.ts +14 -0
  281. package/development/core/decorators/base.d.ts.map +1 -0
  282. package/development/core/decorators/force-type.d.ts +8 -0
  283. package/development/core/decorators/force-type.d.ts.map +1 -0
  284. package/development/core/decorators/get-override.d.ts +7 -0
  285. package/development/core/decorators/get-override.d.ts.map +1 -0
  286. package/development/core/decorators/handle-distinct-change.d.ts +8 -0
  287. package/development/core/decorators/handle-distinct-change.d.ts.map +1 -0
  288. package/development/core/decorators/omit-empty-converter.d.ts +8 -0
  289. package/development/core/decorators/omit-empty-converter.d.ts.map +1 -0
  290. package/development/core/decorators.d.ts +4 -0
  291. package/development/core/decorators.d.ts.map +1 -1
  292. package/development/core/decorators.js +69 -5
  293. package/development/core/dom.js +2 -6
  294. package/development/core/eventing.js +2 -5
  295. package/development/core/i18n.js +1 -1
  296. package/development/core/interfaces/paginator-page.d.ts +7 -0
  297. package/development/core/interfaces/paginator-page.d.ts.map +1 -0
  298. package/development/core/interfaces.d.ts +1 -0
  299. package/development/core/interfaces.d.ts.map +1 -1
  300. package/development/core/mixins/disabled-mixin.d.ts +2 -3
  301. package/development/core/mixins/disabled-mixin.d.ts.map +1 -1
  302. package/development/core/mixins/named-slot-list-mixin.d.ts +1 -1
  303. package/development/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
  304. package/development/core/mixins/negative-mixin.d.ts +1 -1
  305. package/development/core/mixins/negative-mixin.d.ts.map +1 -1
  306. package/development/core/mixins/panel-mixin.d.ts +3 -3
  307. package/development/core/mixins/panel-mixin.d.ts.map +1 -1
  308. package/development/core/mixins/required-mixin.d.ts +1 -2
  309. package/development/core/mixins/required-mixin.d.ts.map +1 -1
  310. package/development/core/mixins.js +573 -475
  311. package/development/core/observers.js +1 -1
  312. package/development/core/overlay.js +1 -1
  313. package/development/core/testing/private.d.ts +1 -0
  314. package/development/core/testing/private.d.ts.map +1 -1
  315. package/development/core/testing.js +16 -22
  316. package/development/datepicker/common/datepicker-button.d.ts +2 -2
  317. package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
  318. package/development/datepicker/common.js +144 -142
  319. package/development/datepicker/datepicker/datepicker.d.ts +6 -6
  320. package/development/datepicker/datepicker/datepicker.d.ts.map +1 -1
  321. package/development/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
  322. package/development/datepicker/datepicker-next-day.js +32 -32
  323. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
  324. package/development/datepicker/datepicker-previous-day.js +32 -32
  325. package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts +6 -6
  326. package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
  327. package/development/datepicker/datepicker-toggle.js +227 -174
  328. package/development/datepicker/datepicker.js +327 -249
  329. package/development/dialog/dialog/dialog.d.ts +1 -1
  330. package/development/dialog/dialog/dialog.d.ts.map +1 -1
  331. package/development/dialog/dialog-actions/dialog-actions.d.ts.map +1 -1
  332. package/development/dialog/dialog-actions.js +21 -20
  333. package/development/dialog/dialog-content/dialog-content.d.ts.map +1 -1
  334. package/development/dialog/dialog-content.js +22 -21
  335. package/development/dialog/dialog-title/dialog-title.d.ts +3 -3
  336. package/development/dialog/dialog-title/dialog-title.d.ts.map +1 -1
  337. package/development/dialog/dialog-title.js +121 -66
  338. package/development/dialog/dialog.js +205 -191
  339. package/development/divider/divider.d.ts +1 -1
  340. package/development/divider/divider.d.ts.map +1 -1
  341. package/development/divider.js +55 -36
  342. package/development/expansion-panel/expansion-panel/expansion-panel.d.ts +4 -4
  343. package/development/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
  344. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.d.ts.map +1 -1
  345. package/development/expansion-panel/expansion-panel-content.js +25 -25
  346. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts +1 -1
  347. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts.map +1 -1
  348. package/development/expansion-panel/expansion-panel-header.js +56 -63
  349. package/development/expansion-panel/expansion-panel.js +227 -182
  350. package/development/file-selector/file-selector.d.ts +8 -7
  351. package/development/file-selector/file-selector.d.ts.map +1 -1
  352. package/development/file-selector.js +295 -198
  353. package/development/flip-card/flip-card/flip-card.d.ts +2 -2
  354. package/development/flip-card/flip-card/flip-card.d.ts.map +1 -1
  355. package/development/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
  356. package/development/flip-card/flip-card-details.js +39 -39
  357. package/development/flip-card/flip-card-summary/flip-card-summary.d.ts +1 -1
  358. package/development/flip-card/flip-card-summary/flip-card-summary.d.ts.map +1 -1
  359. package/development/flip-card/flip-card-summary.js +57 -38
  360. package/development/flip-card/flip-card.js +110 -78
  361. package/development/footer/footer.d.ts +4 -4
  362. package/development/footer/footer.d.ts.map +1 -1
  363. package/development/footer.js +103 -41
  364. package/development/form-error/form-error.d.ts.map +1 -1
  365. package/development/form-error.js +29 -28
  366. package/development/form-field/form-field/form-field.d.ts +10 -10
  367. package/development/form-field/form-field/form-field.d.ts.map +1 -1
  368. package/development/form-field/form-field-clear/form-field-clear.d.ts.map +1 -1
  369. package/development/form-field/form-field-clear.js +50 -50
  370. package/development/form-field/form-field.js +439 -328
  371. package/development/header/common/header-action-common.d.ts +2 -2
  372. package/development/header/common/header-action-common.d.ts.map +1 -1
  373. package/development/header/common.js +44 -24
  374. package/development/header/header/header.d.ts +4 -4
  375. package/development/header/header/header.d.ts.map +1 -1
  376. package/development/header/header-button/header-button.d.ts.map +1 -1
  377. package/development/header/header-button.js +19 -18
  378. package/development/header/header-link/header-link.d.ts.map +1 -1
  379. package/development/header/header-link.js +19 -16
  380. package/development/header/header.js +198 -140
  381. package/development/icon/icon-base.d.ts +3 -4
  382. package/development/icon/icon-base.d.ts.map +1 -1
  383. package/development/icon/icon-name-mixin.d.ts +1 -1
  384. package/development/icon/icon-name-mixin.d.ts.map +1 -1
  385. package/development/icon/icon.d.ts +2 -2
  386. package/development/icon/icon.d.ts.map +1 -1
  387. package/development/icon.js +258 -157
  388. package/development/image/image.d.ts +17 -17
  389. package/development/image/image.d.ts.map +1 -1
  390. package/development/image.js +584 -216
  391. package/development/journey-header/journey-header.d.ts +5 -5
  392. package/development/journey-header/journey-header.d.ts.map +1 -1
  393. package/development/journey-header.js +115 -43
  394. package/development/lead-container/lead-container.d.ts.map +1 -1
  395. package/development/lead-container.js +22 -21
  396. package/development/link/block-link/block-link.d.ts.map +1 -1
  397. package/development/link/block-link-button/block-link-button.d.ts.map +1 -1
  398. package/development/link/block-link-button.js +19 -18
  399. package/development/link/block-link-static/block-link-static.d.ts.map +1 -1
  400. package/development/link/block-link-static.js +19 -18
  401. package/development/link/block-link.js +19 -18
  402. package/development/link/common/block-link-common.d.ts +4 -3
  403. package/development/link/common/block-link-common.d.ts.map +1 -1
  404. package/development/link/common/link-common.d.ts +1 -1
  405. package/development/link/common/link-common.d.ts.map +1 -1
  406. package/development/link/common.js +81 -51
  407. package/development/link/link/link.d.ts.map +1 -1
  408. package/development/link/link-button/link-button.d.ts.map +1 -1
  409. package/development/link/link-button.js +19 -18
  410. package/development/link/link-static/link-static.d.ts.map +1 -1
  411. package/development/link/link-static.js +19 -18
  412. package/development/link/link.js +19 -18
  413. package/development/link-list/common/link-list-base.d.ts +3 -3
  414. package/development/link-list/common/link-list-base.d.ts.map +1 -1
  415. package/development/link-list/common.js +97 -48
  416. package/development/link-list/link-list/link-list.d.ts +2 -2
  417. package/development/link-list/link-list/link-list.d.ts.map +1 -1
  418. package/development/link-list/link-list-anchor/link-list-anchor.d.ts.map +1 -1
  419. package/development/link-list/link-list-anchor.js +18 -17
  420. package/development/link-list/link-list.js +60 -28
  421. package/development/loading-indicator/loading-indicator.d.ts +3 -3
  422. package/development/loading-indicator/loading-indicator.d.ts.map +1 -1
  423. package/development/loading-indicator.js +82 -40
  424. package/development/logo/logo.d.ts +2 -2
  425. package/development/logo/logo.d.ts.map +1 -1
  426. package/development/logo.js +64 -32
  427. package/development/map-container/map-container.d.ts +2 -2
  428. package/development/map-container/map-container.d.ts.map +1 -1
  429. package/development/map-container.js +107 -75
  430. package/development/menu/common/menu-action-common.d.ts +2 -2
  431. package/development/menu/common/menu-action-common.d.ts.map +1 -1
  432. package/development/menu/common.js +41 -20
  433. package/development/menu/menu/menu.d.ts +1 -1
  434. package/development/menu/menu/menu.d.ts.map +1 -1
  435. package/development/menu/menu-button/menu-button.d.ts.map +1 -1
  436. package/development/menu/menu-button.js +19 -18
  437. package/development/menu/menu-link/menu-link.d.ts.map +1 -1
  438. package/development/menu/menu-link.js +19 -18
  439. package/development/menu/menu.js +261 -241
  440. package/development/message/message.d.ts +2 -2
  441. package/development/message/message.d.ts.map +1 -1
  442. package/development/message.js +65 -32
  443. package/development/navigation/common/navigation-action-common.d.ts +1 -1
  444. package/development/navigation/common/navigation-action-common.d.ts.map +1 -1
  445. package/development/navigation/common.js +63 -52
  446. package/development/navigation/navigation/navigation.d.ts +2 -2
  447. package/development/navigation/navigation/navigation.d.ts.map +1 -1
  448. package/development/navigation/navigation-button/navigation-button.d.ts.map +1 -1
  449. package/development/navigation/navigation-button.js +19 -18
  450. package/development/navigation/navigation-link/navigation-link.d.ts.map +1 -1
  451. package/development/navigation/navigation-link.js +19 -18
  452. package/development/navigation/navigation-list/navigation-list.d.ts +1 -1
  453. package/development/navigation/navigation-list/navigation-list.d.ts.map +1 -1
  454. package/development/navigation/navigation-list.js +64 -41
  455. package/development/navigation/navigation-marker/navigation-marker.d.ts +1 -1
  456. package/development/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
  457. package/development/navigation/navigation-marker.js +108 -91
  458. package/development/navigation/navigation-section/navigation-section.d.ts +3 -3
  459. package/development/navigation/navigation-section/navigation-section.d.ts.map +1 -1
  460. package/development/navigation/navigation-section.js +282 -236
  461. package/development/navigation/navigation.js +278 -254
  462. package/development/notification/notification.d.ts +6 -6
  463. package/development/notification/notification.d.ts.map +1 -1
  464. package/development/notification.js +212 -146
  465. package/development/option/optgroup/optgroup-base-element.d.ts +3 -3
  466. package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  467. package/development/option/optgroup/optgroup.d.ts.map +1 -1
  468. package/development/option/optgroup.js +187 -142
  469. package/development/option/option/option-base-element.d.ts +7 -7
  470. package/development/option/option/option-base-element.d.ts.map +1 -1
  471. package/development/option/option/option.d.ts.map +1 -1
  472. package/development/option/option.js +392 -296
  473. package/development/overlay/overlay-base-element.d.ts +1 -1
  474. package/development/overlay/overlay-base-element.d.ts.map +1 -1
  475. package/development/overlay/overlay.d.ts +4 -4
  476. package/development/overlay/overlay.d.ts.map +1 -1
  477. package/development/overlay.js +260 -207
  478. package/development/paginator/common/paginator-common.d.ts +26 -0
  479. package/development/paginator/common/paginator-common.d.ts.map +1 -0
  480. package/development/paginator/common.d.ts +2 -0
  481. package/development/paginator/common.d.ts.map +1 -0
  482. package/development/paginator/common.js +189 -0
  483. package/development/paginator/compact-paginator/compact-paginator.d.ts +20 -0
  484. package/development/paginator/compact-paginator/compact-paginator.d.ts.map +1 -0
  485. package/development/paginator/compact-paginator.d.ts +2 -0
  486. package/development/paginator/compact-paginator.d.ts.map +1 -0
  487. package/development/paginator/compact-paginator.js +96 -0
  488. package/development/paginator/paginator/paginator.d.ts +51 -0
  489. package/development/paginator/paginator/paginator.d.ts.map +1 -0
  490. package/development/paginator/paginator.d.ts +1 -90
  491. package/development/paginator/paginator.d.ts.map +1 -1
  492. package/development/paginator/paginator.js +449 -0
  493. package/development/paginator.d.ts +2 -0
  494. package/development/paginator.d.ts.map +1 -1
  495. package/development/paginator.js +4 -541
  496. package/development/popover/popover/popover.d.ts +6 -7
  497. package/development/popover/popover/popover.d.ts.map +1 -1
  498. package/development/popover/popover-trigger/popover-trigger.d.ts.map +1 -1
  499. package/development/popover/popover-trigger.js +28 -29
  500. package/development/popover/popover.js +358 -303
  501. package/development/radio-button/common/radio-button-common.d.ts +1 -1
  502. package/development/radio-button/common/radio-button-common.d.ts.map +1 -1
  503. package/development/radio-button/common.js +170 -127
  504. package/development/radio-button/radio-button/radio-button.d.ts +2 -6
  505. package/development/radio-button/radio-button/radio-button.d.ts.map +1 -1
  506. package/development/radio-button/radio-button-group/radio-button-group.d.ts +6 -6
  507. package/development/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  508. package/development/radio-button/radio-button-group.js +269 -199
  509. package/development/radio-button/radio-button-panel/radio-button-panel.d.ts +2 -6
  510. package/development/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
  511. package/development/radio-button/radio-button-panel.js +60 -48
  512. package/development/radio-button/radio-button.js +54 -40
  513. package/development/screen-reader-only/screen-reader-only.d.ts.map +1 -1
  514. package/development/screen-reader-only.js +22 -21
  515. package/development/select/select.d.ts +5 -4
  516. package/development/select/select.d.ts.map +1 -1
  517. package/development/select.js +555 -555
  518. package/development/selection-expansion-panel/selection-expansion-panel.d.ts +3 -3
  519. package/development/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
  520. package/development/selection-expansion-panel.js +223 -193
  521. package/development/signet/signet.d.ts +2 -2
  522. package/development/signet/signet.d.ts.map +1 -1
  523. package/development/signet.js +65 -33
  524. package/development/skiplink-list/skiplink-list.d.ts +2 -2
  525. package/development/skiplink-list/skiplink-list.d.ts.map +1 -1
  526. package/development/skiplink-list.js +74 -41
  527. package/development/slider/slider.d.ts +5 -4
  528. package/development/slider/slider.d.ts.map +1 -1
  529. package/development/slider.js +260 -184
  530. package/development/status/status.d.ts +3 -3
  531. package/development/status/status.d.ts.map +1 -1
  532. package/development/status.js +96 -51
  533. package/development/stepper/step/step.d.ts.map +1 -1
  534. package/development/stepper/step-label/step-label.d.ts.map +1 -1
  535. package/development/stepper/step-label.js +86 -90
  536. package/development/stepper/step.js +122 -126
  537. package/development/stepper/stepper/stepper.d.ts +3 -3
  538. package/development/stepper/stepper/stepper.d.ts.map +1 -1
  539. package/development/stepper/stepper.js +291 -241
  540. package/development/table/table-wrapper/table-wrapper.d.ts.map +1 -1
  541. package/development/table/table-wrapper.js +37 -39
  542. package/development/tabs/tab/tab.d.ts.map +1 -1
  543. package/development/tabs/tab-group/tab-group.d.ts +2 -2
  544. package/development/tabs/tab-group/tab-group.d.ts.map +1 -1
  545. package/development/tabs/tab-group.js +296 -279
  546. package/development/tabs/tab-label/tab-label.d.ts +3 -3
  547. package/development/tabs/tab-label/tab-label.d.ts.map +1 -1
  548. package/development/tabs/tab-label.js +83 -37
  549. package/development/tabs/tab.js +40 -39
  550. package/development/tag/tag/tag.d.ts +3 -5
  551. package/development/tag/tag/tag.d.ts.map +1 -1
  552. package/development/tag/tag-group/tag-group.d.ts +3 -3
  553. package/development/tag/tag-group/tag-group.d.ts.map +1 -1
  554. package/development/tag/tag-group.js +143 -88
  555. package/development/tag/tag.js +126 -89
  556. package/development/teaser/teaser.d.ts +4 -4
  557. package/development/teaser/teaser.d.ts.map +1 -1
  558. package/development/teaser-hero/teaser-hero.d.ts +3 -3
  559. package/development/teaser-hero/teaser-hero.d.ts.map +1 -1
  560. package/development/teaser-hero.js +83 -36
  561. package/development/teaser-product/common/teaser-product-common.d.ts +1 -1
  562. package/development/teaser-product/common/teaser-product-common.d.ts.map +1 -1
  563. package/development/teaser-product/common.js +51 -26
  564. package/development/teaser-product/teaser-product/teaser-product.d.ts.map +1 -1
  565. package/development/teaser-product/teaser-product-static/teaser-product-static.d.ts.map +1 -1
  566. package/development/teaser-product/teaser-product-static.js +18 -19
  567. package/development/teaser-product/teaser-product.js +18 -19
  568. package/development/teaser.js +94 -40
  569. package/development/time-input/time-input.d.ts +1 -1
  570. package/development/time-input/time-input.d.ts.map +1 -1
  571. package/development/time-input.js +225 -219
  572. package/development/timetable-occupancy/timetable-occupancy.d.ts +2 -2
  573. package/development/timetable-occupancy/timetable-occupancy.d.ts.map +1 -1
  574. package/development/timetable-occupancy-icon/timetable-occupancy-icon.d.ts +1 -1
  575. package/development/timetable-occupancy-icon/timetable-occupancy-icon.d.ts.map +1 -1
  576. package/development/timetable-occupancy-icon.js +78 -57
  577. package/development/timetable-occupancy.js +67 -35
  578. package/development/title/title-base.d.ts +3 -3
  579. package/development/title/title-base.d.ts.map +1 -1
  580. package/development/title/title.d.ts.map +1 -1
  581. package/development/title.js +106 -58
  582. package/development/toast/toast.d.ts +4 -4
  583. package/development/toast/toast.d.ts.map +1 -1
  584. package/development/toast.js +204 -146
  585. package/development/toggle/toggle/toggle.d.ts +3 -5
  586. package/development/toggle/toggle/toggle.d.ts.map +1 -1
  587. package/development/toggle/toggle-option/toggle-option.d.ts +2 -2
  588. package/development/toggle/toggle-option/toggle-option.d.ts.map +1 -1
  589. package/development/toggle/toggle-option.js +127 -93
  590. package/development/toggle/toggle.js +200 -163
  591. package/development/toggle-check/toggle-check.d.ts +4 -3
  592. package/development/toggle-check/toggle-check.d.ts.map +1 -1
  593. package/development/toggle-check.js +87 -49
  594. package/development/train/train/train.d.ts +5 -5
  595. package/development/train/train/train.d.ts.map +1 -1
  596. package/development/train/train-blocked-passage/train-blocked-passage.d.ts.map +1 -1
  597. package/development/train/train-blocked-passage.js +22 -21
  598. package/development/train/train-formation/train-formation.d.ts +2 -2
  599. package/development/train/train-formation/train-formation.d.ts.map +1 -1
  600. package/development/train/train-formation.js +113 -90
  601. package/development/train/train-wagon/train-wagon.d.ts +7 -9
  602. package/development/train/train-wagon/train-wagon.d.ts.map +1 -1
  603. package/development/train/train-wagon.js +166 -87
  604. package/development/train/train.js +142 -75
  605. package/development/visual-checkbox/visual-checkbox.d.ts +3 -3
  606. package/development/visual-checkbox/visual-checkbox.d.ts.map +1 -1
  607. package/development/visual-checkbox.js +79 -36
  608. package/dialog/dialog/dialog.d.ts +1 -1
  609. package/dialog/dialog/dialog.d.ts.map +1 -1
  610. package/dialog/dialog-actions/dialog-actions.d.ts.map +1 -1
  611. package/dialog/dialog-actions.js +18 -19
  612. package/dialog/dialog-content/dialog-content.d.ts.map +1 -1
  613. package/dialog/dialog-content.js +17 -18
  614. package/dialog/dialog-title/dialog-title.d.ts +3 -3
  615. package/dialog/dialog-title/dialog-title.d.ts.map +1 -1
  616. package/dialog/dialog-title.js +98 -66
  617. package/dialog/dialog.js +120 -114
  618. package/divider/divider.d.ts +1 -1
  619. package/divider/divider.d.ts.map +1 -1
  620. package/divider.js +41 -30
  621. package/expansion-panel/expansion-panel/expansion-panel.d.ts +4 -4
  622. package/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
  623. package/expansion-panel/expansion-panel-content/expansion-panel-content.d.ts.map +1 -1
  624. package/expansion-panel/expansion-panel-content.js +20 -22
  625. package/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts +1 -1
  626. package/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts.map +1 -1
  627. package/expansion-panel/expansion-panel-header.js +53 -61
  628. package/expansion-panel/expansion-panel.js +145 -130
  629. package/file-selector/file-selector.d.ts +8 -7
  630. package/file-selector/file-selector.d.ts.map +1 -1
  631. package/file-selector.js +224 -174
  632. package/flip-card/flip-card/flip-card.d.ts +2 -2
  633. package/flip-card/flip-card/flip-card.d.ts.map +1 -1
  634. package/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
  635. package/flip-card/flip-card-details.js +36 -38
  636. package/flip-card/flip-card-summary/flip-card-summary.d.ts +1 -1
  637. package/flip-card/flip-card-summary/flip-card-summary.d.ts.map +1 -1
  638. package/flip-card/flip-card-summary.js +42 -31
  639. package/flip-card/flip-card.js +88 -69
  640. package/footer/footer.d.ts +4 -4
  641. package/footer/footer.d.ts.map +1 -1
  642. package/footer.js +78 -37
  643. package/form-error/form-error.d.ts.map +1 -1
  644. package/form-error.js +24 -25
  645. package/form-field/form-field/form-field.d.ts +10 -10
  646. package/form-field/form-field/form-field.d.ts.map +1 -1
  647. package/form-field/form-field-clear/form-field-clear.d.ts.map +1 -1
  648. package/form-field/form-field-clear.js +39 -41
  649. package/form-field/form-field.js +295 -239
  650. package/header/common/header-action-common.d.ts +2 -2
  651. package/header/common/header-action-common.d.ts.map +1 -1
  652. package/header/common.js +36 -21
  653. package/header/header/header.d.ts +4 -4
  654. package/header/header/header.d.ts.map +1 -1
  655. package/header/header-button/header-button.d.ts.map +1 -1
  656. package/header/header-button.js +14 -16
  657. package/header/header-link/header-link.d.ts.map +1 -1
  658. package/header/header-link.js +14 -14
  659. package/header/header.js +138 -109
  660. package/icon/icon-base.d.ts +3 -4
  661. package/icon/icon-base.d.ts.map +1 -1
  662. package/icon/icon-name-mixin.d.ts +1 -1
  663. package/icon/icon-name-mixin.d.ts.map +1 -1
  664. package/icon/icon.d.ts +2 -2
  665. package/icon/icon.d.ts.map +1 -1
  666. package/icon.js +230 -165
  667. package/image/image.d.ts +17 -17
  668. package/image/image.d.ts.map +1 -1
  669. package/image.js +465 -195
  670. package/index.d.ts +3 -1
  671. package/index.js +3 -1
  672. package/journey-header/journey-header.d.ts +5 -5
  673. package/journey-header/journey-header.d.ts.map +1 -1
  674. package/journey-header.js +89 -49
  675. package/lead-container/lead-container.d.ts.map +1 -1
  676. package/lead-container.js +17 -18
  677. package/link/block-link/block-link.d.ts.map +1 -1
  678. package/link/block-link-button/block-link-button.d.ts.map +1 -1
  679. package/link/block-link-button.js +15 -17
  680. package/link/block-link-static/block-link-static.d.ts.map +1 -1
  681. package/link/block-link-static.js +14 -16
  682. package/link/block-link.js +15 -17
  683. package/link/common/block-link-common.d.ts +4 -3
  684. package/link/common/block-link-common.d.ts.map +1 -1
  685. package/link/common/link-common.d.ts +1 -1
  686. package/link/common/link-common.d.ts.map +1 -1
  687. package/link/common.js +64 -46
  688. package/link/link/link.d.ts.map +1 -1
  689. package/link/link-button/link-button.d.ts.map +1 -1
  690. package/link/link-button.js +15 -17
  691. package/link/link-static/link-static.d.ts.map +1 -1
  692. package/link/link-static.js +15 -17
  693. package/link/link.js +15 -17
  694. package/link-list/common/link-list-base.d.ts +3 -3
  695. package/link-list/common/link-list-base.d.ts.map +1 -1
  696. package/link-list/common.js +72 -44
  697. package/link-list/link-list/link-list.d.ts +2 -2
  698. package/link-list/link-list/link-list.d.ts.map +1 -1
  699. package/link-list/link-list-anchor/link-list-anchor.d.ts.map +1 -1
  700. package/link-list/link-list-anchor.js +15 -16
  701. package/link-list/link-list.js +43 -24
  702. package/loading-indicator/loading-indicator.d.ts +3 -3
  703. package/loading-indicator/loading-indicator.d.ts.map +1 -1
  704. package/loading-indicator.js +61 -36
  705. package/logo/logo.d.ts +2 -2
  706. package/logo/logo.d.ts.map +1 -1
  707. package/logo.js +47 -27
  708. package/map-container/map-container.d.ts +2 -2
  709. package/map-container/map-container.d.ts.map +1 -1
  710. package/map-container.js +84 -65
  711. package/menu/common/menu-action-common.d.ts +2 -2
  712. package/menu/common/menu-action-common.d.ts.map +1 -1
  713. package/menu/common.js +37 -22
  714. package/menu/menu/menu.d.ts +1 -1
  715. package/menu/menu/menu.d.ts.map +1 -1
  716. package/menu/menu-button/menu-button.d.ts.map +1 -1
  717. package/menu/menu-button.js +14 -16
  718. package/menu/menu-link/menu-link.d.ts.map +1 -1
  719. package/menu/menu-link.js +15 -17
  720. package/menu/menu.js +175 -170
  721. package/message/message.d.ts +2 -2
  722. package/message/message.d.ts.map +1 -1
  723. package/message.js +47 -27
  724. package/navigation/common/navigation-action-common.d.ts +1 -1
  725. package/navigation/common/navigation-action-common.d.ts.map +1 -1
  726. package/navigation/common.js +38 -33
  727. package/navigation/navigation/navigation.d.ts +2 -2
  728. package/navigation/navigation/navigation.d.ts.map +1 -1
  729. package/navigation/navigation-button/navigation-button.d.ts.map +1 -1
  730. package/navigation/navigation-button.js +14 -16
  731. package/navigation/navigation-link/navigation-link.d.ts.map +1 -1
  732. package/navigation/navigation-link.js +14 -16
  733. package/navigation/navigation-list/navigation-list.d.ts +1 -1
  734. package/navigation/navigation-list/navigation-list.d.ts.map +1 -1
  735. package/navigation/navigation-list.js +48 -35
  736. package/navigation/navigation-marker/navigation-marker.d.ts +1 -1
  737. package/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
  738. package/navigation/navigation-marker.js +77 -69
  739. package/navigation/navigation-section/navigation-section.d.ts +3 -3
  740. package/navigation/navigation-section/navigation-section.d.ts.map +1 -1
  741. package/navigation/navigation-section.js +192 -171
  742. package/navigation/navigation.js +185 -181
  743. package/notification/notification.d.ts +6 -6
  744. package/notification/notification.d.ts.map +1 -1
  745. package/notification.js +147 -116
  746. package/option/optgroup/optgroup-base-element.d.ts +3 -3
  747. package/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  748. package/option/optgroup/optgroup.d.ts.map +1 -1
  749. package/option/optgroup.js +131 -112
  750. package/option/option/option-base-element.d.ts +7 -7
  751. package/option/option/option-base-element.d.ts.map +1 -1
  752. package/option/option/option.d.ts.map +1 -1
  753. package/option/option.js +295 -252
  754. package/overlay/overlay-base-element.d.ts +1 -1
  755. package/overlay/overlay-base-element.d.ts.map +1 -1
  756. package/overlay/overlay.d.ts +4 -4
  757. package/overlay/overlay.d.ts.map +1 -1
  758. package/overlay.js +194 -165
  759. package/package.json +18 -2
  760. package/paginator/common/paginator-common.d.ts +26 -0
  761. package/paginator/common/paginator-common.d.ts.map +1 -0
  762. package/paginator/common.d.ts +2 -0
  763. package/paginator/common.d.ts.map +1 -0
  764. package/paginator/common.js +145 -0
  765. package/paginator/compact-paginator/compact-paginator.d.ts +20 -0
  766. package/paginator/compact-paginator/compact-paginator.d.ts.map +1 -0
  767. package/paginator/compact-paginator.d.ts +2 -0
  768. package/paginator/compact-paginator.d.ts.map +1 -0
  769. package/paginator/compact-paginator.js +40 -0
  770. package/paginator/paginator/paginator.d.ts +51 -0
  771. package/paginator/paginator/paginator.d.ts.map +1 -0
  772. package/paginator/paginator.d.ts +1 -90
  773. package/paginator/paginator.d.ts.map +1 -1
  774. package/paginator/paginator.js +171 -0
  775. package/paginator.d.ts +2 -0
  776. package/paginator.d.ts.map +1 -1
  777. package/paginator.js +3 -265
  778. package/popover/popover/popover.d.ts +6 -7
  779. package/popover/popover/popover.d.ts.map +1 -1
  780. package/popover/popover-trigger/popover-trigger.d.ts.map +1 -1
  781. package/popover/popover-trigger.js +26 -29
  782. package/popover/popover.js +230 -208
  783. package/radio-button/common/radio-button-common.d.ts +1 -1
  784. package/radio-button/common/radio-button-common.d.ts.map +1 -1
  785. package/radio-button/common.js +67 -43
  786. package/radio-button/radio-button/radio-button.d.ts +2 -6
  787. package/radio-button/radio-button/radio-button.d.ts.map +1 -1
  788. package/radio-button/radio-button-group/radio-button-group.d.ts +6 -6
  789. package/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  790. package/radio-button/radio-button-group.js +192 -156
  791. package/radio-button/radio-button-panel/radio-button-panel.d.ts +2 -6
  792. package/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
  793. package/radio-button/radio-button-panel.js +49 -45
  794. package/radio-button/radio-button.js +43 -37
  795. package/screen-reader-only/screen-reader-only.d.ts.map +1 -1
  796. package/screen-reader-only.js +17 -18
  797. package/select/select.d.ts +5 -4
  798. package/select/select.d.ts.map +1 -1
  799. package/select.js +377 -401
  800. package/selection-expansion-panel/selection-expansion-panel.d.ts +3 -3
  801. package/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
  802. package/selection-expansion-panel.js +157 -148
  803. package/signet/signet.d.ts +2 -2
  804. package/signet/signet.d.ts.map +1 -1
  805. package/signet.js +48 -28
  806. package/skiplink-list/skiplink-list.d.ts +2 -2
  807. package/skiplink-list/skiplink-list.d.ts.map +1 -1
  808. package/skiplink-list.js +54 -36
  809. package/slider/slider.d.ts +5 -4
  810. package/slider/slider.d.ts.map +1 -1
  811. package/slider.js +197 -158
  812. package/status/status.d.ts +3 -3
  813. package/status/status.d.ts.map +1 -1
  814. package/status.js +71 -46
  815. package/stepper/step/step.d.ts.map +1 -1
  816. package/stepper/step-label/step-label.d.ts.map +1 -1
  817. package/stepper/step-label.js +69 -75
  818. package/stepper/step.js +99 -104
  819. package/stepper/stepper/stepper.d.ts +3 -3
  820. package/stepper/stepper/stepper.d.ts.map +1 -1
  821. package/stepper/stepper.js +208 -188
  822. package/table/table-wrapper/table-wrapper.d.ts.map +1 -1
  823. package/table/table-wrapper.js +32 -36
  824. package/tabs/tab/tab.d.ts.map +1 -1
  825. package/tabs/tab-group/tab-group.d.ts +2 -2
  826. package/tabs/tab-group/tab-group.d.ts.map +1 -1
  827. package/tabs/tab-group.js +200 -193
  828. package/tabs/tab-label/tab-label.d.ts +3 -3
  829. package/tabs/tab-label/tab-label.d.ts.map +1 -1
  830. package/tabs/tab-label.js +65 -37
  831. package/tabs/tab.js +34 -35
  832. package/tag/tag/tag.d.ts +3 -5
  833. package/tag/tag/tag.d.ts.map +1 -1
  834. package/tag/tag-group/tag-group.d.ts +3 -3
  835. package/tag/tag-group/tag-group.d.ts.map +1 -1
  836. package/tag/tag-group.js +107 -75
  837. package/tag/tag.js +92 -73
  838. package/teaser/teaser.d.ts +4 -4
  839. package/teaser/teaser.d.ts.map +1 -1
  840. package/teaser-hero/teaser-hero.d.ts +3 -3
  841. package/teaser-hero/teaser-hero.d.ts.map +1 -1
  842. package/teaser-hero.js +66 -38
  843. package/teaser-product/common/teaser-product-common.d.ts +1 -1
  844. package/teaser-product/common/teaser-product-common.d.ts.map +1 -1
  845. package/teaser-product/common.js +36 -21
  846. package/teaser-product/teaser-product/teaser-product.d.ts.map +1 -1
  847. package/teaser-product/teaser-product-static/teaser-product-static.d.ts.map +1 -1
  848. package/teaser-product/teaser-product-static.js +14 -17
  849. package/teaser-product/teaser-product.js +14 -17
  850. package/teaser.js +69 -37
  851. package/time-input/time-input.d.ts +1 -1
  852. package/time-input/time-input.d.ts.map +1 -1
  853. package/time-input.js +160 -166
  854. package/timetable-occupancy/timetable-occupancy.d.ts +2 -2
  855. package/timetable-occupancy/timetable-occupancy.d.ts.map +1 -1
  856. package/timetable-occupancy-icon/timetable-occupancy-icon.d.ts +1 -1
  857. package/timetable-occupancy-icon/timetable-occupancy-icon.d.ts.map +1 -1
  858. package/timetable-occupancy-icon.js +60 -48
  859. package/timetable-occupancy.js +55 -38
  860. package/title/title-base.d.ts +3 -3
  861. package/title/title-base.d.ts.map +1 -1
  862. package/title/title.d.ts.map +1 -1
  863. package/title.js +81 -53
  864. package/toast/toast.d.ts +4 -4
  865. package/toast/toast.d.ts.map +1 -1
  866. package/toast.js +156 -123
  867. package/toggle/toggle/toggle.d.ts +3 -5
  868. package/toggle/toggle/toggle.d.ts.map +1 -1
  869. package/toggle/toggle-option/toggle-option.d.ts +2 -2
  870. package/toggle/toggle-option/toggle-option.d.ts.map +1 -1
  871. package/toggle/toggle-option.js +89 -72
  872. package/toggle/toggle.js +139 -122
  873. package/toggle-check/toggle-check.d.ts +4 -3
  874. package/toggle-check/toggle-check.d.ts.map +1 -1
  875. package/toggle-check.js +63 -41
  876. package/train/train/train.d.ts +5 -5
  877. package/train/train/train.d.ts.map +1 -1
  878. package/train/train-blocked-passage/train-blocked-passage.d.ts.map +1 -1
  879. package/train/train-blocked-passage.js +17 -18
  880. package/train/train-formation/train-formation.d.ts +2 -2
  881. package/train/train-formation/train-formation.d.ts.map +1 -1
  882. package/train/train-formation.js +96 -87
  883. package/train/train-wagon/train-wagon.d.ts +7 -9
  884. package/train/train-wagon/train-wagon.d.ts.map +1 -1
  885. package/train/train-wagon.js +150 -110
  886. package/train/train.js +108 -71
  887. package/visual-checkbox/visual-checkbox.d.ts +3 -3
  888. package/visual-checkbox/visual-checkbox.d.ts.map +1 -1
  889. package/visual-checkbox.js +59 -32
@@ -1,12 +1,20 @@
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";
1
9
  import { MutationController } from "@lit-labs/observers/mutation-controller.js";
2
10
  import { css, html, nothing } from "lit";
3
- import { property, state, customElement } from "lit/decorators.js";
11
+ import { customElement, property, state } from "lit/decorators.js";
4
12
  import { ref } from "lit/directives/ref.js";
5
13
  import { until } from "lit/directives/until.js";
6
14
  import { getNextElementIndex } from "./core/a11y.js";
7
15
  import { SbbOpenCloseBaseElement } from "./core/base-elements.js";
8
16
  import { SbbConnectedAbortController } from "./core/controllers.js";
9
- import { hostAttributes } from "./core/decorators.js";
17
+ import { hostAttributes, forceType } from "./core/decorators.js";
10
18
  import { isNextjs, isSafari } from "./core/dom.js";
11
19
  import { EventEmitter } from "./core/eventing.js";
12
20
  import { SbbUpdateSchedulerMixin, SbbDisabledMixin, SbbNegativeMixin, SbbHydrationMixin, SbbRequiredMixin, SbbFormAssociatedMixin } from "./core/mixins.js";
@@ -293,564 +301,557 @@ const style = css`*,
293
301
  opacity: 0;
294
302
  }
295
303
  }`;
296
- var __defProp = Object.defineProperty;
297
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
298
- var __decorateClass = (decorators, target, key, kind) => {
299
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
300
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
301
- if (decorator = decorators[i])
302
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
303
- if (kind && result) __defProp(target, key, result);
304
- return result;
305
- };
306
304
  const ariaRoleOnHost = isSafari;
307
305
  let nextId = 0;
308
- let SbbSelectElement = class extends SbbUpdateSchedulerMixin(
309
- SbbDisabledMixin(
310
- SbbNegativeMixin(
311
- SbbHydrationMixin(
312
- SbbRequiredMixin(
313
- SbbFormAssociatedMixin(
314
- SbbOpenCloseBaseElement
315
- )
316
- )
317
- )
318
- )
319
- )
320
- ) {
321
- constructor() {
322
- super();
323
- this.multiple = false;
324
- this.readonly = false;
325
- this._displayValue = null;
326
- this._didChange = new EventEmitter(this, SbbSelectElement.events.didChange);
327
- this._change = new EventEmitter(this, SbbSelectElement.events.change);
328
- this._input = new EventEmitter(this, SbbSelectElement.events.input);
329
- this._stateChange = new EventEmitter(
330
- this,
331
- SbbSelectElement.events.stateChange,
332
- {
306
+ let SbbSelectElement = (() => {
307
+ var _placeholder_accessor_storage, _multiple_accessor_storage, _readonly_accessor_storage, __displayValue_accessor_storage, _a;
308
+ let _classDecorators = [customElement("sbb-select"), hostAttributes({
309
+ role: ariaRoleOnHost ? "listbox" : null
310
+ })];
311
+ let _classDescriptor;
312
+ let _classExtraInitializers = [];
313
+ let _classThis;
314
+ let _classSuper = SbbUpdateSchedulerMixin(SbbDisabledMixin(SbbNegativeMixin(SbbHydrationMixin(SbbRequiredMixin(SbbFormAssociatedMixin(SbbOpenCloseBaseElement))))));
315
+ let _placeholder_decorators;
316
+ let _placeholder_initializers = [];
317
+ let _placeholder_extraInitializers = [];
318
+ let _multiple_decorators;
319
+ let _multiple_initializers = [];
320
+ let _multiple_extraInitializers = [];
321
+ let _readonly_decorators;
322
+ let _readonly_initializers = [];
323
+ let _readonly_extraInitializers = [];
324
+ let __displayValue_decorators;
325
+ let __displayValue_initializers = [];
326
+ let __displayValue_extraInitializers = [];
327
+ var SbbSelectElement2 = (_a = class extends _classSuper {
328
+ constructor() {
329
+ super();
330
+ __privateAdd(this, _placeholder_accessor_storage);
331
+ __privateAdd(this, _multiple_accessor_storage);
332
+ __privateAdd(this, _readonly_accessor_storage);
333
+ __privateAdd(this, __displayValue_accessor_storage);
334
+ __privateSet(this, _placeholder_accessor_storage, __runInitializers(this, _placeholder_initializers, ""));
335
+ __privateSet(this, _multiple_accessor_storage, (__runInitializers(this, _placeholder_extraInitializers), __runInitializers(this, _multiple_initializers, false)));
336
+ __privateSet(this, _readonly_accessor_storage, (__runInitializers(this, _multiple_extraInitializers), __runInitializers(this, _readonly_initializers, false)));
337
+ __privateSet(this, __displayValue_accessor_storage, (__runInitializers(this, _readonly_extraInitializers), __runInitializers(this, __displayValue_initializers, null)));
338
+ this._didChange = (__runInitializers(this, __displayValue_extraInitializers), new EventEmitter(this, SbbSelectElement2.events.didChange));
339
+ this._change = new EventEmitter(this, SbbSelectElement2.events.change);
340
+ this._input = new EventEmitter(this, SbbSelectElement2.events.input);
341
+ this._stateChange = new EventEmitter(this, SbbSelectElement2.events.stateChange, {
333
342
  composed: false
343
+ });
344
+ this._overlayId = `sbb-select-${++nextId}`;
345
+ this._activeItemIndex = -1;
346
+ this._searchString = "";
347
+ this._didLoad = false;
348
+ this._isPointerDownEventOnMenu = false;
349
+ this._abort = new SbbConnectedAbortController(this);
350
+ this._pointerDownListener = (event) => {
351
+ this._isPointerDownEventOnMenu = isEventOnElement(this._overlay, event);
352
+ };
353
+ this._closeOnBackdropClick = (event) => {
354
+ if (!this._isPointerDownEventOnMenu && !isEventOnElement(this._overlay, event)) {
355
+ this.close();
356
+ }
357
+ };
358
+ new MutationController(this, {
359
+ config: { attributeFilter: ["aria-labelledby"] },
360
+ callback: (mutationsList) => this._onSelectAttributesChange(mutationsList)
361
+ });
362
+ }
363
+ /** The placeholder used if no value has been selected. */
364
+ get placeholder() {
365
+ return __privateGet(this, _placeholder_accessor_storage);
366
+ }
367
+ set placeholder(value) {
368
+ __privateSet(this, _placeholder_accessor_storage, value);
369
+ }
370
+ /** Whether the select allows for multiple selection. */
371
+ get multiple() {
372
+ return __privateGet(this, _multiple_accessor_storage);
373
+ }
374
+ set multiple(value) {
375
+ __privateSet(this, _multiple_accessor_storage, value);
376
+ }
377
+ /** Whether the select is readonly. */
378
+ get readonly() {
379
+ return __privateGet(this, _readonly_accessor_storage);
380
+ }
381
+ set readonly(value) {
382
+ __privateSet(this, _readonly_accessor_storage, value);
383
+ }
384
+ /** The value displayed by the component. */
385
+ get _displayValue() {
386
+ return __privateGet(this, __displayValue_accessor_storage);
387
+ }
388
+ set _displayValue(value) {
389
+ __privateSet(this, __displayValue_accessor_storage, value);
390
+ }
391
+ /**
392
+ * The 'combobox' input element
393
+ * @internal
394
+ */
395
+ get inputElement() {
396
+ return this._triggerElement;
397
+ }
398
+ /** Gets all the SbbOptionElement projected in the select. */
399
+ get _options() {
400
+ var _a2;
401
+ return Array.from(((_a2 = this.querySelectorAll) == null ? void 0 : _a2.call(this, "sbb-option")) ?? []);
402
+ }
403
+ get _filteredOptions() {
404
+ return this._options.filter((opt) => !opt.disabled && !opt.hasAttribute("data-group-disabled"));
405
+ }
406
+ /**
407
+ * TODO: Accessibility fix required to correctly read the label;
408
+ * can be possibly removed after the merge of https://github.com/sbb-design-systems/lyne-components/issues/3062
409
+ */
410
+ _onSelectAttributesChange(mutationsList) {
411
+ var _a2;
412
+ for (const mutation of mutationsList) {
413
+ if (mutation.attributeName === "aria-labelledby") {
414
+ (_a2 = this._triggerElement) == null ? void 0 : _a2.setAttribute("aria-labelledby", this.getAttribute("aria-labelledby"));
415
+ }
334
416
  }
335
- );
336
- this._overlayId = `sbb-select-${++nextId}`;
337
- this._activeItemIndex = -1;
338
- this._searchString = "";
339
- this._didLoad = false;
340
- this._isPointerDownEventOnMenu = false;
341
- this._abort = new SbbConnectedAbortController(this);
342
- this._pointerDownListener = (event) => {
343
- this._isPointerDownEventOnMenu = isEventOnElement(this._overlay, event);
344
- };
345
- this._closeOnBackdropClick = (event) => {
346
- if (!this._isPointerDownEventOnMenu && !isEventOnElement(this._overlay, event)) {
347
- this.close();
417
+ }
418
+ /** Opens the selection panel. */
419
+ open() {
420
+ if (this.state !== "closed" || !this._overlay || this._options.length === 0 || this.disabled || this.formDisabled) {
421
+ return;
348
422
  }
349
- };
350
- new MutationController(this, {
351
- config: { attributeFilter: ["aria-labelledby"] },
352
- callback: (mutationsList) => this._onSelectAttributesChange(mutationsList)
353
- });
354
- }
355
- /**
356
- * The 'combobox' input element
357
- * @internal
358
- */
359
- get inputElement() {
360
- return this._triggerElement;
361
- }
362
- /** Gets all the SbbOptionElement projected in the select. */
363
- get _options() {
364
- var _a;
365
- return Array.from(((_a = this.querySelectorAll) == null ? void 0 : _a.call(this, "sbb-option")) ?? []);
366
- }
367
- get _filteredOptions() {
368
- return this._options.filter(
369
- (opt) => !opt.disabled && !opt.hasAttribute("data-group-disabled")
370
- );
371
- }
372
- /**
373
- * TODO: Accessibility fix required to correctly read the label;
374
- * can be possibly removed after the merge of https://github.com/sbb-design-systems/lyne-components/issues/3062
375
- */
376
- _onSelectAttributesChange(mutationsList) {
377
- var _a;
378
- for (const mutation of mutationsList) {
379
- if (mutation.attributeName === "aria-labelledby") {
380
- (_a = this._triggerElement) == null ? void 0 : _a.setAttribute(
381
- "aria-labelledby",
382
- this.getAttribute("aria-labelledby")
383
- );
423
+ if (!this.willOpen.emit()) {
424
+ return;
384
425
  }
426
+ this.state = "opening";
427
+ this._setOverlayPosition();
385
428
  }
386
- }
387
- /** Opens the selection panel. */
388
- open() {
389
- if (this.state !== "closed" || !this._overlay || this._options.length === 0 || this.disabled || this.formDisabled) {
390
- return;
391
- }
392
- if (!this.willOpen.emit()) {
393
- return;
394
- }
395
- this.state = "opening";
396
- this._setOverlayPosition();
397
- }
398
- /** Closes the selection panel. */
399
- close() {
400
- if (this.state !== "opened") {
401
- return;
402
- }
403
- if (!this.willClose.emit()) {
404
- return;
405
- }
406
- this.state = "closing";
407
- this._openPanelEventsController.abort();
408
- }
409
- /** Gets the current displayed value. */
410
- getDisplayValue() {
411
- return this._displayValue ?? "";
412
- }
413
- /** Listens to option changes. */
414
- _onOptionChanged(event) {
415
- const target = event.target;
416
- if (target.selected) {
417
- this._onOptionSelected(target);
418
- } else {
419
- this._onOptionDeselected(target);
420
- }
421
- }
422
- _onOptionClick(event) {
423
- const target = event.target;
424
- if (target.localName !== "sbb-option" || target.disabled) {
425
- return;
429
+ /** Closes the selection panel. */
430
+ close() {
431
+ if (this.state !== "opened") {
432
+ return;
433
+ }
434
+ if (!this.willClose.emit()) {
435
+ return;
436
+ }
437
+ this.state = "closing";
438
+ this._openPanelEventsController.abort();
439
+ }
440
+ /** Gets the current displayed value. */
441
+ getDisplayValue() {
442
+ return this._displayValue ?? "";
443
+ }
444
+ /** Listens to option changes. */
445
+ _onOptionChanged(event) {
446
+ const target = event.target;
447
+ if (target.selected) {
448
+ this._onOptionSelected(target);
449
+ } else {
450
+ this._onOptionDeselected(target);
451
+ }
426
452
  }
427
- if (!this.multiple) {
428
- this.close();
453
+ _onOptionClick(event) {
454
+ const target = event.target;
455
+ if (target.localName !== "sbb-option" || target.disabled) {
456
+ return;
457
+ }
458
+ if (!this.multiple) {
459
+ this.close();
460
+ }
429
461
  }
430
- }
431
- /** Sets the _displayValue by checking the internal sbb-options and setting the correct `selected` value on them. */
432
- _onValueChanged(newValue) {
433
- const options = this._filteredOptions;
434
- if (!Array.isArray(newValue)) {
435
- const optionElement = options.find((o) => (o.value ?? o.getAttribute("value")) === newValue);
436
- if (optionElement) {
437
- optionElement.selected = true;
438
- }
439
- options.filter((o) => (o.value ?? o.getAttribute("value")) !== newValue).forEach((o) => o.selected = false);
440
- this._displayValue = (optionElement == null ? void 0 : optionElement.textContent) || null;
441
- } else {
442
- options.filter((o) => !newValue.includes(o.value ?? o.getAttribute("value"))).forEach((e) => e.selected = false);
443
- const selectedOptionElements = options.filter(
444
- (o) => newValue.includes(o.value ?? o.getAttribute("value"))
445
- );
446
- selectedOptionElements.forEach((o) => o.selected = true);
447
- this._displayValue = selectedOptionElements.map((o) => o.textContent).join(", ") || null;
448
- }
449
- this._stateChange.emit({ type: "value", value: newValue });
450
- }
451
- firstUpdated(changedProperties) {
452
- super.firstUpdated(changedProperties);
453
- this.focus = () => this._triggerElement.focus();
454
- this.blur = () => this._triggerElement.blur();
455
- if (!isNextjs()) {
456
- this.startUpdate();
457
- this._setupSelect();
462
+ /** Sets the _displayValue by checking the internal sbb-options and setting the correct `selected` value on them. */
463
+ _onValueChanged(newValue) {
464
+ const options = this._filteredOptions;
465
+ if (!Array.isArray(newValue)) {
466
+ const optionElement = options.find((o) => (o.value ?? o.getAttribute("value")) === newValue);
467
+ if (optionElement) {
468
+ optionElement.selected = true;
469
+ }
470
+ options.filter((o) => (o.value ?? o.getAttribute("value")) !== newValue).forEach((o) => o.selected = false);
471
+ this._displayValue = (optionElement == null ? void 0 : optionElement.textContent) || null;
472
+ } else {
473
+ options.filter((o) => !newValue.includes(o.value ?? o.getAttribute("value"))).forEach((e) => e.selected = false);
474
+ const selectedOptionElements = options.filter((o) => newValue.includes(o.value ?? o.getAttribute("value")));
475
+ selectedOptionElements.forEach((o) => o.selected = true);
476
+ this._displayValue = selectedOptionElements.map((o) => o.textContent).join(", ") || null;
477
+ }
478
+ this._stateChange.emit({ type: "value", value: newValue });
479
+ }
480
+ firstUpdated(changedProperties) {
481
+ super.firstUpdated(changedProperties);
482
+ this.focus = () => this._triggerElement.focus();
483
+ this.blur = () => this._triggerElement.blur();
484
+ if (!isNextjs()) {
485
+ this.startUpdate();
486
+ this._setupSelect();
487
+ }
458
488
  }
459
- }
460
- /**
461
- * Removes element's first attribute whose qualified name is qualifiedName.
462
- *
463
- * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/removeAttribute)
464
- * @internal We need to override this due to a hydration issue with Next.js.
465
- */
466
- removeAttribute(qualifiedName) {
467
- if (isNextjs() && qualifiedName === "defer-hydration" && !this._didLoad) {
468
- this.updateComplete.then(() => this._setupSelect());
469
- }
470
- super.removeAttribute(qualifiedName);
471
- }
472
- connectedCallback() {
473
- var _a, _b;
474
- super.connectedCallback();
475
- if (ariaRoleOnHost) {
476
- this.id || (this.id = this._overlayId);
477
- }
478
- const signal = this._abort.signal;
479
- const formField = ((_a = this.closest) == null ? void 0 : _a.call(this, "sbb-form-field")) ?? ((_b = this.closest) == null ? void 0 : _b.call(this, "[data-form-field]"));
480
- if (formField) {
481
- this.negative = formField.hasAttribute("negative");
482
- }
483
- this._syncProperties();
484
- if (this._didLoad) {
485
- this._setupOrigin();
486
- this._setupTrigger();
489
+ /**
490
+ * Removes element's first attribute whose qualified name is qualifiedName.
491
+ *
492
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/removeAttribute)
493
+ * @internal We need to override this due to a hydration issue with Next.js.
494
+ */
495
+ removeAttribute(qualifiedName) {
496
+ if (isNextjs() && qualifiedName === "defer-hydration" && !this._didLoad) {
497
+ this.updateComplete.then(() => this._setupSelect());
498
+ }
499
+ super.removeAttribute(qualifiedName);
487
500
  }
488
- if (this.value) {
489
- this._onValueChanged(this.value);
490
- }
491
- this.addEventListener(
492
- "optionSelectionChange",
493
- (e) => this._onOptionChanged(e),
494
- { signal }
495
- );
496
- this.addEventListener(
497
- "click",
498
- (e) => {
501
+ connectedCallback() {
502
+ var _a2, _b;
503
+ super.connectedCallback();
504
+ if (ariaRoleOnHost) {
505
+ this.id || (this.id = this._overlayId);
506
+ }
507
+ const signal = this._abort.signal;
508
+ const formField = ((_a2 = this.closest) == null ? void 0 : _a2.call(this, "sbb-form-field")) ?? ((_b = this.closest) == null ? void 0 : _b.call(this, "[data-form-field]"));
509
+ if (formField) {
510
+ this.negative = formField.hasAttribute("negative");
511
+ }
512
+ this._syncProperties();
513
+ if (this._didLoad) {
514
+ this._setupOrigin();
515
+ this._setupTrigger();
516
+ }
517
+ if (this.value) {
518
+ this._onValueChanged(this.value);
519
+ }
520
+ this.addEventListener("optionSelectionChange", (e) => this._onOptionChanged(e), { signal });
521
+ this.addEventListener("click", (e) => {
499
522
  this._onOptionClick(e);
500
523
  this._toggleOpening();
501
- },
502
- { signal }
503
- );
504
- }
505
- willUpdate(changedProperties) {
506
- super.willUpdate(changedProperties);
507
- if (changedProperties.has("value") && this._didLoad) {
508
- this._onValueChanged(this.value);
524
+ }, { signal });
509
525
  }
510
- if (changedProperties.has("negative") || changedProperties.has("multiple")) {
511
- this._syncProperties();
526
+ willUpdate(changedProperties) {
527
+ super.willUpdate(changedProperties);
528
+ if (changedProperties.has("value") && this._didLoad) {
529
+ this._onValueChanged(this.value);
530
+ }
531
+ if (changedProperties.has("negative") || changedProperties.has("multiple")) {
532
+ this._syncProperties();
533
+ }
512
534
  }
513
- }
514
- disconnectedCallback() {
515
- var _a;
516
- super.disconnectedCallback();
517
- this.prepend(this._triggerElement);
518
- (_a = this._openPanelEventsController) == null ? void 0 : _a.abort();
519
- }
520
- updateFormValue() {
521
- if (this.multiple && this.value instanceof Array) {
522
- const data = new FormData();
523
- this.value.forEach((el) => data.append(this.name, el));
524
- this.internals.setFormValue(data);
525
- } else {
526
- this.internals.setFormValue(this.value);
535
+ disconnectedCallback() {
536
+ var _a2;
537
+ super.disconnectedCallback();
538
+ this.prepend(this._triggerElement);
539
+ (_a2 = this._openPanelEventsController) == null ? void 0 : _a2.abort();
540
+ }
541
+ updateFormValue() {
542
+ if (this.multiple && this.value instanceof Array) {
543
+ const data = new FormData();
544
+ this.value.forEach((el) => data.append(this.name, el));
545
+ this.internals.setFormValue(data);
546
+ } else {
547
+ this.internals.setFormValue(this.value);
548
+ }
527
549
  }
528
- }
529
- /**
530
- * The reset value is the attribute value (the setup value), null otherwise.
531
- * @internal
532
- */
533
- formResetCallback() {
534
- this.value = this.hasAttribute("value") ? this.getAttribute("value") : null;
535
- }
536
- /**
537
- * @internal
538
- */
539
- formStateRestoreCallback(state2, _reason) {
540
- if (!state2) {
541
- this.value = null;
542
- return;
543
- }
544
- if (this.multiple) {
545
- this.value = state2.map((entries) => entries[1]);
546
- } else {
547
- this.value = state2;
550
+ /**
551
+ * The reset value is the attribute value (the setup value), null otherwise.
552
+ * @internal
553
+ */
554
+ formResetCallback() {
555
+ this.value = this.hasAttribute("value") ? this.getAttribute("value") : null;
556
+ }
557
+ /**
558
+ * @internal
559
+ */
560
+ formStateRestoreCallback(state2, _reason) {
561
+ if (!state2) {
562
+ this.value = null;
563
+ return;
564
+ }
565
+ if (this.multiple) {
566
+ this.value = state2.map((entries) => entries[1]);
567
+ } else {
568
+ this.value = state2;
569
+ }
548
570
  }
549
- }
550
- _syncProperties() {
551
- var _a, _b;
552
- (_a = this.querySelectorAll) == null ? void 0 : _a.call(this, "sbb-divider").forEach((element) => element.negative = this.negative);
553
- (_b = this.querySelectorAll) == null ? void 0 : _b.call(
554
- this,
555
- "sbb-option, sbb-optgroup"
556
- ).forEach((element) => {
557
- element.toggleAttribute("data-negative", this.negative);
558
- element.toggleAttribute("data-multiple", this.multiple);
559
- });
560
- }
561
- _setupSelect() {
562
- this._setupOrigin();
563
- this._setupTrigger();
564
- this._didLoad = true;
565
- this.completeUpdate();
566
- }
567
- /** Sets the originElement; if the component is used in a sbb-form-field uses it, otherwise uses the parentElement. */
568
- _setupOrigin() {
569
- var _a, _b, _c, _d;
570
- const formField = (_a = this.closest) == null ? void 0 : _a.call(this, "sbb-form-field");
571
- this._originElement = ((_c = (_b = formField == null ? void 0 : formField.shadowRoot) == null ? void 0 : _b.querySelector) == null ? void 0 : _c.call(_b, "#overlay-anchor")) ?? this.parentElement;
572
- if (this._originElement) {
573
- this.toggleAttribute(
574
- "data-option-panel-origin-borderless",
575
- !!((_d = formField == null ? void 0 : formField.hasAttribute) == null ? void 0 : _d.call(formField, "borderless"))
576
- );
571
+ _syncProperties() {
572
+ var _a2, _b;
573
+ (_a2 = this.querySelectorAll) == null ? void 0 : _a2.call(this, "sbb-divider").forEach((element) => element.negative = this.negative);
574
+ (_b = this.querySelectorAll) == null ? void 0 : _b.call(this, "sbb-option, sbb-optgroup").forEach((element) => {
575
+ element.toggleAttribute("data-negative", this.negative);
576
+ element.toggleAttribute("data-multiple", this.multiple);
577
+ });
577
578
  }
578
- }
579
- /**
580
- * To assess screen-readers problems caused by the interaction between aria patterns and shadow DOM,
581
- * we are forced to move the 'combobox' trigger element to the light DOM
582
- */
583
- _setupTrigger() {
584
- var _a, _b, _c;
585
- (_b = (_a = this.parentElement).insertBefore) == null ? void 0 : _b.call(_a, this._triggerElement, this);
586
- const containerElement = ((_c = this.closest) == null ? void 0 : _c.call(this, "sbb-form-field")) ?? this;
587
- this._triggerElement.style.top = "0px";
588
- this._triggerElement.style.height = `${containerElement.offsetHeight}px`;
589
- this._triggerElement.style.width = `${containerElement.offsetWidth}px`;
590
- }
591
- _setOverlayPosition() {
592
- setOverlayPosition(
593
- this._overlay,
594
- this._originElement,
595
- this._optionContainer,
596
- this.shadowRoot.querySelector(".sbb-select__container"),
597
- this
598
- );
599
- }
600
- // In rare cases it can be that the animationEnd event is triggered twice.
601
- // To avoid entering a corrupt state, exit when state is not expected.
602
- _onAnimationEnd(event) {
603
- if (event.animationName === "open" && this.state === "opening") {
604
- this._onOpenAnimationEnd();
605
- } else if (event.animationName === "close" && this.state === "closing") {
606
- this._onCloseAnimationEnd();
579
+ _setupSelect() {
580
+ this._setupOrigin();
581
+ this._setupTrigger();
582
+ this._didLoad = true;
583
+ this.completeUpdate();
584
+ }
585
+ /** Sets the originElement; if the component is used in a sbb-form-field uses it, otherwise uses the parentElement. */
586
+ _setupOrigin() {
587
+ var _a2, _b, _c, _d;
588
+ const formField = (_a2 = this.closest) == null ? void 0 : _a2.call(this, "sbb-form-field");
589
+ this._originElement = ((_c = (_b = formField == null ? void 0 : formField.shadowRoot) == null ? void 0 : _b.querySelector) == null ? void 0 : _c.call(_b, "#overlay-anchor")) ?? this.parentElement;
590
+ if (this._originElement) {
591
+ this.toggleAttribute("data-option-panel-origin-borderless", !!((_d = formField == null ? void 0 : formField.hasAttribute) == null ? void 0 : _d.call(formField, "borderless")));
592
+ }
607
593
  }
608
- }
609
- _onOpenAnimationEnd() {
610
- this.state = "opened";
611
- this._attachOpenPanelEvents();
612
- this._triggerElement.setAttribute("aria-expanded", "true");
613
- this.didOpen.emit();
614
- }
615
- _onCloseAnimationEnd() {
616
- this.state = "closed";
617
- this._triggerElement.setAttribute("aria-expanded", "false");
618
- this._resetActiveElement();
619
- this._optionContainer.scrollTop = 0;
620
- this.didClose.emit();
621
- }
622
- /** When an option is selected, updates the displayValue; it also closes the select if not `multiple`. */
623
- _onOptionSelected(optionSelectionChange) {
624
- if (!this.multiple) {
625
- this._filteredOptions.filter((option) => option.id !== optionSelectionChange.id).forEach((option) => option.selected = false);
626
- this.value = optionSelectionChange.value;
627
- } else {
628
- if (!this.value) {
629
- this.value = [optionSelectionChange.value];
630
- } else if (!this.value.includes(optionSelectionChange.value)) {
631
- this.value = [...this.value, optionSelectionChange.value];
632
- }
633
- }
634
- this._input.emit();
635
- this._change.emit();
636
- this._didChange.emit();
637
- }
638
- /** When an option is unselected in `multiple`, removes it from value and updates displayValue. */
639
- _onOptionDeselected(optionSelectionChange) {
640
- if (this.multiple) {
641
- this.value = this.value.filter(
642
- (el) => el !== optionSelectionChange.value
643
- );
594
+ /**
595
+ * To assess screen-readers problems caused by the interaction between aria patterns and shadow DOM,
596
+ * we are forced to move the 'combobox' trigger element to the light DOM
597
+ */
598
+ _setupTrigger() {
599
+ var _a2, _b, _c;
600
+ (_b = (_a2 = this.parentElement).insertBefore) == null ? void 0 : _b.call(_a2, this._triggerElement, this);
601
+ const containerElement = ((_c = this.closest) == null ? void 0 : _c.call(this, "sbb-form-field")) ?? this;
602
+ this._triggerElement.style.top = "0px";
603
+ this._triggerElement.style.height = `${containerElement.offsetHeight}px`;
604
+ this._triggerElement.style.width = `${containerElement.offsetWidth}px`;
605
+ }
606
+ _setOverlayPosition() {
607
+ setOverlayPosition(this._overlay, this._originElement, this._optionContainer, this.shadowRoot.querySelector(".sbb-select__container"), this);
608
+ }
609
+ // In rare cases it can be that the animationEnd event is triggered twice.
610
+ // To avoid entering a corrupt state, exit when state is not expected.
611
+ _onAnimationEnd(event) {
612
+ if (event.animationName === "open" && this.state === "opening") {
613
+ this._onOpenAnimationEnd();
614
+ } else if (event.animationName === "close" && this.state === "closing") {
615
+ this._onCloseAnimationEnd();
616
+ }
617
+ }
618
+ _onOpenAnimationEnd() {
619
+ this.state = "opened";
620
+ this._attachOpenPanelEvents();
621
+ this._triggerElement.setAttribute("aria-expanded", "true");
622
+ this.didOpen.emit();
623
+ }
624
+ _onCloseAnimationEnd() {
625
+ this.state = "closed";
626
+ this._triggerElement.setAttribute("aria-expanded", "false");
627
+ this._resetActiveElement();
628
+ this._optionContainer.scrollTop = 0;
629
+ this.didClose.emit();
630
+ }
631
+ /** When an option is selected, updates the displayValue; it also closes the select if not `multiple`. */
632
+ _onOptionSelected(optionSelectionChange) {
633
+ if (!this.multiple) {
634
+ this._filteredOptions.filter((option) => option.id !== optionSelectionChange.id).forEach((option) => option.selected = false);
635
+ this.value = optionSelectionChange.value;
636
+ } else {
637
+ if (!this.value) {
638
+ this.value = [optionSelectionChange.value];
639
+ } else if (!this.value.includes(optionSelectionChange.value)) {
640
+ this.value = [...this.value, optionSelectionChange.value];
641
+ }
642
+ }
644
643
  this._input.emit();
645
644
  this._change.emit();
646
645
  this._didChange.emit();
647
646
  }
648
- }
649
- _attachOpenPanelEvents() {
650
- this._openPanelEventsController = new AbortController();
651
- document.addEventListener("scroll", () => this._setOverlayPosition(), {
652
- passive: true,
653
- signal: this._openPanelEventsController.signal
654
- });
655
- window.addEventListener("resize", () => this._setOverlayPosition(), {
656
- passive: true,
657
- signal: this._openPanelEventsController.signal
658
- });
659
- window.addEventListener("pointerdown", (ev) => this._pointerDownListener(ev), {
660
- signal: this._openPanelEventsController.signal
661
- });
662
- window.addEventListener("pointerup", (ev) => this._closeOnBackdropClick(ev), {
663
- signal: this._openPanelEventsController.signal
664
- });
665
- }
666
- _onKeyDown(event) {
667
- if (this.readonly) {
668
- return;
669
- }
670
- if (this.state === "opened") {
671
- this._openedPanelKeyboardInteraction(event);
672
- }
673
- if (this.state === "closed") {
674
- this._closedPanelKeyboardInteraction(event);
647
+ /** When an option is unselected in `multiple`, removes it from value and updates displayValue. */
648
+ _onOptionDeselected(optionSelectionChange) {
649
+ if (this.multiple) {
650
+ this.value = this.value.filter((el) => el !== optionSelectionChange.value);
651
+ this._input.emit();
652
+ this._change.emit();
653
+ this._didChange.emit();
654
+ }
675
655
  }
676
- }
677
- _closedPanelKeyboardInteraction(event) {
678
- if (this._checkForLetterSelection(event)) {
679
- return this._setNextActiveOptionByText(event);
680
- }
681
- switch (event.key) {
682
- case "Enter":
683
- case " ":
684
- case "ArrowDown":
685
- case "ArrowUp":
686
- event.preventDefault();
687
- this.open();
688
- break;
656
+ _attachOpenPanelEvents() {
657
+ this._openPanelEventsController = new AbortController();
658
+ document.addEventListener("scroll", () => this._setOverlayPosition(), {
659
+ passive: true,
660
+ signal: this._openPanelEventsController.signal
661
+ });
662
+ window.addEventListener("resize", () => this._setOverlayPosition(), {
663
+ passive: true,
664
+ signal: this._openPanelEventsController.signal
665
+ });
666
+ window.addEventListener("pointerdown", (ev) => this._pointerDownListener(ev), {
667
+ signal: this._openPanelEventsController.signal
668
+ });
669
+ window.addEventListener("pointerup", (ev) => this._closeOnBackdropClick(ev), {
670
+ signal: this._openPanelEventsController.signal
671
+ });
672
+ }
673
+ _onKeyDown(event) {
674
+ if (this.readonly) {
675
+ return;
676
+ }
677
+ if (this.state === "opened") {
678
+ this._openedPanelKeyboardInteraction(event);
679
+ }
680
+ if (this.state === "closed") {
681
+ this._closedPanelKeyboardInteraction(event);
682
+ }
689
683
  }
690
- }
691
- _openedPanelKeyboardInteraction(event) {
692
- if (this.readonly || this.state !== "opened") {
693
- return;
684
+ _closedPanelKeyboardInteraction(event) {
685
+ if (this._checkForLetterSelection(event)) {
686
+ return this._setNextActiveOptionByText(event);
687
+ }
688
+ switch (event.key) {
689
+ case "Enter":
690
+ case " ":
691
+ case "ArrowDown":
692
+ case "ArrowUp":
693
+ event.preventDefault();
694
+ this.open();
695
+ break;
696
+ }
694
697
  }
695
- if (this._checkForLetterSelection(event)) {
696
- return this._setNextActiveOptionByText(event);
698
+ _openedPanelKeyboardInteraction(event) {
699
+ if (this.readonly || this.state !== "opened") {
700
+ return;
701
+ }
702
+ if (this._checkForLetterSelection(event)) {
703
+ return this._setNextActiveOptionByText(event);
704
+ }
705
+ switch (event.key) {
706
+ case "Escape":
707
+ case "Tab":
708
+ this.close();
709
+ break;
710
+ case "Enter":
711
+ case " ":
712
+ event.preventDefault();
713
+ this._selectByKeyboard();
714
+ break;
715
+ case "ArrowDown":
716
+ case "ArrowUp":
717
+ event.preventDefault();
718
+ this._setNextActiveOption(event);
719
+ break;
720
+ case "Home":
721
+ case "PageUp":
722
+ event.preventDefault();
723
+ this._setNextActiveOption(event, 0);
724
+ break;
725
+ case "End":
726
+ case "PageDown":
727
+ event.preventDefault();
728
+ this._setNextActiveOption(event, this._filteredOptions.length - 1);
729
+ break;
730
+ }
697
731
  }
698
- switch (event.key) {
699
- case "Escape":
700
- case "Tab":
701
- this.close();
702
- break;
703
- case "Enter":
704
- case " ":
705
- event.preventDefault();
706
- this._selectByKeyboard();
707
- break;
708
- case "ArrowDown":
709
- case "ArrowUp":
710
- event.preventDefault();
711
- this._setNextActiveOption(event);
712
- break;
713
- case "Home":
714
- case "PageUp":
715
- event.preventDefault();
716
- this._setNextActiveOption(event, 0);
717
- break;
718
- case "End":
719
- case "PageDown":
720
- event.preventDefault();
721
- this._setNextActiveOption(event, this._filteredOptions.length - 1);
722
- break;
732
+ _checkForLetterSelection(event) {
733
+ return event.key === "Backspace" || event.key === "Clear" || event.key.length === 1 && event.key !== " " && !event.altKey && !event.ctrlKey && !event.metaKey;
723
734
  }
724
- }
725
- _checkForLetterSelection(event) {
726
- return event.key === "Backspace" || event.key === "Clear" || event.key.length === 1 && event.key !== " " && !event.altKey && !event.ctrlKey && !event.metaKey;
727
- }
728
- _setNextActiveOptionByText(event) {
729
- if (typeof this._searchTimeout === typeof setTimeout) {
730
- clearTimeout(this._searchTimeout);
731
- }
732
- this._searchTimeout = setTimeout(() => this._searchString = "", 1e3);
733
- this._searchString += event.key;
734
- const indexForSlice = this._activeItemIndex + 1;
735
- const filteredOptionsSorted = [
736
- ...this._filteredOptions.slice(indexForSlice),
737
- ...this._filteredOptions.slice(0, indexForSlice)
738
- ];
739
- const match = filteredOptionsSorted.find(
740
- (option) => {
741
- var _a;
742
- return ((_a = option.textContent) == null ? void 0 : _a.toLowerCase().indexOf(this._searchString.toLowerCase())) === 0;
743
- }
744
- );
745
- if (match) {
746
- this._setNextActiveOption(event, this._filteredOptions.indexOf(match));
747
- } else if (this._searchString.length > 1 && new RegExp(`^${this._searchString.charAt(0)}*$`).test(this._searchString)) {
748
- const firstMatch = filteredOptionsSorted.find(
749
- (option) => {
750
- var _a;
751
- return ((_a = option.textContent) == null ? void 0 : _a.toLowerCase().indexOf(this._searchString[0].toLowerCase())) === 0;
735
+ _setNextActiveOptionByText(event) {
736
+ if (typeof this._searchTimeout === typeof setTimeout) {
737
+ clearTimeout(this._searchTimeout);
738
+ }
739
+ this._searchTimeout = setTimeout(() => this._searchString = "", 1e3);
740
+ this._searchString += event.key;
741
+ const indexForSlice = this._activeItemIndex + 1;
742
+ const filteredOptionsSorted = [
743
+ ...this._filteredOptions.slice(indexForSlice),
744
+ ...this._filteredOptions.slice(0, indexForSlice)
745
+ ];
746
+ const match = filteredOptionsSorted.find((option) => {
747
+ var _a2;
748
+ return ((_a2 = option.textContent) == null ? void 0 : _a2.toLowerCase().indexOf(this._searchString.toLowerCase())) === 0;
749
+ });
750
+ if (match) {
751
+ this._setNextActiveOption(event, this._filteredOptions.indexOf(match));
752
+ } else if (this._searchString.length > 1 && new RegExp(`^${this._searchString.charAt(0)}*$`).test(this._searchString)) {
753
+ const firstMatch = filteredOptionsSorted.find((option) => {
754
+ var _a2;
755
+ return ((_a2 = option.textContent) == null ? void 0 : _a2.toLowerCase().indexOf(this._searchString[0].toLowerCase())) === 0;
756
+ });
757
+ if (firstMatch) {
758
+ this._setNextActiveOption(event, this._filteredOptions.indexOf(firstMatch));
752
759
  }
753
- );
754
- if (firstMatch) {
755
- this._setNextActiveOption(event, this._filteredOptions.indexOf(firstMatch));
760
+ } else {
761
+ clearTimeout(this._searchTimeout);
762
+ this._searchString = "";
756
763
  }
757
- } else {
758
- clearTimeout(this._searchTimeout);
759
- this._searchString = "";
760
- }
761
- }
762
- _selectByKeyboard() {
763
- const activeOption = this._filteredOptions[this._activeItemIndex];
764
- if (this.multiple) {
765
- activeOption.setSelectedViaUserInteraction(!activeOption.selected);
766
- } else {
767
- this.close();
768
764
  }
769
- }
770
- _setNextActiveOption(event, index) {
771
- const nextIndex = index ?? getNextElementIndex(event, this._activeItemIndex, this._filteredOptions.length);
772
- const nextOption = this._filteredOptions[nextIndex];
773
- const activeOption = this._filteredOptions[this._activeItemIndex];
774
- this._setActiveElement(nextOption, activeOption);
775
- if (!this.multiple) {
776
- this._setSelectedElement(nextOption, activeOption);
777
- } else if (event == null ? void 0 : event.shiftKey) {
778
- nextOption.setSelectedViaUserInteraction(!nextOption.selected);
779
- }
780
- this._activeItemIndex = nextIndex;
781
- }
782
- _setActiveElement(nextActiveOption, lastActiveOption = null, setActiveDescendant = true) {
783
- nextActiveOption.setActive(true);
784
- nextActiveOption.scrollIntoView({ block: "nearest" });
785
- if (setActiveDescendant) {
786
- this._triggerElement.setAttribute("aria-activedescendant", nextActiveOption.id);
765
+ _selectByKeyboard() {
766
+ const activeOption = this._filteredOptions[this._activeItemIndex];
767
+ if (this.multiple) {
768
+ activeOption.setSelectedViaUserInteraction(!activeOption.selected);
769
+ } else {
770
+ this.close();
771
+ }
787
772
  }
788
- if (lastActiveOption && lastActiveOption !== nextActiveOption) {
789
- lastActiveOption.setActive(false);
773
+ _setNextActiveOption(event, index) {
774
+ const nextIndex = index ?? getNextElementIndex(event, this._activeItemIndex, this._filteredOptions.length);
775
+ const nextOption = this._filteredOptions[nextIndex];
776
+ const activeOption = this._filteredOptions[this._activeItemIndex];
777
+ this._setActiveElement(nextOption, activeOption);
778
+ if (!this.multiple) {
779
+ this._setSelectedElement(nextOption, activeOption);
780
+ } else if (event == null ? void 0 : event.shiftKey) {
781
+ nextOption.setSelectedViaUserInteraction(!nextOption.selected);
782
+ }
783
+ this._activeItemIndex = nextIndex;
790
784
  }
791
- }
792
- _setSelectedElement(nextActiveOption, lastActiveOption) {
793
- nextActiveOption.setSelectedViaUserInteraction(true);
794
- if (lastActiveOption && lastActiveOption !== nextActiveOption) {
795
- lastActiveOption.setSelectedViaUserInteraction(false);
785
+ _setActiveElement(nextActiveOption, lastActiveOption = null, setActiveDescendant = true) {
786
+ nextActiveOption.setActive(true);
787
+ nextActiveOption.scrollIntoView({ block: "nearest" });
788
+ if (setActiveDescendant) {
789
+ this._triggerElement.setAttribute("aria-activedescendant", nextActiveOption.id);
790
+ }
791
+ if (lastActiveOption && lastActiveOption !== nextActiveOption) {
792
+ lastActiveOption.setActive(false);
793
+ }
796
794
  }
797
- }
798
- _resetActiveElement() {
799
- const activeElement = this._filteredOptions[this._activeItemIndex];
800
- if (activeElement) {
801
- activeElement.setActive(false);
795
+ _setSelectedElement(nextActiveOption, lastActiveOption) {
796
+ nextActiveOption.setSelectedViaUserInteraction(true);
797
+ if (lastActiveOption && lastActiveOption !== nextActiveOption) {
798
+ lastActiveOption.setSelectedViaUserInteraction(false);
799
+ }
802
800
  }
803
- this._activeItemIndex = -1;
804
- this._triggerElement.removeAttribute("aria-activedescendant");
805
- }
806
- _setValueFromSelectedOption() {
807
- if (!this.multiple) {
808
- const selectedOption = this._filteredOptions.find((option) => option.selected);
809
- if (selectedOption) {
810
- this._activeItemIndex = this._filteredOptions.findIndex(
811
- (option) => option === selectedOption
812
- );
813
- this.value = selectedOption.value;
814
- }
815
- } else {
816
- const options = this._filteredOptions.filter((option) => option.selected);
817
- if (options && options.length > 0) {
818
- const value = [];
819
- for (const option of options) {
820
- value.push(option.value);
801
+ _resetActiveElement() {
802
+ const activeElement = this._filteredOptions[this._activeItemIndex];
803
+ if (activeElement) {
804
+ activeElement.setActive(false);
805
+ }
806
+ this._activeItemIndex = -1;
807
+ this._triggerElement.removeAttribute("aria-activedescendant");
808
+ }
809
+ _setValueFromSelectedOption() {
810
+ if (!this.multiple) {
811
+ const selectedOption = this._filteredOptions.find((option) => option.selected);
812
+ if (selectedOption) {
813
+ this._activeItemIndex = this._filteredOptions.findIndex((option) => option === selectedOption);
814
+ this.value = selectedOption.value;
815
+ }
816
+ } else {
817
+ const options = this._filteredOptions.filter((option) => option.selected);
818
+ if (options && options.length > 0) {
819
+ const value = [];
820
+ for (const option of options) {
821
+ value.push(option.value);
822
+ }
823
+ this.value = value;
821
824
  }
822
- this.value = value;
823
825
  }
824
826
  }
825
- }
826
- _toggleOpening() {
827
- var _a;
828
- if (this.disabled || this.formDisabled || this.readonly) {
829
- return;
830
- }
831
- (_a = this._triggerElement) == null ? void 0 : _a.focus();
832
- switch (this.state) {
833
- case "opened": {
834
- this.close();
835
- break;
827
+ _toggleOpening() {
828
+ var _a2;
829
+ if (this.disabled || this.formDisabled || this.readonly) {
830
+ return;
836
831
  }
837
- case "closed": {
838
- this.open();
839
- break;
832
+ (_a2 = this._triggerElement) == null ? void 0 : _a2.focus();
833
+ switch (this.state) {
834
+ case "opened": {
835
+ this.close();
836
+ break;
837
+ }
838
+ case "closed": {
839
+ this.open();
840
+ break;
841
+ }
840
842
  }
841
843
  }
842
- }
843
- _spreadDeferredDisplayValue(placeholder) {
844
- return [this._deferredDisplayValue(placeholder), placeholder];
845
- }
846
- async _deferredDisplayValue(placeholder) {
847
- if (this.hydrationRequired) {
848
- await this.hydrationComplete;
844
+ _spreadDeferredDisplayValue(placeholder) {
845
+ return [this._deferredDisplayValue(placeholder), placeholder];
849
846
  }
850
- return this._displayValue ? html`${this._displayValue}` : placeholder;
851
- }
852
- render() {
853
- return html`
847
+ async _deferredDisplayValue(placeholder) {
848
+ if (this.hydrationRequired) {
849
+ await this.hydrationComplete;
850
+ }
851
+ return this._displayValue ? html`${this._displayValue}` : placeholder;
852
+ }
853
+ render() {
854
+ return html`
854
855
  <!-- This element is visually hidden and will be appended to the light DOM to allow screen
855
856
  readers to work properly -->
856
857
  <div
@@ -871,11 +872,7 @@ let SbbSelectElement = class extends SbbUpdateSchedulerMixin(
871
872
 
872
873
  <!-- Visually display the value -->
873
874
  <div class="sbb-select__trigger" aria-hidden="true">
874
- ${until(
875
- ...this._spreadDeferredDisplayValue(
876
- html`<span class="sbb-select__trigger--placeholder">${this.placeholder}</span>`
877
- )
878
- )}
875
+ ${until(...this._spreadDeferredDisplayValue(html`<span class="sbb-select__trigger--placeholder">${this.placeholder}</span>`))}
879
876
  </div>
880
877
 
881
878
  <div class="sbb-select__gap-fix"></div>
@@ -900,38 +897,41 @@ let SbbSelectElement = class extends SbbUpdateSchedulerMixin(
900
897
  </div>
901
898
  </div>
902
899
  `;
903
- }
904
- };
905
- SbbSelectElement.styles = style;
906
- SbbSelectElement.events = {
907
- didChange: "didChange",
908
- change: "change",
909
- input: "input",
910
- stateChange: "stateChange",
911
- willOpen: "willOpen",
912
- didOpen: "didOpen",
913
- willClose: "willClose",
914
- didClose: "didClose"
915
- };
916
- __decorateClass([
917
- property()
918
- ], SbbSelectElement.prototype, "placeholder", 2);
919
- __decorateClass([
920
- property({ reflect: true, type: Boolean })
921
- ], SbbSelectElement.prototype, "multiple", 2);
922
- __decorateClass([
923
- property({ type: Boolean })
924
- ], SbbSelectElement.prototype, "readonly", 2);
925
- __decorateClass([
926
- state()
927
- ], SbbSelectElement.prototype, "_displayValue", 2);
928
- SbbSelectElement = __decorateClass([
929
- customElement("sbb-select"),
930
- hostAttributes({
931
- role: ariaRoleOnHost ? "listbox" : null
932
- })
933
- ], SbbSelectElement);
900
+ }
901
+ }, _placeholder_accessor_storage = new WeakMap(), _multiple_accessor_storage = new WeakMap(), _readonly_accessor_storage = new WeakMap(), __displayValue_accessor_storage = new WeakMap(), _classThis = _a, (() => {
902
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
903
+ _placeholder_decorators = [forceType(), property()];
904
+ _multiple_decorators = [forceType(), property({ reflect: true, type: Boolean })];
905
+ _readonly_decorators = [forceType(), property({ type: Boolean })];
906
+ __displayValue_decorators = [state()];
907
+ __esDecorate(_a, null, _placeholder_decorators, { kind: "accessor", name: "placeholder", static: false, private: false, access: { has: (obj) => "placeholder" in obj, get: (obj) => obj.placeholder, set: (obj, value) => {
908
+ obj.placeholder = value;
909
+ } }, metadata: _metadata }, _placeholder_initializers, _placeholder_extraInitializers);
910
+ __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) => {
911
+ obj.multiple = value;
912
+ } }, metadata: _metadata }, _multiple_initializers, _multiple_extraInitializers);
913
+ __esDecorate(_a, null, _readonly_decorators, { kind: "accessor", name: "readonly", static: false, private: false, access: { has: (obj) => "readonly" in obj, get: (obj) => obj.readonly, set: (obj, value) => {
914
+ obj.readonly = value;
915
+ } }, metadata: _metadata }, _readonly_initializers, _readonly_extraInitializers);
916
+ __esDecorate(_a, null, __displayValue_decorators, { kind: "accessor", name: "_displayValue", static: false, private: false, access: { has: (obj) => "_displayValue" in obj, get: (obj) => obj._displayValue, set: (obj, value) => {
917
+ obj._displayValue = value;
918
+ } }, metadata: _metadata }, __displayValue_initializers, __displayValue_extraInitializers);
919
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
920
+ SbbSelectElement2 = _classThis = _classDescriptor.value;
921
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
922
+ })(), _a.styles = style, _a.events = {
923
+ didChange: "didChange",
924
+ change: "change",
925
+ input: "input",
926
+ stateChange: "stateChange",
927
+ willOpen: "willOpen",
928
+ didOpen: "didOpen",
929
+ willClose: "willClose",
930
+ didClose: "didClose"
931
+ }, __runInitializers(_classThis, _classExtraInitializers), _a);
932
+ return SbbSelectElement2 = _classThis;
933
+ })();
934
934
  export {
935
935
  SbbSelectElement
936
936
  };
937
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2VsZWN0L3NlbGVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNdXRhdGlvbkNvbnRyb2xsZXIgfSBmcm9tICdAbGl0LWxhYnMvb2JzZXJ2ZXJzL211dGF0aW9uLWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHVudGlsIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW50aWwuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4IH0gZnJvbSAnLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciB9IGZyb20gJy4uL2NvcmUvY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgaG9zdEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNOZXh0anMsIGlzU2FmYXJpIH0gZnJvbSAnLi4vY29yZS9kb20uanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29yZS9ldmVudGluZy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIFNiYkRpc2FibGVkTWl4aW4sXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4sXG4gIFNiYkh5ZHJhdGlvbk1peGluLFxuICBTYmJOZWdhdGl2ZU1peGluLFxuICBTYmJSZXF1aXJlZE1peGluLFxuICBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpbixcbn0gZnJvbSAnLi4vY29yZS9taXhpbnMuanMnO1xuaW1wb3J0IHsgaXNFdmVudE9uRWxlbWVudCwgb3ZlcmxheUdhcEZpeENvcm5lcnMsIHNldE92ZXJsYXlQb3NpdGlvbiB9IGZyb20gJy4uL2NvcmUvb3ZlcmxheS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYk9wdEdyb3VwRWxlbWVudCwgU2JiT3B0aW9uRWxlbWVudCB9IGZyb20gJy4uL29wdGlvbi5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlbGVjdC5zY3NzP2xpdCZpbmxpbmUnO1xuXG4vKipcbiAqIE9uIFNhZmFyaSwgdGhlIGFyaWEgcm9sZSAnbGlzdGJveCcgbXVzdCBiZSBvbiB0aGUgaG9zdCBlbGVtZW50LCBvciBlbHNlIFZvaWNlT3ZlciB3b24ndCB3b3JrIGF0IGFsbC5cbiAqIE9uIHRoZSBvdGhlciBoYW5kLCBKQVdTIGFuZCBOVkRBIG5lZWQgdGhlIHJvbGUgdG8gYmUgYW4gXCJpbW1lZGlhdGUgcGFyZW50XCIgdG8gdGhlIG9wdGlvbnMsIG9yIGVsc2Ugb3B0Z3JvdXBzIHdvbid0IHdvcmsuXG4gKi9cbmNvbnN0IGFyaWFSb2xlT25Ib3N0ID0gaXNTYWZhcmk7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdENoYW5nZSB7XG4gIHR5cGU6ICd2YWx1ZSc7XG4gIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIHBhbmVsIHdpdGggc2VsZWN0YWJsZSBvcHRpb25zLlxuICpcbiAqIEBzbG90IC0gVXNlIHRoZSB1bm5hbWVkIHNsb3QgdG8gYWRkIG9wdGlvbnMuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBkaWRDaGFuZ2UgLSBEZXByZWNhdGVkLiB1c2VkIGZvciBSZWFjdC4gV2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIG9uY2UgUmVhY3QgMTkgaXMgYXZhaWxhYmxlLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gY2hhbmdlIC0gTm90aWZpZXMgdGhhdCB0aGUgY29tcG9uZW50J3MgdmFsdWUgaGFzIGNoYW5nZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBpbnB1dCAtIE5vdGlmaWVzIHRoYXQgYW4gb3B0aW9uIHZhbHVlIGhhcyBiZWVuIHNlbGVjdGVkLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gd2lsbE9wZW4gLSBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1zZWxlY3RgIHN0YXJ0cyB0aGUgb3BlbmluZyB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBkaWRPcGVuIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItc2VsZWN0YCBpcyBvcGVuZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSB3aWxsQ2xvc2UgLSBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1zZWxlY3RgIGJlZ2lucyB0aGUgY2xvc2luZyB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBkaWRDbG9zZSAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXNlbGVjdGAgaXMgY2xvc2VkLlxuICogQGNzc3Byb3AgWy0tc2JiLXNlbGVjdC16LWluZGV4PXZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleCldIC0gVG8gc3BlY2lmeSBhIGN1c3RvbSBzdGFjayBvcmRlcixcbiAqIHRoZSBgei1pbmRleGAgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgdGhpcyBDU1MgdmFyaWFibGUuIFRoZSBkZWZhdWx0IGB6LWluZGV4YCBvZiB0aGVcbiAqIGNvbXBvbmVudCBpcyBzZXQgdG8gYHZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleClgIHdpdGggYSB2YWx1ZSBvZiBgMTAwMGAuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdzYmItc2VsZWN0JylcbkBob3N0QXR0cmlidXRlcyh7XG4gIHJvbGU6IGFyaWFSb2xlT25Ib3N0ID8gJ2xpc3Rib3gnIDogbnVsbCxcbn0pXG5leHBvcnQgY2xhc3MgU2JiU2VsZWN0RWxlbWVudCBleHRlbmRzIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluKFxuICBTYmJEaXNhYmxlZE1peGluKFxuICAgIFNiYk5lZ2F0aXZlTWl4aW4oXG4gICAgICBTYmJIeWRyYXRpb25NaXhpbihcbiAgICAgICAgU2JiUmVxdWlyZWRNaXhpbihcbiAgICAgICAgICBTYmJGb3JtQXNzb2NpYXRlZE1peGluPHR5cGVvZiBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCwgc3RyaW5nIHwgc3RyaW5nW10+KFxuICAgICAgICAgICAgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbikge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcblxuICAvLyBGSVhNRSB1c2luZyAuLi5zdXBlci5ldmVudHMgcmVxdWlyZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYmItZGVzaWduLXN5c3RlbXMvbHluZS1jb21wb25lbnRzL2lzc3Vlcy8yNjAwXG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRpZENoYW5nZTogJ2RpZENoYW5nZScsXG4gICAgY2hhbmdlOiAnY2hhbmdlJyxcbiAgICBpbnB1dDogJ2lucHV0JyxcbiAgICBzdGF0ZUNoYW5nZTogJ3N0YXRlQ2hhbmdlJyxcbiAgICB3aWxsT3BlbjogJ3dpbGxPcGVuJyxcbiAgICBkaWRPcGVuOiAnZGlkT3BlbicsXG4gICAgd2lsbENsb3NlOiAnd2lsbENsb3NlJyxcbiAgICBkaWRDbG9zZTogJ2RpZENsb3NlJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHBsYWNlaG9sZGVyIHVzZWQgaWYgbm8gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICAvKiogV2hldGhlciB0aGUgc2VsZWN0IGFsbG93cyBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uLiAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIHB1YmxpYyBtdWx0aXBsZSA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgaXMgcmVhZG9ubHkuICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcHVibGljIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgLyoqIFRoZSB2YWx1ZSBkaXNwbGF5ZWQgYnkgdGhlIGNvbXBvbmVudC4gKi9cbiAgQHN0YXRlKCkgcHJpdmF0ZSBfZGlzcGxheVZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgb25seSB1c2VkIGZvciBSZWFjdC4gV2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIG9uY2UgUmVhY3QgMTkgaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBfZGlkQ2hhbmdlOiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNiYlNlbGVjdEVsZW1lbnQuZXZlbnRzLmRpZENoYW5nZSk7XG5cbiAgLyoqIE5vdGlmaWVzIHRoYXQgdGhlIGNvbXBvbmVudCdzIHZhbHVlIGhhcyBjaGFuZ2VkLiAqL1xuICBwcml2YXRlIF9jaGFuZ2U6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIodGhpcywgU2JiU2VsZWN0RWxlbWVudC5ldmVudHMuY2hhbmdlKTtcblxuICAvKiogTm90aWZpZXMgdGhhdCBhbiBvcHRpb24gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuICovXG4gIHByaXZhdGUgX2lucHV0OiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNiYlNlbGVjdEVsZW1lbnQuZXZlbnRzLmlucHV0KTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX3N0YXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8U2VsZWN0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJTZWxlY3RFbGVtZW50LmV2ZW50cy5zdGF0ZUNoYW5nZSxcbiAgICB7XG4gICAgICBjb21wb3NlZDogZmFsc2UsXG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIF9vdmVybGF5ITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX29wdGlvbkNvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcmlnaW5FbGVtZW50ITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3RyaWdnZXJFbGVtZW50ITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIhOiBBYm9ydENvbnRyb2xsZXI7XG4gIHByaXZhdGUgX292ZXJsYXlJZCA9IGBzYmItc2VsZWN0LSR7KytuZXh0SWR9YDtcbiAgcHJpdmF0ZSBfYWN0aXZlSXRlbUluZGV4ID0gLTE7XG4gIHByaXZhdGUgX3NlYXJjaFRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfc2VhcmNoU3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2RpZExvYWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNQb2ludGVyRG93bkV2ZW50T25NZW51OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2Fib3J0ID0gbmV3IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlcih0aGlzKTtcblxuICAvKipcbiAgICogVGhlICdjb21ib2JveCcgaW5wdXQgZWxlbWVudFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fdHJpZ2dlckVsZW1lbnQ7XG4gIH1cblxuICAvKiogR2V0cyBhbGwgdGhlIFNiYk9wdGlvbkVsZW1lbnQgcHJvamVjdGVkIGluIHRoZSBzZWxlY3QuICovXG4gIHByaXZhdGUgZ2V0IF9vcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPy4oJ3NiYi1vcHRpb24nKSA/PyBbXSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZmlsdGVyZWRPcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZmlsdGVyKFxuICAgICAgKG9wdDogU2JiT3B0aW9uRWxlbWVudCkgPT4gIW9wdC5kaXNhYmxlZCAmJiAhb3B0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1ncm91cC1kaXNhYmxlZCcpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIG5ldyBNdXRhdGlvbkNvbnRyb2xsZXIodGhpcywge1xuICAgICAgY29uZmlnOiB7IGF0dHJpYnV0ZUZpbHRlcjogWydhcmlhLWxhYmVsbGVkYnknXSB9LFxuICAgICAgY2FsbGJhY2s6IChtdXRhdGlvbnNMaXN0OiBNdXRhdGlvblJlY29yZFtdKSA9PiB0aGlzLl9vblNlbGVjdEF0dHJpYnV0ZXNDaGFuZ2UobXV0YXRpb25zTGlzdCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVE9ETzogQWNjZXNzaWJpbGl0eSBmaXggcmVxdWlyZWQgdG8gY29ycmVjdGx5IHJlYWQgdGhlIGxhYmVsO1xuICAgKiBjYW4gYmUgcG9zc2libHkgcmVtb3ZlZCBhZnRlciB0aGUgbWVyZ2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL3NiYi1kZXNpZ24tc3lzdGVtcy9seW5lLWNvbXBvbmVudHMvaXNzdWVzLzMwNjJcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0QXR0cmlidXRlc0NoYW5nZShtdXRhdGlvbnNMaXN0OiBNdXRhdGlvblJlY29yZFtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XG4gICAgICBpZiAobXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ2FyaWEtbGFiZWxsZWRieScpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JyxcbiAgICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JykhLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBPcGVucyB0aGUgc2VsZWN0aW9uIHBhbmVsLiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlICE9PSAnY2xvc2VkJyB8fFxuICAgICAgIXRoaXMuX292ZXJsYXkgfHxcbiAgICAgIHRoaXMuX29wdGlvbnMubGVuZ3RoID09PSAwIHx8XG4gICAgICB0aGlzLmRpc2FibGVkIHx8XG4gICAgICB0aGlzLmZvcm1EaXNhYmxlZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53aWxsT3Blbi5lbWl0KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuaW5nJztcbiAgICB0aGlzLl9zZXRPdmVybGF5UG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKiBDbG9zZXMgdGhlIHNlbGVjdGlvbiBwYW5lbC4gKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53aWxsQ2xvc2UuZW1pdCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5hYm9ydCgpO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGN1cnJlbnQgZGlzcGxheWVkIHZhbHVlLiAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBMaXN0ZW5zIHRvIG9wdGlvbiBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIF9vbk9wdGlvbkNoYW5nZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIFNiYk9wdGlvbkVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5zZWxlY3RlZCkge1xuICAgICAgdGhpcy5fb25PcHRpb25TZWxlY3RlZCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vbk9wdGlvbkRlc2VsZWN0ZWQodGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9vbk9wdGlvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIFNiYlNlbGVjdEVsZW1lbnQgfCBTYmJPcHRpb25FbGVtZW50O1xuICAgIGlmICh0YXJnZXQubG9jYWxOYW1lICE9PSAnc2JiLW9wdGlvbicgfHwgdGFyZ2V0LmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIF9kaXNwbGF5VmFsdWUgYnkgY2hlY2tpbmcgdGhlIGludGVybmFsIHNiYi1vcHRpb25zIGFuZCBzZXR0aW5nIHRoZSBjb3JyZWN0IGBzZWxlY3RlZGAgdmFsdWUgb24gdGhlbS4gKi9cbiAgcHJpdmF0ZSBfb25WYWx1ZUNoYW5nZWQobmV3VmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9ucztcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV3VmFsdWUpKSB7XG4gICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gb3B0aW9ucy5maW5kKChvKSA9PiAoby52YWx1ZSA/PyBvLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkgPT09IG5ld1ZhbHVlKTtcbiAgICAgIGlmIChvcHRpb25FbGVtZW50KSB7XG4gICAgICAgIG9wdGlvbkVsZW1lbnQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgb3B0aW9uc1xuICAgICAgICAuZmlsdGVyKChvKSA9PiAoby52YWx1ZSA/PyBvLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkgIT09IG5ld1ZhbHVlKVxuICAgICAgICAuZm9yRWFjaCgobykgPT4gKG8uc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gb3B0aW9uRWxlbWVudD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uc1xuICAgICAgICAuZmlsdGVyKChvKSA9PiAhbmV3VmFsdWUuaW5jbHVkZXMoby52YWx1ZSA/PyBvLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkpXG4gICAgICAgIC5mb3JFYWNoKChlKSA9PiAoZS5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbkVsZW1lbnRzID0gb3B0aW9ucy5maWx0ZXIoKG8pID0+XG4gICAgICAgIG5ld1ZhbHVlLmluY2x1ZGVzKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLFxuICAgICAgKTtcbiAgICAgIHNlbGVjdGVkT3B0aW9uRWxlbWVudHMuZm9yRWFjaCgobykgPT4gKG8uc2VsZWN0ZWQgPSB0cnVlKSk7XG4gICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSBzZWxlY3RlZE9wdGlvbkVsZW1lbnRzLm1hcCgobykgPT4gby50ZXh0Q29udGVudCkuam9pbignLCAnKSB8fCBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZUNoYW5nZS5lbWl0KHsgdHlwZTogJ3ZhbHVlJywgdmFsdWU6IG5ld1ZhbHVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZm9jdXMgYmVoYXZpb3JcbiAgICB0aGlzLmZvY3VzID0gKCkgPT4gdGhpcy5fdHJpZ2dlckVsZW1lbnQuZm9jdXMoKTtcbiAgICB0aGlzLmJsdXIgPSAoKSA9PiB0aGlzLl90cmlnZ2VyRWxlbWVudC5ibHVyKCk7XG5cbiAgICAvLyBXYWl0IGZvciBzc3IgaHlkcmF0aW9uXG4gICAgaWYgKCFpc05leHRqcygpKSB7XG4gICAgICB0aGlzLnN0YXJ0VXBkYXRlKCk7XG4gICAgICB0aGlzLl9zZXR1cFNlbGVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGVsZW1lbnQncyBmaXJzdCBhdHRyaWJ1dGUgd2hvc2UgcXVhbGlmaWVkIG5hbWUgaXMgcXVhbGlmaWVkTmFtZS5cbiAgICpcbiAgICogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlbW92ZUF0dHJpYnV0ZSlcbiAgICogQGludGVybmFsIFdlIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBkdWUgdG8gYSBoeWRyYXRpb24gaXNzdWUgd2l0aCBOZXh0LmpzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBJbiBOZXh0LmpzIHRoZSBoeWRyYXRpb24gbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgbGlnaHQgRE9NLlxuICAgIC8vIEBsaXQvcmVhY3QgY2FsbHMgcmVtb3ZlQXR0cmlidXRlKCdkZWZlci1oeWRyYXRpb24nKSBpbiBhIHVzZUxheW91dEVmZmVjdCxcbiAgICAvLyB3aGljaCBpcyBkb25lIGFmdGVyIGh5ZHJhdGlvbiBpcyBmaW5pc2hlZC4gRHVlIHRvIHRoaXMgd2UgaW50ZXJjZXB0IHRoaXMgY2FsbFxuICAgIC8vIGluIG92ZXJyaWRpbmcgcmVtb3ZlQXR0cmlidXRlIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiB0aGUgc2JiLXNlbGVjdC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGl0L2xpdC9ibG9iL21haW4vcGFja2FnZXMvcmVhY3Qvc3JjL2NyZWF0ZS1jb21wb25lbnQudHMjTDI5My1MMjk2XG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdhaXQgZm9yIHVwZGF0ZSBjb21wbGV0ZSBpbiBvcmRlciB0byBiZSBzdXJlIHRoYXQgdGhlIHNoYWRvdyBET00gaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAgaWYgKGlzTmV4dGpzKCkgJiYgcXVhbGlmaWVkTmFtZSA9PT0gJ2RlZmVyLWh5ZHJhdGlvbicgJiYgIXRoaXMuX2RpZExvYWQpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLl9zZXR1cFNlbGVjdCgpKTtcbiAgICB9XG4gICAgc3VwZXIucmVtb3ZlQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBpZiAoYXJpYVJvbGVPbkhvc3QpIHtcbiAgICAgIHRoaXMuaWQgfHw9IHRoaXMuX292ZXJsYXlJZDtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9hYm9ydC5zaWduYWw7XG4gICAgY29uc3QgZm9ybUZpZWxkID0gdGhpcy5jbG9zZXN0Py4oJ3NiYi1mb3JtLWZpZWxkJykgPz8gdGhpcy5jbG9zZXN0Py4oJ1tkYXRhLWZvcm0tZmllbGRdJyk7XG5cbiAgICBpZiAoZm9ybUZpZWxkKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gZm9ybUZpZWxkLmhhc0F0dHJpYnV0ZSgnbmVnYXRpdmUnKTtcbiAgICB9XG4gICAgdGhpcy5fc3luY1Byb3BlcnRpZXMoKTtcblxuICAgIGlmICh0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLl9zZXR1cE9yaWdpbigpO1xuICAgICAgdGhpcy5fc2V0dXBUcmlnZ2VyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLl9vblZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnb3B0aW9uU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx2b2lkPikgPT4gdGhpcy5fb25PcHRpb25DaGFuZ2VkKGUpLFxuICAgICAgeyBzaWduYWwgfSxcbiAgICApO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdjbGljaycsXG4gICAgICAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLl9vbk9wdGlvbkNsaWNrKGUpO1xuICAgICAgICB0aGlzLl90b2dnbGVPcGVuaW5nKCk7XG4gICAgICB9LFxuICAgICAgeyBzaWduYWwgfSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAvLyBPbiBpbml0aWFsaXphdGlvbiwgdGhlICdfb25WYWx1ZUNoYW5nZWQnIGlzIGNhbGxlZCBieSB0aGUgY29ubmVjdGVkQ2FsbGJhY2tcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd2YWx1ZScpICYmIHRoaXMuX2RpZExvYWQpIHtcbiAgICAgIHRoaXMuX29uVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUhKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbmVnYXRpdmUnKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ211bHRpcGxlJykpIHtcbiAgICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5wcmVwZW5kKHRoaXMuX3RyaWdnZXJFbGVtZW50KTsgLy8gVGFrZSBiYWNrIHRoZSB0cmlnZ2VyIGVsZW1lbnQgcHJldmlvdXNseSBtb3ZlZCB0byB0aGUgbGlnaHQgRE9NXG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAodGhpcy52YWx1ZSBhcyBzdHJpbmdbXSkuZm9yRWFjaCgoZWwpID0+IGRhdGEuYXBwZW5kKHRoaXMubmFtZSwgZWwpKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZShkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMudmFsdWUgYXMgc3RyaW5nIHwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXNldCB2YWx1ZSBpcyB0aGUgYXR0cmlidXRlIHZhbHVlICh0aGUgc2V0dXAgdmFsdWUpLCBudWxsIG90aGVyd2lzZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuaGFzQXR0cmlidXRlKCd2YWx1ZScpID8gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgX3JlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICk6IHZvaWQge1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAvLyBpZiBtdWx0aXBsZSwgdGhlIHN0YXRlIGZvcm1hdCBpcyBbJ2ZpZWxkLW5hbWUnLCAndmFsdWUnXVtdXG4gICAgICB0aGlzLnZhbHVlID0gKHN0YXRlIGFzIFtzdHJpbmcsIHN0cmluZ11bXSkubWFwKChlbnRyaWVzKSA9PiBlbnRyaWVzWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHN0YXRlIGFzIHN0cmluZztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zeW5jUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/Lignc2JiLWRpdmlkZXInKS5mb3JFYWNoKChlbGVtZW50KSA9PiAoZWxlbWVudC5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmUpKTtcblxuICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbD8uPFNiYk9wdGlvbkVsZW1lbnQgfCBTYmJPcHRHcm91cEVsZW1lbnQ+KFxuICAgICAgJ3NiYi1vcHRpb24sIHNiYi1vcHRncm91cCcsXG4gICAgKS5mb3JFYWNoKChlbGVtZW50OiBTYmJPcHRpb25FbGVtZW50IHwgU2JiT3B0R3JvdXBFbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50LnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1uZWdhdGl2ZScsIHRoaXMubmVnYXRpdmUpO1xuICAgICAgZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtbXVsdGlwbGUnLCB0aGlzLm11bHRpcGxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwU2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldHVwT3JpZ2luKCk7XG4gICAgdGhpcy5fc2V0dXBUcmlnZ2VyKCk7XG4gICAgdGhpcy5fZGlkTG9hZCA9IHRydWU7XG4gICAgdGhpcy5jb21wbGV0ZVVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqIFNldHMgdGhlIG9yaWdpbkVsZW1lbnQ7IGlmIHRoZSBjb21wb25lbnQgaXMgdXNlZCBpbiBhIHNiYi1mb3JtLWZpZWxkIHVzZXMgaXQsIG90aGVyd2lzZSB1c2VzIHRoZSBwYXJlbnRFbGVtZW50LiAqL1xuICBwcml2YXRlIF9zZXR1cE9yaWdpbigpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtRmllbGQgPSB0aGlzLmNsb3Nlc3Q/Lignc2JiLWZvcm0tZmllbGQnKTtcbiAgICB0aGlzLl9vcmlnaW5FbGVtZW50ID1cbiAgICAgIGZvcm1GaWVsZD8uc2hhZG93Um9vdD8ucXVlcnlTZWxlY3Rvcj8uKCcjb3ZlcmxheS1hbmNob3InKSA/PyB0aGlzLnBhcmVudEVsZW1lbnQhO1xuICAgIGlmICh0aGlzLl9vcmlnaW5FbGVtZW50KSB7XG4gICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZShcbiAgICAgICAgJ2RhdGEtb3B0aW9uLXBhbmVsLW9yaWdpbi1ib3JkZXJsZXNzJyxcbiAgICAgICAgISFmb3JtRmllbGQ/Lmhhc0F0dHJpYnV0ZT8uKCdib3JkZXJsZXNzJyksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBhc3Nlc3Mgc2NyZWVuLXJlYWRlcnMgcHJvYmxlbXMgY2F1c2VkIGJ5IHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGFyaWEgcGF0dGVybnMgYW5kIHNoYWRvdyBET00sXG4gICAqIHdlIGFyZSBmb3JjZWQgdG8gbW92ZSB0aGUgJ2NvbWJvYm94JyB0cmlnZ2VyIGVsZW1lbnQgdG8gdGhlIGxpZ2h0IERPTVxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0dXBUcmlnZ2VyKCk6IHZvaWQge1xuICAgIC8vIE1vdmUgdGhlIHRyaWdnZXIgYmVmb3JlIHRoZSBzYmItc2VsZWN0XG4gICAgdGhpcy5wYXJlbnRFbGVtZW50IS5pbnNlcnRCZWZvcmU/Lih0aGlzLl90cmlnZ2VyRWxlbWVudCwgdGhpcyk7XG5cbiAgICAvLyBTZXQgdGhlIGludmlzaWJsZSB0cmlnZ2VyIGVsZW1lbnQgZGltZW5zaW9uIHRvIG1hdGNoIHRoZSBwYXJlbnQgKG5lZWRlZCBmb3Igc2NyZWVuIHJlYWRlcnMpXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2xvc2VzdD8uKCdzYmItZm9ybS1maWVsZCcpID8/IHRoaXM7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc3R5bGUudG9wID0gJzBweCc7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7Y29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHR9cHhgO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7Y29udGFpbmVyRWxlbWVudC5vZmZzZXRXaWR0aH1weGA7XG4gIH1cblxuICBwcml2YXRlIF9zZXRPdmVybGF5UG9zaXRpb24oKTogdm9pZCB7XG4gICAgc2V0T3ZlcmxheVBvc2l0aW9uKFxuICAgICAgdGhpcy5fb3ZlcmxheSxcbiAgICAgIHRoaXMuX29yaWdpbkVsZW1lbnQsXG4gICAgICB0aGlzLl9vcHRpb25Db250YWluZXIsXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItc2VsZWN0X19jb250YWluZXInKSEsXG4gICAgICB0aGlzLFxuICAgICk7XG4gIH1cblxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uQW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnb3BlbicgJiYgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICB0aGlzLl9vbk9wZW5BbmltYXRpb25FbmQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdjbG9zZScgJiYgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSB7XG4gICAgICB0aGlzLl9vbkNsb3NlQW5pbWF0aW9uRW5kKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25PcGVuQW5pbWF0aW9uRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmVkJztcbiAgICB0aGlzLl9hdHRhY2hPcGVuUGFuZWxFdmVudHMoKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xuXG4gICAgdGhpcy5kaWRPcGVuLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ2xvc2VBbmltYXRpb25FbmQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgIHRoaXMuX3Jlc2V0QWN0aXZlRWxlbWVudCgpO1xuICAgIHRoaXMuX29wdGlvbkNvbnRhaW5lci5zY3JvbGxUb3AgPSAwO1xuICAgIHRoaXMuZGlkQ2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgLyoqIFdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkLCB1cGRhdGVzIHRoZSBkaXNwbGF5VmFsdWU7IGl0IGFsc28gY2xvc2VzIHRoZSBzZWxlY3QgaWYgbm90IGBtdWx0aXBsZWAuICovXG4gIHByaXZhdGUgX29uT3B0aW9uU2VsZWN0ZWQob3B0aW9uU2VsZWN0aW9uQ2hhbmdlOiBTYmJPcHRpb25FbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLl9maWx0ZXJlZE9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uaWQgIT09IG9wdGlvblNlbGVjdGlvbkNoYW5nZS5pZClcbiAgICAgICAgLmZvckVhY2goKG9wdGlvbikgPT4gKG9wdGlvbi5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICB0aGlzLnZhbHVlID0gb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUhXTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsdWUuaW5jbHVkZXMob3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlISkpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFsuLi50aGlzLnZhbHVlLCBvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUhXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9pbnB1dC5lbWl0KCk7XG4gICAgdGhpcy5fY2hhbmdlLmVtaXQoKTtcbiAgICB0aGlzLl9kaWRDaGFuZ2UuZW1pdCgpO1xuICB9XG5cbiAgLyoqIFdoZW4gYW4gb3B0aW9uIGlzIHVuc2VsZWN0ZWQgaW4gYG11bHRpcGxlYCwgcmVtb3ZlcyBpdCBmcm9tIHZhbHVlIGFuZCB1cGRhdGVzIGRpc3BsYXlWYWx1ZS4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25EZXNlbGVjdGVkKG9wdGlvblNlbGVjdGlvbkNoYW5nZTogU2JiT3B0aW9uRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gKHRoaXMudmFsdWUgYXMgc3RyaW5nW10pLmZpbHRlcihcbiAgICAgICAgKGVsOiBzdHJpbmcpID0+IGVsICE9PSBvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUsXG4gICAgICApO1xuXG4gICAgICB0aGlzLl9pbnB1dC5lbWl0KCk7XG4gICAgICB0aGlzLl9jaGFuZ2UuZW1pdCgpO1xuICAgICAgdGhpcy5fZGlkQ2hhbmdlLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hdHRhY2hPcGVuUGFuZWxFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBvdmVybGF5IHBvc2l0aW9uIG9uIHNjcm9sbCBhbmQgd2luZG93IHJlc2l6ZVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCksIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuXG4gICAgLy8gQ2xvc2UgbWVudSBvbiBiYWNrZHJvcCBjbGlja1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIChldikgPT4gdGhpcy5fcG9pbnRlckRvd25MaXN0ZW5lcihldiksIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIChldikgPT4gdGhpcy5fY2xvc2VPbkJhY2tkcm9wQ2xpY2soZXYpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcpIHtcbiAgICAgIHRoaXMuX29wZW5lZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgdGhpcy5fY2xvc2VkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbG9zZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2hlY2tGb3JMZXR0ZXJTZWxlY3Rpb24oZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbkJ5VGV4dChldmVudCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb3BlbmVkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZG9ubHkgfHwgdGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2hlY2tGb3JMZXR0ZXJTZWxlY3Rpb24oZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbkJ5VGV4dChldmVudCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0QnlLZXlib2FyZCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgMCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCB0aGlzLl9maWx0ZXJlZE9wdGlvbnMubGVuZ3RoIC0gMSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrRm9yTGV0dGVyU2VsZWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0NsZWFyJyB8fFxuICAgICAgKGV2ZW50LmtleS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgZXZlbnQua2V5ICE9PSAnICcgJiZcbiAgICAgICAgIWV2ZW50LmFsdEtleSAmJlxuICAgICAgICAhZXZlbnQuY3RybEtleSAmJlxuICAgICAgICAhZXZlbnQubWV0YUtleSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0TmV4dEFjdGl2ZU9wdGlvbkJ5VGV4dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8vIFNldCB0aW1lb3V0IGFuZCB0aGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAgICBpZiAodHlwZW9mIHRoaXMuX3NlYXJjaFRpbWVvdXQgPT09IHR5cGVvZiBzZXRUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2VhcmNoVGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMuX3NlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLl9zZWFyY2hTdHJpbmcgPSAnJyksIDEwMDApO1xuICAgIHRoaXMuX3NlYXJjaFN0cmluZyArPSBldmVudC5rZXk7XG5cbiAgICAvLyBSZW9yZGVyIHRoZSBfZmlsdGVyZWRPcHRpb24gYXJyYXkgdG8gaGF2ZSB0aGUgbGFzdCBzZWxlY3RlZCBlbGVtZW50IGF0IHRoZSBib3R0b20uXG4gICAgY29uc3QgaW5kZXhGb3JTbGljZTogbnVtYmVyID0gdGhpcy5fYWN0aXZlSXRlbUluZGV4ICsgMTtcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQ6IFNiYk9wdGlvbkVsZW1lbnRbXSA9IFtcbiAgICAgIC4uLnRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5zbGljZShpbmRleEZvclNsaWNlKSxcbiAgICAgIC4uLnRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5zbGljZSgwLCBpbmRleEZvclNsaWNlKSxcbiAgICBdO1xuXG4gICAgY29uc3QgbWF0Y2ggPSBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQuZmluZChcbiAgICAgIChvcHRpb246IFNiYk9wdGlvbkVsZW1lbnQpID0+XG4gICAgICAgIG9wdGlvbi50ZXh0Q29udGVudD8udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuX3NlYXJjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSA9PT0gMCxcbiAgICApO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgLy8gSWYgYW4gZXhhY3QgbWF0Y2ggaGFzIGJlZW4gZm91bmQsIGdvIHRvIHRoYXQgb3B0aW9uLlxuICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmluZGV4T2YobWF0Y2gpKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5fc2VhcmNoU3RyaW5nLmxlbmd0aCA+IDEgJiZcbiAgICAgIG5ldyBSZWdFeHAoYF4ke3RoaXMuX3NlYXJjaFN0cmluZy5jaGFyQXQoMCl9KiRgKS50ZXN0KHRoaXMuX3NlYXJjaFN0cmluZylcbiAgICApIHtcbiAgICAgIC8vIElmIG5vIGV4YWN0IG1hdGNoIGhhcyBiZWVuIGZvdW5kIGJ1dCB0aGUgc3RyaW5nIHRvIHNlYXJjaCBpcyBtYWRlIGJ5IHRoZSBzYW1lIHJlcGVhdGVkIGxldHRlcixcbiAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBlbGVtZW50LCBpZiBleGlzdHMsIHRoYXQgbWF0Y2hlcyB0aGUgbGV0dGVyLlxuICAgICAgY29uc3QgZmlyc3RNYXRjaCA9IGZpbHRlcmVkT3B0aW9uc1NvcnRlZC5maW5kKFxuICAgICAgICAob3B0aW9uOiBTYmJPcHRpb25FbGVtZW50KSA9PlxuICAgICAgICAgIG9wdGlvbi50ZXh0Q29udGVudD8udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuX3NlYXJjaFN0cmluZ1swXS50b0xvd2VyQ2FzZSgpKSA9PT0gMCxcbiAgICAgICk7XG4gICAgICBpZiAoZmlyc3RNYXRjaCkge1xuICAgICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuaW5kZXhPZihmaXJzdE1hdGNoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG1hdGNoIGZvdW5kLCBjbGVhciB0aGUgdGltZW91dCBhbmQgdGhlIHNlYXJjaCB0ZXJtLlxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NlYXJjaFRpbWVvdXQpO1xuICAgICAgdGhpcy5fc2VhcmNoU3RyaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0QnlLZXlib2FyZCgpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNbdGhpcy5fYWN0aXZlSXRlbUluZGV4XTtcblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICBhY3RpdmVPcHRpb24uc2V0U2VsZWN0ZWRWaWFVc2VySW50ZXJhY3Rpb24oIWFjdGl2ZU9wdGlvbi5zZWxlY3RlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHRJbmRleCA9XG4gICAgICBpbmRleCA/PyBnZXROZXh0RWxlbWVudEluZGV4KGV2ZW50LCB0aGlzLl9hY3RpdmVJdGVtSW5kZXgsIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5sZW5ndGgpO1xuICAgIGNvbnN0IG5leHRPcHRpb24gPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNbbmV4dEluZGV4XTtcbiAgICBjb25zdCBhY3RpdmVPcHRpb24gPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNbdGhpcy5fYWN0aXZlSXRlbUluZGV4XTtcblxuICAgIHRoaXMuX3NldEFjdGl2ZUVsZW1lbnQobmV4dE9wdGlvbiwgYWN0aXZlT3B0aW9uKTtcblxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fc2V0U2VsZWN0ZWRFbGVtZW50KG5leHRPcHRpb24sIGFjdGl2ZU9wdGlvbik7XG4gICAgfSBlbHNlIGlmIChldmVudD8uc2hpZnRLZXkpIHtcbiAgICAgIG5leHRPcHRpb24uc2V0U2VsZWN0ZWRWaWFVc2VySW50ZXJhY3Rpb24oIW5leHRPcHRpb24uc2VsZWN0ZWQpO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBuZXh0SW5kZXg7XG4gIH1cblxuICBwcml2YXRlIF9zZXRBY3RpdmVFbGVtZW50KFxuICAgIG5leHRBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQsXG4gICAgbGFzdEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICAgIHNldEFjdGl2ZURlc2NlbmRhbnQgPSB0cnVlLFxuICApOiB2b2lkIHtcbiAgICBuZXh0QWN0aXZlT3B0aW9uLnNldEFjdGl2ZSh0cnVlKTtcbiAgICBuZXh0QWN0aXZlT3B0aW9uLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcblxuICAgIGlmIChzZXRBY3RpdmVEZXNjZW5kYW50KSB7XG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsIG5leHRBY3RpdmVPcHRpb24uaWQpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBwcmV2aW91c1xuICAgIGlmIChsYXN0QWN0aXZlT3B0aW9uICYmIGxhc3RBY3RpdmVPcHRpb24gIT09IG5leHRBY3RpdmVPcHRpb24pIHtcbiAgICAgIGxhc3RBY3RpdmVPcHRpb24uc2V0QWN0aXZlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRTZWxlY3RlZEVsZW1lbnQoXG4gICAgbmV4dEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCxcbiAgICBsYXN0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50LFxuICApOiB2b2lkIHtcbiAgICBuZXh0QWN0aXZlT3B0aW9uLnNldFNlbGVjdGVkVmlhVXNlckludGVyYWN0aW9uKHRydWUpO1xuXG4gICAgaWYgKGxhc3RBY3RpdmVPcHRpb24gJiYgbGFzdEFjdGl2ZU9wdGlvbiAhPT0gbmV4dEFjdGl2ZU9wdGlvbikge1xuICAgICAgbGFzdEFjdGl2ZU9wdGlvbi5zZXRTZWxlY3RlZFZpYVVzZXJJbnRlcmFjdGlvbihmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRBY3RpdmVFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNbdGhpcy5fYWN0aXZlSXRlbUluZGV4XTtcblxuICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICBhY3RpdmVFbGVtZW50LnNldEFjdGl2ZShmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IC0xO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50Jyk7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcG9pbnRlcmRvd24gZXZlbnQgdGFyZ2V0IGlzIHRyaWdnZXJlZCBvbiB0aGUgbWVudS5cbiAgcHJpdmF0ZSBfcG9pbnRlckRvd25MaXN0ZW5lciA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25NZW51ID0gaXNFdmVudE9uRWxlbWVudCh0aGlzLl9vdmVybGF5LCBldmVudCk7XG4gIH07XG5cbiAgLy8gQ2xvc2UgbWVudSBvbiBiYWNrZHJvcCBjbGljay5cbiAgcHJpdmF0ZSBfY2xvc2VPbkJhY2tkcm9wQ2xpY2sgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25NZW51ICYmICFpc0V2ZW50T25FbGVtZW50KHRoaXMuX292ZXJsYXksIGV2ZW50KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9zZXRWYWx1ZUZyb21TZWxlY3RlZE9wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuZmluZEluZGV4KFxuICAgICAgICAgIChvcHRpb24pID0+IG9wdGlvbiA9PT0gc2VsZWN0ZWRPcHRpb24sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZE9wdGlvbi52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2YWx1ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgIHZhbHVlLnB1c2gob3B0aW9uLnZhbHVlISk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RvZ2dsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5mb3JtRGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uZm9jdXMoKTtcblxuICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgY2FzZSAnb3BlbmVkJzoge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY2xvc2VkJzoge1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShcbiAgICBwbGFjZWhvbGRlcjogVGVtcGxhdGVSZXN1bHQsXG4gICk6IChUZW1wbGF0ZVJlc3VsdCB8IFByb21pc2U8VGVtcGxhdGVSZXN1bHQ+KVtdIHtcbiAgICByZXR1cm4gW3RoaXMuX2RlZmVycmVkRGlzcGxheVZhbHVlKHBsYWNlaG9sZGVyKSwgcGxhY2Vob2xkZXJdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZGVmZXJyZWREaXNwbGF5VmFsdWUocGxhY2Vob2xkZXI6IFRlbXBsYXRlUmVzdWx0KTogUHJvbWlzZTxUZW1wbGF0ZVJlc3VsdD4ge1xuICAgIGlmICh0aGlzLmh5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheVZhbHVlID8gaHRtbGAke3RoaXMuX2Rpc3BsYXlWYWx1ZX1gIDogcGxhY2Vob2xkZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDwhLS0gVGhpcyBlbGVtZW50IGlzIHZpc3VhbGx5IGhpZGRlbiBhbmQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgbGlnaHQgRE9NIHRvIGFsbG93IHNjcmVlblxuICAgICAgcmVhZGVycyB0byB3b3JrIHByb3Blcmx5IC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIlxuICAgICAgICB0YWJpbmRleD0ke3RoaXMuZGlzYWJsZWQgfHwgdGhpcy5mb3JtRGlzYWJsZWQgPyBub3RoaW5nIDogJzAnfVxuICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXG4gICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgIGFyaWEtcmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkLnRvU3RyaW5nKCl9XG4gICAgICAgIGFyaWEtY29udHJvbHM9JHt0aGlzLl9vdmVybGF5SWR9XG4gICAgICAgIGFyaWEtb3ducz0ke3RoaXMuX292ZXJsYXlJZH1cbiAgICAgICAgQGtleWRvd249JHt0aGlzLl9vbktleURvd259XG4gICAgICAgIEBjbGljaz0ke3RoaXMuX3RvZ2dsZU9wZW5pbmd9XG4gICAgICAgICR7cmVmKChyZWYpID0+ICh0aGlzLl90cmlnZ2VyRWxlbWVudCA9IHJlZiBhcyBIVE1MRWxlbWVudCkpfVxuICAgICAgPlxuICAgICAgICAke3VudGlsKC4uLnRoaXMuX3NwcmVhZERlZmVycmVkRGlzcGxheVZhbHVlKGh0bWxgPHNwYW4+JHt0aGlzLnBsYWNlaG9sZGVyfTwvc3Bhbj5gKSl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBWaXN1YWxseSBkaXNwbGF5IHRoZSB2YWx1ZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X190cmlnZ2VyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICR7dW50aWwoXG4gICAgICAgICAgLi4udGhpcy5fc3ByZWFkRGVmZXJyZWREaXNwbGF5VmFsdWUoXG4gICAgICAgICAgICBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXNlbGVjdF9fdHJpZ2dlci0tcGxhY2Vob2xkZXJcIj4ke3RoaXMucGxhY2Vob2xkZXJ9PC9zcGFuPmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fZ2FwLWZpeFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2NvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fZ2FwLWZpeFwiPiR7b3ZlcmxheUdhcEZpeENvcm5lcnMoKX08L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIEBhbmltYXRpb25lbmQ9JHt0aGlzLl9vbkFuaW1hdGlvbkVuZH1cbiAgICAgICAgICBjbGFzcz1cInNiYi1zZWxlY3RfX3BhbmVsXCJcbiAgICAgICAgICAke3JlZigoZGlhbG9nUmVmKSA9PiAodGhpcy5fb3ZlcmxheSA9IGRpYWxvZ1JlZiBhcyBIVE1MRWxlbWVudCkpfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX3dyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgaWQ9JHshYXJpYVJvbGVPbkhvc3QgPyB0aGlzLl9vdmVybGF5SWQgOiBub3RoaW5nfVxuICAgICAgICAgICAgICBjbGFzcz1cInNiYi1zZWxlY3RfX29wdGlvbnNcIlxuICAgICAgICAgICAgICByb2xlPSR7IWFyaWFSb2xlT25Ib3N0ID8gJ2xpc3Rib3gnIDogbm90aGluZ31cbiAgICAgICAgICAgICAgP2FyaWEtbXVsdGlzZWxlY3RhYmxlPSR7dGhpcy5tdWx0aXBsZX1cbiAgICAgICAgICAgICAgJHtyZWYoKGNvbnRhaW5lclJlZikgPT4gKHRoaXMuX29wdGlvbkNvbnRhaW5lciA9IGNvbnRhaW5lclJlZiBhcyBIVE1MRWxlbWVudCkpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c2xvdCBAc2xvdGNoYW5nZT0ke3RoaXMuX3NldFZhbHVlRnJvbVNlbGVjdGVkT3B0aW9ufT48L3Nsb3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc2VsZWN0JzogU2JiU2VsZWN0RWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInN0YXRlIiwicmVmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdDQSxNQUFNLGlCQUFpQjtBQUV2QixJQUFJLFNBQVM7QUEwQk4sSUFBTSxtQkFBTixjQUErQjtBQUFBLEVBQ3BD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
937
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2VsZWN0L3NlbGVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNdXRhdGlvbkNvbnRyb2xsZXIgfSBmcm9tICdAbGl0LWxhYnMvb2JzZXJ2ZXJzL211dGF0aW9uLWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHVudGlsIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW50aWwuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4IH0gZnJvbSAnLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciB9IGZyb20gJy4uL2NvcmUvY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlLCBob3N0QXR0cmlidXRlcyB9IGZyb20gJy4uL2NvcmUvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpc05leHRqcywgaXNTYWZhcmkgfSBmcm9tICcuLi9jb3JlL2RvbS5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb3JlL2V2ZW50aW5nLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybVJlc3RvcmVSZWFzb24sXG4gIHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSxcbiAgU2JiRGlzYWJsZWRNaXhpbixcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgU2JiSHlkcmF0aW9uTWl4aW4sXG4gIFNiYk5lZ2F0aXZlTWl4aW4sXG4gIFNiYlJlcXVpcmVkTWl4aW4sXG4gIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluLFxufSBmcm9tICcuLi9jb3JlL21peGlucy5qcyc7XG5pbXBvcnQgeyBpc0V2ZW50T25FbGVtZW50LCBvdmVybGF5R2FwRml4Q29ybmVycywgc2V0T3ZlcmxheVBvc2l0aW9uIH0gZnJvbSAnLi4vY29yZS9vdmVybGF5LmpzJztcbmltcG9ydCB0eXBlIHsgU2JiT3B0R3JvdXBFbGVtZW50LCBTYmJPcHRpb25FbGVtZW50IH0gZnJvbSAnLi4vb3B0aW9uLmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vc2VsZWN0LnNjc3M/bGl0JmlubGluZSc7XG5cbi8qKlxuICogT24gU2FmYXJpLCB0aGUgYXJpYSByb2xlICdsaXN0Ym94JyBtdXN0IGJlIG9uIHRoZSBob3N0IGVsZW1lbnQsIG9yIGVsc2UgVm9pY2VPdmVyIHdvbid0IHdvcmsgYXQgYWxsLlxuICogT24gdGhlIG90aGVyIGhhbmQsIEpBV1MgYW5kIE5WREEgbmVlZCB0aGUgcm9sZSB0byBiZSBhbiBcImltbWVkaWF0ZSBwYXJlbnRcIiB0byB0aGUgb3B0aW9ucywgb3IgZWxzZSBvcHRncm91cHMgd29uJ3Qgd29yay5cbiAqL1xuY29uc3QgYXJpYVJvbGVPbkhvc3QgPSBpc1NhZmFyaTtcblxubGV0IG5leHRJZCA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0Q2hhbmdlIHtcbiAgdHlwZTogJ3ZhbHVlJztcbiAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgcGFuZWwgd2l0aCBzZWxlY3RhYmxlIG9wdGlvbnMuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgb3B0aW9ucy5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGRpZENoYW5nZSAtIERlcHJlY2F0ZWQuIHVzZWQgZm9yIFJlYWN0LiBXaWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgb25jZSBSZWFjdCAxOSBpcyBhdmFpbGFibGUuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBjaGFuZ2UgLSBOb3RpZmllcyB0aGF0IHRoZSBjb21wb25lbnQncyB2YWx1ZSBoYXMgY2hhbmdlZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGlucHV0IC0gTm90aWZpZXMgdGhhdCBhbiBvcHRpb24gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSB3aWxsT3BlbiAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXNlbGVjdGAgc3RhcnRzIHRoZSBvcGVuaW5nIHRyYW5zaXRpb24uIENhbiBiZSBjYW5jZWxlZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGRpZE9wZW4gLSBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1zZWxlY3RgIGlzIG9wZW5lZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IHdpbGxDbG9zZSAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXNlbGVjdGAgYmVnaW5zIHRoZSBjbG9zaW5nIHRyYW5zaXRpb24uIENhbiBiZSBjYW5jZWxlZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGRpZENsb3NlIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItc2VsZWN0YCBpcyBjbG9zZWQuXG4gKiBAY3NzcHJvcCBbLS1zYmItc2VsZWN0LXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqIEBvdmVycmlkZVR5cGUgdmFsdWUgLSBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGxcbiAqL1xuZXhwb3J0XG5AY3VzdG9tRWxlbWVudCgnc2JiLXNlbGVjdCcpXG5AaG9zdEF0dHJpYnV0ZXMoe1xuICByb2xlOiBhcmlhUm9sZU9uSG9zdCA/ICdsaXN0Ym94JyA6IG51bGwsXG59KVxuY2xhc3MgU2JiU2VsZWN0RWxlbWVudCBleHRlbmRzIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluKFxuICBTYmJEaXNhYmxlZE1peGluKFxuICAgIFNiYk5lZ2F0aXZlTWl4aW4oXG4gICAgICBTYmJIeWRyYXRpb25NaXhpbihcbiAgICAgICAgU2JiUmVxdWlyZWRNaXhpbihcbiAgICAgICAgICBTYmJGb3JtQXNzb2NpYXRlZE1peGluPHR5cGVvZiBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCwgc3RyaW5nIHwgc3RyaW5nW10+KFxuICAgICAgICAgICAgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbikge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcblxuICAvLyBGSVhNRSB1c2luZyAuLi5zdXBlci5ldmVudHMgcmVxdWlyZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYmItZGVzaWduLXN5c3RlbXMvbHluZS1jb21wb25lbnRzL2lzc3Vlcy8yNjAwXG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRpZENoYW5nZTogJ2RpZENoYW5nZScsXG4gICAgY2hhbmdlOiAnY2hhbmdlJyxcbiAgICBpbnB1dDogJ2lucHV0JyxcbiAgICBzdGF0ZUNoYW5nZTogJ3N0YXRlQ2hhbmdlJyxcbiAgICB3aWxsT3BlbjogJ3dpbGxPcGVuJyxcbiAgICBkaWRPcGVuOiAnZGlkT3BlbicsXG4gICAgd2lsbENsb3NlOiAnd2lsbENsb3NlJyxcbiAgICBkaWRDbG9zZTogJ2RpZENsb3NlJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHBsYWNlaG9sZGVyIHVzZWQgaWYgbm8gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgYWxsb3dzIGZvciBtdWx0aXBsZSBzZWxlY3Rpb24uICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgaXMgcmVhZG9ubHkuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgdmFsdWUgZGlzcGxheWVkIGJ5IHRoZSBjb21wb25lbnQuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX2Rpc3BsYXlWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIG9ubHkgdXNlZCBmb3IgUmVhY3QuIFdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBvbmNlIFJlYWN0IDE5IGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgX2RpZENoYW5nZTogRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcih0aGlzLCBTYmJTZWxlY3RFbGVtZW50LmV2ZW50cy5kaWRDaGFuZ2UpO1xuXG4gIC8qKiBOb3RpZmllcyB0aGF0IHRoZSBjb21wb25lbnQncyB2YWx1ZSBoYXMgY2hhbmdlZC4gKi9cbiAgcHJpdmF0ZSBfY2hhbmdlOiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNiYlNlbGVjdEVsZW1lbnQuZXZlbnRzLmNoYW5nZSk7XG5cbiAgLyoqIE5vdGlmaWVzIHRoYXQgYW4gb3B0aW9uIHZhbHVlIGhhcyBiZWVuIHNlbGVjdGVkLiAqL1xuICBwcml2YXRlIF9pbnB1dDogRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcih0aGlzLCBTYmJTZWxlY3RFbGVtZW50LmV2ZW50cy5pbnB1dCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9zdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPFNlbGVjdENoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKFxuICAgIHRoaXMsXG4gICAgU2JiU2VsZWN0RWxlbWVudC5ldmVudHMuc3RhdGVDaGFuZ2UsXG4gICAge1xuICAgICAgY29tcG9zZWQ6IGZhbHNlLFxuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBfb3ZlcmxheSE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcHRpb25Db250YWluZXIhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfb3JpZ2luRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF90cmlnZ2VyRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyITogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9vdmVybGF5SWQgPSBgc2JiLXNlbGVjdC0keysrbmV4dElkfWA7XG4gIHByaXZhdGUgX2FjdGl2ZUl0ZW1JbmRleCA9IC0xO1xuICBwcml2YXRlIF9zZWFyY2hUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgX3NlYXJjaFN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9kaWRMb2FkID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzUG9pbnRlckRvd25FdmVudE9uTWVudTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hYm9ydCA9IG5ldyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIodGhpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSAnY29tYm9ib3gnIGlucHV0IGVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJFbGVtZW50O1xuICB9XG5cbiAgLyoqIEdldHMgYWxsIHRoZSBTYmJPcHRpb25FbGVtZW50IHByb2plY3RlZCBpbiB0aGUgc2VsZWN0LiAqL1xuICBwcml2YXRlIGdldCBfb3B0aW9ucygpOiBTYmJPcHRpb25FbGVtZW50W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbD8uKCdzYmItb3B0aW9uJykgPz8gW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2ZpbHRlcmVkT3B0aW9ucygpOiBTYmJPcHRpb25FbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmZpbHRlcihcbiAgICAgIChvcHQ6IFNiYk9wdGlvbkVsZW1lbnQpID0+ICFvcHQuZGlzYWJsZWQgJiYgIW9wdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ3JvdXAtZGlzYWJsZWQnKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBuZXcgTXV0YXRpb25Db250cm9sbGVyKHRoaXMsIHtcbiAgICAgIGNvbmZpZzogeyBhdHRyaWJ1dGVGaWx0ZXI6IFsnYXJpYS1sYWJlbGxlZGJ5J10gfSxcbiAgICAgIGNhbGxiYWNrOiAobXV0YXRpb25zTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4gdGhpcy5fb25TZWxlY3RBdHRyaWJ1dGVzQ2hhbmdlKG11dGF0aW9uc0xpc3QpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRPRE86IEFjY2Vzc2liaWxpdHkgZml4IHJlcXVpcmVkIHRvIGNvcnJlY3RseSByZWFkIHRoZSBsYWJlbDtcbiAgICogY2FuIGJlIHBvc3NpYmx5IHJlbW92ZWQgYWZ0ZXIgdGhlIG1lcmdlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9zYmItZGVzaWduLXN5c3RlbXMvbHluZS1jb21wb25lbnRzL2lzc3Vlcy8zMDYyXG4gICAqL1xuICBwcml2YXRlIF9vblNlbGVjdEF0dHJpYnV0ZXNDaGFuZ2UobXV0YXRpb25zTGlzdDogTXV0YXRpb25SZWNvcmRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zTGlzdCkge1xuICAgICAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdhcmlhLWxhYmVsbGVkYnknKSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2FyaWEtbGFiZWxsZWRieScsXG4gICAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpISxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogT3BlbnMgdGhlIHNlbGVjdGlvbiBwYW5lbC4gKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZSAhPT0gJ2Nsb3NlZCcgfHxcbiAgICAgICF0aGlzLl9vdmVybGF5IHx8XG4gICAgICB0aGlzLl9vcHRpb25zLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgdGhpcy5kaXNhYmxlZCB8fFxuICAgICAgdGhpcy5mb3JtRGlzYWJsZWRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMud2lsbE9wZW4uZW1pdCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG4gICAgdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCk7XG4gIH1cblxuICAvKiogQ2xvc2VzIHRoZSBzZWxlY3Rpb24gcGFuZWwuICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMud2lsbENsb3NlLmVtaXQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBjdXJyZW50IGRpc3BsYXllZCB2YWx1ZS4gKi9cbiAgcHVibGljIGdldERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5VmFsdWUgPz8gJyc7XG4gIH1cblxuICAvKiogTGlzdGVucyB0byBvcHRpb24gY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25DaGFuZ2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBTYmJPcHRpb25FbGVtZW50O1xuICAgIGlmICh0YXJnZXQuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuX29uT3B0aW9uU2VsZWN0ZWQodGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25PcHRpb25EZXNlbGVjdGVkKHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25PcHRpb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBTYmJTZWxlY3RFbGVtZW50IHwgU2JiT3B0aW9uRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmxvY2FsTmFtZSAhPT0gJ3NiYi1vcHRpb24nIHx8IHRhcmdldC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBfZGlzcGxheVZhbHVlIGJ5IGNoZWNraW5nIHRoZSBpbnRlcm5hbCBzYmItb3B0aW9ucyBhbmQgc2V0dGluZyB0aGUgY29ycmVjdCBgc2VsZWN0ZWRgIHZhbHVlIG9uIHRoZW0uICovXG4gIHByaXZhdGUgX29uVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IG9wdGlvbnMuZmluZCgobykgPT4gKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpID09PSBuZXdWYWx1ZSk7XG4gICAgICBpZiAob3B0aW9uRWxlbWVudCkge1xuICAgICAgICBvcHRpb25FbGVtZW50LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigobykgPT4gKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpICE9PSBuZXdWYWx1ZSlcbiAgICAgICAgLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IG9wdGlvbkVsZW1lbnQ/LnRleHRDb250ZW50IHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigobykgPT4gIW5ld1ZhbHVlLmluY2x1ZGVzKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpKVxuICAgICAgICAuZm9yRWFjaCgoZSkgPT4gKGUuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25FbGVtZW50cyA9IG9wdGlvbnMuZmlsdGVyKChvKSA9PlxuICAgICAgICBuZXdWYWx1ZS5pbmNsdWRlcyhvLnZhbHVlID8/IG8uZ2V0QXR0cmlidXRlKCd2YWx1ZScpKSxcbiAgICAgICk7XG4gICAgICBzZWxlY3RlZE9wdGlvbkVsZW1lbnRzLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gdHJ1ZSkpO1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gc2VsZWN0ZWRPcHRpb25FbGVtZW50cy5tYXAoKG8pID0+IG8udGV4dENvbnRlbnQpLmpvaW4oJywgJykgfHwgbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2UuZW1pdCh7IHR5cGU6ICd2YWx1ZScsIHZhbHVlOiBuZXdWYWx1ZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGZvY3VzIGJlaGF2aW9yXG4gICAgdGhpcy5mb2N1cyA9ICgpID0+IHRoaXMuX3RyaWdnZXJFbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5ibHVyID0gKCkgPT4gdGhpcy5fdHJpZ2dlckVsZW1lbnQuYmx1cigpO1xuXG4gICAgLy8gV2FpdCBmb3Igc3NyIGh5ZHJhdGlvblxuICAgIGlmICghaXNOZXh0anMoKSkge1xuICAgICAgdGhpcy5zdGFydFVwZGF0ZSgpO1xuICAgICAgdGhpcy5fc2V0dXBTZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBlbGVtZW50J3MgZmlyc3QgYXR0cmlidXRlIHdob3NlIHF1YWxpZmllZCBuYW1lIGlzIHF1YWxpZmllZE5hbWUuXG4gICAqXG4gICAqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvRWxlbWVudC9yZW1vdmVBdHRyaWJ1dGUpXG4gICAqIEBpbnRlcm5hbCBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgZHVlIHRvIGEgaHlkcmF0aW9uIGlzc3VlIHdpdGggTmV4dC5qcy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSByZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gSW4gTmV4dC5qcyB0aGUgaHlkcmF0aW9uIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgd2UgY2FuIG1hbmlwdWxhdGUgdGhlIGxpZ2h0IERPTS5cbiAgICAvLyBAbGl0L3JlYWN0IGNhbGxzIHJlbW92ZUF0dHJpYnV0ZSgnZGVmZXItaHlkcmF0aW9uJykgaW4gYSB1c2VMYXlvdXRFZmZlY3QsXG4gICAgLy8gd2hpY2ggaXMgZG9uZSBhZnRlciBoeWRyYXRpb24gaXMgZmluaXNoZWQuIER1ZSB0byB0aGlzIHdlIGludGVyY2VwdCB0aGlzIGNhbGxcbiAgICAvLyBpbiBvdmVycmlkaW5nIHJlbW92ZUF0dHJpYnV0ZSB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgdGhlIHNiYi1zZWxlY3QuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvYmxvYi9tYWluL3BhY2thZ2VzL3JlYWN0L3NyYy9jcmVhdGUtY29tcG9uZW50LnRzI0wyOTMtTDI5NlxuICAgIC8vIFdlIGFsc28gbmVlZCB0byB3YWl0IGZvciB1cGRhdGUgY29tcGxldGUgaW4gb3JkZXIgdG8gYmUgc3VyZSB0aGF0IHRoZSBzaGFkb3cgRE9NIGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgIGlmIChpc05leHRqcygpICYmIHF1YWxpZmllZE5hbWUgPT09ICdkZWZlci1oeWRyYXRpb24nICYmICF0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5fc2V0dXBTZWxlY3QoKSk7XG4gICAgfVxuICAgIHN1cGVyLnJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgaWYgKGFyaWFSb2xlT25Ib3N0KSB7XG4gICAgICB0aGlzLmlkIHx8PSB0aGlzLl9vdmVybGF5SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fYWJvcnQuc2lnbmFsO1xuICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuY2xvc2VzdD8uKCdzYmItZm9ybS1maWVsZCcpID8/IHRoaXMuY2xvc2VzdD8uKCdbZGF0YS1mb3JtLWZpZWxkXScpO1xuXG4gICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IGZvcm1GaWVsZC5oYXNBdHRyaWJ1dGUoJ25lZ2F0aXZlJyk7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodGhpcy5fZGlkTG9hZCkge1xuICAgICAgdGhpcy5fc2V0dXBPcmlnaW4oKTtcbiAgICAgIHRoaXMuX3NldHVwVHJpZ2dlcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5fb25WYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ29wdGlvblNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAoZTogQ3VzdG9tRXZlbnQ8dm9pZD4pID0+IHRoaXMuX29uT3B0aW9uQ2hhbmdlZChlKSxcbiAgICAgIHsgc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnY2xpY2snLFxuICAgICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fb25PcHRpb25DbGljayhlKTtcbiAgICAgICAgdGhpcy5fdG9nZ2xlT3BlbmluZygpO1xuICAgICAgfSxcbiAgICAgIHsgc2lnbmFsIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gT24gaW5pdGlhbGl6YXRpb24sIHRoZSAnX29uVmFsdWVDaGFuZ2VkJyBpcyBjYWxsZWQgYnkgdGhlIGNvbm5lY3RlZENhbGxiYWNrXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygndmFsdWUnKSAmJiB0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLl9vblZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlISk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ25lZ2F0aXZlJykgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdtdWx0aXBsZScpKSB7XG4gICAgICB0aGlzLl9zeW5jUHJvcGVydGllcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucHJlcGVuZCh0aGlzLl90cmlnZ2VyRWxlbWVudCk7IC8vIFRha2UgYmFjayB0aGUgdHJpZ2dlciBlbGVtZW50IHByZXZpb3VzbHkgbW92ZWQgdG8gdGhlIGxpZ2h0IERPTVxuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXI/LmFib3J0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgKHRoaXMudmFsdWUgYXMgc3RyaW5nW10pLmZvckVhY2goKGVsKSA9PiBkYXRhLmFwcGVuZCh0aGlzLm5hbWUsIGVsKSk7XG4gICAgICB0aGlzLmludGVybmFscy5zZXRGb3JtVmFsdWUoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLnZhbHVlIGFzIHN0cmluZyB8IG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzZXQgdmFsdWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAodGhlIHNldHVwIHZhbHVlKSwgbnVsbCBvdGhlcndpc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSA/IHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgIF9yZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgLy8gaWYgbXVsdGlwbGUsIHRoZSBzdGF0ZSBmb3JtYXQgaXMgWydmaWVsZC1uYW1lJywgJ3ZhbHVlJ11bXVxuICAgICAgdGhpcy52YWx1ZSA9IChzdGF0ZSBhcyBbc3RyaW5nLCBzdHJpbmddW10pLm1hcCgoZW50cmllcykgPT4gZW50cmllc1sxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSBzdGF0ZSBhcyBzdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1Byb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPy4oJ3NiYi1kaXZpZGVyJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gKGVsZW1lbnQubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlKSk7XG5cbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/LjxTYmJPcHRpb25FbGVtZW50IHwgU2JiT3B0R3JvdXBFbGVtZW50PihcbiAgICAgICdzYmItb3B0aW9uLCBzYmItb3B0Z3JvdXAnLFxuICAgICkuZm9yRWFjaCgoZWxlbWVudDogU2JiT3B0aW9uRWxlbWVudCB8IFNiYk9wdEdyb3VwRWxlbWVudCkgPT4ge1xuICAgICAgZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtbmVnYXRpdmUnLCB0aGlzLm5lZ2F0aXZlKTtcbiAgICAgIGVsZW1lbnQudG9nZ2xlQXR0cmlidXRlKCdkYXRhLW11bHRpcGxlJywgdGhpcy5tdWx0aXBsZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR1cE9yaWdpbigpO1xuICAgIHRoaXMuX3NldHVwVHJpZ2dlcigpO1xuICAgIHRoaXMuX2RpZExvYWQgPSB0cnVlO1xuICAgIHRoaXMuY29tcGxldGVVcGRhdGUoKTtcbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBvcmlnaW5FbGVtZW50OyBpZiB0aGUgY29tcG9uZW50IGlzIHVzZWQgaW4gYSBzYmItZm9ybS1maWVsZCB1c2VzIGl0LCBvdGhlcndpc2UgdXNlcyB0aGUgcGFyZW50RWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBfc2V0dXBPcmlnaW4oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUZpZWxkID0gdGhpcy5jbG9zZXN0Py4oJ3NiYi1mb3JtLWZpZWxkJyk7XG4gICAgdGhpcy5fb3JpZ2luRWxlbWVudCA9XG4gICAgICBmb3JtRmllbGQ/LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I/LignI292ZXJsYXktYW5jaG9yJykgPz8gdGhpcy5wYXJlbnRFbGVtZW50ITtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoXG4gICAgICAgICdkYXRhLW9wdGlvbi1wYW5lbC1vcmlnaW4tYm9yZGVybGVzcycsXG4gICAgICAgICEhZm9ybUZpZWxkPy5oYXNBdHRyaWJ1dGU/LignYm9yZGVybGVzcycpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG8gYXNzZXNzIHNjcmVlbi1yZWFkZXJzIHByb2JsZW1zIGNhdXNlZCBieSB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBhcmlhIHBhdHRlcm5zIGFuZCBzaGFkb3cgRE9NLFxuICAgKiB3ZSBhcmUgZm9yY2VkIHRvIG1vdmUgdGhlICdjb21ib2JveCcgdHJpZ2dlciBlbGVtZW50IHRvIHRoZSBsaWdodCBET01cbiAgICovXG4gIHByaXZhdGUgX3NldHVwVHJpZ2dlcigpOiB2b2lkIHtcbiAgICAvLyBNb3ZlIHRoZSB0cmlnZ2VyIGJlZm9yZSB0aGUgc2JiLXNlbGVjdFxuICAgIHRoaXMucGFyZW50RWxlbWVudCEuaW5zZXJ0QmVmb3JlPy4odGhpcy5fdHJpZ2dlckVsZW1lbnQsIHRoaXMpO1xuXG4gICAgLy8gU2V0IHRoZSBpbnZpc2libGUgdHJpZ2dlciBlbGVtZW50IGRpbWVuc2lvbiB0byBtYXRjaCB0aGUgcGFyZW50IChuZWVkZWQgZm9yIHNjcmVlbiByZWFkZXJzKVxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNsb3Nlc3Q/Lignc2JiLWZvcm0tZmllbGQnKSA/PyB0aGlzO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2NvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0fXB4YDtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke2NvbnRhaW5lckVsZW1lbnQub2Zmc2V0V2lkdGh9cHhgO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0T3ZlcmxheVBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHNldE92ZXJsYXlQb3NpdGlvbihcbiAgICAgIHRoaXMuX292ZXJsYXksXG4gICAgICB0aGlzLl9vcmlnaW5FbGVtZW50LFxuICAgICAgdGhpcy5fb3B0aW9uQ29udGFpbmVyLFxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLXNlbGVjdF9fY29udGFpbmVyJykhLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9XG5cbiAgLy8gSW4gcmFyZSBjYXNlcyBpdCBjYW4gYmUgdGhhdCB0aGUgYW5pbWF0aW9uRW5kIGV2ZW50IGlzIHRyaWdnZXJlZCB0d2ljZS5cbiAgLy8gVG8gYXZvaWQgZW50ZXJpbmcgYSBjb3JydXB0IHN0YXRlLCBleGl0IHdoZW4gc3RhdGUgaXMgbm90IGV4cGVjdGVkLlxuICBwcml2YXRlIF9vbkFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nICYmIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5fb25PcGVuQW5pbWF0aW9uRW5kKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2UnICYmIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5fb25DbG9zZUFuaW1hdGlvbkVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29uT3BlbkFuaW1hdGlvbkVuZCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5lZCc7XG4gICAgdGhpcy5fYXR0YWNoT3BlblBhbmVsRXZlbnRzKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcblxuICAgIHRoaXMuZGlkT3Blbi5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNsb3NlQW5pbWF0aW9uRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICB0aGlzLl9yZXNldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICB0aGlzLl9vcHRpb25Db250YWluZXIuc2Nyb2xsVG9wID0gMDtcbiAgICB0aGlzLmRpZENsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBXaGVuIGFuIG9wdGlvbiBpcyBzZWxlY3RlZCwgdXBkYXRlcyB0aGUgZGlzcGxheVZhbHVlOyBpdCBhbHNvIGNsb3NlcyB0aGUgc2VsZWN0IGlmIG5vdCBgbXVsdGlwbGVgLiAqL1xuICBwcml2YXRlIF9vbk9wdGlvblNlbGVjdGVkKG9wdGlvblNlbGVjdGlvbkNoYW5nZTogU2JiT3B0aW9uRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zXG4gICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmlkICE9PSBvcHRpb25TZWxlY3Rpb25DaGFuZ2UuaWQpXG4gICAgICAgIC5mb3JFYWNoKChvcHRpb24pID0+IChvcHRpb24uc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlIV07XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnZhbHVlLmluY2x1ZGVzKG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZSEpKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlIV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faW5wdXQuZW1pdCgpO1xuICAgIHRoaXMuX2NoYW5nZS5lbWl0KCk7XG4gICAgdGhpcy5fZGlkQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBXaGVuIGFuIG9wdGlvbiBpcyB1bnNlbGVjdGVkIGluIGBtdWx0aXBsZWAsIHJlbW92ZXMgaXQgZnJvbSB2YWx1ZSBhbmQgdXBkYXRlcyBkaXNwbGF5VmFsdWUuICovXG4gIHByaXZhdGUgX29uT3B0aW9uRGVzZWxlY3RlZChvcHRpb25TZWxlY3Rpb25DaGFuZ2U6IFNiYk9wdGlvbkVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIGFzIHN0cmluZ1tdKS5maWx0ZXIoXG4gICAgICAgIChlbDogc3RyaW5nKSA9PiBlbCAhPT0gb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5faW5wdXQuZW1pdCgpO1xuICAgICAgdGhpcy5fY2hhbmdlLmVtaXQoKTtcbiAgICAgIHRoaXMuX2RpZENoYW5nZS5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoT3BlblBhbmVsRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgb3ZlcmxheSBwb3NpdGlvbiBvbiBzY3JvbGwgYW5kIHdpbmRvdyByZXNpemVcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB0aGlzLl9zZXRPdmVybGF5UG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2tcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXYpID0+IHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIoZXYpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCAoZXYpID0+IHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrKGV2KSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnKSB7XG4gICAgICB0aGlzLl9vcGVuZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHRoaXMuX2Nsb3NlZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xvc2VkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NoZWNrRm9yTGV0dGVyU2VsZWN0aW9uKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29wZW5lZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRvbmx5IHx8IHRoaXMuc3RhdGUgIT09ICdvcGVuZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NoZWNrRm9yTGV0dGVyU2VsZWN0aW9uKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdEJ5S2V5Ym9hcmQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIDApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja0ZvckxldHRlclNlbGVjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdDbGVhcicgfHxcbiAgICAgIChldmVudC5rZXkubGVuZ3RoID09PSAxICYmXG4gICAgICAgIGV2ZW50LmtleSAhPT0gJyAnICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50LmN0cmxLZXkgJiZcbiAgICAgICAgIWV2ZW50Lm1ldGFLZXkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGltZW91dCBhbmQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zZWFyY2hUaW1lb3V0ID09PSB0eXBlb2Ygc2V0VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NlYXJjaFRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLl9zZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5fc2VhcmNoU3RyaW5nID0gJycpLCAxMDAwKTtcbiAgICB0aGlzLl9zZWFyY2hTdHJpbmcgKz0gZXZlbnQua2V5O1xuXG4gICAgLy8gUmVvcmRlciB0aGUgX2ZpbHRlcmVkT3B0aW9uIGFycmF5IHRvIGhhdmUgdGhlIGxhc3Qgc2VsZWN0ZWQgZWxlbWVudCBhdCB0aGUgYm90dG9tLlxuICAgIGNvbnN0IGluZGV4Rm9yU2xpY2U6IG51bWJlciA9IHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCArIDE7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zU29ydGVkOiBTYmJPcHRpb25FbGVtZW50W10gPSBbXG4gICAgICAuLi50aGlzLl9maWx0ZXJlZE9wdGlvbnMuc2xpY2UoaW5kZXhGb3JTbGljZSksXG4gICAgICAuLi50aGlzLl9maWx0ZXJlZE9wdGlvbnMuc2xpY2UoMCwgaW5kZXhGb3JTbGljZSksXG4gICAgXTtcblxuICAgIGNvbnN0IG1hdGNoID0gZmlsdGVyZWRPcHRpb25zU29ydGVkLmZpbmQoXG4gICAgICAob3B0aW9uOiBTYmJPcHRpb25FbGVtZW50KSA9PlxuICAgICAgICBvcHRpb24udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLl9zZWFyY2hTdHJpbmcudG9Mb3dlckNhc2UoKSkgPT09IDAsXG4gICAgKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIC8vIElmIGFuIGV4YWN0IG1hdGNoIGhhcyBiZWVuIGZvdW5kLCBnbyB0byB0aGF0IG9wdGlvbi5cbiAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5pbmRleE9mKG1hdGNoKSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuX3NlYXJjaFN0cmluZy5sZW5ndGggPiAxICYmXG4gICAgICBuZXcgUmVnRXhwKGBeJHt0aGlzLl9zZWFyY2hTdHJpbmcuY2hhckF0KDApfSokYCkudGVzdCh0aGlzLl9zZWFyY2hTdHJpbmcpXG4gICAgKSB7XG4gICAgICAvLyBJZiBubyBleGFjdCBtYXRjaCBoYXMgYmVlbiBmb3VuZCBidXQgdGhlIHN0cmluZyB0byBzZWFyY2ggaXMgbWFkZSBieSB0aGUgc2FtZSByZXBlYXRlZCBsZXR0ZXIsXG4gICAgICAvLyBnbyB0byB0aGUgZmlyc3QgZWxlbWVudCwgaWYgZXhpc3RzLCB0aGF0IG1hdGNoZXMgdGhlIGxldHRlci5cbiAgICAgIGNvbnN0IGZpcnN0TWF0Y2ggPSBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQuZmluZChcbiAgICAgICAgKG9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCkgPT5cbiAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLl9zZWFyY2hTdHJpbmdbMF0udG9Mb3dlckNhc2UoKSkgPT09IDAsXG4gICAgICApO1xuICAgICAgaWYgKGZpcnN0TWF0Y2gpIHtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmluZGV4T2YoZmlyc3RNYXRjaCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBtYXRjaCBmb3VuZCwgY2xlYXIgdGhlIHRpbWVvdXQgYW5kIHRoZSBzZWFyY2ggdGVybS5cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zZWFyY2hUaW1lb3V0KTtcbiAgICAgIHRoaXMuX3NlYXJjaFN0cmluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdEJ5S2V5Ym9hcmQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50ID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgYWN0aXZlT3B0aW9uLnNldFNlbGVjdGVkVmlhVXNlckludGVyYWN0aW9uKCFhY3RpdmVPcHRpb24uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCwgaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0SW5kZXggPVxuICAgICAgaW5kZXggPz8gZ2V0TmV4dEVsZW1lbnRJbmRleChldmVudCwgdGhpcy5fYWN0aXZlSXRlbUluZGV4LCB0aGlzLl9maWx0ZXJlZE9wdGlvbnMubGVuZ3RoKTtcbiAgICBjb25zdCBuZXh0T3B0aW9uID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW25leHRJbmRleF07XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICB0aGlzLl9zZXRBY3RpdmVFbGVtZW50KG5leHRPcHRpb24sIGFjdGl2ZU9wdGlvbik7XG5cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX3NldFNlbGVjdGVkRWxlbWVudChuZXh0T3B0aW9uLCBhY3RpdmVPcHRpb24pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnNoaWZ0S2V5KSB7XG4gICAgICBuZXh0T3B0aW9uLnNldFNlbGVjdGVkVmlhVXNlckludGVyYWN0aW9uKCFuZXh0T3B0aW9uLnNlbGVjdGVkKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gbmV4dEluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0QWN0aXZlRWxlbWVudChcbiAgICBuZXh0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50LFxuICAgIGxhc3RBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgICBzZXRBY3RpdmVEZXNjZW5kYW50ID0gdHJ1ZSxcbiAgKTogdm9pZCB7XG4gICAgbmV4dEFjdGl2ZU9wdGlvbi5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgbmV4dEFjdGl2ZU9wdGlvbi5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG5cbiAgICBpZiAoc2V0QWN0aXZlRGVzY2VuZGFudCkge1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLCBuZXh0QWN0aXZlT3B0aW9uLmlkKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgcHJldmlvdXNcbiAgICBpZiAobGFzdEFjdGl2ZU9wdGlvbiAmJiBsYXN0QWN0aXZlT3B0aW9uICE9PSBuZXh0QWN0aXZlT3B0aW9uKSB7XG4gICAgICBsYXN0QWN0aXZlT3B0aW9uLnNldEFjdGl2ZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U2VsZWN0ZWRFbGVtZW50KFxuICAgIG5leHRBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQsXG4gICAgbGFzdEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCxcbiAgKTogdm9pZCB7XG4gICAgbmV4dEFjdGl2ZU9wdGlvbi5zZXRTZWxlY3RlZFZpYVVzZXJJbnRlcmFjdGlvbih0cnVlKTtcblxuICAgIGlmIChsYXN0QWN0aXZlT3B0aW9uICYmIGxhc3RBY3RpdmVPcHRpb24gIT09IG5leHRBY3RpdmVPcHRpb24pIHtcbiAgICAgIGxhc3RBY3RpdmVPcHRpb24uc2V0U2VsZWN0ZWRWaWFVc2VySW50ZXJhY3Rpb24oZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0QWN0aXZlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgYWN0aXZlRWxlbWVudC5zZXRBY3RpdmUoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSAtMTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHRhcmdldCBpcyB0cmlnZ2VyZWQgb24gdGhlIG1lbnUuXG4gIHByaXZhdGUgX3BvaW50ZXJEb3duTGlzdGVuZXIgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uTWVudSA9IGlzRXZlbnRPbkVsZW1lbnQodGhpcy5fb3ZlcmxheSwgZXZlbnQpO1xuICB9O1xuXG4gIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2suXG4gIHByaXZhdGUgX2Nsb3NlT25CYWNrZHJvcENsaWNrID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uTWVudSAmJiAhaXNFdmVudE9uRWxlbWVudCh0aGlzLl9vdmVybGF5LCBldmVudCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBfc2V0VmFsdWVGcm9tU2VsZWN0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zLmZpbmRJbmRleChcbiAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24gPT09IHNlbGVjdGVkT3B0aW9uLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWRPcHRpb24udmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90b2dnbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LmZvY3VzKCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgIGNhc2UgJ29wZW5lZCc6IHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Nsb3NlZCc6IHtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3ByZWFkRGVmZXJyZWREaXNwbGF5VmFsdWUoXG4gICAgcGxhY2Vob2xkZXI6IFRlbXBsYXRlUmVzdWx0LFxuICApOiAoVGVtcGxhdGVSZXN1bHQgfCBQcm9taXNlPFRlbXBsYXRlUmVzdWx0PilbXSB7XG4gICAgcmV0dXJuIFt0aGlzLl9kZWZlcnJlZERpc3BsYXlWYWx1ZShwbGFjZWhvbGRlciksIHBsYWNlaG9sZGVyXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2RlZmVycmVkRGlzcGxheVZhbHVlKHBsYWNlaG9sZGVyOiBUZW1wbGF0ZVJlc3VsdCk6IFByb21pc2U8VGVtcGxhdGVSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgYXdhaXQgdGhpcy5oeWRyYXRpb25Db21wbGV0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlWYWx1ZSA/IGh0bWxgJHt0aGlzLl9kaXNwbGF5VmFsdWV9YCA6IHBsYWNlaG9sZGVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8IS0tIFRoaXMgZWxlbWVudCBpcyB2aXN1YWxseSBoaWRkZW4gYW5kIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGxpZ2h0IERPTSB0byBhbGxvdyBzY3JlZW5cbiAgICAgIHJlYWRlcnMgdG8gd29yayBwcm9wZXJseSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCJcbiAgICAgICAgdGFiaW5kZXg9JHt0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkID8gbm90aGluZyA6ICcwJ31cbiAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICBhcmlhLXJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZC50b1N0cmluZygpfVxuICAgICAgICBhcmlhLWNvbnRyb2xzPSR7dGhpcy5fb3ZlcmxheUlkfVxuICAgICAgICBhcmlhLW93bnM9JHt0aGlzLl9vdmVybGF5SWR9XG4gICAgICAgIEBrZXlkb3duPSR7dGhpcy5fb25LZXlEb3dufVxuICAgICAgICBAY2xpY2s9JHt0aGlzLl90b2dnbGVPcGVuaW5nfVxuICAgICAgICAke3JlZigocmVmKSA9PiAodGhpcy5fdHJpZ2dlckVsZW1lbnQgPSByZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgID5cbiAgICAgICAgJHt1bnRpbCguLi50aGlzLl9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShodG1sYDxzcGFuPiR7dGhpcy5wbGFjZWhvbGRlcn08L3NwYW4+YCkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlzdWFsbHkgZGlzcGxheSB0aGUgdmFsdWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fdHJpZ2dlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAke3VudGlsKFxuICAgICAgICAgIC4uLnRoaXMuX3NwcmVhZERlZmVycmVkRGlzcGxheVZhbHVlKFxuICAgICAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz1cInNiYi1zZWxlY3RfX3RyaWdnZXItLXBsYWNlaG9sZGVyXCI+JHt0aGlzLnBsYWNlaG9sZGVyfTwvc3Bhbj5gLFxuICAgICAgICAgICksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2dhcC1maXhcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2dhcC1maXhcIj4ke292ZXJsYXlHYXBGaXhDb3JuZXJzKCl9PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25BbmltYXRpb25FbmR9XG4gICAgICAgICAgY2xhc3M9XCJzYmItc2VsZWN0X19wYW5lbFwiXG4gICAgICAgICAgJHtyZWYoKGRpYWxvZ1JlZikgPT4gKHRoaXMuX292ZXJsYXkgPSBkaWFsb2dSZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X193cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGlkPSR7IWFyaWFSb2xlT25Ib3N0ID8gdGhpcy5fb3ZlcmxheUlkIDogbm90aGluZ31cbiAgICAgICAgICAgICAgY2xhc3M9XCJzYmItc2VsZWN0X19vcHRpb25zXCJcbiAgICAgICAgICAgICAgcm9sZT0keyFhcmlhUm9sZU9uSG9zdCA/ICdsaXN0Ym94JyA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgID9hcmlhLW11bHRpc2VsZWN0YWJsZT0ke3RoaXMubXVsdGlwbGV9XG4gICAgICAgICAgICAgICR7cmVmKChjb250YWluZXJSZWYpID0+ICh0aGlzLl9vcHRpb25Db250YWluZXIgPSBjb250YWluZXJSZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLl9zZXRWYWx1ZUZyb21TZWxlY3RlZE9wdGlvbn0+PC9zbG90PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNlbGVjdCc6IFNiYlNlbGVjdEVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTYmJTZWxlY3RFbGVtZW50IiwiX2EiLCJzdGF0ZSIsInJlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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