@sbb-esta/lyne-elements 3.0.0-next.3 → 3.0.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 (554) hide show
  1. package/accordion/accordion.component.js +10 -10
  2. package/alert/alert/alert.component.d.ts +4 -8
  3. package/alert/alert/alert.component.d.ts.map +1 -1
  4. package/alert/alert/alert.component.js +33 -33
  5. package/alert/alert-group/alert-group.component.d.ts +0 -3
  6. package/alert/alert-group/alert-group.component.d.ts.map +1 -1
  7. package/alert/alert-group/alert-group.component.js +44 -45
  8. package/autocomplete/autocomplete-base-element.d.ts +1 -1
  9. package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  10. package/autocomplete/autocomplete-base-element.js +12 -10
  11. package/autocomplete/autocomplete.component.d.ts +0 -4
  12. package/autocomplete/autocomplete.component.d.ts.map +1 -1
  13. package/autocomplete/autocomplete.component.js +1 -1
  14. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts +0 -4
  15. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts.map +1 -1
  16. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +11 -11
  17. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts +0 -10
  18. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
  19. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +14 -18
  20. package/button/accent-button/accent-button.component.d.ts +0 -1
  21. package/button/accent-button/accent-button.component.d.ts.map +1 -1
  22. package/button/button/button.component.d.ts +0 -1
  23. package/button/button/button.component.d.ts.map +1 -1
  24. package/button/mini-button/mini-button.component.d.ts +0 -1
  25. package/button/mini-button/mini-button.component.d.ts.map +1 -1
  26. package/button/secondary-button/secondary-button.component.d.ts +0 -1
  27. package/button/secondary-button/secondary-button.component.d.ts.map +1 -1
  28. package/button/transparent-button/transparent-button.component.d.ts +0 -1
  29. package/button/transparent-button/transparent-button.component.d.ts.map +1 -1
  30. package/calendar/calendar.component.d.ts +1 -5
  31. package/calendar/calendar.component.d.ts.map +1 -1
  32. package/calendar/calendar.component.js +68 -66
  33. package/card/card-button/card-button.component.d.ts +0 -1
  34. package/card/card-button/card-button.component.d.ts.map +1 -1
  35. package/checkbox/checkbox/checkbox.component.d.ts +2 -2
  36. package/checkbox/checkbox-panel/checkbox-panel.component.d.ts +3 -13
  37. package/checkbox/checkbox-panel/checkbox-panel.component.d.ts.map +1 -1
  38. package/checkbox/checkbox-panel/checkbox-panel.component.js +37 -39
  39. package/chip/chip/chip.component.d.ts +2 -3
  40. package/chip/chip/chip.component.d.ts.map +1 -1
  41. package/chip/chip/chip.component.js +31 -30
  42. package/chip/chip-group/chip-group.component.d.ts +4 -12
  43. package/chip/chip-group/chip-group.component.d.ts.map +1 -1
  44. package/chip/chip-group/chip-group.component.js +52 -46
  45. package/container/sticky-bar/sticky-bar.component.d.ts +6 -12
  46. package/container/sticky-bar/sticky-bar.component.d.ts.map +1 -1
  47. package/container/sticky-bar/sticky-bar.component.js +49 -49
  48. package/core/base-elements/open-close-base-element.d.ts +12 -22
  49. package/core/base-elements/open-close-base-element.d.ts.map +1 -1
  50. package/core/base-elements/open-close-base-element.js +23 -17
  51. package/core/eventing.d.ts +0 -1
  52. package/core/eventing.d.ts.map +1 -1
  53. package/core/eventing.js +10 -12
  54. package/core/interfaces/types.d.ts +0 -5
  55. package/core/interfaces/types.d.ts.map +1 -1
  56. package/core/interfaces.d.ts +0 -1
  57. package/core/interfaces.d.ts.map +1 -1
  58. package/core/mixins/disabled-mixin.d.ts.map +1 -1
  59. package/core/mixins/disabled-mixin.js +43 -40
  60. package/core/mixins/panel-mixin.d.ts.map +1 -1
  61. package/core/mixins/panel-mixin.js +35 -38
  62. package/core/mixins/readonly-mixin.d.ts.map +1 -1
  63. package/core/mixins/readonly-mixin.js +25 -19
  64. package/custom-elements.json +3348 -2340
  65. package/date-input/date-input.component.d.ts +0 -1
  66. package/date-input/date-input.component.d.ts.map +1 -1
  67. package/datepicker/datepicker/datepicker.component.d.ts +7 -9
  68. package/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  69. package/datepicker/datepicker/datepicker.component.js +34 -28
  70. package/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts +0 -1
  71. package/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts.map +1 -1
  72. package/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts +0 -1
  73. package/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts.map +1 -1
  74. package/development/accordion/accordion.component.js +3 -3
  75. package/development/action-group/action-group.component.js +1 -1
  76. package/development/alert/alert/alert.component.d.ts +4 -8
  77. package/development/alert/alert/alert.component.d.ts.map +1 -1
  78. package/development/alert/alert/alert.component.js +11 -9
  79. package/development/alert/alert-group/alert-group.component.d.ts +0 -3
  80. package/development/alert/alert-group/alert-group.component.d.ts.map +1 -1
  81. package/development/alert/alert-group/alert-group.component.js +14 -18
  82. package/development/autocomplete/autocomplete-base-element.d.ts +1 -1
  83. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  84. package/development/autocomplete/autocomplete-base-element.js +8 -9
  85. package/development/autocomplete/autocomplete.component.d.ts +0 -4
  86. package/development/autocomplete/autocomplete.component.d.ts.map +1 -1
  87. package/development/autocomplete/autocomplete.component.js +2 -2
  88. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts +0 -4
  89. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts.map +1 -1
  90. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +2 -2
  91. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +1 -1
  92. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
  93. package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +1 -1
  94. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts +0 -10
  95. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
  96. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +5 -9
  97. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
  98. package/development/breadcrumb/breadcrumb/breadcrumb.component.js +1 -1
  99. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +1 -1
  100. package/development/button/accent-button/accent-button.component.d.ts +0 -1
  101. package/development/button/accent-button/accent-button.component.d.ts.map +1 -1
  102. package/development/button/accent-button/accent-button.component.js +1 -1
  103. package/development/button/button/button.component.d.ts +0 -1
  104. package/development/button/button/button.component.d.ts.map +1 -1
  105. package/development/button/button/button.component.js +1 -1
  106. package/development/button/common/button-common.js +1 -1
  107. package/development/button/mini-button/mini-button.component.d.ts +0 -1
  108. package/development/button/mini-button/mini-button.component.d.ts.map +1 -1
  109. package/development/button/mini-button/mini-button.component.js +1 -1
  110. package/development/button/mini-button-group/mini-button-group.component.js +1 -1
  111. package/development/button/secondary-button/secondary-button.component.d.ts +0 -1
  112. package/development/button/secondary-button/secondary-button.component.d.ts.map +1 -1
  113. package/development/button/secondary-button/secondary-button.component.js +1 -1
  114. package/development/button/transparent-button/transparent-button.component.d.ts +0 -1
  115. package/development/button/transparent-button/transparent-button.component.d.ts.map +1 -1
  116. package/development/button/transparent-button/transparent-button.component.js +1 -1
  117. package/development/calendar/calendar.component.d.ts +1 -5
  118. package/development/calendar/calendar.component.d.ts.map +1 -1
  119. package/development/calendar/calendar.component.js +11 -9
  120. package/development/card/card/card.component.js +1 -1
  121. package/development/card/card-badge/card-badge.component.js +1 -1
  122. package/development/card/card-button/card-button.component.d.ts +0 -1
  123. package/development/card/card-button/card-button.component.d.ts.map +1 -1
  124. package/development/card/card-button/card-button.component.js +1 -1
  125. package/development/card/card-link/card-link.component.js +1 -1
  126. package/development/card/common/card-action-common.js +1 -1
  127. package/development/checkbox/checkbox/checkbox.component.d.ts +2 -2
  128. package/development/checkbox/checkbox/checkbox.component.js +1 -1
  129. package/development/checkbox/checkbox-group/checkbox-group.component.js +1 -1
  130. package/development/checkbox/checkbox-panel/checkbox-panel.component.d.ts +3 -13
  131. package/development/checkbox/checkbox-panel/checkbox-panel.component.d.ts.map +1 -1
  132. package/development/checkbox/checkbox-panel/checkbox-panel.component.js +14 -17
  133. package/development/checkbox/common/checkbox-common.js +1 -1
  134. package/development/chip/chip/chip.component.d.ts +2 -3
  135. package/development/chip/chip/chip.component.d.ts.map +1 -1
  136. package/development/chip/chip/chip.component.js +11 -10
  137. package/development/chip/chip-group/chip-group.component.d.ts +4 -12
  138. package/development/chip/chip-group/chip-group.component.d.ts.map +1 -1
  139. package/development/chip/chip-group/chip-group.component.js +20 -16
  140. package/development/chip-label/chip-label.component.js +1 -1
  141. package/development/clock/clock.component.js +1 -1
  142. package/development/container/container/container.component.js +1 -1
  143. package/development/container/sticky-bar/sticky-bar.component.d.ts +6 -12
  144. package/development/container/sticky-bar/sticky-bar.component.d.ts.map +1 -1
  145. package/development/container/sticky-bar/sticky-bar.component.js +20 -22
  146. package/development/core/a11y/arrow-navigation.js +1 -1
  147. package/development/core/a11y/focus-trap-controller.js +1 -1
  148. package/development/core/a11y/focus-visible-within-controller.js +1 -1
  149. package/development/core/a11y/input-modality-detector.js +1 -1
  150. package/development/core/a11y/interactivity-checker.js +1 -1
  151. package/development/core/a11y/live-announcer.js +1 -1
  152. package/development/core/base-elements/action-base-element.js +1 -1
  153. package/development/core/base-elements/button-base-element.js +1 -1
  154. package/development/core/base-elements/link-base-element.js +1 -1
  155. package/development/core/base-elements/open-close-base-element.d.ts +12 -22
  156. package/development/core/base-elements/open-close-base-element.d.ts.map +1 -1
  157. package/development/core/base-elements/open-close-base-element.js +17 -15
  158. package/development/core/config/config.js +1 -1
  159. package/development/core/controllers/escapable-overlay-controller.js +1 -1
  160. package/development/core/controllers/id-reference-controller.js +1 -1
  161. package/development/core/controllers/inert-controller.js +1 -1
  162. package/development/core/controllers/language-controller.js +1 -1
  163. package/development/core/controllers/media-matchers-controller.js +1 -1
  164. package/development/core/controllers/slot-state-controller.js +1 -1
  165. package/development/core/datetime/date-adapter.js +1 -1
  166. package/development/core/datetime/native-date-adapter.js +1 -1
  167. package/development/core/decorators/force-type.js +1 -1
  168. package/development/core/decorators/get-override.js +1 -1
  169. package/development/core/decorators/handle-distinct-change.js +1 -1
  170. package/development/core/decorators/host-attributes.js +1 -1
  171. package/development/core/decorators/id-reference.js +1 -1
  172. package/development/core/decorators/omit-empty-converter.js +1 -1
  173. package/development/core/decorators/plain-date.js +1 -1
  174. package/development/core/decorators/slot-state.js +1 -1
  175. package/development/core/dom/animation.js +1 -1
  176. package/development/core/dom/breakpoint.js +1 -1
  177. package/development/core/dom/host-context.js +1 -1
  178. package/development/core/dom/scroll.js +1 -1
  179. package/development/core/dom/set-or-remove-attribute.js +1 -1
  180. package/development/core/eventing/composed-path-has-attribute.js +1 -1
  181. package/development/core/eventing/form-element-handlers.js +1 -1
  182. package/development/core/eventing/throttle.js +1 -1
  183. package/development/core/eventing.d.ts +0 -1
  184. package/development/core/eventing.d.ts.map +1 -1
  185. package/development/core/eventing.js +1 -3
  186. package/development/core/i18n/i18n.js +1 -1
  187. package/development/core/interfaces/types.d.ts +0 -5
  188. package/development/core/interfaces/types.d.ts.map +1 -1
  189. package/development/core/interfaces.d.ts +0 -1
  190. package/development/core/interfaces.d.ts.map +1 -1
  191. package/development/core/mixins/animation-complete-mixin.js +1 -1
  192. package/development/core/mixins/disabled-mixin.d.ts.map +1 -1
  193. package/development/core/mixins/disabled-mixin.js +20 -17
  194. package/development/core/mixins/element-internals-mixin.js +1 -1
  195. package/development/core/mixins/form-associated-checkbox-mixin.js +1 -1
  196. package/development/core/mixins/form-associated-input-mixin.js +1 -1
  197. package/development/core/mixins/form-associated-mixin.js +1 -1
  198. package/development/core/mixins/form-associated-radio-button-mixin.js +1 -1
  199. package/development/core/mixins/hydration-mixin.js +1 -1
  200. package/development/core/mixins/named-slot-list-mixin.js +1 -1
  201. package/development/core/mixins/negative-mixin.js +1 -1
  202. package/development/core/mixins/panel-mixin.d.ts.map +1 -1
  203. package/development/core/mixins/panel-mixin.js +8 -14
  204. package/development/core/mixins/readonly-mixin.d.ts.map +1 -1
  205. package/development/core/mixins/readonly-mixin.js +17 -9
  206. package/development/core/mixins/required-mixin.js +1 -1
  207. package/development/core/mixins/update-scheduler-mixin.js +1 -1
  208. package/development/core/overlay/overlay-option-panel.js +1 -1
  209. package/development/core/overlay/overlay-trigger-attributes.js +1 -1
  210. package/development/core/overlay/position.js +1 -1
  211. package/development/core/testing/event-spy.js +1 -1
  212. package/development/core/testing/mocha-extensions.js +1 -1
  213. package/development/core/testing/wait-for-condition.js +1 -1
  214. package/development/core/testing/wait-for-image-ready.js +1 -1
  215. package/development/date-input/date-input.component.d.ts +0 -1
  216. package/development/date-input/date-input.component.d.ts.map +1 -1
  217. package/development/date-input/date-input.component.js +1 -1
  218. package/development/datepicker/common/datepicker-button.js +1 -1
  219. package/development/datepicker/datepicker/datepicker.component.d.ts +7 -9
  220. package/development/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  221. package/development/datepicker/datepicker/datepicker.component.js +16 -5
  222. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts +0 -1
  223. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts.map +1 -1
  224. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.js +1 -1
  225. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts +0 -1
  226. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts.map +1 -1
  227. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.js +1 -1
  228. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.js +1 -1
  229. package/development/dialog/dialog/dialog.component.d.ts +0 -4
  230. package/development/dialog/dialog/dialog.component.d.ts.map +1 -1
  231. package/development/dialog/dialog/dialog.component.js +3 -3
  232. package/development/dialog/dialog-actions/dialog-actions.component.js +1 -1
  233. package/development/dialog/dialog-content/dialog-content.component.js +1 -1
  234. package/development/dialog/dialog-title/dialog-title.component.js +1 -1
  235. package/development/divider/divider.component.js +1 -1
  236. package/development/expansion-panel/expansion-panel/expansion-panel.component.d.ts +4 -16
  237. package/development/expansion-panel/expansion-panel/expansion-panel.component.d.ts.map +1 -1
  238. package/development/expansion-panel/expansion-panel/expansion-panel.component.js +15 -20
  239. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +1 -1
  240. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts +1 -5
  241. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts.map +1 -1
  242. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +7 -11
  243. package/development/file-selector/common/file-selector-common.d.ts.map +1 -1
  244. package/development/file-selector/common/file-selector-common.js +16 -7
  245. package/development/file-selector/file-selector/file-selector.component.d.ts +1 -5
  246. package/development/file-selector/file-selector/file-selector.component.d.ts.map +1 -1
  247. package/development/file-selector/file-selector/file-selector.component.js +2 -2
  248. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts +1 -5
  249. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts.map +1 -1
  250. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +2 -2
  251. package/development/flip-card/flip-card/flip-card.component.d.ts +0 -4
  252. package/development/flip-card/flip-card/flip-card.component.d.ts.map +1 -1
  253. package/development/flip-card/flip-card/flip-card.component.js +7 -9
  254. package/development/flip-card/flip-card-details/flip-card-details.component.js +1 -1
  255. package/development/flip-card/flip-card-summary/flip-card-summary.component.js +1 -1
  256. package/development/footer/footer.component.js +1 -1
  257. package/development/form-error/form-error.component.js +1 -1
  258. package/development/form-field/form-field/form-field.component.js +2 -2
  259. package/development/form-field/form-field-clear/form-field-clear.component.d.ts +0 -1
  260. package/development/form-field/form-field-clear/form-field-clear.component.d.ts.map +1 -1
  261. package/development/form-field/form-field-clear/form-field-clear.component.js +1 -1
  262. package/development/header/common/header-action-common.js +1 -1
  263. package/development/header/header/header.component.js +1 -1
  264. package/development/header/header-button/header-button.component.d.ts +0 -1
  265. package/development/header/header-button/header-button.component.d.ts.map +1 -1
  266. package/development/header/header-button/header-button.component.js +1 -1
  267. package/development/icon/icon-base.js +1 -1
  268. package/development/icon/icon-name-mixin.js +1 -1
  269. package/development/icon/icon-request.js +1 -1
  270. package/development/icon/icon-validate.js +1 -1
  271. package/development/icon/icon.component.js +1 -1
  272. package/development/image/image.component.d.ts +0 -2
  273. package/development/image/image.component.d.ts.map +1 -1
  274. package/development/image/image.component.js +4 -2
  275. package/development/journey-header/journey-header.component.js +1 -1
  276. package/development/lead-container/lead-container.component.js +1 -1
  277. package/development/link/block-link-button/block-link-button.component.d.ts +0 -1
  278. package/development/link/block-link-button/block-link-button.component.d.ts.map +1 -1
  279. package/development/link/block-link-button/block-link-button.component.js +1 -1
  280. package/development/link/common/block-link-common.js +1 -1
  281. package/development/link/link-button/link-button.component.d.ts +0 -1
  282. package/development/link/link-button/link-button.component.d.ts.map +1 -1
  283. package/development/link/link-button/link-button.component.js +1 -1
  284. package/development/link-common-DPLJx5Uo.js +1 -1
  285. package/development/link-list/common/link-list-base.js +1 -1
  286. package/development/link-list/link-list/link-list.component.js +1 -1
  287. package/development/loading-indicator/loading-indicator.component.js +1 -1
  288. package/development/loading-indicator-circle/loading-indicator-circle.component.js +1 -1
  289. package/development/logo/logo.component.js +1 -1
  290. package/development/map-container/map-container.component.js +1 -1
  291. package/development/menu/common/menu-action-common.js +1 -1
  292. package/development/menu/menu/menu.component.d.ts +0 -4
  293. package/development/menu/menu/menu.component.d.ts.map +1 -1
  294. package/development/menu/menu/menu.component.js +5 -8
  295. package/development/menu/menu-button/menu-button.component.d.ts +0 -1
  296. package/development/menu/menu-button/menu-button.component.d.ts.map +1 -1
  297. package/development/menu/menu-button/menu-button.component.js +1 -1
  298. package/development/message/message.component.js +1 -1
  299. package/development/navigation/common/navigation-action-common.js +1 -1
  300. package/development/navigation/navigation/navigation.component.d.ts +0 -4
  301. package/development/navigation/navigation/navigation.component.d.ts.map +1 -1
  302. package/development/navigation/navigation/navigation.component.js +5 -8
  303. package/development/navigation/navigation-button/navigation-button.component.d.ts +0 -1
  304. package/development/navigation/navigation-button/navigation-button.component.d.ts.map +1 -1
  305. package/development/navigation/navigation-button/navigation-button.component.js +1 -1
  306. package/development/navigation/navigation-list/navigation-list.component.js +1 -1
  307. package/development/navigation/navigation-marker/navigation-marker.component.js +1 -1
  308. package/development/navigation/navigation-section/navigation-section.component.js +1 -1
  309. package/development/notification/notification.component.d.ts +5 -16
  310. package/development/notification/notification.component.d.ts.map +1 -1
  311. package/development/notification/notification.component.js +16 -18
  312. package/development/option/optgroup/optgroup-base-element.js +1 -1
  313. package/development/option/optgroup/optgroup.component.js +1 -1
  314. package/development/option/option/option-base-element.d.ts +8 -3
  315. package/development/option/option/option-base-element.d.ts.map +1 -1
  316. package/development/option/option/option-base-element.js +5 -4
  317. package/development/option/option/option.component.d.ts +3 -11
  318. package/development/option/option/option.component.d.ts.map +1 -1
  319. package/development/option/option/option.component.js +8 -11
  320. package/development/overlay/overlay-base-element.d.ts +2 -3
  321. package/development/overlay/overlay-base-element.d.ts.map +1 -1
  322. package/development/overlay/overlay-base-element.js +10 -5
  323. package/development/overlay/overlay.component.d.ts +4 -8
  324. package/development/overlay/overlay.component.d.ts.map +1 -1
  325. package/development/overlay/overlay.component.js +7 -7
  326. package/development/paginator/common/paginator-common.d.ts.map +1 -1
  327. package/development/paginator/common/paginator-common.js +12 -10
  328. package/development/paginator/compact-paginator/compact-paginator.component.d.ts +0 -2
  329. package/development/paginator/compact-paginator/compact-paginator.component.d.ts.map +1 -1
  330. package/development/paginator/compact-paginator/compact-paginator.component.js +1 -1
  331. package/development/paginator/paginator/paginator.component.d.ts +0 -2
  332. package/development/paginator/paginator/paginator.component.d.ts.map +1 -1
  333. package/development/paginator/paginator/paginator.component.js +1 -1
  334. package/development/popover/popover/popover.component.d.ts +7 -14
  335. package/development/popover/popover/popover.component.d.ts.map +1 -1
  336. package/development/popover/popover/popover.component.js +25 -10
  337. package/development/popover/popover-trigger/popover-trigger.component.d.ts +0 -1
  338. package/development/popover/popover-trigger/popover-trigger.component.d.ts.map +1 -1
  339. package/development/popover/popover-trigger/popover-trigger.component.js +1 -1
  340. package/development/radio-button/common/radio-button-common.js +1 -1
  341. package/development/radio-button/radio-button/radio-button.component.d.ts +3 -3
  342. package/development/radio-button/radio-button/radio-button.component.js +2 -2
  343. package/development/radio-button/radio-button-group/radio-button-group.component.d.ts +0 -6
  344. package/development/radio-button/radio-button-group/radio-button-group.component.d.ts.map +1 -1
  345. package/development/radio-button/radio-button-group/radio-button-group.component.js +7 -8
  346. package/development/radio-button/radio-button-panel/radio-button-panel.component.d.ts +3 -10
  347. package/development/radio-button/radio-button-panel/radio-button-panel.component.d.ts.map +1 -1
  348. package/development/radio-button/radio-button-panel/radio-button-panel.component.js +11 -12
  349. package/development/screen-reader-only/screen-reader-only.component.js +1 -1
  350. package/development/select/select.component.d.ts +6 -19
  351. package/development/select/select.component.d.ts.map +1 -1
  352. package/development/select/select.component.js +31 -44
  353. package/development/selection-expansion-panel/selection-expansion-panel.component.d.ts +6 -13
  354. package/development/selection-expansion-panel/selection-expansion-panel.component.d.ts.map +1 -1
  355. package/development/selection-expansion-panel/selection-expansion-panel.component.js +16 -21
  356. package/development/sidebar/icon-sidebar/icon-sidebar.component.js +1 -1
  357. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts +0 -1
  358. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -1
  359. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.js +1 -1
  360. package/development/sidebar/icon-sidebar-container/icon-sidebar-container.component.js +1 -1
  361. package/development/sidebar/icon-sidebar-content/icon-sidebar-content.component.js +1 -1
  362. package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.js +1 -1
  363. package/development/sidebar/sidebar/sidebar.component.d.ts +0 -4
  364. package/development/sidebar/sidebar/sidebar.component.d.ts.map +1 -1
  365. package/development/sidebar/sidebar/sidebar.component.js +5 -5
  366. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts +0 -1
  367. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts.map +1 -1
  368. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.js +1 -1
  369. package/development/sidebar/sidebar-container/sidebar-container.component.js +1 -1
  370. package/development/sidebar/sidebar-content/sidebar-content.component.js +1 -1
  371. package/development/sidebar/sidebar-title/sidebar-title.component.js +1 -1
  372. package/development/signet/signet.component.js +1 -1
  373. package/development/skiplink-list/skiplink-list.component.js +1 -1
  374. package/development/slider/slider.component.d.ts +2 -7
  375. package/development/slider/slider.component.d.ts.map +1 -1
  376. package/development/slider/slider.component.js +10 -14
  377. package/development/status/status.component.js +1 -1
  378. package/development/stepper/step/step.component.d.ts +2 -10
  379. package/development/stepper/step/step.component.d.ts.map +1 -1
  380. package/development/stepper/step/step.component.js +13 -11
  381. package/development/stepper/step-label/step-label.component.d.ts +0 -1
  382. package/development/stepper/step-label/step-label.component.d.ts.map +1 -1
  383. package/development/stepper/step-label/step-label.component.js +1 -1
  384. package/development/stepper/stepper/stepper.component.d.ts.map +1 -1
  385. package/development/stepper/stepper/stepper.component.js +2 -2
  386. package/development/table/table-wrapper/table-wrapper.component.js +1 -1
  387. package/development/tabs/tab/tab.component.js +1 -1
  388. package/development/tabs/tab-group/tab-group.component.d.ts +1 -4
  389. package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  390. package/development/tabs/tab-group/tab-group.component.js +21 -18
  391. package/development/tabs/tab-label/tab-label.component.js +1 -1
  392. package/development/tag/tag/tag.component.d.ts +0 -9
  393. package/development/tag/tag/tag.component.d.ts.map +1 -1
  394. package/development/tag/tag/tag.component.js +11 -19
  395. package/development/tag/tag-group/tag-group.component.js +1 -1
  396. package/development/teaser/teaser.component.js +1 -1
  397. package/development/teaser-hero/teaser-hero.component.js +1 -1
  398. package/development/teaser-product/common/teaser-product-common.js +1 -1
  399. package/development/teaser-product/teaser-product/teaser-product.component.js +1 -1
  400. package/development/time-input/time-input.component.d.ts +0 -1
  401. package/development/time-input/time-input.component.d.ts.map +1 -1
  402. package/development/time-input/time-input.component.js +1 -1
  403. package/development/timetable-occupancy/timetable-occupancy.component.js +1 -1
  404. package/development/timetable-occupancy-icon/timetable-occupancy-icon.component.js +1 -1
  405. package/development/title/title-base.js +1 -1
  406. package/development/toast/toast.component.d.ts +0 -4
  407. package/development/toast/toast.component.d.ts.map +1 -1
  408. package/development/toast/toast.component.js +5 -5
  409. package/development/toggle/toggle/toggle.component.d.ts +0 -3
  410. package/development/toggle/toggle/toggle.component.d.ts.map +1 -1
  411. package/development/toggle/toggle/toggle.component.js +6 -11
  412. package/development/toggle/toggle-option/toggle-option.component.js +1 -1
  413. package/development/toggle-check/toggle-check.component.d.ts +2 -2
  414. package/development/toggle-check/toggle-check.component.js +1 -1
  415. package/development/train/train/train.component.d.ts +1 -6
  416. package/development/train/train/train.component.d.ts.map +1 -1
  417. package/development/train/train/train.component.js +7 -12
  418. package/development/train/train-blocked-passage/train-blocked-passage.component.js +1 -1
  419. package/development/train/train-formation/train-formation.component.js +3 -3
  420. package/development/train/train-wagon/train-wagon.component.d.ts +1 -6
  421. package/development/train/train-wagon/train-wagon.component.d.ts.map +1 -1
  422. package/development/train/train-wagon/train-wagon.component.js +7 -12
  423. package/development/visual-checkbox/visual-checkbox.component.js +1 -1
  424. package/dialog/dialog/dialog.component.d.ts +0 -4
  425. package/dialog/dialog/dialog.component.d.ts.map +1 -1
  426. package/dialog/dialog/dialog.component.js +2 -2
  427. package/expansion-panel/expansion-panel/expansion-panel.component.d.ts +4 -16
  428. package/expansion-panel/expansion-panel/expansion-panel.component.d.ts.map +1 -1
  429. package/expansion-panel/expansion-panel/expansion-panel.component.js +48 -50
  430. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts +1 -5
  431. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts.map +1 -1
  432. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +26 -30
  433. package/file-selector/common/file-selector-common.d.ts.map +1 -1
  434. package/file-selector/common/file-selector-common.js +47 -37
  435. package/file-selector/file-selector/file-selector.component.d.ts +1 -5
  436. package/file-selector/file-selector/file-selector.component.d.ts.map +1 -1
  437. package/file-selector/file-selector/file-selector.component.js +3 -3
  438. package/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts +1 -5
  439. package/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts.map +1 -1
  440. package/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +5 -5
  441. package/flip-card/flip-card/flip-card.component.d.ts +0 -4
  442. package/flip-card/flip-card/flip-card.component.d.ts.map +1 -1
  443. package/flip-card/flip-card/flip-card.component.js +35 -37
  444. package/form-field/form-field/form-field.component.js +1 -1
  445. package/form-field/form-field-clear/form-field-clear.component.d.ts +0 -1
  446. package/form-field/form-field-clear/form-field-clear.component.d.ts.map +1 -1
  447. package/header/header-button/header-button.component.d.ts +0 -1
  448. package/header/header-button/header-button.component.d.ts.map +1 -1
  449. package/image/image.component.d.ts +0 -2
  450. package/image/image.component.d.ts.map +1 -1
  451. package/link/block-link-button/block-link-button.component.d.ts +0 -1
  452. package/link/block-link-button/block-link-button.component.d.ts.map +1 -1
  453. package/link/link-button/link-button.component.d.ts +0 -1
  454. package/link/link-button/link-button.component.d.ts.map +1 -1
  455. package/menu/menu/menu.component.d.ts +0 -4
  456. package/menu/menu/menu.component.d.ts.map +1 -1
  457. package/menu/menu/menu.component.js +8 -8
  458. package/menu/menu-button/menu-button.component.d.ts +0 -1
  459. package/menu/menu-button/menu-button.component.d.ts.map +1 -1
  460. package/navigation/navigation/navigation.component.d.ts +0 -4
  461. package/navigation/navigation/navigation.component.d.ts.map +1 -1
  462. package/navigation/navigation/navigation.component.js +17 -17
  463. package/navigation/navigation-button/navigation-button.component.d.ts +0 -1
  464. package/navigation/navigation-button/navigation-button.component.d.ts.map +1 -1
  465. package/notification/notification.component.d.ts +5 -16
  466. package/notification/notification.component.d.ts.map +1 -1
  467. package/notification/notification.component.js +54 -53
  468. package/option/option/option-base-element.d.ts +8 -3
  469. package/option/option/option-base-element.d.ts.map +1 -1
  470. package/option/option/option-base-element.js +22 -20
  471. package/option/option/option.component.d.ts +3 -11
  472. package/option/option/option.component.d.ts.map +1 -1
  473. package/option/option/option.component.js +23 -25
  474. package/overlay/overlay-base-element.d.ts +2 -3
  475. package/overlay/overlay-base-element.d.ts.map +1 -1
  476. package/overlay/overlay-base-element.js +42 -37
  477. package/overlay/overlay.component.d.ts +4 -8
  478. package/overlay/overlay.component.d.ts.map +1 -1
  479. package/overlay/overlay.component.js +11 -11
  480. package/package.json +1 -1
  481. package/paginator/common/paginator-common.d.ts.map +1 -1
  482. package/paginator/common/paginator-common.js +37 -34
  483. package/paginator/compact-paginator/compact-paginator.component.d.ts +0 -2
  484. package/paginator/compact-paginator/compact-paginator.component.d.ts.map +1 -1
  485. package/paginator/paginator/paginator.component.d.ts +0 -2
  486. package/paginator/paginator/paginator.component.d.ts.map +1 -1
  487. package/popover/popover/popover.component.d.ts +7 -14
  488. package/popover/popover/popover.component.d.ts.map +1 -1
  489. package/popover/popover/popover.component.js +94 -81
  490. package/popover/popover-trigger/popover-trigger.component.d.ts +0 -1
  491. package/popover/popover-trigger/popover-trigger.component.d.ts.map +1 -1
  492. package/radio-button/radio-button/radio-button.component.d.ts +3 -3
  493. package/radio-button/radio-button/radio-button.component.js +10 -10
  494. package/radio-button/radio-button-group/radio-button-group.component.d.ts +0 -6
  495. package/radio-button/radio-button-group/radio-button-group.component.d.ts.map +1 -1
  496. package/radio-button/radio-button-group/radio-button-group.component.js +24 -26
  497. package/radio-button/radio-button-panel/radio-button-panel.component.d.ts +3 -10
  498. package/radio-button/radio-button-panel/radio-button-panel.component.d.ts.map +1 -1
  499. package/radio-button/radio-button-panel/radio-button-panel.component.js +39 -40
  500. package/select/select.component.d.ts +6 -19
  501. package/select/select.component.d.ts.map +1 -1
  502. package/select/select.component.js +99 -101
  503. package/selection-expansion-panel/selection-expansion-panel.component.d.ts +6 -13
  504. package/selection-expansion-panel/selection-expansion-panel.component.d.ts.map +1 -1
  505. package/selection-expansion-panel/selection-expansion-panel.component.js +49 -51
  506. package/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts +0 -1
  507. package/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -1
  508. package/sidebar/sidebar/sidebar.component.d.ts +0 -4
  509. package/sidebar/sidebar/sidebar.component.d.ts.map +1 -1
  510. package/sidebar/sidebar/sidebar.component.js +28 -28
  511. package/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts +0 -1
  512. package/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts.map +1 -1
  513. package/slider/slider.component.d.ts +2 -7
  514. package/slider/slider.component.d.ts.map +1 -1
  515. package/slider/slider.component.js +38 -43
  516. package/stepper/step/step.component.d.ts +2 -10
  517. package/stepper/step/step.component.d.ts.map +1 -1
  518. package/stepper/step/step.component.js +26 -23
  519. package/stepper/step-label/step-label.component.d.ts +0 -1
  520. package/stepper/step-label/step-label.component.d.ts.map +1 -1
  521. package/stepper/stepper/stepper.component.d.ts.map +1 -1
  522. package/stepper/stepper/stepper.component.js +6 -6
  523. package/tabs/tab-group/tab-group.component.d.ts +1 -4
  524. package/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  525. package/tabs/tab-group/tab-group.component.js +55 -52
  526. package/tag/tag/tag.component.d.ts +0 -9
  527. package/tag/tag/tag.component.d.ts.map +1 -1
  528. package/tag/tag/tag.component.js +34 -40
  529. package/time-input/time-input.component.d.ts +0 -1
  530. package/time-input/time-input.component.d.ts.map +1 -1
  531. package/toast/toast.component.d.ts +0 -4
  532. package/toast/toast.component.d.ts.map +1 -1
  533. package/toast/toast.component.js +19 -19
  534. package/toggle/toggle/toggle.component.d.ts +0 -3
  535. package/toggle/toggle/toggle.component.d.ts.map +1 -1
  536. package/toggle/toggle/toggle.component.js +35 -40
  537. package/toggle-check/toggle-check.component.d.ts +2 -2
  538. package/train/train/train.component.d.ts +1 -6
  539. package/train/train/train.component.d.ts.map +1 -1
  540. package/train/train/train.component.js +33 -38
  541. package/train/train-formation/train-formation.component.js +1 -1
  542. package/train/train-wagon/train-wagon.component.d.ts +1 -6
  543. package/train/train-wagon/train-wagon.component.d.ts.map +1 -1
  544. package/train/train-wagon/train-wagon.component.js +48 -53
  545. package/core/eventing/event-emitter.d.ts +0 -23
  546. package/core/eventing/event-emitter.d.ts.map +0 -1
  547. package/core/eventing/event-emitter.js +0 -22
  548. package/core/interfaces/validation-change.d.ts +0 -4
  549. package/core/interfaces/validation-change.d.ts.map +0 -1
  550. package/development/core/eventing/event-emitter.d.ts +0 -23
  551. package/development/core/eventing/event-emitter.d.ts.map +0 -1
  552. package/development/core/eventing/event-emitter.js +0 -25
  553. package/development/core/interfaces/validation-change.d.ts +0 -4
  554. package/development/core/interfaces/validation-change.d.ts.map +0 -1
@@ -17,7 +17,6 @@ import { SbbOpenCloseBaseElement } from "../core/base-elements.js";
17
17
  import { SbbEscapableOverlayController, SbbLanguageController } from "../core/controllers.js";
18
18
  import { forceType, handleDistinctChange, getOverride } from "../core/decorators.js";
19
19
  import { isLean, setOrRemoveAttribute, isZeroAnimationDuration, isNextjs, isSafari } from "../core/dom.js";
20
- import { EventEmitter } from "../core/eventing.js";
21
20
  import { i18nSelectionRequired } from "../core/i18n.js";
22
21
  import { SbbUpdateSchedulerMixin, SbbDisabledMixin, SbbNegativeMixin, SbbHydrationMixin, SbbRequiredMixin, SbbReadonlyMixin, SbbFormAssociatedMixin } from "../core/mixins.js";
23
22
  import { isEventOnElement, setOverlayPosition, overlayGapFixCorners } from "../core/overlay.js";
@@ -324,7 +323,6 @@ let SbbSelectElement = (() => {
324
323
  let _classExtraInitializers = [];
325
324
  let _classThis;
326
325
  let _classSuper = SbbUpdateSchedulerMixin(SbbDisabledMixin(SbbNegativeMixin(SbbHydrationMixin(SbbRequiredMixin(SbbReadonlyMixin(SbbFormAssociatedMixin(SbbOpenCloseBaseElement)))))));
327
- let _instanceExtraInitializers = [];
328
326
  let _placeholder_decorators;
329
327
  let _placeholder_initializers = [];
330
328
  let _placeholder_extraInitializers = [];
@@ -334,7 +332,6 @@ let SbbSelectElement = (() => {
334
332
  let _disabled_decorators;
335
333
  let _disabled_initializers = [];
336
334
  let _disabled_extraInitializers = [];
337
- let _set_readOnly_decorators;
338
335
  let _value_decorators;
339
336
  let _value_initializers = [];
340
337
  let _value_extraInitializers = [];
@@ -344,7 +341,7 @@ let SbbSelectElement = (() => {
344
341
  let __displayValue_decorators;
345
342
  let __displayValue_initializers = [];
346
343
  let __displayValue_extraInitializers = [];
347
- var SbbSelectElement2 = (_a = class extends _classSuper {
344
+ _a = class extends _classSuper {
348
345
  constructor() {
349
346
  super();
350
347
  __privateAdd(this, _placeholder_accessor_storage);
@@ -353,16 +350,13 @@ let SbbSelectElement = (() => {
353
350
  __privateAdd(this, _value_accessor_storage);
354
351
  __privateAdd(this, _size_accessor_storage);
355
352
  __privateAdd(this, __displayValue_accessor_storage);
356
- __privateSet(this, _placeholder_accessor_storage, (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _placeholder_initializers, "")));
353
+ __privateSet(this, _placeholder_accessor_storage, __runInitializers(this, _placeholder_initializers, ""));
357
354
  __privateSet(this, _multiple_accessor_storage, (__runInitializers(this, _placeholder_extraInitializers), __runInitializers(this, _multiple_initializers, false)));
358
355
  __privateSet(this, _disabled_accessor_storage, (__runInitializers(this, _multiple_extraInitializers), __runInitializers(this, _disabled_initializers, false)));
359
356
  __privateSet(this, _value_accessor_storage, (__runInitializers(this, _disabled_extraInitializers), __runInitializers(this, _value_initializers, null)));
360
357
  __privateSet(this, _size_accessor_storage, (__runInitializers(this, _value_extraInitializers), __runInitializers(this, _size_initializers, isLean() ? "s" : "m")));
361
358
  __privateSet(this, __displayValue_accessor_storage, (__runInitializers(this, _size_extraInitializers), __runInitializers(this, __displayValue_initializers, null)));
362
- this._change = (__runInitializers(this, __displayValue_extraInitializers), new EventEmitter(this, SbbSelectElement2.events.change));
363
- this._input = new EventEmitter(this, SbbSelectElement2.events.input);
364
- this._displayValueChanged = new EventEmitter(this, SbbSelectElement2.events.displayValueChange);
365
- this._originResizeObserver = new ResizeController(this, {
359
+ this._originResizeObserver = (__runInitializers(this, __displayValue_extraInitializers), new ResizeController(this, {
366
360
  target: null,
367
361
  skipInitial: true,
368
362
  callback: () => {
@@ -370,7 +364,7 @@ let SbbSelectElement = (() => {
370
364
  this._setOverlayPosition();
371
365
  }
372
366
  }
373
- });
367
+ }));
374
368
  this._escapableOverlayController = new SbbEscapableOverlayController(this);
375
369
  this._overlayId = `sbb-select-${++nextId}`;
376
370
  this._activeItemIndex = -1;
@@ -386,7 +380,7 @@ let SbbSelectElement = (() => {
386
380
  this.close();
387
381
  }
388
382
  };
389
- this.addEventListener?.("optionSelectionChange", (e) => this._onOptionChanged(e));
383
+ this.addEventListener?.("optionselectionchange", (e) => this._onOptionChanged(e));
390
384
  this.addEventListener?.("optionLabelChanged", (e) => this._onOptionLabelChanged(e));
391
385
  this.addEventListener?.("click", (e) => {
392
386
  const target = e.target;
@@ -424,11 +418,6 @@ let SbbSelectElement = (() => {
424
418
  set disabled(value) {
425
419
  __privateSet(this, _disabled_accessor_storage, value);
426
420
  }
427
- /** Whether the select is readonly. */
428
- set readOnly(value) {
429
- this._closeOnDisabledReadonlyChanged(value);
430
- super.readOnly = value;
431
- }
432
421
  /** Value of the form element. */
433
422
  get value() {
434
423
  return __privateGet(this, _value_accessor_storage);
@@ -487,10 +476,7 @@ let SbbSelectElement = (() => {
487
476
  }
488
477
  /** Opens the selection panel. */
489
478
  open() {
490
- if (this.state !== "closed" || !this._overlay || this._options.length === 0 || this.disabled || this.formDisabled) {
491
- return;
492
- }
493
- if (!this.willOpen.emit()) {
479
+ if (this.state !== "closed" || !this._overlay || this._options.length === 0 || this.disabled || this.formDisabled || !this.dispatchBeforeOpenEvent()) {
494
480
  return;
495
481
  }
496
482
  this.shadowRoot?.querySelector(".sbb-select__container")?.showPopover?.();
@@ -503,10 +489,7 @@ let SbbSelectElement = (() => {
503
489
  }
504
490
  /** Closes the selection panel. */
505
491
  close() {
506
- if (this.state !== "opened") {
507
- return;
508
- }
509
- if (!this.willClose.emit()) {
492
+ if (this.state !== "opened" || !this.dispatchBeforeCloseEvent()) {
510
493
  return;
511
494
  }
512
495
  this.state = "closing";
@@ -552,7 +535,7 @@ let SbbSelectElement = (() => {
552
535
  } else {
553
536
  this._displayValue = null;
554
537
  }
555
- this._displayValueChanged.emit();
538
+ this.dispatchEvent(new Event("displayvaluechange", { bubbles: true, composed: true }));
556
539
  }
557
540
  /**
558
541
  * The `value` property should be adapted when the `multiple` property changes:
@@ -648,6 +631,9 @@ let SbbSelectElement = (() => {
648
631
  if (changedProperties.has("negative") || changedProperties.has("multiple")) {
649
632
  this._syncProperties();
650
633
  }
634
+ if (changedProperties.has("readOnly")) {
635
+ this._closeOnDisabledReadonlyChanged(this.readOnly);
636
+ }
651
637
  }
652
638
  disconnectedCallback() {
653
639
  super.disconnectedCallback();
@@ -742,7 +728,7 @@ let SbbSelectElement = (() => {
742
728
  if (this._originElement) {
743
729
  this._originResizeObserver.observe(this._originElement);
744
730
  }
745
- this.didOpen.emit();
731
+ this.dispatchOpenEvent();
746
732
  }
747
733
  _handleClosing() {
748
734
  this.state = "closed";
@@ -751,7 +737,7 @@ let SbbSelectElement = (() => {
751
737
  this._resetActiveElement();
752
738
  this._optionContainer.scrollTop = 0;
753
739
  this._escapableOverlayController.disconnect();
754
- this.didClose.emit();
740
+ this.dispatchCloseEvent();
755
741
  }
756
742
  /** When an option is selected, updates the displayValue; it also closes the select if not `multiple`. */
757
743
  _onOptionSelected(optionSelectionChange) {
@@ -765,17 +751,22 @@ let SbbSelectElement = (() => {
765
751
  this.value = [...this.value, optionSelectionChange.value];
766
752
  }
767
753
  }
768
- this._input.emit();
769
- this._change.emit();
754
+ this._dispatchInputEvents();
770
755
  }
771
756
  /** When an option is unselected in `multiple`, removes it from value and updates displayValue. */
772
757
  _onOptionDeselected(optionSelectionChange) {
773
758
  if (this.multiple && Array.isArray(this.value)) {
774
759
  this.value = this.value.filter((el) => el !== optionSelectionChange.value);
775
- this._input.emit();
776
- this._change.emit();
760
+ this._dispatchInputEvents();
777
761
  }
778
762
  }
763
+ _dispatchInputEvents() {
764
+ this.dispatchEvent(new InputEvent("input", {
765
+ bubbles: true,
766
+ composed: true
767
+ }));
768
+ this.dispatchEvent(new Event("change", { bubbles: true }));
769
+ }
779
770
  _attachOpenPanelEvents() {
780
771
  this._openPanelEventsController = new AbortController();
781
772
  document.addEventListener("scroll", () => this._setOverlayPosition(), {
@@ -1030,7 +1021,6 @@ let SbbSelectElement = (() => {
1030
1021
  _placeholder_decorators = [forceType(), property()];
1031
1022
  _multiple_decorators = [forceType(), handleDistinctChange((e, newValue) => e._onMultipleChanged(newValue)), property({ reflect: true, type: Boolean })];
1032
1023
  _disabled_decorators = [forceType(), handleDistinctChange((e, newValue) => e._closeOnDisabledReadonlyChanged(newValue)), property({ reflect: true, type: Boolean }), getOverride((e, v) => v || e.isDisabledExternally())];
1033
- _set_readOnly_decorators = [forceType(), property({ type: Boolean, attribute: "readonly" })];
1034
1024
  _value_decorators = [property()];
1035
1025
  _size_decorators = [property({ reflect: true })];
1036
1026
  __displayValue_decorators = [state()];
@@ -1043,9 +1033,6 @@ let SbbSelectElement = (() => {
1043
1033
  __esDecorate(_a, null, _disabled_decorators, { kind: "accessor", name: "disabled", static: false, private: false, access: { has: (obj) => "disabled" in obj, get: (obj) => obj.disabled, set: (obj, value) => {
1044
1034
  obj.disabled = value;
1045
1035
  } }, metadata: _metadata }, _disabled_initializers, _disabled_extraInitializers);
1046
- __esDecorate(_a, null, _set_readOnly_decorators, { kind: "setter", name: "readOnly", static: false, private: false, access: { has: (obj) => "readOnly" in obj, set: (obj, value) => {
1047
- obj.readOnly = value;
1048
- } }, metadata: _metadata }, null, _instanceExtraInitializers);
1049
1036
  __esDecorate(_a, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: (obj) => "value" in obj, get: (obj) => obj.value, set: (obj, value) => {
1050
1037
  obj.value = value;
1051
1038
  } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
@@ -1056,20 +1043,20 @@ let SbbSelectElement = (() => {
1056
1043
  obj._displayValue = value;
1057
1044
  } }, metadata: _metadata }, __displayValue_initializers, __displayValue_extraInitializers);
1058
1045
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1059
- SbbSelectElement2 = _classThis = _classDescriptor.value;
1046
+ _classThis = _classDescriptor.value;
1060
1047
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1061
1048
  })(), _a.role = ariaRoleOnHost ? "listbox" : null, _a.styles = style, _a.events = {
1062
1049
  change: "change",
1063
1050
  input: "input",
1064
- displayValueChange: "displayValueChange",
1065
- willOpen: "willOpen",
1066
- didOpen: "didOpen",
1067
- willClose: "willClose",
1068
- didClose: "didClose"
1069
- }, __runInitializers(_classThis, _classExtraInitializers), _a);
1070
- return SbbSelectElement2 = _classThis;
1051
+ displayvaluechange: "displayvaluechange",
1052
+ beforeopen: "beforeopen",
1053
+ open: "open",
1054
+ beforeclose: "beforeclose",
1055
+ close: "close"
1056
+ }, __runInitializers(_classThis, _classExtraInitializers), _a;
1057
+ return _classThis;
1071
1058
  })();
1072
1059
  export {
1073
1060
  SbbSelectElement
1074
1061
  };
1075
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE11dGF0aW9uQ29udHJvbGxlciB9IGZyb20gJ0BsaXQtbGFicy9vYnNlcnZlcnMvbXV0YXRpb24tY29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyBSZXNpemVDb250cm9sbGVyIH0gZnJvbSAnQGxpdC1sYWJzL29ic2VydmVycy9yZXNpemUtY29udHJvbGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgaXNTZXJ2ZXIsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHVudGlsIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW50aWwuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4IH0gZnJvbSAnLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLCBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSwgZ2V0T3ZlcnJpZGUsIGhhbmRsZURpc3RpbmN0Q2hhbmdlIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7XG4gIGlzTGVhbixcbiAgaXNOZXh0anMsXG4gIGlzU2FmYXJpLFxuICBpc1plcm9BbmltYXRpb25EdXJhdGlvbixcbiAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUsXG59IGZyb20gJy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvcmUvZXZlbnRpbmcuanMnO1xuaW1wb3J0IHsgaTE4blNlbGVjdGlvblJlcXVpcmVkIH0gZnJvbSAnLi4vY29yZS9pMThuLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybVJlc3RvcmVSZWFzb24sXG4gIHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSxcbiAgU2JiRGlzYWJsZWRNaXhpbixcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgU2JiSHlkcmF0aW9uTWl4aW4sXG4gIFNiYk5lZ2F0aXZlTWl4aW4sXG4gIFNiYlJlYWRvbmx5TWl4aW4sXG4gIFNiYlJlcXVpcmVkTWl4aW4sXG4gIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluLFxufSBmcm9tICcuLi9jb3JlL21peGlucy5qcyc7XG5pbXBvcnQgeyBpc0V2ZW50T25FbGVtZW50LCBvdmVybGF5R2FwRml4Q29ybmVycywgc2V0T3ZlcmxheVBvc2l0aW9uIH0gZnJvbSAnLi4vY29yZS9vdmVybGF5LmpzJztcbmltcG9ydCB0eXBlIHsgU2JiT3B0R3JvdXBFbGVtZW50LCBTYmJPcHRpb25FbGVtZW50IH0gZnJvbSAnLi4vb3B0aW9uLmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vc2VsZWN0LnNjc3M/bGl0JmlubGluZSc7XG5cbi8qKlxuICogT24gU2FmYXJpLCB0aGUgYXJpYSByb2xlICdsaXN0Ym94JyBtdXN0IGJlIG9uIHRoZSBob3N0IGVsZW1lbnQsIG9yIGVsc2UgVm9pY2VPdmVyIHdvbid0IHdvcmsgYXQgYWxsLlxuICogT24gdGhlIG90aGVyIGhhbmQsIEpBV1MgYW5kIE5WREEgbmVlZCB0aGUgcm9sZSB0byBiZSBhbiBcImltbWVkaWF0ZSBwYXJlbnRcIiB0byB0aGUgb3B0aW9ucywgb3IgZWxzZSBvcHRncm91cHMgd29uJ3Qgd29yay5cbiAqL1xuY29uc3QgYXJpYVJvbGVPbkhvc3QgPSBpc1NhZmFyaTtcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogSXQgZGlzcGxheXMgYSBwYW5lbCB3aXRoIHNlbGVjdGFibGUgb3B0aW9ucy5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBvcHRpb25zLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gY2hhbmdlIC0gTm90aWZpZXMgdGhhdCB0aGUgY29tcG9uZW50J3MgdmFsdWUgaGFzIGNoYW5nZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBpbnB1dCAtIE5vdGlmaWVzIHRoYXQgYW4gb3B0aW9uIHZhbHVlIGhhcyBiZWVuIHNlbGVjdGVkLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gd2lsbE9wZW4gLSBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1zZWxlY3RgIHN0YXJ0cyB0aGUgb3BlbmluZyB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBkaWRPcGVuIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItc2VsZWN0YCBpcyBvcGVuZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSB3aWxsQ2xvc2UgLSBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1zZWxlY3RgIGJlZ2lucyB0aGUgY2xvc2luZyB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBkaWRDbG9zZSAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXNlbGVjdGAgaXMgY2xvc2VkLlxuICogQGNzc3Byb3AgWy0tc2JiLXNlbGVjdC16LWluZGV4PXZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleCldIC0gVG8gc3BlY2lmeSBhIGN1c3RvbSBzdGFjayBvcmRlcixcbiAqIHRoZSBgei1pbmRleGAgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgdGhpcyBDU1MgdmFyaWFibGUuIFRoZSBkZWZhdWx0IGB6LWluZGV4YCBvZiB0aGVcbiAqIGNvbXBvbmVudCBpcyBzZXQgdG8gYHZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleClgIHdpdGggYSB2YWx1ZSBvZiBgMTAwMGAuXG4gKiBAb3ZlcnJpZGVUeXBlIHZhbHVlIC0gKFQgPSBzdHJpbmcgfCBzdHJpbmdbXSkgfCBudWxsXG4gKi9cbmV4cG9ydFxuQGN1c3RvbUVsZW1lbnQoJ3NiYi1zZWxlY3QnKVxuY2xhc3MgU2JiU2VsZWN0RWxlbWVudDxUID0gc3RyaW5nPiBleHRlbmRzIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluKFxuICBTYmJEaXNhYmxlZE1peGluKFxuICAgIFNiYk5lZ2F0aXZlTWl4aW4oXG4gICAgICBTYmJIeWRyYXRpb25NaXhpbihcbiAgICAgICAgU2JiUmVxdWlyZWRNaXhpbihcbiAgICAgICAgICBTYmJSZWFkb25seU1peGluKFxuICAgICAgICAgICAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbjx0eXBlb2YgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQ+KFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuKSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgcm9sZSA9IGFyaWFSb2xlT25Ib3N0ID8gJ2xpc3Rib3gnIDogbnVsbDtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGU7XG5cbiAgLy8gVE9ETzogZml4IHVzaW5nIC4uLnN1cGVyLmV2ZW50cyByZXF1aXJlczogaHR0cHM6Ly9naXRodWIuY29tL3NiYi1kZXNpZ24tc3lzdGVtcy9seW5lLWNvbXBvbmVudHMvaXNzdWVzLzI2MDBcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBldmVudHMgPSB7XG4gICAgY2hhbmdlOiAnY2hhbmdlJyxcbiAgICBpbnB1dDogJ2lucHV0JyxcbiAgICBkaXNwbGF5VmFsdWVDaGFuZ2U6ICdkaXNwbGF5VmFsdWVDaGFuZ2UnLFxuICAgIHdpbGxPcGVuOiAnd2lsbE9wZW4nLFxuICAgIGRpZE9wZW46ICdkaWRPcGVuJyxcbiAgICB3aWxsQ2xvc2U6ICd3aWxsQ2xvc2UnLFxuICAgIGRpZENsb3NlOiAnZGlkQ2xvc2UnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgcGxhY2Vob2xkZXIgdXNlZCBpZiBubyB2YWx1ZSBoYXMgYmVlbiBzZWxlY3RlZC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBhY2Nlc3NvciBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNlbGVjdCBhbGxvd3MgZm9yIG11bHRpcGxlIHNlbGVjdGlvbi4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBoYW5kbGVEaXN0aW5jdENoYW5nZSgoZTogU2JiU2VsZWN0RWxlbWVudDxUPiwgbmV3VmFsdWU6IGJvb2xlYW4pID0+XG4gICAgZS5fb25NdWx0aXBsZUNoYW5nZWQobmV3VmFsdWUpLFxuICApXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBoYW5kbGVEaXN0aW5jdENoYW5nZSgoZTogU2JiU2VsZWN0RWxlbWVudDxUPiwgbmV3VmFsdWU6IGJvb2xlYW4pID0+XG4gICAgZS5fY2xvc2VPbkRpc2FibGVkUmVhZG9ubHlDaGFuZ2VkKG5ld1ZhbHVlKSxcbiAgKVxuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIEBnZXRPdmVycmlkZSgoZTogU2JiU2VsZWN0RWxlbWVudDxUPiwgdjogYm9vbGVhbik6IGJvb2xlYW4gPT4gdiB8fCBlLmlzRGlzYWJsZWRFeHRlcm5hbGx5KCkpXG4gIHB1YmxpYyBvdmVycmlkZSBhY2Nlc3NvciBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgaXMgcmVhZG9ubHkuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdyZWFkb25seScgfSlcbiAgcHVibGljIG92ZXJyaWRlIHNldCByZWFkT25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Nsb3NlT25EaXNhYmxlZFJlYWRvbmx5Q2hhbmdlZCh2YWx1ZSk7XG4gICAgc3VwZXIucmVhZE9ubHkgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBWYWx1ZSBvZiB0aGUgZm9ybSBlbGVtZW50LiAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgdmFsdWU6IFQgfCBUW10gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogU2l6ZSB2YXJpYW50LCBlaXRoZXIgbSBvciBzLlxuICAgKiBAZGVmYXVsdCAnbScgLyAncycgKGxlYW4pXG4gICAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBzaXplOiAnbScgfCAncycgPSBpc0xlYW4oKSA/ICdzJyA6ICdtJztcblxuICAvKipcbiAgICogRm9ybSB0eXBlIG9mIGVsZW1lbnQuXG4gICAqIEBkZWZhdWx0ICdzZWxlY3Qtb25lIC8gc2VsZWN0LW11bHRpcGxlJ1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyAnc2VsZWN0LW11bHRpcGxlJyA6ICdzZWxlY3Qtb25lJztcbiAgfVxuXG4gIC8qKiBUaGUgdmFsdWUgZGlzcGxheWVkIGJ5IHRoZSBjb21wb25lbnQuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX2Rpc3BsYXlWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE5vdGlmaWVzIHRoYXQgdGhlIGNvbXBvbmVudCdzIHZhbHVlIGhhcyBjaGFuZ2VkLiAqL1xuICBwcml2YXRlIF9jaGFuZ2U6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIodGhpcywgU2JiU2VsZWN0RWxlbWVudC5ldmVudHMuY2hhbmdlKTtcblxuICAvKiogTm90aWZpZXMgdGhhdCBhbiBvcHRpb24gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuICovXG4gIHByaXZhdGUgX2lucHV0OiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNiYlNlbGVjdEVsZW1lbnQuZXZlbnRzLmlucHV0KTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2Rpc3BsYXlWYWx1ZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJTZWxlY3RFbGVtZW50LmV2ZW50cy5kaXNwbGF5VmFsdWVDaGFuZ2UsXG4gICk7XG5cbiAgcHJpdmF0ZSBfb3JpZ2luUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplQ29udHJvbGxlcih0aGlzLCB7XG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIHNraXBJbml0aWFsOiB0cnVlLFxuICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfb3ZlcmxheSE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcHRpb25Db250YWluZXIhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfb3JpZ2luRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF90cmlnZ2VyRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyITogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlciA9IG5ldyBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfb3ZlcmxheUlkID0gYHNiYi1zZWxlY3QtJHsrK25leHRJZH1gO1xuICBwcml2YXRlIF9hY3RpdmVJdGVtSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBfc2VhcmNoVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIF9zZWFyY2hTdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfZGlkTG9hZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb250cm9sbGVyID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcblxuICAvKipcbiAgICogVGhlICdjb21ib2JveCcgaW5wdXQgZWxlbWVudFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fdHJpZ2dlckVsZW1lbnQ7XG4gIH1cblxuICAvKiogR2V0cyBhbGwgdGhlIFNiYk9wdGlvbkVsZW1lbnQgcHJvamVjdGVkIGluIHRoZSBzZWxlY3QuICovXG4gIHByaXZhdGUgZ2V0IF9vcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPy48U2JiT3B0aW9uRWxlbWVudDxUPj4oJ3NiYi1vcHRpb24nKSA/PyBbXSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZmlsdGVyZWRPcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZmlsdGVyKChvcHQpID0+ICFvcHQuZGlzYWJsZWQgJiYgIW9wdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ3JvdXAtZGlzYWJsZWQnKSk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Lignb3B0aW9uU2VsZWN0aW9uQ2hhbmdlJywgKGU6IEN1c3RvbUV2ZW50PHZvaWQ+KSA9PlxuICAgICAgdGhpcy5fb25PcHRpb25DaGFuZ2VkKGUpLFxuICAgICk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ29wdGlvbkxhYmVsQ2hhbmdlZCcsIChlOiBFdmVudCkgPT4gdGhpcy5fb25PcHRpb25MYWJlbENoYW5nZWQoZSkpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdjbGljaycsIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBTYmJTZWxlY3RFbGVtZW50PFQ+IHwgU2JiT3B0aW9uRWxlbWVudDxUPjtcbiAgICAgIGlmICh0YXJnZXQubG9jYWxOYW1lID09PSAnc2JiLW9wdGlvbicpIHtcbiAgICAgICAgLy8gT3B0aW9uIGNsaWNrXG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiAhdGFyZ2V0LmRpc2FibGVkKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdG9nZ2xlT3BlbmluZygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDb250cm9sbGVyKFxuICAgICAgbmV3IE11dGF0aW9uQ29udHJvbGxlcih0aGlzLCB7XG4gICAgICAgIGNvbmZpZzogeyBhdHRyaWJ1dGVGaWx0ZXI6IFsnYXJpYS1sYWJlbGxlZGJ5JywgJ2FyaWEtbGFiZWwnLCAnYXJpYS1kZXNjcmliZWRieSddIH0sXG4gICAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLl9zeW5jQXJpYUxhYmVscygpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNBcmlhTGFiZWxzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdHJpZ2dlckVsZW1lbnQgfHwgaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRPclJlbW92ZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LFxuICAgICAgJ2FyaWEtbGFiZWxsZWRieScsXG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JyksXG4gICAgKTtcbiAgICBzZXRPclJlbW92ZUF0dHJpYnV0ZSh0aGlzLl90cmlnZ2VyRWxlbWVudCwgJ2FyaWEtbGFiZWwnLCB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpKTtcbiAgICBzZXRPclJlbW92ZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LFxuICAgICAgJ2FyaWEtZGVzY3JpYmVkYnknLFxuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKSxcbiAgICApO1xuXG4gICAgLy8gVXNpbmcgdGhlIGFzc29jaWF0ZWQgbGFiZWxzIGlzIG9ubHkgYSBmYWxsYmFjay5cbiAgICAvLyBUaGUgZHJhd2JhY2sgaXMsIHRoYXQgaXQgZG9lc24ndCBnZXQgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGxpc3Qgb2YgbGFiZWwgY2hhbmdlcy5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSAmJlxuICAgICAgIXRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSAmJlxuICAgICAgdGhpcy5pbnRlcm5hbHMubGFiZWxzLmxlbmd0aFxuICAgICkge1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZShcbiAgICAgICAgJ2FyaWEtbGFiZWwnLFxuICAgICAgICBBcnJheS5mcm9tKHRoaXMuaW50ZXJuYWxzLmxhYmVscylcbiAgICAgICAgICAubWFwKChsYWJlbCkgPT4gbGFiZWwudGV4dENvbnRlbnQpXG4gICAgICAgICAgLmpvaW4oJywgJyksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBPcGVucyB0aGUgc2VsZWN0aW9uIHBhbmVsLiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlICE9PSAnY2xvc2VkJyB8fFxuICAgICAgIXRoaXMuX292ZXJsYXkgfHxcbiAgICAgIHRoaXMuX29wdGlvbnMubGVuZ3RoID09PSAwIHx8XG4gICAgICB0aGlzLmRpc2FibGVkIHx8XG4gICAgICB0aGlzLmZvcm1EaXNhYmxlZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53aWxsT3Blbi5lbWl0KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KCcuc2JiLXNlbGVjdF9fY29udGFpbmVyJyk/LnNob3dQb3BvdmVyPy4oKTtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5pbmcnO1xuICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKCdkYXRhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gICAgdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCk7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZXMgdGhlIHNlbGVjdGlvbiBwYW5lbC4gKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMud2lsbENsb3NlLmVtaXQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtZXhwYW5kZWQnLCBmYWxzZSk7XG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIGlmICh0aGlzLl9vcmlnaW5FbGVtZW50KSB7XG4gICAgICB0aGlzLl9vcmlnaW5SZXNpemVPYnNlcnZlci51bm9ic2VydmUodGhpcy5fb3JpZ2luRWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYGNsb3NlZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24odGhpcywgJy0tc2JiLW9wdGlvbnMtcGFuZWwtYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgY3VycmVudCBkaXNwbGF5ZWQgdmFsdWUuICovXG4gIHB1YmxpYyBnZXREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheVZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqIExpc3RlbnMgdG8gb3B0aW9uIGNoYW5nZXMuICovXG4gIHByaXZhdGUgX29uT3B0aW9uQ2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgU2JiT3B0aW9uRWxlbWVudDxUPjtcbiAgICBpZiAodGFyZ2V0LnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLl9vbk9wdGlvblNlbGVjdGVkKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uT3B0aW9uRGVzZWxlY3RlZCh0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMaXN0ZW5zIHRvIG9wdGlvbiBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIF9vbk9wdGlvbkxhYmVsQ2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgU2JiT3B0aW9uRWxlbWVudDxUPjtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuX2dldFNlbGVjdGVkKCk7XG5cbiAgICBpZiAoXG4gICAgICAoIUFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpICYmIHRhcmdldCAhPT0gc2VsZWN0ZWQpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShzZWxlY3RlZCkgJiYgIXNlbGVjdGVkLmluY2x1ZGVzKHRhcmdldCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlRGlzcGxheVZhbHVlKHNlbGVjdGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZURpc3BsYXlWYWx1ZShzZWxlY3RlZDogU2JiT3B0aW9uRWxlbWVudDxUPiB8IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHNlbGVjdGVkLm1hcCgobykgPT4gby50ZXh0Q29udGVudCkuam9pbignLCAnKSB8fCBudWxsO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHNlbGVjdGVkPy50ZXh0Q29udGVudD8udHJpbSgpIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZUNoYW5nZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgdmFsdWVgIHByb3BlcnR5IHNob3VsZCBiZSBhZGFwdGVkIHdoZW4gdGhlIGBtdWx0aXBsZWAgcHJvcGVydHkgY2hhbmdlczpcbiAgICogICAtIGlmIGl0IGNoYW5nZXMgdG8gdHJ1ZSwgdGhlICd2YWx1ZScgaXMgc2V0IHRvIGFuIGFycmF5O1xuICAgKiAgIC0gaWYgaXQgY2hhbmdlcyB0byBmYWxzZSwgdGhlIGZpcnN0IGF2YWlsYWJsZSBvcHRpb24gaXMgc2V0IGFzICd2YWx1ZScgb3RoZXJ3aXNlIGl0J3Mgc2V0IHRvIG51bGwuXG4gICAqL1xuICBwcml2YXRlIF9vbk11bHRpcGxlQ2hhbmdlZChpc0NoYW5naW5nVG9NdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0NoYW5naW5nVG9NdWx0aXBsZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUgIT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkID8gW3RoaXMudmFsdWUgYXMgVF0gOiBbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmxlbmd0aCA/IHRoaXMudmFsdWVbMF0gOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgYGRpc2FibGVkYCBvciB0aGUgYHJlYWRvbmx5YCBwcm9wZXJ0aWVzIGFyZSBzZXQsIGFuZCB0aGUgcGFuZWwgaXMgb3BlbiwgY2xvc2UgaXQuXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZU9uRGlzYWJsZWRSZWFkb25seUNoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4gJiYgbmV3VmFsdWUpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0cyB0aGUgX2Rpc3BsYXlWYWx1ZSBieSBjaGVja2luZyB0aGUgaW50ZXJuYWwgc2JiLW9wdGlvbnMgYW5kIHNldHRpbmcgdGhlIGNvcnJlY3QgYHNlbGVjdGVkYCB2YWx1ZSBvbiB0aGVtLiAqL1xuICBwcml2YXRlIF9vblZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogVCB8IFRbXSk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IG9wdGlvbnMuZmluZCgobykgPT4gby52YWx1ZSA9PT0gbmV3VmFsdWUpID8/IG51bGw7XG4gICAgICBpZiAob3B0aW9uRWxlbWVudCkge1xuICAgICAgICBvcHRpb25FbGVtZW50LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigobykgPT4gKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpICE9PSBuZXdWYWx1ZSlcbiAgICAgICAgLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgIHRoaXMuX3VwZGF0ZURpc3BsYXlWYWx1ZShvcHRpb25FbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5maWx0ZXIoKG8pID0+ICFuZXdWYWx1ZS5pbmNsdWRlcyhvLnZhbHVlKSkuZm9yRWFjaCgoZSkgPT4gKGUuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IG9wdGlvbnMuZmlsdGVyKChvKSA9PiBuZXdWYWx1ZS5pbmNsdWRlcyhvLnZhbHVlKSk7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRzLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gdHJ1ZSkpO1xuICAgICAgdGhpcy5fdXBkYXRlRGlzcGxheVZhbHVlKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIFdhaXQgZm9yIHNzciBoeWRyYXRpb25cbiAgICBpZiAoIWlzTmV4dGpzKCkpIHtcbiAgICAgIHRoaXMuc3RhcnRVcGRhdGUoKTtcbiAgICAgIHRoaXMuX3NldHVwU2VsZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZm9jdXMoKTogdm9pZCB7XG4gICAgLy8gRm9yd2FyZCBmb2N1cyB0byB0aGUgdHJpZ2dlciBlbGVtZW50LlxuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYmx1cigpOiB2b2lkIHtcbiAgICAvLyBGb3J3YXJkIGJsdXIgdG8gdGhlIHRyaWdnZXIgZWxlbWVudC5cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uYmx1cigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgZWxlbWVudCdzIGZpcnN0IGF0dHJpYnV0ZSB3aG9zZSBxdWFsaWZpZWQgbmFtZSBpcyBxdWFsaWZpZWROYW1lLlxuICAgKlxuICAgKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0VsZW1lbnQvcmVtb3ZlQXR0cmlidXRlKVxuICAgKiBAaW50ZXJuYWwgV2UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGR1ZSB0byBhIGh5ZHJhdGlvbiBpc3N1ZSB3aXRoIE5leHQuanMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVtb3ZlQXR0cmlidXRlKHF1YWxpZmllZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEluIE5leHQuanMgdGhlIGh5ZHJhdGlvbiBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBsaWdodCBET00uXG4gICAgLy8gQGxpdC9yZWFjdCBjYWxscyByZW1vdmVBdHRyaWJ1dGUoJ2RlZmVyLWh5ZHJhdGlvbicpIGluIGEgdXNlTGF5b3V0RWZmZWN0LFxuICAgIC8vIHdoaWNoIGlzIGRvbmUgYWZ0ZXIgaHlkcmF0aW9uIGlzIGZpbmlzaGVkLiBEdWUgdG8gdGhpcyB3ZSBpbnRlcmNlcHQgdGhpcyBjYWxsXG4gICAgLy8gaW4gb3ZlcnJpZGluZyByZW1vdmVBdHRyaWJ1dGUgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzYmItc2VsZWN0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2Jsb2IvbWFpbi9wYWNrYWdlcy9yZWFjdC9zcmMvY3JlYXRlLWNvbXBvbmVudC50cyNMMjkzLUwyOTZcbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd2FpdCBmb3IgdXBkYXRlIGNvbXBsZXRlIGluIG9yZGVyIHRvIGJlIHN1cmUgdGhhdCB0aGUgc2hhZG93IERPTSBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICBpZiAoaXNOZXh0anMoKSAmJiBxdWFsaWZpZWROYW1lID09PSAnZGVmZXItaHlkcmF0aW9uJyAmJiAhdGhpcy5fZGlkTG9hZCkge1xuICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuX3NldHVwU2VsZWN0KCkpO1xuICAgIH1cbiAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmIChhcmlhUm9sZU9uSG9zdCkge1xuICAgICAgdGhpcy5pZCB8fD0gdGhpcy5fb3ZlcmxheUlkO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuY2xvc2VzdD8uKCdzYmItZm9ybS1maWVsZCcpID8/IHRoaXMuY2xvc2VzdD8uKCdbZGF0YS1mb3JtLWZpZWxkXScpO1xuXG4gICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IGZvcm1GaWVsZC5oYXNBdHRyaWJ1dGUoJ25lZ2F0aXZlJyk7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5fc3luY0FyaWFMYWJlbHMoKTtcblxuICAgIGlmICh0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLl9zZXR1cE9yaWdpbigpO1xuICAgICAgdGhpcy5fc2V0dXBUcmlnZ2VyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHJlcXVlc3RVcGRhdGUoXG4gICAgbmFtZT86IFByb3BlcnR5S2V5LFxuICAgIG9sZFZhbHVlPzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgaWYgKCFuYW1lICYmIHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zeW5jQXJpYUxhYmVscygpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ZhbHVlJykgJiYgKHRoaXMuX2RpZExvYWQgfHwgdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuX29uVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUhKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbmVnYXRpdmUnKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ211bHRpcGxlJykpIHtcbiAgICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5wcmVwZW5kKHRoaXMuX3RyaWdnZXJFbGVtZW50KTsgLy8gVGFrZSBiYWNrIHRoZSB0cmlnZ2VyIGVsZW1lbnQgcHJldmlvdXNseSBtb3ZlZCB0byB0aGUgbGlnaHQgRE9NXG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzZXQgdmFsdWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAodGhlIHNldHVwIHZhbHVlKSwgbnVsbCBvdGhlcndpc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAodGhpcy5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPyB0aGlzLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA6IG51bGwpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgfHwgc3RhdGUgPT0gbnVsbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IChzdGF0ZSBhcyBUKSA/PyBudWxsO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgdGhpcy5fcmVhZEZvcm1EYXRhKHN0YXRlKS50aGVuKChhcnJheSkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IGFycmF5IDogYXJyYXlbMF07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZWFkRm9ybURhdGEoZm9ybURhdGE6IEZvcm1EYXRhKTogUHJvbWlzZTxUW10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBmb3JtRGF0YVxuICAgICAgICAuZ2V0QWxsKHRoaXMubmFtZSlcbiAgICAgICAgLm1hcChhc3luYyAoZW50cnkpID0+XG4gICAgICAgICAgZW50cnkgaW5zdGFuY2VvZiBCbG9iID8gSlNPTi5wYXJzZShhd2FpdCBlbnRyeS50ZXh0KCkpIDogKGVudHJ5IGFzIFQpLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/Lignc2JiLWRpdmlkZXInKS5mb3JFYWNoKChlbGVtZW50KSA9PiAoZWxlbWVudC5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmUpKTtcblxuICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbD8uPFNiYk9wdGlvbkVsZW1lbnQ8VD4gfCBTYmJPcHRHcm91cEVsZW1lbnQ+KFxuICAgICAgJ3NiYi1vcHRpb24sIHNiYi1vcHRncm91cCcsXG4gICAgKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50LnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1uZWdhdGl2ZScsIHRoaXMubmVnYXRpdmUpO1xuICAgICAgZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtbXVsdGlwbGUnLCB0aGlzLm11bHRpcGxlKTtcbiAgICB9KTtcblxuICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbD8uPFNiYk9wdGlvbkVsZW1lbnQ8VD4gfCBTYmJPcHRHcm91cEVsZW1lbnQ+KFxuICAgICAgJ3NiYi1vcHRpb24sIHNiYi1vcHRncm91cCcsXG4gICAgKS5mb3JFYWNoKChlKSA9PiBlLnJlcXVlc3RVcGRhdGU/LigpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRWYWxpZGF0ZShuYW1lOiBQcm9wZXJ0eUtleSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5zaG91bGRWYWxpZGF0ZShuYW1lKSB8fCBuYW1lID09PSAndmFsdWUnIHx8IG5hbWUgPT09ICdyZXF1aXJlZCc7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgc3VwZXIudmFsaWRhdGUoKTtcbiAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiB0aGlzLl9vcHRpb25zLmV2ZXJ5KChvKSA9PiBvLnZhbHVlICE9PSB0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ3ZhbHVlTWlzc2luZycsIGkxOG5TZWxlY3Rpb25SZXF1aXJlZFt0aGlzLl9sYW5ndWFnZUNvbnRyb2xsZXIuY3VycmVudF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZVZhbGlkaXR5RmxhZygndmFsdWVNaXNzaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBTZWxlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dXBPcmlnaW4oKTtcbiAgICB0aGlzLl9zZXR1cFRyaWdnZXIoKTtcbiAgICB0aGlzLl9kaWRMb2FkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbXBsZXRlVXBkYXRlKCk7XG4gIH1cblxuICAvKiogU2V0cyB0aGUgb3JpZ2luRWxlbWVudDsgaWYgdGhlIGNvbXBvbmVudCBpcyB1c2VkIGluIGEgc2JiLWZvcm0tZmllbGQgdXNlcyBpdCwgb3RoZXJ3aXNlIHVzZXMgdGhlIHBhcmVudEVsZW1lbnQuICovXG4gIHByaXZhdGUgX3NldHVwT3JpZ2luKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuY2xvc2VzdD8uKCdzYmItZm9ybS1maWVsZCcpO1xuICAgIGlmICh0aGlzLl9vcmlnaW5FbGVtZW50KSB7XG4gICAgICB0aGlzLl9vcmlnaW5SZXNpemVPYnNlcnZlci51bm9ic2VydmUodGhpcy5fb3JpZ2luRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuX29yaWdpbkVsZW1lbnQgPVxuICAgICAgZm9ybUZpZWxkPy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPy4oJyNvdmVybGF5LWFuY2hvcicpID8/IHRoaXMucGFyZW50RWxlbWVudCE7XG4gICAgaWYgKHRoaXMuX29yaWdpbkVsZW1lbnQpIHtcbiAgICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKFxuICAgICAgICAnZGF0YS1vcHRpb24tcGFuZWwtb3JpZ2luLWJvcmRlcmxlc3MnLFxuICAgICAgICAhIWZvcm1GaWVsZD8uaGFzQXR0cmlidXRlPy4oJ2JvcmRlcmxlc3MnKSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICB0aGlzLl9vcmlnaW5SZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuX29yaWdpbkVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBhc3Nlc3Mgc2NyZWVuLXJlYWRlcnMgcHJvYmxlbXMgY2F1c2VkIGJ5IHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGFyaWEgcGF0dGVybnMgYW5kIHNoYWRvdyBET00sXG4gICAqIHdlIGFyZSBmb3JjZWQgdG8gbW92ZSB0aGUgJ2NvbWJvYm94JyB0cmlnZ2VyIGVsZW1lbnQgdG8gdGhlIGxpZ2h0IERPTVxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0dXBUcmlnZ2VyKCk6IHZvaWQge1xuICAgIC8vIE1vdmUgdGhlIHRyaWdnZXIgYmVmb3JlIHRoZSBzYmItc2VsZWN0XG4gICAgdGhpcy5wYXJlbnRFbGVtZW50IS5pbnNlcnRCZWZvcmU/Lih0aGlzLl90cmlnZ2VyRWxlbWVudCwgdGhpcyk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRPdmVybGF5UG9zaXRpb24oKTogdm9pZCB7XG4gICAgc2V0T3ZlcmxheVBvc2l0aW9uKFxuICAgICAgdGhpcy5fb3ZlcmxheSxcbiAgICAgIHRoaXMuX29yaWdpbkVsZW1lbnQsXG4gICAgICB0aGlzLl9vcHRpb25Db250YWluZXIsXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItc2VsZWN0X19jb250YWluZXInKSEsXG4gICAgICB0aGlzLFxuICAgICk7XG4gIH1cblxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uQW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnb3BlbicgJiYgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2UnICYmIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlQ2xvc2luZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xuICAgIHRoaXMuX2F0dGFjaE9wZW5QYW5lbEV2ZW50cygpO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgdGhpcy5fZXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIuY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLl9vcmlnaW5FbGVtZW50KSB7XG4gICAgICB0aGlzLl9vcmlnaW5SZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuX29yaWdpbkVsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLmRpZE9wZW4uZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2xvc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignLnNiYi1zZWxlY3RfX2NvbnRhaW5lcicpPy5oaWRlUG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy5fcmVzZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgdGhpcy5fb3B0aW9uQ29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgdGhpcy5fZXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuZGlkQ2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgLyoqIFdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkLCB1cGRhdGVzIHRoZSBkaXNwbGF5VmFsdWU7IGl0IGFsc28gY2xvc2VzIHRoZSBzZWxlY3QgaWYgbm90IGBtdWx0aXBsZWAuICovXG4gIHByaXZhdGUgX29uT3B0aW9uU2VsZWN0ZWQob3B0aW9uU2VsZWN0aW9uQ2hhbmdlOiBTYmJPcHRpb25FbGVtZW50PFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLl9maWx0ZXJlZE9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uaWQgIT09IG9wdGlvblNlbGVjdGlvbkNoYW5nZS5pZClcbiAgICAgICAgLmZvckVhY2goKG9wdGlvbikgPT4gKG9wdGlvbi5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICB0aGlzLnZhbHVlID0gb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUhXTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiAhdGhpcy52YWx1ZS5pbmNsdWRlcyhvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUhKSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZSFdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2lucHV0LmVtaXQoKTtcbiAgICB0aGlzLl9jaGFuZ2UuZW1pdCgpO1xuICB9XG5cbiAgLyoqIFdoZW4gYW4gb3B0aW9uIGlzIHVuc2VsZWN0ZWQgaW4gYG11bHRpcGxlYCwgcmVtb3ZlcyBpdCBmcm9tIHZhbHVlIGFuZCB1cGRhdGVzIGRpc3BsYXlWYWx1ZS4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25EZXNlbGVjdGVkKG9wdGlvblNlbGVjdGlvbkNoYW5nZTogU2JiT3B0aW9uRWxlbWVudDxUPik6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcigoZWwpID0+IGVsICE9PSBvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUpO1xuICAgICAgdGhpcy5faW5wdXQuZW1pdCgpO1xuICAgICAgdGhpcy5fY2hhbmdlLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hdHRhY2hPcGVuUGFuZWxFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBvdmVybGF5IHBvc2l0aW9uIG9uIHNjcm9sbCBhbmQgd2luZG93IHJlc2l6ZVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIC8vIFdpdGhvdXQgY2FwdHVyZSwgb3RoZXIgc2Nyb2xsIGNvbnRleHRzIHdvdWxkIG5vdCBidWJibGUgdG8gdGhpcyBldmVudCBsaXN0ZW5lci5cbiAgICAgIC8vIENhcHR1cmUgYWxsb3dzIHVzIHRvIHJlYWN0IHRvIGFsbCBzY3JvbGwgY29udGV4dHMgaW4gdGhpcyBET00uXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRPdmVybGF5UG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG5cbiAgICAvLyBDbG9zZSBtZW51IG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGV2KSA9PiB0aGlzLl9wb2ludGVyRG93bkxpc3RlbmVyKGV2KSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgKGV2KSA9PiB0aGlzLl9jbG9zZU9uQmFja2Ryb3BDbGljayhldiksIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlID09PSAnb3BlbmVkJykge1xuICAgICAgdGhpcy5fb3BlbmVkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICB0aGlzLl9jbG9zZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Nsb3NlZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jaGVja0ZvckxldHRlclNlbGVjdGlvbihldmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uQnlUZXh0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9vcGVuZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSB8fCB0aGlzLnN0YXRlICE9PSAnb3BlbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGVja0ZvckxldHRlclNlbGVjdGlvbihldmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uQnlUZXh0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdEJ5S2V5Ym9hcmQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIDApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja0ZvckxldHRlclNlbGVjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdDbGVhcicgfHxcbiAgICAgIChldmVudC5rZXkubGVuZ3RoID09PSAxICYmXG4gICAgICAgIGV2ZW50LmtleSAhPT0gJyAnICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50LmN0cmxLZXkgJiZcbiAgICAgICAgIWV2ZW50Lm1ldGFLZXkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGltZW91dCBhbmQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zZWFyY2hUaW1lb3V0ID09PSB0eXBlb2Ygc2V0VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NlYXJjaFRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLl9zZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5fc2VhcmNoU3RyaW5nID0gJycpLCAxMDAwKTtcbiAgICB0aGlzLl9zZWFyY2hTdHJpbmcgKz0gZXZlbnQua2V5O1xuXG4gICAgLy8gUmVvcmRlciB0aGUgX2ZpbHRlcmVkT3B0aW9uIGFycmF5IHRvIGhhdmUgdGhlIGxhc3Qgc2VsZWN0ZWQgZWxlbWVudCBhdCB0aGUgYm90dG9tLlxuICAgIGNvbnN0IGluZGV4Rm9yU2xpY2U6IG51bWJlciA9IHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCArIDE7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zU29ydGVkID0gW1xuICAgICAgLi4udGhpcy5fZmlsdGVyZWRPcHRpb25zLnNsaWNlKGluZGV4Rm9yU2xpY2UpLFxuICAgICAgLi4udGhpcy5fZmlsdGVyZWRPcHRpb25zLnNsaWNlKDAsIGluZGV4Rm9yU2xpY2UpLFxuICAgIF07XG5cbiAgICBjb25zdCBtYXRjaCA9IGZpbHRlcmVkT3B0aW9uc1NvcnRlZC5maW5kKFxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLnRleHRDb250ZW50Py50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy5fc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpID09PSAwLFxuICAgICk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAvLyBJZiBhbiBleGFjdCBtYXRjaCBoYXMgYmVlbiBmb3VuZCwgZ28gdG8gdGhhdCBvcHRpb24uXG4gICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuaW5kZXhPZihtYXRjaCkpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLl9zZWFyY2hTdHJpbmcubGVuZ3RoID4gMSAmJlxuICAgICAgbmV3IFJlZ0V4cChgXiR7dGhpcy5fc2VhcmNoU3RyaW5nLmNoYXJBdCgwKX0qJGApLnRlc3QodGhpcy5fc2VhcmNoU3RyaW5nKVxuICAgICkge1xuICAgICAgLy8gSWYgbm8gZXhhY3QgbWF0Y2ggaGFzIGJlZW4gZm91bmQgYnV0IHRoZSBzdHJpbmcgdG8gc2VhcmNoIGlzIG1hZGUgYnkgdGhlIHNhbWUgcmVwZWF0ZWQgbGV0dGVyLFxuICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGVsZW1lbnQsIGlmIGV4aXN0cywgdGhhdCBtYXRjaGVzIHRoZSBsZXR0ZXIuXG4gICAgICBjb25zdCBmaXJzdE1hdGNoID0gZmlsdGVyZWRPcHRpb25zU29ydGVkLmZpbmQoXG4gICAgICAgIChvcHRpb24pID0+XG4gICAgICAgICAgb3B0aW9uLnRleHRDb250ZW50Py50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy5fc2VhcmNoU3RyaW5nWzBdLnRvTG93ZXJDYXNlKCkpID09PSAwLFxuICAgICAgKTtcbiAgICAgIGlmIChmaXJzdE1hdGNoKSB7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5pbmRleE9mKGZpcnN0TWF0Y2gpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gbWF0Y2ggZm91bmQsIGNsZWFyIHRoZSB0aW1lb3V0IGFuZCB0aGUgc2VhcmNoIHRlcm0uXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2VhcmNoVGltZW91dCk7XG4gICAgICB0aGlzLl9zZWFyY2hTdHJpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RCeUtleWJvYXJkKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc1t0aGlzLl9hY3RpdmVJdGVtSW5kZXhdO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGFjdGl2ZU9wdGlvbj8uWydzZWxlY3RWaWFVc2VySW50ZXJhY3Rpb24nXSghYWN0aXZlT3B0aW9uLnNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zO1xuXG4gICAgLy8gUHJldmVudCBrZXlib2FyZCBuYXZpZ2F0aW9uIGlmIGFsbCBvcHRpb25zIGFyZSBkaXNhYmxlZFxuICAgIGlmIChmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEluZGV4ID1cbiAgICAgIGluZGV4ID8/IGdldE5leHRFbGVtZW50SW5kZXgoZXZlbnQsIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCwgZmlsdGVyZWRPcHRpb25zLmxlbmd0aCk7XG4gICAgY29uc3QgbmV4dE9wdGlvbiA9IGZpbHRlcmVkT3B0aW9uc1tuZXh0SW5kZXhdO1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IGZpbHRlcmVkT3B0aW9uc1t0aGlzLl9hY3RpdmVJdGVtSW5kZXhdO1xuXG4gICAgdGhpcy5fc2V0QWN0aXZlRWxlbWVudChuZXh0T3B0aW9uLCBhY3RpdmVPcHRpb24pO1xuXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLl9zZXRTZWxlY3RlZEVsZW1lbnQobmV4dE9wdGlvbiwgYWN0aXZlT3B0aW9uKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py5zaGlmdEtleSkge1xuICAgICAgbmV4dE9wdGlvblsnc2VsZWN0VmlhVXNlckludGVyYWN0aW9uJ10oIW5leHRPcHRpb24uc2VsZWN0ZWQpO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBuZXh0SW5kZXg7XG4gIH1cblxuICBwcml2YXRlIF9zZXRBY3RpdmVFbGVtZW50KFxuICAgIG5leHRBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQ8VD4sXG4gICAgbGFzdEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudDxUPiB8IG51bGwgPSBudWxsLFxuICAgIHNldEFjdGl2ZURlc2NlbmRhbnQgPSB0cnVlLFxuICApOiB2b2lkIHtcbiAgICBuZXh0QWN0aXZlT3B0aW9uLnNldEFjdGl2ZSh0cnVlKTtcbiAgICBuZXh0QWN0aXZlT3B0aW9uLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcblxuICAgIGlmIChzZXRBY3RpdmVEZXNjZW5kYW50KSB7XG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsIG5leHRBY3RpdmVPcHRpb24uaWQpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBwcmV2aW91c1xuICAgIGlmIChsYXN0QWN0aXZlT3B0aW9uICYmIGxhc3RBY3RpdmVPcHRpb24gIT09IG5leHRBY3RpdmVPcHRpb24pIHtcbiAgICAgIGxhc3RBY3RpdmVPcHRpb24uc2V0QWN0aXZlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRTZWxlY3RlZEVsZW1lbnQoXG4gICAgbmV4dEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudDxUPixcbiAgICBsYXN0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50PFQ+LFxuICApOiB2b2lkIHtcbiAgICBuZXh0QWN0aXZlT3B0aW9uWydzZWxlY3RWaWFVc2VySW50ZXJhY3Rpb24nXSh0cnVlKTtcblxuICAgIGlmIChsYXN0QWN0aXZlT3B0aW9uICYmIGxhc3RBY3RpdmVPcHRpb24gIT09IG5leHRBY3RpdmVPcHRpb24pIHtcbiAgICAgIGxhc3RBY3RpdmVPcHRpb25bJ3NlbGVjdFZpYVVzZXJJbnRlcmFjdGlvbiddKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXNldEFjdGl2ZUVsZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc1t0aGlzLl9hY3RpdmVJdGVtSW5kZXhdO1xuXG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGFjdGl2ZUVsZW1lbnQuc2V0QWN0aXZlKGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gLTE7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSBwb2ludGVyZG93biBldmVudCB0YXJnZXQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBtZW51LlxuICBwcml2YXRlIF9wb2ludGVyRG93bkxpc3RlbmVyID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICB0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnUgPSBpc0V2ZW50T25FbGVtZW50KHRoaXMuX292ZXJsYXksIGV2ZW50KTtcbiAgfTtcblxuICAvLyBDbG9zZSBtZW51IG9uIGJhY2tkcm9wIGNsaWNrLlxuICBwcml2YXRlIF9jbG9zZU9uQmFja2Ryb3BDbGljayA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnUgJiYgIWlzRXZlbnRPbkVsZW1lbnQodGhpcy5fb3ZlcmxheSwgZXZlbnQpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX3NldFZhbHVlRnJvbVNlbGVjdGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5fZ2V0U2VsZWN0ZWQoKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkKSkge1xuICAgICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWU6IFRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBzZWxlY3RlZCkge1xuICAgICAgICAgIHZhbHVlLnB1c2gob3B0aW9uLnZhbHVlISk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uID09PSBzZWxlY3RlZCk7XG4gICAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWQudmFsdWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAvLyBJZiB3ZSBhcnJpdmUgaGVyZSB3aXRob3V0IGFueSBvcHRpb25zIGJlaW5nIHNlbGVjdGVkLFxuICAgICAgLy8gd2Ugc2hvdWxkIHRyeSB0byBjaGVjayB0aGUgY3VycmVudCB2YWx1ZSBhZ2FpbnN0IHRoZSBhdmFpbGFibGUgb3B0aW9uc1xuICAgICAgLy8gKGFuZCBzZWxlY3QgaXQgaWYgYW55IG1hdGNoIGlzIGZvdW5kKS5cbiAgICAgIHRoaXMuX29uVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlbGVjdGVkKCk6IFNiYk9wdGlvbkVsZW1lbnQ8VD4gfCBTYmJPcHRpb25FbGVtZW50PFQ+W10gfCBudWxsIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5zZWxlY3RlZCkgPz8gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90b2dnbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkIHx8IHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LmZvY3VzKCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgIGNhc2UgJ29wZW5lZCc6IHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Nsb3NlZCc6IHtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3ByZWFkRGVmZXJyZWREaXNwbGF5VmFsdWUoXG4gICAgcGxhY2Vob2xkZXI6IFRlbXBsYXRlUmVzdWx0LFxuICApOiAoVGVtcGxhdGVSZXN1bHQgfCBQcm9taXNlPFRlbXBsYXRlUmVzdWx0PilbXSB7XG4gICAgcmV0dXJuIFt0aGlzLl9kZWZlcnJlZERpc3BsYXlWYWx1ZShwbGFjZWhvbGRlciksIHBsYWNlaG9sZGVyXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2RlZmVycmVkRGlzcGxheVZhbHVlKHBsYWNlaG9sZGVyOiBUZW1wbGF0ZVJlc3VsdCk6IFByb21pc2U8VGVtcGxhdGVSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgYXdhaXQgdGhpcy5oeWRyYXRpb25Db21wbGV0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlWYWx1ZSA/IGh0bWxgJHt0aGlzLl9kaXNwbGF5VmFsdWV9YCA6IHBsYWNlaG9sZGVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8IS0tIFRoaXMgZWxlbWVudCBpcyB2aXN1YWxseSBoaWRkZW4gYW5kIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGxpZ2h0IERPTSB0byBhbGxvdyBzY3JlZW5cbiAgICAgIHJlYWRlcnMgdG8gd29yayBwcm9wZXJseSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5IHNiYi1zZWxlY3QtdHJpZ2dlclwiXG4gICAgICAgIHRhYmluZGV4PSR7dGhpcy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1EaXNhYmxlZCA/IG5vdGhpbmcgOiAnMCd9XG4gICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcbiAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgYXJpYS1yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWQudG9TdHJpbmcoKX1cbiAgICAgICAgYXJpYS1jb250cm9scz0ke3RoaXMuX292ZXJsYXlJZH1cbiAgICAgICAgYXJpYS1vd25zPSR7dGhpcy5fb3ZlcmxheUlkfVxuICAgICAgICBAa2V5ZG93bj0ke3RoaXMuX29uS2V5RG93bn1cbiAgICAgICAgQGNsaWNrPSR7dGhpcy5fdG9nZ2xlT3BlbmluZ31cbiAgICAgICAgJHtyZWYoKHJlZikgPT4gKHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gcmVmIGFzIEhUTUxFbGVtZW50KSl9XG4gICAgICA+XG4gICAgICAgICR7dW50aWwoLi4udGhpcy5fc3ByZWFkRGVmZXJyZWREaXNwbGF5VmFsdWUoaHRtbGA8c3Bhbj4ke3RoaXMucGxhY2Vob2xkZXJ9PC9zcGFuPmApKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFZpc3VhbGx5IGRpc3BsYXkgdGhlIHZhbHVlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX3RyaWdnZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgJHt1bnRpbChcbiAgICAgICAgICAuLi50aGlzLl9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShcbiAgICAgICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItc2VsZWN0X190cmlnZ2VyLS1wbGFjZWhvbGRlclwiPiR7dGhpcy5wbGFjZWhvbGRlcn08L3NwYW4+YCxcbiAgICAgICAgICApLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19nYXAtZml4XCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fY29udGFpbmVyXCIgcG9wb3Zlcj1cIm1hbnVhbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fZ2FwLWZpeFwiPiR7b3ZlcmxheUdhcEZpeENvcm5lcnMoKX08L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIEBhbmltYXRpb25lbmQ9JHt0aGlzLl9vbkFuaW1hdGlvbkVuZH1cbiAgICAgICAgICBjbGFzcz1cInNiYi1zZWxlY3RfX3BhbmVsXCJcbiAgICAgICAgICAke3JlZigoZGlhbG9nUmVmKSA9PiAodGhpcy5fb3ZlcmxheSA9IGRpYWxvZ1JlZiBhcyBIVE1MRWxlbWVudCkpfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX3dyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgaWQ9JHshYXJpYVJvbGVPbkhvc3QgPyB0aGlzLl9vdmVybGF5SWQgOiBub3RoaW5nfVxuICAgICAgICAgICAgICBjbGFzcz1cInNiYi1zZWxlY3RfX29wdGlvbnNcIlxuICAgICAgICAgICAgICByb2xlPSR7IWFyaWFSb2xlT25Ib3N0ID8gJ2xpc3Rib3gnIDogbm90aGluZ31cbiAgICAgICAgICAgICAgP2FyaWEtbXVsdGlzZWxlY3RhYmxlPSR7dGhpcy5tdWx0aXBsZX1cbiAgICAgICAgICAgICAgJHtyZWYoKGNvbnRhaW5lclJlZikgPT4gKHRoaXMuX29wdGlvbkNvbnRhaW5lciA9IGNvbnRhaW5lclJlZiBhcyBIVE1MRWxlbWVudCkpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c2xvdCBAc2xvdGNoYW5nZT0ke3RoaXMuX3NldFZhbHVlRnJvbVNlbGVjdGVkfT48L3Nsb3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc2VsZWN0JzogU2JiU2VsZWN0RWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlNiYlNlbGVjdEVsZW1lbnQiLCJzdGF0ZSIsInJlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
1062
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE11dGF0aW9uQ29udHJvbGxlciB9IGZyb20gJ0BsaXQtbGFicy9vYnNlcnZlcnMvbXV0YXRpb24tY29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyBSZXNpemVDb250cm9sbGVyIH0gZnJvbSAnQGxpdC1sYWJzL29ic2VydmVycy9yZXNpemUtY29udHJvbGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgaXNTZXJ2ZXIsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHVudGlsIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW50aWwuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4IH0gZnJvbSAnLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLCBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSwgZ2V0T3ZlcnJpZGUsIGhhbmRsZURpc3RpbmN0Q2hhbmdlIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7XG4gIGlzTGVhbixcbiAgaXNOZXh0anMsXG4gIGlzU2FmYXJpLFxuICBpc1plcm9BbmltYXRpb25EdXJhdGlvbixcbiAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUsXG59IGZyb20gJy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IGkxOG5TZWxlY3Rpb25SZXF1aXJlZCB9IGZyb20gJy4uL2NvcmUvaTE4bi5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIFNiYkRpc2FibGVkTWl4aW4sXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4sXG4gIFNiYkh5ZHJhdGlvbk1peGluLFxuICBTYmJOZWdhdGl2ZU1peGluLFxuICBTYmJSZWFkb25seU1peGluLFxuICBTYmJSZXF1aXJlZE1peGluLFxuICBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpbixcbn0gZnJvbSAnLi4vY29yZS9taXhpbnMuanMnO1xuaW1wb3J0IHsgaXNFdmVudE9uRWxlbWVudCwgb3ZlcmxheUdhcEZpeENvcm5lcnMsIHNldE92ZXJsYXlQb3NpdGlvbiB9IGZyb20gJy4uL2NvcmUvb3ZlcmxheS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYk9wdEdyb3VwRWxlbWVudCwgU2JiT3B0aW9uRWxlbWVudCB9IGZyb20gJy4uL29wdGlvbi5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlbGVjdC5zY3NzP2xpdCZpbmxpbmUnO1xuXG4vKipcbiAqIE9uIFNhZmFyaSwgdGhlIGFyaWEgcm9sZSAnbGlzdGJveCcgbXVzdCBiZSBvbiB0aGUgaG9zdCBlbGVtZW50LCBvciBlbHNlIFZvaWNlT3ZlciB3b24ndCB3b3JrIGF0IGFsbC5cbiAqIE9uIHRoZSBvdGhlciBoYW5kLCBKQVdTIGFuZCBOVkRBIG5lZWQgdGhlIHJvbGUgdG8gYmUgYW4gXCJpbW1lZGlhdGUgcGFyZW50XCIgdG8gdGhlIG9wdGlvbnMsIG9yIGVsc2Ugb3B0Z3JvdXBzIHdvbid0IHdvcmsuXG4gKi9cbmNvbnN0IGFyaWFSb2xlT25Ib3N0ID0gaXNTYWZhcmk7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgcGFuZWwgd2l0aCBzZWxlY3RhYmxlIG9wdGlvbnMuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgb3B0aW9ucy5cbiAqIEBjc3Nwcm9wIFstLXNiYi1zZWxlY3Qtei1pbmRleD12YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpXSAtIFRvIHNwZWNpZnkgYSBjdXN0b20gc3RhY2sgb3JkZXIsXG4gKiB0aGUgYHotaW5kZXhgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nIHRoaXMgQ1NTIHZhcmlhYmxlLiBUaGUgZGVmYXVsdCBgei1pbmRleGAgb2YgdGhlXG4gKiBjb21wb25lbnQgaXMgc2V0IHRvIGB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpYCB3aXRoIGEgdmFsdWUgb2YgYDEwMDBgLlxuICogQG92ZXJyaWRlVHlwZSB2YWx1ZSAtIChUID0gc3RyaW5nIHwgc3RyaW5nW10pIHwgbnVsbFxuICovXG5leHBvcnRcbkBjdXN0b21FbGVtZW50KCdzYmItc2VsZWN0JylcbmNsYXNzIFNiYlNlbGVjdEVsZW1lbnQ8VCA9IHN0cmluZz4gZXh0ZW5kcyBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpbihcbiAgU2JiRGlzYWJsZWRNaXhpbihcbiAgICBTYmJOZWdhdGl2ZU1peGluKFxuICAgICAgU2JiSHlkcmF0aW9uTWl4aW4oXG4gICAgICAgIFNiYlJlcXVpcmVkTWl4aW4oXG4gICAgICAgICAgU2JiUmVhZG9ubHlNaXhpbihcbiAgICAgICAgICAgIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW48dHlwZW9mIFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50PihTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbikge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IHJvbGUgPSBhcmlhUm9sZU9uSG9zdCA/ICdsaXN0Ym94JyA6IG51bGw7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlO1xuXG4gIC8vIFRPRE86IGZpeCB1c2luZyAuLi5zdXBlci5ldmVudHMgcmVxdWlyZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYmItZGVzaWduLXN5c3RlbXMvbHluZS1jb21wb25lbnRzL2lzc3Vlcy8yNjAwXG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGNoYW5nZTogJ2NoYW5nZScsXG4gICAgaW5wdXQ6ICdpbnB1dCcsXG4gICAgZGlzcGxheXZhbHVlY2hhbmdlOiAnZGlzcGxheXZhbHVlY2hhbmdlJyxcbiAgICBiZWZvcmVvcGVuOiAnYmVmb3Jlb3BlbicsXG4gICAgb3BlbjogJ29wZW4nLFxuICAgIGJlZm9yZWNsb3NlOiAnYmVmb3JlY2xvc2UnLFxuICAgIGNsb3NlOiAnY2xvc2UnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgcGxhY2Vob2xkZXIgdXNlZCBpZiBubyB2YWx1ZSBoYXMgYmVlbiBzZWxlY3RlZC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBhY2Nlc3NvciBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNlbGVjdCBhbGxvd3MgZm9yIG11bHRpcGxlIHNlbGVjdGlvbi4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBoYW5kbGVEaXN0aW5jdENoYW5nZSgoZTogU2JiU2VsZWN0RWxlbWVudDxUPiwgbmV3VmFsdWU6IGJvb2xlYW4pID0+XG4gICAgZS5fb25NdWx0aXBsZUNoYW5nZWQobmV3VmFsdWUpLFxuICApXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBoYW5kbGVEaXN0aW5jdENoYW5nZSgoZTogU2JiU2VsZWN0RWxlbWVudDxUPiwgbmV3VmFsdWU6IGJvb2xlYW4pID0+XG4gICAgZS5fY2xvc2VPbkRpc2FibGVkUmVhZG9ubHlDaGFuZ2VkKG5ld1ZhbHVlKSxcbiAgKVxuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIEBnZXRPdmVycmlkZSgoZTogU2JiU2VsZWN0RWxlbWVudDxUPiwgdjogYm9vbGVhbik6IGJvb2xlYW4gPT4gdiB8fCBlLmlzRGlzYWJsZWRFeHRlcm5hbGx5KCkpXG4gIHB1YmxpYyBvdmVycmlkZSBhY2Nlc3NvciBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBWYWx1ZSBvZiB0aGUgZm9ybSBlbGVtZW50LiAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgdmFsdWU6IFQgfCBUW10gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogU2l6ZSB2YXJpYW50LCBlaXRoZXIgbSBvciBzLlxuICAgKiBAZGVmYXVsdCAnbScgLyAncycgKGxlYW4pXG4gICAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBzaXplOiAnbScgfCAncycgPSBpc0xlYW4oKSA/ICdzJyA6ICdtJztcblxuICAvKipcbiAgICogRm9ybSB0eXBlIG9mIGVsZW1lbnQuXG4gICAqIEBkZWZhdWx0ICdzZWxlY3Qtb25lIC8gc2VsZWN0LW11bHRpcGxlJ1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyAnc2VsZWN0LW11bHRpcGxlJyA6ICdzZWxlY3Qtb25lJztcbiAgfVxuXG4gIC8qKiBUaGUgdmFsdWUgZGlzcGxheWVkIGJ5IHRoZSBjb21wb25lbnQuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX2Rpc3BsYXlWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfb3JpZ2luUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplQ29udHJvbGxlcih0aGlzLCB7XG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIHNraXBJbml0aWFsOiB0cnVlLFxuICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfb3ZlcmxheSE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcHRpb25Db250YWluZXIhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfb3JpZ2luRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF90cmlnZ2VyRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyITogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlciA9IG5ldyBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfb3ZlcmxheUlkID0gYHNiYi1zZWxlY3QtJHsrK25leHRJZH1gO1xuICBwcml2YXRlIF9hY3RpdmVJdGVtSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBfc2VhcmNoVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIF9zZWFyY2hTdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfZGlkTG9hZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb250cm9sbGVyID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcblxuICAvKipcbiAgICogVGhlICdjb21ib2JveCcgaW5wdXQgZWxlbWVudFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fdHJpZ2dlckVsZW1lbnQ7XG4gIH1cblxuICAvKiogR2V0cyBhbGwgdGhlIFNiYk9wdGlvbkVsZW1lbnQgcHJvamVjdGVkIGluIHRoZSBzZWxlY3QuICovXG4gIHByaXZhdGUgZ2V0IF9vcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPy48U2JiT3B0aW9uRWxlbWVudDxUPj4oJ3NiYi1vcHRpb24nKSA/PyBbXSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZmlsdGVyZWRPcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZmlsdGVyKChvcHQpID0+ICFvcHQuZGlzYWJsZWQgJiYgIW9wdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ3JvdXAtZGlzYWJsZWQnKSk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Lignb3B0aW9uc2VsZWN0aW9uY2hhbmdlJywgKGU6IEV2ZW50KSA9PiB0aGlzLl9vbk9wdGlvbkNoYW5nZWQoZSkpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdvcHRpb25MYWJlbENoYW5nZWQnLCAoZTogRXZlbnQpID0+IHRoaXMuX29uT3B0aW9uTGFiZWxDaGFuZ2VkKGUpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LignY2xpY2snLCAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgU2JiU2VsZWN0RWxlbWVudDxUPiB8IFNiYk9wdGlvbkVsZW1lbnQ8VD47XG4gICAgICBpZiAodGFyZ2V0LmxvY2FsTmFtZSA9PT0gJ3NiYi1vcHRpb24nKSB7XG4gICAgICAgIC8vIE9wdGlvbiBjbGlja1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgIXRhcmdldC5kaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3RvZ2dsZU9wZW5pbmcoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQ29udHJvbGxlcihcbiAgICAgIG5ldyBNdXRhdGlvbkNvbnRyb2xsZXIodGhpcywge1xuICAgICAgICBjb25maWc6IHsgYXR0cmlidXRlRmlsdGVyOiBbJ2FyaWEtbGFiZWxsZWRieScsICdhcmlhLWxhYmVsJywgJ2FyaWEtZGVzY3JpYmVkYnknXSB9LFxuICAgICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5fc3luY0FyaWFMYWJlbHMoKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jQXJpYUxhYmVscygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RyaWdnZXJFbGVtZW50IHx8IGlzU2VydmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUoXG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCxcbiAgICAgICdhcmlhLWxhYmVsbGVkYnknLFxuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpLFxuICAgICk7XG4gICAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUodGhpcy5fdHJpZ2dlckVsZW1lbnQsICdhcmlhLWxhYmVsJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSk7XG4gICAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUoXG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCxcbiAgICAgICdhcmlhLWRlc2NyaWJlZGJ5JyxcbiAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JyksXG4gICAgKTtcblxuICAgIC8vIFVzaW5nIHRoZSBhc3NvY2lhdGVkIGxhYmVscyBpcyBvbmx5IGEgZmFsbGJhY2suXG4gICAgLy8gVGhlIGRyYXdiYWNrIGlzLCB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHVwZGF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBsaXN0IG9mIGxhYmVsIGNoYW5nZXMuXG4gICAgaWYgKFxuICAgICAgIXRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykgJiZcbiAgICAgICF0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JykgJiZcbiAgICAgIHRoaXMuaW50ZXJuYWxzLmxhYmVscy5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICdhcmlhLWxhYmVsJyxcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLmludGVybmFscy5sYWJlbHMpXG4gICAgICAgICAgLm1hcCgobGFiZWwpID0+IGxhYmVsLnRleHRDb250ZW50KVxuICAgICAgICAgIC5qb2luKCcsICcpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKiogT3BlbnMgdGhlIHNlbGVjdGlvbiBwYW5lbC4gKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZSAhPT0gJ2Nsb3NlZCcgfHxcbiAgICAgICF0aGlzLl9vdmVybGF5IHx8XG4gICAgICB0aGlzLl9vcHRpb25zLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgdGhpcy5kaXNhYmxlZCB8fFxuICAgICAgdGhpcy5mb3JtRGlzYWJsZWQgfHxcbiAgICAgICF0aGlzLmRpc3BhdGNoQmVmb3JlT3BlbkV2ZW50KClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KCcuc2JiLXNlbGVjdF9fY29udGFpbmVyJyk/LnNob3dQb3BvdmVyPy4oKTtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5pbmcnO1xuICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKCdkYXRhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gICAgdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCk7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZXMgdGhlIHNlbGVjdGlvbiBwYW5lbC4gKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmVkJyB8fCAhdGhpcy5kaXNwYXRjaEJlZm9yZUNsb3NlRXZlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtZXhwYW5kZWQnLCBmYWxzZSk7XG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIGlmICh0aGlzLl9vcmlnaW5FbGVtZW50KSB7XG4gICAgICB0aGlzLl9vcmlnaW5SZXNpemVPYnNlcnZlci51bm9ic2VydmUodGhpcy5fb3JpZ2luRWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYGNsb3NlZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24odGhpcywgJy0tc2JiLW9wdGlvbnMtcGFuZWwtYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgY3VycmVudCBkaXNwbGF5ZWQgdmFsdWUuICovXG4gIHB1YmxpYyBnZXREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheVZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqIExpc3RlbnMgdG8gb3B0aW9uIGNoYW5nZXMuICovXG4gIHByaXZhdGUgX29uT3B0aW9uQ2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgU2JiT3B0aW9uRWxlbWVudDxUPjtcbiAgICBpZiAodGFyZ2V0LnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLl9vbk9wdGlvblNlbGVjdGVkKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uT3B0aW9uRGVzZWxlY3RlZCh0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMaXN0ZW5zIHRvIG9wdGlvbiBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIF9vbk9wdGlvbkxhYmVsQ2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgU2JiT3B0aW9uRWxlbWVudDxUPjtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuX2dldFNlbGVjdGVkKCk7XG5cbiAgICBpZiAoXG4gICAgICAoIUFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpICYmIHRhcmdldCAhPT0gc2VsZWN0ZWQpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShzZWxlY3RlZCkgJiYgIXNlbGVjdGVkLmluY2x1ZGVzKHRhcmdldCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlRGlzcGxheVZhbHVlKHNlbGVjdGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZURpc3BsYXlWYWx1ZShzZWxlY3RlZDogU2JiT3B0aW9uRWxlbWVudDxUPiB8IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHNlbGVjdGVkLm1hcCgobykgPT4gby50ZXh0Q29udGVudCkuam9pbignLCAnKSB8fCBudWxsO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHNlbGVjdGVkPy50ZXh0Q29udGVudD8udHJpbSgpIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2Rpc3BsYXl2YWx1ZWNoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgdmFsdWVgIHByb3BlcnR5IHNob3VsZCBiZSBhZGFwdGVkIHdoZW4gdGhlIGBtdWx0aXBsZWAgcHJvcGVydHkgY2hhbmdlczpcbiAgICogICAtIGlmIGl0IGNoYW5nZXMgdG8gdHJ1ZSwgdGhlICd2YWx1ZScgaXMgc2V0IHRvIGFuIGFycmF5O1xuICAgKiAgIC0gaWYgaXQgY2hhbmdlcyB0byBmYWxzZSwgdGhlIGZpcnN0IGF2YWlsYWJsZSBvcHRpb24gaXMgc2V0IGFzICd2YWx1ZScgb3RoZXJ3aXNlIGl0J3Mgc2V0IHRvIG51bGwuXG4gICAqL1xuICBwcml2YXRlIF9vbk11bHRpcGxlQ2hhbmdlZChpc0NoYW5naW5nVG9NdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0NoYW5naW5nVG9NdWx0aXBsZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUgIT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkID8gW3RoaXMudmFsdWUgYXMgVF0gOiBbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmxlbmd0aCA/IHRoaXMudmFsdWVbMF0gOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgYGRpc2FibGVkYCBvciB0aGUgYHJlYWRvbmx5YCBwcm9wZXJ0aWVzIGFyZSBzZXQsIGFuZCB0aGUgcGFuZWwgaXMgb3BlbiwgY2xvc2UgaXQuXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZU9uRGlzYWJsZWRSZWFkb25seUNoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4gJiYgbmV3VmFsdWUpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0cyB0aGUgX2Rpc3BsYXlWYWx1ZSBieSBjaGVja2luZyB0aGUgaW50ZXJuYWwgc2JiLW9wdGlvbnMgYW5kIHNldHRpbmcgdGhlIGNvcnJlY3QgYHNlbGVjdGVkYCB2YWx1ZSBvbiB0aGVtLiAqL1xuICBwcml2YXRlIF9vblZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogVCB8IFRbXSk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IG9wdGlvbnMuZmluZCgobykgPT4gby52YWx1ZSA9PT0gbmV3VmFsdWUpID8/IG51bGw7XG4gICAgICBpZiAob3B0aW9uRWxlbWVudCkge1xuICAgICAgICBvcHRpb25FbGVtZW50LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigobykgPT4gKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpICE9PSBuZXdWYWx1ZSlcbiAgICAgICAgLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgIHRoaXMuX3VwZGF0ZURpc3BsYXlWYWx1ZShvcHRpb25FbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5maWx0ZXIoKG8pID0+ICFuZXdWYWx1ZS5pbmNsdWRlcyhvLnZhbHVlKSkuZm9yRWFjaCgoZSkgPT4gKGUuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IG9wdGlvbnMuZmlsdGVyKChvKSA9PiBuZXdWYWx1ZS5pbmNsdWRlcyhvLnZhbHVlKSk7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRzLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gdHJ1ZSkpO1xuICAgICAgdGhpcy5fdXBkYXRlRGlzcGxheVZhbHVlKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIFdhaXQgZm9yIHNzciBoeWRyYXRpb25cbiAgICBpZiAoIWlzTmV4dGpzKCkpIHtcbiAgICAgIHRoaXMuc3RhcnRVcGRhdGUoKTtcbiAgICAgIHRoaXMuX3NldHVwU2VsZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZm9jdXMoKTogdm9pZCB7XG4gICAgLy8gRm9yd2FyZCBmb2N1cyB0byB0aGUgdHJpZ2dlciBlbGVtZW50LlxuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYmx1cigpOiB2b2lkIHtcbiAgICAvLyBGb3J3YXJkIGJsdXIgdG8gdGhlIHRyaWdnZXIgZWxlbWVudC5cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uYmx1cigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgZWxlbWVudCdzIGZpcnN0IGF0dHJpYnV0ZSB3aG9zZSBxdWFsaWZpZWQgbmFtZSBpcyBxdWFsaWZpZWROYW1lLlxuICAgKlxuICAgKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0VsZW1lbnQvcmVtb3ZlQXR0cmlidXRlKVxuICAgKiBAaW50ZXJuYWwgV2UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGR1ZSB0byBhIGh5ZHJhdGlvbiBpc3N1ZSB3aXRoIE5leHQuanMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVtb3ZlQXR0cmlidXRlKHF1YWxpZmllZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEluIE5leHQuanMgdGhlIGh5ZHJhdGlvbiBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBsaWdodCBET00uXG4gICAgLy8gQGxpdC9yZWFjdCBjYWxscyByZW1vdmVBdHRyaWJ1dGUoJ2RlZmVyLWh5ZHJhdGlvbicpIGluIGEgdXNlTGF5b3V0RWZmZWN0LFxuICAgIC8vIHdoaWNoIGlzIGRvbmUgYWZ0ZXIgaHlkcmF0aW9uIGlzIGZpbmlzaGVkLiBEdWUgdG8gdGhpcyB3ZSBpbnRlcmNlcHQgdGhpcyBjYWxsXG4gICAgLy8gaW4gb3ZlcnJpZGluZyByZW1vdmVBdHRyaWJ1dGUgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzYmItc2VsZWN0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2Jsb2IvbWFpbi9wYWNrYWdlcy9yZWFjdC9zcmMvY3JlYXRlLWNvbXBvbmVudC50cyNMMjkzLUwyOTZcbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd2FpdCBmb3IgdXBkYXRlIGNvbXBsZXRlIGluIG9yZGVyIHRvIGJlIHN1cmUgdGhhdCB0aGUgc2hhZG93IERPTSBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICBpZiAoaXNOZXh0anMoKSAmJiBxdWFsaWZpZWROYW1lID09PSAnZGVmZXItaHlkcmF0aW9uJyAmJiAhdGhpcy5fZGlkTG9hZCkge1xuICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuX3NldHVwU2VsZWN0KCkpO1xuICAgIH1cbiAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmIChhcmlhUm9sZU9uSG9zdCkge1xuICAgICAgdGhpcy5pZCB8fD0gdGhpcy5fb3ZlcmxheUlkO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuY2xvc2VzdD8uKCdzYmItZm9ybS1maWVsZCcpID8/IHRoaXMuY2xvc2VzdD8uKCdbZGF0YS1mb3JtLWZpZWxkXScpO1xuXG4gICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IGZvcm1GaWVsZC5oYXNBdHRyaWJ1dGUoJ25lZ2F0aXZlJyk7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5fc3luY0FyaWFMYWJlbHMoKTtcblxuICAgIGlmICh0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLl9zZXR1cE9yaWdpbigpO1xuICAgICAgdGhpcy5fc2V0dXBUcmlnZ2VyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHJlcXVlc3RVcGRhdGUoXG4gICAgbmFtZT86IFByb3BlcnR5S2V5LFxuICAgIG9sZFZhbHVlPzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgaWYgKCFuYW1lICYmIHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zeW5jQXJpYUxhYmVscygpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ZhbHVlJykgJiYgKHRoaXMuX2RpZExvYWQgfHwgdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuX29uVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUhKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbmVnYXRpdmUnKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ211bHRpcGxlJykpIHtcbiAgICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3JlYWRPbmx5JykpIHtcbiAgICAgIHRoaXMuX2Nsb3NlT25EaXNhYmxlZFJlYWRvbmx5Q2hhbmdlZCh0aGlzLnJlYWRPbmx5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnByZXBlbmQodGhpcy5fdHJpZ2dlckVsZW1lbnQpOyAvLyBUYWtlIGJhY2sgdGhlIHRyaWdnZXIgZWxlbWVudCBwcmV2aW91c2x5IG1vdmVkIHRvIHRoZSBsaWdodCBET01cbiAgICB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyPy5hYm9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXNldCB2YWx1ZSBpcyB0aGUgYXR0cmlidXRlIHZhbHVlICh0aGUgc2V0dXAgdmFsdWUpLCBudWxsIG90aGVyd2lzZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9ICh0aGlzLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSA/IHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIDogbnVsbCkgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgIF9yZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICApOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSAnc3RyaW5nJyB8fCBzdGF0ZSA9PSBudWxsKSB7XG4gICAgICB0aGlzLnZhbHVlID0gKHN0YXRlIGFzIFQpID8/IG51bGw7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICB0aGlzLl9yZWFkRm9ybURhdGEoc3RhdGUpLnRoZW4oKGFycmF5KSA9PiB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm11bHRpcGxlID8gYXJyYXkgOiBhcnJheVswXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlYWRGb3JtRGF0YShmb3JtRGF0YTogRm9ybURhdGEpOiBQcm9taXNlPFRbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGZvcm1EYXRhXG4gICAgICAgIC5nZXRBbGwodGhpcy5uYW1lKVxuICAgICAgICAubWFwKGFzeW5jIChlbnRyeSkgPT5cbiAgICAgICAgICBlbnRyeSBpbnN0YW5jZW9mIEJsb2IgPyBKU09OLnBhcnNlKGF3YWl0IGVudHJ5LnRleHQoKSkgOiAoZW50cnkgYXMgVCksXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbD8uKCdzYmItZGl2aWRlcicpLmZvckVhY2goKGVsZW1lbnQpID0+IChlbGVtZW50Lm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZSkpO1xuXG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPy48U2JiT3B0aW9uRWxlbWVudDxUPiB8IFNiYk9wdEdyb3VwRWxlbWVudD4oXG4gICAgICAnc2JiLW9wdGlvbiwgc2JiLW9wdGdyb3VwJyxcbiAgICApLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGVsZW1lbnQudG9nZ2xlQXR0cmlidXRlKCdkYXRhLW5lZ2F0aXZlJywgdGhpcy5uZWdhdGl2ZSk7XG4gICAgICBlbGVtZW50LnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1tdWx0aXBsZScsIHRoaXMubXVsdGlwbGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPy48U2JiT3B0aW9uRWxlbWVudDxUPiB8IFNiYk9wdEdyb3VwRWxlbWVudD4oXG4gICAgICAnc2JiLW9wdGlvbiwgc2JiLW9wdGdyb3VwJyxcbiAgICApLmZvckVhY2goKGUpID0+IGUucmVxdWVzdFVwZGF0ZT8uKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZFZhbGlkYXRlKG5hbWU6IFByb3BlcnR5S2V5IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLnNob3VsZFZhbGlkYXRlKG5hbWUpIHx8IG5hbWUgPT09ICd2YWx1ZScgfHwgbmFtZSA9PT0gJ3JlcXVpcmVkJztcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBzdXBlci52YWxpZGF0ZSgpO1xuICAgIGlmICh0aGlzLnJlcXVpcmVkICYmIHRoaXMuX29wdGlvbnMuZXZlcnkoKG8pID0+IG8udmFsdWUgIT09IHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnNldFZhbGlkaXR5RmxhZygndmFsdWVNaXNzaW5nJywgaTE4blNlbGVjdGlvblJlcXVpcmVkW3RoaXMuX2xhbmd1YWdlQ29udHJvbGxlci5jdXJyZW50XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlVmFsaWRpdHlGbGFnKCd2YWx1ZU1pc3NpbmcnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR1cE9yaWdpbigpO1xuICAgIHRoaXMuX3NldHVwVHJpZ2dlcigpO1xuICAgIHRoaXMuX2RpZExvYWQgPSB0cnVlO1xuICAgIHRoaXMuY29tcGxldGVVcGRhdGUoKTtcbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBvcmlnaW5FbGVtZW50OyBpZiB0aGUgY29tcG9uZW50IGlzIHVzZWQgaW4gYSBzYmItZm9ybS1maWVsZCB1c2VzIGl0LCBvdGhlcndpc2UgdXNlcyB0aGUgcGFyZW50RWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBfc2V0dXBPcmlnaW4oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUZpZWxkID0gdGhpcy5jbG9zZXN0Py4oJ3NiYi1mb3JtLWZpZWxkJyk7XG4gICAgaWYgKHRoaXMuX29yaWdpbkVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX29yaWdpblJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZSh0aGlzLl9vcmlnaW5FbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5fb3JpZ2luRWxlbWVudCA9XG4gICAgICBmb3JtRmllbGQ/LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I/LignI292ZXJsYXktYW5jaG9yJykgPz8gdGhpcy5wYXJlbnRFbGVtZW50ITtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoXG4gICAgICAgICdkYXRhLW9wdGlvbi1wYW5lbC1vcmlnaW4tYm9yZGVybGVzcycsXG4gICAgICAgICEhZm9ybUZpZWxkPy5oYXNBdHRyaWJ1dGU/LignYm9yZGVybGVzcycpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuX29yaWdpblJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5fb3JpZ2luRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvIGFzc2VzcyBzY3JlZW4tcmVhZGVycyBwcm9ibGVtcyBjYXVzZWQgYnkgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYXJpYSBwYXR0ZXJucyBhbmQgc2hhZG93IERPTSxcbiAgICogd2UgYXJlIGZvcmNlZCB0byBtb3ZlIHRoZSAnY29tYm9ib3gnIHRyaWdnZXIgZWxlbWVudCB0byB0aGUgbGlnaHQgRE9NXG4gICAqL1xuICBwcml2YXRlIF9zZXR1cFRyaWdnZXIoKTogdm9pZCB7XG4gICAgLy8gTW92ZSB0aGUgdHJpZ2dlciBiZWZvcmUgdGhlIHNiYi1zZWxlY3RcbiAgICB0aGlzLnBhcmVudEVsZW1lbnQhLmluc2VydEJlZm9yZT8uKHRoaXMuX3RyaWdnZXJFbGVtZW50LCB0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldE92ZXJsYXlQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBzZXRPdmVybGF5UG9zaXRpb24oXG4gICAgICB0aGlzLl9vdmVybGF5LFxuICAgICAgdGhpcy5fb3JpZ2luRWxlbWVudCxcbiAgICAgIHRoaXMuX29wdGlvbkNvbnRhaW5lcixcbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1zZWxlY3RfX2NvbnRhaW5lcicpISxcbiAgICAgIHRoaXMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIEluIHJhcmUgY2FzZXMgaXQgY2FuIGJlIHRoYXQgdGhlIGFuaW1hdGlvbkVuZCBldmVudCBpcyB0cmlnZ2VyZWQgdHdpY2UuXG4gIC8vIFRvIGF2b2lkIGVudGVyaW5nIGEgY29ycnVwdCBzdGF0ZSwgZXhpdCB3aGVuIHN0YXRlIGlzIG5vdCBleHBlY3RlZC5cbiAgcHJpdmF0ZSBfb25BbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdvcGVuJyAmJiB0aGlzLnN0YXRlID09PSAnb3BlbmluZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZU9wZW5pbmcoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdjbG9zZScgJiYgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlT3BlbmluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5lZCc7XG4gICAgdGhpcy5fYXR0YWNoT3BlblBhbmVsRXZlbnRzKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5jb25uZWN0KCk7XG4gICAgaWYgKHRoaXMuX29yaWdpbkVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX29yaWdpblJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5fb3JpZ2luRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcGF0Y2hPcGVuRXZlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNsb3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oJy5zYmItc2VsZWN0X19jb250YWluZXInKT8uaGlkZVBvcG92ZXI/LigpO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgIHRoaXMuX3Jlc2V0QWN0aXZlRWxlbWVudCgpO1xuICAgIHRoaXMuX29wdGlvbkNvbnRhaW5lci5zY3JvbGxUb3AgPSAwO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmRpc3BhdGNoQ2xvc2VFdmVudCgpO1xuICB9XG5cbiAgLyoqIFdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkLCB1cGRhdGVzIHRoZSBkaXNwbGF5VmFsdWU7IGl0IGFsc28gY2xvc2VzIHRoZSBzZWxlY3QgaWYgbm90IGBtdWx0aXBsZWAuICovXG4gIHByaXZhdGUgX29uT3B0aW9uU2VsZWN0ZWQob3B0aW9uU2VsZWN0aW9uQ2hhbmdlOiBTYmJPcHRpb25FbGVtZW50PFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLl9maWx0ZXJlZE9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uaWQgIT09IG9wdGlvblNlbGVjdGlvbkNoYW5nZS5pZClcbiAgICAgICAgLmZvckVhY2goKG9wdGlvbikgPT4gKG9wdGlvbi5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICB0aGlzLnZhbHVlID0gb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUhXTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiAhdGhpcy52YWx1ZS5pbmNsdWRlcyhvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUhKSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZSFdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2Rpc3BhdGNoSW5wdXRFdmVudHMoKTtcbiAgfVxuXG4gIC8qKiBXaGVuIGFuIG9wdGlvbiBpcyB1bnNlbGVjdGVkIGluIGBtdWx0aXBsZWAsIHJlbW92ZXMgaXQgZnJvbSB2YWx1ZSBhbmQgdXBkYXRlcyBkaXNwbGF5VmFsdWUuICovXG4gIHByaXZhdGUgX29uT3B0aW9uRGVzZWxlY3RlZChvcHRpb25TZWxlY3Rpb25DaGFuZ2U6IFNiYk9wdGlvbkVsZW1lbnQ8VD4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKGVsKSA9PiBlbCAhPT0gb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlKTtcbiAgICAgIHRoaXMuX2Rpc3BhdGNoSW5wdXRFdmVudHMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kaXNwYXRjaElucHV0RXZlbnRzKCk6IHZvaWQge1xuICAgIC8qKiBUaGUgaW5wdXQgZXZlbnQgZmlyZXMgd2hlbiB0aGUgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBhcyBhIGRpcmVjdCByZXN1bHQgb2YgYSB1c2VyIGFjdGlvbi4gKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgSW5wdXRFdmVudCgnaW5wdXQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjaGFuZ2UgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdXNlciBtb2RpZmllcyB0aGUgZWxlbWVudCdzIHZhbHVlLlxuICAgICAqIFVubGlrZSB0aGUgaW5wdXQgZXZlbnQsIHRoZSBjaGFuZ2UgZXZlbnQgaXMgbm90IG5lY2Vzc2FyaWx5IGZpcmVkXG4gICAgICogZm9yIGVhY2ggYWx0ZXJhdGlvbiB0byBhbiBlbGVtZW50J3MgdmFsdWUuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaE9wZW5QYW5lbEV2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgLy8gUmVjYWxjdWxhdGUgdGhlIG92ZXJsYXkgcG9zaXRpb24gb24gc2Nyb2xsIGFuZCB3aW5kb3cgcmVzaXplXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4gdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCksIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgLy8gV2l0aG91dCBjYXB0dXJlLCBvdGhlciBzY3JvbGwgY29udGV4dHMgd291bGQgbm90IGJ1YmJsZSB0byB0aGlzIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgLy8gQ2FwdHVyZSBhbGxvd3MgdXMgdG8gcmVhY3QgdG8gYWxsIHNjcm9sbCBjb250ZXh0cyBpbiB0aGlzIERPTS5cbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2tcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXYpID0+IHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIoZXYpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCAoZXYpID0+IHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrKGV2KSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnKSB7XG4gICAgICB0aGlzLl9vcGVuZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHRoaXMuX2Nsb3NlZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xvc2VkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NoZWNrRm9yTGV0dGVyU2VsZWN0aW9uKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29wZW5lZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5IHx8IHRoaXMuc3RhdGUgIT09ICdvcGVuZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NoZWNrRm9yTGV0dGVyU2VsZWN0aW9uKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0QnlLZXlib2FyZCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgMCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCB0aGlzLl9maWx0ZXJlZE9wdGlvbnMubGVuZ3RoIC0gMSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrRm9yTGV0dGVyU2VsZWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0NsZWFyJyB8fFxuICAgICAgKGV2ZW50LmtleS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgZXZlbnQua2V5ICE9PSAnICcgJiZcbiAgICAgICAgIWV2ZW50LmFsdEtleSAmJlxuICAgICAgICAhZXZlbnQuY3RybEtleSAmJlxuICAgICAgICAhZXZlbnQubWV0YUtleSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0TmV4dEFjdGl2ZU9wdGlvbkJ5VGV4dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8vIFNldCB0aW1lb3V0IGFuZCB0aGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAgICBpZiAodHlwZW9mIHRoaXMuX3NlYXJjaFRpbWVvdXQgPT09IHR5cGVvZiBzZXRUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2VhcmNoVGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMuX3NlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLl9zZWFyY2hTdHJpbmcgPSAnJyksIDEwMDApO1xuICAgIHRoaXMuX3NlYXJjaFN0cmluZyArPSBldmVudC5rZXk7XG5cbiAgICAvLyBSZW9yZGVyIHRoZSBfZmlsdGVyZWRPcHRpb24gYXJyYXkgdG8gaGF2ZSB0aGUgbGFzdCBzZWxlY3RlZCBlbGVtZW50IGF0IHRoZSBib3R0b20uXG4gICAgY29uc3QgaW5kZXhGb3JTbGljZTogbnVtYmVyID0gdGhpcy5fYWN0aXZlSXRlbUluZGV4ICsgMTtcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQgPSBbXG4gICAgICAuLi50aGlzLl9maWx0ZXJlZE9wdGlvbnMuc2xpY2UoaW5kZXhGb3JTbGljZSksXG4gICAgICAuLi50aGlzLl9maWx0ZXJlZE9wdGlvbnMuc2xpY2UoMCwgaW5kZXhGb3JTbGljZSksXG4gICAgXTtcblxuICAgIGNvbnN0IG1hdGNoID0gZmlsdGVyZWRPcHRpb25zU29ydGVkLmZpbmQoXG4gICAgICAob3B0aW9uKSA9PiBvcHRpb24udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLl9zZWFyY2hTdHJpbmcudG9Mb3dlckNhc2UoKSkgPT09IDAsXG4gICAgKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIC8vIElmIGFuIGV4YWN0IG1hdGNoIGhhcyBiZWVuIGZvdW5kLCBnbyB0byB0aGF0IG9wdGlvbi5cbiAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5pbmRleE9mKG1hdGNoKSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuX3NlYXJjaFN0cmluZy5sZW5ndGggPiAxICYmXG4gICAgICBuZXcgUmVnRXhwKGBeJHt0aGlzLl9zZWFyY2hTdHJpbmcuY2hhckF0KDApfSokYCkudGVzdCh0aGlzLl9zZWFyY2hTdHJpbmcpXG4gICAgKSB7XG4gICAgICAvLyBJZiBubyBleGFjdCBtYXRjaCBoYXMgYmVlbiBmb3VuZCBidXQgdGhlIHN0cmluZyB0byBzZWFyY2ggaXMgbWFkZSBieSB0aGUgc2FtZSByZXBlYXRlZCBsZXR0ZXIsXG4gICAgICAvLyBnbyB0byB0aGUgZmlyc3QgZWxlbWVudCwgaWYgZXhpc3RzLCB0aGF0IG1hdGNoZXMgdGhlIGxldHRlci5cbiAgICAgIGNvbnN0IGZpcnN0TWF0Y2ggPSBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQuZmluZChcbiAgICAgICAgKG9wdGlvbikgPT5cbiAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLl9zZWFyY2hTdHJpbmdbMF0udG9Mb3dlckNhc2UoKSkgPT09IDAsXG4gICAgICApO1xuICAgICAgaWYgKGZpcnN0TWF0Y2gpIHtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmluZGV4T2YoZmlyc3RNYXRjaCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBtYXRjaCBmb3VuZCwgY2xlYXIgdGhlIHRpbWVvdXQgYW5kIHRoZSBzZWFyY2ggdGVybS5cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zZWFyY2hUaW1lb3V0KTtcbiAgICAgIHRoaXMuX3NlYXJjaFN0cmluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdEJ5S2V5Ym9hcmQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgYWN0aXZlT3B0aW9uPy5bJ3NlbGVjdFZpYVVzZXJJbnRlcmFjdGlvbiddKCFhY3RpdmVPcHRpb24uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCwgaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnM7XG5cbiAgICAvLyBQcmV2ZW50IGtleWJvYXJkIG5hdmlnYXRpb24gaWYgYWxsIG9wdGlvbnMgYXJlIGRpc2FibGVkXG4gICAgaWYgKGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0SW5kZXggPVxuICAgICAgaW5kZXggPz8gZ2V0TmV4dEVsZW1lbnRJbmRleChldmVudCwgdGhpcy5fYWN0aXZlSXRlbUluZGV4LCBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoKTtcbiAgICBjb25zdCBuZXh0T3B0aW9uID0gZmlsdGVyZWRPcHRpb25zW25leHRJbmRleF07XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uID0gZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICB0aGlzLl9zZXRBY3RpdmVFbGVtZW50KG5leHRPcHRpb24sIGFjdGl2ZU9wdGlvbik7XG5cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX3NldFNlbGVjdGVkRWxlbWVudChuZXh0T3B0aW9uLCBhY3RpdmVPcHRpb24pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnNoaWZ0S2V5KSB7XG4gICAgICBuZXh0T3B0aW9uWydzZWxlY3RWaWFVc2VySW50ZXJhY3Rpb24nXSghbmV4dE9wdGlvbi5zZWxlY3RlZCk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IG5leHRJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEFjdGl2ZUVsZW1lbnQoXG4gICAgbmV4dEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudDxUPixcbiAgICBsYXN0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50PFQ+IHwgbnVsbCA9IG51bGwsXG4gICAgc2V0QWN0aXZlRGVzY2VuZGFudCA9IHRydWUsXG4gICk6IHZvaWQge1xuICAgIG5leHRBY3RpdmVPcHRpb24uc2V0QWN0aXZlKHRydWUpO1xuICAgIG5leHRBY3RpdmVPcHRpb24uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuXG4gICAgaWYgKHNldEFjdGl2ZURlc2NlbmRhbnQpIHtcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgbmV4dEFjdGl2ZU9wdGlvbi5pZCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgdGhlIHByZXZpb3VzXG4gICAgaWYgKGxhc3RBY3RpdmVPcHRpb24gJiYgbGFzdEFjdGl2ZU9wdGlvbiAhPT0gbmV4dEFjdGl2ZU9wdGlvbikge1xuICAgICAgbGFzdEFjdGl2ZU9wdGlvbi5zZXRBY3RpdmUoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFNlbGVjdGVkRWxlbWVudChcbiAgICBuZXh0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50PFQ+LFxuICAgIGxhc3RBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQ8VD4sXG4gICk6IHZvaWQge1xuICAgIG5leHRBY3RpdmVPcHRpb25bJ3NlbGVjdFZpYVVzZXJJbnRlcmFjdGlvbiddKHRydWUpO1xuXG4gICAgaWYgKGxhc3RBY3RpdmVPcHRpb24gJiYgbGFzdEFjdGl2ZU9wdGlvbiAhPT0gbmV4dEFjdGl2ZU9wdGlvbikge1xuICAgICAgbGFzdEFjdGl2ZU9wdGlvblsnc2VsZWN0VmlhVXNlckludGVyYWN0aW9uJ10oZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0QWN0aXZlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgYWN0aXZlRWxlbWVudC5zZXRBY3RpdmUoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSAtMTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHRhcmdldCBpcyB0cmlnZ2VyZWQgb24gdGhlIG1lbnUuXG4gIHByaXZhdGUgX3BvaW50ZXJEb3duTGlzdGVuZXIgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uTWVudSA9IGlzRXZlbnRPbkVsZW1lbnQodGhpcy5fb3ZlcmxheSwgZXZlbnQpO1xuICB9O1xuXG4gIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2suXG4gIHByaXZhdGUgX2Nsb3NlT25CYWNrZHJvcENsaWNrID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uTWVudSAmJiAhaXNFdmVudE9uRWxlbWVudCh0aGlzLl9vdmVybGF5LCBldmVudCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBfc2V0VmFsdWVGcm9tU2VsZWN0ZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLl9nZXRTZWxlY3RlZCgpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpKSB7XG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2YWx1ZTogVFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHNlbGVjdGVkKSB7XG4gICAgICAgICAgdmFsdWUucHVzaChvcHRpb24udmFsdWUhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZCkge1xuICAgICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24gPT09IHNlbGVjdGVkKTtcbiAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZC52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIC8vIElmIHdlIGFycml2ZSBoZXJlIHdpdGhvdXQgYW55IG9wdGlvbnMgYmVpbmcgc2VsZWN0ZWQsXG4gICAgICAvLyB3ZSBzaG91bGQgdHJ5IHRvIGNoZWNrIHRoZSBjdXJyZW50IHZhbHVlIGFnYWluc3QgdGhlIGF2YWlsYWJsZSBvcHRpb25zXG4gICAgICAvLyAoYW5kIHNlbGVjdCBpdCBpZiBhbnkgbWF0Y2ggaXMgZm91bmQpLlxuICAgICAgdGhpcy5fb25WYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VsZWN0ZWQoKTogU2JiT3B0aW9uRWxlbWVudDxUPiB8IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB8IG51bGwge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyZWRPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyZWRPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnNlbGVjdGVkKSA/PyBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RvZ2dsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5mb3JtRGlzYWJsZWQgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uZm9jdXMoKTtcblxuICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgY2FzZSAnb3BlbmVkJzoge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY2xvc2VkJzoge1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShcbiAgICBwbGFjZWhvbGRlcjogVGVtcGxhdGVSZXN1bHQsXG4gICk6IChUZW1wbGF0ZVJlc3VsdCB8IFByb21pc2U8VGVtcGxhdGVSZXN1bHQ+KVtdIHtcbiAgICByZXR1cm4gW3RoaXMuX2RlZmVycmVkRGlzcGxheVZhbHVlKHBsYWNlaG9sZGVyKSwgcGxhY2Vob2xkZXJdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZGVmZXJyZWREaXNwbGF5VmFsdWUocGxhY2Vob2xkZXI6IFRlbXBsYXRlUmVzdWx0KTogUHJvbWlzZTxUZW1wbGF0ZVJlc3VsdD4ge1xuICAgIGlmICh0aGlzLmh5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheVZhbHVlID8gaHRtbGAke3RoaXMuX2Rpc3BsYXlWYWx1ZX1gIDogcGxhY2Vob2xkZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDwhLS0gVGhpcyBlbGVtZW50IGlzIHZpc3VhbGx5IGhpZGRlbiBhbmQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgbGlnaHQgRE9NIHRvIGFsbG93IHNjcmVlblxuICAgICAgcmVhZGVycyB0byB3b3JrIHByb3Blcmx5IC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgc2JiLXNlbGVjdC10cmlnZ2VyXCJcbiAgICAgICAgdGFiaW5kZXg9JHt0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkID8gbm90aGluZyA6ICcwJ31cbiAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICBhcmlhLXJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZC50b1N0cmluZygpfVxuICAgICAgICBhcmlhLWNvbnRyb2xzPSR7dGhpcy5fb3ZlcmxheUlkfVxuICAgICAgICBhcmlhLW93bnM9JHt0aGlzLl9vdmVybGF5SWR9XG4gICAgICAgIEBrZXlkb3duPSR7dGhpcy5fb25LZXlEb3dufVxuICAgICAgICBAY2xpY2s9JHt0aGlzLl90b2dnbGVPcGVuaW5nfVxuICAgICAgICAke3JlZigocmVmKSA9PiAodGhpcy5fdHJpZ2dlckVsZW1lbnQgPSByZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgID5cbiAgICAgICAgJHt1bnRpbCguLi50aGlzLl9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShodG1sYDxzcGFuPiR7dGhpcy5wbGFjZWhvbGRlcn08L3NwYW4+YCkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlzdWFsbHkgZGlzcGxheSB0aGUgdmFsdWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fdHJpZ2dlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAke3VudGlsKFxuICAgICAgICAgIC4uLnRoaXMuX3NwcmVhZERlZmVycmVkRGlzcGxheVZhbHVlKFxuICAgICAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz1cInNiYi1zZWxlY3RfX3RyaWdnZXItLXBsYWNlaG9sZGVyXCI+JHt0aGlzLnBsYWNlaG9sZGVyfTwvc3Bhbj5gLFxuICAgICAgICAgICksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2dhcC1maXhcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19jb250YWluZXJcIiBwb3BvdmVyPVwibWFudWFsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19nYXAtZml4XCI+JHtvdmVybGF5R2FwRml4Q29ybmVycygpfTwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgQGFuaW1hdGlvbmVuZD0ke3RoaXMuX29uQW5pbWF0aW9uRW5kfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXNlbGVjdF9fcGFuZWxcIlxuICAgICAgICAgICR7cmVmKChkaWFsb2dSZWYpID0+ICh0aGlzLl9vdmVybGF5ID0gZGlhbG9nUmVmIGFzIEhUTUxFbGVtZW50KSl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fd3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBpZD0keyFhcmlhUm9sZU9uSG9zdCA/IHRoaXMuX292ZXJsYXlJZCA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgIGNsYXNzPVwic2JiLXNlbGVjdF9fb3B0aW9uc1wiXG4gICAgICAgICAgICAgIHJvbGU9JHshYXJpYVJvbGVPbkhvc3QgPyAnbGlzdGJveCcgOiBub3RoaW5nfVxuICAgICAgICAgICAgICA/YXJpYS1tdWx0aXNlbGVjdGFibGU9JHt0aGlzLm11bHRpcGxlfVxuICAgICAgICAgICAgICAke3JlZigoY29udGFpbmVyUmVmKSA9PiAodGhpcy5fb3B0aW9uQ29udGFpbmVyID0gY29udGFpbmVyUmVmIGFzIEhUTUxFbGVtZW50KSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5fc2V0VmFsdWVGcm9tU2VsZWN0ZWR9Pjwvc2xvdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1zZWxlY3QnOiBTYmJTZWxlY3RFbGVtZW50O1xuICB9XG59XG4iXSwibmFtZXMiOlsic3RhdGUiLCJyZWYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3Q0EsTUFBTSxpQkFBaUI7QUFFdkIsSUFBSSxTQUFTO0lBYVAsb0JBQWdCLE1BQUE7OzBCQURyQixjQUFjLFlBQVksQ0FBQzs7OztvQkFDZSx3QkFDekMsaUJBQ0UsaUJBQ0Usa0JBQ0UsaUJBQ0UsaUJBQ0UsdUJBQXVELHVCQUF1QixDQUFDLENBQ2hGLENBQ0YsQ0FDRixDQUNGLENBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFYZ0MsRUFBQSxtQkFBUSxZQVkxQztBQUFBLElBa0dDLGNBQUE7QUFDRSxZQUFBO0FBakZGO0FBUUE7QUFRQTtBQUlBO0FBTTZCO0FBV3BCO0FBckNPLHlCQUFBLCtCQUFBLGtCQUFBLE1BQUEsMkJBQXNCLEVBQUU7QUFReEIseUJBQUEsNkJBQUEsa0JBQUEsTUFBQSw4QkFBQSxHQUFBLGtCQUFBLE1BQUEsd0JBQW9CLEtBQUs7QUFRaEIseUJBQUEsNkJBQUEsa0JBQUEsTUFBQSwyQkFBQSxHQUFBLGtCQUFBLE1BQUEsd0JBQW9CLEtBQUs7QUFJbEMseUJBQUEsMEJBQUEsa0JBQUEs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
@@ -5,14 +5,15 @@ declare const SbbSelectionExpansionPanelElement_base: import('../core/mixins.js'
5
5
  *
6
6
  * @slot - Use the unnamed slot to add `sbb-checkbox` or `sbb-radio-button` elements to the `sbb-selection-expansion-panel`.
7
7
  * @slot content - Use this slot to provide custom content for the panel (optional).
8
- * @event {CustomEvent<void>} willOpen - Emits whenever the content section starts the opening transition.
9
- * @event {CustomEvent<void>} didOpen - Emits whenever the content section is opened.
10
- * @event {CustomEvent<void>} willClose - Emits whenever the content section begins the closing transition.
11
- * @event {CustomEvent<void>} didClose - Emits whenever the content section is closed.
12
8
  */
13
9
  export declare class SbbSelectionExpansionPanelElement extends SbbSelectionExpansionPanelElement_base {
14
10
  static styles: CSSResultGroup;
15
- static readonly events: Record<string, string>;
11
+ static readonly events: {
12
+ readonly beforeopen: "beforeopen";
13
+ readonly open: "open";
14
+ readonly beforeclose: "beforeclose";
15
+ readonly close: "close";
16
+ };
16
17
  /** The background color of the panel. */
17
18
  accessor color: 'white' | 'milk';
18
19
  /** Whether the content section is always visible. */
@@ -27,14 +28,6 @@ export declare class SbbSelectionExpansionPanelElement extends SbbSelectionExpan
27
28
  private get _checked();
28
29
  /** Whether the selection panel is disabled. */
29
30
  private set _disabled(value);
30
- /** Emits whenever the content section starts the opening transition. */
31
- private _willOpen;
32
- /** Emits whenever the content section is opened. */
33
- private _didOpen;
34
- /** Emits whenever the content section begins the closing transition. */
35
- private _willClose;
36
- /** Emits whenever the content section is closed. */
37
- private _didClose;
38
31
  private _language;
39
32
  private _sizeAttributeObserver;
40
33
  /** Whether it has an expandable content */
@@ -1 +1 @@
1
- {"version":3,"file":"selection-expansion-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/elements/selection-expansion-panel/selection-expansion-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGnB,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAeb,OAAO,eAAe,CAAC;;AAEvB;;;;;;;;;GASG;AACH,qBAGM,iCAAkC,SAAQ,sCAA6B;IAE3E,OAAuB,MAAM,EAAE,cAAc,CAAS;IACtD,gBAAuB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK1C;IAEX,yCAAyC;IACzC,SAA6C,KAAK,EAAE,OAAO,GAAG,MAAM,CAAW;IAE/E,qDAAqD;IACrD,SAEgB,SAAS,EAAE,OAAO,CAAS;IAE3C,iDAAiD;IACjD,SAEgB,UAAU,EAAE,OAAO,CAAS;IAE5C,wCAAwC;IAExC,OAAO,KAAK,MAAM,QAEjB;IACD,OAAO,KAAK,MAAM,GAEjB;IAED,8CAA8C;IAC9C,OAAO,KAAK,QAAQ,QAEnB;IACD,OAAO,KAAK,QAAQ,GAEnB;IAED,+CAA+C;IAC/C,OAAO,KAAK,SAAS,QAEpB;IAED,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAIf;IAEF,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAId;IAEF,wEAAwE;IACxE,OAAO,CAAC,UAAU,CAIhB;IAEF,oDAAoD;IACpD,OAAO,CAAC,SAAS,CAIf;IAEF,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,sBAAsB,CAIrB;IAET,2CAA2C;IAC3C,OAAO,KAAK,WAAW,GAGtB;IAED,OAAO,KAAK,MAAM,GAIjB;;IAOe,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;cAKzB,UAAU,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAQ5E,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,KAAK;IAeb,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAWtB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,eAAe;YAQT,oBAAoB;cAoBf,MAAM,IAAI,cAAc;CAmB5C;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,+BAA+B,EAAE,iCAAiC,CAAC;KACpE;CACF"}
1
+ {"version":3,"file":"selection-expansion-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/elements/selection-expansion-panel/selection-expansion-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGnB,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAcb,OAAO,eAAe,CAAC;;AAEvB;;;;;GAKG;AACH,qBAGM,iCAAkC,SAAQ,sCAA6B;IAE3E,OAAuB,MAAM,EAAE,cAAc,CAAS;IACtD,gBAAuB,MAAM;;;;;MAKlB;IAEX,yCAAyC;IACzC,SAA6C,KAAK,EAAE,OAAO,GAAG,MAAM,CAAW;IAE/E,qDAAqD;IACrD,SAEgB,SAAS,EAAE,OAAO,CAAS;IAE3C,iDAAiD;IACjD,SAEgB,UAAU,EAAE,OAAO,CAAS;IAE5C,wCAAwC;IAExC,OAAO,KAAK,MAAM,QAEjB;IACD,OAAO,KAAK,MAAM,GAEjB;IAED,8CAA8C;IAC9C,OAAO,KAAK,QAAQ,QAEnB;IACD,OAAO,KAAK,QAAQ,GAEnB;IAED,+CAA+C;IAC/C,OAAO,KAAK,SAAS,QAEpB;IAED,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,sBAAsB,CAIrB;IAET,2CAA2C;IAC3C,OAAO,KAAK,WAAW,GAGtB;IAED,OAAO,KAAK,MAAM,GAIjB;;IAOe,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;cAKzB,UAAU,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAQ5E,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,KAAK;IAgBb,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;IAWtB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,eAAe;YAQT,oBAAoB;cAoBf,MAAM,IAAI,cAAc;CAmB5C;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,+BAA+B,EAAE,iCAAiC,CAAC;KACpE;CACF"}