@rivet-health/design-system 40.44.0 → 40.44.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 (321) hide show
  1. package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
  2. package/esm2022/lib/download/download.service.mjs +47 -0
  3. package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
  5. package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
  8. package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
  9. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
  10. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
  11. package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
  12. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
  13. package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
  14. package/esm2022/lib/icon/dom-cache.mjs +32 -0
  15. package/esm2022/lib/icon/icon.component.mjs +86 -0
  16. package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
  17. package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
  18. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
  19. package/esm2022/lib/input/button/button.component.mjs +139 -0
  20. package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
  21. package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
  25. package/esm2022/lib/input/date/date.component.mjs +279 -0
  26. package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
  27. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
  28. package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
  29. package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
  30. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
  31. package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
  32. package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
  33. package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
  34. package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
  36. package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
  37. package/esm2022/lib/input/select/select/select.component.mjs +178 -0
  38. package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
  39. package/esm2022/lib/input/select/state.mjs +882 -0
  40. package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
  41. package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
  42. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
  43. package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
  44. package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
  45. package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
  46. package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
  47. package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
  48. package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
  49. package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
  50. package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
  51. package/esm2022/lib/layout/card/card.component.mjs +291 -0
  52. package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
  53. package/esm2022/lib/load/loading/loading.component.mjs +43 -0
  54. package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
  55. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
  56. package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
  57. package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
  59. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
  64. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
  65. package/esm2022/lib/navigation/views/state.mjs +456 -0
  66. package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
  67. package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
  68. package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
  69. package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
  70. package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
  71. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
  72. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
  73. package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
  74. package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
  75. package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
  76. package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
  77. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
  78. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
  79. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
  80. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
  81. package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
  82. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
  83. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
  84. package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
  85. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
  86. package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
  87. package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
  88. package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
  89. package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
  90. package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
  91. package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
  92. package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
  93. package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
  94. package/esm2022/lib/size/size.directive.mjs +33 -0
  95. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
  96. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
  97. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
  98. package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
  99. package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
  100. package/esm2022/lib/table/table/clipboard.mjs +182 -0
  101. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
  102. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
  103. package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
  104. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
  105. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
  106. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
  107. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
  108. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
  109. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
  110. package/esm2022/lib/table/table/state.mjs +1035 -0
  111. package/esm2022/lib/table/table/table/table.component.mjs +367 -0
  112. package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
  113. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
  114. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
  115. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
  116. package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
  117. package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
  118. package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
  119. package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
  120. package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
  121. package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
  122. package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
  123. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
  124. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
  125. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
  126. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
  127. package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
  128. package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
  129. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
  130. package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
  131. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
  132. package/esm2022/lib/visualization/intervals.mjs +63 -0
  133. package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
  134. package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
  135. package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
  136. package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
  137. package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
  138. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
  139. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
  140. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
  141. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
  142. package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
  143. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
  144. package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
  145. package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
  146. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
  147. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
  148. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
  149. package/lib/format/truncate/truncate.component.d.ts +1 -1
  150. package/lib/icon/icon.component.d.ts +1 -1
  151. package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
  152. package/lib/input/button/button.component.d.ts +1 -1
  153. package/lib/input/calendar/calendar.component.d.ts +1 -1
  154. package/lib/input/checkbox/checkbox.component.d.ts +1 -1
  155. package/lib/input/currency-field/currency-field.component.d.ts +1 -1
  156. package/lib/input/date/date.component.d.ts +1 -1
  157. package/lib/input/date-range/date-range.component.d.ts +1 -1
  158. package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
  159. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
  160. package/lib/input/input-label/input-label.component.d.ts +1 -1
  161. package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
  162. package/lib/input/number-field/number-field.component.d.ts +1 -1
  163. package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
  164. package/lib/input/phone-field/phone-field.component.d.ts +1 -1
  165. package/lib/input/radio/radio.component.d.ts +1 -1
  166. package/lib/input/search/search.component.d.ts +1 -1
  167. package/lib/input/search-select/search-select.component.d.ts +1 -1
  168. package/lib/input/select/select/select.component.d.ts +1 -1
  169. package/lib/input/select/select-node/select-node.component.d.ts +1 -1
  170. package/lib/input/simple-select/simple-select.component.d.ts +1 -1
  171. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
  172. package/lib/input/text-field/text-field.component.d.ts +1 -1
  173. package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
  174. package/lib/input/validation-message/validation-message.component.d.ts +1 -1
  175. package/lib/layout/card/card-actions.component.d.ts +1 -1
  176. package/lib/layout/card/card-content.component.d.ts +1 -1
  177. package/lib/layout/card/card-header.component.d.ts +1 -1
  178. package/lib/layout/card/card-link.component.d.ts +1 -1
  179. package/lib/layout/card/card-media.component.d.ts +1 -1
  180. package/lib/layout/card/card.component.d.ts +1 -1
  181. package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
  182. package/lib/load/loading/loading.component.d.ts +1 -1
  183. package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
  184. package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
  185. package/lib/navigation/link/link.component.d.ts +1 -1
  186. package/lib/navigation/page-header/page-header.component.d.ts +1 -1
  187. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
  188. package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
  189. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
  190. package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
  191. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
  192. package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
  193. package/lib/navigation/views/views/views.component.d.ts +1 -1
  194. package/lib/notification/badge/badge.component.d.ts +1 -1
  195. package/lib/notification/banner/banner-action.component.d.ts +1 -1
  196. package/lib/notification/banner/banner.component.d.ts +1 -1
  197. package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
  198. package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
  199. package/lib/overlay/callout/callout.component.d.ts +1 -1
  200. package/lib/overlay/callout/help/help.component.d.ts +1 -1
  201. package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
  202. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
  203. package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
  204. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
  205. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
  206. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
  207. package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
  208. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
  209. package/lib/overlay/modal/modal.component.d.ts +1 -1
  210. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
  211. package/lib/overlay/toast/toast.component.d.ts +1 -1
  212. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
  213. package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
  214. package/lib/table/table/table/table.component.d.ts +1 -1
  215. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
  216. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
  217. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
  218. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
  219. package/lib/table/table/table-search/table-search.component.d.ts +1 -1
  220. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
  221. package/lib/visualization/chart/chart.component.d.ts +1 -1
  222. package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
  223. package/lib/visualization/donut/donut.component.d.ts +1 -1
  224. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
  225. package/lib/visualization/highlight/highlight.component.d.ts +1 -1
  226. package/lib/visualization/issue/issue.component.d.ts +1 -1
  227. package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
  228. package/lib/visualization/metric/metric.component.d.ts +1 -1
  229. package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
  230. package/lib/visualization/progress/progress.component.d.ts +1 -1
  231. package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
  232. package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
  233. package/lib/visualization/time-series/time-series.component.d.ts +3 -3
  234. package/lib/visualization/trend/trend.component.d.ts +1 -1
  235. package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
  236. package/package.json +5 -11
  237. package/esm2020/lib/download/download.service.mjs +0 -47
  238. package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  239. package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
  240. package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
  241. package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  242. package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
  243. package/esm2020/lib/icon/dom-cache.mjs +0 -32
  244. package/esm2020/lib/icon/icon.component.mjs +0 -86
  245. package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  246. package/esm2020/lib/input/button/button.component.mjs +0 -139
  247. package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
  248. package/esm2020/lib/input/date/date.component.mjs +0 -279
  249. package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
  250. package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  251. package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  252. package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
  253. package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
  254. package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
  255. package/esm2020/lib/input/select/select/select.component.mjs +0 -178
  256. package/esm2020/lib/input/select/state.mjs +0 -882
  257. package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
  258. package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  259. package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
  260. package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
  261. package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
  262. package/esm2020/lib/layout/card/card.component.mjs +0 -291
  263. package/esm2020/lib/load/loading/loading.component.mjs +0 -43
  264. package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  265. package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  266. package/esm2020/lib/navigation/views/state.mjs +0 -456
  267. package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
  268. package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
  269. package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
  270. package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  271. package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
  272. package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
  273. package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
  274. package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  275. package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  276. package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  277. package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  278. package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  279. package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
  280. package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
  281. package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
  282. package/esm2020/lib/size/size.directive.mjs +0 -33
  283. package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
  284. package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  285. package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  286. package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
  287. package/esm2020/lib/table/table/clipboard.mjs +0 -182
  288. package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  289. package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  290. package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  291. package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  292. package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  293. package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  294. package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  295. package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  296. package/esm2020/lib/table/table/state.mjs +0 -1035
  297. package/esm2020/lib/table/table/table/table.component.mjs +0 -367
  298. package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  299. package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  300. package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  301. package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
  302. package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
  303. package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
  304. package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
  305. package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
  306. package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  307. package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  308. package/esm2020/lib/visualization/intervals.mjs +0 -63
  309. package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  310. package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  311. package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  312. package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  313. package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
  314. package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  315. package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
  316. package/fesm2015/rivet-health-design-system.mjs +0 -18370
  317. package/fesm2015/rivet-health-design-system.mjs.map +0 -1
  318. /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
  319. /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
  320. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  321. /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
@@ -0,0 +1,882 @@
1
+ import Fuse from 'fuse.js';
2
+ import { defaultsDeep, flattenDeep, isNumber, sortBy } from 'lodash';
3
+ import { connectable, map, merge, ReplaySubject, scan, startWith, Subject, } from 'rxjs';
4
+ import { NumberPipe } from '../../format/pipes/number.pipe';
5
+ export var RivSelect;
6
+ (function (RivSelect) {
7
+ /////////////
8
+ // Options //
9
+ /////////////
10
+ /**
11
+ * The OptionSet class provides Set-like functionality, but uniqueness is
12
+ * determined by the option's ID rather than the object reference.
13
+ */
14
+ class OptionSet extends Set {
15
+ constructor(values) {
16
+ super();
17
+ // Parallel id → option map so has()/add()/delete() are O(1) instead of
18
+ // spreading the Set and linear-scanning it. Rebuilding an O(N²) lookup
19
+ // for a 16k-option selection was the primary cause of the multi-minute
20
+ // freeze that surfaced RVT-25383's tree-select scale problem.
21
+ this.byId = new Map();
22
+ if (values) {
23
+ for (const value of values) {
24
+ this.add(value);
25
+ }
26
+ }
27
+ }
28
+ has(option) {
29
+ return this.byId.has(option.id);
30
+ }
31
+ add(option) {
32
+ const existing = this.byId.get(option.id);
33
+ if (existing === option) {
34
+ // Same object reference — nothing to update. Ancestor re-adds
35
+ // during a selection snapshot hit this path repeatedly, so keeping
36
+ // it O(1) is what prevents the tree-select N² blow-up seen in
37
+ // RVT-25470.
38
+ return this;
39
+ }
40
+ if (existing !== undefined) {
41
+ // Different reference, same id — swap the stored ref while
42
+ // preserving Set insertion order. The rebuild is O(N), but this
43
+ // path is rare in practice (the hot ancestor-snapshot loop takes
44
+ // the identity fast-path above).
45
+ const items = [...this].map(o => (o.id === option.id ? option : o));
46
+ this.byId.set(option.id, option);
47
+ super.clear();
48
+ for (const item of items)
49
+ super.add(item);
50
+ }
51
+ else {
52
+ this.byId.set(option.id, option);
53
+ super.add(option);
54
+ }
55
+ return this;
56
+ }
57
+ delete(option) {
58
+ const existing = this.byId.get(option.id);
59
+ if (existing) {
60
+ this.byId.delete(option.id);
61
+ super.delete(existing);
62
+ return true;
63
+ }
64
+ else {
65
+ return false;
66
+ }
67
+ }
68
+ clear() {
69
+ this.byId.clear();
70
+ super.clear();
71
+ }
72
+ }
73
+ RivSelect.OptionSet = OptionSet;
74
+ const MIN_OPTIONS_FOR_CONTROLS = 5;
75
+ const DEFAULT_DISPLAY_LIMIT = 100;
76
+ function createManager(source, options) {
77
+ const defaultState = {
78
+ query: {
79
+ search: '',
80
+ order: 'title',
81
+ },
82
+ load: {
83
+ loading: false,
84
+ error: null,
85
+ },
86
+ sourceOptionGroups: [],
87
+ originalOptionGroups: [],
88
+ selection: {
89
+ selected: new OptionSet(),
90
+ },
91
+ display: {
92
+ placeholder: 'Select',
93
+ open: false,
94
+ expandedOptions: new Set(),
95
+ },
96
+ };
97
+ const defaultedInitialState = defaultsDeep({}, options?.initialState, defaultState);
98
+ const actions = new Subject();
99
+ const internalActions = new Subject();
100
+ const coreStateWithSelectionSnapshot = merge(actions, internalActions).pipe(scan(([state, snapshot], action) => {
101
+ const newState = sideEffects(reduce(state, action, options), action, source, internalActions);
102
+ const newSelectionSnapshot = (action.type === 'openChange' && action.open) ||
103
+ (action.type === 'loadComplete' &&
104
+ (newState.display.open || options?.inline))
105
+ ? createSelectionSnapshotWithAncestors(newState)
106
+ : snapshot;
107
+ return [newState, newSelectionSnapshot];
108
+ }, [defaultedInitialState, new OptionSet()]), startWith([
109
+ defaultedInitialState,
110
+ new OptionSet(),
111
+ ]));
112
+ const state = connectable(coreStateWithSelectionSnapshot.pipe(map(([s, selectionAtOpen]) => {
113
+ const allOptionGroups = s.sourceOptionGroups.map(optionGroup => {
114
+ return {
115
+ ...optionGroup,
116
+ options: optionGroup.options.map(option => augmentOptionToFullOption(s, option, options)),
117
+ };
118
+ });
119
+ const topLevelOptions = getTopLevelOptions(allOptionGroups);
120
+ const sortedOptionGroups = options?.sortSelectedToTop ?? options?.allowMultiSelect
121
+ ? sortOptionsByPreviouslySelectedState(allOptionGroups, selectionAtOpen)
122
+ : allOptionGroups;
123
+ const displayLimit = options?.displayLimit ?? DEFAULT_DISPLAY_LIMIT;
124
+ const displayLimitedOptionGroups = applyDisplayLimit(sortedOptionGroups, displayLimit);
125
+ const fullOptionGroups = applySelectedOptionLimit(s, displayLimitedOptionGroups, topLevelOptions, options);
126
+ return {
127
+ ...s,
128
+ query: {
129
+ ...s.query,
130
+ showSearch: !!s.query.search ||
131
+ (!!options?.allowSearch &&
132
+ countAllOptions(allOptionGroups) >
133
+ MIN_OPTIONS_FOR_CONTROLS) ||
134
+ countAllOptions(allOptionGroups) > displayLimit,
135
+ searchPlaceholder: options?.searchPlaceholder ?? 'Search',
136
+ showOrder: !!options?.allowOrder &&
137
+ !s.query.search &&
138
+ countAllOptions(allOptionGroups) > MIN_OPTIONS_FOR_CONTROLS,
139
+ },
140
+ fullOptionGroups,
141
+ selection: {
142
+ ...s.selection,
143
+ allowMultiSelect: !!options?.allowMultiSelect,
144
+ allowSelectAll: !!options?.allowSelectAll &&
145
+ options?.selectedOptionLimit == undefined,
146
+ visibleSelectionState: getParentMultiSelectionState(topLevelOptions),
147
+ },
148
+ display: {
149
+ ...s.display,
150
+ formattedSelectedOptions: getFormattedOptionsForDisplay(s, topLevelOptions, options),
151
+ zeroStateMessage: getZeroStateMessage(s),
152
+ dividers: !!options?.dividers,
153
+ inline: !!options?.inline,
154
+ maxHeight: options?.maxHeight ?? null,
155
+ maxWidth: options?.maxWidth ?? null,
156
+ minHeight: options?.minHeight ?? null,
157
+ minWidth: options?.minWidth ?? null,
158
+ displayLimitMessage: getDisplayLimitMessage(countVisibleOptions(fullOptionGroups, !!s.query.search), countVisibleOptions(allOptionGroups, !!s.query.search), s.query),
159
+ showSingleSelected: !!options?.showSingleSelected,
160
+ pillCount: getPillCountForDisplay(s, topLevelOptions, options),
161
+ },
162
+ };
163
+ })), {
164
+ connector: () => new ReplaySubject(1),
165
+ resetOnDisconnect: false,
166
+ });
167
+ state.connect();
168
+ // Load the options immediately for selects that are displayed inline.
169
+ if (options?.inline)
170
+ actions.next({ type: 'load' });
171
+ return { actions, state };
172
+ }
173
+ RivSelect.createManager = createManager;
174
+ function createInMemoryManager(fetchDataset, options) {
175
+ let data;
176
+ let fuse;
177
+ let exactMatch = false;
178
+ let parents;
179
+ let children;
180
+ const source = async (query, mostRecentAction) => {
181
+ /*
182
+ Re-fetch the options on the load action, and rebuild the state
183
+ derived from the option data.
184
+ */
185
+ if (mostRecentAction.type === 'load' ||
186
+ mostRecentAction.type === 'openChange') {
187
+ data = await fetchDataset();
188
+ const topLevelOptions = getTopLevelOptions(data);
189
+ fuse = new Fuse(flattenOptions(topLevelOptions, false), {
190
+ threshold: 0.2,
191
+ keys: ['title'],
192
+ includeScore: true,
193
+ includeMatches: true,
194
+ ...options?.fuseOptions,
195
+ });
196
+ exactMatch = options?.fuseOptions?.threshold == 0;
197
+ [parents, children] = getRelationshipMaps(topLevelOptions);
198
+ }
199
+ // Leading/trailing whitespace shouldn't affect fuzzy matching (Fuse
200
+ // scores the pattern's length against the text's, so a stray space
201
+ // changes results in surprising ways); a search string of only
202
+ // whitespace is treated the same as no search.
203
+ const search = query.search.trim();
204
+ /*
205
+ If the user is not searching options, return the full set of options
206
+ sorted appropriately.
207
+ */
208
+ if (!search) {
209
+ /*
210
+ The `source` order property allows for opting out of automatic
211
+ sorting, returning the data in its natural input order.
212
+ */
213
+ if (query.order === 'source')
214
+ return data;
215
+ /*
216
+ Sort the options by title and subtitle.
217
+ */
218
+ if (query.order === 'title') {
219
+ function sortByTitle(options) {
220
+ return sortBy(options, [
221
+ (o) => o.title.toLowerCase(),
222
+ (o) => o.subtitle?.toLowerCase() ?? '',
223
+ ]).map(option => ({
224
+ ...option,
225
+ children: option.children?.length
226
+ ? sortByTitle(option.children)
227
+ : undefined,
228
+ }));
229
+ }
230
+ return data.map(group => ({
231
+ ...group,
232
+ options: sortByTitle(group.options),
233
+ }));
234
+ }
235
+ /*
236
+ Sort the options by count, then by title, then by subtitle.
237
+ */
238
+ if (query.order === 'count') {
239
+ function sortByCount(options) {
240
+ return sortBy(options, [
241
+ (o) => (isNumber(o.count) ? -o.count : Infinity),
242
+ (o) => o.title.toLowerCase(),
243
+ (o) => o.subtitle?.toLowerCase() ?? '',
244
+ ]).map(option => ({
245
+ ...option,
246
+ children: option.children?.length
247
+ ? sortByCount(option.children)
248
+ : undefined,
249
+ }));
250
+ }
251
+ return data.map(group => ({
252
+ ...group,
253
+ options: sortByCount(group.options),
254
+ }));
255
+ }
256
+ }
257
+ /*
258
+ Execute the search with fuse. Once we have the search match data,
259
+ rebuild just as much of the tree as is needed to render the search
260
+ results. Specifically, any match will need all of its ancestors (so
261
+ that matched leaf nodes are shown nested under their ancestors) and all
262
+ of its children (because a matching parent means that all of its
263
+ descendants match too, per the design specification), whether they
264
+ themselves matched or not.
265
+ */
266
+ const matchedOptions = fuse.search(search);
267
+ const matchedIds = new Set(matchedOptions.map(result => result.item.id));
268
+ const matchAncestors = new Set();
269
+ function collectAncestors(ids) {
270
+ for (const id of ids) {
271
+ const parentId = parents.get(id);
272
+ if (parentId) {
273
+ matchAncestors.add(parentId);
274
+ collectAncestors([parentId]);
275
+ }
276
+ }
277
+ }
278
+ collectAncestors([...matchedIds]);
279
+ const matchDescendants = new Set();
280
+ function collectDescendants(ids) {
281
+ for (const id of ids) {
282
+ const childrenIds = children.get(id);
283
+ if (childrenIds) {
284
+ for (const child of childrenIds) {
285
+ matchDescendants.add(child);
286
+ }
287
+ collectDescendants(childrenIds);
288
+ }
289
+ }
290
+ }
291
+ collectDescendants([...matchedIds]);
292
+ /*
293
+ Next, we'll combine all the matched IDs with their direct ancestors and
294
+ descandants, and filter the original data set down to just these
295
+ options.
296
+ */
297
+ const filteredIds = new Set([
298
+ ...matchedIds,
299
+ ...matchAncestors,
300
+ ...matchDescendants,
301
+ ]);
302
+ function filterOptions(options) {
303
+ const filteredOptions = [];
304
+ for (const option of options) {
305
+ if (filteredIds.has(option.id)) {
306
+ filteredOptions.push({
307
+ ...option,
308
+ children: option.children?.length
309
+ ? filterOptions(option.children)
310
+ : undefined,
311
+ });
312
+ }
313
+ }
314
+ return filteredOptions;
315
+ }
316
+ const filteredOptions = filterOptions(getTopLevelOptions(data));
317
+ /*
318
+ At this point, we have an array of distinct trees (top-level options),
319
+ filtered down to only the options matching the search query. Note that
320
+ we don't care about section headers when searching since results should
321
+ be ordered by relevance. To calculate the order of these trees, we'll
322
+ take the total match scores for options found in the tree, divided by
323
+ the count of matches in the tree (the best average match score).
324
+ */
325
+ const scoreMap = new Map(matchedOptions.map(result => [result.item.id, result.score ?? 0]));
326
+ const ordered = sortBy(filteredOptions, (option) => {
327
+ function calculateScore(option) {
328
+ return ((scoreMap.get(option.id) ?? 0) +
329
+ (option.children ?? []).reduce((score, child) => score + calculateScore(child), 0));
330
+ }
331
+ function calculateCount(option) {
332
+ return (1 +
333
+ (option.children ?? []).reduce((count, child) => count + calculateCount(child), 0));
334
+ }
335
+ const totalScore = calculateScore(option);
336
+ const totalCount = calculateCount(option);
337
+ return totalScore / totalCount;
338
+ });
339
+ const highlightMap = new Map(matchedOptions.map(result => {
340
+ const highlights = {};
341
+ for (const match of result.matches ?? []) {
342
+ // filter out inexact matches
343
+ if (exactMatch && match.value != null) {
344
+ match.indices = match.indices.filter(isFuseMatchExact(match, search));
345
+ }
346
+ if (match.key === 'title') {
347
+ highlights.titleHighlightIndices = [...match.indices];
348
+ }
349
+ if (match.key === 'subtitle') {
350
+ highlights.subtitleHighlightIndices = [...match.indices];
351
+ }
352
+ }
353
+ return [result.item.id, highlights];
354
+ }));
355
+ function addHighlightsToOption(options) {
356
+ return options.map(option => ({
357
+ ...option,
358
+ ...highlightMap.get(option.id),
359
+ ...(option.children?.length
360
+ ? { children: addHighlightsToOption(option.children) }
361
+ : null),
362
+ }));
363
+ }
364
+ return {
365
+ data: [{ options: addHighlightsToOption(ordered) }],
366
+ originalData: data,
367
+ };
368
+ };
369
+ return createManager(source, options);
370
+ }
371
+ RivSelect.createInMemoryManager = createInMemoryManager;
372
+ function isFuseMatchExact(match, search) {
373
+ return matchedIndices => {
374
+ const matchedValue = match
375
+ .value.slice(matchedIndices[0], matchedIndices[1] + 1)
376
+ .toLowerCase();
377
+ // fuse is weird with it's matches. For a text of "planning" and a search string of "plan"
378
+ // the matched value will be "plann" with the extra 'n' because of its fuzzy matching.
379
+ // so just make sure the matched value at least starts with the search string.
380
+ // it's extra weird because for a text of "analytics" and a search string of "nalytics",
381
+ // the matched value will be "analytics". So we just need to make sure the the matched value
382
+ // includes the search string because there might be extra stuff on the front or the end.
383
+ return matchedValue.includes(search.toLowerCase());
384
+ };
385
+ }
386
+ RivSelect.isFuseMatchExact = isFuseMatchExact;
387
+ //////////////////////////////////
388
+ // State reducer (with helpers) //
389
+ //////////////////////////////////
390
+ function createSelectionSnapshotWithAncestors(state) {
391
+ const snapshot = new OptionSet(state.selection.selected);
392
+ const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
393
+ const [parents] = getRelationshipMaps(topLevelOptions);
394
+ // Sibling leaves share ancestors, so once we've walked up through a
395
+ // given parent id we can stop — anything above it has already been
396
+ // added by a previous iteration. Without this short-circuit the loop
397
+ // re-runs findOption (which is a full tree walk) once per shared
398
+ // ancestor edge, which was the #2 hotspot behind OptionSet.add in
399
+ // RVT-25470's profile.
400
+ const visited = new Set();
401
+ for (const selectedOption of state.selection.selected) {
402
+ let parentId = parents.get(selectedOption.id);
403
+ while (parentId !== undefined && !visited.has(parentId)) {
404
+ visited.add(parentId);
405
+ const parentOption = findOption(topLevelOptions, parentId);
406
+ if (parentOption) {
407
+ snapshot.add(parentOption);
408
+ }
409
+ parentId = parents.get(parentId);
410
+ }
411
+ }
412
+ return snapshot;
413
+ }
414
+ function getDisplayLimitMessage(displayedOptionCount, totalOptionCount, query) {
415
+ if (displayedOptionCount === totalOptionCount)
416
+ return null;
417
+ const rivNumber = new NumberPipe();
418
+ const displayed = rivNumber.transform(displayedOptionCount);
419
+ const total = rivNumber.transform(totalOptionCount);
420
+ const start = `Showing ${displayed} of ${total} options`;
421
+ return query.search ? `${start} matching "${query.search}"` : start;
422
+ }
423
+ function countVisibleOptions(optionGroups, leafOnly) {
424
+ function count(options) {
425
+ return options.reduce((acc, option) => {
426
+ if (option.expanded && option.children?.length) {
427
+ return acc + (leafOnly ? 0 : 1) + count(option.children);
428
+ }
429
+ return acc + 1;
430
+ }, 0);
431
+ }
432
+ return optionGroups.reduce((total, group) => total + count(group.options), 0);
433
+ }
434
+ function countAllOptions(optionGroups) {
435
+ function count(options) {
436
+ return options.reduce((acc, option) => {
437
+ if (option.children?.length) {
438
+ return acc + 1 + count(option.children);
439
+ }
440
+ return acc + 1;
441
+ }, 0);
442
+ }
443
+ return optionGroups.reduce((total, group) => total + count(group.options), 0);
444
+ }
445
+ function applyDisplayLimit(optionGroups, displayLimit) {
446
+ function filterWithLimit(options, remaining) {
447
+ let left = remaining;
448
+ const visibleOptions = [];
449
+ for (const option of options) {
450
+ if (left <= 0)
451
+ break;
452
+ if (option.expanded && option.children?.length) {
453
+ const [childOptions, childRemaining] = filterWithLimit(option.children, left - 1);
454
+ visibleOptions.push({
455
+ ...option,
456
+ children: childOptions,
457
+ });
458
+ left = childRemaining;
459
+ }
460
+ else {
461
+ visibleOptions.push(option);
462
+ left--;
463
+ }
464
+ }
465
+ return [visibleOptions, left];
466
+ }
467
+ const startingValue = [[], displayLimit];
468
+ const [resolvedGroups] = optionGroups.reduce(([groups, remaining], group) => {
469
+ const [options, leftAfter] = filterWithLimit(group.options, remaining);
470
+ if (options.length) {
471
+ return [[...groups, { ...group, options }], leftAfter];
472
+ }
473
+ else {
474
+ return [groups, remaining];
475
+ }
476
+ }, startingValue);
477
+ return resolvedGroups;
478
+ }
479
+ /*
480
+ Sort options so that previously selected options (from prior sessions)
481
+ appear at the top of their peer/sibling lists.
482
+ */
483
+ function sortOptionsByPreviouslySelectedState(optionGroups, selectionAtOpen) {
484
+ function sortOptions(options) {
485
+ return sortBy(options, option => !selectionAtOpen.has(option)).map(option => {
486
+ if (option.children) {
487
+ return {
488
+ ...option,
489
+ children: sortOptions(option.children),
490
+ };
491
+ }
492
+ else
493
+ return option;
494
+ });
495
+ }
496
+ return optionGroups.map(group => ({
497
+ ...group,
498
+ options: sortOptions(group.options),
499
+ }));
500
+ }
501
+ /*
502
+ If we are restricting how many options are selected to a specific limit,
503
+ when we are at that limit, disable all options not currently selected.
504
+ */
505
+ function applySelectedOptionLimit(state, optionGroups, topLevelOptions, options) {
506
+ if (options?.selectedOptionLimit === undefined) {
507
+ return optionGroups;
508
+ }
509
+ // When useTopLevelOptionsForDisplay is true and search is active, count
510
+ // selected top-level options from the original (unfiltered) data to ensure
511
+ // already-selected options that don't match the search are still counted.
512
+ const useOriginalForCounting = options?.useTopLevelOptionsForDisplay &&
513
+ state.query.search &&
514
+ state.originalOptionGroups.length > 0;
515
+ const topOptionsForCounting = useOriginalForCounting
516
+ ? getTopLevelOptions(state.originalOptionGroups).map(option => augmentOptionToFullOption(state, option, options))
517
+ : topLevelOptions;
518
+ const selectedOrIndeterminateTopOptions = topOptionsForCounting.filter(option => option.selected != false);
519
+ const numSelectedOptions = options?.useTopLevelOptionsForDisplay
520
+ ? selectedOrIndeterminateTopOptions.length
521
+ : state.selection.selected.size;
522
+ const selectedOptionLimit = options.selectedOptionLimit;
523
+ // If we have less items selected than the limit, business as usual.
524
+ if (numSelectedOptions < selectedOptionLimit) {
525
+ return optionGroups;
526
+ }
527
+ // If we have equal items selected to the limit (or more), prevent users from selecting more options.
528
+ function disableUnselectedItems(currentOptions, optionsAreChildrenOfSelectedGroup) {
529
+ const updatedItems = [];
530
+ for (const option of currentOptions) {
531
+ const isDisabledOrUnselected = !!option.disabled || (option.selectable && option.selected == false);
532
+ const isCurrentOptionSelected = option.selectable && option.selected != false;
533
+ const isCurrentOrParentOptionSelected = isCurrentOptionSelected || optionsAreChildrenOfSelectedGroup;
534
+ const forceEnabledBasedOnParent = !!options?.useTopLevelOptionsForDisplay &&
535
+ optionsAreChildrenOfSelectedGroup;
536
+ const markDisabled = isDisabledOrUnselected && !forceEnabledBasedOnParent;
537
+ if (option.children?.length) {
538
+ const childOptions = disableUnselectedItems(option.children, isCurrentOrParentOptionSelected);
539
+ updatedItems.push({
540
+ ...option,
541
+ disabled: !!markDisabled,
542
+ children: childOptions,
543
+ });
544
+ }
545
+ else {
546
+ updatedItems.push({
547
+ ...option,
548
+ disabled: !!markDisabled,
549
+ });
550
+ }
551
+ }
552
+ return updatedItems;
553
+ }
554
+ const groupsAfterLimit = [];
555
+ for (const currentGroup of optionGroups) {
556
+ groupsAfterLimit.push({
557
+ ...currentGroup,
558
+ options: disableUnselectedItems(currentGroup.options, false),
559
+ });
560
+ }
561
+ return groupsAfterLimit;
562
+ }
563
+ function getRelationshipMaps(options) {
564
+ const parents = new Map();
565
+ function buildParentsMap(options, parent) {
566
+ for (const option of options) {
567
+ if (parent) {
568
+ parents.set(option.id, parent.id);
569
+ }
570
+ if (option.children?.length) {
571
+ buildParentsMap(option.children, option);
572
+ }
573
+ }
574
+ }
575
+ buildParentsMap(options);
576
+ const children = new Map();
577
+ function buildChildrenMap(options) {
578
+ for (const option of options) {
579
+ if (option.children?.length) {
580
+ children.set(option.id, option.children.map(({ id }) => id));
581
+ buildChildrenMap(option.children);
582
+ }
583
+ }
584
+ }
585
+ buildChildrenMap(options);
586
+ return [parents, children];
587
+ }
588
+ function getTopLevelOptions(optionGroups) {
589
+ return optionGroups.reduce((options, group) => [...options, ...group.options], []);
590
+ }
591
+ function getParentMultiSelectionState(children) {
592
+ if (children.every(child => child.selected === true))
593
+ return true;
594
+ if (children.every(child => child.selected === false))
595
+ return false;
596
+ return 'indeterminate';
597
+ }
598
+ function augmentOptionToFullOption(state, option, managerOptions) {
599
+ if (option.children?.length) {
600
+ const augmentedChildren = option.children.map(child => augmentOptionToFullOption(state, child, managerOptions));
601
+ const selectableWhenSearching = managerOptions?.allowSelectNonLeafDuringSearch ?? false;
602
+ // When allowSelectNonLeafDuringSearch is enabled and search is active,
603
+ // calculate selection state from ALL original children, not just the
604
+ // filtered ones visible in search results.
605
+ const useOriginalForSelectionState = managerOptions?.allowSelectNonLeafDuringSearch &&
606
+ state.query.search &&
607
+ state.originalOptionGroups.length > 0;
608
+ let selected;
609
+ if (useOriginalForSelectionState) {
610
+ const originalOption = findOption(getTopLevelOptions(state.originalOptionGroups), option.id);
611
+ if (originalOption) {
612
+ const allLeaves = flattenOptions([originalOption], true);
613
+ const selectedCount = allLeaves.filter(leaf => state.selection.selected.has(leaf)).length;
614
+ if (selectedCount === 0) {
615
+ selected = false;
616
+ }
617
+ else if (selectedCount === allLeaves.length) {
618
+ selected = true;
619
+ }
620
+ else {
621
+ selected = 'indeterminate';
622
+ }
623
+ }
624
+ else {
625
+ selected = getParentMultiSelectionState(augmentedChildren);
626
+ }
627
+ }
628
+ else {
629
+ selected = getParentMultiSelectionState(augmentedChildren);
630
+ }
631
+ return {
632
+ ...option,
633
+ children: augmentedChildren,
634
+ selected,
635
+ expanded: state.query.search
636
+ ? true
637
+ : state.display.expandedOptions.has(option.id),
638
+ selectable: !state.query.search || selectableWhenSearching,
639
+ expandable: !state.query.search,
640
+ };
641
+ }
642
+ return {
643
+ ...option,
644
+ children: undefined,
645
+ selected: state.selection.selected.has(option),
646
+ expanded: false,
647
+ selectable: true,
648
+ expandable: false,
649
+ };
650
+ }
651
+ function getFormattedOptionsForDisplay(state, topLevelOptions, options) {
652
+ // If we have a custom display function, use it
653
+ if (options?.getCustomOptionDisplay) {
654
+ return options.getCustomOptionDisplay([...state.selection.selected]);
655
+ }
656
+ if (options?.useTopLevelOptionsForDisplay) {
657
+ return getTopLevelFormattedOptionsForDisplay(topLevelOptions);
658
+ }
659
+ // Otherwise, use the default display for options - titles separated by commas.
660
+ return [...state.selection.selected].map(({ title }) => title).join(', ');
661
+ }
662
+ function getTopLevelFormattedOptionsForDisplay(topLevelOptions) {
663
+ if (!topLevelOptions || topLevelOptions.length == 0) {
664
+ return '';
665
+ }
666
+ const selectedOrIndeterminateTopOptions = topLevelOptions.filter(option => option.selected != false);
667
+ return selectedOrIndeterminateTopOptions
668
+ .map(({ title }) => title)
669
+ .join(', ');
670
+ }
671
+ function getPillCountForDisplay(state, topLevelOptions, options) {
672
+ if (options?.useTopLevelOptionsForDisplay) {
673
+ const selectedOrIndeterminateTopOptions = topLevelOptions.filter(option => option.selected != false);
674
+ return selectedOrIndeterminateTopOptions.length;
675
+ }
676
+ return state.selection.selected.size;
677
+ }
678
+ function getZeroStateMessage(state) {
679
+ if (state.sourceOptionGroups.every(group => group.options.length === 0)) {
680
+ if (state.query.search)
681
+ return 'No results found.';
682
+ return 'No options.';
683
+ }
684
+ return null;
685
+ }
686
+ function findOption(options, id) {
687
+ for (const option of options) {
688
+ if (option.id === id)
689
+ return option;
690
+ if (option.children?.length) {
691
+ const child = findOption(option.children, id);
692
+ if (child)
693
+ return child;
694
+ }
695
+ }
696
+ return null;
697
+ }
698
+ function flattenOptions(options, leafOnly) {
699
+ return flattenDeep(options.map(option => {
700
+ if (option.children?.length) {
701
+ const descendants = option.children.map(child => flattenOptions([child], leafOnly));
702
+ return leafOnly ? descendants : [option, ...descendants];
703
+ }
704
+ else {
705
+ return [option];
706
+ }
707
+ }));
708
+ }
709
+ function toggleSelected(state, id, managerOptions) {
710
+ const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
711
+ const option = findOption(topLevelOptions, id);
712
+ if (!option)
713
+ return state;
714
+ const newSelection = new OptionSet(state.selection.selected);
715
+ const newValue = !(augmentOptionToFullOption(state, option, managerOptions).selected === true);
716
+ // When allowSelectNonLeafDuringSearch is enabled and search is active,
717
+ // use the original (unfiltered) data to get all children, not just
718
+ // those visible in the filtered search results.
719
+ const useOriginalData = managerOptions?.allowSelectNonLeafDuringSearch &&
720
+ state.query.search &&
721
+ state.originalOptionGroups.length > 0;
722
+ const optionForLeaves = useOriginalData
723
+ ? findOption(getTopLevelOptions(state.originalOptionGroups), id) ?? option
724
+ : option;
725
+ const leaves = flattenOptions([optionForLeaves], true);
726
+ for (const leaf of leaves) {
727
+ if (newValue) {
728
+ newSelection.add(leaf);
729
+ }
730
+ else {
731
+ newSelection.delete(leaf);
732
+ }
733
+ }
734
+ return {
735
+ ...state,
736
+ selection: {
737
+ selected: newSelection,
738
+ },
739
+ };
740
+ }
741
+ function setSelectedOption(state, id) {
742
+ const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
743
+ const option = findOption(topLevelOptions, id);
744
+ if (!option)
745
+ return state;
746
+ const newSelection = new OptionSet();
747
+ newSelection.add(option);
748
+ return {
749
+ ...state,
750
+ selection: {
751
+ selected: newSelection,
752
+ },
753
+ };
754
+ }
755
+ function toggleVisibleSelected(state) {
756
+ const leaves = flattenOptions(getTopLevelOptions(state.sourceOptionGroups), true);
757
+ const isAllSelected = leaves.every(leaf => state.selection.selected.has(leaf));
758
+ const newSelection = new OptionSet(state.selection.selected);
759
+ for (const leaf of leaves) {
760
+ if (isAllSelected)
761
+ newSelection.delete(leaf);
762
+ else
763
+ newSelection.add(leaf);
764
+ }
765
+ return {
766
+ ...state,
767
+ selection: {
768
+ ...state.selection,
769
+ selected: newSelection,
770
+ },
771
+ };
772
+ }
773
+ function toggleOptionExpanded(state, id) {
774
+ const newValue = !state.display.expandedOptions.has(id);
775
+ const newExpandedOptions = new Set(state.display.expandedOptions);
776
+ if (newValue)
777
+ newExpandedOptions.add(id);
778
+ else
779
+ newExpandedOptions.delete(id);
780
+ return {
781
+ ...state,
782
+ display: {
783
+ ...state.display,
784
+ expandedOptions: newExpandedOptions,
785
+ },
786
+ };
787
+ }
788
+ function sideEffects(state, action, source, internalActions) {
789
+ if (action.type === 'load' ||
790
+ action.type === 'searchChange' ||
791
+ action.type === 'orderChange' ||
792
+ (action.type === 'openChange' && action.open)) {
793
+ source(state.query, action)
794
+ .then(result => {
795
+ const data = Array.isArray(result) ? result : result.data;
796
+ const originalData = Array.isArray(result)
797
+ ? undefined
798
+ : result.originalData;
799
+ internalActions.next({ type: 'loadComplete', data, originalData });
800
+ })
801
+ .catch(error => {
802
+ // eslint-disable-next-line no-console
803
+ console.error(error);
804
+ internalActions.next({ type: 'loadError', error });
805
+ });
806
+ return {
807
+ ...state,
808
+ load: {
809
+ loading: true,
810
+ error: null,
811
+ },
812
+ };
813
+ }
814
+ return state;
815
+ }
816
+ function reduce(state, action, managerOptions) {
817
+ switch (action.type) {
818
+ case 'load':
819
+ return state;
820
+ case 'loadComplete':
821
+ return {
822
+ ...state,
823
+ load: {
824
+ loading: false,
825
+ error: null,
826
+ },
827
+ sourceOptionGroups: action.data,
828
+ originalOptionGroups: action.originalData ?? [],
829
+ };
830
+ case 'loadError':
831
+ return {
832
+ ...state,
833
+ load: {
834
+ loading: false,
835
+ error: action.error,
836
+ },
837
+ };
838
+ case 'openChange':
839
+ return {
840
+ ...state,
841
+ query: {
842
+ ...state.query,
843
+ search: '',
844
+ },
845
+ display: {
846
+ ...state.display,
847
+ open: action.open,
848
+ },
849
+ };
850
+ case 'searchChange':
851
+ return {
852
+ ...state,
853
+ query: {
854
+ ...state.query,
855
+ search: action.payload,
856
+ },
857
+ };
858
+ case 'orderChange':
859
+ return {
860
+ ...state,
861
+ query: {
862
+ ...state.query,
863
+ order: action.payload,
864
+ },
865
+ };
866
+ case 'selectionChange':
867
+ return {
868
+ ...state,
869
+ selection: action.payload,
870
+ };
871
+ case 'toggleOptionSelected':
872
+ return toggleSelected(state, action.id, managerOptions);
873
+ case 'setSelectedOption':
874
+ return setSelectedOption(state, action.id);
875
+ case 'visibleSelectedChange':
876
+ return toggleVisibleSelected(state);
877
+ case 'toggleOptionExpanded':
878
+ return toggleOptionExpanded(state, action.id);
879
+ }
880
+ }
881
+ })(RivSelect || (RivSelect = {}));
882
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9zZWxlY3Qvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUtOLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUNMLFdBQVcsRUFFWCxHQUFHLEVBQ0gsS0FBSyxFQUVMLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUc1RCxNQUFNLEtBQVcsU0FBUyxDQXk4Q3pCO0FBejhDRCxXQUFpQixTQUFTO0lBQ3hCLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQXVHYjs7O09BR0c7SUFDSCxNQUFhLFNBQWdDLFNBQVEsR0FBb0I7UUFPdkUsWUFBWSxNQUF5QztZQUNuRCxLQUFLLEVBQUUsQ0FBQztZQVBWLHVFQUF1RTtZQUN2RSx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM3QyxTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7WUFJMUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFUSxHQUFHLENBQUMsTUFBdUM7WUFDbEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVRLEdBQUcsQ0FBQyxNQUF1QjtZQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUMsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLDhEQUE4RDtnQkFDOUQsbUVBQW1FO2dCQUNuRSw4REFBOEQ7Z0JBQzlELGFBQWE7Z0JBQ2IsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNCLDJEQUEyRDtnQkFDM0QsZ0VBQWdFO2dCQUNoRSxpRUFBaUU7Z0JBQ2pFLGlDQUFpQztnQkFDakMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUs7b0JBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDakMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRVEsTUFBTSxDQUFDLE1BQXVCO1lBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVRLEtBQUs7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixDQUFDO0tBQ0Y7SUE1RFksbUJBQVMsWUE0RHJCLENBQUE7SUE0QkQsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7SUFFbkMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7SUFvS2xDLFNBQWdCLGFBQWEsQ0FDM0IsTUFBaUIsRUFDakIsT0FBMkI7UUFFM0IsTUFBTSxZQUFZLEdBQWlCO1lBQ2pDLEtBQUssRUFBRTtnQkFDTCxNQUFNLEVBQUUsRUFBRTtnQkFDVixLQUFLLEVBQUUsT0FBTzthQUNmO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLE9BQU8sRUFBRSxLQUFLO2dCQUNkLEtBQUssRUFBRSxJQUFJO2FBQ1o7WUFDRCxrQkFBa0IsRUFBRSxFQUFFO1lBQ3RCLG9CQUFvQixFQUFFLEVBQUU7WUFDeEIsU0FBUyxFQUFFO2dCQUNULFFBQVEsRUFBRSxJQUFJLFNBQVMsRUFBRTthQUMxQjtZQUNELE9BQU8sRUFBRTtnQkFDUCxXQUFXLEVBQUUsUUFBUTtnQkFDckIsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsZUFBZSxFQUFFLElBQUksR0FBRyxFQUFFO2FBQzNCO1NBQ0YsQ0FBQztRQUNGLE1BQU0scUJBQXFCLEdBQWlCLFlBQVksQ0FDdEQsRUFBRSxFQUNGLE9BQU8sRUFBRSxZQUFZLEVBQ3JCLFlBQVksQ0FDYixDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQXVCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbEQsTUFBTSxlQUFlLEdBQStCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFbEUsTUFBTSw4QkFBOEIsR0FFaEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQ3RDLElBQUksQ0FDRixDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzVCLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FDMUIsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQzlCLE1BQU0sRUFDTixNQUFNLEVBQ04sZUFBZSxDQUNoQixDQUFDO1lBRUYsTUFBTSxvQkFBb0IsR0FDeEIsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUM3QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssY0FBYztvQkFDN0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxvQ0FBb0MsQ0FBQyxRQUFRLENBQUM7Z0JBQ2hELENBQUMsQ0FBQyxRQUFRLENBQUM7WUFFZixPQUFPLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDMUMsQ0FBQyxFQUNELENBQUMscUJBQXFCLEVBQUUsSUFBSSxTQUFTLEVBQUssQ0FBQyxDQUM1QyxFQUNELFNBQVMsQ0FBK0I7WUFDdEMscUJBQXFCO1lBQ3JCLElBQUksU0FBUyxFQUFLO1NBQ25CLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQThCLFdBQVcsQ0FDbEQsOEJBQThCLENBQUMsSUFBSSxDQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxFQUFFO1lBQzNCLE1BQU0sZUFBZSxHQUNuQixDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNyQyxPQUFPO29CQUNMLEdBQUcsV0FBVztvQkFDZCxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDeEMseUJBQXlCLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FDOUM7aUJBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUwsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFNUQsTUFBTSxrQkFBa0IsR0FDdEIsT0FBTyxFQUFFLGlCQUFpQixJQUFJLE9BQU8sRUFBRSxnQkFBZ0I7Z0JBQ3JELENBQUMsQ0FBQyxvQ0FBb0MsQ0FDbEMsZUFBZSxFQUNmLGVBQWUsQ0FDaEI7Z0JBQ0gsQ0FBQyxDQUFDLGVBQWUsQ0FBQztZQUV0QixNQUFNLFlBQVksR0FBRyxPQUFPLEVBQUUsWUFBWSxJQUFJLHFCQUFxQixDQUFDO1lBQ3BFLE1BQU0sMEJBQTBCLEdBQUcsaUJBQWlCLENBQ2xELGtCQUFrQixFQUNsQixZQUFZLENBQ2IsQ0FBQztZQUNGLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQy9DLENBQUMsRUFDRCwwQkFBMEIsRUFDMUIsZUFBZSxFQUNmLE9BQU8sQ0FDUixDQUFDO1lBRUYsT0FBTztnQkFDTCxHQUFHLENBQUM7Z0JBQ0osS0FBSyxFQUFFO29CQUNMLEdBQUcsQ0FBQyxDQUFDLEtBQUs7b0JBQ1YsVUFBVSxFQUNSLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07d0JBQ2hCLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXOzRCQUNyQixlQUFlLENBQUMsZUFBZSxDQUFDO2dDQUM5Qix3QkFBd0IsQ0FBQzt3QkFDN0IsZUFBZSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFlBQVk7b0JBQ2pELGlCQUFpQixFQUFFLE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxRQUFRO29CQUN6RCxTQUFTLEVBQ1AsQ0FBQyxDQUFDLE9BQU8sRUFBRSxVQUFVO3dCQUNyQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTTt3QkFDZixlQUFlLENBQUMsZUFBZSxDQUFDLEdBQUcsd0JBQXdCO2lCQUM5RDtnQkFDRCxnQkFBZ0I7Z0JBQ2hCLFNBQVMsRUFBRTtvQkFDVCxHQUFHLENBQUMsQ0FBQyxTQUFTO29CQUNkLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCO29CQUM3QyxjQUFjLEVBQ1osQ0FBQyxDQUFDLE9BQU8sRUFBRSxjQUFjO3dCQUN6QixPQUFPLEVBQUUsbUJBQW1CLElBQUksU0FBUztvQkFDM0MscUJBQXFCLEVBQ25CLDRCQUE0QixDQUFDLGVBQWUsQ0FBQztpQkFDaEQ7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLEdBQUcsQ0FBQyxDQUFDLE9BQU87b0JBQ1osd0JBQXdCLEVBQUUsNkJBQTZCLENBQ3JELENBQUMsRUFDRCxlQUFlLEVBQ2YsT0FBTyxDQUNSO29CQUNELGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztvQkFDeEMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUTtvQkFDN0IsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTTtvQkFDekIsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSTtvQkFDckMsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLElBQUksSUFBSTtvQkFDbkMsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSTtvQkFDckMsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLElBQUksSUFBSTtvQkFDbkMsbUJBQW1CLEVBQUUsc0JBQXNCLENBQ3pDLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUN2RCxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQ3RELENBQUMsQ0FBQyxLQUFLLENBQ1I7b0JBQ0Qsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxrQkFBa0I7b0JBQ2pELFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQztpQkFDL0Q7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsRUFDRDtZQUNFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDckMsaUJBQWlCLEVBQUUsS0FBSztTQUN6QixDQUNGLENBQUM7UUFDRixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFaEIsc0VBQXNFO1FBQ3RFLElBQUksT0FBTyxFQUFFLE1BQU07WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBL0plLHVCQUFhLGdCQStKNUIsQ0FBQTtJQU9ELFNBQWdCLHFCQUFxQixDQUNuQyxZQUFnRSxFQUNoRSxPQUFtQztRQUVuQyxJQUFJLElBQXNCLENBQUM7UUFDM0IsSUFBSSxJQUFhLENBQUM7UUFDbEIsSUFBSSxVQUFVLEdBQVksS0FBSyxDQUFDO1FBQ2hDLElBQUksT0FBOEIsQ0FBQztRQUNuQyxJQUFJLFFBQWlDLENBQUM7UUFFdEMsTUFBTSxNQUFNLEdBQWMsS0FBSyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxFQUFFO1lBQzFEOzs7Y0FHRTtZQUNGLElBQ0UsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQ2hDLGdCQUFnQixDQUFDLElBQUksS0FBSyxZQUFZLEVBQ3RDLENBQUM7Z0JBQ0QsSUFBSSxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVqRCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRTtvQkFDdEQsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUNmLFlBQVksRUFBRSxJQUFJO29CQUNsQixjQUFjLEVBQUUsSUFBSTtvQkFDcEIsR0FBRyxPQUFPLEVBQUUsV0FBVztpQkFDeEIsQ0FBQyxDQUFDO2dCQUVILFVBQVUsR0FBRyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xELENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFFRCxvRUFBb0U7WUFDcEUsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCwrQ0FBK0M7WUFDL0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuQzs7O2NBR0U7WUFDRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1o7OztrQkFHRTtnQkFDRixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFFMUM7O2tCQUVFO2dCQUNGLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDNUIsU0FBUyxXQUFXLENBQUMsT0FBb0I7d0JBQ3ZDLE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRTs0QkFDckIsQ0FBQyxDQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFOzRCQUN2QyxDQUFDLENBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO3lCQUNsRCxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDaEIsR0FBRyxNQUFNOzRCQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU07Z0NBQy9CLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQ0FDOUIsQ0FBQyxDQUFDLFNBQVM7eUJBQ2QsQ0FBQyxDQUFDLENBQUM7b0JBQ04sQ0FBQztvQkFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN4QixHQUFHLEtBQUs7d0JBQ1IsT0FBTyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO3FCQUNwQyxDQUFDLENBQUMsQ0FBQztnQkFDTixDQUFDO2dCQUVEOztrQkFFRTtnQkFDRixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQzVCLFNBQVMsV0FBVyxDQUFDLE9BQW9CO3dCQUN2QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUU7NEJBQ3JCLENBQUMsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDOzRCQUMzRCxDQUFDLENBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7NEJBQ3ZDLENBQUMsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7eUJBQ2xELENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNoQixHQUFHLE1BQU07NEJBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTTtnQ0FDL0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2dDQUM5QixDQUFDLENBQUMsU0FBUzt5QkFDZCxDQUFDLENBQUMsQ0FBQztvQkFDTixDQUFDO29CQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3hCLEdBQUcsS0FBSzt3QkFDUixPQUFPLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7cUJBQ3BDLENBQUMsQ0FBQyxDQUFDO2dCQUNOLENBQUM7WUFDSCxDQUFDO1lBRUQ7Ozs7Ozs7O2NBUUU7WUFDRixNQUFNLGNBQWMsR0FBb0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1RCxNQUFNLFVBQVUsR0FBaUIsSUFBSSxHQUFHLENBQ3RDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUM3QyxDQUFDO1lBRUYsTUFBTSxjQUFjLEdBQWlCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDL0MsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFjO2dCQUN0QyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNyQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNqQyxJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUNiLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzdCLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDL0IsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELGdCQUFnQixDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRWxDLE1BQU0sZ0JBQWdCLEdBQWlCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDakQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFjO2dCQUN4QyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNyQixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUNoQixLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsRUFBRSxDQUFDOzRCQUNoQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzlCLENBQUM7d0JBQ0Qsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2xDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFDRCxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUVwQzs7OztjQUlFO1lBQ0YsTUFBTSxXQUFXLEdBQWlCLElBQUksR0FBRyxDQUFDO2dCQUN4QyxHQUFHLFVBQVU7Z0JBQ2IsR0FBRyxjQUFjO2dCQUNqQixHQUFHLGdCQUFnQjthQUNwQixDQUFDLENBQUM7WUFFSCxTQUFTLGFBQWEsQ0FBQyxPQUFvQjtnQkFDekMsTUFBTSxlQUFlLEdBQWdCLEVBQUUsQ0FBQztnQkFDeEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUMvQixlQUFlLENBQUMsSUFBSSxDQUFDOzRCQUNuQixHQUFHLE1BQU07NEJBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTTtnQ0FDL0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2dDQUNoQyxDQUFDLENBQUMsU0FBUzt5QkFDZCxDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDO2dCQUNELE9BQU8sZUFBZSxDQUFDO1lBQ3pCLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUVoRTs7Ozs7OztjQU9FO1lBRUYsTUFBTSxRQUFRLEdBQXlCLElBQUksR0FBRyxDQUM1QyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ2xFLENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBaUIsRUFBVSxFQUFFO2dCQUNwRSxTQUFTLGNBQWMsQ0FBQyxNQUFpQjtvQkFDdkMsT0FBTyxDQUNMLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM5QixDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUM1QixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQy9DLENBQUMsQ0FDRixDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxTQUFTLGNBQWMsQ0FBQyxNQUFpQjtvQkFDdkMsT0FBTyxDQUNMLENBQUM7d0JBQ0QsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUMvQyxDQUFDLENBQ0YsQ0FDRixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFDLE9BQU8sVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztZQVdILE1BQU0sWUFBWSxHQUE2QixJQUFJLEdBQUcsQ0FDcEQsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxVQUFVLEdBQWUsRUFBRSxDQUFDO2dCQUNsQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3pDLDZCQUE2QjtvQkFDN0IsSUFBSSxVQUFVLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDdEMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDbEMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUNoQyxDQUFDO29CQUNKLENBQUM7b0JBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO3dCQUMxQixVQUFVLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEQsQ0FBQztvQkFDRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssVUFBVSxFQUFFLENBQUM7d0JBQzdCLFVBQVUsQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMzRCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUNILENBQUM7WUFDRixTQUFTLHFCQUFxQixDQUFDLE9BQW9CO2dCQUNqRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM1QixHQUFHLE1BQU07b0JBQ1QsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQzlCLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU07d0JBQ3pCLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ3RELENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ1YsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO1lBRUQsT0FBTztnQkFDTCxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBRUYsT0FBTyxhQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUF0UGUsK0JBQXFCLHdCQXNQcEMsQ0FBQTtJQUVELFNBQWdCLGdCQUFnQixDQUM5QixLQUFzQixFQUN0QixNQUFjO1FBTWQsT0FBTyxjQUFjLENBQUMsRUFBRTtZQUN0QixNQUFNLFlBQVksR0FBRyxLQUFLO2lCQUN2QixLQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN0RCxXQUFXLEVBQUUsQ0FBQztZQUNqQiwwRkFBMEY7WUFDMUYsc0ZBQXNGO1lBQ3RGLDhFQUE4RTtZQUM5RSx3RkFBd0Y7WUFDeEYsNEZBQTRGO1lBQzVGLHlGQUF5RjtZQUN6RixPQUFPLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQXBCZSwwQkFBZ0IsbUJBb0IvQixDQUFBO0lBRUQsa0NBQWtDO0lBQ2xDLGtDQUFrQztJQUNsQyxrQ0FBa0M7SUFFbEMsU0FBUyxvQ0FBb0MsQ0FDM0MsS0FBbUI7UUFFbkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFdkQsb0VBQW9FO1FBQ3BFLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsaUVBQWlFO1FBQ2pFLGtFQUFrRTtRQUNsRSx1QkFBdUI7UUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVcsQ0FBQztRQUNuQyxLQUFLLE1BQU0sY0FBYyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEQsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUMsT0FBTyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLFlBQVksRUFBRSxDQUFDO29CQUNqQixRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUNELFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFNBQVMsc0JBQXNCLENBQzdCLG9CQUE0QixFQUM1QixnQkFBd0IsRUFDeEIsS0FBNEI7UUFFNUIsSUFBSSxvQkFBb0IsS0FBSyxnQkFBZ0I7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEQsTUFBTSxLQUFLLEdBQUcsV0FBVyxTQUFTLE9BQU8sS0FBSyxVQUFVLENBQUM7UUFDekQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssY0FBYyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN0RSxDQUFDO0lBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsWUFBa0MsRUFDbEMsUUFBaUI7UUFFakIsU0FBUyxLQUFLLENBQUMsT0FBd0I7WUFDckMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNwQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDL0MsT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFDRCxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDakIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFDOUMsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxlQUFlLENBQ3RCLFlBQWtDO1FBRWxDLFNBQVMsS0FBSyxDQUFDLE9BQXdCO1lBQ3JDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUM1QixPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztnQkFDRCxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDakIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFDOUMsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsWUFBa0MsRUFDbEMsWUFBb0I7UUFHcEIsU0FBUyxlQUFlLENBQ3RCLE9BQXdCLEVBQ3hCLFNBQWlCO1lBRWpCLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQztZQUNyQixNQUFNLGNBQWMsR0FBb0IsRUFBRSxDQUFDO1lBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzdCLElBQUksSUFBSSxJQUFJLENBQUM7b0JBQUUsTUFBTTtnQkFFckIsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7b0JBQy9DLE1BQU0sQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLEdBQUcsZUFBZSxDQUNwRCxNQUFNLENBQUMsUUFBUSxFQUNmLElBQUksR0FBRyxDQUFDLENBQ1QsQ0FBQztvQkFDRixjQUFjLENBQUMsSUFBSSxDQUFDO3dCQUNsQixHQUFHLE1BQU07d0JBQ1QsUUFBUSxFQUFFLFlBQVk7cUJBQ3ZCLENBQUMsQ0FBQztvQkFDSCxJQUFJLEdBQUcsY0FBYyxDQUFDO2dCQUN4QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxFQUFFLENBQUM7Z0JBQ1QsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFHRCxNQUFNLGFBQWEsR0FBdUIsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQzFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDLEVBQ0QsYUFBYSxDQUNkLENBQUM7UUFFRixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7OztNQUdFO0lBQ0YsU0FBUyxvQ0FBb0MsQ0FDM0MsWUFBa0MsRUFDbEMsZUFBNkI7UUFFN0IsU0FBUyxXQUFXLENBQUMsT0FBd0I7WUFDM0MsT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUNoRSxNQUFNLENBQUMsRUFBRTtnQkFDUCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTzt3QkFDTCxHQUFHLE1BQU07d0JBQ1QsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO3FCQUN2QyxDQUFDO2dCQUNKLENBQUM7O29CQUFNLE9BQU8sTUFBTSxDQUFDO1lBQ3ZCLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1NBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7TUFHRTtJQUNGLFNBQVMsd0JBQXdCLENBQy9CLEtBQW1CLEVBQ25CLFlBQWtDLEVBQ2xDLGVBQWdDLEVBQ2hDLE9BQTJCO1FBRTNCLElBQUksT0FBTyxFQUFFLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRCx3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSxNQUFNLHNCQUFzQixHQUMxQixPQUFPLEVBQUUsNEJBQTRCO1lBQ3JDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUNsQixLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUV4QyxNQUFNLHFCQUFxQixHQUFHLHNCQUFzQjtZQUNsRCxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQzFELHlCQUF5QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQ2xEO1lBQ0gsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUVwQixNQUFNLGlDQUFpQyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FDcEUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FDbkMsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQVcsT0FBTyxFQUFFLDRCQUE0QjtZQUN0RSxDQUFDLENBQUMsaUNBQWlDLENBQUMsTUFBTTtZQUMxQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBRWxDLE1BQU0sbUJBQW1CLEdBQVcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBRWhFLG9FQUFvRTtRQUNwRSxJQUFJLGtCQUFrQixHQUFHLG1CQUFtQixFQUFFLENBQUM7WUFDN0MsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUVELHFHQUFxRztRQUNyRyxTQUFTLHNCQUFzQixDQUM3QixjQUErQixFQUMvQixpQ0FBMEM7WUFFMUMsTUFBTSxZQUFZLEdBQW9CLEVBQUUsQ0FBQztZQUN6QyxLQUFLLE1BQU0sTUFBTSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLHNCQUFzQixHQUMxQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsQ0FBQztnQkFFdkUsTUFBTSx1QkFBdUIsR0FDM0IsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztnQkFDaEQsTUFBTSwrQkFBK0IsR0FDbkMsdUJBQXVCLElBQUksaUNBQWlDLENBQUM7Z0JBRS9ELE1BQU0seUJBQXlCLEdBQzdCLENBQUMsQ0FBQyxPQUFPLEVBQUUsNEJBQTRCO29CQUN2QyxpQ0FBaUMsQ0FBQztnQkFDcEMsTUFBTSxZQUFZLEdBQ2hCLHNCQUFzQixJQUFJLENBQUMseUJBQXlCLENBQUM7Z0JBRXZELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQ3pDLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsK0JBQStCLENBQ2hDLENBQUM7b0JBQ0YsWUFBWSxDQUFDLElBQUksQ0FBQzt3QkFDaEIsR0FBRyxNQUFNO3dCQUNULFFBQVEsRUFBRSxDQUFDLENBQUMsWUFBWTt3QkFDeEIsUUFBUSxFQUFFLFlBQVk7cUJBQ3ZCLENBQUMsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLElBQUksQ0FBQzt3QkFDaEIsR0FBRyxNQUFNO3dCQUNULFFBQVEsRUFBRSxDQUFDLENBQUMsWUFBWTtxQkFDekIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQXlCLEVBQUUsQ0FBQztRQUNsRCxLQUFLLE1BQU0sWUFBWSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3hDLGdCQUFnQixDQUFDLElBQUksQ0FBQztnQkFDcEIsR0FBRyxZQUFZO2dCQUNmLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQzthQUM3RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsT0FBb0I7UUFFcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMxQixTQUFTLGVBQWUsQ0FBQyxPQUFvQixFQUFFLE1BQWtCO1lBQy9ELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzdCLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7b0JBQzVCLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMzQixTQUFTLGdCQUFnQixDQUFDLE9BQW9CO1lBQzVDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzdCLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDNUIsUUFBUSxDQUFDLEdBQUcsQ0FDVixNQUFNLENBQUMsRUFBRSxFQUNULE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQ3BDLENBQUM7b0JBQ0YsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxQixPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFXRCxTQUFTLGtCQUFrQixDQVF6QixZQUFpQjtRQUNqQixPQUFPLFlBQVksQ0FBQyxNQUFNLENBQ3hCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFDbEQsRUFBRSxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyw0QkFBNEIsQ0FDbkMsUUFBeUI7UUFFekIsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3BFLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxTQUFTLHlCQUF5QixDQUNoQyxLQUFtQixFQUNuQixNQUF1QixFQUN2QixjQUFrQztRQUVsQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDNUIsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNwRCx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUN4RCxDQUFDO1lBQ0YsTUFBTSx1QkFBdUIsR0FDM0IsY0FBYyxFQUFFLDhCQUE4QixJQUFJLEtBQUssQ0FBQztZQUUxRCx1RUFBdUU7WUFDdkUscUVBQXFFO1lBQ3JFLDJDQUEyQztZQUMzQyxNQUFNLDRCQUE0QixHQUNoQyxjQUFjLEVBQUUsOEJBQThCO2dCQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ2xCLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRXhDLElBQUksUUFBNkIsQ0FBQztZQUNsQyxJQUFJLDRCQUE0QixFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FDL0Isa0JBQWtCLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQzlDLE1BQU0sQ0FBQyxFQUFFLENBQ1YsQ0FBQztnQkFDRixJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUNuQixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDekQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM1QyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQ25DLENBQUMsTUFBTSxDQUFDO29CQUNULElBQUksYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUN4QixRQUFRLEdBQUcsS0FBSyxDQUFDO29CQUNuQixDQUFDO3lCQUFNLElBQUksYUFBYSxLQUFLLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDOUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDbEIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLFFBQVEsR0FBRyxlQUFlLENBQUM7b0JBQzdCLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFFBQVEsR0FBRyw0QkFBNEIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFFBQVEsR0FBRyw0QkFBNEIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFFRCxPQUFPO2dCQUNMLEdBQUcsTUFBTTtnQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixRQUFRO2dCQUNSLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQzFCLENBQUMsQ0FBQyxJQUFJO29CQUNOLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDaEQsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksdUJBQXVCO2dCQUMxRCxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDaEMsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPO1lBQ0wsR0FBRyxNQUFNO1lBQ1QsUUFBUSxFQUFFLFNBQVM7WUFDbkIsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDOUMsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsSUFBSTtZQUNoQixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsNkJBQTZCLENBQ3BDLEtBQW1CLEVBQ25CLGVBQWdDLEVBQ2hDLE9BQTJCO1FBRTNCLCtDQUErQztRQUMvQyxJQUFJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELElBQUksT0FBTyxFQUFFLDRCQUE0QixFQUFFLENBQUM7WUFDMUMsT0FBTyxxQ0FBcUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsK0VBQStFO1FBQy9FLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxTQUFTLHFDQUFxQyxDQUM1QyxlQUFnQztRQUVoQyxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxpQ0FBaUMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUM5RCxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksS0FBSyxDQUNuQyxDQUFDO1FBQ0YsT0FBTyxpQ0FBaUM7YUFDckMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsS0FBbUIsRUFDbkIsZUFBZ0MsRUFDaEMsT0FBMkI7UUFFM0IsSUFBSSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQztZQUMxQyxNQUFNLGlDQUFpQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQzlELE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQ25DLENBQUM7WUFDRixPQUFPLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQztRQUNsRCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDdkMsQ0FBQztJQUVELFNBQVMsbUJBQW1CLENBQzFCLEtBQW1CO1FBRW5CLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxtQkFBbUIsQ0FBQztZQUNuRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsU0FBUyxVQUFVLENBQ2pCLE9BQTBCLEVBQzFCLEVBQVc7UUFFWCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1lBQ3BDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLElBQUksS0FBSztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVMsY0FBYyxDQUNyQixPQUFvQixFQUNwQixRQUFpQjtRQUVqQixPQUFPLFdBQVcsQ0FDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQixJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzlDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUNsQyxDQUFDO2dCQUNGLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUM7WUFDM0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLGNBQWMsQ0FDckIsS0FBbUIsRUFDbkIsRUFBVyxFQUNYLGNBQWtDO1FBRWxDLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQixNQUFNLFlBQVksR0FBRyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FDaEIseUJBQXlCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUMzRSxDQUFDO1FBRUYsdUVBQXVFO1FBQ3ZFLG1FQUFtRTtRQUNuRSxnREFBZ0Q7UUFDaEQsTUFBTSxlQUFlLEdBQ25CLGNBQWMsRUFBRSw4QkFBOEI7WUFDOUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQ2xCLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sZUFBZSxHQUFHLGVBQWU7WUFDckMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNO1lBQzFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFWCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RCxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzFCLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixTQUFTLEVBQUU7Z0JBQ1QsUUFBUSxFQUFFLFlBQVk7YUFDdkI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsaUJBQWlCLENBQ3hCLEtBQW1CLEVBQ25CLEVBQVc7UUFFWCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFMUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxTQUFTLEVBQUssQ0FBQztRQUN4QyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpCLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixTQUFTLEVBQUU7Z0JBQ1QsUUFBUSxFQUFFLFlBQVk7YUFDdkI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMscUJBQXFCLENBQzVCLEtBQW1CO1FBRW5CLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FDM0Isa0JBQWtCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEVBQzVDLElBQUksQ0FDTCxDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN4QyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQ25DLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdELEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxhQUFhO2dCQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUN4QyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPO1lBQ0wsR0FBRyxLQUFLO1lBQ1IsU0FBUyxFQUFFO2dCQUNULEdBQUcsS0FBSyxDQUFDLFNBQVM7Z0JBQ2xCLFFBQVEsRUFBRSxZQUFZO2FBQ3ZCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLG9CQUFvQixDQUMzQixLQUFtQixFQUNuQixFQUFXO1FBRVgsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksUUFBUTtZQUFFLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7WUFDcEMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUU7Z0JBQ1AsR0FBRyxLQUFLLENBQUMsT0FBTztnQkFDaEIsZUFBZSxFQUFFLGtCQUFrQjthQUNwQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxXQUFXLENBQ2xCLEtBQW1CLEVBQ25CLE1BQXFDLEVBQ3JDLE1BQWlCLEVBQ2pCLGVBQTJDO1FBRTNDLElBQ0UsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLEtBQUssY0FBYztZQUM5QixNQUFNLENBQUMsSUFBSSxLQUFLLGFBQWE7WUFDN0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQzdDLENBQUM7WUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7aUJBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDYixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQzFELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO29CQUN4QyxDQUFDLENBQUMsU0FBUztvQkFDWCxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztnQkFDeEIsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDckUsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDYixzQ0FBc0M7Z0JBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7WUFDTCxPQUFPO2dCQUNMLEdBQUcsS0FBSztnQkFDUixJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFLElBQUk7b0JBQ2IsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFNBQVMsTUFBTSxDQUNiLEtBQW1CLEVBQ25CLE1BQXFDLEVBQ3JDLGNBQWtDO1FBRWxDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLEtBQUssTUFBTTtnQkFDVCxPQUFPLEtBQUssQ0FBQztZQUNmLEtBQUssY0FBYztnQkFDakIsT0FBTztvQkFDTCxHQUFHLEtBQUs7b0JBQ1IsSUFBSSxFQUFFO3dCQUNKLE9BQU8sRUFBRSxLQUFLO3dCQUNkLEtBQUssRUFBRSxJQUFJO3FCQUNaO29CQUNELGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUMvQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUU7aUJBQ2hELENBQUM7WUFDSixLQUFLLFdBQVc7Z0JBQ2QsT0FBTztvQkFDTCxHQUFHLEtBQUs7b0JBQ1IsSUFBSSxFQUFFO3dCQUNKLE9BQU8sRUFBRSxLQUFLO3dCQUNkLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztxQkFDcEI7aUJBQ0YsQ0FBQztZQUNKLEtBQUssWUFBWTtnQkFDZixPQUFPO29CQUNMLEdBQUcsS0FBSztvQkFDUixLQUFLLEVBQUU7d0JBQ0wsR0FBRyxLQUFLLENBQUMsS0FBSzt3QkFDZCxNQUFNLEVBQUUsRUFBRTtxQkFDWDtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsR0FBRyxLQUFLLENBQUMsT0FBTzt3QkFDaEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO3FCQUNsQjtpQkFDRixDQUFDO1lBQ0osS0FBSyxjQUFjO2dCQUNqQixPQUFPO29CQUNMLEdBQUcsS0FBSztvQkFDUixLQUFLLEVBQUU7d0JBQ0wsR0FBRyxLQUFLLENBQUMsS0FBSzt3QkFDZCxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU87cUJBQ3ZCO2lCQUNGLENBQUM7WUFDSixLQUFLLGFBQWE7Z0JBQ2hCLE9BQU87b0JBQ0wsR0FBRyxLQUFLO29CQUNSLEtBQUssRUFBRTt3QkFDTCxHQUFHLEtBQUssQ0FBQyxLQUFLO3dCQUNkLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTztxQkFDdEI7aUJBQ0YsQ0FBQztZQUNKLEtBQUssaUJBQWlCO2dCQUNwQixPQUFPO29CQUNMLEdBQUcsS0FBSztvQkFDUixTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU87aUJBQzFCLENBQUM7WUFDSixLQUFLLHNCQUFzQjtnQkFDekIsT0FBTyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDMUQsS0FBSyxtQkFBbUI7Z0JBQ3RCLE9BQU8saUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QyxLQUFLLHVCQUF1QjtnQkFDMUIsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxLQUFLLHNCQUFzQjtnQkFDekIsT0FBTyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxFQXo4Q2dCLFNBQVMsS0FBVCxTQUFTLFFBeThDekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRnVzZSwge1xuICBGdXNlUmVzdWx0LFxuICBGdXNlUmVzdWx0TWF0Y2gsXG4gIElGdXNlT3B0aW9ucyxcbiAgUmFuZ2VUdXBsZSxcbn0gZnJvbSAnZnVzZS5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0c0RlZXAsIGZsYXR0ZW5EZWVwLCBpc051bWJlciwgc29ydEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIGNvbm5lY3RhYmxlLFxuICBDb25uZWN0YWJsZSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2NhbixcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5pbXBvcnQgeyBOdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL251bWJlci5waXBlJztcbmltcG9ydCB7IEhpZ2hsaWdodENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3Zpc3VhbGl6YXRpb24vaGlnaGxpZ2h0L2hpZ2hsaWdodC5jb21wb25lbnQnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJpdlNlbGVjdCB7XG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gT3B0aW9ucyAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgC0tLS0tLS0tLS0tLS0tLS0tLS3ilIDilIDilIDilJBcbiAgICog4pSCIEJhc2VPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4gICAqIOKUgiBUaGUgY29yZSBkYXRhIHJlcXVpcmVkIGZvciBlYWNoIG9wdGlvbiAgICDilIJcbiAgICog4pSCIChzdWNoIGFzIGlkIGFuZCB0aXRsZSkuICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAtLS0tLS0tLS0tLS0tLS0tLS0t4pSA4pSA4pSkXG4gICAqIOKUgiBPcHRpb24gKEJhc2VPcHRpb24gKyBjaGlsZHJlbikgICAgICAgICAgICDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgUHJvdmlkZXMgcmVjdXJzaXZlIHR5cGUgc2FmZXR5IHRvIHRoZSAgICAg4pSCXG4gICAqIOKUgiB0eXBlIHNhZmV0eSB0byB0aGUgQmFzZU9wdGlvbi4gICAgICAgICAgICDilIJcbiAgICog4pSU4pSALS0tLS0tLS0tLS0tLS0tLS0t4pSsLS0tLS0tLeKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHxcbiAgICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUgiBTb3VyY2VPcHRpb24gKE9wdGlvbiArIHNlYXJjaCBoaWdobGlnaHRzKSDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgQWRkcyBzZWFyY2ggaGlnaGxpZ2h0cyB0byB0aGUgT3B0aW9uIGFuZCAg4pSCXG4gICAqIOKUgiBpcyB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBvcHRpb24gU291cmNlICDilIJcbiAgICog4pSCIChkYXRhIGZldGNoZXIpIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICogICAgICAgICAgICAgICAgICAgICB8XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgRnVsbE9wdGlvbiAoU291cmNlT3B0aW9uICsgVUkgc3RhdGUpICAgICAg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIEF1Z21lbnRzIHRoZSBTb3VyY2VPcHRpb24gd2l0aCBhbGwgb2YgdGhlIOKUglxuICAgKiDilIIgVUkgaW5mb3JtYXRpb24gZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgICAg4pSCXG4gICAqIOKUgiBzdGF0ZSwgc3VjaCBhcyBzZWxlY3Rpb24gc3RhdHVzLCB3aGV0aGVyICDilIJcbiAgICog4pSCIG9yIG5vdCB0aGUgbm9kZSBpcyBleHBhbmRlZCwgZXRjLiAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSB1c2FnZXMgb2YgT21pdDwuLi4+IGluIHRoaXMgc2VjdGlvbiBhcmUgbm90IHJlcXVpcmVkLCBidXRcbiAgICogZG8gaGVscCBpbi1lZGl0b3IgdHlwZSBoaW50cyB0byBiZSBtb3JlIGNsZWFyIGFuZCBkaXJlY3QuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIEJhc2VPcHRpb24gPSB7XG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHN1YnRpdGxlPzogc3RyaW5nO1xuICAgIGhlbHA/OiBzdHJpbmc7XG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAgIGRpc2FibGVkRXhwbGFuYXRpb24/OiBzdHJpbmc7XG4gIH07XG4gIGV4cG9ydCB0eXBlIE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbiA9IEJhc2VPcHRpb24+ID0gTyAmIHtcbiAgICBjaGlsZHJlbj86IE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZU9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIE9wdGlvbjxPPixcbiAgICAnY2hpbGRyZW4nXG4gID4gJiB7XG4gICAgdGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICBzdWJ0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgIGNoaWxkcmVuPzogU291cmNlT3B0aW9uPE8+W107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTXVsdGlTZWxlY3Rpb25TdGF0ZSA9IGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZSc7XG5cbiAgZXhwb3J0IHR5cGUgRnVsbE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIFNvdXJjZU9wdGlvbjxPPixcbiAgICAnY2hpbGRyZW4nXG4gID4gJiB7XG4gICAgc2VsZWN0ZWQ6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgZXhwYW5kZWQ6IGJvb2xlYW47XG4gICAgc2VsZWN0YWJsZTogYm9vbGVhbjtcbiAgICBleHBhbmRhYmxlOiBib29sZWFuO1xuICAgIGNoaWxkcmVuPzogRnVsbE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gT3B0aW9uIGdyb3VwcyAvL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gT3B0aW9uR3JvdXAsIFNvdXJjZU9wdGlvbkdyb3VwLCBhbmRcbiAgICogRnVsbE9wdGlvbkdyb3VwIGlzIGFuYWxvZ291cyB0byB0aGUgb3B0aW9uIHR5cGVzIGFib3ZlLlxuICAgKlxuICAgKiBBcyB3aXRoIGJlZm9yZSwgdGhlIHVzZSBvZiBPbWl0PC4uLj4gaXMgbm90IHJlcXVpcmVkIGJ1dCBoZWxwZnVsLlxuICAgKi9cblxuICBleHBvcnQgdHlwZSBPcHRpb25Hcm91cDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgaGVhZGVyPzogc3RyaW5nO1xuICAgIC8qKiBJbmZvIGljb24gKyB0b29sdGlwIHNob3duIGJlc2lkZSB0aGUgaGVhZGVyLiBOby1vcCB3aXRob3V0IGEgaGVhZGVyLiAqL1xuICAgIGhlbHA/OiBzdHJpbmc7XG4gICAgb3B0aW9uczogT3B0aW9uPE8+W107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU291cmNlT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBPcHRpb25Hcm91cDxPPixcbiAgICAnb3B0aW9ucydcbiAgPiAmIHtcbiAgICBvcHRpb25zOiBTb3VyY2VPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBTb3VyY2VPcHRpb25Hcm91cDxPPixcbiAgICAnb3B0aW9ucydcbiAgPiAmIHtcbiAgICBvcHRpb25zOiBGdWxsT3B0aW9uPE8+W107XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBPcHRpb25TZXQgY2xhc3MgcHJvdmlkZXMgU2V0LWxpa2UgZnVuY3Rpb25hbGl0eSwgYnV0IHVuaXF1ZW5lc3MgaXNcbiAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW9uJ3MgSUQgcmF0aGVyIHRoYW4gdGhlIG9iamVjdCByZWZlcmVuY2UuXG4gICAqL1xuICBleHBvcnQgY2xhc3MgT3B0aW9uU2V0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiBleHRlbmRzIFNldDxTb3VyY2VPcHRpb248Tz4+IHtcbiAgICAvLyBQYXJhbGxlbCBpZCDihpIgb3B0aW9uIG1hcCBzbyBoYXMoKS9hZGQoKS9kZWxldGUoKSBhcmUgTygxKSBpbnN0ZWFkIG9mXG4gICAgLy8gc3ByZWFkaW5nIHRoZSBTZXQgYW5kIGxpbmVhci1zY2FubmluZyBpdC4gUmVidWlsZGluZyBhbiBPKE7CsikgbG9va3VwXG4gICAgLy8gZm9yIGEgMTZrLW9wdGlvbiBzZWxlY3Rpb24gd2FzIHRoZSBwcmltYXJ5IGNhdXNlIG9mIHRoZSBtdWx0aS1taW51dGVcbiAgICAvLyBmcmVlemUgdGhhdCBzdXJmYWNlZCBSVlQtMjUzODMncyB0cmVlLXNlbGVjdCBzY2FsZSBwcm9ibGVtLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnlJZCA9IG5ldyBNYXA8T1snaWQnXSwgU291cmNlT3B0aW9uPE8+PigpO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWVzPzogSXRlcmFibGU8U291cmNlT3B0aW9uPE8+PiB8IG51bGwpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgdGhpcy5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgaGFzKG9wdGlvbjogU291cmNlT3B0aW9uPE8+IHwgRnVsbE9wdGlvbjxPPikge1xuICAgICAgcmV0dXJuIHRoaXMuYnlJZC5oYXMob3B0aW9uLmlkKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBhZGQob3B0aW9uOiBTb3VyY2VPcHRpb248Tz4pIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ieUlkLmdldChvcHRpb24uaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nID09PSBvcHRpb24pIHtcbiAgICAgICAgLy8gU2FtZSBvYmplY3QgcmVmZXJlbmNlIOKAlCBub3RoaW5nIHRvIHVwZGF0ZS4gQW5jZXN0b3IgcmUtYWRkc1xuICAgICAgICAvLyBkdXJpbmcgYSBzZWxlY3Rpb24gc25hcHNob3QgaGl0IHRoaXMgcGF0aCByZXBlYXRlZGx5LCBzbyBrZWVwaW5nXG4gICAgICAgIC8vIGl0IE8oMSkgaXMgd2hhdCBwcmV2ZW50cyB0aGUgdHJlZS1zZWxlY3QgTsKyIGJsb3ctdXAgc2VlbiBpblxuICAgICAgICAvLyBSVlQtMjU0NzAuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gRGlmZmVyZW50IHJlZmVyZW5jZSwgc2FtZSBpZCDigJQgc3dhcCB0aGUgc3RvcmVkIHJlZiB3aGlsZVxuICAgICAgICAvLyBwcmVzZXJ2aW5nIFNldCBpbnNlcnRpb24gb3JkZXIuIFRoZSByZWJ1aWxkIGlzIE8oTiksIGJ1dCB0aGlzXG4gICAgICAgIC8vIHBhdGggaXMgcmFyZSBpbiBwcmFjdGljZSAodGhlIGhvdCBhbmNlc3Rvci1zbmFwc2hvdCBsb29wIHRha2VzXG4gICAgICAgIC8vIHRoZSBpZGVudGl0eSBmYXN0LXBhdGggYWJvdmUpLlxuICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzXS5tYXAobyA9PiAoby5pZCA9PT0gb3B0aW9uLmlkID8gb3B0aW9uIDogbykpO1xuICAgICAgICB0aGlzLmJ5SWQuc2V0KG9wdGlvbi5pZCwgb3B0aW9uKTtcbiAgICAgICAgc3VwZXIuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSBzdXBlci5hZGQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ5SWQuc2V0KG9wdGlvbi5pZCwgb3B0aW9uKTtcbiAgICAgICAgc3VwZXIuYWRkKG9wdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkZWxldGUob3B0aW9uOiBTb3VyY2VPcHRpb248Tz4pIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ieUlkLmdldChvcHRpb24uaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIHRoaXMuYnlJZC5kZWxldGUob3B0aW9uLmlkKTtcbiAgICAgICAgc3VwZXIuZGVsZXRlKGV4aXN0aW5nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY2xlYXIoKSB7XG4gICAgICB0aGlzLmJ5SWQuY2xlYXIoKTtcbiAgICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8vLy8vLy8vLy9cbiAgLy8gU3RhdGUgLy9cbiAgLy8vLy8vLy8vLy9cblxuICAvKipcbiAgICogVGhlIENvcmVTdGF0ZSBwcm92aWRlcyBhbGwgb2YgdGhlIGZvdW5kYXRpb25hbCBwaWVjZXMgb2Ygc3RhdGUgcmVxdWlyZWRcbiAgICogZm9yIGEgd29ya2luZyBjb21wb25lbnQuIEZ1bGxTdGF0ZSBpcyBhIHB1cmUgZGVyaXZhdGlvbiBvZiBDb3JlU3RhdGUgcGx1c1xuICAgKiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBhbmQgcHJvdmlkZXMgY29udmVuaWVuY2VzIGZvciByZW5kZXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudHMuIEFjdGlvbnMgYW5kIHRoZSBjb3JlIHN0YXRlIGFyZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgdG9cbiAgICogcHJvZHVjZSBuZXcgQ29yZVN0YXRlcyAod2hpY2ggYXJlIHRoZW4gdXNlZCB0byBjYWxjdWxhdGUgbmV3IEZ1bGxTdGF0ZXMpLlxuICAgKlxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSCICBVSSAg4peE4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUlOKUgOKUgOKUrOKUgOKUgOKUgOKUmCAgICAgICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIJcbiAgICog4pSCICBBY3Rpb25zICDilIIgICDilIJcbiAgICog4pSU4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilJBcbiAgICog4pSCICBTdGF0ZSByZWR1Y2VyICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIE9yZGVyQnkgPSAndGl0bGUnIHwgJ2NvdW50JyB8ICdzb3VyY2UnO1xuXG4gIGNvbnN0IE1JTl9PUFRJT05TX0ZPUl9DT05UUk9MUyA9IDU7XG5cbiAgY29uc3QgREVGQVVMVF9ESVNQTEFZX0xJTUlUID0gMTAwO1xuXG4gIGV4cG9ydCB0eXBlIENvcmVTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHNlYXJjaDogc3RyaW5nO1xuICAgICAgb3JkZXI6IE9yZGVyQnk7XG4gICAgfTtcbiAgICBsb2FkOiB7XG4gICAgICBsb2FkaW5nOiBib29sZWFuO1xuICAgICAgZXJyb3I6IHVua25vd24gfCBudWxsO1xuICAgIH07XG4gICAgc291cmNlT3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyB0aGUgdW5maWx0ZXJlZCBvcmlnaW5hbCBvcHRpb24gZ3JvdXBzIHdoZW4gc2VhcmNoIGZpbHRlcmluZyBpcyBhY3RpdmUuXG4gICAgICogVXNlZCBieSBgYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoYCB0byBzZWxlY3QgYWxsIGNoaWxkcmVuIG9mIGEgcGFyZW50LFxuICAgICAqIGluY2x1ZGluZyB0aG9zZSBub3QgdmlzaWJsZSBpbiB0aGUgZmlsdGVyZWQgc2VhcmNoIHJlc3VsdHMuXG4gICAgICovXG4gICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICBzZWxlY3RlZDogT3B0aW9uU2V0PE8+O1xuICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAgIG9wZW46IGJvb2xlYW47XG4gICAgICBleHBhbmRlZE9wdGlvbnM6IFNldDxPWydpZCddPjtcbiAgICB9O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBDb3JlU3RhdGU8Tz4gJiB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHNob3dTZWFyY2g6IGJvb2xlYW47XG4gICAgICBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgICAgc2hvd09yZGVyOiBib29sZWFuO1xuICAgIH07XG4gICAgZnVsbE9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W107XG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuO1xuICAgICAgYWxsb3dTZWxlY3RBbGw6IGJvb2xlYW47XG4gICAgICB2aXNpYmxlU2VsZWN0aW9uU3RhdGU6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgfTtcbiAgICBkaXNwbGF5OiB7XG4gICAgICBmb3JtYXR0ZWRTZWxlY3RlZE9wdGlvbnM6IHN0cmluZztcbiAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgICBkaXZpZGVyczogYm9vbGVhbjtcbiAgICAgIGlubGluZTogYm9vbGVhbjtcbiAgICAgIG1heEhlaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1heFdpZHRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgbWluSGVpZ2h0OiBzdHJpbmcgfCBudWxsO1xuICAgICAgbWluV2lkdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICBkaXNwbGF5TGltaXRNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgICAgc2hvd1NpbmdsZVNlbGVjdGVkOiBib29sZWFuO1xuICAgICAgcGlsbENvdW50OiBudW1iZXI7XG4gICAgfTtcbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIEFjdGlvbnMgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIEFjdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwgeyB0eXBlOiAnbG9hZCcgfVxuICAgIHwgeyB0eXBlOiAnb3BlbkNoYW5nZSc7IG9wZW46IGJvb2xlYW4gfVxuICAgIHwgeyB0eXBlOiAnc2VhcmNoQ2hhbmdlJzsgcGF5bG9hZDogc3RyaW5nIH1cbiAgICB8IHsgdHlwZTogJ29yZGVyQ2hhbmdlJzsgcGF5bG9hZDogT3JkZXJCeSB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3Rpb25DaGFuZ2UnO1xuICAgICAgICBwYXlsb2FkOiBDb3JlU3RhdGU8Tz5bJ3NlbGVjdGlvbiddO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlT3B0aW9uU2VsZWN0ZWQnO1xuICAgICAgICBpZDogT1snaWQnXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3NldFNlbGVjdGVkT3B0aW9uJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICd2aXNpYmxlU2VsZWN0ZWRDaGFuZ2UnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlT3B0aW9uRXhwYW5kZWQnO1xuICAgICAgICBpZDogT1snaWQnXTtcbiAgICAgIH07XG5cbiAgdHlwZSBJbnRlcm5hbEFjdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnbG9hZENvbXBsZXRlJztcbiAgICAgICAgZGF0YTogU291cmNlT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICAgICAgLyoqIE9yaWdpbmFsIHVuZmlsdGVyZWQgZGF0YSwgcHJvdmlkZWQgd2hlbiBzZWFyY2ggaXMgYWN0aXZlICovXG4gICAgICAgIG9yaWdpbmFsRGF0YT86IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICB9XG4gICAgfCB7IHR5cGU6ICdsb2FkRXJyb3InOyBlcnJvcjogdW5rbm93biB9O1xuXG4gIC8vLy8vLy8vLy8vL1xuICAvLyBTb3VyY2UgLy9cbiAgLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSBTb3VyY2UncyBqb2IgaXMgdG8gZmV0Y2ggb3B0aW9ucyAoYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUpIHdoaWNoXG4gICAqIHRoZW4gYmxlbmQgd2l0aCB0aGUgb3RoZXIgcGllY2VzIG9mIHN0YXRlIHRvIHByb2R1Y2UgdGhlIEZ1bGxTdGF0ZS5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgU291cmNlUmVzdWx0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9XG4gICAgfCBTb3VyY2VPcHRpb25Hcm91cDxPPltdXG4gICAgfCB7XG4gICAgICAgIGRhdGE6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcmlnaW5hbCB1bmZpbHRlcmVkIGRhdGEsIHByb3ZpZGVkIHdoZW4gc2VhcmNoIGZpbHRlcmluZyBpcyBhY3RpdmUuXG4gICAgICAgICAqIFVzZWQgYnkgYGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaGAgdG8gc2VsZWN0IGFsbCBjaGlsZHJlbiBvZlxuICAgICAgICAgKiBhIHBhcmVudCwgaW5jbHVkaW5nIHRob3NlIG5vdCB2aXNpYmxlIGluIHRoZSBmaWx0ZXJlZCBzZWFyY2ggcmVzdWx0cy5cbiAgICAgICAgICovXG4gICAgICAgIG9yaWdpbmFsRGF0YT86IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSAoXG4gICAgcXVlcnk6IENvcmVTdGF0ZTxPPlsncXVlcnknXSxcbiAgICBtb3N0UmVjZW50QWN0aW9uOiBBY3Rpb248Tz4sXG4gICkgPT4gUHJvbWlzZTxTb3VyY2VSZXN1bHQ8Tz4+O1xuXG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gTWFuYWdlciAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgYWN0aW9uczogU3ViamVjdDxBY3Rpb248Tz4+O1xuICAgIHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8Tz4+O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXJPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9IHtcbiAgICBpbml0aWFsU3RhdGU/OiBEZWVwUGFydGlhbDxDb3JlU3RhdGU8Tz4+O1xuICAgIGFsbG93TXVsdGlTZWxlY3Q/OiBib29sZWFuO1xuICAgIGFsbG93U2VhcmNoPzogYm9vbGVhbjtcbiAgICBhbGxvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gICAgYWxsb3dPcmRlcj86IGJvb2xlYW47XG4gICAgc2VhcmNoUGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgZGl2aWRlcnM/OiBib29sZWFuO1xuICAgIGlubGluZT86IGJvb2xlYW47XG4gICAgbWF4SGVpZ2h0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBtYXhXaWR0aD86IHN0cmluZyB8IG51bGw7XG4gICAgbWluSGVpZ2h0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBtaW5XaWR0aD86IHN0cmluZyB8IG51bGw7XG4gICAgZGlzcGxheUxpbWl0PzogbnVtYmVyO1xuICAgIHNlbGVjdGVkT3B0aW9uTGltaXQ/OiBudW1iZXI7XG4gICAgc2hvd1NpbmdsZVNlbGVjdGVkPzogYm9vbGVhbjtcbiAgICB1c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5PzogYm9vbGVhbjtcbiAgICBnZXRDdXN0b21PcHRpb25EaXNwbGF5PzogKHNlbGVjdGVkT3B0aW9uczogU291cmNlT3B0aW9uPE8+W10pID0+IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIG5vbi1sZWFmIG5vZGVzIChwYXJlbnRzKSByZW1haW4gc2VsZWN0YWJsZSBkdXJpbmcgc2VhcmNoLFxuICAgICAqIGFuZCBzZWxlY3RpbmcgdGhlbSB3aWxsIHNlbGVjdC9kZXNlbGVjdCBBTEwgY2hpbGRyZW4gZnJvbSB0aGUgb3JpZ2luYWxcbiAgICAgKiBkYXRhc2V0LCBub3QganVzdCB0aGUgdmlzaWJsZSBmaWx0ZXJlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogRGVmYXVsdDogZmFsc2UgKGN1cnJlbnQgYmVoYXZpb3IgLSBwYXJlbnRzIGFyZSBub3Qgc2VsZWN0YWJsZSBkdXJpbmcgc2VhcmNoKVxuICAgICAqL1xuICAgIGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBvcHRpb25zIHRoYXQgd2VyZSBzZWxlY3RlZCB3aGVuIHRoZSBzZWxlY3Qgd2FzIG9wZW5lZCBhcmVcbiAgICAgKiBzb3J0ZWQgdG8gdGhlIHRvcCBvZiB0aGVpciBzaWJsaW5nIGxpc3RzLiBTZXQgdG8gZmFsc2UgdG8gcHJlc2VydmUgdGhlXG4gICAgICogbmF0dXJhbCAob3IgY2hvc2VuIE9yZGVyQnkpIG9yZGVyIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0OiB0aGUgdmFsdWUgb2YgYWxsb3dNdWx0aVNlbGVjdFxuICAgICAqL1xuICAgIHNvcnRTZWxlY3RlZFRvVG9wPzogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc291cmNlOiBTb3VyY2U8Tz4sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBNYW5hZ2VyPE8+IHtcbiAgICBjb25zdCBkZWZhdWx0U3RhdGU6IENvcmVTdGF0ZTxPPiA9IHtcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIHNlYXJjaDogJycsXG4gICAgICAgIG9yZGVyOiAndGl0bGUnLFxuICAgICAgfSxcbiAgICAgIGxvYWQ6IHtcbiAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfSxcbiAgICAgIHNvdXJjZU9wdGlvbkdyb3VwczogW10sXG4gICAgICBvcmlnaW5hbE9wdGlvbkdyb3VwczogW10sXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgc2VsZWN0ZWQ6IG5ldyBPcHRpb25TZXQoKSxcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICAgIGV4cGFuZGVkT3B0aW9uczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGRlZmF1bHRlZEluaXRpYWxTdGF0ZTogQ29yZVN0YXRlPE8+ID0gZGVmYXVsdHNEZWVwKFxuICAgICAge30sXG4gICAgICBvcHRpb25zPy5pbml0aWFsU3RhdGUsXG4gICAgICBkZWZhdWx0U3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPE8+PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgY29uc3QgaW50ZXJuYWxBY3Rpb25zOiBTdWJqZWN0PEludGVybmFsQWN0aW9uPE8+PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBjb25zdCBjb3JlU3RhdGVXaXRoU2VsZWN0aW9uU25hcHNob3Q6IE9ic2VydmFibGU8XG4gICAgICBbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dXG4gICAgPiA9IG1lcmdlKGFjdGlvbnMsIGludGVybmFsQWN0aW9ucykucGlwZShcbiAgICAgIHNjYW48QWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sIFtDb3JlU3RhdGU8Tz4sIE9wdGlvblNldDxPPl0+KFxuICAgICAgICAoW3N0YXRlLCBzbmFwc2hvdF0sIGFjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gc2lkZUVmZmVjdHMoXG4gICAgICAgICAgICByZWR1Y2Uoc3RhdGUsIGFjdGlvbiwgb3B0aW9ucyksXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBpbnRlcm5hbEFjdGlvbnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvblNuYXBzaG90ID1cbiAgICAgICAgICAgIChhY3Rpb24udHlwZSA9PT0gJ29wZW5DaGFuZ2UnICYmIGFjdGlvbi5vcGVuKSB8fFxuICAgICAgICAgICAgKGFjdGlvbi50eXBlID09PSAnbG9hZENvbXBsZXRlJyAmJlxuICAgICAgICAgICAgICAobmV3U3RhdGUuZGlzcGxheS5vcGVuIHx8IG9wdGlvbnM/LmlubGluZSkpXG4gICAgICAgICAgICAgID8gY3JlYXRlU2VsZWN0aW9uU25hcHNob3RXaXRoQW5jZXN0b3JzKG5ld1N0YXRlKVxuICAgICAgICAgICAgICA6IHNuYXBzaG90O1xuXG4gICAgICAgICAgcmV0dXJuIFtuZXdTdGF0ZSwgbmV3U2VsZWN0aW9uU25hcHNob3RdO1xuICAgICAgICB9LFxuICAgICAgICBbZGVmYXVsdGVkSW5pdGlhbFN0YXRlLCBuZXcgT3B0aW9uU2V0PE8+KCldLFxuICAgICAgKSxcbiAgICAgIHN0YXJ0V2l0aDxbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dPihbXG4gICAgICAgIGRlZmF1bHRlZEluaXRpYWxTdGF0ZSxcbiAgICAgICAgbmV3IE9wdGlvblNldDxPPigpLFxuICAgICAgXSksXG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8Tz4+ID0gY29ubmVjdGFibGUoXG4gICAgICBjb3JlU3RhdGVXaXRoU2VsZWN0aW9uU25hcHNob3QucGlwZShcbiAgICAgICAgbWFwKChbcywgc2VsZWN0aW9uQXRPcGVuXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFsbE9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10gPVxuICAgICAgICAgICAgcy5zb3VyY2VPcHRpb25Hcm91cHMubWFwKG9wdGlvbkdyb3VwID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25Hcm91cCxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25Hcm91cC5vcHRpb25zLm1hcChvcHRpb24gPT5cbiAgICAgICAgICAgICAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24ocywgb3B0aW9uLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoYWxsT3B0aW9uR3JvdXBzKTtcblxuICAgICAgICAgIGNvbnN0IHNvcnRlZE9wdGlvbkdyb3VwcyA9XG4gICAgICAgICAgICBvcHRpb25zPy5zb3J0U2VsZWN0ZWRUb1RvcCA/PyBvcHRpb25zPy5hbGxvd011bHRpU2VsZWN0XG4gICAgICAgICAgICAgID8gc29ydE9wdGlvbnNCeVByZXZpb3VzbHlTZWxlY3RlZFN0YXRlKFxuICAgICAgICAgICAgICAgICAgYWxsT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXRPcGVuLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBhbGxPcHRpb25Hcm91cHM7XG5cbiAgICAgICAgICBjb25zdCBkaXNwbGF5TGltaXQgPSBvcHRpb25zPy5kaXNwbGF5TGltaXQgPz8gREVGQVVMVF9ESVNQTEFZX0xJTUlUO1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlMaW1pdGVkT3B0aW9uR3JvdXBzID0gYXBwbHlEaXNwbGF5TGltaXQoXG4gICAgICAgICAgICBzb3J0ZWRPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICBkaXNwbGF5TGltaXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmdWxsT3B0aW9uR3JvdXBzID0gYXBwbHlTZWxlY3RlZE9wdGlvbkxpbWl0KFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGRpc3BsYXlMaW1pdGVkT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgdG9wTGV2ZWxPcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnMsXG4gICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICBzaG93U2VhcmNoOlxuICAgICAgICAgICAgICAgICEhcy5xdWVyeS5zZWFyY2ggfHxcbiAgICAgICAgICAgICAgICAoISFvcHRpb25zPy5hbGxvd1NlYXJjaCAmJlxuICAgICAgICAgICAgICAgICAgY291bnRBbGxPcHRpb25zKGFsbE9wdGlvbkdyb3VwcykgPlxuICAgICAgICAgICAgICAgICAgICBNSU5fT1BUSU9OU19GT1JfQ09OVFJPTFMpIHx8XG4gICAgICAgICAgICAgICAgY291bnRBbGxPcHRpb25zKGFsbE9wdGlvbkdyb3VwcykgPiBkaXNwbGF5TGltaXQsXG4gICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyOiBvcHRpb25zPy5zZWFyY2hQbGFjZWhvbGRlciA/PyAnU2VhcmNoJyxcbiAgICAgICAgICAgICAgc2hvd09yZGVyOlxuICAgICAgICAgICAgICAgICEhb3B0aW9ucz8uYWxsb3dPcmRlciAmJlxuICAgICAgICAgICAgICAgICFzLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID4gTUlOX09QVElPTlNfRk9SX0NPTlRST0xTLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bGxPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgLi4ucy5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgIGFsbG93TXVsdGlTZWxlY3Q6ICEhb3B0aW9ucz8uYWxsb3dNdWx0aVNlbGVjdCxcbiAgICAgICAgICAgICAgYWxsb3dTZWxlY3RBbGw6XG4gICAgICAgICAgICAgICAgISFvcHRpb25zPy5hbGxvd1NlbGVjdEFsbCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LnNlbGVjdGVkT3B0aW9uTGltaXQgPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB2aXNpYmxlU2VsZWN0aW9uU3RhdGU6XG4gICAgICAgICAgICAgICAgZ2V0UGFyZW50TXVsdGlTZWxlY3Rpb25TdGF0ZSh0b3BMZXZlbE9wdGlvbnMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgICAgICAgLi4ucy5kaXNwbGF5LFxuICAgICAgICAgICAgICBmb3JtYXR0ZWRTZWxlY3RlZE9wdGlvbnM6IGdldEZvcm1hdHRlZE9wdGlvbnNGb3JEaXNwbGF5KFxuICAgICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgICAgdG9wTGV2ZWxPcHRpb25zLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IGdldFplcm9TdGF0ZU1lc3NhZ2UocyksXG4gICAgICAgICAgICAgIGRpdmlkZXJzOiAhIW9wdGlvbnM/LmRpdmlkZXJzLFxuICAgICAgICAgICAgICBpbmxpbmU6ICEhb3B0aW9ucz8uaW5saW5lLFxuICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG9wdGlvbnM/Lm1heEhlaWdodCA/PyBudWxsLFxuICAgICAgICAgICAgICBtYXhXaWR0aDogb3B0aW9ucz8ubWF4V2lkdGggPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWluSGVpZ2h0OiBvcHRpb25zPy5taW5IZWlnaHQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWluV2lkdGg6IG9wdGlvbnM/Lm1pbldpZHRoID8/IG51bGwsXG4gICAgICAgICAgICAgIGRpc3BsYXlMaW1pdE1lc3NhZ2U6IGdldERpc3BsYXlMaW1pdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgY291bnRWaXNpYmxlT3B0aW9ucyhmdWxsT3B0aW9uR3JvdXBzLCAhIXMucXVlcnkuc2VhcmNoKSxcbiAgICAgICAgICAgICAgICBjb3VudFZpc2libGVPcHRpb25zKGFsbE9wdGlvbkdyb3VwcywgISFzLnF1ZXJ5LnNlYXJjaCksXG4gICAgICAgICAgICAgICAgcy5xdWVyeSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc2hvd1NpbmdsZVNlbGVjdGVkOiAhIW9wdGlvbnM/LnNob3dTaW5nbGVTZWxlY3RlZCxcbiAgICAgICAgICAgICAgcGlsbENvdW50OiBnZXRQaWxsQ291bnRGb3JEaXNwbGF5KHMsIHRvcExldmVsT3B0aW9ucywgb3B0aW9ucyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSxcbiAgICAgICAgcmVzZXRPbkRpc2Nvbm5lY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICAgIHN0YXRlLmNvbm5lY3QoKTtcblxuICAgIC8vIExvYWQgdGhlIG9wdGlvbnMgaW1tZWRpYXRlbHkgZm9yIHNlbGVjdHMgdGhhdCBhcmUgZGlzcGxheWVkIGlubGluZS5cbiAgICBpZiAob3B0aW9ucz8uaW5saW5lKSBhY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZCcgfSk7XG5cbiAgICByZXR1cm4geyBhY3Rpb25zLCBzdGF0ZSB9O1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIE1hbmFnZXJPcHRpb25zPE8+ICYge1xuICAgICAgZnVzZU9wdGlvbnM/OiBJRnVzZU9wdGlvbnM8Tz47XG4gICAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5NZW1vcnlNYW5hZ2VyPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBmZXRjaERhdGFzZXQ6ICgpID0+IFByb21pc2U8T3B0aW9uR3JvdXA8Tz5bXT4gfCBPcHRpb25Hcm91cDxPPltdLFxuICAgIG9wdGlvbnM/OiBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBNYW5hZ2VyPE8+IHtcbiAgICBsZXQgZGF0YTogT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICBsZXQgZnVzZTogRnVzZTxPPjtcbiAgICBsZXQgZXhhY3RNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxldCBwYXJlbnRzOiBNYXA8T1snaWQnXSwgT1snaWQnXT47XG4gICAgbGV0IGNoaWxkcmVuOiBNYXA8T1snaWQnXSwgT1snaWQnXVtdPjtcblxuICAgIGNvbnN0IHNvdXJjZTogU291cmNlPE8+ID0gYXN5bmMgKHF1ZXJ5LCBtb3N0UmVjZW50QWN0aW9uKSA9PiB7XG4gICAgICAvKlxuICAgICAgICBSZS1mZXRjaCB0aGUgb3B0aW9ucyBvbiB0aGUgbG9hZCBhY3Rpb24sIGFuZCByZWJ1aWxkIHRoZSBzdGF0ZVxuICAgICAgICBkZXJpdmVkIGZyb20gdGhlIG9wdGlvbiBkYXRhLlxuICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnbG9hZCcgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnb3BlbkNoYW5nZSdcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhc2V0KCk7XG4gICAgICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhkYXRhKTtcblxuICAgICAgICBmdXNlID0gbmV3IEZ1c2UoZmxhdHRlbk9wdGlvbnModG9wTGV2ZWxPcHRpb25zLCBmYWxzZSksIHtcbiAgICAgICAgICB0aHJlc2hvbGQ6IDAuMixcbiAgICAgICAgICBrZXlzOiBbJ3RpdGxlJ10sXG4gICAgICAgICAgaW5jbHVkZVNjb3JlOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVNYXRjaGVzOiB0cnVlLFxuICAgICAgICAgIC4uLm9wdGlvbnM/LmZ1c2VPcHRpb25zLFxuICAgICAgICB9KTtcblxuICAgICAgICBleGFjdE1hdGNoID0gb3B0aW9ucz8uZnVzZU9wdGlvbnM/LnRocmVzaG9sZCA9PSAwO1xuICAgICAgICBbcGFyZW50cywgY2hpbGRyZW5dID0gZ2V0UmVsYXRpb25zaGlwTWFwcyh0b3BMZXZlbE9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2Ugc2hvdWxkbid0IGFmZmVjdCBmdXp6eSBtYXRjaGluZyAoRnVzZVxuICAgICAgLy8gc2NvcmVzIHRoZSBwYXR0ZXJuJ3MgbGVuZ3RoIGFnYWluc3QgdGhlIHRleHQncywgc28gYSBzdHJheSBzcGFjZVxuICAgICAgLy8gY2hhbmdlcyByZXN1bHRzIGluIHN1cnByaXNpbmcgd2F5cyk7IGEgc2VhcmNoIHN0cmluZyBvZiBvbmx5XG4gICAgICAvLyB3aGl0ZXNwYWNlIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgbm8gc2VhcmNoLlxuICAgICAgY29uc3Qgc2VhcmNoID0gcXVlcnkuc2VhcmNoLnRyaW0oKTtcblxuICAgICAgLypcbiAgICAgICAgSWYgdGhlIHVzZXIgaXMgbm90IHNlYXJjaGluZyBvcHRpb25zLCByZXR1cm4gdGhlIGZ1bGwgc2V0IG9mIG9wdGlvbnNcbiAgICAgICAgc29ydGVkIGFwcHJvcHJpYXRlbHkuXG4gICAgICAqL1xuICAgICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBUaGUgYHNvdXJjZWAgb3JkZXIgcHJvcGVydHkgYWxsb3dzIGZvciBvcHRpbmcgb3V0IG9mIGF1dG9tYXRpY1xuICAgICAgICAgIHNvcnRpbmcsIHJldHVybmluZyB0aGUgZGF0YSBpbiBpdHMgbmF0dXJhbCBpbnB1dCBvcmRlci5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHF1ZXJ5Lm9yZGVyID09PSAnc291cmNlJykgcmV0dXJuIGRhdGE7XG5cbiAgICAgICAgLypcbiAgICAgICAgICBTb3J0IHRoZSBvcHRpb25zIGJ5IHRpdGxlIGFuZCBzdWJ0aXRsZS5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHF1ZXJ5Lm9yZGVyID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgZnVuY3Rpb24gc29ydEJ5VGl0bGUob3B0aW9uczogT3B0aW9uPE8+W10pOiBPcHRpb248Tz5bXSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydEJ5KG9wdGlvbnMsIFtcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby50aXRsZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnN1YnRpdGxlPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxuICAgICAgICAgICAgXSkubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gc29ydEJ5VGl0bGUob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkYXRhLm1hcChncm91cCA9PiAoe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBvcHRpb25zOiBzb3J0QnlUaXRsZShncm91cC5vcHRpb25zKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgIFNvcnQgdGhlIG9wdGlvbnMgYnkgY291bnQsIHRoZW4gYnkgdGl0bGUsIHRoZW4gYnkgc3VidGl0bGUuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ2NvdW50Jykge1xuICAgICAgICAgIGZ1bmN0aW9uIHNvcnRCeUNvdW50KG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICAgICAgcmV0dXJuIHNvcnRCeShvcHRpb25zLCBbXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IChpc051bWJlcihvLmNvdW50KSA/IC1vLmNvdW50IDogSW5maW5pdHkpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnRpdGxlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IG8uc3VidGl0bGU/LnRvTG93ZXJDYXNlKCkgPz8gJycsXG4gICAgICAgICAgICBdKS5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBzb3J0QnlDb3VudChvcHRpb24uY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRhdGEubWFwKGdyb3VwID0+ICh7XG4gICAgICAgICAgICAuLi5ncm91cCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHNvcnRCeUNvdW50KGdyb3VwLm9wdGlvbnMpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICBFeGVjdXRlIHRoZSBzZWFyY2ggd2l0aCBmdXNlLiBPbmNlIHdlIGhhdmUgdGhlIHNlYXJjaCBtYXRjaCBkYXRhLFxuICAgICAgICByZWJ1aWxkIGp1c3QgYXMgbXVjaCBvZiB0aGUgdHJlZSBhcyBpcyBuZWVkZWQgdG8gcmVuZGVyIHRoZSBzZWFyY2hcbiAgICAgICAgcmVzdWx0cy4gU3BlY2lmaWNhbGx5LCBhbnkgbWF0Y2ggd2lsbCBuZWVkIGFsbCBvZiBpdHMgYW5jZXN0b3JzIChzb1xuICAgICAgICB0aGF0IG1hdGNoZWQgbGVhZiBub2RlcyBhcmUgc2hvd24gbmVzdGVkIHVuZGVyIHRoZWlyIGFuY2VzdG9ycykgYW5kIGFsbFxuICAgICAgICBvZiBpdHMgY2hpbGRyZW4gKGJlY2F1c2UgYSBtYXRjaGluZyBwYXJlbnQgbWVhbnMgdGhhdCBhbGwgb2YgaXRzXG4gICAgICAgIGRlc2NlbmRhbnRzIG1hdGNoIHRvbywgcGVyIHRoZSBkZXNpZ24gc3BlY2lmaWNhdGlvbiksIHdoZXRoZXIgdGhleVxuICAgICAgICB0aGVtc2VsdmVzIG1hdGNoZWQgb3Igbm90LlxuICAgICAgKi9cbiAgICAgIGNvbnN0IG1hdGNoZWRPcHRpb25zOiBGdXNlUmVzdWx0PE8+W10gPSBmdXNlLnNlYXJjaChzZWFyY2gpO1xuICAgICAgY29uc3QgbWF0Y2hlZElkczogU2V0PE9bJ2lkJ10+ID0gbmV3IFNldChcbiAgICAgICAgbWF0Y2hlZE9wdGlvbnMubWFwKHJlc3VsdCA9PiByZXN1bHQuaXRlbS5pZCksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBtYXRjaEFuY2VzdG9yczogU2V0PE9bJ2lkJ10+ID0gbmV3IFNldCgpO1xuICAgICAgZnVuY3Rpb24gY29sbGVjdEFuY2VzdG9ycyhpZHM6IE9bJ2lkJ11bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50cy5nZXQoaWQpO1xuICAgICAgICAgIGlmIChwYXJlbnRJZCkge1xuICAgICAgICAgICAgbWF0Y2hBbmNlc3RvcnMuYWRkKHBhcmVudElkKTtcbiAgICAgICAgICAgIGNvbGxlY3RBbmNlc3RvcnMoW3BhcmVudElkXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2xsZWN0QW5jZXN0b3JzKFsuLi5tYXRjaGVkSWRzXSk7XG5cbiAgICAgIGNvbnN0IG1hdGNoRGVzY2VuZGFudHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50cyhpZHM6IE9bJ2lkJ11bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuSWRzID0gY2hpbGRyZW4uZ2V0KGlkKTtcbiAgICAgICAgICBpZiAoY2hpbGRyZW5JZHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW5JZHMpIHtcbiAgICAgICAgICAgICAgbWF0Y2hEZXNjZW5kYW50cy5hZGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sbGVjdERlc2NlbmRhbnRzKGNoaWxkcmVuSWRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbGxlY3REZXNjZW5kYW50cyhbLi4ubWF0Y2hlZElkc10pO1xuXG4gICAgICAvKlxuICAgICAgICBOZXh0LCB3ZSdsbCBjb21iaW5lIGFsbCB0aGUgbWF0Y2hlZCBJRHMgd2l0aCB0aGVpciBkaXJlY3QgYW5jZXN0b3JzIGFuZFxuICAgICAgICBkZXNjYW5kYW50cywgYW5kIGZpbHRlciB0aGUgb3JpZ2luYWwgZGF0YSBzZXQgZG93biB0byBqdXN0IHRoZXNlXG4gICAgICAgIG9wdGlvbnMuXG4gICAgICAqL1xuICAgICAgY29uc3QgZmlsdGVyZWRJZHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoW1xuICAgICAgICAuLi5tYXRjaGVkSWRzLFxuICAgICAgICAuLi5tYXRjaEFuY2VzdG9ycyxcbiAgICAgICAgLi4ubWF0Y2hEZXNjZW5kYW50cyxcbiAgICAgIF0pO1xuXG4gICAgICBmdW5jdGlvbiBmaWx0ZXJPcHRpb25zKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnM6IE9wdGlvbjxPPltdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyZWRJZHMuaGFzKG9wdGlvbi5pZCkpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGZpbHRlck9wdGlvbnMob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJPcHRpb25zKGdldFRvcExldmVsT3B0aW9ucyhkYXRhKSk7XG5cbiAgICAgIC8qXG4gICAgICAgIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYW4gYXJyYXkgb2YgZGlzdGluY3QgdHJlZXMgKHRvcC1sZXZlbCBvcHRpb25zKSxcbiAgICAgICAgZmlsdGVyZWQgZG93biB0byBvbmx5IHRoZSBvcHRpb25zIG1hdGNoaW5nIHRoZSBzZWFyY2ggcXVlcnkuIE5vdGUgdGhhdFxuICAgICAgICB3ZSBkb24ndCBjYXJlIGFib3V0IHNlY3Rpb24gaGVhZGVycyB3aGVuIHNlYXJjaGluZyBzaW5jZSByZXN1bHRzIHNob3VsZFxuICAgICAgICBiZSBvcmRlcmVkIGJ5IHJlbGV2YW5jZS4gVG8gY2FsY3VsYXRlIHRoZSBvcmRlciBvZiB0aGVzZSB0cmVlcywgd2UnbGxcbiAgICAgICAgdGFrZSB0aGUgdG90YWwgbWF0Y2ggc2NvcmVzIGZvciBvcHRpb25zIGZvdW5kIGluIHRoZSB0cmVlLCBkaXZpZGVkIGJ5XG4gICAgICAgIHRoZSBjb3VudCBvZiBtYXRjaGVzIGluIHRoZSB0cmVlICh0aGUgYmVzdCBhdmVyYWdlIG1hdGNoIHNjb3JlKS5cbiAgICAgICovXG5cbiAgICAgIGNvbnN0IHNjb3JlTWFwOiBNYXA8T1snaWQnXSwgbnVtYmVyPiA9IG5ldyBNYXAoXG4gICAgICAgIG1hdGNoZWRPcHRpb25zLm1hcChyZXN1bHQgPT4gW3Jlc3VsdC5pdGVtLmlkLCByZXN1bHQuc2NvcmUgPz8gMF0pLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyZWQgPSBzb3J0QnkoZmlsdGVyZWRPcHRpb25zLCAob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIgPT4ge1xuICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGVTY29yZShvcHRpb246IE9wdGlvbjxPPik6IG51bWJlciB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChzY29yZU1hcC5nZXQob3B0aW9uLmlkKSA/PyAwKSArXG4gICAgICAgICAgICAob3B0aW9uLmNoaWxkcmVuID8/IFtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChzY29yZSwgY2hpbGQpID0+IHNjb3JlICsgY2FsY3VsYXRlU2NvcmUoY2hpbGQpLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlQ291bnQob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAxICtcbiAgICAgICAgICAgIChvcHRpb24uY2hpbGRyZW4gPz8gW10pLnJlZHVjZShcbiAgICAgICAgICAgICAgKGNvdW50LCBjaGlsZCkgPT4gY291bnQgKyBjYWxjdWxhdGVDb3VudChjaGlsZCksXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbFNjb3JlID0gY2FsY3VsYXRlU2NvcmUob3B0aW9uKTtcbiAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IGNhbGN1bGF0ZUNvdW50KG9wdGlvbik7XG4gICAgICAgIHJldHVybiB0b3RhbFNjb3JlIC8gdG90YWxDb3VudDtcbiAgICAgIH0pO1xuXG4gICAgICAvKlxuICAgICAgICBGaW5hbGx5LCB3ZSdsbCBhZGQgaGlnaGxpZ2h0IGluZGljZXMgdG8gdGhlIG1hdGNoZXMgc28gdGhhdCB0aGV5IGNhbiBiZVxuICAgICAgICBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAgICAqL1xuXG4gICAgICB0eXBlIEhpZ2hsaWdodHMgPSB7XG4gICAgICAgIHRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgICAgIHN1YnRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgICB9O1xuICAgICAgY29uc3QgaGlnaGxpZ2h0TWFwOiBNYXA8T1snaWQnXSwgSGlnaGxpZ2h0cz4gPSBuZXcgTWFwKFxuICAgICAgICBtYXRjaGVkT3B0aW9ucy5tYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICBjb25zdCBoaWdobGlnaHRzOiBIaWdobGlnaHRzID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiByZXN1bHQubWF0Y2hlcyA/PyBbXSkge1xuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBpbmV4YWN0IG1hdGNoZXNcbiAgICAgICAgICAgIGlmIChleGFjdE1hdGNoICYmIG1hdGNoLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWF0Y2guaW5kaWNlcyA9IG1hdGNoLmluZGljZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGlzRnVzZU1hdGNoRXhhY3QobWF0Y2gsIHNlYXJjaCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2gua2V5ID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgICAgIGhpZ2hsaWdodHMudGl0bGVIaWdobGlnaHRJbmRpY2VzID0gWy4uLm1hdGNoLmluZGljZXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLmtleSA9PT0gJ3N1YnRpdGxlJykge1xuICAgICAgICAgICAgICBoaWdobGlnaHRzLnN1YnRpdGxlSGlnaGxpZ2h0SW5kaWNlcyA9IFsuLi5tYXRjaC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtyZXN1bHQuaXRlbS5pZCwgaGlnaGxpZ2h0c107XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGZ1bmN0aW9uIGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcHRpb25zOiBPcHRpb248Tz5bXSk6IFNvdXJjZU9wdGlvbjxPPltdIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAuLi5oaWdobGlnaHRNYXAuZ2V0KG9wdGlvbi5pZCksXG4gICAgICAgICAgLi4uKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICA/IHsgY2hpbGRyZW46IGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcHRpb24uY2hpbGRyZW4pIH1cbiAgICAgICAgICAgIDogbnVsbCksXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogW3sgb3B0aW9uczogYWRkSGlnaGxpZ2h0c1RvT3B0aW9uKG9yZGVyZWQpIH1dLFxuICAgICAgICBvcmlnaW5hbERhdGE6IGRhdGEsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gY3JlYXRlTWFuYWdlcihzb3VyY2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzRnVzZU1hdGNoRXhhY3QoXG4gICAgbWF0Y2g6IEZ1c2VSZXN1bHRNYXRjaCxcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgKTogKFxuICAgIHZhbHVlOiBSYW5nZVR1cGxlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgYXJyYXk6IHJlYWRvbmx5IFJhbmdlVHVwbGVbXSxcbiAgKSA9PiBib29sZWFuIHtcbiAgICByZXR1cm4gbWF0Y2hlZEluZGljZXMgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZFZhbHVlID0gbWF0Y2hcbiAgICAgICAgLnZhbHVlIS5zbGljZShtYXRjaGVkSW5kaWNlc1swXSwgbWF0Y2hlZEluZGljZXNbMV0gKyAxKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIC8vIGZ1c2UgaXMgd2VpcmQgd2l0aCBpdCdzIG1hdGNoZXMuIEZvciBhIHRleHQgb2YgXCJwbGFubmluZ1wiIGFuZCBhIHNlYXJjaCBzdHJpbmcgb2YgXCJwbGFuXCJcbiAgICAgIC8vIHRoZSBtYXRjaGVkIHZhbHVlIHdpbGwgYmUgXCJwbGFublwiIHdpdGggdGhlIGV4dHJhICduJyBiZWNhdXNlIG9mIGl0cyBmdXp6eSBtYXRjaGluZy5cbiAgICAgIC8vIHNvIGp1c3QgbWFrZSBzdXJlIHRoZSBtYXRjaGVkIHZhbHVlIGF0IGxlYXN0IHN0YXJ0cyB3aXRoIHRoZSBzZWFyY2ggc3RyaW5nLlxuICAgICAgLy8gaXQncyBleHRyYSB3ZWlyZCBiZWNhdXNlIGZvciBhIHRleHQgb2YgXCJhbmFseXRpY3NcIiBhbmQgYSBzZWFyY2ggc3RyaW5nIG9mIFwibmFseXRpY3NcIixcbiAgICAgIC8vIHRoZSBtYXRjaGVkIHZhbHVlIHdpbGwgYmUgXCJhbmFseXRpY3NcIi4gU28gd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgdGhlIG1hdGNoZWQgdmFsdWVcbiAgICAgIC8vIGluY2x1ZGVzIHRoZSBzZWFyY2ggc3RyaW5nIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgZXh0cmEgc3R1ZmYgb24gdGhlIGZyb250IG9yIHRoZSBlbmQuXG4gICAgICByZXR1cm4gbWF0Y2hlZFZhbHVlLmluY2x1ZGVzKHNlYXJjaC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9O1xuICB9XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBTdGF0ZSByZWR1Y2VyICh3aXRoIGhlbHBlcnMpIC8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rpb25TbmFwc2hvdFdpdGhBbmNlc3RvcnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICk6IE9wdGlvblNldDxPPiB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3Vwcyk7XG4gICAgY29uc3QgW3BhcmVudHNdID0gZ2V0UmVsYXRpb25zaGlwTWFwcyh0b3BMZXZlbE9wdGlvbnMpO1xuXG4gICAgLy8gU2libGluZyBsZWF2ZXMgc2hhcmUgYW5jZXN0b3JzLCBzbyBvbmNlIHdlJ3ZlIHdhbGtlZCB1cCB0aHJvdWdoIGFcbiAgICAvLyBnaXZlbiBwYXJlbnQgaWQgd2UgY2FuIHN0b3Ag4oCUIGFueXRoaW5nIGFib3ZlIGl0IGhhcyBhbHJlYWR5IGJlZW5cbiAgICAvLyBhZGRlZCBieSBhIHByZXZpb3VzIGl0ZXJhdGlvbi4gV2l0aG91dCB0aGlzIHNob3J0LWNpcmN1aXQgdGhlIGxvb3BcbiAgICAvLyByZS1ydW5zIGZpbmRPcHRpb24gKHdoaWNoIGlzIGEgZnVsbCB0cmVlIHdhbGspIG9uY2UgcGVyIHNoYXJlZFxuICAgIC8vIGFuY2VzdG9yIGVkZ2UsIHdoaWNoIHdhcyB0aGUgIzIgaG90c3BvdCBiZWhpbmQgT3B0aW9uU2V0LmFkZCBpblxuICAgIC8vIFJWVC0yNTQ3MCdzIHByb2ZpbGUuXG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8T1snaWQnXT4oKTtcbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkT3B0aW9uIG9mIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCkge1xuICAgICAgbGV0IHBhcmVudElkID0gcGFyZW50cy5nZXQoc2VsZWN0ZWRPcHRpb24uaWQpO1xuICAgICAgd2hpbGUgKHBhcmVudElkICE9PSB1bmRlZmluZWQgJiYgIXZpc2l0ZWQuaGFzKHBhcmVudElkKSkge1xuICAgICAgICB2aXNpdGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICAgIGNvbnN0IHBhcmVudE9wdGlvbiA9IGZpbmRPcHRpb24odG9wTGV2ZWxPcHRpb25zLCBwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRPcHRpb24pIHtcbiAgICAgICAgICBzbmFwc2hvdC5hZGQocGFyZW50T3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KHBhcmVudElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TGltaXRNZXNzYWdlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBkaXNwbGF5ZWRPcHRpb25Db3VudDogbnVtYmVyLFxuICAgIHRvdGFsT3B0aW9uQ291bnQ6IG51bWJlcixcbiAgICBxdWVyeTogQ29yZVN0YXRlPE8+WydxdWVyeSddLFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoZGlzcGxheWVkT3B0aW9uQ291bnQgPT09IHRvdGFsT3B0aW9uQ291bnQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJpdk51bWJlciA9IG5ldyBOdW1iZXJQaXBlKCk7XG4gICAgY29uc3QgZGlzcGxheWVkID0gcml2TnVtYmVyLnRyYW5zZm9ybShkaXNwbGF5ZWRPcHRpb25Db3VudCk7XG4gICAgY29uc3QgdG90YWwgPSByaXZOdW1iZXIudHJhbnNmb3JtKHRvdGFsT3B0aW9uQ291bnQpO1xuICAgIGNvbnN0IHN0YXJ0ID0gYFNob3dpbmcgJHtkaXNwbGF5ZWR9IG9mICR7dG90YWx9IG9wdGlvbnNgO1xuICAgIHJldHVybiBxdWVyeS5zZWFyY2ggPyBgJHtzdGFydH0gbWF0Y2hpbmcgXCIke3F1ZXJ5LnNlYXJjaH1cImAgOiBzdGFydDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvdW50VmlzaWJsZU9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgbGVhZk9ubHk6IGJvb2xlYW4sXG4gICk6IG51bWJlciB7XG4gICAgZnVuY3Rpb24gY291bnQob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnJlZHVjZSgoYWNjLCBvcHRpb24pID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5leHBhbmRlZCAmJiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBhY2MgKyAobGVhZk9ubHkgPyAwIDogMSkgKyBjb3VudChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2MgKyAxO1xuICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2UoXG4gICAgICAodG90YWwsIGdyb3VwKSA9PiB0b3RhbCArIGNvdW50KGdyb3VwLm9wdGlvbnMpLFxuICAgICAgMCxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY291bnRBbGxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICApOiBudW1iZXIge1xuICAgIGZ1bmN0aW9uIGNvdW50KG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5yZWR1Y2UoKGFjYywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBhY2MgKyAxICsgY291bnQob3B0aW9uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjICsgMTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25Hcm91cHMucmVkdWNlKFxuICAgICAgKHRvdGFsLCBncm91cCkgPT4gdG90YWwgKyBjb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgIDAsXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5RGlzcGxheUxpbWl0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIGRpc3BsYXlMaW1pdDogbnVtYmVyLFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgdHlwZSBEaXNwbGF5TGltaXRPcHRpb25zID0gW0Z1bGxPcHRpb248Tz5bXSwgbnVtYmVyXTtcbiAgICBmdW5jdGlvbiBmaWx0ZXJXaXRoTGltaXQoXG4gICAgICBvcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgICByZW1haW5pbmc6IG51bWJlcixcbiAgICApOiBEaXNwbGF5TGltaXRPcHRpb25zIHtcbiAgICAgIGxldCBsZWZ0ID0gcmVtYWluaW5nO1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhaztcblxuICAgICAgICBpZiAob3B0aW9uLmV4cGFuZGVkICYmIG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW2NoaWxkT3B0aW9ucywgY2hpbGRSZW1haW5pbmddID0gZmlsdGVyV2l0aExpbWl0KFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLFxuICAgICAgICAgICAgbGVmdCAtIDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZE9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGVmdCA9IGNoaWxkUmVtYWluaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpc2libGVPcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgICAgICBsZWZ0LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbdmlzaWJsZU9wdGlvbnMsIGxlZnRdO1xuICAgIH1cblxuICAgIHR5cGUgRGlzcGxheUxpbWl0R3JvdXBzID0gW0Z1bGxPcHRpb25Hcm91cDxPPltdLCBudW1iZXJdO1xuICAgIGNvbnN0IHN0YXJ0aW5nVmFsdWU6IERpc3BsYXlMaW1pdEdyb3VwcyA9IFtbXSwgZGlzcGxheUxpbWl0XTtcbiAgICBjb25zdCBbcmVzb2x2ZWRHcm91cHNdID0gb3B0aW9uR3JvdXBzLnJlZHVjZTxEaXNwbGF5TGltaXRHcm91cHM+KFxuICAgICAgKFtncm91cHMsIHJlbWFpbmluZ10sIGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IFtvcHRpb25zLCBsZWZ0QWZ0ZXJdID0gZmlsdGVyV2l0aExpbWl0KGdyb3VwLm9wdGlvbnMsIHJlbWFpbmluZyk7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBbWy4uLmdyb3VwcywgeyAuLi5ncm91cCwgb3B0aW9ucyB9XSwgbGVmdEFmdGVyXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW2dyb3VwcywgcmVtYWluaW5nXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0YXJ0aW5nVmFsdWUsXG4gICAgKTtcblxuICAgIHJldHVybiByZXNvbHZlZEdyb3VwcztcbiAgfVxuXG4gIC8qXG4gICAgU29ydCBvcHRpb25zIHNvIHRoYXQgcHJldmlvdXNseSBzZWxlY3RlZCBvcHRpb25zIChmcm9tIHByaW9yIHNlc3Npb25zKVxuICAgIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZWlyIHBlZXIvc2libGluZyBsaXN0cy5cbiAgKi9cbiAgZnVuY3Rpb24gc29ydE9wdGlvbnNCeVByZXZpb3VzbHlTZWxlY3RlZFN0YXRlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIHNlbGVjdGlvbkF0T3BlbjogT3B0aW9uU2V0PE8+LFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgZnVuY3Rpb24gc29ydE9wdGlvbnMob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogRnVsbE9wdGlvbjxPPltdIHtcbiAgICAgIHJldHVybiBzb3J0Qnkob3B0aW9ucywgb3B0aW9uID0+ICFzZWxlY3Rpb25BdE9wZW4uaGFzKG9wdGlvbikpLm1hcChcbiAgICAgICAgb3B0aW9uID0+IHtcbiAgICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBzb3J0T3B0aW9ucyhvcHRpb24uY2hpbGRyZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIG9wdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgIC4uLmdyb3VwLFxuICAgICAgb3B0aW9uczogc29ydE9wdGlvbnMoZ3JvdXAub3B0aW9ucyksXG4gICAgfSkpO1xuICB9XG5cbiAgLypcbiAgICBJZiB3ZSBhcmUgcmVzdHJpY3RpbmcgaG93IG1hbnkgb3B0aW9ucyBhcmUgc2VsZWN0ZWQgdG8gYSBzcGVjaWZpYyBsaW1pdCxcbiAgICAgIHdoZW4gd2UgYXJlIGF0IHRoYXQgbGltaXQsIGRpc2FibGUgYWxsIG9wdGlvbnMgbm90IGN1cnJlbnRseSBzZWxlY3RlZC5cbiAgKi9cbiAgZnVuY3Rpb24gYXBwbHlTZWxlY3RlZE9wdGlvbkxpbWl0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgaWYgKG9wdGlvbnM/LnNlbGVjdGVkT3B0aW9uTGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbkdyb3VwcztcbiAgICB9XG5cbiAgICAvLyBXaGVuIHVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkgaXMgdHJ1ZSBhbmQgc2VhcmNoIGlzIGFjdGl2ZSwgY291bnRcbiAgICAvLyBzZWxlY3RlZCB0b3AtbGV2ZWwgb3B0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCAodW5maWx0ZXJlZCkgZGF0YSB0byBlbnN1cmVcbiAgICAvLyBhbHJlYWR5LXNlbGVjdGVkIG9wdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIGFyZSBzdGlsbCBjb3VudGVkLlxuICAgIGNvbnN0IHVzZU9yaWdpbmFsRm9yQ291bnRpbmcgPVxuICAgICAgb3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSAmJlxuICAgICAgc3RhdGUucXVlcnkuc2VhcmNoICYmXG4gICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgdG9wT3B0aW9uc0ZvckNvdW50aW5nID0gdXNlT3JpZ2luYWxGb3JDb3VudGluZ1xuICAgICAgPyBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLm1hcChvcHRpb24gPT5cbiAgICAgICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHN0YXRlLCBvcHRpb24sIG9wdGlvbnMpLFxuICAgICAgICApXG4gICAgICA6IHRvcExldmVsT3B0aW9ucztcblxuICAgIGNvbnN0IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucyA9IHRvcE9wdGlvbnNGb3JDb3VudGluZy5maWx0ZXIoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWRPcHRpb25zOiBudW1iZXIgPSBvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5XG4gICAgICA/IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucy5sZW5ndGhcbiAgICAgIDogc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLnNpemU7XG5cbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbkxpbWl0OiBudW1iZXIgPSBvcHRpb25zLnNlbGVjdGVkT3B0aW9uTGltaXQ7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGxlc3MgaXRlbXMgc2VsZWN0ZWQgdGhhbiB0aGUgbGltaXQsIGJ1c2luZXNzIGFzIHVzdWFsLlxuICAgIGlmIChudW1TZWxlY3RlZE9wdGlvbnMgPCBzZWxlY3RlZE9wdGlvbkxpbWl0KSB7XG4gICAgICByZXR1cm4gb3B0aW9uR3JvdXBzO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZXF1YWwgaXRlbXMgc2VsZWN0ZWQgdG8gdGhlIGxpbWl0IChvciBtb3JlKSwgcHJldmVudCB1c2VycyBmcm9tIHNlbGVjdGluZyBtb3JlIG9wdGlvbnMuXG4gICAgZnVuY3Rpb24gZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhcbiAgICAgIGN1cnJlbnRPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgICBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA6IGJvb2xlYW4sXG4gICAgKTogRnVsbE9wdGlvbjxPPltdIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtczogRnVsbE9wdGlvbjxPPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBjdXJyZW50T3B0aW9ucykge1xuICAgICAgICBjb25zdCBpc0Rpc2FibGVkT3JVbnNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICAhIW9wdGlvbi5kaXNhYmxlZCB8fCAob3B0aW9uLnNlbGVjdGFibGUgJiYgb3B0aW9uLnNlbGVjdGVkID09IGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpc0N1cnJlbnRPcHRpb25TZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGFibGUgJiYgb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc0N1cnJlbnRPclBhcmVudE9wdGlvblNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICBpc0N1cnJlbnRPcHRpb25TZWxlY3RlZCB8fCBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA7XG5cbiAgICAgICAgY29uc3QgZm9yY2VFbmFibGVkQmFzZWRPblBhcmVudDogYm9vbGVhbiA9XG4gICAgICAgICAgISFvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5ICYmXG4gICAgICAgICAgb3B0aW9uc0FyZUNoaWxkcmVuT2ZTZWxlY3RlZEdyb3VwO1xuICAgICAgICBjb25zdCBtYXJrRGlzYWJsZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgIGlzRGlzYWJsZWRPclVuc2VsZWN0ZWQgJiYgIWZvcmNlRW5hYmxlZEJhc2VkT25QYXJlbnQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRPcHRpb25zID0gZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbixcbiAgICAgICAgICAgIGlzQ3VycmVudE9yUGFyZW50T3B0aW9uU2VsZWN0ZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVkSXRlbXMucHVzaCh7XG4gICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICBkaXNhYmxlZDogISFtYXJrRGlzYWJsZWQsXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRPcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwZGF0ZWRJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGRpc2FibGVkOiAhIW1hcmtEaXNhYmxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZWRJdGVtcztcbiAgICB9XG5cbiAgICBjb25zdCBncm91cHNBZnRlckxpbWl0OiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY3VycmVudEdyb3VwIG9mIG9wdGlvbkdyb3Vwcykge1xuICAgICAgZ3JvdXBzQWZ0ZXJMaW1pdC5wdXNoKHtcbiAgICAgICAgLi4uY3VycmVudEdyb3VwLFxuICAgICAgICBvcHRpb25zOiBkaXNhYmxlVW5zZWxlY3RlZEl0ZW1zKGN1cnJlbnRHcm91cC5vcHRpb25zLCBmYWxzZSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBzQWZ0ZXJMaW1pdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJlbGF0aW9uc2hpcE1hcHM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbnM6IE9wdGlvbjxPPltdLFxuICApOiBbTWFwPE9bJ2lkJ10sIE9bJ2lkJ10+LCBNYXA8T1snaWQnXSwgT1snaWQnXVtdPl0ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gYnVpbGRQYXJlbnRzTWFwKG9wdGlvbnM6IE9wdGlvbjxPPltdLCBwYXJlbnQ/OiBPcHRpb248Tz4pOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIHBhcmVudHMuc2V0KG9wdGlvbi5pZCwgcGFyZW50LmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBidWlsZFBhcmVudHNNYXAob3B0aW9uLmNoaWxkcmVuLCBvcHRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJ1aWxkUGFyZW50c01hcChvcHRpb25zKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5NYXAob3B0aW9uczogT3B0aW9uPE8+W10pOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY2hpbGRyZW4uc2V0KFxuICAgICAgICAgICAgb3B0aW9uLmlkLFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLm1hcCgoeyBpZCB9KSA9PiBpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBidWlsZENoaWxkcmVuTWFwKG9wdGlvbi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYnVpbGRDaGlsZHJlbk1hcChvcHRpb25zKTtcblxuICAgIHJldHVybiBbcGFyZW50cywgY2hpbGRyZW5dO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICApOiBGdWxsT3B0aW9uPE8+W107XG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdLFxuICApOiBTb3VyY2VPcHRpb248Tz5bXTtcbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IE9wdGlvbkdyb3VwPE8+W10sXG4gICk6IE9wdGlvbjxPPltdO1xuICBmdW5jdGlvbiBnZXRUb3BMZXZlbE9wdGlvbnM8XG4gICAgTyBleHRlbmRzIEJhc2VPcHRpb24sXG4gICAgRyBleHRlbmRzIHsgb3B0aW9uczogcmVhZG9ubHkgVFtdIH0sXG4gICAgVCA9IEcgZXh0ZW5kcyBGdWxsT3B0aW9uR3JvdXA8Tz5cbiAgICAgID8gRnVsbE9wdGlvbjxPPlxuICAgICAgOiBHIGV4dGVuZHMgU291cmNlT3B0aW9uR3JvdXA8Tz5cbiAgICAgID8gU291cmNlT3B0aW9uPE8+XG4gICAgICA6IE9wdGlvbjxPPixcbiAgPihvcHRpb25Hcm91cHM6IEdbXSk6IFRbXSB7XG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2U8VFtdPihcbiAgICAgIChvcHRpb25zLCBncm91cCkgPT4gWy4uLm9wdGlvbnMsIC4uLmdyb3VwLm9wdGlvbnNdLFxuICAgICAgW10sXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIGNoaWxkcmVuOiBGdWxsT3B0aW9uPE8+W10sXG4gICk6IE11bHRpU2VsZWN0aW9uU3RhdGUge1xuICAgIGlmIChjaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBjaGlsZC5zZWxlY3RlZCA9PT0gdHJ1ZSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChjaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBjaGlsZC5zZWxlY3RlZCA9PT0gZmFsc2UpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICdpbmRldGVybWluYXRlJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgb3B0aW9uOiBTb3VyY2VPcHRpb248Tz4sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogRnVsbE9wdGlvbjxPPiB7XG4gICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhdWdtZW50ZWRDaGlsZHJlbiA9IG9wdGlvbi5jaGlsZHJlbi5tYXAoY2hpbGQgPT5cbiAgICAgICAgYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbihzdGF0ZSwgY2hpbGQsIG1hbmFnZXJPcHRpb25zKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZWxlY3RhYmxlV2hlblNlYXJjaGluZyA9XG4gICAgICAgIG1hbmFnZXJPcHRpb25zPy5hbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2ggPz8gZmFsc2U7XG5cbiAgICAgIC8vIFdoZW4gYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoIGlzIGVuYWJsZWQgYW5kIHNlYXJjaCBpcyBhY3RpdmUsXG4gICAgICAvLyBjYWxjdWxhdGUgc2VsZWN0aW9uIHN0YXRlIGZyb20gQUxMIG9yaWdpbmFsIGNoaWxkcmVuLCBub3QganVzdCB0aGVcbiAgICAgIC8vIGZpbHRlcmVkIG9uZXMgdmlzaWJsZSBpbiBzZWFyY2ggcmVzdWx0cy5cbiAgICAgIGNvbnN0IHVzZU9yaWdpbmFsRm9yU2VsZWN0aW9uU3RhdGUgPVxuICAgICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoICYmXG4gICAgICAgIHN0YXRlLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgICBsZXQgc2VsZWN0ZWQ6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgICBpZiAodXNlT3JpZ2luYWxGb3JTZWxlY3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE9wdGlvbiA9IGZpbmRPcHRpb24oXG4gICAgICAgICAgZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzKSxcbiAgICAgICAgICBvcHRpb24uaWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcmlnaW5hbE9wdGlvbikge1xuICAgICAgICAgIGNvbnN0IGFsbExlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFtvcmlnaW5hbE9wdGlvbl0sIHRydWUpO1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBhbGxMZWF2ZXMuZmlsdGVyKGxlYWYgPT5cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMobGVhZiksXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50ID09PSBhbGxMZWF2ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gJ2luZGV0ZXJtaW5hdGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RlZCA9IGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUoYXVnbWVudGVkQ2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZCA9IGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUoYXVnbWVudGVkQ2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgIGNoaWxkcmVuOiBhdWdtZW50ZWRDaGlsZHJlbixcbiAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIGV4cGFuZGVkOiBzdGF0ZS5xdWVyeS5zZWFyY2hcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IHN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zLmhhcyhvcHRpb24uaWQpLFxuICAgICAgICBzZWxlY3RhYmxlOiAhc3RhdGUucXVlcnkuc2VhcmNoIHx8IHNlbGVjdGFibGVXaGVuU2VhcmNoaW5nLFxuICAgICAgICBleHBhbmRhYmxlOiAhc3RhdGUucXVlcnkuc2VhcmNoLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbixcbiAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZDogc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLmhhcyhvcHRpb24pLFxuICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgIGV4cGFuZGFibGU6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICB0b3BMZXZlbE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IHN0cmluZyB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIGN1c3RvbSBkaXNwbGF5IGZ1bmN0aW9uLCB1c2UgaXRcbiAgICBpZiAob3B0aW9ucz8uZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheShbLi4uc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkXSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5KSB7XG4gICAgICByZXR1cm4gZ2V0VG9wTGV2ZWxGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheSh0b3BMZXZlbE9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgZGVmYXVsdCBkaXNwbGF5IGZvciBvcHRpb25zIC0gdGl0bGVzIHNlcGFyYXRlZCBieSBjb21tYXMuXG4gICAgcmV0dXJuIFsuLi5zdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWRdLm1hcCgoeyB0aXRsZSB9KSA9PiB0aXRsZSkuam9pbignLCAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvcExldmVsRm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICApOiBzdHJpbmcge1xuICAgIGlmICghdG9wTGV2ZWxPcHRpb25zIHx8IHRvcExldmVsT3B0aW9ucy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BMZXZlbE9wdGlvbnMuZmlsdGVyKFxuICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZSxcbiAgICApO1xuICAgIHJldHVybiBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnNcbiAgICAgIC5tYXAoKHsgdGl0bGUgfSkgPT4gdGl0bGUpXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBpbGxDb3VudEZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBudW1iZXIge1xuICAgIGlmIChvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BMZXZlbE9wdGlvbnMuZmlsdGVyKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLnNpemU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRaZXJvU3RhdGVNZXNzYWdlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzLmV2ZXJ5KGdyb3VwID0+IGdyb3VwLm9wdGlvbnMubGVuZ3RoID09PSAwKSkge1xuICAgICAgaWYgKHN0YXRlLnF1ZXJ5LnNlYXJjaCkgcmV0dXJuICdObyByZXN1bHRzIGZvdW5kLic7XG4gICAgICByZXR1cm4gJ05vIG9wdGlvbnMuJztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kT3B0aW9uPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25zOiBTb3VyY2VPcHRpb248Tz5bXSxcbiAgICBpZDogT1snaWQnXSxcbiAgKTogU291cmNlT3B0aW9uPE8+IHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbi5pZCA9PT0gaWQpIHJldHVybiBvcHRpb247XG4gICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBmaW5kT3B0aW9uKG9wdGlvbi5jaGlsZHJlbiwgaWQpO1xuICAgICAgICBpZiAoY2hpbGQpIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBmbGF0dGVuT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uczogT3B0aW9uPE8+W10sXG4gICAgbGVhZk9ubHk6IGJvb2xlYW4sXG4gICk6IE9bXSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5EZWVwKFxuICAgICAgb3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSBvcHRpb24uY2hpbGRyZW4ubWFwKGNoaWxkID0+XG4gICAgICAgICAgICBmbGF0dGVuT3B0aW9ucyhbY2hpbGRdLCBsZWFmT25seSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbGVhZk9ubHkgPyBkZXNjZW5kYW50cyA6IFtvcHRpb24sIC4uLmRlc2NlbmRhbnRzXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVTZWxlY3RlZDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgICBtYW5hZ2VyT3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IG9wdGlvbiA9IGZpbmRPcHRpb24odG9wTGV2ZWxPcHRpb25zLCBpZCk7XG4gICAgaWYgKCFvcHRpb24pIHJldHVybiBzdGF0ZTtcblxuICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IG5ldyBPcHRpb25TZXQoc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkKTtcblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gIShcbiAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24oc3RhdGUsIG9wdGlvbiwgbWFuYWdlck9wdGlvbnMpLnNlbGVjdGVkID09PSB0cnVlXG4gICAgKTtcblxuICAgIC8vIFdoZW4gYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoIGlzIGVuYWJsZWQgYW5kIHNlYXJjaCBpcyBhY3RpdmUsXG4gICAgLy8gdXNlIHRoZSBvcmlnaW5hbCAodW5maWx0ZXJlZCkgZGF0YSB0byBnZXQgYWxsIGNoaWxkcmVuLCBub3QganVzdFxuICAgIC8vIHRob3NlIHZpc2libGUgaW4gdGhlIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzLlxuICAgIGNvbnN0IHVzZU9yaWdpbmFsRGF0YSA9XG4gICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoICYmXG4gICAgICBzdGF0ZS5xdWVyeS5zZWFyY2ggJiZcbiAgICAgIHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBvcHRpb25Gb3JMZWF2ZXMgPSB1c2VPcmlnaW5hbERhdGFcbiAgICAgID8gZmluZE9wdGlvbihnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLCBpZCkgPz8gb3B0aW9uXG4gICAgICA6IG9wdGlvbjtcblxuICAgIGNvbnN0IGxlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFtvcHRpb25Gb3JMZWF2ZXNdLCB0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgbGVhdmVzKSB7XG4gICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgbmV3U2VsZWN0aW9uLmFkZChsZWFmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUobGVhZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZWxlY3RlZE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKTtcbiAgICBjb25zdCBvcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgaWQpO1xuICAgIGlmICghb3B0aW9uKSByZXR1cm4gc3RhdGU7XG5cbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0PE8+KCk7XG4gICAgbmV3U2VsZWN0aW9uLmFkZChvcHRpb24pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVWaXNpYmxlU2VsZWN0ZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgbGVhdmVzID0gZmxhdHRlbk9wdGlvbnMoXG4gICAgICBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgICBjb25zdCBpc0FsbFNlbGVjdGVkID0gbGVhdmVzLmV2ZXJ5KGxlYWYgPT5cbiAgICAgIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMobGVhZiksXG4gICAgKTtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG5cbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgbGVhdmVzKSB7XG4gICAgICBpZiAoaXNBbGxTZWxlY3RlZCkgbmV3U2VsZWN0aW9uLmRlbGV0ZShsZWFmKTtcbiAgICAgIGVsc2UgbmV3U2VsZWN0aW9uLmFkZChsZWFmKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgLi4uc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZDogbmV3U2VsZWN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlT3B0aW9uRXhwYW5kZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSAhc3RhdGUuZGlzcGxheS5leHBhbmRlZE9wdGlvbnMuaGFzKGlkKTtcbiAgICBjb25zdCBuZXdFeHBhbmRlZE9wdGlvbnMgPSBuZXcgU2V0KHN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zKTtcbiAgICBpZiAobmV3VmFsdWUpIG5ld0V4cGFuZGVkT3B0aW9ucy5hZGQoaWQpO1xuICAgIGVsc2UgbmV3RXhwYW5kZWRPcHRpb25zLmRlbGV0ZShpZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBleHBhbmRlZE9wdGlvbnM6IG5ld0V4cGFuZGVkT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZGVFZmZlY3RzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGFjdGlvbjogQWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sXG4gICAgc291cmNlOiBTb3VyY2U8Tz4sXG4gICAgaW50ZXJuYWxBY3Rpb25zOiBTdWJqZWN0PEludGVybmFsQWN0aW9uPE8+PixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBpZiAoXG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ2xvYWQnIHx8XG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ3NlYXJjaENoYW5nZScgfHxcbiAgICAgIGFjdGlvbi50eXBlID09PSAnb3JkZXJDaGFuZ2UnIHx8XG4gICAgICAoYWN0aW9uLnR5cGUgPT09ICdvcGVuQ2hhbmdlJyAmJiBhY3Rpb24ub3BlbilcbiAgICApIHtcbiAgICAgIHNvdXJjZShzdGF0ZS5xdWVyeSwgYWN0aW9uKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQuZGF0YTtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGEgPSBBcnJheS5pc0FycmF5KHJlc3VsdClcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHJlc3VsdC5vcmlnaW5hbERhdGE7XG4gICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZENvbXBsZXRlJywgZGF0YSwgb3JpZ2luYWxEYXRhIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZEVycm9yJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVkdWNlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGFjdGlvbjogQWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdsb2FkJzpcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgY2FzZSAnbG9hZENvbXBsZXRlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBsb2FkOiB7XG4gICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc291cmNlT3B0aW9uR3JvdXBzOiBhY3Rpb24uZGF0YSxcbiAgICAgICAgICBvcmlnaW5hbE9wdGlvbkdyb3VwczogYWN0aW9uLm9yaWdpbmFsRGF0YSA/PyBbXSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2xvYWRFcnJvcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgbG9hZDoge1xuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogYWN0aW9uLmVycm9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdvcGVuQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGlzcGxheToge1xuICAgICAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgICAgIG9wZW46IGFjdGlvbi5vcGVuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdzZWFyY2hDaGFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaDogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ29yZGVyQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBvcmRlcjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3NlbGVjdGlvbkNoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgc2VsZWN0aW9uOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3RvZ2dsZU9wdGlvblNlbGVjdGVkJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZVNlbGVjdGVkKHN0YXRlLCBhY3Rpb24uaWQsIG1hbmFnZXJPcHRpb25zKTtcbiAgICAgIGNhc2UgJ3NldFNlbGVjdGVkT3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHNldFNlbGVjdGVkT3B0aW9uKHN0YXRlLCBhY3Rpb24uaWQpO1xuICAgICAgY2FzZSAndmlzaWJsZVNlbGVjdGVkQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZVZpc2libGVTZWxlY3RlZChzdGF0ZSk7XG4gICAgICBjYXNlICd0b2dnbGVPcHRpb25FeHBhbmRlZCc6XG4gICAgICAgIHJldHVybiB0b2dnbGVPcHRpb25FeHBhbmRlZChzdGF0ZSwgYWN0aW9uLmlkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==