@sbb-esta/lyne-elements-experimental 5.0.0-next.1 → 5.0.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +18 -18
  2. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
  3. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +1 -1
  4. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
  5. package/{autocomplete-grid-cell.component-BFzREPWp.js → autocomplete-grid-cell.component-DAsWZlTn.js} +6 -6
  6. package/{autocomplete-grid-option.component-DhmoLeEw.js → autocomplete-grid-option.component-iEj9qreq.js} +9 -9
  7. package/{autocomplete-grid-row.component-BQxCxOI6.js → autocomplete-grid-row.component-VbyYP0U-.js} +7 -7
  8. package/autocomplete-grid.js +3 -3
  9. package/autocomplete-grid.pure.js +3 -3
  10. package/custom-elements.json +225 -104
  11. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts.map +1 -1
  12. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +3 -3
  13. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.d.ts.map +1 -1
  14. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
  15. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
  16. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +1 -1
  17. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.d.ts.map +1 -1
  18. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
  19. package/development/autocomplete-grid-cell.component-BF8i4388.js +33 -0
  20. package/development/{autocomplete-grid-option.component-B4SXR9_v.js → autocomplete-grid-option.component-BQwwanAf.js} +3 -3
  21. package/development/{autocomplete-grid-row.component-CY4UDuuj.js → autocomplete-grid-row.component-CBHh50jC.js} +3 -3
  22. package/development/autocomplete-grid.js +3 -3
  23. package/development/autocomplete-grid.pure.js +3 -3
  24. package/development/journey-summary/journey-summary.component.d.ts.map +1 -1
  25. package/development/journey-summary/journey-summary.component.js +1 -1
  26. package/development/journey-summary.component-De1ioDRq.js +341 -0
  27. package/development/journey-summary.js +1 -1
  28. package/development/journey-summary.pure.js +1 -1
  29. package/development/pearl-chain/pearl-chain.component.d.ts.map +1 -1
  30. package/development/pearl-chain/pearl-chain.component.js +1 -1
  31. package/development/pearl-chain-time/pearl-chain-time.component.d.ts.map +1 -1
  32. package/development/pearl-chain-time/pearl-chain-time.component.js +1 -1
  33. package/development/{pearl-chain-time.component-DDnGnI77.js → pearl-chain-time.component-BxVQ1z-Z.js} +4 -4
  34. package/development/pearl-chain-time.js +1 -1
  35. package/development/pearl-chain-time.pure.js +1 -1
  36. package/development/pearl-chain-vertical/pearl-chain-vertical.component.d.ts.map +1 -1
  37. package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
  38. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.d.ts.map +1 -1
  39. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
  40. package/development/{pearl-chain-vertical-item.component-DHsk3J8I.js → pearl-chain-vertical-item.component-DJioJtxP.js} +3 -3
  41. package/development/pearl-chain-vertical-item.js +1 -1
  42. package/development/pearl-chain-vertical-item.pure.js +1 -1
  43. package/development/pearl-chain-vertical.component-zSOeIkhh.js +30 -0
  44. package/development/pearl-chain-vertical.js +1 -1
  45. package/development/pearl-chain-vertical.pure.js +1 -1
  46. package/development/{pearl-chain.component-CngXp3rK.js → pearl-chain.component-B83OsEx8.js} +4 -4
  47. package/development/pearl-chain.js +1 -1
  48. package/development/pearl-chain.pure.js +1 -1
  49. package/development/seat-reservation/common/types.d.ts +3 -4
  50. package/development/seat-reservation/common/types.d.ts.map +1 -1
  51. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +38 -7
  52. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
  53. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +143 -32
  54. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +2 -13
  55. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
  56. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  57. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.d.ts.map +1 -1
  58. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  59. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.d.ts.map +1 -1
  60. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  61. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
  62. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  63. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts.map +1 -1
  64. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +1 -1
  65. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -1
  66. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
  67. package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.d.ts.map +1 -1
  68. package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +1 -1
  69. package/development/seat-reservation-area.component-CMqjbUtV.js +94 -0
  70. package/development/seat-reservation-graphic.component-C2r57590.js +129 -0
  71. package/development/{seat-reservation-navigation-coach.component-DRCcI2ss.js → seat-reservation-navigation-coach.component-BwLbiHCG.js} +8 -8
  72. package/development/{seat-reservation-navigation-services.component-ZNm77ZG-.js → seat-reservation-navigation-services.component-Do8JLJh3.js} +8 -6
  73. package/development/{seat-reservation-place-control.component-BQ7fOSHM.js → seat-reservation-place-control.component-BfuOGZYq.js} +6 -6
  74. package/development/{seat-reservation-scoped.component-X-Kq0-w5.js → seat-reservation-scoped.component-D-Mvw-Q3.js} +3 -3
  75. package/development/seat-reservation.component-B2nJ13F1.js +472 -0
  76. package/development/seat-reservation.js +7 -7
  77. package/development/seat-reservation.pure.js +7 -7
  78. package/development/timetable-duration/timetable-duration.component.d.ts.map +1 -1
  79. package/development/timetable-duration/timetable-duration.component.js +1 -1
  80. package/development/timetable-duration.component-fBla8Kue.js +96 -0
  81. package/development/timetable-duration.js +1 -1
  82. package/development/timetable-duration.pure.js +1 -1
  83. package/development/timetable-row/timetable-row.component.d.ts.map +1 -1
  84. package/development/timetable-row/timetable-row.component.js +1 -1
  85. package/development/timetable-row.component-C9Y9Rev1.js +732 -0
  86. package/development/timetable-row.js +1 -1
  87. package/development/timetable-row.pure.js +1 -1
  88. package/journey-summary/journey-summary.component.js +1 -1
  89. package/{journey-summary.component-C7WPKx8k.js → journey-summary.component-CkDRawn9.js} +53 -54
  90. package/journey-summary.js +1 -1
  91. package/journey-summary.pure.js +1 -1
  92. package/package.json +2 -2
  93. package/pearl-chain/pearl-chain.component.js +1 -1
  94. package/pearl-chain-time/pearl-chain-time.component.js +1 -1
  95. package/{pearl-chain-time.component-awU4lFdO.js → pearl-chain-time.component-D5OCEBJ_.js} +11 -11
  96. package/pearl-chain-time.js +1 -1
  97. package/pearl-chain-time.pure.js +1 -1
  98. package/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
  99. package/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
  100. package/{pearl-chain-vertical-item.component-CO6HUZFL.js → pearl-chain-vertical-item.component-IdquCJMy.js} +28 -28
  101. package/pearl-chain-vertical-item.js +1 -1
  102. package/pearl-chain-vertical-item.pure.js +1 -1
  103. package/{pearl-chain-vertical.component-Lx47SlJU.js → pearl-chain-vertical.component-CDOWaup3.js} +6 -6
  104. package/pearl-chain-vertical.js +1 -1
  105. package/pearl-chain-vertical.pure.js +1 -1
  106. package/{pearl-chain.component-BAtmfmpA.js → pearl-chain.component-C6lcD7Xl.js} +5 -5
  107. package/pearl-chain.js +1 -1
  108. package/pearl-chain.pure.js +1 -1
  109. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +130 -77
  110. package/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  111. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  112. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  113. package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  114. package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +1 -1
  115. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
  116. package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +1 -1
  117. package/seat-reservation-area.component-BcmwKJSK.js +73 -0
  118. package/seat-reservation-graphic.component-C3wc4DKr.js +102 -0
  119. package/{seat-reservation-navigation-coach.component-CGfmiQJq.js → seat-reservation-navigation-coach.component-D1SgS8BU.js} +51 -51
  120. package/{seat-reservation-navigation-services.component-DQviLWvy.js → seat-reservation-navigation-services.component-CfAQa7pa.js} +29 -27
  121. package/{seat-reservation-place-control.component-BYJi6aYS.js → seat-reservation-place-control.component-DrzEDW8Z.js} +42 -42
  122. package/{seat-reservation-scoped.component-CdB7HYzl.js → seat-reservation-scoped.component-BohQUGVW.js} +6 -6
  123. package/{seat-reservation.component-uWai3ks6.js → seat-reservation.component-CB2IWgM9.js} +84 -88
  124. package/seat-reservation.js +7 -7
  125. package/seat-reservation.pure.js +7 -7
  126. package/timetable-duration/timetable-duration.component.js +1 -1
  127. package/{timetable-duration.component-PmvoOKVw.js → timetable-duration.component-DPRcG1LP.js} +7 -7
  128. package/timetable-duration.js +1 -1
  129. package/timetable-duration.pure.js +1 -1
  130. package/timetable-row/timetable-row.component.js +1 -1
  131. package/{timetable-row.component-BnmrhD2d.js → timetable-row.component-BqIVlISS.js} +34 -34
  132. package/timetable-row.js +1 -1
  133. package/timetable-row.pure.js +1 -1
  134. package/development/autocomplete-grid-cell.component-Buvsof-Y.js +0 -33
  135. package/development/journey-summary.component-B9P1PAJv.js +0 -342
  136. package/development/pearl-chain-vertical.component-Cmc3QXgd.js +0 -30
  137. package/development/seat-reservation-area.component-BQEtJhk0.js +0 -94
  138. package/development/seat-reservation-graphic.component-XpqxL5nq.js +0 -129
  139. package/development/seat-reservation.component-wkvc3Frp.js +0 -515
  140. package/development/timetable-duration.component-2JBYobDt.js +0 -96
  141. package/development/timetable-row.component-B884Zj89.js +0 -732
  142. package/seat-reservation-area.component-CVc6uuMG.js +0 -73
  143. package/seat-reservation-graphic.component-Dzkv9tyR.js +0 -102
@@ -1,515 +0,0 @@
1
- import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
2
- import { SbbSecondaryButtonElement } from "@sbb-esta/lyne-elements/button.pure.js";
3
- import { SbbLanguageController, SbbScreenReaderOnlyElement, boxSizingStyles } from "@sbb-esta/lyne-elements/core.js";
4
- import { html, isServer, nothing, unsafeCSS } from "lit";
5
- import { styleMap } from "lit/directives/style-map.js";
6
- import { classMap } from "lit/directives/class-map.js";
7
- import { getI18nSeatReservation } from "./seat-reservation/common/translations.js";
8
- import { SbbSeatReservationGraphicElement } from "./seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js";
9
- import { SbbPopoverElement } from "@sbb-esta/lyne-elements/popover.pure.js";
10
- import { repeat } from "lit/directives/repeat.js";
11
- import { SbbSeatReservationAreaElement } from "./seat-reservation/seat-reservation-area/seat-reservation-area.component.js";
12
- import { SbbSeatReservationNavigationCoachElement } from "./seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js";
13
- import { SbbSeatReservationPlaceControlElement } from "./seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js";
14
- import { SbbSeatReservationScopedElement } from "./seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js";
15
- //#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.scss?inline
16
- var seat_reservation_default = ":host {\n --sbb-seat-reservation-grid-size: 16px;\n --sbb-seat-reservation-height: 0;\n --sbb-seat-reservation-decks: 1;\n display: block;\n height: inherit;\n}\n:host ::part(coach-floor) {\n fill: var(--sbb-background-color-2);\n}\n@media (forced-colors: active) {\n :host ::part(coach-floor) {\n fill: transparent;\n }\n}\n\n:host(:dir(rtl)) :not(.sbb-sr-place-ctrl--type-bicycle,\n.sbb-sr-place-ctrl--orientation-90,\n.sbb-sr-place-ctrl--orientation-270,\n.sbb-sr-place-ctrl--state-selected) ::part(coach-floor) {\n rotate: calc(180 * 1deg);\n}\n\n[popover]:where(sbb-popover) {\n margin: 0;\n padding: 0;\n border: none;\n width: auto;\n height: auto;\n background-color: transparent;\n color: inherit;\n pointer-events: none;\n}\n[popover]:where(sbb-popover) .sbb-sr-popover {\n margin-block: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n:host([align-vertical]) .sbb-sr__component {\n flex-direction: row-reverse;\n justify-content: flex-end;\n gap: calc(22 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: inherit;\n}\n@media (min-width: calc(37.5rem)) {\n :host([align-vertical]) .sbb-sr__component {\n gap: calc(54 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n }\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation,\n:host([align-vertical]) .sbb-sr__component ul.sbb-sr-navigation__list-coaches {\n flex-direction: column;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation {\n padding: calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) 0;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation .sbb-sr__navigation-control-button {\n left: calc(1 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n top: 0;\n rotate: 90deg;\n}\n@media (min-width: calc(64rem)) {\n :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation .sbb-sr__navigation-control-button {\n left: calc(-1 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n }\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation ul.sbb-sr-navigation__list-coaches {\n max-width: initial;\n padding: calc(5 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n overflow: hidden scroll;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation ul.sbb-sr-navigation__list-coaches li {\n display: flex;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks {\n flex-direction: column;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels {\n flex-direction: column-reverse;\n width: calc((var(--sbb-seat-reservation-height) + 24) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: initial;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels b {\n inline-size: calc(50% - 16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n block-size: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-bottom: calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n rotate: initial;\n writing-mode: initial;\n}\n:host([align-vertical]) .sbb-sr__wrapper-scrollarea {\n width: calc((var(--sbb-seat-reservation-height) + 24) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: 100%;\n overflow: hidden scroll;\n}\n:host([align-vertical]) .sbb-sr__wrapper-scrollarea .sbb-sr__parent {\n rotate: 90deg;\n}\n:host([align-vertical]) .sbb-sr-travel-direction-wrapper {\n width: calc(var(--sbb-seat-reservation-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block-start: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr-navigation {\n gap: calc(3 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr-navigation .sbb-sr__navigation-control-button {\n position: relative;\n top: calc(2 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n@media (min-width: calc(64rem)) {\n .sbb-sr-navigation .sbb-sr__navigation-control-button {\n top: 0;\n }\n}\n\n.sbb-sr__component {\n display: flex;\n flex-direction: column;\n gap: calc(64 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem) - 16px);\n}\n\n.sbb-sr-travel-direction-wrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n column-gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n font-size: var(--sbb-text-font-size-s);\n}\n.sbb-sr-travel-direction-wrapper .sbb-sr__travel-direction--arrow {\n display: flex;\n align-items: center;\n}\n\n.sbb-sr-navigation-wrapper {\n display: flex;\n}\n\n.sbb-sr-navigation {\n display: flex;\n justify-content: center;\n width: 100%;\n padding-inline: 16px;\n}\n\n.sbb-sr-navigation__list-coaches {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n --sbb-scrollbar-thumb-width: 0.125rem;\n --sbb-scrollbar-thumb-width-hover: 0.25rem;\n --sbb-scrollbar-width-firefox: thin;\n --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);\n --sbb-scrollbar-color: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 30%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 30%, transparent)\n );\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n --sbb-scrollbar-color-hover: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 60%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 60%, transparent)\n );\n --sbb-scrollbar-track-color: transparent;\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar {\n width: var(--sbb-scrollbar-width);\n height: var(--sbb-scrollbar-width);\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar-thumb {\n background-color: var(--sbb-scrollbar-color, currentcolor);\n border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;\n border-radius: var(--sbb-border-radius-4x);\n background-clip: padding-box;\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar-thumb:hover {\n background-color: var(--sbb-scrollbar-color-hover, currentcolor);\n border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar-button, .sbb-sr-navigation__list-coaches::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-sr-navigation__list-coaches {\n scrollbar-width: var(--sbb-scrollbar-width-firefox);\n scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);\n }\n}\n.sbb-sr-navigation__list-coaches {\n display: flex;\n flex-wrap: nowrap;\n gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n padding: calc(6 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(5 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) 0;\n max-width: 856px;\n --sbb-scrollbar-color: transparent;\n overflow: scroll hidden;\n position: relative;\n}\n\n.sbb-sr__wrapper-coach-decks {\n display: flex;\n overflow: hidden;\n height: inherit;\n}\n.sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels {\n display: flex;\n justify-content: space-between;\n height: calc(var(--sbb-seat-reservation-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n writing-mode: vertical-lr;\n}\n.sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels b {\n height: calc(50% - 16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n width: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block-end: 16px;\n rotate: 180deg;\n text-align: center;\n line-height: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__wrapper-scrollarea {\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n --sbb-scrollbar-thumb-width: 0.125rem;\n --sbb-scrollbar-thumb-width-hover: 0.25rem;\n --sbb-scrollbar-width-firefox: thin;\n --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);\n --sbb-scrollbar-color: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 30%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 30%, transparent)\n );\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n --sbb-scrollbar-color-hover: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 60%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 60%, transparent)\n );\n --sbb-scrollbar-track-color: transparent;\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar {\n width: var(--sbb-scrollbar-width);\n height: var(--sbb-scrollbar-width);\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar-thumb {\n background-color: var(--sbb-scrollbar-color, currentcolor);\n border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;\n border-radius: var(--sbb-border-radius-4x);\n background-clip: padding-box;\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar-thumb:hover {\n background-color: var(--sbb-scrollbar-color-hover, currentcolor);\n border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar-button, .sbb-sr__wrapper-scrollarea::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-sr__wrapper-scrollarea {\n scrollbar-width: var(--sbb-scrollbar-width-firefox);\n scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);\n }\n}\n.sbb-sr__wrapper-scrollarea {\n overflow: scroll hidden;\n padding-block: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n.sbb-sr__wrapper-scrollarea .sbb-sr__parent {\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.sbb-sr__list-decks {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: flex;\n flex-direction: column;\n}\n\n.sbb-sr__list-decks--gap {\n gap: calc(48 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__list-item-deck {\n position: relative;\n}\n\n.sbb-sr__list-coaches {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: flex;\n gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__list-decks:has(.sbb-sr-coach-has-overhanging-elements) .sbb-sr__list-coaches {\n gap: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__item-coach {\n position: relative;\n}\n\n.sbb-sr-coach-wrapper__table {\n outline: 0;\n}";
17
- //#endregion
18
- //#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.component.ts
19
- /**
20
- * Main component for the seat reservation.
21
- *
22
- */
23
- var SbbSeatReservationElement = class extends SeatReservationBaseElement {
24
- constructor() {
25
- super(...arguments);
26
- this._language = new SbbLanguageController(this);
27
- this._notFixedRotatableAreaIcons = ["ENTRY_EXIT"];
28
- }
29
- static {
30
- this.elementName = "sbb-seat-reservation";
31
- }
32
- static {
33
- this.elementDependencies = [
34
- SbbSecondaryButtonElement,
35
- SbbScreenReaderOnlyElement,
36
- SbbPopoverElement,
37
- SbbSeatReservationAreaElement,
38
- SbbSeatReservationGraphicElement,
39
- SbbSeatReservationPlaceControlElement,
40
- SbbSeatReservationNavigationCoachElement,
41
- SbbSeatReservationScopedElement
42
- ];
43
- }
44
- static {
45
- this.styles = [boxSizingStyles, unsafeCSS(seat_reservation_default)];
46
- }
47
- willUpdate(changedProperties) {
48
- super.willUpdate(changedProperties);
49
- if (changedProperties.has("hasNavigation")) if (this.hasNavigation) this.shadowRoot?.querySelectorAll("table").forEach((table) => table.removeAttribute("tabindex"));
50
- else this.shadowRoot?.querySelectorAll("table").forEach((table) => table.setAttribute("tabindex", "0"));
51
- }
52
- firstUpdated(changedProperties) {
53
- super.firstUpdated(changedProperties);
54
- this.updateComplete.then(() => {
55
- this.initNavigationSelectionByScrollEvent();
56
- });
57
- }
58
- render() {
59
- this._initVehicleSeatReservationConstruction();
60
- return this._coachesHtmlTemplate || null;
61
- }
62
- _initVehicleSeatReservationConstruction() {
63
- this._coachesHtmlTemplate = html`
64
- ${this._renderTravelDirection()}
65
- <div class="sbb-sr__component">
66
- ${this._renderNavigation()}
67
- <div
68
- class="sbb-sr__wrapper-coach-decks"
69
- @keydown=${(evt) => this.keyboardSeatmapEventHandling(evt)}
70
- >
71
- <div class="sbb-sr__wrapper-deck-labels">${this._renderDeckLabels()}</div>
72
- <div
73
- @scroll=${() => this.coachAreaScrollend()}
74
- id="sbb-sr__wrapper-scrollarea"
75
- class="sbb-sr__wrapper-scrollarea"
76
- tabindex="-1"
77
- >
78
- <div id="sbb-sr__parent-area" class="sbb-sr__parent">
79
- <ul
80
- class="${classMap({
81
- "sbb-sr__list-decks": true,
82
- "sbb-sr__list-decks--gap": this.hasMultipleDecks
83
- })}"
84
- >
85
- ${this.seatReservations?.map((seatReservation, coachDeckIndex) => {
86
- return html`<li class="sbb-sr__list-item-deck">
87
- <ul class="sbb-sr__list-coaches" role="presentation">
88
- ${this._renderCoaches(seatReservation, coachDeckIndex)}
89
- </ul>
90
- </li>`;
91
- })}
92
- </ul>
93
- </div>
94
- </div>
95
- </div>
96
- </div>
97
- `;
98
- }
99
- _renderDeckLabels() {
100
- if (!this.hasMultipleDecks) return null;
101
- return this.seatReservations.map((seatReservation) => {
102
- return html`<b aria-hidden="true">${getI18nSeatReservation(seatReservation.deckCoachLevel, this._language.current)}</b>`;
103
- });
104
- }
105
- _renderNavigationControlButton(btnDirection) {
106
- if (!this.hasNavigation || !this.seatReservations) return null;
107
- const btnNavigationDirectionId = btnDirection == "DIRECTION_RIGHT" ? "sbb-sr-navigation__wrapper-button-direction--right" : "sbb-sr-navigation__wrapper-button-direction--left";
108
- const btnIcon = btnDirection == "DIRECTION_RIGHT" ? "chevron-small-right-small" : "chevron-small-left-small";
109
- const btnAriaDescription = btnDirection == "DIRECTION_RIGHT" ? getI18nSeatReservation("SEAT_RESERVATION_END", this._language.current) : getI18nSeatReservation("SEAT_RESERVATION_BEGIN", this._language.current);
110
- let btnDisabled = true;
111
- if (btnDirection == "DIRECTION_LEFT" && this.selectedCoachIndex > 0) btnDisabled = false;
112
- else if (btnDirection == "DIRECTION_RIGHT" && this.selectedCoachIndex < this.coachItemDetailsElements.length - 1) btnDisabled = false;
113
- return html`<div class="sbb-sr-navigation__wrapper-button-direction">
114
- <sbb-secondary-button
115
- @click="${() => this.navigateByDirectionBtn(btnDirection)}"
116
- @focus="${() => this.onFocusNavDirectionButton()}"
117
- id="${btnNavigationDirectionId}"
118
- class="sbb-sr__navigation-control-button"
119
- size="m"
120
- icon-name="${btnIcon}"
121
- type="button"
122
- aria-label="${btnAriaDescription}"
123
- role="button"
124
- .disabledInteractive="${btnDisabled || nothing}"
125
- .disabled="${btnDisabled || nothing}"
126
- ></sbb-secondary-button>
127
- </div>`;
128
- }
129
- _renderTravelDirection() {
130
- if (!this.travelDirection || this.travelDirection === "NONE") return null;
131
- const labelText = getI18nSeatReservation("SEAT_RESERVATION_TRAVEL_DIRECTION", this._language.current);
132
- return html`<div class="sbb-sr-travel-direction-wrapper">
133
- <div class="sbb-sr__travel-direction--arrow">
134
- <sbb-icon slot="icon" name="${`arrow-${this.alignVertical ? this.travelDirection === "RIGHT" ? "down" : "up" : this.travelDirection === "RIGHT" ? "right" : "left"}-small`}"></sbb-icon>
135
- </div>
136
- <div class="sbb-sr__travel-direction--label">${labelText}</div>
137
- </div>`;
138
- }
139
- _renderNavigation() {
140
- if (isServer || !this.hasNavigation || !this.seatReservations) return null;
141
- return html`<div class="sbb-sr-navigation-wrapper">
142
- <nav id="sbb-sr-navigation" class="sbb-sr-navigation">
143
- ${this._renderNavigationControlButton("DIRECTION_LEFT")}
144
- <ul
145
- id="sbb-sr__navigation-list-coaches"
146
- class="sbb-sr-navigation__list-coaches"
147
- aria-label="${getI18nSeatReservation("SEAT_RESERVATION_NAVIGATION", this._language.current)}"
148
- >
149
- ${this.coachItemDetailsElements.map((coachItemDetails, index) => {
150
- return html`<li>
151
- <sbb-seat-reservation-navigation-coach
152
- @selectcoach=${(event) => this._onSelectNavCoach(event)}
153
- @focuscoach=${() => this._onFocusNavCoach()}
154
- @keyup=${(evt) => this.onKeyNavigationNavCoachButton(evt, index)}
155
- index="${index}"
156
- .selected=${this.selectedCoachIndex === index}
157
- .focused=${this.focusedCoachIndex === index}
158
- .hovered=${this.hoveredCoachIndex === index}
159
- .nativeFocusActive=${this.hasSeatReservationNativeFocus}
160
- .coachItemDetails="${coachItemDetails}"
161
- ?vertical="${this.alignVertical}"
162
- ?showTitleInfo="${this.showTitleInfo}"
163
- >
164
- </sbb-seat-reservation-navigation-coach>
165
- </li>`;
166
- })}
167
- </ul>
168
- ${this._renderNavigationControlButton("DIRECTION_RIGHT")}
169
- </nav>
170
- </div>`;
171
- }
172
- /**
173
- *
174
- * @returns
175
- * @param seatReservation
176
- * @param coachDeckIndex
177
- */
178
- _renderCoaches(seatReservation, coachDeckIndex) {
179
- const coaches = JSON.parse(JSON.stringify(seatReservation?.coachItems));
180
- if (!coaches || isServer) return null;
181
- return coaches.map((coachItem, coachIndex) => {
182
- return html`
183
- <li class="sbb-sr__item-coach">
184
- ${this._renderCoachElement(coachItem, coachIndex, coachDeckIndex, seatReservation.deckCoachIndex)}
185
- </li>
186
- `;
187
- });
188
- }
189
- _renderCoachElement(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
190
- const calculatedCoachDimension = this.getCalculatedDimension(coachItem.dimension);
191
- const descriptionTableCoachWithServices = this._getDescriptionTableCoach(coachItem);
192
- return html`<sbb-seat-reservation-scoped
193
- style=${styleMap({
194
- "--sbb-seat-reservation-scoped-width": calculatedCoachDimension.w,
195
- "--sbb-seat-reservation-scoped-height": calculatedCoachDimension.h
196
- })}
197
- >
198
- ${this._getRenderedCoachBorders(coachItem, coachIndex)}
199
- ${this._getRenderedGraphicalElements(coachItem.graphicElements || [], coachItem.dimension, coachIndex, coachDeckIndex)}
200
- ${this._getRenderedServiceElements(coachIndex, coachDeckIndex, coachItem.serviceElements)}
201
-
202
- <table
203
- @focus=${() => this.onFocusTableCoachAndPreselectPlace(coachIndex)}
204
- id="sbb-sr-coach-${coachIndex}"
205
- class="sbb-sr-coach-wrapper__table"
206
- aria-describedby="sbb-sr-coach-caption-${coachIndex}"
207
- tabindex="-1"
208
- >
209
- <caption id="sbb-sr-coach-caption-${coachIndex}" tabindex="-1">
210
- <sbb-screen-reader-only>${descriptionTableCoachWithServices}</sbb-screen-reader-only>
211
- </caption>
212
- ${this._getRenderedRowPlaces(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
213
- </table>
214
- </sbb-seat-reservation-scoped>`;
215
- }
216
- /**
217
- * @returns Returns the border graphic (COACH_BORDER_MIDDLE) of a coach with calculated border gap and coach width,
218
- * depending on whether the coach is with a driver area or without.
219
- */
220
- _getRenderedCoachBorders(coachItem, coachIndex) {
221
- if (!coachItem.graphicElements) return null;
222
- const COACH_PASSAGE_WIDTH = 1;
223
- const driverArea = this.coachItemDetailsElements[coachIndex]?.driverAreaElements?.driverArea;
224
- const driverAreaNoVerticalWall = this.coachItemDetailsElements[coachIndex]?.driverAreaElements?.driverAreaNoVerticalWall;
225
- let borderWidth = driverArea ? coachItem.dimension.w - driverArea.dimension.w - COACH_PASSAGE_WIDTH : coachItem.dimension.w - COACH_PASSAGE_WIDTH * 2;
226
- borderWidth *= this.baseGridSize;
227
- const borderHeight = (coachItem.dimension.h + this.coachBorderOffset * 2) * this.baseGridSize;
228
- let borderOffsetX = driverArea && driverArea.position.x === 0 ? driverArea?.dimension.w * this.baseGridSize : this.baseGridSize;
229
- if (driverAreaNoVerticalWall) {
230
- borderWidth = this.getCalculatedDimension(coachItem.dimension).w - 2 * (driverAreaNoVerticalWall.dimension.w * this.baseGridSize);
231
- borderOffsetX = driverAreaNoVerticalWall.dimension.w * this.baseGridSize;
232
- }
233
- const currentCoachOverlappingInfo = this.overHangingElementInformation.find((el) => el.coachId === coachItem.id);
234
- if (currentCoachOverlappingInfo?.overhangingPlaces || currentCoachOverlappingInfo?.overhangingGraphicAreas) {
235
- borderWidth += 2 * this.baseGridSize;
236
- borderOffsetX = 0;
237
- }
238
- return html`
239
- <sbb-seat-reservation-graphic
240
- class="${classMap({ "sbb-sr-coach-has-overhanging-elements": currentCoachOverlappingInfo?.overhangingPlaces || currentCoachOverlappingInfo?.overhangingGraphicAreas || false })}"
241
- style=${styleMap({
242
- "--sbb-seat-reservation-graphic-width": borderWidth,
243
- "--sbb-seat-reservation-graphic-height": borderHeight,
244
- "--sbb-seat-reservation-graphic-top": this.coachBorderPadding * -1,
245
- "--sbb-seat-reservation-graphic-left": borderOffsetX,
246
- "--sbb-seat-reservation-graphic-position": "absolute"
247
- })}
248
- name="COACH_BORDER_MIDDLE"
249
- ?stretch=${true}
250
- role="presentation"
251
- ></sbb-seat-reservation-graphic>
252
- `;
253
- }
254
- _getRenderedRowPlaces(coach, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
255
- if (!coach.places) return null;
256
- const tableRowPlaces = {};
257
- for (const place of coach.places) if (!tableRowPlaces[place.position.y]) tableRowPlaces[place.position.y] = [place];
258
- else tableRowPlaces[place.position.y].push(place);
259
- return Object.values(tableRowPlaces).map((rowPlaces, index) => {
260
- return html`
261
- <tr id="row-${coachIndex}-${rowPlaces[0].position.y}" data-row-index=${index}>
262
- ${this._getRenderedColumnPlaces(rowPlaces, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
263
- </tr>
264
- `;
265
- }).flatMap((rowTemplate) => rowTemplate);
266
- }
267
- _getRenderedColumnPlaces(places, coachIndex, deckIndex, placeCoachDeckIndex) {
268
- places.sort((placeA, placeB) => Number(placeA.position.x) - Number(placeB.position.x));
269
- const trackPlaceId = coachIndex + "-" + placeCoachDeckIndex;
270
- return html`${repeat(places, (place) => trackPlaceId + "-" + place.number, (place, index) => {
271
- const calculatedDimension = this.getCalculatedDimension(place.dimension);
272
- const calculatedPosition = this.getCalculatedPosition(place.position);
273
- const rotation = place.rotation || 0;
274
- const textRotation = this.alignVertical ? -90 : 0;
275
- const placeId = this.getPlaceElementId(deckIndex, coachIndex, place.number);
276
- return html`
277
- <td
278
- id="cell-${deckIndex}-${coachIndex}-${place.position.y}-${index}"
279
- class="graphical-element"
280
- >
281
- <sbb-seat-reservation-place-control
282
- style=${styleMap({
283
- "--sbb-seat-reservation-place-control-text-scale-value": Math.min(calculatedDimension.w, calculatedDimension.h),
284
- "--sbb-seat-reservation-place-control-width": calculatedDimension.w,
285
- "--sbb-seat-reservation-place-control-height": calculatedDimension.h,
286
- "--sbb-seat-reservation-place-control-top": calculatedPosition.y,
287
- "--sbb-seat-reservation-place-control-left": calculatedPosition.x,
288
- "--sbb-seat-reservation-place-control-rotation": rotation,
289
- "--sbb-seat-reservation-place-control-text-rotation": textRotation
290
- })}
291
- @selectplace=${(selectPlaceEvent) => this._onSelectPlace(selectPlaceEvent)}
292
- exportparts="sbb-sr-place-part"
293
- id=${placeId}
294
- class="seat-reservation-place-control"
295
- text=${place.number}
296
- type=${place.type}
297
- state=${place.state}
298
- travel-direction=${this.travelDirection}
299
- coach-index=${coachIndex}
300
- deck-index=${placeCoachDeckIndex}
301
- data-deck-index=${deckIndex}
302
- .propertyIds=${place.propertyIds}
303
- .preventClick=${this.preventPlaceClick}
304
- ?showTitleInfo="${this.showTitleInfo}"
305
- ></sbb-seat-reservation-place-control>
306
- </td>
307
- `;
308
- })}`;
309
- }
310
- _getRenderedGraphicalElements(graphicalElements, coachDimension, coachIndex, coachDeckIndex) {
311
- if (!graphicalElements) return null;
312
- return graphicalElements?.map((graphicalElement) => {
313
- const icon = graphicalElement.icon ?? "";
314
- const elementRotation = graphicalElement.rotation || 0;
315
- const isNotFixedRotationGraphicalElement = this._notFixedRotatableAreaIcons.indexOf(graphicalElement.icon) === -1;
316
- const elementFixedRotation = this.alignVertical && isNotFixedRotationGraphicalElement ? elementRotation - 90 : elementRotation;
317
- if (this.notAreaElements.findIndex((notAreaElement) => notAreaElement === icon) > -1) return this._getRenderElementWithoutArea(graphicalElement, elementRotation, coachDimension);
318
- return this._getRenderElementWithArea(graphicalElement, elementFixedRotation, coachDimension, coachIndex, coachDeckIndex);
319
- });
320
- }
321
- /**
322
- * creates a rendered element with an area component
323
- * @param graphicalElement
324
- * @param rotation
325
- * @param coachDimension
326
- * @param coachIndex used to generate a unique id for the popover trigger
327
- * @param coachDeckIndex used to generate a unique id
328
- * @private
329
- */
330
- _getRenderElementWithArea(graphicalElement, rotation, coachDimension, coachIndex, coachDeckIndex) {
331
- const isNotTableGraphic = graphicalElement.icon?.indexOf("TABLE") === -1;
332
- const areaProperty = graphicalElement.icon && isNotTableGraphic ? graphicalElement.icon : null;
333
- const stretchHeight = this.isElementDirectlyOnBorder(graphicalElement, coachDimension) && areaProperty !== "ENTRY_EXIT";
334
- const ariaLabelForArea = graphicalElement.icon ? getI18nSeatReservation(graphicalElement.icon, this._language.current) : nothing;
335
- const calculatedDimension = this.getCalculatedDimension(graphicalElement.dimension, coachDimension, true, stretchHeight);
336
- const calculatedPosition = this.getCalculatedPosition(graphicalElement.position, graphicalElement.dimension, coachDimension, true);
337
- const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${calculatedPosition.x}-${calculatedPosition.y}`;
338
- let elementMounting = "free";
339
- if (graphicalElement.position.y === this.coachBorderOffset * -1) elementMounting = "upper-border";
340
- else if (graphicalElement.position.y + graphicalElement.dimension.h === coachDimension.h + this.coachBorderOffset) elementMounting = "lower-border";
341
- if (elementMounting !== "free") {
342
- calculatedPosition.y += elementMounting === "upper-border" ? 2 : 1;
343
- calculatedDimension.h -= 3;
344
- }
345
- return html`
346
- <sbb-seat-reservation-area
347
- id="${triggerId}"
348
- class="${classMap({ "sbb-seat-reservation-area--cursor-pointer": areaProperty !== null })}"
349
- style=${styleMap({
350
- "--sbb-seat-reservation-area-width": calculatedDimension.w,
351
- "--sbb-seat-reservation-area-height": calculatedDimension.h,
352
- "--sbb-seat-reservation-area-top": calculatedPosition.y,
353
- "--sbb-seat-reservation-area-left": calculatedPosition.x
354
- })}
355
- mounting=${elementMounting}
356
- background="dark"
357
- aria-hidden="true"
358
- >
359
- ${areaProperty ? html`
360
- <sbb-seat-reservation-graphic
361
- style=${styleMap({
362
- "--sbb-seat-reservation-graphic-max-width": this.globalAreaIconDim.w,
363
- "--sbb-seat-reservation-graphic-max-height": this.globalAreaIconDim.h,
364
- "--sbb-seat-reservation-graphic-width": calculatedDimension.w,
365
- "--sbb-seat-reservation-graphic-height": calculatedDimension.h,
366
- "--sbb-seat-reservation-graphic-rotation": rotation,
367
- "--sbb-seat-reservation-graphic-padding-percent": areaProperty !== "ENTRY_EXIT" ? this.globalAreaIconPadding : 1
368
- })}
369
- name=${areaProperty}
370
- role="img"
371
- aria-hidden="true"
372
- class="sbb-sr-graphic__dimension--square-dim"
373
- ></sbb-seat-reservation-graphic>
374
- ` : nothing}
375
- </sbb-seat-reservation-area>
376
- ${areaProperty ? this._popover(triggerId, ariaLabelForArea) : nothing}
377
- `;
378
- }
379
- _getRenderElementWithoutArea(graphicalElement, rotation, coachDimension) {
380
- const calculatedDimension = this.getCalculatedDimension(graphicalElement.dimension, coachDimension);
381
- const calculatedPosition = this.getCalculatedPosition(graphicalElement.position, graphicalElement.dimension, coachDimension);
382
- const icon = graphicalElement.icon && graphicalElement.icon.endsWith("DRIVER_AREA") ? graphicalElement.icon?.concat("_", this.seatReservations[this.currSelectedDeckIndex].vehicleType) : graphicalElement.icon;
383
- return html` <sbb-seat-reservation-graphic
384
- style=${styleMap({
385
- "--sbb-seat-reservation-graphic-width": calculatedDimension.w,
386
- "--sbb-seat-reservation-graphic-height": calculatedDimension.h,
387
- "--sbb-seat-reservation-graphic-top": calculatedPosition.y,
388
- "--sbb-seat-reservation-graphic-left": calculatedPosition.x,
389
- "--sbb-seat-reservation-graphic-position": "absolute",
390
- "--sbb-seat-reservation-graphic-rotation": rotation
391
- })}
392
- name=${icon ?? nothing}
393
- aria-hidden="true"
394
- ?stretch=${true}
395
- ></sbb-seat-reservation-graphic>`;
396
- }
397
- _getRenderedServiceElements(coachIndex, coachDeckIndex, serviceElements) {
398
- if (!serviceElements) return null;
399
- return serviceElements?.map((serviceElement) => {
400
- const titleDescription = serviceElement.icon ? getI18nSeatReservation(serviceElement.icon, this._language.current) : null;
401
- const calculatedDimension = this.getCalculatedDimension(serviceElement.dimension);
402
- const calculatedPosition = this.getCalculatedPosition(serviceElement.position);
403
- const elementRotation = serviceElement.rotation || 0;
404
- const elementFixedRotation = this.alignVertical ? elementRotation - 90 : elementRotation;
405
- const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${calculatedPosition.x}-${calculatedPosition.y}`;
406
- return html`
407
- <sbb-seat-reservation-graphic
408
- id="${triggerId}"
409
- style=${styleMap({
410
- "--sbb-seat-reservation-graphic-width": calculatedDimension.w,
411
- "--sbb-seat-reservation-graphic-height": calculatedDimension.h,
412
- "--sbb-seat-reservation-graphic-top": calculatedPosition.y,
413
- "--sbb-seat-reservation-graphic-left": calculatedPosition.x,
414
- "--sbb-seat-reservation-graphic-position": "absolute",
415
- "--sbb-seat-reservation-graphic-rotation": elementFixedRotation
416
- })}
417
- class="sbb-seat-reservation-graphic--cursor-pointer"
418
- name=${serviceElement.icon ?? nothing}
419
- role="img"
420
- aria-hidden="true"
421
- ></sbb-seat-reservation-graphic>
422
- ${this._popover(triggerId, titleDescription)}
423
- `;
424
- });
425
- }
426
- /**
427
- * Manages the selected place event triggered from the place
428
- * Each selection emits an array of all selected places
429
- * @param selectPlaceEvent
430
- */
431
- _onSelectPlace(selectPlaceEvent) {
432
- const selectedPlace = selectPlaceEvent.detail;
433
- this.preventCoachScrollByPlaceClick = true;
434
- this.isCoachGridFocusable = false;
435
- this.focusedCoachIndex = -1;
436
- if (!this.hasSeatReservationNativeFocus) this.hasSeatReservationNativeFocus = true;
437
- if (!this.preventPlaceClick) {
438
- this.updateSelectedSeatReservationPlaces(selectedPlace);
439
- this.updateCurrentSelectedPlaceInCoach(selectedPlace);
440
- }
441
- }
442
- _onSelectNavCoach(event) {
443
- const selectedNavCoachIndex = event.detail;
444
- this.isKeyboardNavigation = false;
445
- this.preventCoachScrollByPlaceClick = false;
446
- this.hasSeatReservationNativeFocus = true;
447
- if (selectedNavCoachIndex !== null && selectedNavCoachIndex !== this.currSelectedCoachIndex) {
448
- this.unfocusPlaceElement();
449
- this.scrollToSelectedNavCoach(selectedNavCoachIndex);
450
- } else if (selectedNavCoachIndex === this.currSelectedCoachIndex) {
451
- this.updateCurrentSelectedCoach();
452
- this.preselectPlaceInCoach();
453
- }
454
- this._closePopover();
455
- }
456
- _onFocusNavCoach() {
457
- if (!this.preventCoachScrollByPlaceClick) this.preselectPlaceInCoach();
458
- else this.focusPlaceElement(this.currSelectedPlace);
459
- this.isAutoScrolling = false;
460
- }
461
- /**
462
- * Creates a popover for extra service information
463
- * @param triggerId
464
- * @param popoverContent
465
- * @private
466
- */
467
- _popover(triggerId, popoverContent) {
468
- return html`
469
- <sbb-popover trigger="${triggerId}" hover-trigger="">
470
- <p class="sbb-text-s sbb-sr-popover">${popoverContent}</p>
471
- </sbb-popover>
472
- `;
473
- }
474
- /**
475
- * trigger to close all opened popovers (normally only one is opened at a time)
476
- * @private
477
- */
478
- _closePopover() {
479
- this.shadowRoot?.querySelectorAll("sbb-popover:is(:state(state-opened),[state--state-opened])").forEach((popover) => popover.close());
480
- }
481
- _getDescriptionTableCoach(coachItem) {
482
- if (coachItem.type === "LOCOMOTIVE_COACH") return getI18nSeatReservation("COACH_LOCOMOTIVE", this._language.current);
483
- if (!coachItem.places?.length) return getI18nSeatReservation("COACH_BLOCKED_TABLE_CAPTION", this._language.current, [coachItem.id]);
484
- let tableCoachDescription;
485
- const areaDescriptions = this._getTitleDescriptionListString(coachItem.graphicElements);
486
- const serviceDescriptions = this._getTitleDescriptionListString(coachItem.serviceElements);
487
- tableCoachDescription = getI18nSeatReservation("COACH_TABLE_CAPTION", this._language.current, [coachItem.id]);
488
- if (!this.hasNavigation) {
489
- const freePlaces = this.getAvailableFreePlacesNumFromCoach(coachItem.places);
490
- const freePlacesTxt = getI18nSeatReservation("COACH_AVAILABLE_NUMBER_OF_PLACES", this._language.current, [freePlaces.seats, freePlaces.bicycles]);
491
- tableCoachDescription = tableCoachDescription.concat(". ").concat(freePlacesTxt).concat(". ");
492
- }
493
- if (!!areaDescriptions || !!serviceDescriptions) {
494
- tableCoachDescription += ". " + getI18nSeatReservation("COACH_AVAILABLE_SERVICES", this._language.current) + ": ";
495
- tableCoachDescription += serviceDescriptions + ", " + areaDescriptions + ".";
496
- }
497
- return tableCoachDescription;
498
- }
499
- _getTitleDescriptionListString(descriptionsElements) {
500
- const uniqueDescriptions = [];
501
- return descriptionsElements?.map((descriptionElement) => {
502
- const icon = descriptionElement.icon;
503
- if (!icon) return null;
504
- const descriptionAlreadyExist = uniqueDescriptions.indexOf(icon) > -1;
505
- const translation = getI18nSeatReservation(descriptionElement.icon, this._language.current);
506
- const isValidDescription = this._notFixedRotatableAreaIcons.indexOf(icon) === -1 && this.notAreaElements.indexOf(icon) === -1;
507
- if (!descriptionAlreadyExist) uniqueDescriptions.push(descriptionElement.icon);
508
- return !!translation && !descriptionAlreadyExist && isValidDescription ? translation : null;
509
- }).filter((description) => !!description).join(", ");
510
- }
511
- };
512
- //#endregion
513
- export { SbbSeatReservationElement as t };
514
-
515
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQtd2t2YzNGcnAuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5AdXNlICcuLi9jb21tb24vc3R5bGVzL3NlYXQtcmVzZXJ2YXRpb24tbWl4aW5zJyBhcyBzYmItc3ItbWl4aW5zO1xuQHVzZSAnLi4vY29tbW9uL3N0eWxlcy9zZWF0LXJlc2VydmF0aW9uLWZ1bmN0aW9ucycgYXMgc2JiLXNyLWZ1bmN0aW9ucztcblxuLy8gTWF4aW11bSByZXNwb25zaXZlIG5hdmlnYXRpb24gd2lkdGgsIGNvbnNpc3RzIG9mIHRoZSBtYXhpbXVtIG5hdmlnYXRpb24gZXh0ZW50IG1pbnVzIDJ4IG5hdiBkaXJlY3Rpb24gYnV0dG9ucyA5NnB4IGFuZCA4cHggcGFkZGluZy5cbiRtYXgtY29hY2gtbmF2aWdhdGlvbi13aWR0aDogY2FsYyg5NjBweCAtIDk2cHggLSA4cHgpO1xuJHNjcm9sbGJhci1oZWlnaHQ6IDE2cHg7XG5cbjpob3N0IHtcbiAgLy8gTm90ZTogVGhlIHVzZSBvZiBweCBpcyBpbnRlbnRpb25hbCBoZXJlLCBiZWNhdXNlIG1hbnkgd2lkdGhzL2hlaWdodHMsIHJvdGF0aW9ucywgc2NhbGVzLCBldGMuIGRlcGVuZHMgb24gdGhpcy5cbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemU6IDE2cHg7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0OiAwO1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzOiAxO1xuXG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgOjpwYXJ0KGNvYWNoLWZsb29yKSB7XG4gICAgZmlsbDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMik7XG5cbiAgICAvLyBJbiBIaWdoIENvbnRyYXN0IE1vZGUgd2Ugc2V0IGZsb29yIGNvbG9yIHRvIHRyYW5zcGFyZW50XG4gICAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgICAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8vIHJvdGF0ZXMgdGhlIERPTS1wYXJ0IFwiY29hY2gtZmxvb3JcIiBieSAxODAgZGVncmVlcyBpZiB0aGUgaG9zdCBpcyBpbiBSVEwgbW9kZS5cbkBpbmNsdWRlIHNiYi1zci1taXhpbnMucm90YXRlLWRvbS1wYXJ0KGNvYWNoLWZsb29yKTtcblxuW3BvcG92ZXJdOndoZXJlKHNiYi1wb3BvdmVyKSB7XG4gIEBpbmNsdWRlIHNiYi5wb3BvdmVyLXJlc2V0O1xuXG4gIC5zYmItc3ItcG9wb3ZlciB7XG4gICAgbWFyZ2luLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBTVEFSVCAtIFZlcnRpY2FsIG1vZGVcbjpob3N0KFthbGlnbi12ZXJ0aWNhbF0pIHtcbiAgJGNvYWNoLW5hdmlnYXRpb24tcGFkZGluZzogNTtcbiAgJGNvYWNoLXNjcm9sbGJhci13aWR0aDogMjQ7XG4gICRjb2FjaC1ncmlkLXdpZHRoOiBjYWxjKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCkgKyAkY29hY2gtc2Nyb2xsYmFyLXdpZHRoKTtcblxuICAuc2JiLXNyX19jb21wb25lbnQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjIpO1xuICAgIGhlaWdodDogaW5oZXJpdDtcblxuICAgIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogc21hbGwpIHtcbiAgICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNTQpO1xuICAgIH1cblxuICAgIG5hdi5zYmItc3ItbmF2aWdhdGlvbixcbiAgICB1bC5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgbmF2LnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgICAgIHBhZGRpbmc6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KSAwO1xuXG4gICAgICAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMSk7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcm90YXRlOiA5MGRlZztcblxuICAgICAgICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oLTEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVsLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICAgICAgICBtYXgtd2lkdGg6IGluaXRpYWw7XG5cbiAgICAgICAgLy8gUGFkZGluZyBuZWVkcyB0byB2aXN1YWwgZm9jdXMtdmlzaWJsZSBzdHlsZSBmb3IgbmF2IGJ1dHRvbiBpbnNpZGUgb3ZlcmZsb3cgY29udGVudCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZvY3VzLXZpc2libGUgc3R5bGUgaXMgY3V0dGVkLlxuICAgICAgICBwYWRkaW5nOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtbmF2aWdhdGlvbi1wYWRkaW5nKTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbiBzY3JvbGw7XG5cbiAgICAgICAgLy8gaW4gdmVydGljYWwgbW9kZSwgdGhlIGxpIG11c3QgYmUgZmxleGVkOyBvdGhlcndpc2UgaXQgd291bGQgY2FsY3VsYXRlIHRoZSB3cm9uZyBoZWlnaHRcbiAgICAgICAgLy8gZHVlIHRvIHVzZXJhZ2VudCBzdHlsZSBzZXQgdG8gXCJsaXN0LWl0ZW1cIiBmb3IgZGlzcGxheVxuICAgICAgICBsaSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBMQUJFTE1VTFRJUExFIERFQ0tTIC0gTEFCRUxTXG4gIC5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAuc2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtZ3JpZC13aWR0aCk7XG4gICAgICBoZWlnaHQ6IGluaXRpYWw7XG5cbiAgICAgIGIge1xuICAgICAgICBpbmxpbmUtc2l6ZTogY2FsYyg1MCUgLSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNikpO1xuICAgICAgICBibG9jay1zaXplOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KTtcbiAgICAgICAgcm90YXRlOiBpbml0aWFsO1xuICAgICAgICB3cml0aW5nLW1vZGU6IGluaXRpYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVkVSVElDQUwgTU9ERSAtIFNFQVRNQVAgU0NST0xMIEFSRUFcbiAgLnNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLWdyaWQtd2lkdGgpO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuIHNjcm9sbDtcblxuICAgIC5zYmItc3JfX3BhcmVudCB7XG4gICAgICByb3RhdGU6IDkwZGVnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBUUkFWRUwtRElSRUNUSU9OXG4gIC5zYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0odmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0KSk7XG4gICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBFTkQgLSBWZXJ0aWNhbCBtb2RlXG5cbi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMyk7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbiAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLnNiYi1zcl9fY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiBjYWxjKHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDY0KSAtICRzY3JvbGxiYXItaGVpZ2h0KTtcbn1cblxuLy8gVFJBVkVMIERJUkVDVElPTlxuLnNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sdW1uLWdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIG1hcmdpbi1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tc2JiLXRleHQtZm9udC1zaXplLXMpO1xuXG4gIC5zYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbn1cblxuLy8gTkFWSUdBVElPTiBORVdcbi5zYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nLWlubGluZTogMTZweDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcbiAgQGluY2x1ZGUgc2JiLnNjcm9sbGJhcjtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgcGFkZGluZzogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNikgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNSkgMDtcbiAgbWF4LXdpZHRoOiAkbWF4LWNvYWNoLW5hdmlnYXRpb24td2lkdGg7XG5cbiAgLy8gU2V0IHNiYiBzY3JvbGxiYXIgdHJhbnNwYXJlbnQgYnkgZGVmYXVsdFxuICAtLXNiYi1zY3JvbGxiYXItY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLSBTZWF0IFJlc2VydmF0aW9uIE1haW4gTmF2aWdhdGlvbiAtIEVORCAtLS0tLS0tLS0tLS0tLS0tXG5cbi8vIC0tLS0tLS0tLS0tLS0gU2VhdCBSZXNlcnZhdGlvbiBDb2FjaGVzIC0gU1RBUlQgLS0tLS0tLS0tLS0tLS0tLS1cbi5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgLnNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVscyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgaGVpZ2h0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSh2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQpKTtcbiAgICB3cml0aW5nLW1vZGU6IHZlcnRpY2FsLWxyO1xuXG4gICAgYiB7XG4gICAgICBoZWlnaHQ6IGNhbGMoNTAlIC0gc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpKTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICBtYXJnaW4tYmxvY2stZW5kOiAxNnB4O1xuICAgICAgcm90YXRlOiAxODBkZWc7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBsaW5lLWhlaWdodDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEge1xuICBAaW5jbHVkZSBzYmIuc2Nyb2xsYmFyO1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwYWRkaW5nLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg4KSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNik7XG5cbiAgLnNiYi1zcl9fcGFyZW50IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG59XG5cbi5zYmItc3JfX2xpc3QtZGVja3Mge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4uc2JiLXNyX19saXN0LWRlY2tzLS1nYXAge1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQ4KTtcbn1cblxuLnNiYi1zcl9fbGlzdC1pdGVtLWRlY2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zYmItc3JfX2xpc3QtY29hY2hlcyB7XG4gIEBpbmNsdWRlIHNiYi5saXN0LXJlc2V0O1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG59XG5cbi8vIElmIHRoZXJlIGFyZSBvdmVyaGFuZ2luZyBlbGVtZW50cyB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBnYXAgYmV0d2VlbiBjb2FjaGVzXG4uc2JiLXNyX19saXN0LWRlY2tzOmhhcyguc2JiLXNyLWNvYWNoLWhhcy1vdmVyaGFuZ2luZy1lbGVtZW50cykgLnNiYi1zcl9fbGlzdC1jb2FjaGVzIHtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg4KTtcbn1cblxuLnNiYi1zcl9faXRlbS1jb2FjaCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNiYi1zci1jb2FjaC13cmFwcGVyX190YWJsZSB7XG4gIG91dGxpbmU6IDA7XG59XG4iLCJpbXBvcnQgeyBTYmJTZWNvbmRhcnlCdXR0b25FbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvYnV0dG9uLnB1cmUuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJFbGVtZW50VHlwZSB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHtcbiAgYm94U2l6aW5nU3R5bGVzLFxuICBTYmJMYW5ndWFnZUNvbnRyb2xsZXIsXG4gIFNiYlNjcmVlblJlYWRlck9ubHlFbGVtZW50LFxufSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlLmpzJztcbmltcG9ydCB7IFNiYlBvcG92ZXJFbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvcG9wb3Zlci5wdXJlLmpzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAsIFByb3BlcnR5VmFsdWVzLCBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBodG1sLCBpc1NlcnZlciwgbm90aGluZywgdW5zYWZlQ1NTIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcC5qcyc7XG5cbmltcG9ydCB7IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24gfSBmcm9tICcuLi9jb21tb24vdHJhbnNsYXRpb25zLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQmFzZUVsZW1lbnQsXG4gIENvYWNoSXRlbSxcbiAgQ29hY2hJdGVtRGV0YWlscyxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb24sXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcy50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tYXJlYS9zZWF0LXJlc2VydmF0aW9uLWFyZWEuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbkdyYXBoaWNFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uTmF2aWdhdGlvbkNvYWNoRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaC9zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2guY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQvc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzJztcbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24uc2Nzcz9pbmxpbmUnO1xuXG4vKipcbiAqIE1haW4gY29tcG9uZW50IGZvciB0aGUgc2VhdCByZXNlcnZhdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50IGV4dGVuZHMgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbXG4gICAgU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudCxcbiAgICBTYmJTY3JlZW5SZWFkZXJPbmx5RWxlbWVudCxcbiAgICBTYmJQb3BvdmVyRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50LFxuICAgIFNiYlNlYXRSZXNlcnZhdGlvbk5hdmlnYXRpb25Db2FjaEVsZW1lbnQsXG4gICAgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCxcbiAgXTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9jb2FjaGVzSHRtbFRlbXBsYXRlPzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgLy8gQXJlYSBpY29ucyB0aGF0IHNob3VsZCBub3QgYmUgZml4ZWQgZHVyaW5nIHJvdGF0aW9uIHdoZW4gdmVydGljYWwgbW9kZSBpcyBzZWxlY3RlZFxuICBwcml2YXRlIF9ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGFzTmF2aWdhdGlvbicpKSB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICAgID8ucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKVxuICAgICAgICAgIC5mb3JFYWNoKCh0YWJsZSkgPT4gdGFibGUucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICAgID8ucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKVxuICAgICAgICAgIC5mb3JFYWNoKCh0YWJsZSkgPT4gdGFibGUuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgZmlyc3QgdXBkYXRlIGlzIGNvbXBsZXRlIHRvIGluaXQgZGlmZmVyZW50IEhUTUwgZWxlbWVudCBkaW1lbnNpb25zXG4gICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgdGhpcy5faW5pdFZlaGljbGVTZWF0UmVzZXJ2YXRpb25Db25zdHJ1Y3Rpb24oKTtcbiAgICByZXR1cm4gdGhpcy5fY29hY2hlc0h0bWxUZW1wbGF0ZSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFZlaGljbGVTZWF0UmVzZXJ2YXRpb25Db25zdHJ1Y3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fY29hY2hlc0h0bWxUZW1wbGF0ZSA9IGh0bWxgXG4gICAgICAke3RoaXMuX3JlbmRlclRyYXZlbERpcmVjdGlvbigpfVxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fY29tcG9uZW50XCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbigpfVxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3NcIlxuICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5rZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nKGV2dCl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzXCI+JHt0aGlzLl9yZW5kZXJEZWNrTGFiZWxzKCl9PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgQHNjcm9sbD0keygpID0+IHRoaXMuY29hY2hBcmVhU2Nyb2xsZW5kKCl9XG4gICAgICAgICAgICBpZD1cInNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWFcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNiYi1zcl9fcGFyZW50LWFyZWFcIiBjbGFzcz1cInNiYi1zcl9fcGFyZW50XCI+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICdzYmItc3JfX2xpc3QtZGVja3MtLWdhcCc6IHRoaXMuaGFzTXVsdGlwbGVEZWNrcyxcbiAgICAgICAgICAgICAgICB9KX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lm1hcChcbiAgICAgICAgICAgICAgICAgIChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8bGkgY2xhc3M9XCJzYmItc3JfX2xpc3QtaXRlbS1kZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwic2JiLXNyX19saXN0LWNvYWNoZXNcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlckNvYWNoZXMoc2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5gO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckRlY2tMYWJlbHMoKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZURlY2tzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZWF0UmVzZXJ2YXRpb25zLm1hcCgoc2VhdFJlc2VydmF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBkZWNrRGVzY3JpcHRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoTGV2ZWwsXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGh0bWxgPGIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHtkZWNrRGVzY3JpcHRpb259PC9iPmA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbihidG5EaXJlY3Rpb246IHN0cmluZyk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24gfHwgIXRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGJ0bk5hdmlnYXRpb25EaXJlY3Rpb25JZCA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyAnc2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvbi0tcmlnaHQnXG4gICAgICAgIDogJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLWxlZnQnO1xuICAgIGNvbnN0IGJ0bkljb24gPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnID8gJ2NoZXZyb24tc21hbGwtcmlnaHQtc21hbGwnIDogJ2NoZXZyb24tc21hbGwtbGVmdC1zbWFsbCc7XG4gICAgY29uc3QgYnRuQXJpYURlc2NyaXB0aW9uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJ1xuICAgICAgICA/IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ1NFQVRfUkVTRVJWQVRJT05fRU5EJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgICAgOiBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0JFR0lOJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCk7XG4gICAgbGV0IGJ0bkRpc2FibGVkID0gdHJ1ZTtcblxuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIGJ0bkRpc2FibGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPCB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxXG4gICAgKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uXCI+XG4gICAgICA8c2JiLXNlY29uZGFyeS1idXR0b25cbiAgICAgICAgQGNsaWNrPVwiJHsoKSA9PiB0aGlzLm5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uKX1cIlxuICAgICAgICBAZm9jdXM9XCIkeygpID0+IHRoaXMub25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpfVwiXG4gICAgICAgIGlkPVwiJHtidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWR9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3JfX25hdmlnYXRpb24tY29udHJvbC1idXR0b25cIlxuICAgICAgICBzaXplPVwibVwiXG4gICAgICAgIGljb24tbmFtZT1cIiR7YnRuSWNvbn1cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIiR7YnRuQXJpYURlc2NyaXB0aW9ufVwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAuZGlzYWJsZWRJbnRlcmFjdGl2ZT1cIiR7YnRuRGlzYWJsZWQgfHwgbm90aGluZ31cIlxuICAgICAgICAuZGlzYWJsZWQ9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgID48L3NiYi1zZWNvbmRhcnktYnV0dG9uPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJUcmF2ZWxEaXJlY3Rpb24oKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJhdmVsRGlyZWN0aW9uIHx8IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnTk9ORScpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAnU0VBVF9SRVNFUlZBVElPTl9UUkFWRUxfRElSRUNUSU9OJyxcbiAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgKTtcblxuICAgIGNvbnN0IGFycm93RGlyZWN0aW9uID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnUklHSFQnXG4gICAgICAgID8gJ2Rvd24nXG4gICAgICAgIDogJ3VwJ1xuICAgICAgOiB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ1JJR0hUJ1xuICAgICAgICA/ICdyaWdodCdcbiAgICAgICAgOiAnbGVmdCc7XG5cbiAgICBjb25zdCBpY29uTmFtZSA9IGBhcnJvdy0ke2Fycm93RGlyZWN0aW9ufS1zbWFsbGA7XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLXRyYXZlbC1kaXJlY3Rpb24td3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fdHJhdmVsLWRpcmVjdGlvbi0tYXJyb3dcIj5cbiAgICAgICAgPHNiYi1pY29uIHNsb3Q9XCJpY29uXCIgbmFtZT1cIiR7aWNvbk5hbWV9XCI+PC9zYmItaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fdHJhdmVsLWRpcmVjdGlvbi0tbGFiZWxcIj4ke2xhYmVsVGV4dH08L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbigpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmIChpc1NlcnZlciB8fCAhdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb24td3JhcHBlclwiPlxuICAgICAgPG5hdiBpZD1cInNiYi1zci1uYXZpZ2F0aW9uXCIgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvblwiPlxuICAgICAgICAke3RoaXMuX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKCdESVJFQ1RJT05fTEVGVCcpfVxuICAgICAgICA8dWxcbiAgICAgICAgICBpZD1cInNiYi1zcl9fbmF2aWdhdGlvbi1saXN0LWNvYWNoZXNcIlxuICAgICAgICAgIGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX2xpc3QtY29hY2hlc1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIiR7Z2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICAgICdTRUFUX1JFU0VSVkFUSU9OX05BVklHQVRJT04nLFxuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgICApfVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3RoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLm1hcChcbiAgICAgICAgICAgIChjb2FjaEl0ZW1EZXRhaWxzOiBDb2FjaEl0ZW1EZXRhaWxzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBodG1sYDxsaT5cbiAgICAgICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaFxuICAgICAgICAgICAgICAgICAgQHNlbGVjdGNvYWNoPSR7KGV2ZW50OiBDdXN0b21FdmVudDxudW1iZXI+KSA9PiB0aGlzLl9vblNlbGVjdE5hdkNvYWNoKGV2ZW50KX1cbiAgICAgICAgICAgICAgICAgIEBmb2N1c2NvYWNoPSR7KCkgPT4gdGhpcy5fb25Gb2N1c05hdkNvYWNoKCl9XG4gICAgICAgICAgICAgICAgICBAa2V5dXA9JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLm9uS2V5TmF2aWdhdGlvbk5hdkNvYWNoQnV0dG9uKGV2dCwgaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgaW5kZXg9XCIke2luZGV4fVwiXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0ZWQ9JHt0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAuZm9jdXNlZD0ke3RoaXMuZm9jdXNlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLmhvdmVyZWQ9JHt0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5uYXRpdmVGb2N1c0FjdGl2ZT0ke3RoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXN9XG4gICAgICAgICAgICAgICAgICAuY29hY2hJdGVtRGV0YWlscz1cIiR7Y29hY2hJdGVtRGV0YWlsc31cIlxuICAgICAgICAgICAgICAgICAgP3ZlcnRpY2FsPVwiJHt0aGlzLmFsaWduVmVydGljYWx9XCJcbiAgICAgICAgICAgICAgICAgID9zaG93VGl0bGVJbmZvPVwiJHt0aGlzLnNob3dUaXRsZUluZm99XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoPlxuICAgICAgICAgICAgICA8L2xpPmA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvdWw+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9SSUdIVCcpfVxuICAgICAgPC9uYXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuICAvKipcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQHBhcmFtIHNlYXRSZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gY29hY2hEZWNrSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlckNvYWNoZXMoXG4gICAgc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoZXM6IENvYWNoSXRlbVtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXMpKTtcblxuICAgIGlmICghY29hY2hlcyB8fCBpc1NlcnZlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2FjaGVzLm1hcCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0sIGNvYWNoSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxsaSBjbGFzcz1cInNiYi1zcl9faXRlbS1jb2FjaFwiPlxuICAgICAgICAgICR7dGhpcy5fcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgICAgICAgICAgY29hY2hJdGVtLFxuICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvbGk+XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaEl0ZW0uZGltZW5zaW9uKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXMgPSB0aGlzLl9nZXREZXNjcmlwdGlvblRhYmxlQ29hY2goY29hY2hJdGVtKTtcblxuICAgIHJldHVybiBodG1sYDxzYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWRcbiAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtd2lkdGgnOiBjYWxjdWxhdGVkQ29hY2hEaW1lbnNpb24udyxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLWhlaWdodCc6IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbi5oLFxuICAgICAgfSl9XG4gICAgPlxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhjb2FjaEl0ZW0sIGNvYWNoSW5kZXgpfVxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZEdyYXBoaWNhbEVsZW1lbnRzKFxuICAgICAgICBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzIHx8IFtdLFxuICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLFxuICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkU2VydmljZUVsZW1lbnRzKGNvYWNoSW5kZXgsIGNvYWNoRGVja0luZGV4LCBjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzKX1cblxuICAgICAgPHRhYmxlXG4gICAgICAgIEBmb2N1cz0keygpID0+IHRoaXMub25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShjb2FjaEluZGV4KX1cbiAgICAgICAgaWQ9XCJzYmItc3ItY29hY2gtJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyLWNvYWNoLXdyYXBwZXJfX3RhYmxlXCJcbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgID5cbiAgICAgICAgPGNhcHRpb24gaWQ9XCJzYmItc3ItY29hY2gtY2FwdGlvbi0ke2NvYWNoSW5kZXh9XCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5PiR7ZGVzY3JpcHRpb25UYWJsZUNvYWNoV2l0aFNlcnZpY2VzfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgPC9jYXB0aW9uPlxuICAgICAgICAke3RoaXMuX2dldFJlbmRlcmVkUm93UGxhY2VzKGNvYWNoSXRlbSwgY29hY2hJbmRleCwgY29hY2hEZWNrSW5kZXgsIHBsYWNlQ29hY2hEZWNrSW5kZXgpfVxuICAgICAgPC90YWJsZT5cbiAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZD5gO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFJldHVybnMgdGhlIGJvcmRlciBncmFwaGljIChDT0FDSF9CT1JERVJfTUlERExFKSBvZiBhIGNvYWNoIHdpdGggY2FsY3VsYXRlZCBib3JkZXIgZ2FwIGFuZCBjb2FjaCB3aWR0aCxcbiAgICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvYWNoIGlzIHdpdGggYSBkcml2ZXIgYXJlYSBvciB3aXRob3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2FjaEJvcmRlcnMoXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgQ09BQ0hfUEFTU0FHRV9XSURUSCA9IDE7XG4gICAgY29uc3QgZHJpdmVyQXJlYSA9IHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW2NvYWNoSW5kZXhdPy5kcml2ZXJBcmVhRWxlbWVudHM/LmRyaXZlckFyZWE7XG4gICAgY29uc3QgZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsID1cbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW2NvYWNoSW5kZXhdPy5kcml2ZXJBcmVhRWxlbWVudHM/LmRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbDtcblxuICAgIGxldCBib3JkZXJXaWR0aCA9IGRyaXZlckFyZWFcbiAgICAgID8gY29hY2hJdGVtLmRpbWVuc2lvbi53IC0gZHJpdmVyQXJlYS5kaW1lbnNpb24udyAtIENPQUNIX1BBU1NBR0VfV0lEVEhcbiAgICAgIDogY29hY2hJdGVtLmRpbWVuc2lvbi53IC0gQ09BQ0hfUEFTU0FHRV9XSURUSCAqIDI7XG5cbiAgICAvL211bHRpcGx5IHdpdGggYmFzZSBncmlkIHNpemUgYWx3YXlzIGZvciBhbGwga2luZCBvZiBib3JkZXJXaWR0aFxuICAgIGJvcmRlcldpZHRoICo9IHRoaXMuYmFzZUdyaWRTaXplO1xuXG4gICAgY29uc3QgYm9yZGVySGVpZ2h0ID0gKGNvYWNoSXRlbS5kaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyKSAqIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgIGxldCBib3JkZXJPZmZzZXRYID1cbiAgICAgIGRyaXZlckFyZWEgJiYgZHJpdmVyQXJlYS5wb3NpdGlvbi54ID09PSAwXG4gICAgICAgID8gZHJpdmVyQXJlYT8uZGltZW5zaW9uLncgKiB0aGlzLmJhc2VHcmlkU2l6ZVxuICAgICAgICA6IHRoaXMuYmFzZUdyaWRTaXplO1xuXG4gICAgLy9yZWNhbGN1bGF0ZSB0aGUgYm9yZGVyIHdpZHRoIGFuZCBvZmZzZXQgaWYgdGhlcmUgaXMgYSBkcml2ZXIgYXJlYSB3aXRob3V0IHZlcnRpY2FsIHdhbGwgb24gYm90aCBzaWRlc1xuICAgIGlmIChkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGwpIHtcbiAgICAgIGNvbnN0IGNvYWNoV2lkdGggPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oY29hY2hJdGVtLmRpbWVuc2lvbikudztcblxuICAgICAgLy9yZWNhbGN1bGF0ZWQgYm9yZGVyV2lkdGggPSBjb2FjaFdpZHRoIC0gMiAqIGRyaXZlciBhcmVhIHdpZHRoLCBzaW5jZSB0aGUgZHJpdmVyIGFyZWEgaXMgb24gYm90aCBzaWRlc1xuICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaFdpZHRoIC0gMiAqIChkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGwuZGltZW5zaW9uLncgKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG5cbiAgICAgIC8vcmVjYWxjdWxhdGVkIGJvcmRlck9mZnNldFggPSBkcml2ZXIgYXJlYSB3aWR0aCwgc2luY2UgdGhlIGJvcmRlciBzdGFydHMgYWZ0ZXIgdGhlIGRyaXZlciBhcmVhIG9uIHRoZSBsZWZ0IHNpZGVcbiAgICAgIGJvcmRlck9mZnNldFggPSBkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGwuZGltZW5zaW9uLncgKiB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8gPSB0aGlzLm92ZXJIYW5naW5nRWxlbWVudEluZm9ybWF0aW9uLmZpbmQoXG4gICAgICAoZWwpID0+IGVsLmNvYWNoSWQgPT09IGNvYWNoSXRlbS5pZCxcbiAgICApO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIG92ZXJoYW5naW5nIHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgdG8gYWRqdXN0IHRoZSBib3JkZXIgd2lkdGggYW5kIG9mZnNldCArIGdhcFxuICAgIC8vIFdlIGRvIG5vdCBkaWZmZXJlbnRpYXRlIHdoZXRoZXIgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGJlIGRvbmUgb24gYm90aCBzaWRlcyBhcyB0aGlzIHdvdWxkIGxlYWQgdG8gdW5uZWNlc3NhcnlcbiAgICAvLyBjb21wbGV4aXR5LiBTbyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgb24gb25lIHNpZGUsIHdlIGp1c3QgaW5jcmVhc2UgdGhlIGNvYWNoLWJvcmRlciBvbiBib3RoIHNpZGVzLlxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdQbGFjZXMgfHxcbiAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdHcmFwaGljQXJlYXNcbiAgICApIHtcbiAgICAgIGJvcmRlcldpZHRoICs9IDIgKiB0aGlzLmJhc2VHcmlkU2l6ZTsgLy8gd2UgaW5jcmVhc2UgdGhlIHdpZHRoIGJ5IDIgZ3JpZCBzaXplcyB0byBoYXZlIGVub3VnaCBzcGFjZSBmb3IgcHJvdHJ1ZGVkIHBsYWNlcyBvbiBib3RoIHNpZGVzXG4gICAgICBib3JkZXJPZmZzZXRYID0gMDsgLy8gd2Ugc3RhcnQgYXQgMCB0byBoYXZlIGVub3VnaCBzcGFjZSBvbiB0aGUgbGVmdCBzaWRlIGFzIHdlbGxcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgJ3NiYi1zci1jb2FjaC1oYXMtb3ZlcmhhbmdpbmctZWxlbWVudHMnOlxuICAgICAgICAgICAgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvPy5vdmVyaGFuZ2luZ1BsYWNlcyB8fFxuICAgICAgICAgICAgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvPy5vdmVyaGFuZ2luZ0dyYXBoaWNBcmVhcyB8fFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgIH0pfVwiXG4gICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBib3JkZXJXaWR0aCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGJvcmRlckhlaWdodCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nICogLTEsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogYm9yZGVyT2Zmc2V0WCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBvc2l0aW9uJzogJ2Fic29sdXRlJyxcbiAgICAgICAgfSl9XG4gICAgICAgIG5hbWU9XCJDT0FDSF9CT1JERVJfTUlERExFXCJcbiAgICAgICAgP3N0cmV0Y2g9JHt0cnVlfVxuICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkUm93UGxhY2VzKFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCFjb2FjaC5wbGFjZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgcm93cyB3aXRoIHRoZSBwbGFjZXMgdG8gcmVuZGVyIGEgdGFibGVcbiAgICBjb25zdCB0YWJsZVJvd1BsYWNlczogUmVjb3JkPG51bWJlciwgUGxhY2VbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHBsYWNlIG9mIGNvYWNoLnBsYWNlcykge1xuICAgICAgaWYgKCF0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XSkge1xuICAgICAgICB0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XSA9IFtwbGFjZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XS5wdXNoKHBsYWNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0YWJsZVJvd1BsYWNlcylcbiAgICAgIC5tYXAoKHJvd1BsYWNlczogUGxhY2VbXSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRyIGlkPVwicm93LSR7Y29hY2hJbmRleH0tJHtyb3dQbGFjZXNbMF0ucG9zaXRpb24ueX1cIiBkYXRhLXJvdy1pbmRleD0ke2luZGV4fT5cbiAgICAgICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRDb2x1bW5QbGFjZXMoXG4gICAgICAgICAgICAgIHJvd1BsYWNlcyxcbiAgICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICAgIHBsYWNlQ29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIGA7XG4gICAgICB9KVxuICAgICAgLmZsYXRNYXAoKHJvd1RlbXBsYXRlKSA9PiByb3dUZW1wbGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvbHVtblBsYWNlcyhcbiAgICBwbGFjZXM6IFBsYWNlW10sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGRlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICAvL1NvcnRzIGVhY2ggcGxhY2UgYnkgaXRzIGFzY2VuZGluZyB4IGNvb3JkaW5hdGVcbiAgICBwbGFjZXMuc29ydChcbiAgICAgIChwbGFjZUE6IFBsYWNlLCBwbGFjZUI6IFBsYWNlKSA9PiBOdW1iZXIocGxhY2VBLnBvc2l0aW9uLngpIC0gTnVtYmVyKHBsYWNlQi5wb3NpdGlvbi54KSxcbiAgICApO1xuXG4gICAgLy8gRm9yIHJlbmRlcmluZyB0aGUgcGxhY2VzIHdpdGhpbiBhIHRkIGVsZW1lbnQsIGhlcmUgd2UgdXNlIHJlcGVhdCBkaXJlY3RpdmUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBmb3IgcmV1c2luZyBlbGVtZW50cyAodHJhY2sgYnkgaWQpLlxuICAgIGNvbnN0IHRyYWNrUGxhY2VJZCA9IGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZUNvYWNoRGVja0luZGV4O1xuICAgIHJldHVybiBodG1sYCR7cmVwZWF0KFxuICAgICAgcGxhY2VzLFxuICAgICAgKHBsYWNlKSA9PiB0cmFja1BsYWNlSWQgKyAnLScgKyBwbGFjZS5udW1iZXIsXG4gICAgICAocGxhY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24ocGxhY2UuZGltZW5zaW9uKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZFBvc2l0aW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkUG9zaXRpb24ocGxhY2UucG9zaXRpb24pO1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IHBsYWNlLnJvdGF0aW9uIHx8IDA7XG4gICAgICAgIGNvbnN0IHRleHRSb3RhdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IC05MCA6IDA7XG4gICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKGRlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBpZD1cImNlbGwtJHtkZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtwbGFjZS5wb3NpdGlvbi55fS0ke2luZGV4fVwiXG4gICAgICAgICAgICBjbGFzcz1cImdyYXBoaWNhbC1lbGVtZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbFxuICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRleHQtc2NhbGUtdmFsdWUnOiBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10ZXh0LXJvdGF0aW9uJzogdGV4dFJvdGF0aW9uLFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgQHNlbGVjdHBsYWNlPSR7KHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQpfVxuICAgICAgICAgICAgICBleHBvcnRwYXJ0cz1cInNiYi1zci1wbGFjZS1wYXJ0XCJcbiAgICAgICAgICAgICAgaWQ9JHtwbGFjZUlkfVxuICAgICAgICAgICAgICBjbGFzcz1cInNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbFwiXG4gICAgICAgICAgICAgIHRleHQ9JHtwbGFjZS5udW1iZXJ9XG4gICAgICAgICAgICAgIHR5cGU9JHtwbGFjZS50eXBlfVxuICAgICAgICAgICAgICBzdGF0ZT0ke3BsYWNlLnN0YXRlfVxuICAgICAgICAgICAgICB0cmF2ZWwtZGlyZWN0aW9uPSR7dGhpcy50cmF2ZWxEaXJlY3Rpb259XG4gICAgICAgICAgICAgIGNvYWNoLWluZGV4PSR7Y29hY2hJbmRleH1cbiAgICAgICAgICAgICAgZGVjay1pbmRleD0ke3BsYWNlQ29hY2hEZWNrSW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtZGVjay1pbmRleD0ke2RlY2tJbmRleH1cbiAgICAgICAgICAgICAgLnByb3BlcnR5SWRzPSR7cGxhY2UucHJvcGVydHlJZHN9XG4gICAgICAgICAgICAgIC5wcmV2ZW50Q2xpY2s9JHt0aGlzLnByZXZlbnRQbGFjZUNsaWNrfVxuICAgICAgICAgICAgICA/c2hvd1RpdGxlSW5mbz1cIiR7dGhpcy5zaG93VGl0bGVJbmZvfVwiXG4gICAgICAgICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIGA7XG4gICAgICB9LFxuICAgICl9YDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkR3JhcGhpY2FsRWxlbWVudHMoXG4gICAgZ3JhcGhpY2FsRWxlbWVudHM6IEJhc2VFbGVtZW50W10sXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIWdyYXBoaWNhbEVsZW1lbnRzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhcGhpY2FsRWxlbWVudHM/Lm1hcCgoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGljb24gPSBncmFwaGljYWxFbGVtZW50Lmljb24gPz8gJyc7XG4gICAgICBjb25zdCBlbGVtZW50Um90YXRpb24gPSBncmFwaGljYWxFbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgICBjb25zdCBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID1cbiAgICAgICAgdGhpcy5fbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihncmFwaGljYWxFbGVtZW50Lmljb24hKSA9PT0gLTE7XG4gICAgICBjb25zdCBlbGVtZW50Rml4ZWRSb3RhdGlvbiA9XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCAmJiBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50XG4gICAgICAgICAgPyBlbGVtZW50Um90YXRpb24gLSA5MFxuICAgICAgICAgIDogZWxlbWVudFJvdGF0aW9uO1xuXG4gICAgICAvL2NoZWNrIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgbm90IGFuIGFyZWEgZWxlbWVudCwgc2luY2UgdGhpcyBlbGVtZW50IGlzIGRyYXduIHdpdGhvdXQgYW4gYXJlYSBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLm5vdEFyZWFFbGVtZW50cy5maW5kSW5kZXgoKG5vdEFyZWFFbGVtZW50KSA9PiBub3RBcmVhRWxlbWVudCA9PT0gaWNvbikgPiAtMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UmVuZGVyRWxlbWVudFdpdGhvdXRBcmVhKGdyYXBoaWNhbEVsZW1lbnQsIGVsZW1lbnRSb3RhdGlvbiwgY29hY2hEaW1lbnNpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2dldFJlbmRlckVsZW1lbnRXaXRoQXJlYShcbiAgICAgICAgZ3JhcGhpY2FsRWxlbWVudCxcbiAgICAgICAgZWxlbWVudEZpeGVkUm90YXRpb24sXG4gICAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlcyBhIHJlbmRlcmVkIGVsZW1lbnQgd2l0aCBhbiBhcmVhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gZ3JhcGhpY2FsRWxlbWVudFxuICAgKiBAcGFyYW0gcm90YXRpb25cbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwYXJhbSBjb2FjaEluZGV4IHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWQgZm9yIHRoZSBwb3BvdmVyIHRyaWdnZXJcbiAgICogQHBhcmFtIGNvYWNoRGVja0luZGV4IHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2dldFJlbmRlckVsZW1lbnRXaXRoQXJlYShcbiAgICBncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICByb3RhdGlvbjogbnVtYmVyLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgLy8gZm9yIFRBQkxFLCB3ZSB1c2UgdGhlIGFyZWEgY29tcG9uZW50IGl0c2VsZiB0byBkaXNwbGF5IHRoZSB0YWJsZSBpbnN0ZWFkIG9mIHRoZSBTVkcgZ3JhcGhpYy5cbiAgICAvLyBEdWUgdG8gZGlmZmVyZW50IGhlaWdodHMgYW5kIHdpZHRocywgaXQgd291bGRuJ3Qgc2hvdyBjb3JyZWN0bHkuIFRvIGNvcnJlY3QgdGhpcywgd2Ugd291bGRcbiAgICAvLyBuZWVkIGRpZmZpY3VsdCBjYWxjdWxhdGlvbnMgZm9yIHBvc2l0aW9uLCByb3RhdGlvbiBhbmQgZGltZW5zaW9uLlxuICAgIGNvbnN0IGlzTm90VGFibGVHcmFwaGljID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uPy5pbmRleE9mKCdUQUJMRScpID09PSAtMTtcbiAgICBjb25zdCBhcmVhUHJvcGVydHkgPSBncmFwaGljYWxFbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBncmFwaGljYWxFbGVtZW50Lmljb24gOiBudWxsO1xuICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPVxuICAgICAgdGhpcy5pc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKGdyYXBoaWNhbEVsZW1lbnQsIGNvYWNoRGltZW5zaW9uKSAmJlxuICAgICAgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCc7XG4gICAgY29uc3QgYXJpYUxhYmVsRm9yQXJlYSA9IGdyYXBoaWNhbEVsZW1lbnQuaWNvblxuICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgIDogbm90aGluZztcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIHN0cmV0Y2hIZWlnaHQsXG4gICAgKTtcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbixcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICAvL2dlbmVyYXRlIHVuaXF1ZSBpbmRleCBudW1iZXIgZm9yIHRoZSB0cmlnZ2VyIGVsZW1lbnRcbiAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueX1gO1xuICAgIGxldCBlbGVtZW50TW91bnRpbmcgPSAnZnJlZSc7XG5cbiAgICBpZiAoZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbi55ID09PSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogLTEpIHtcbiAgICAgIGVsZW1lbnRNb3VudGluZyA9ICd1cHBlci1ib3JkZXInO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBncmFwaGljYWxFbGVtZW50LnBvc2l0aW9uLnkgKyBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbi5oID09PVxuICAgICAgY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXRcbiAgICApIHtcbiAgICAgIGVsZW1lbnRNb3VudGluZyA9ICdsb3dlci1ib3JkZXInO1xuICAgIH1cblxuICAgIC8vIFRJTU8tNDU4MzBcbiAgICAvLyBJZiBhcmVhIGVsZW1lbnRzIGFyZSBsb2NhdGVkIGF0IHRoZSBib3JkZXIgb2YgY29hY2gsXG4gICAgLy8gd2UgaGF2ZSB0byBtYW51YWxseSBtb2RpZnkgdGhlIHBvc2l0aW9uIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgZWxlbWVudCxcbiAgICAvLyBzbyB0aGF0IHdlIGdldCBhIGdhcCBmcm9tIHRoZSB2aXN1ZWwgY29hY2ggYm9yZGVyXG4gICAgaWYgKGVsZW1lbnRNb3VudGluZyAhPT0gJ2ZyZWUnKSB7XG4gICAgICBjYWxjdWxhdGVkUG9zaXRpb24ueSArPSBlbGVtZW50TW91bnRpbmcgPT09ICd1cHBlci1ib3JkZXInID8gMiA6IDE7XG4gICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLmggLT0gMztcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYVxuICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7ICdzYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLS1jdXJzb3ItcG9pbnRlcic6IGFyZWFQcm9wZXJ0eSAhPT0gbnVsbCB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgIH0pfVxuICAgICAgICBtb3VudGluZz0ke2VsZW1lbnRNb3VudGluZ31cbiAgICAgICAgYmFja2dyb3VuZD1cImRhcmtcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgPlxuICAgICAgICAke2FyZWFQcm9wZXJ0eVxuICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LXdpZHRoJzogdGhpcy5nbG9iYWxBcmVhSWNvbkRpbS53LFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1tYXgtaGVpZ2h0JzogdGhpcy5nbG9iYWxBcmVhSWNvbkRpbS5oLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wYWRkaW5nLXBlcmNlbnQnOlxuICAgICAgICAgICAgICAgICAgICBhcmVhUHJvcGVydHkgIT09ICdFTlRSWV9FWElUJyA/IHRoaXMuZ2xvYmFsQXJlYUljb25QYWRkaW5nIDogMSxcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBuYW1lPSR7YXJlYVByb3BlcnR5fVxuICAgICAgICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItc3ItZ3JhcGhpY19fZGltZW5zaW9uLS1zcXVhcmUtZGltXCJcbiAgICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWE+XG4gICAgICAke2FyZWFQcm9wZXJ0eSA/IHRoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCBhcmlhTGFiZWxGb3JBcmVhKSA6IG5vdGhpbmd9XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlckVsZW1lbnRXaXRob3V0QXJlYShcbiAgICBncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICByb3RhdGlvbjogbnVtYmVyLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgKTtcbiAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24sXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgaWNvbiBpcyB0aGUgZHJpdmVyIGFyZWEsIHRoZW4gaGVyZSBjb25jYXQgdGhlIHZlaGljbGUgdHlwZSB0byBnZXQgdGhlIHJpZ2h0IHZlaGljbGUgY2hhc3NpcyBpY29uXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBncmFwaGljYWxFbGVtZW50Lmljb24gJiYgZ3JhcGhpY2FsRWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZ3JhcGhpY2FsRWxlbWVudC5pY29uPy5jb25jYXQoXG4gICAgICAgICAgICAnXycsXG4gICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlLFxuICAgICAgICAgIClcbiAgICAgICAgOiBncmFwaGljYWxFbGVtZW50Lmljb247XG5cbiAgICByZXR1cm4gaHRtbGAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICB9KX1cbiAgICAgIG5hbWU9JHtpY29uID8/IG5vdGhpbmd9XG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgP3N0cmV0Y2g9JHt0cnVlfVxuICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+YDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkU2VydmljZUVsZW1lbnRzKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHNlcnZpY2VFbGVtZW50cz86IEJhc2VFbGVtZW50W10sXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIXNlcnZpY2VFbGVtZW50cykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcnZpY2VFbGVtZW50cz8ubWFwKChzZXJ2aWNlRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHRpdGxlRGVzY3JpcHRpb24gPSBzZXJ2aWNlRWxlbWVudC5pY29uXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihzZXJ2aWNlRWxlbWVudC5pY29uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHNlcnZpY2VFbGVtZW50LmRpbWVuc2lvbik7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbik7XG4gICAgICBjb25zdCBlbGVtZW50Um90YXRpb24gPSBzZXJ2aWNlRWxlbWVudC5yb3RhdGlvbiB8fCAwO1xuICAgICAgY29uc3QgZWxlbWVudEZpeGVkUm90YXRpb24gPSB0aGlzLmFsaWduVmVydGljYWwgPyBlbGVtZW50Um90YXRpb24gLSA5MCA6IGVsZW1lbnRSb3RhdGlvbjtcblxuICAgICAgLy9nZW5lcmF0ZSB1bmlxdWUgaW5kZXggbnVtYmVyIGZvciB0aGUgdHJpZ2dlciBlbGVtZW50XG4gICAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueX1gO1xuXG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBvc2l0aW9uJzogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcm90YXRpb24nOiBlbGVtZW50Rml4ZWRSb3RhdGlvbixcbiAgICAgICAgICB9KX1cbiAgICAgICAgICBjbGFzcz1cInNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBuYW1lPSR7c2VydmljZUVsZW1lbnQuaWNvbiA/PyBub3RoaW5nfVxuICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgICAgICR7dGhpcy5fcG9wb3Zlcih0cmlnZ2VySWQsIHRpdGxlRGVzY3JpcHRpb24pfVxuICAgICAgYDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5hZ2VzIHRoZSBzZWxlY3RlZCBwbGFjZSBldmVudCB0cmlnZ2VyZWQgZnJvbSB0aGUgcGxhY2VcbiAgICogRWFjaCBzZWxlY3Rpb24gZW1pdHMgYW4gYXJyYXkgb2YgYWxsIHNlbGVjdGVkIHBsYWNlc1xuICAgKiBAcGFyYW0gc2VsZWN0UGxhY2VFdmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfb25TZWxlY3RQbGFjZShzZWxlY3RQbGFjZUV2ZW50OiBDdXN0b21FdmVudDxQbGFjZVNlbGVjdGlvbj4pOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlID0gc2VsZWN0UGxhY2VFdmVudC5kZXRhaWw7XG4gICAgLy8gV2UgaGF2ZSB0byBzZXQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrIHRvIHRydWUsIHRvIHByZXZlbnQgYXV0b21hdGljIHNjcm9sbGluZyB0byB0aGUgbmV3IGZvY3VzZWQgcGxhY2VcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IHRydWU7XG4gICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAvLyBDaGVjayBhbnkga2V5Ym9hcmQgZXZlbnQgd2FzIHRyaWdnZXJlZCBpbnNpZGUgdGhlIHNlYXQgcmVzZXJ2YXRpb24gY29tcG9uZW50LFxuICAgIC8vIHNvIHdlIGNhbiBzYXkgdGhlIG5hdGl2ZSBicm93c2VyIGZvY3VzIGxpZXMgb24gdGhlIGNvbXBvbmVudFxuICAgIGlmICghdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cykge1xuICAgICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICAvLyBBZGQgcGxhY2UgdG8gcGxhY2UgY29sbGVjdGlvblxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhzZWxlY3RlZFBsYWNlKTtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHNlbGVjdGVkUGxhY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0TmF2Q29hY2goZXZlbnQ6IEN1c3RvbUV2ZW50PG51bWJlcj4pOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZE5hdkNvYWNoSW5kZXggPSBldmVudC5kZXRhaWw7XG5cbiAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcblxuICAgIGlmIChzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IG51bGwgJiYgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4KTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cblxuICAgIC8vY2xvc2UgYWxsIG9wZW5lZCBwb3BvdmVyc1xuICAgIHRoaXMuX2Nsb3NlUG9wb3ZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Gb2N1c05hdkNvYWNoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcG9wb3ZlciBmb3IgZXh0cmEgc2VydmljZSBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gdHJpZ2dlcklkXG4gICAqIEBwYXJhbSBwb3BvdmVyQ29udGVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfcG9wb3ZlcihcbiAgICB0cmlnZ2VySWQ6IHN0cmluZyxcbiAgICBwb3BvdmVyQ29udGVudDogc3RyaW5nIHwgbnVsbCB8IHR5cGVvZiBub3RoaW5nLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXBvcG92ZXIgdHJpZ2dlcj1cIiR7dHJpZ2dlcklkfVwiIGhvdmVyLXRyaWdnZXI9XCJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJzYmItdGV4dC1zIHNiYi1zci1wb3BvdmVyXCI+JHtwb3BvdmVyQ29udGVudH08L3A+XG4gICAgICA8L3NiYi1wb3BvdmVyPlxuICAgIGA7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlciB0byBjbG9zZSBhbGwgb3BlbmVkIHBvcG92ZXJzIChub3JtYWxseSBvbmx5IG9uZSBpcyBvcGVuZWQgYXQgYSB0aW1lKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfY2xvc2VQb3BvdmVyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsPFNiYlBvcG92ZXJFbGVtZW50Pignc2JiLXBvcG92ZXI6c3RhdGUoc3RhdGUtb3BlbmVkKScpXG4gICAgICAuZm9yRWFjaCgocG9wb3ZlcikgPT4gcG9wb3Zlci5jbG9zZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldERlc2NyaXB0aW9uVGFibGVDb2FjaChjb2FjaEl0ZW06IENvYWNoSXRlbSk6IHN0cmluZyB7XG4gICAgLy9zaG93IGRpZmZlcmVudCB0YWJsZSBjYXB0aW9uIGZvciBzY3JlZW5yZWFkZXIgaWYgaXQgaXMgYSBsb2NvbW90aXZlXG4gICAgaWYgKGNvYWNoSXRlbS50eXBlID09PSAnTE9DT01PVElWRV9DT0FDSCcpIHtcbiAgICAgIHJldHVybiBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9MT0NPTU9USVZFJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2FjaEl0ZW0ucGxhY2VzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9CTE9DS0VEX1RBQkxFX0NBUFRJT04nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LCBbXG4gICAgICAgIGNvYWNoSXRlbS5pZCxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIGxldCB0YWJsZUNvYWNoRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb25zdCBhcmVhRGVzY3JpcHRpb25zID0gdGhpcy5fZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cyEpO1xuICAgIGNvbnN0IHNlcnZpY2VEZXNjcmlwdGlvbnMgPSB0aGlzLl9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzISk7XG5cbiAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9UQUJMRV9DQVBUSU9OJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCwgW1xuICAgICAgY29hY2hJdGVtLmlkLFxuICAgIF0pO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIC8vIEV4cGFuZHMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgc2VhdHMgYW5kIGJpY3ljbGUgc3BhY2VzIGFzIGluZm9cbiAgICAgIGNvbnN0IGZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2hJdGVtLnBsYWNlcyk7XG4gICAgICBjb25zdCBmcmVlUGxhY2VzVHh0ID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgJ0NPQUNIX0FWQUlMQUJMRV9OVU1CRVJfT0ZfUExBQ0VTJyxcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgW2ZyZWVQbGFjZXMuc2VhdHMsIGZyZWVQbGFjZXMuYmljeWNsZXNdLFxuICAgICAgKTtcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiA9IHRhYmxlQ29hY2hEZXNjcmlwdGlvbi5jb25jYXQoJy4gJykuY29uY2F0KGZyZWVQbGFjZXNUeHQpLmNvbmNhdCgnLiAnKTtcbiAgICB9XG5cbiAgICBpZiAoISFhcmVhRGVzY3JpcHRpb25zIHx8ICEhc2VydmljZURlc2NyaXB0aW9ucykge1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uICs9XG4gICAgICAgICcuICcgKyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9BVkFJTEFCTEVfU0VSVklDRVMnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KSArICc6ICc7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gKz0gc2VydmljZURlc2NyaXB0aW9ucyArICcsICcgKyBhcmVhRGVzY3JpcHRpb25zICsgJy4nO1xuICAgIH1cbiAgICByZXR1cm4gdGFibGVDb2FjaERlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoZGVzY3JpcHRpb25zRWxlbWVudHM6IEJhc2VFbGVtZW50W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHVuaXF1ZURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIHJldHVybiBkZXNjcmlwdGlvbnNFbGVtZW50c1xuICAgICAgPy5tYXAoKGRlc2NyaXB0aW9uRWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBpY29uID0gZGVzY3JpcHRpb25FbGVtZW50Lmljb247XG4gICAgICAgIGlmICghaWNvbikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QgPSB1bmlxdWVEZXNjcmlwdGlvbnMuaW5kZXhPZihpY29uKSA+IC0xO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50Lmljb24hLFxuICAgICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGlzVmFsaWREZXNjcmlwdGlvbiA9XG4gICAgICAgICAgdGhpcy5fbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihpY29uKSA9PT0gLTEgJiZcbiAgICAgICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmRleE9mKGljb24pID09PSAtMTtcblxuICAgICAgICBpZiAoIWRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0KSB7XG4gICAgICAgICAgdW5pcXVlRGVzY3JpcHRpb25zLnB1c2goZGVzY3JpcHRpb25FbGVtZW50Lmljb24hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISF0cmFuc2xhdGlvbiAmJiAhZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QgJiYgaXNWYWxpZERlc2NyaXB0aW9uID8gdHJhbnNsYXRpb24gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGRlc2NyaXB0aW9uKSA9PiAhIWRlc2NyaXB0aW9uKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1zZWF0LXJlc2VydmF0aW9uJzogU2JiU2VhdFJlc2VydmF0aW9uRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcUNBLElBQWEsNEJBQWIsY0FBK0MsMkJBQTBCO0NBQXpFLGNBQUE7O0FBY1UsT0FBQSxZQUFZLElBQUksc0JBQXNCLEtBQUs7QUFJM0MsT0FBQSw4QkFBOEIsQ0FBQyxhQUFhOzs7QUFqQnBCLE9BQUEsY0FBc0I7OztBQUMvQixPQUFBLHNCQUF3QztHQUM3RDtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0Q7OztBQUNzQixPQUFBLFNBQXlCLENBQUMsaUJBQWlCLFVBQVUseUJBQU0sQ0FBQzs7Q0FRaEUsV0FBVyxtQkFBdUM7QUFDbkUsUUFBTSxXQUFXLGtCQUFrQjtBQUVuQyxNQUFJLGtCQUFr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