@fundamental-ngx/core 0.45.1 → 0.46.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/busy-indicator/busy-indicator-extended/busy-indicator-extended.directive.d.ts +1 -1
  2. package/busy-indicator/busy-indicator.component.d.ts +2 -2
  3. package/busy-indicator/busy-indicator.module.d.ts +4 -4
  4. package/calendar/calendar-directives.d.ts +1 -1
  5. package/calendar/calendar-header/calendar-header.component.d.ts +2 -6
  6. package/calendar/calendar-views/calendar-aggregated-year-view/calendar-aggregated-year-view.component.d.ts +1 -1
  7. package/calendar/calendar-views/calendar-day-view/calendar-day-view.component.d.ts +27 -32
  8. package/calendar/calendar-views/calendar-month-view/calendar-month-view.component.d.ts +1 -1
  9. package/calendar/calendar-views/calendar-year-view/calendar-year-view.component.d.ts +1 -1
  10. package/calendar/calendar.component.d.ts +7 -8
  11. package/calendar/calendar.module.d.ts +2 -5
  12. package/carousel/carousel-item/carousel-item.component.d.ts +1 -1
  13. package/carousel/carousel-item.directive.d.ts +1 -1
  14. package/carousel/carousel.component.d.ts +8 -1
  15. package/carousel/carousel.directive.d.ts +1 -1
  16. package/carousel/carousel.module.d.ts +1 -5
  17. package/checkbox/checkbox/checkbox.component.d.ts +19 -6
  18. package/checkbox/checkbox.module.d.ts +3 -5
  19. package/combobox/combobox-mobile/combobox-mobile.component.d.ts +2 -1
  20. package/date-picker/date-picker-mobile/date-picker-mobile.component.d.ts +31 -0
  21. package/date-picker/date-picker.component.d.ts +46 -16
  22. package/date-picker/date-picker.model.d.ts +11 -0
  23. package/date-picker/date-picker.module.d.ts +2 -12
  24. package/date-picker/index.d.ts +2 -0
  25. package/date-picker/tokens.d.ts +5 -0
  26. package/datetime-picker/datetime-picker-mobile/datetime-picker-mobile.component.d.ts +29 -0
  27. package/datetime-picker/datetime-picker.component.d.ts +34 -12
  28. package/datetime-picker/datetime-picker.model.d.ts +9 -0
  29. package/datetime-picker/datetime-picker.module.d.ts +2 -14
  30. package/datetime-picker/index.d.ts +2 -0
  31. package/datetime-picker/tokens.d.ts +5 -0
  32. package/dialog/dialog.module.d.ts +1 -1
  33. package/dialog/utils/dialog-ref.class.d.ts +15 -5
  34. package/esm2022/action-bar/action-bar.component.mjs +2 -2
  35. package/esm2022/action-sheet/action-sheet.component.mjs +2 -2
  36. package/esm2022/avatar/avatar.component.mjs +2 -2
  37. package/esm2022/avatar-group/avatar-group.component.mjs +2 -2
  38. package/esm2022/bar/bar.component.mjs +2 -2
  39. package/esm2022/breadcrumb/breadcrumb.component.mjs +2 -2
  40. package/esm2022/busy-indicator/busy-indicator-extended/busy-indicator-extended.directive.mjs +4 -3
  41. package/esm2022/busy-indicator/busy-indicator.component.mjs +5 -5
  42. package/esm2022/busy-indicator/busy-indicator.module.mjs +3 -4
  43. package/esm2022/button/button.component.mjs +2 -2
  44. package/esm2022/calendar/calendar-directives.mjs +4 -3
  45. package/esm2022/calendar/calendar-header/calendar-header.component.mjs +7 -15
  46. package/esm2022/calendar/calendar-views/calendar-aggregated-year-view/calendar-aggregated-year-view.component.mjs +6 -5
  47. package/esm2022/calendar/calendar-views/calendar-day-view/calendar-day-view.component.mjs +21 -30
  48. package/esm2022/calendar/calendar-views/calendar-month-view/calendar-month-view.component.mjs +6 -5
  49. package/esm2022/calendar/calendar-views/calendar-year-view/calendar-year-view.component.mjs +6 -5
  50. package/esm2022/calendar/calendar.component.mjs +17 -13
  51. package/esm2022/calendar/calendar.module.mjs +9 -9
  52. package/esm2022/card/card-footer.component.mjs +3 -3
  53. package/esm2022/card/card.component.mjs +2 -2
  54. package/esm2022/carousel/carousel-item/carousel-item.component.mjs +4 -4
  55. package/esm2022/carousel/carousel-item.directive.mjs +4 -3
  56. package/esm2022/carousel/carousel.component.mjs +19 -6
  57. package/esm2022/carousel/carousel.directive.mjs +4 -3
  58. package/esm2022/carousel/carousel.module.mjs +4 -9
  59. package/esm2022/checkbox/checkbox/checkbox.component.mjs +42 -17
  60. package/esm2022/checkbox/checkbox.module.mjs +4 -7
  61. package/esm2022/combobox/combobox-mobile/combobox-mobile.component.mjs +3 -2
  62. package/esm2022/date-picker/date-picker-mobile/date-picker-mobile.component.mjs +96 -0
  63. package/esm2022/date-picker/date-picker.component.mjs +142 -40
  64. package/esm2022/date-picker/date-picker.model.mjs +2 -0
  65. package/esm2022/date-picker/date-picker.module.mjs +6 -49
  66. package/esm2022/date-picker/index.mjs +3 -1
  67. package/esm2022/date-picker/tokens.mjs +4 -0
  68. package/esm2022/datetime-picker/datetime-picker-mobile/datetime-picker-mobile.component.mjs +96 -0
  69. package/esm2022/datetime-picker/datetime-picker.component.mjs +120 -36
  70. package/esm2022/datetime-picker/datetime-picker.model.mjs +2 -0
  71. package/esm2022/datetime-picker/datetime-picker.module.mjs +6 -57
  72. package/esm2022/datetime-picker/index.mjs +3 -1
  73. package/esm2022/datetime-picker/tokens.mjs +4 -0
  74. package/esm2022/dialog/dialog-body/dialog-body.component.mjs +4 -3
  75. package/esm2022/dialog/dialog.component.mjs +2 -2
  76. package/esm2022/dialog/dialog.module.mjs +8 -5
  77. package/esm2022/dialog/utils/dialog-ref.class.mjs +13 -8
  78. package/esm2022/dynamic-page/dynamic-page-header/actions/dynamic-page-title-content.component.mjs +1 -1
  79. package/esm2022/dynamic-page/dynamic-page.component.mjs +2 -2
  80. package/esm2022/dynamic-side-content/dynamic-side-content.component.mjs +2 -2
  81. package/esm2022/facets/facet/facet.component.mjs +2 -2
  82. package/esm2022/feed-input/feed-input.component.mjs +2 -2
  83. package/esm2022/feed-list-item/components/list/feed-list.component.mjs +2 -2
  84. package/esm2022/file-uploader/file-uploader.component.mjs +2 -2
  85. package/esm2022/fixed-card-layout/fixed-card-layout.component.mjs +2 -2
  86. package/esm2022/flexible-column-layout/flexible-column-layout.component.mjs +2 -2
  87. package/esm2022/form/fieldset/fieldset.component.mjs +2 -2
  88. package/esm2022/form/form-control/form-control.component.mjs +2 -2
  89. package/esm2022/form/form-group/form-group.component.mjs +2 -2
  90. package/esm2022/form/form-header/form-header.component.mjs +2 -2
  91. package/esm2022/form/form-item/form-item.component.mjs +2 -2
  92. package/esm2022/form/form-label/form-label.component.mjs +2 -2
  93. package/esm2022/form/form-message/form-message.component.mjs +2 -2
  94. package/esm2022/grid-list/components/grid-list/grid-list.component.mjs +2 -2
  95. package/esm2022/grid-list/components/grid-list-filter-bar/grid-list-filter-bar.component.mjs +1 -1
  96. package/esm2022/grid-list/components/grid-list-title-bar/grid-list-title-bar.component.mjs +1 -1
  97. package/esm2022/icon/icon.component.mjs +2 -2
  98. package/esm2022/illustrated-message/illustrated-message.component.mjs +2 -2
  99. package/esm2022/info-label/info-label.component.mjs +2 -2
  100. package/esm2022/input-group/input-group.component.mjs +2 -2
  101. package/esm2022/layout-grid/layout-grid.component.mjs +2 -2
  102. package/esm2022/layout-panel/layout-panel.component.mjs +2 -2
  103. package/esm2022/link/link.component.mjs +9 -9
  104. package/esm2022/link/link.module.mjs +4 -7
  105. package/esm2022/list/directives/list-secondary.directive.mjs +21 -8
  106. package/esm2022/list/list-navigation-item/list-navigation-item.component.mjs +2 -2
  107. package/esm2022/list/list.component.mjs +2 -2
  108. package/esm2022/list/list.module.mjs +3 -5
  109. package/esm2022/menu/menu.component.mjs +2 -2
  110. package/esm2022/message-box/message-box.component.mjs +2 -2
  111. package/esm2022/message-page/message-page.component.mjs +2 -2
  112. package/esm2022/message-strip/alert/message-strip-alert/message-strip-alert.component.mjs +2 -2
  113. package/esm2022/message-strip/alert/message-strip-configuration-type.mjs +1 -1
  114. package/esm2022/message-strip/index.mjs +3 -1
  115. package/esm2022/message-strip/message-strip-icon.directive.mjs +18 -0
  116. package/esm2022/message-strip/message-strip-indication-color.mjs +7 -0
  117. package/esm2022/message-strip/message-strip.component.mjs +36 -5
  118. package/esm2022/message-strip/message-strip.module.mjs +5 -4
  119. package/esm2022/message-toast/message-toast.component.mjs +3 -3
  120. package/esm2022/micro-process-flow/components/micro-process-flow/micro-process-flow.component.mjs +2 -2
  121. package/esm2022/mobile-mode/mobile-mode.class.mjs +3 -1
  122. package/esm2022/multi-combobox/multi-combobox.component.mjs +2 -2
  123. package/esm2022/multi-combobox/select-all-toggler/select-all-toggler.component.mjs +1 -1
  124. package/esm2022/multi-input/multi-input.component.mjs +1 -1
  125. package/esm2022/notification/notification/notification.component.mjs +2 -2
  126. package/esm2022/object-identifier/object-identifier.component.mjs +2 -2
  127. package/esm2022/object-marker/object-marker.component.mjs +2 -2
  128. package/esm2022/object-number/object-number.component.mjs +2 -2
  129. package/esm2022/object-status/object-status.component.mjs +2 -2
  130. package/esm2022/pagination/pagination.component.mjs +2 -2
  131. package/esm2022/panel/panel.component.mjs +2 -2
  132. package/esm2022/popover/popover-body/popover-body-directives/popover-body-footer.directive.mjs +4 -3
  133. package/esm2022/popover/popover-body/popover-body-directives/popover-body-header.directive.mjs +4 -3
  134. package/esm2022/popover/popover-body/popover-body.component.mjs +8 -11
  135. package/esm2022/popover/popover-container/popover-container.directive.mjs +4 -3
  136. package/esm2022/popover/popover-control/popover-control.component.mjs +3 -3
  137. package/esm2022/popover/popover-mobile/popover-mobile.component.mjs +10 -7
  138. package/esm2022/popover/popover-mobile/popover-mobile.module.mjs +4 -5
  139. package/esm2022/popover/popover-trigger.directive.mjs +4 -3
  140. package/esm2022/popover/popover.component.mjs +5 -6
  141. package/esm2022/popover/popover.module.mjs +5 -10
  142. package/esm2022/product-switch/product-switch-body/product-switch-body.component.mjs +2 -2
  143. package/esm2022/progress-indicator/progress-indicator.component.mjs +2 -2
  144. package/esm2022/quick-view/quick-view/quick-view.component.mjs +2 -2
  145. package/esm2022/radio/radio-button/radio-button.component.mjs +3 -3
  146. package/esm2022/rating-indicator/components/rating-indicator.component.mjs +2 -2
  147. package/esm2022/resizable-card-layout/resizable-card-layout/resizable-card-item/resizable-card-item.component.mjs +2 -2
  148. package/esm2022/resizable-card-layout/resizable-card-layout/resizable-card-layout.component.mjs +2 -2
  149. package/esm2022/segmented-button/segmented-button.component.mjs +2 -2
  150. package/esm2022/select/select.component.mjs +2 -2
  151. package/esm2022/shared/interfaces/search-component.interface.mjs +1 -1
  152. package/esm2022/shared/interfaces/special-day-rule.mjs +1 -1
  153. package/esm2022/shellbar/product-menu/product-menu.component.mjs +12 -8
  154. package/esm2022/shellbar/shellbar-action/shellbar-action.component.mjs +8 -6
  155. package/esm2022/shellbar/shellbar-actions/shellbar-actions.component.mjs +8 -9
  156. package/esm2022/shellbar/shellbar-actions-mobile/shellbar-actions-mobile.component.mjs +9 -7
  157. package/esm2022/shellbar/shellbar-logo/shellbar-logo.component.mjs +3 -3
  158. package/esm2022/shellbar/shellbar-sidenav.directive.mjs +4 -3
  159. package/esm2022/shellbar/shellbar-subtitle/shellbar-subtitle.component.mjs +3 -3
  160. package/esm2022/shellbar/shellbar-title/shellbar-title.component.mjs +3 -3
  161. package/esm2022/shellbar/shellbar.component.mjs +10 -9
  162. package/esm2022/shellbar/shellbar.module.mjs +10 -59
  163. package/esm2022/shellbar/user-menu/shellbar-user-menu.component.mjs +9 -6
  164. package/esm2022/side-navigation/side-navigation.component.mjs +2 -2
  165. package/esm2022/skeleton/components/skeleton.component.mjs +2 -2
  166. package/esm2022/slider/slider-position.directive.mjs +19 -11
  167. package/esm2022/slider/slider.component.mjs +136 -79
  168. package/esm2022/slider/slider.model.mjs +2 -1
  169. package/esm2022/slider/slider.module.mjs +6 -6
  170. package/esm2022/split-button/split-button.component.mjs +2 -2
  171. package/esm2022/splitter/splitter.component.mjs +2 -2
  172. package/esm2022/status-indicator/status-indicator.component.mjs +2 -2
  173. package/esm2022/step-input/step-input.component.mjs +2 -2
  174. package/esm2022/switch/switch.component.mjs +2 -2
  175. package/esm2022/table/table-wrapper.component.mjs +2 -2
  176. package/esm2022/table/table.component.mjs +2 -2
  177. package/esm2022/tabs/tab-list.component.mjs +2 -2
  178. package/esm2022/tabs/tab-nav/tab-nav.component.mjs +2 -2
  179. package/esm2022/text/text.component.mjs +7 -7
  180. package/esm2022/text/text.module.mjs +4 -9
  181. package/esm2022/tile/tile.component.mjs +2 -2
  182. package/esm2022/time/time.component.mjs +2 -2
  183. package/esm2022/title/title.component.mjs +3 -3
  184. package/esm2022/title/title.module.mjs +4 -6
  185. package/esm2022/token/token.component.mjs +2 -2
  186. package/esm2022/token/tokenizer.component.mjs +2 -2
  187. package/esm2022/toolbar/deprecated-toolbar-size.directive.mjs +4 -3
  188. package/esm2022/toolbar/toolbar-form-label.directive.mjs +4 -3
  189. package/esm2022/toolbar/toolbar-item.directive.mjs +4 -3
  190. package/esm2022/toolbar/toolbar-label.directive.mjs +4 -3
  191. package/esm2022/toolbar/toolbar-overflow-button-menu.directive.mjs +4 -3
  192. package/esm2022/toolbar/toolbar-overflow-button.directive.mjs +4 -3
  193. package/esm2022/toolbar/toolbar-separator.component.mjs +4 -3
  194. package/esm2022/toolbar/toolbar-spacer.directive.mjs +4 -3
  195. package/esm2022/toolbar/toolbar.component.mjs +39 -18
  196. package/esm2022/toolbar/toolbar.module.mjs +5 -10
  197. package/esm2022/tree/components/tree-item/tree-item.component.mjs +1 -1
  198. package/esm2022/tree/tree.component.mjs +2 -2
  199. package/esm2022/upload-collection/upload-collection.component.mjs +3 -3
  200. package/esm2022/vertical-navigation/vertical-navigation-main-navigation.component.mjs +2 -2
  201. package/esm2022/vertical-navigation/vertical-navigation.component.mjs +2 -2
  202. package/esm2022/wizard/wizard.component.mjs +2 -2
  203. package/fesm2022/fundamental-ngx-core-action-bar.mjs +2 -2
  204. package/fesm2022/fundamental-ngx-core-action-bar.mjs.map +1 -1
  205. package/fesm2022/fundamental-ngx-core-action-sheet.mjs +2 -2
  206. package/fesm2022/fundamental-ngx-core-action-sheet.mjs.map +1 -1
  207. package/fesm2022/fundamental-ngx-core-avatar-group.mjs +2 -2
  208. package/fesm2022/fundamental-ngx-core-avatar-group.mjs.map +1 -1
  209. package/fesm2022/fundamental-ngx-core-avatar.mjs +2 -2
  210. package/fesm2022/fundamental-ngx-core-avatar.mjs.map +1 -1
  211. package/fesm2022/fundamental-ngx-core-bar.mjs +2 -2
  212. package/fesm2022/fundamental-ngx-core-bar.mjs.map +1 -1
  213. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs +2 -2
  214. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  215. package/fesm2022/fundamental-ngx-core-busy-indicator.mjs +9 -10
  216. package/fesm2022/fundamental-ngx-core-busy-indicator.mjs.map +1 -1
  217. package/fesm2022/fundamental-ngx-core-button.mjs +2 -2
  218. package/fesm2022/fundamental-ngx-core-button.mjs.map +1 -1
  219. package/fesm2022/fundamental-ngx-core-calendar.mjs +91 -95
  220. package/fesm2022/fundamental-ngx-core-calendar.mjs.map +1 -1
  221. package/fesm2022/fundamental-ngx-core-card.mjs +4 -4
  222. package/fesm2022/fundamental-ngx-core-card.mjs.map +1 -1
  223. package/fesm2022/fundamental-ngx-core-carousel.mjs +29 -19
  224. package/fesm2022/fundamental-ngx-core-carousel.mjs.map +1 -1
  225. package/fesm2022/fundamental-ngx-core-checkbox.mjs +43 -20
  226. package/fesm2022/fundamental-ngx-core-checkbox.mjs.map +1 -1
  227. package/fesm2022/fundamental-ngx-core-combobox.mjs +2 -1
  228. package/fesm2022/fundamental-ngx-core-combobox.mjs.map +1 -1
  229. package/fesm2022/fundamental-ngx-core-date-picker.mjs +235 -86
  230. package/fesm2022/fundamental-ngx-core-date-picker.mjs.map +1 -1
  231. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs +211 -88
  232. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
  233. package/fesm2022/fundamental-ngx-core-dialog.mjs +23 -15
  234. package/fesm2022/fundamental-ngx-core-dialog.mjs.map +1 -1
  235. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs +3 -3
  236. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs.map +1 -1
  237. package/fesm2022/fundamental-ngx-core-dynamic-side-content.mjs +2 -2
  238. package/fesm2022/fundamental-ngx-core-dynamic-side-content.mjs.map +1 -1
  239. package/fesm2022/fundamental-ngx-core-facets.mjs +2 -2
  240. package/fesm2022/fundamental-ngx-core-facets.mjs.map +1 -1
  241. package/fesm2022/fundamental-ngx-core-feed-input.mjs +2 -2
  242. package/fesm2022/fundamental-ngx-core-feed-input.mjs.map +1 -1
  243. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs +2 -2
  244. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs.map +1 -1
  245. package/fesm2022/fundamental-ngx-core-file-uploader.mjs +2 -2
  246. package/fesm2022/fundamental-ngx-core-file-uploader.mjs.map +1 -1
  247. package/fesm2022/fundamental-ngx-core-fixed-card-layout.mjs +2 -2
  248. package/fesm2022/fundamental-ngx-core-fixed-card-layout.mjs.map +1 -1
  249. package/fesm2022/fundamental-ngx-core-flexible-column-layout.mjs +2 -2
  250. package/fesm2022/fundamental-ngx-core-flexible-column-layout.mjs.map +1 -1
  251. package/fesm2022/fundamental-ngx-core-form.mjs +14 -14
  252. package/fesm2022/fundamental-ngx-core-form.mjs.map +1 -1
  253. package/fesm2022/fundamental-ngx-core-grid-list.mjs +4 -4
  254. package/fesm2022/fundamental-ngx-core-grid-list.mjs.map +1 -1
  255. package/fesm2022/fundamental-ngx-core-icon.mjs +2 -2
  256. package/fesm2022/fundamental-ngx-core-icon.mjs.map +1 -1
  257. package/fesm2022/fundamental-ngx-core-illustrated-message.mjs +2 -2
  258. package/fesm2022/fundamental-ngx-core-illustrated-message.mjs.map +1 -1
  259. package/fesm2022/fundamental-ngx-core-info-label.mjs +2 -2
  260. package/fesm2022/fundamental-ngx-core-info-label.mjs.map +1 -1
  261. package/fesm2022/fundamental-ngx-core-input-group.mjs +2 -2
  262. package/fesm2022/fundamental-ngx-core-input-group.mjs.map +1 -1
  263. package/fesm2022/fundamental-ngx-core-layout-grid.mjs +2 -2
  264. package/fesm2022/fundamental-ngx-core-layout-grid.mjs.map +1 -1
  265. package/fesm2022/fundamental-ngx-core-layout-panel.mjs +2 -2
  266. package/fesm2022/fundamental-ngx-core-layout-panel.mjs.map +1 -1
  267. package/fesm2022/fundamental-ngx-core-link.mjs +10 -12
  268. package/fesm2022/fundamental-ngx-core-link.mjs.map +1 -1
  269. package/fesm2022/fundamental-ngx-core-list.mjs +26 -17
  270. package/fesm2022/fundamental-ngx-core-list.mjs.map +1 -1
  271. package/fesm2022/fundamental-ngx-core-menu.mjs +2 -2
  272. package/fesm2022/fundamental-ngx-core-menu.mjs.map +1 -1
  273. package/fesm2022/fundamental-ngx-core-message-box.mjs +2 -2
  274. package/fesm2022/fundamental-ngx-core-message-box.mjs.map +1 -1
  275. package/fesm2022/fundamental-ngx-core-message-page.mjs +2 -2
  276. package/fesm2022/fundamental-ngx-core-message-page.mjs.map +1 -1
  277. package/fesm2022/fundamental-ngx-core-message-strip.mjs +62 -9
  278. package/fesm2022/fundamental-ngx-core-message-strip.mjs.map +1 -1
  279. package/fesm2022/fundamental-ngx-core-message-toast.mjs +2 -2
  280. package/fesm2022/fundamental-ngx-core-message-toast.mjs.map +1 -1
  281. package/fesm2022/fundamental-ngx-core-micro-process-flow.mjs +2 -2
  282. package/fesm2022/fundamental-ngx-core-micro-process-flow.mjs.map +1 -1
  283. package/fesm2022/fundamental-ngx-core-mobile-mode.mjs +2 -0
  284. package/fesm2022/fundamental-ngx-core-mobile-mode.mjs.map +1 -1
  285. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs +3 -3
  286. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  287. package/fesm2022/fundamental-ngx-core-multi-input.mjs +1 -1
  288. package/fesm2022/fundamental-ngx-core-multi-input.mjs.map +1 -1
  289. package/fesm2022/fundamental-ngx-core-notification.mjs +2 -2
  290. package/fesm2022/fundamental-ngx-core-notification.mjs.map +1 -1
  291. package/fesm2022/fundamental-ngx-core-object-identifier.mjs +2 -2
  292. package/fesm2022/fundamental-ngx-core-object-identifier.mjs.map +1 -1
  293. package/fesm2022/fundamental-ngx-core-object-marker.mjs +2 -2
  294. package/fesm2022/fundamental-ngx-core-object-marker.mjs.map +1 -1
  295. package/fesm2022/fundamental-ngx-core-object-number.mjs +2 -2
  296. package/fesm2022/fundamental-ngx-core-object-number.mjs.map +1 -1
  297. package/fesm2022/fundamental-ngx-core-object-status.mjs +2 -2
  298. package/fesm2022/fundamental-ngx-core-object-status.mjs.map +1 -1
  299. package/fesm2022/fundamental-ngx-core-pagination.mjs +2 -2
  300. package/fesm2022/fundamental-ngx-core-pagination.mjs.map +1 -1
  301. package/fesm2022/fundamental-ngx-core-panel.mjs +2 -2
  302. package/fesm2022/fundamental-ngx-core-panel.mjs.map +1 -1
  303. package/fesm2022/fundamental-ngx-core-popover.mjs +36 -38
  304. package/fesm2022/fundamental-ngx-core-popover.mjs.map +1 -1
  305. package/fesm2022/fundamental-ngx-core-product-switch.mjs +2 -2
  306. package/fesm2022/fundamental-ngx-core-product-switch.mjs.map +1 -1
  307. package/fesm2022/fundamental-ngx-core-progress-indicator.mjs +2 -2
  308. package/fesm2022/fundamental-ngx-core-progress-indicator.mjs.map +1 -1
  309. package/fesm2022/fundamental-ngx-core-quick-view.mjs +2 -2
  310. package/fesm2022/fundamental-ngx-core-quick-view.mjs.map +1 -1
  311. package/fesm2022/fundamental-ngx-core-radio.mjs +2 -2
  312. package/fesm2022/fundamental-ngx-core-radio.mjs.map +1 -1
  313. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs +2 -2
  314. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs.map +1 -1
  315. package/fesm2022/fundamental-ngx-core-resizable-card-layout.mjs +4 -4
  316. package/fesm2022/fundamental-ngx-core-resizable-card-layout.mjs.map +1 -1
  317. package/fesm2022/fundamental-ngx-core-segmented-button.mjs +2 -2
  318. package/fesm2022/fundamental-ngx-core-segmented-button.mjs.map +1 -1
  319. package/fesm2022/fundamental-ngx-core-select.mjs +2 -2
  320. package/fesm2022/fundamental-ngx-core-select.mjs.map +1 -1
  321. package/fesm2022/fundamental-ngx-core-shellbar.mjs +93 -132
  322. package/fesm2022/fundamental-ngx-core-shellbar.mjs.map +1 -1
  323. package/fesm2022/fundamental-ngx-core-side-navigation.mjs +2 -2
  324. package/fesm2022/fundamental-ngx-core-side-navigation.mjs.map +1 -1
  325. package/fesm2022/fundamental-ngx-core-skeleton.mjs +2 -2
  326. package/fesm2022/fundamental-ngx-core-skeleton.mjs.map +1 -1
  327. package/fesm2022/fundamental-ngx-core-slider.mjs +158 -96
  328. package/fesm2022/fundamental-ngx-core-slider.mjs.map +1 -1
  329. package/fesm2022/fundamental-ngx-core-split-button.mjs +2 -2
  330. package/fesm2022/fundamental-ngx-core-split-button.mjs.map +1 -1
  331. package/fesm2022/fundamental-ngx-core-splitter.mjs +2 -2
  332. package/fesm2022/fundamental-ngx-core-splitter.mjs.map +1 -1
  333. package/fesm2022/fundamental-ngx-core-status-indicator.mjs +2 -2
  334. package/fesm2022/fundamental-ngx-core-status-indicator.mjs.map +1 -1
  335. package/fesm2022/fundamental-ngx-core-step-input.mjs +2 -2
  336. package/fesm2022/fundamental-ngx-core-step-input.mjs.map +1 -1
  337. package/fesm2022/fundamental-ngx-core-switch.mjs +2 -2
  338. package/fesm2022/fundamental-ngx-core-switch.mjs.map +1 -1
  339. package/fesm2022/fundamental-ngx-core-table.mjs +4 -4
  340. package/fesm2022/fundamental-ngx-core-table.mjs.map +1 -1
  341. package/fesm2022/fundamental-ngx-core-tabs.mjs +4 -4
  342. package/fesm2022/fundamental-ngx-core-tabs.mjs.map +1 -1
  343. package/fesm2022/fundamental-ngx-core-text.mjs +9 -14
  344. package/fesm2022/fundamental-ngx-core-text.mjs.map +1 -1
  345. package/fesm2022/fundamental-ngx-core-tile.mjs +2 -2
  346. package/fesm2022/fundamental-ngx-core-tile.mjs.map +1 -1
  347. package/fesm2022/fundamental-ngx-core-time.mjs +2 -2
  348. package/fesm2022/fundamental-ngx-core-time.mjs.map +1 -1
  349. package/fesm2022/fundamental-ngx-core-title.mjs +5 -7
  350. package/fesm2022/fundamental-ngx-core-title.mjs.map +1 -1
  351. package/fesm2022/fundamental-ngx-core-token.mjs +4 -4
  352. package/fesm2022/fundamental-ngx-core-token.mjs.map +1 -1
  353. package/fesm2022/fundamental-ngx-core-toolbar.mjs +80 -56
  354. package/fesm2022/fundamental-ngx-core-toolbar.mjs.map +1 -1
  355. package/fesm2022/fundamental-ngx-core-tree.mjs +3 -3
  356. package/fesm2022/fundamental-ngx-core-tree.mjs.map +1 -1
  357. package/fesm2022/fundamental-ngx-core-upload-collection.mjs +2 -2
  358. package/fesm2022/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  359. package/fesm2022/fundamental-ngx-core-vertical-navigation.mjs +4 -4
  360. package/fesm2022/fundamental-ngx-core-vertical-navigation.mjs.map +1 -1
  361. package/fesm2022/fundamental-ngx-core-wizard.mjs +2 -2
  362. package/fesm2022/fundamental-ngx-core-wizard.mjs.map +1 -1
  363. package/fundamental-ngx-core-v0.46.0-rc.1.tgz +0 -0
  364. package/link/link.component.d.ts +1 -1
  365. package/link/link.module.d.ts +1 -3
  366. package/list/directives/list-secondary.directive.d.ts +16 -3
  367. package/list/list.module.d.ts +20 -20
  368. package/message-strip/alert/message-strip-configuration-type.d.ts +2 -0
  369. package/message-strip/index.d.ts +2 -0
  370. package/message-strip/message-strip-icon.directive.d.ts +9 -0
  371. package/message-strip/message-strip-indication-color.d.ts +4 -0
  372. package/message-strip/message-strip.component.d.ts +11 -1
  373. package/message-strip/message-strip.module.d.ts +2 -1
  374. package/mobile-mode/mobile-mode.class.d.ts +3 -1
  375. package/package.json +4 -4
  376. package/popover/popover-body/popover-body-directives/popover-body-footer.directive.d.ts +1 -1
  377. package/popover/popover-body/popover-body-directives/popover-body-header.directive.d.ts +1 -1
  378. package/popover/popover-body/popover-body.component.d.ts +1 -1
  379. package/popover/popover-container/popover-container.directive.d.ts +1 -1
  380. package/popover/popover-control/popover-control.component.d.ts +1 -1
  381. package/popover/popover-mobile/popover-mobile.component.d.ts +3 -3
  382. package/popover/popover-mobile/popover-mobile.module.d.ts +5 -5
  383. package/popover/popover-trigger.directive.d.ts +1 -1
  384. package/popover/popover.component.d.ts +1 -1
  385. package/popover/popover.module.d.ts +1 -5
  386. package/schematics/add-dependencies/index.js +6 -6
  387. package/shared/interfaces/search-component.interface.d.ts +1 -0
  388. package/shared/interfaces/special-day-rule.d.ts +1 -1
  389. package/shellbar/product-menu/product-menu.component.d.ts +1 -1
  390. package/shellbar/shellbar-action/shellbar-action.component.d.ts +1 -1
  391. package/shellbar/shellbar-actions/shellbar-actions.component.d.ts +1 -1
  392. package/shellbar/shellbar-actions-mobile/shellbar-actions-mobile.component.d.ts +1 -1
  393. package/shellbar/shellbar-logo/shellbar-logo.component.d.ts +1 -1
  394. package/shellbar/shellbar-sidenav.directive.d.ts +1 -1
  395. package/shellbar/shellbar-subtitle/shellbar-subtitle.component.d.ts +1 -1
  396. package/shellbar/shellbar-title/shellbar-title.component.d.ts +1 -1
  397. package/shellbar/shellbar.component.d.ts +1 -1
  398. package/shellbar/shellbar.module.d.ts +2 -14
  399. package/shellbar/user-menu/shellbar-user-menu.component.d.ts +1 -1
  400. package/slider/slider-position.directive.d.ts +6 -4
  401. package/slider/slider.component.d.ts +21 -13
  402. package/slider/slider.model.d.ts +2 -1
  403. package/slider/slider.module.d.ts +9 -9
  404. package/text/text.component.d.ts +1 -1
  405. package/text/text.module.d.ts +1 -5
  406. package/title/title.component.d.ts +1 -1
  407. package/title/title.module.d.ts +1 -2
  408. package/toolbar/deprecated-toolbar-size.directive.d.ts +1 -1
  409. package/toolbar/toolbar-form-label.directive.d.ts +1 -1
  410. package/toolbar/toolbar-item.directive.d.ts +1 -1
  411. package/toolbar/toolbar-label.directive.d.ts +1 -1
  412. package/toolbar/toolbar-overflow-button-menu.directive.d.ts +1 -1
  413. package/toolbar/toolbar-overflow-button.directive.d.ts +1 -1
  414. package/toolbar/toolbar-separator.component.d.ts +1 -1
  415. package/toolbar/toolbar-spacer.directive.d.ts +1 -1
  416. package/toolbar/toolbar.component.d.ts +9 -5
  417. package/toolbar/toolbar.module.d.ts +11 -15
  418. package/fundamental-ngx-core-v0.45.1.tgz +0 -0
@@ -1,17 +1,16 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewEncapsulation, Inject } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { takeUntil } from 'rxjs/operators';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewEncapsulation, Inject, inject, DestroyRef } from '@angular/core';
4
2
  import { DATE_TIME_FORMATS, DatetimeAdapter } from '@fundamental-ngx/core/datetime';
5
3
  import equal from 'fast-deep-equal';
6
4
  import { DateRange } from '../../models/date-range';
7
5
  import { ActiveCalendarDayCellStrategy as CalendarActiveDayCellStrategy } from '../../models/calendar-day';
8
6
  import { CalendarService } from '../../calendar.service';
9
7
  import { CalendarI18nLabels } from '../../i18n/calendar-i18n-labels';
8
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
+ import { NgIf, NgFor } from '@angular/common';
10
10
  import * as i0 from "@angular/core";
11
11
  import * as i1 from "../../calendar.service";
12
12
  import * as i2 from "@fundamental-ngx/core/datetime";
13
13
  import * as i3 from "../../i18n/calendar-i18n-labels";
14
- import * as i4 from "@angular/common";
15
14
  /** Component representing the day view of the calendar. */
16
15
  export class CalendarDayViewComponent {
17
16
  /** Currently displayed month and year for days */
@@ -76,7 +75,7 @@ export class CalendarDayViewComponent {
76
75
  this.showWeekNumbers = true;
77
76
  /**
78
77
  * Special days mark, it can be used by passing array of object with
79
- * Special day number, list 1-20 [class:`fd-calendar__special-day--{{number}}`] is available there:
78
+ * Special day number, list 1-20 [class:`fd-calendar__item--legend-{{number}}`] is available there:
80
79
  * https://sap.github.io/fundamental-styles/components/calendar.html calendar special days section
81
80
  * Rule accepts method with date object as a parameter. ex:
82
81
  * `rule: (date: D) => this.dateAdapter.getDay(date) === 1`, which will mark all sundays as special day.
@@ -90,11 +89,8 @@ export class CalendarDayViewComponent {
90
89
  this.previousMonthSelect = new EventEmitter();
91
90
  /** Event emitted always, when model is changed in single mode */
92
91
  this.selectedDateChange = new EventEmitter();
93
- /**
94
- * @hidden
95
- * An RxJS Subject that will kill the data stream upon component’s destruction (for unsubscribing)
96
- */
97
- this._onDestroy$ = new Subject();
92
+ /** @hidden */
93
+ this._destroyRef = inject(DestroyRef);
98
94
  /**
99
95
  * @hidden
100
96
  * Days per week
@@ -111,7 +107,7 @@ export class CalendarDayViewComponent {
111
107
  this._setupKeyboardService();
112
108
  this._refreshShortWeekDays();
113
109
  this._buildDayViewGrid();
114
- this._dateTimeAdapter.localeChanges.pipe(takeUntil(this._onDestroy$)).subscribe(() => {
110
+ this._dateTimeAdapter.localeChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {
115
111
  this._refreshShortWeekDays();
116
112
  this._buildDayViewGrid();
117
113
  this.changeDetRef.markForCheck();
@@ -127,11 +123,6 @@ export class CalendarDayViewComponent {
127
123
  this._refreshShortWeekDays();
128
124
  }
129
125
  }
130
- /** @hidden */
131
- ngOnDestroy() {
132
- this._onDestroy$.next();
133
- this._onDestroy$.complete();
134
- }
135
126
  /**
136
127
  * Function for selecting a date on the calendar. Typically called when a date is clicked, but can also be called programmatically.
137
128
  * @param day CalendarDay object to be selected.
@@ -658,13 +649,13 @@ export class CalendarDayViewComponent {
658
649
  _setupKeyboardService() {
659
650
  this.calendarService.colAmount = this._amountOfCols;
660
651
  this.calendarService.focusEscapeFunction = this.focusEscapeFunction;
661
- this.calendarService.onFocusIdChange.pipe(takeUntil(this._onDestroy$)).subscribe((index) => {
652
+ this.calendarService.onFocusIdChange.pipe(takeUntilDestroyed(this._destroyRef)).subscribe((index) => {
662
653
  this.focusOnCellByIndex(index);
663
654
  });
664
- this.calendarService.onKeySelect.pipe(takeUntil(this._onDestroy$)).subscribe((index) => {
655
+ this.calendarService.onKeySelect.pipe(takeUntilDestroyed(this._destroyRef)).subscribe((index) => {
665
656
  this.selectDate(this._calendarDayList[index]);
666
657
  });
667
- this.calendarService.onListStartApproach.pipe(takeUntil(this._onDestroy$)).subscribe((index) => {
658
+ this.calendarService.onListStartApproach.pipe(takeUntilDestroyed(this._destroyRef)).subscribe((index) => {
668
659
  this._selectPreviousMonth();
669
660
  /**
670
661
  * Calculate focused cell in new grid
@@ -676,7 +667,7 @@ export class CalendarDayViewComponent {
676
667
  this.changeDetRef.detectChanges();
677
668
  this.focusOnCellByIndex(index - 7 * (originalAmountOfWeeks - prevMonthAmountOfWeeks));
678
669
  });
679
- this.calendarService.onListEndApproach.pipe(takeUntil(this._onDestroy$)).subscribe((index) => {
670
+ this.calendarService.onListEndApproach.pipe(takeUntilDestroyed(this._destroyRef)).subscribe((index) => {
680
671
  this._selectNextMonth();
681
672
  // trigger rendering for new grid so focus can be set
682
673
  this.changeDetRef.detectChanges();
@@ -768,18 +759,24 @@ export class CalendarDayViewComponent {
768
759
  this._focusElementBySelector(`#${this._getCellIdByIndex(index)}`);
769
760
  }
770
761
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: CalendarDayViewComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.CalendarService }, { token: DATE_TIME_FORMATS }, { token: i2.DatetimeAdapter }, { token: i3.CalendarI18nLabels }], target: i0.ɵɵFactoryTarget.Component }); }
771
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.0", type: CalendarDayViewComponent, selector: "fd-calendar-day-view", inputs: { currentlyDisplayed: "currentlyDisplayed", selectedDate: "selectedDate", selectedRangeDate: "selectedRangeDate", startingDayOfWeek: "startingDayOfWeek", calType: "calType", id: "id", rangeHoverEffect: "rangeHoverEffect", markWeekends: "markWeekends", showWeekNumbers: "showWeekNumbers", focusEscapeFunction: "focusEscapeFunction", specialDaysRules: "specialDaysRules", disableFunction: "disableFunction", disableRangeStartFunction: "disableRangeStartFunction", disableRangeEndFunction: "disableRangeEndFunction" }, outputs: { selectedRangeDateChange: "selectedRangeDateChange", nextMonthSelect: "nextMonthSelect", previousMonthSelect: "previousMonthSelect", selectedDateChange: "selectedDateChange" }, host: { properties: { "attr.id": "viewId" }, classAttribute: "fd-calendar__dates" }, usesOnChanges: true, ngImport: i0, template: "<table class=\"fd-calendar__table\" role=\"grid\" [attr.aria-roledescription]=\"_viewRoleDescription\">\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-date-day]=\"cell.label\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
762
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.0", type: CalendarDayViewComponent, isStandalone: true, selector: "fd-calendar-day-view", inputs: { disableFunction: "disableFunction", disableRangeStartFunction: "disableRangeStartFunction", disableRangeEndFunction: "disableRangeEndFunction", currentlyDisplayed: "currentlyDisplayed", selectedDate: "selectedDate", selectedRangeDate: "selectedRangeDate", startingDayOfWeek: "startingDayOfWeek", calType: "calType", id: "id", rangeHoverEffect: "rangeHoverEffect", markWeekends: "markWeekends", showWeekNumbers: "showWeekNumbers", focusEscapeFunction: "focusEscapeFunction", specialDaysRules: "specialDaysRules" }, outputs: { selectedRangeDateChange: "selectedRangeDateChange", nextMonthSelect: "nextMonthSelect", previousMonthSelect: "previousMonthSelect", selectedDateChange: "selectedDateChange" }, host: { properties: { "attr.id": "viewId" }, classAttribute: "fd-calendar__dates" }, usesOnChanges: true, ngImport: i0, template: "<table\n class=\"fd-calendar__content fd-calendar__content--dates\"\n role=\"grid\"\n [attr.aria-roledescription]=\"_viewRoleDescription\"\n>\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <div class=\"fd-calendar__text-wrapper\">\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <div class=\"fd-calendar__text-wrapper\" *ngIf=\"_weeks && _weeks[rowIndex]\">\n <span class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </div>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.fd-calendar__item--selected]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--today]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__item--legend-' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-date-day]=\"cell.label\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <div class=\"fd-calendar__text-wrapper\">\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </div>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
772
763
  }
773
764
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: CalendarDayViewComponent, decorators: [{
774
765
  type: Component,
775
766
  args: [{ selector: 'fd-calendar-day-view', encapsulation: ViewEncapsulation.None, host: {
776
767
  '[attr.id]': 'viewId',
777
768
  class: 'fd-calendar__dates'
778
- }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"fd-calendar__table\" role=\"grid\" [attr.aria-roledescription]=\"_viewRoleDescription\">\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-date-day]=\"cell.label\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"] }]
769
+ }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, NgFor], template: "<table\n class=\"fd-calendar__content fd-calendar__content--dates\"\n role=\"grid\"\n [attr.aria-roledescription]=\"_viewRoleDescription\"\n>\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <div class=\"fd-calendar__text-wrapper\">\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <div class=\"fd-calendar__text-wrapper\" *ngIf=\"_weeks && _weeks[rowIndex]\">\n <span class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </div>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.fd-calendar__item--selected]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--today]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__item--legend-' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-date-day]=\"cell.label\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <div class=\"fd-calendar__text-wrapper\">\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </div>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"] }]
779
770
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.CalendarService }, { type: undefined, decorators: [{
780
771
  type: Inject,
781
772
  args: [DATE_TIME_FORMATS]
782
- }] }, { type: i2.DatetimeAdapter }, { type: i3.CalendarI18nLabels }]; }, propDecorators: { currentlyDisplayed: [{
773
+ }] }, { type: i2.DatetimeAdapter }, { type: i3.CalendarI18nLabels }]; }, propDecorators: { disableFunction: [{
774
+ type: Input
775
+ }], disableRangeStartFunction: [{
776
+ type: Input
777
+ }], disableRangeEndFunction: [{
778
+ type: Input
779
+ }], currentlyDisplayed: [{
783
780
  type: Input
784
781
  }], selectedDate: [{
785
782
  type: Input
@@ -809,11 +806,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
809
806
  type: Output
810
807
  }], selectedDateChange: [{
811
808
  type: Output
812
- }], disableFunction: [{
813
- type: Input
814
- }], disableRangeStartFunction: [{
815
- type: Input
816
- }], disableRangeEndFunction: [{
817
- type: Input
818
809
  }] } });
819
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsRUFDakIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFckcsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXBELE9BQU8sRUFBRSw2QkFBNkIsSUFBSSw2QkFBNkIsRUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBR3hILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBSXJFLDJEQUEyRDtBQVkzRCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2pDLGtEQUFrRDtJQUNsRCxJQUNJLGtCQUFrQixDQUFD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TztzQkFETixLQUFLO2dCQUtOLEVBQUU7c0JBREQsS0FBSztnQkFRTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFPTixZQUFZO3NCQURYLEtBQUs7Z0JBT04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFXTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFLRyx1QkFBdUI7c0JBRC9CLE1BQU07Z0JBS0UsZUFBZTtzQkFEdkIsTUFBTTtnQkFLRSxtQkFBbUI7c0JBRDNCLE1BQU07Z0JBS0Usa0JBQWtCO3NCQUQxQixNQUFNO2dCQWdEUCxlQUFlO3NCQURkLEtBQUs7Z0JBUU4seUJBQXlCO3NCQUR4QixLQUFLO2dCQVFOLHVCQUF1QjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgREFURV9USU1FX0ZPUk1BVFMsIERhdGVUaW1lRm9ybWF0cywgRGF0ZXRpbWVBZGFwdGVyIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RhdGV0aW1lJztcbmltcG9ydCB7IFNwZWNpYWxEYXlSdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGUtcmFuZ2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDdXJyZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWN1cnJlbnQnO1xuaW1wb3J0IHsgQWN0aXZlQ2FsZW5kYXJEYXlDZWxsU3RyYXRlZ3kgYXMgQ2FsZW5kYXJBY3RpdmVEYXlDZWxsU3RyYXRlZ3ksIENhbGVuZGFyRGF5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWRheSc7XG5cbmltcG9ydCB7IENhbGVuZGFyVHlwZSwgRGF5c09mV2VlayB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSB9IGZyb20gJy4uLy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJJMThuTGFiZWxzIH0gZnJvbSAnLi4vLi4vaTE4bi9jYWxlbmRhci1pMThuLWxhYmVscyc7XG5pbXBvcnQgeyBEaXNhYmxlRGF0ZUZ1bmN0aW9uLCBFc2NhcGVGb2N1c0Z1bmN0aW9uLCBGb2N1c2FibGVDYWxlbmRhclZpZXcgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tbW9uJztcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuXG4vKiogQ29tcG9uZW50IHJlcHJlc2VudGluZyB0aGUgZGF5IHZpZXcgb2YgdGhlIGNhbGVuZGFyLiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1jYWxlbmRhci1kYXktdmlldycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLWRheS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1kYXktdmlldy5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuaWRdJzogJ3ZpZXdJZCcsXG4gICAgICAgIGNsYXNzOiAnZmQtY2FsZW5kYXJfX2RhdGVzJ1xuICAgIH0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJEYXlWaWV3Q29tcG9uZW50PEQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgRm9jdXNhYmxlQ2FsZW5kYXJWaWV3IHtcbiAgICAvKiogQ3VycmVudGx5IGRpc3BsYXllZCBtb250aCBhbmQgeWVhciBmb3IgZGF5cyAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGN1cnJlbnRseURpc3BsYXllZChjdXJyZW50bHlEaXNwbGF5ZWQ6IENhbGVuZGFyQ3VycmVudCkge1xuICAgICAgICBpZiAoIWVxdWFsKGN1cnJlbnRseURpc3BsYXllZCwgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0gY3VycmVudGx5RGlzcGxheWVkO1xuICAgICAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRseURpc3BsYXllZCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudGx5RGlzcGxheWVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY3VycmVudGx5RGlzcGxheWVkOiBDYWxlbmRhckN1cnJlbnQ7XG5cbiAgICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRlIG1vZGVsIGluIHNpbmdsZSBtb2RlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNlbGVjdGVkRGF0ZShkYXRlOiBOdWxsYWJsZTxEPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBkYXRlO1xuICAgICAgICBpZiAodGhpcy5fZGF5Vmlld0dyaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRheUZyb21EYXRlID0gdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZpbmQoKGRheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF5LmRhdGUsIGRhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkU2luZ2xlRGF5KGRheUZyb21EYXRlLCB0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkRGF0ZSgpOiBOdWxsYWJsZTxEPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZERhdGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZERhdGU6IE51bGxhYmxlPEQ+O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgRmREYXRlcyBtb2RlbCBzdGFydCBhbmQgZW5kIGluIHJhbmdlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBzZXQgc2VsZWN0ZWRSYW5nZURhdGUoZGF0ZVJhbmdlOiBEYXRlUmFuZ2U8RD4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0ZVJhbmdlICYmXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2Uuc3RhcnQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2UuZW5kLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUgPSBkYXRlUmFuZ2U7XG4gICAgICAgIGlmICh0aGlzLl9kYXlWaWV3R3JpZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZVJhbmdlLCB0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkUmFuZ2VEYXRlKCk6IERhdGVSYW5nZTxEPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGVkUmFuZ2VEYXRlOiBEYXRlUmFuZ2U8RD47XG5cbiAgICAvKiogVGhlIGRheSBvZiB0aGUgd2VlayB0aGUgY2FsZW5kYXIgc2hvdWxkIHN0YXJ0IG9uLiAxIHJlcHJlc2VudHMgU3VuZGF5LCAyIGlzIE1vbmRheSwgMyBpcyBUdWVzZGF5LCBhbmQgc28gb24uICovXG4gICAgQElucHV0KClcbiAgICBzdGFydGluZ0RheU9mV2VlazogRGF5c09mV2VlaztcblxuICAgIC8qKiBUaGUgdHlwZSBvZiBjYWxlbmRhciwgJ3NpbmdsZScgZm9yIHNpbmdsZSBkYXRlIHNlbGVjdGlvbiBvciAncmFuZ2UnIGZvciBhIHJhbmdlIG9mIGRhdGVzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2FsVHlwZTogQ2FsZW5kYXJUeXBlID0gJ3NpbmdsZSc7XG5cbiAgICAvKiogSWQgb2YgdGhlIGNhbGVuZGFyLiBJZiBub25lIGlzIHByb3ZpZGVkLCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuICovXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1c2VyIHdhbnRzIHRvIG1hcmsgZGF5IGNlbGxzIG9uIGhvdmVyLlxuICAgICAqIFdvcmtzIG9ubHkgb24gcmFuZ2UgbW9kZSwgd2hlbiBzdGFydCBkYXRlIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmFuZ2VIb3ZlckVmZmVjdCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1c2VyIHdhbnRzIHRvIG1hcmsgc3VuZGF5L3NhdHVyZGF5IHdpdGggYGZkLWNhbGVuZGFyX19pdGVtLS13ZWVrZW5kYCBjbGFzc1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWFya1dlZWtlbmRzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gc2hvdyB3ZWVrIG51bWJlcnMgbmV4dCB0byBkYXlzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzaG93V2Vla051bWJlcnMgPSB0cnVlO1xuXG4gICAgLyoqIEZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIHNwZWNpZnkgd2hpY2ggZnVuY3Rpb24gd291bGQgYmUgY2FsbGVkLCB3aGVuIGZvY3VzIHdhbnRzIHRvIGVzY2FwZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgZm9jdXNFc2NhcGVGdW5jdGlvbjogRXNjYXBlRm9jdXNGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpYWwgZGF5cyBtYXJrLCBpdCBjYW4gYmUgdXNlZCBieSBwYXNzaW5nIGFycmF5IG9mIG9iamVjdCB3aXRoXG4gICAgICogU3BlY2lhbCBkYXkgbnVtYmVyLCBsaXN0IDEtMjAgW2NsYXNzOmBmZC1jYWxlbmRhcl9fc3BlY2lhbC1kYXktLXt7bnVtYmVyfX1gXSBpcyBhdmFpbGFibGUgdGhlcmU6XG4gICAgICogaHR0cHM6Ly9zYXAuZ2l0aHViLmlvL2Z1bmRhbWVudGFsLXN0eWxlcy9jb21wb25lbnRzL2NhbGVuZGFyLmh0bWwgY2FsZW5kYXIgc3BlY2lhbCBkYXlzIHNlY3Rpb25cbiAgICAgKiBSdWxlIGFjY2VwdHMgbWV0aG9kIHdpdGggZGF0ZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIuIGV4OlxuICAgICAqIGBydWxlOiAoZGF0ZTogRCkgPT4gdGhpcy5kYXRlQWRhcHRlci5nZXREYXkoZGF0ZSkgPT09IDFgLCB3aGljaCB3aWxsIG1hcmsgYWxsIHN1bmRheXMgYXMgc3BlY2lhbCBkYXkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzcGVjaWFsRGF5c1J1bGVzOiBTcGVjaWFsRGF5UnVsZTxEPltdID0gW107XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbW9kZWwgaXMgY2hhbmdlZCBpbiByYW5nZSBtb2RlICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U8RD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U8RD4+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbmV4dCBtb250aCBpcyBzZWxlY3RlZCwgYnkgZm9jdXMgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBuZXh0TW9udGhTZWxlY3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBwcmV2aW91cyBtb250aCBpcyBzZWxlY3RlZCwgYnkgZm9jdXMgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBwcmV2aW91c01vbnRoU2VsZWN0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbW9kZWwgaXMgY2hhbmdlZCBpbiBzaW5nbGUgbW9kZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPEQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFjdHVhbCBkYXkgZ3JpZCB3aXRoIHByZXZpb3VzL2N1cnJlbnQvbmV4dCBtb250aCBkYXlzXG4gICAgICovXG4gICAgX2RheVZpZXdHcmlkOiBDYWxlbmRhckRheTxEPltdW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQXJyYXkgb2Ygd2VlayBudW1iZXJzIGRpc3BsYXllZCBmb3IgY3VycmVudCBtb250aC95ZWFyXG4gICAgICovXG4gICAgX3dlZWtzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBbiBSeEpTIFN1YmplY3QgdGhhdCB3aWxsIGtpbGwgdGhlIGRhdGEgc3RyZWFtIHVwb24gY29tcG9uZW504oCZcyBkZXN0cnVjdGlvbiAoZm9yIHVuc3Vic2NyaWJpbmcpXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRGF5cyBwZXIgd2Vla1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Ftb3VudE9mQ29scyA9IDc7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc09uUmFuZ2VQaWNrID0gZmFsc2U7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc0luaXRpYXRlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFZhcmlhYmxlIHRoYXQgY29udGFpbnMgc2hvcnQgd2Vla2RheSBuYW1lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zaG9ydFdlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBWYXJpYWJsZSB0aGF0IGNvbnRhaW5zIHNob3J0IHdlZWtkYXkgbmFtZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9uZ1dlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhci5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHR5cGVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhciBmb3IgdGhlIHJhbmdlIHN0YXJ0IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uOiBEaXNhYmxlRGF0ZUZ1bmN0aW9uPEQ+O1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyIGZvciB0aGUgcmFuZ2UgZW5kIHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlUmFuZ2VFbmRGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGNhbGVuZGFyU2VydmljZTogQ2FsZW5kYXJTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KERBVEVfVElNRV9GT1JNQVRTKSBwcml2YXRlIF9kYXRlVGltZUZvcm1hdHM6IERhdGVUaW1lRm9ybWF0cyxcbiAgICAgICAgcHVibGljIF9kYXRlVGltZUFkYXB0ZXI6IERhdGV0aW1lQWRhcHRlcjxEPixcbiAgICAgICAgcHJpdmF0ZSBfY2FsZW5kYXJJMThuTGFiZWxzOiBDYWxlbmRhckkxOG5MYWJlbHNcbiAgICApIHt9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc0luaXRpYXRlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fc2V0dXBLZXlib2FyZFNlcnZpY2UoKTtcblxuICAgICAgICB0aGlzLl9yZWZyZXNoU2hvcnRXZWVrRGF5cygpO1xuXG4gICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcblxuICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIubG9jYWxlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk7XG4gICAgICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIC8qKiBDaGFuZ2VzIG9mIHRob3NlIHByb3BlcnRpZXMgYXJlIGRvbmUgaW5zaWRlIGl0cyBzZXR0ZXJzICovXG4gICAgICAgIGlmICghY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10gJiYgIWNoYW5nZXNbJ3NlbGVjdGVkUmFuZ2VEYXRlJ10gJiYgIWNoYW5nZXNbJ2N1cnJlbnRseURpc3BsYXllZCddKSB7XG4gICAgICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3N0YXJ0aW5nRGF5T2ZXZWVrJ10pIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIGZvciBzZWxlY3RpbmcgYSBkYXRlIG9uIHRoZSBjYWxlbmRhci4gVHlwaWNhbGx5IGNhbGxlZCB3aGVuIGEgZGF0ZSBpcyBjbGlja2VkLCBidXQgY2FuIGFsc28gYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkuXG4gICAgICogQHBhcmFtIGRheSBDYWxlbmRhckRheSBvYmplY3QgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5PEQ+LCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZXJlIGFyZSBzb21lIHByb2JsZW1zIHdpdGggcG9wdXAgaW50ZWdyYXRpb24uIEFmdGVyIGNsaWNraW5nIGluc2lkZSBkYXkgY29tcG9uZW50LCB0aGUgcG9wb3ZlciBjbG9zZXMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF5LmRpc2FibGVkICYmICFkYXkuYmxvY2tlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsVHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICAvKiogUmVtb3ZlIHNlbGVjdGlvbnMgZnJvbSBvdGhlciBkYXkgYW5kIHB1dCBzZWxlY3Rpb24gdG8gY2hvc2VuIGRheSAqL1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgZGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBkYXkuZGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDAgfHwgdGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IHsgc3RhcnQ6IGRheS5kYXRlLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRlIHBpY2tlZCBpcyBoaWdoZXIgdGhhbiBhbHJlYWR5IGNob3Nlbiwgb3RoZXJ3aXNlIGp1c3QgcmV2ZXJzZSB0aGVtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCEsIGRheS5kYXRlKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZGF5LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXModGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUsIHRoaXMuX2NhbGVuZGFyRGF5TGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAncmFuZ2UnICYmIHRoaXMucmFuZ2VIb3ZlckVmZmVjdCAmJiB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxICYmIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9pc09uUmFuZ2VQaWNrID0gIXRoaXMuX2lzT25SYW5nZVBpY2s7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc09uUmFuZ2VQaWNrID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZm9jdXMgb24gZGVmYXVsdCBmb2N1c2FibGUgY2VsbFxuICAgICAqL1xuICAgIHNldEZvY3VzT25DZWxsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjZWxsVG9Gb2N1cyA9IG5ldyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneSgpLmdldEFjdGl2ZUNlbGwodGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgaWYgKCFjZWxsVG9Gb2N1cz8uaW5kZXggJiYgY2VsbFRvRm9jdXM/LmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoY2VsbFRvRm9jdXMuaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3JlZnJlc2hIb3ZlclJhbmdlKGRheTogQ2FsZW5kYXJEYXk8RD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlPy5zdGFydDtcbiAgICAgICAgaWYgKHRoaXMuX2lzT25SYW5nZVBpY2sgJiYgc3RhcnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoZGF5LmRhdGUsIHN0YXJ0KSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxlbmRhckRheUxpc3QuZm9yRWFjaCgoX2RheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfZGF5LmhvdmVyUmFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgZGF5LmRhdGUpID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgc3RhcnQpIDwgMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZvckVhY2goKF9kYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgX2RheS5ob3ZlclJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShfZGF5LmRhdGUsIGRheS5kYXRlKSA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShfZGF5LmRhdGUsIHN0YXJ0KSA+IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogIEFtb3VudCBvZiBzZWxlY3RlZCBkYXlzXG4gICAgICogIDAsIHdoZW4gdGhlcmUgaXMgbm8gZGF5IHNlbGVjdGVkLCBvciBzdGFydCBkYXRlIGlzIGludmFsaWQsXG4gICAgICogIDEsIHdoZW4gdGhlcmUgaXMgb25seSB2YWxpZCBzdGFydCBkYXRlLCBvciBlbmQgZGF0ZSBpcyBzYW1lIGFzIHN0YXJ0IGRhdGUsXG4gICAgICogIDIsIHdoZW4gYm90aCBkYXRlcyBhcmUgdmFsaWRcbiAgICAgKi9cbiAgICBnZXQgX3NlbGVjdENvdW50ZXIoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlIHx8ICF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCAmJlxuICAgICAgICAgICAgKCF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0LCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCkgJiZcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIHNob3J0IHdlZWtkYXkgbmFtZS5cbiAgICAgKiBDYW4gYmUgY2hhbmdlZCBieSB1c2VyIGJ5IHByb3ZpZGluZyBvdGhlciBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIERhdGV0aW1lQWRhcHRlclxuICAgICAqL1xuICAgIGdldCBzaG9ydFdlZWtEYXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3J0V2Vla0RheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgd2Vla2RheSBuYW1lLlxuICAgICAqIENhbiBiZSBjaGFuZ2VkIGJ5IHVzZXIgYnkgcHJvdmlkaW5nIG90aGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgRGF0ZXRpbWVBZGFwdGVyXG4gICAgICovXG4gICAgZ2V0IGxvbmdXZWVrRGF5cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb25nV2Vla0RheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEZ1bmN0aW9uIHRoYXQgZ2l2ZXMgYXJyYXkgb2YgYWxsIGRpc3BsYXllZCBDYWxlbmRhckRheXNcbiAgICAgKi9cbiAgICBnZXQgX2NhbGVuZGFyRGF5TGlzdCgpOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RheVZpZXdHcmlkLnJlZHVjZSgodG90YWxDYWxlbmRhclJvd3M6IENhbGVuZGFyRGF5PEQ+W10sIGNhbGVuZGFyUm93OiBDYWxlbmRhckRheTxEPltdKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNhbGVuZGFyUm93KSB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJSb3cgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b3RhbENhbGVuZGFyUm93cy5jb25jYXQoY2FsZW5kYXJSb3cpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVG9kYXkgY2VsbCBsYWJlbC5cbiAgICAgKiBJcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY2VsbCBkYXRlIGl0c2VsZlxuICAgICAqL1xuICAgIGdldCBfdG9kYXlBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy50b2RheUxhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZWxlY3RlZCBkYXRlIGNlbGwgbGFiZWwuXG4gICAgICogSXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNlbGwgZGF0ZSBpdHNlbGZcbiAgICAgKi9cbiAgICBnZXQgX3NlbGVjdGVkRGF0ZUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLmRhdGVTZWxlY3RlZExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBjb2x1bW4gbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX3dlZWtDb2x1bW5MYWJlbEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLndlZWtDb2x1bW5MYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmFuZ2Ugc3RhcnQgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX3JhbmdlU3RhcnRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5yYW5nZVN0YXJ0TGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJhbmdlIGVuZCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfcmFuZ2VFbmRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5yYW5nZUVuZExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIGluIHBhc3QgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJblBhc3RBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5kYXlJblBhc3RMYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVmlldyBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGdldCBfdmlld1JvbGVEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLmNhbGVuZGFyRGF5Vmlld0Rlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZpZXcgSURcbiAgICAgKi9cbiAgICBnZXQgdmlld0lkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkICsgJy1kYXktdmlldyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFdlZWsgY29sdW1uIGhlYWRlciBJRFxuICAgICAqL1xuICAgIGdldCBfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXdlZWstY29sdW1uLWhlYWRlcic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRvZGF5IGNlbGwgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX3RvZGF5TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXRvZGF5LWxhYmVsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2VsZWN0ZWQgZGF0ZSBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0ZWREYXRlTGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXNlbGVjdGVkLWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIHJhbmdlIHN0YXJ0IGRhdGUgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXJhbmdlLXN0YXJ0LWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIHJhbmdlIGVuZCBkYXRlIGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF9kYXRlUmFuZ2VFbmRMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctcmFuZ2UtZW5kLWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIGluIHBhc3QgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJblBhc3RMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctZGF5LWluLXBhc3QtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBoYW5kbGVzIGRheSBjZWxscyBrZXlkb3duIGV2ZW50cyxcbiAgICAgKiBAcGFyYW0gZXZlbnQgS2V5Ym9hcmRFdmVudFxuICAgICAqIEBwYXJhbSBjZWxsIENhbGVuZGFyRGF5XG4gICAgICogQHBhcmFtIGdyaWQgd2l0aCBzcGVjaWZpZWQgY29sdW1uIGFuZCByb3cgYXMgYSB4IGFuZCB5XG4gICAgICovXG4gICAgX29uS2V5ZG93bkRheUhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNlbGw6IENhbGVuZGFyRGF5PEQ+LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbktleWRvd25IYW5kbGVyKGV2ZW50LCBpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogIE1ldGhvZCB0aGF0IGFsbG93IHRvIGZvY3VzIGVsZW1lbnRzIGluc2lkZSB0aGlzIGNvbXBvbmVudFxuICAgICAqL1xuICAgIF9mb2N1c0VsZW1lbnRCeVNlbGVjdG9yKGVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb0ZvY3VzOiBIVE1MRWxlbWVudCA9IHRoaXMuZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudFNlbGVjdG9yKTtcbiAgICAgICAgaWYgKGVsZW1lbnRUb0ZvY3VzPy5mb2N1cykge1xuICAgICAgICAgICAgZWxlbWVudFRvRm9jdXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTdGFuZGFyZGl6ZWQgbWV0aG9kIHRvIGNhbGN1bGF0ZSBncmlkIFt4XVt5XSB0byBpbmRleCBudW1iZXIgb2YgZmxhdHRlbiBsaXN0XG4gICAgICovXG4gICAgX2dldEluZGV4KHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclNlcnZpY2UuZ2V0SWQocm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgc2VsZWN0cyBwcmV2aW91cyBtb250aFxuICAgICAqIFRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG1vbnRoIGlzIGNoYW5nZWQgZHVyaW5nIGNoYW5naW5nIGZvY3VzXG4gICAgICogQWxzbyB0cmlnZ2VycyBldmVudCB0byBwYXJlbnQgY2FsZW5kYXIgY29tcG9uZW50IGFuZCByZWJ1aWxkcyBkYXkgdmlldyBncmlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0UHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0gdGhpcy5fZ2V0UHJldmlvdXNNb250aCgpO1xuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNNb250aFNlbGVjdC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHNlbGVjdHMgbmV4dCBtb250aFxuICAgICAqIFRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG1vbnRoIGlzIGNoYW5nZWQgZHVyaW5nIGNoYW5naW5nIGZvY3VzXG4gICAgICogQWxzbyB0cmlnZ2VycyBldmVudCB0byBwYXJlbnQgY2FsZW5kYXIgY29tcG9uZW50IGFuZCByZWJ1aWxkcyBkYXkgdmlldyBncmlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB0aGlzLl9nZXROZXh0TW9udGgoKTtcbiAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB0aGlzLm5leHRNb250aFNlbGVjdC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGNyZWF0ZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXkgbW9kZWxzIHdoaWNoIHdpbGwgYmUgc2hvd24gb24gZGF5IGdyaWQsXG4gICAgICogZGVwZW5kaW5nIG9uIGN1cnJlbnQgbW9udGggYW5kIHllYXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcG9wdWxhdGVDYWxlbmRhcigpOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgbGV0IGNhbGVuZGFyOiBDYWxlbmRhckRheTxEPltdID0gW107XG5cbiAgICAgICAgY2FsZW5kYXIgPSB0aGlzLl9nZXRQcmV2aW91c01vbnRoRGF5cyhjYWxlbmRhcik7XG4gICAgICAgIGNhbGVuZGFyID0gY2FsZW5kYXIuY29uY2F0KHRoaXMuX2dldEN1cnJlbnRNb250aERheXMoKSk7XG4gICAgICAgIGNhbGVuZGFyID0gdGhpcy5fZ2V0TmV4dE1vbnRoRGF5cyhjYWxlbmRhcik7XG5cbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoY2FsbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY2FsbC5pZCA9IHRoaXMuX2dldENlbGxJZEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgY2FsbC5pbmRleCA9IGluZGV4O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAnc2luZ2xlJyAmJiB0aGlzLl9zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IF9kYXkgPSBjYWxlbmRhci5maW5kKChkYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRheS5kYXRlLCB0aGlzLl9zZWxlY3RlZERhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkU2luZ2xlRGF5KF9kYXksIGNhbGVuZGFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdyYW5nZScgJiYgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkUmFuZ2VEYXlzKHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlLCBjYWxlbmRhcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FsZW5kYXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGJ1aWxkcyAyIGRpbWVuc2lvbnMgZGF5IHZpZXcgZ3JpZCwgYWxzbyBzZXRzIHVwIGN1cnJlbnRseSBkaXNwbGF5ZWQgbW9udGgsIG9yIHllYXIsXG4gICAgICogd2hlbiB0aGVyZSBpcyBub3QgYW55LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2J1aWxkRGF5Vmlld0dyaWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIHllYXI6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMuc2VsZWN0ZWREYXRlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0ge1xuICAgICAgICAgICAgICAgICAgICBtb250aDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRvZGF5KSxcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodG9kYXkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF5cyA9IHRoaXMuX3BvcHVsYXRlQ2FsZW5kYXIoKTtcbiAgICAgICAgY29uc3QgZGF5Vmlld0dyaWQ6IENhbGVuZGFyRGF5PEQ+W11bXSA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChjYWxlbmRhckRheXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGF5Vmlld0dyaWQucHVzaChjYWxlbmRhckRheXMuc3BsaWNlKDAsIHRoaXMuX2Ftb3VudE9mQ29scykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uucm93QW1vdW50ID0gZGF5Vmlld0dyaWQubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuX2RheVZpZXdHcmlkID0gZGF5Vmlld0dyaWQ7XG4gICAgICAgIHRoaXMuX3dlZWtzID0gdGhpcy5fcmVmcmVzaFdlZWtDb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXQgaWQgb2YgY2FsZW5kYXIncyBkYXkgaXRlbVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldENlbGxJZEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctZGF5LScgKyBpbmRleCArICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2Qgd2hpY2ggcHJvdmlkZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXksXG4gICAgICogd2hpY2ggY29udGFpbnMgZXZlcnkgc2luZ2xlIGRheSBvZiBjdXJyZW50bHkgc2hvd24gbW9udGgveWVhci5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRDdXJyZW50TW9udGhEYXlzKCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLm1vbnRoO1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhcjtcbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdID0gW107XG4gICAgICAgIGNvbnN0IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKTtcbiAgICAgICAgZm9yIChsZXQgZGF5TnVtYmVyID0gMTsgZGF5TnVtYmVyIDw9IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOyBkYXlOdW1iZXIrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZTogRCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXlOdW1iZXIpO1xuICAgICAgICAgICAgY2FsZW5kYXJEYXlzLnB1c2goe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2dldERheShkYXRlKSxcbiAgICAgICAgICAgICAgICBtb250aFN0YXR1czogJ2N1cnJlbnQnLFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKHRvZGF5LCBkYXRlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzKTtcbiAgICAgICAgY2VsbCAmJiAoY2VsbC5pc1RhYkluZGV4ZWQgPSB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNhbGVuZGFyRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgcmV0dXJucyBhY3RpdmUgY2VsbCwgd2hpY2ggbWVhbnM6XG4gICAgICogaWYgdGhlcmUgaXMgYW55IHNlbGVjdGVkIGRheSwgcmV0dXJuIHNlbGVjdGVkIGRheVxuICAgICAqIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkIGRheSwgYnV0IHRoZXJlIGlzIHRvZGF5IGRheSwgcmV0dXJuIHRvZGF5IGRheVxuICAgICAqIGlmIHRoZXJlIGlzIG5vIHRvZGF5LCBvciBzZWxlY3RlZCwgcmV0dXJuIGZpcnN0IG9uZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneTxEPigpLmdldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHdoaWNoIHByb3ZpZGVzIGFycmF5IG9mIENhbGVuZGFyRGF5LFxuICAgICAqIHdoaWNoIGNvbnRhaW5zIGxhc3QgMC02IGRheXMgb2YgcHJldmlvdXMgbW9udGgveWVhci4gVGhlc2VzIGRheXNcbiAgICAgKiBmaWxscyB0aGUgZ2FwIGJldHdlZW4gc3RhcnRpbmcgc3RhcnRpbmdEYXlPZldlZWsgYW5kIGZpcnN0IGRheSBvZiBjdXJyZW50IG1vbnRoXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNNb250aERheXMoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggLSAxIDogMTI7XG4gICAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciA6IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgLSAxO1xuICAgICAgICBjb25zdCBhbW91bnRPZkRheXNJbkN1cnJlbnRNb250aDogbnVtYmVyID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByZXZNb250aExhc3REYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoKTtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTGFzdERheSA9IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoO1xuICAgICAgICBsZXQgcHJldk1vbnRoTGFzdFdlZWtEYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKHByZXZNb250aExhc3REYXRlKSAtIHRoaXMuc3RhcnRpbmdEYXlPZldlZWs7XG5cbiAgICAgICAgLyoqIENoZWNraW5nIGlmIHRoZXJlIGFyZSBzb21lIGRheXMgY3V0IGJ5IHN0YXJ0aW5nRGF5T2ZXZWVrIG9wdGlvblxuICAgICAgICAgKiAgSWYgeWVzLCB0aGVyZSBpcyB3aG9sZSB3ZWVrIGFkZGVkLCB0byBhdm9pZCBoaWRpbmdcbiAgICAgICAgICovXG4gICAgICAgIGlmIChwcmV2TW9udGhMYXN0V2Vla0RheSA8IDApIHtcbiAgICAgICAgICAgIHByZXZNb250aExhc3RXZWVrRGF5ID0gcHJldk1vbnRoTGFzdFdlZWtEYXkgKyA3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZNb250aExhc3RXZWVrRGF5IDwgNikge1xuICAgICAgICAgICAgd2hpbGUgKHByZXZNb250aExhc3RXZWVrRGF5ID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TW9udGhEYXkgPSBwcmV2TW9udGhMYXN0RGF5IC0gcHJldk1vbnRoTGFzdFdlZWtEYXk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBwcmV2TW9udGhEYXkpO1xuICAgICAgICAgICAgICAgIGNhbGVuZGFyRGF5cy5wdXNoKHsgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLCBtb250aFN0YXR1czogJ3ByZXZpb3VzJyB9KTtcbiAgICAgICAgICAgICAgICBwcmV2TW9udGhMYXN0V2Vla0RheS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxlbmRhckRheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB3aGljaCBwcm92aWRlcyBhcnJheSBvZiBDYWxlbmRhckRheSwgd2hpY2ggY29udGFpbnMgZmlyc3QgZGF5cyBvZiBuZXh0IG1vbnRoL3llYXIuIFRoZXNlcyBkYXlzXG4gICAgICogZmlsbHMgdGhlIGdhcCBiZXR3ZWVuIGxhc3QgZGF5IG9mIGN1cnJlbnQgZGF5IGFuZCBlbmQgb2YgNi13ZWVrcyBjYWxlbmRhciBncmlkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldE5leHRNb250aERheXMoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMiA/IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLm1vbnRoICsgMSA6IDE7XG4gICAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMiA/IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgOiB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyICsgMTtcblxuICAgICAgICAvLyBUaGUgY2FsZW5kYXIgZ3JpZCBjYW4gaGF2ZSA1ICgzNSBkYXlzKSBvciA2ICg0MiBkYXlzKSB3ZWVrc1xuICAgICAgICBjb25zdCBuZXh0TW9udGhEaXNwbGF5ZWREYXlzID0gKDQyIC0gY2FsZW5kYXJEYXlzLmxlbmd0aCkgJSA3O1xuXG4gICAgICAgIGZvciAobGV0IG5leHREID0gMTsgbmV4dEQgPD0gbmV4dE1vbnRoRGlzcGxheWVkRGF5czsgbmV4dEQrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBuZXh0RCk7XG4gICAgICAgICAgICBjYWxlbmRhckRheXMucHVzaCh7IC4uLnRoaXMuX2dldERheShkYXRlKSwgbW9udGhTdGF0dXM6ICduZXh0JyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsZW5kYXJEYXlzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaXNXZWVrZW5kRGF5KGRheU9mV2VlazogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkYXlPZldlZWsgPT09IDEgfHwgZGF5T2ZXZWVrID09PSA3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBnZW5lcmF0ZXMgd2hvbGUgZGF5IG1vZGVsIGJhc2luZyBvbiBkYXRlLCBkaXNhYmxpbmcgZnVuY3Rpb25zLCBibG9jayBmdW5jdGlvbnMsIGFuZCBhY3R1YWxseVxuICAgICAqIGNob3NlbiByYW5nZSAvIHNpbmdsZSBkYXRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldERheShkYXRlOiBEKTogQ2FsZW5kYXJEYXk8RD4ge1xuICAgICAgICBjb25zdCB3ZWVrRGF5ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2VlayhkYXRlKTtcbiAgICAgICAgY29uc3QgZGF5T2ZNb250aCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXRlKGRhdGUpO1xuICAgICAgICBjb25zdCBkYXRlTmFtZXMgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZU5hbWVzKCk7XG4gICAgICAgIGNvbnN0IGlzUGFzdCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShkYXRlLCB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKSkgPCAwO1xuICAgICAgICBjb25zdCBkYXk6IENhbGVuZGFyRGF5PEQ+ID0ge1xuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGxhYmVsOiBkYXRlTmFtZXNbZGF5T2ZNb250aCAtIDFdLFxuICAgICAgICAgICAgd2Vla0RheSxcbiAgICAgICAgICAgIHdlZWtlbmQ6IHRoaXMuX2lzV2Vla2VuZERheSh3ZWVrRGF5KSxcbiAgICAgICAgICAgIGFyaWFMYWJlbDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChkYXRlLCB0aGlzLl9kYXRlVGltZUZvcm1hdHMuZGlzcGxheS5kYXRlQTExeUxhYmVsKSxcbiAgICAgICAgICAgIHNwZWNpYWxOdW1iZXI6IHRoaXMuX2dldFNwZWNpYWxEYXkoZGF0ZSkgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFzdDogaXNQYXN0XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIEFwcGx5IGRpc2FibGVkIHN0YXRlIHRvIGRheXMgbWFya2VkIHdpdGggcGFzc2VkIGZ1bmN0aW9uICovXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVGdW5jdGlvbikge1xuICAgICAgICAgICAgZGF5LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRnVuY3Rpb24oZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBpcyBjYWxsZWQgdG8gcmVmcmVzaCBpMThuIHNob3J0IHdlZWsgZGF5cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9yZWZyZXNoU2hvcnRXZWVrRGF5cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2hvcnREYXlPZldlZWtOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnc2hvcnQnKTtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrTmFtZXMgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ2xvbmcnKTtcblxuICAgICAgICB0aGlzLl9zaG9ydFdlZWtEYXlzID0gc2hvcnREYXlPZldlZWtOYW1lc1xuICAgICAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKVxuICAgICAgICAgICAgLmNvbmNhdChzaG9ydERheU9mV2Vla05hbWVzLnNsaWNlKDAsIHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKSk7XG5cbiAgICAgICAgdGhpcy5fbG9uZ1dlZWtEYXlzID0gZGF5T2ZXZWVrTmFtZXNcbiAgICAgICAgICAgIC5zbGljZSh0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrIC0gMSlcbiAgICAgICAgICAgIC5jb25jYXQoZGF5T2ZXZWVrTmFtZXMuc2xpY2UoMCwgdGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpKTtcblxuICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0cyBzcGVjaWFsIGRheSBudW1iZXIgb2Ygc3BlY2lmaWVkIGRhdGUgbW9kZWxcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRTcGVjaWFsRGF5KGRhdGU6IEQpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc3BlY2lhbERheSA9IHRoaXMuc3BlY2lhbERheXNSdWxlcy5maW5kKChzcGVjaWFsRGF5UnVsZSkgPT4gc3BlY2lhbERheVJ1bGUucnVsZShkYXRlKSk7XG4gICAgICAgIGlmIChzcGVjaWFsRGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gc3BlY2lhbERheS5zcGVjaWFsRGF5TnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIGFycmF5IG9mIHdlZWsncyBjb3VudFxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hXZWVrQ291bnQoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBjYWxlbmRhckRheUxpc3QgPSB0aGlzLl9jYWxlbmRhckRheUxpc3Q7XG4gICAgICAgIGNvbnN0IHdlZWtOdW1iZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDY7IGluZGV4IDwgY2FsZW5kYXJEYXlMaXN0Lmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDYpIHtcbiAgICAgICAgICAgIHdlZWtOdW1iZXJzLnB1c2godGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFdlZWtOYW1lKGNhbGVuZGFyRGF5TGlzdFtpbmRleF0uZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrTnVtYmVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0IHllYXIgYW5kIG1vbnRoIGZvciBwcmV2aW91cyB5ZWFyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNNb250aCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudGx5RGlzcGxheWVkLm1vbnRoID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgeWVhcjogdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsIG1vbnRoOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggLSAxIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciAtIDEsIG1vbnRoOiAxMiB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldCB5ZWFyIGFuZCBtb250aCBmb3IgbmV4dCB5ZWFyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dE1vbnRoKCk6IENhbGVuZGFyQ3VycmVudCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMikge1xuICAgICAgICAgICAgcmV0dXJuIHsgeWVhcjogdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsIG1vbnRoOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggKyAxIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciArIDEsIG1vbnRoOiAxIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRvIHB1dCBjb25maWd1cmF0aW9uIGFuZCBsaXN0ZW5lcnMgb24gY2FsZW5kYXIga2V5Ym9hcmQgc2VydmljZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldHVwS2V5Ym9hcmRTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5jb2xBbW91bnQgPSB0aGlzLl9hbW91bnRPZkNvbHM7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2UuZm9jdXNFc2NhcGVGdW5jdGlvbiA9IHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbjtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbkZvY3VzSWRDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25LZXlTZWxlY3QucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZSh0aGlzLl9jYWxlbmRhckRheUxpc3RbaW5kZXhdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25MaXN0U3RhcnRBcHByb2FjaC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0UHJldmlvdXNNb250aCgpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDYWxjdWxhdGUgZm9jdXNlZCBjZWxsIGluIG5ldyBncmlkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTW9udGggPSB0aGlzLl9nZXROZXh0TW9udGgoKTsgLy8gbW9udGggdGhhdCB3YXMgYmVmb3JlIG1vdmluZyBiYWNrXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFtb3VudE9mV2Vla3MgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0QW1vdW50T2ZXZWVrcyhcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1vbnRoLnllYXIsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxNb250aC5tb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldk1vbnRoQW1vdW50T2ZXZWVrcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRBbW91bnRPZldlZWtzKFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyLFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gdHJpZ2dlciByZW5kZXJpbmcgZm9yIG5ldyBncmlkIHNvIGZvY3VzIGNhbiBiZSBzZXRcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4IC0gNyAqIChvcmlnaW5hbEFtb3VudE9mV2Vla3MgLSBwcmV2TW9udGhBbW91bnRPZldlZWtzKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uTGlzdEVuZEFwcHJvYWNoLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3ROZXh0TW9udGgoKTtcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVuZGVyaW5nIGZvciBuZXcgZ3JpZCBzbyBmb2N1cyBjYW4gYmUgc2V0XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzT25DZWxsQnlJbmRleChpbmRleCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBDaGFuZ2Ugc2VsZWN0aW9uIGZsYWcgb24gZGF5cyB0byBmYWxzZSwgYmVzaWRlcyB0aGUgc2VsZWN0ZWQgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlU2VsZWN0ZWRTaW5nbGVEYXkoZGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZCwgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgICBpZiAoZGF5ICYmICFkYXkuYmxvY2tlZCAmJiAhZGF5LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBkYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmcmVzaFRhYkluZGV4KGNhbGVuZGFyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ2hhbmdlIHByb3BlcnRpZXMgb2YgcmFuZ2UgZGF5cywgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0byBub3QgcmVidWlsZCB3aG9sZSBncmlkIGZyb20gc2NyYXRjaCxcbiAgICAgKiBpdCBqdXN0IGNoYW5nZXMgcHJvcGVydGllcyBvZiBuZXdseSBzZWxlY3RlZC91bnNlbGVjdGVkIGRheXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZXM6IERhdGVSYW5nZTxEPiwgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgLyoqIFB1bGwgbGlzdCBvZiBjYWxlbmRhciBkYXlzICovXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyTGlzdCA9IGNhbGVuZGFyO1xuXG4gICAgICAgIC8qKiBSZXNldCBjaGFuZ2luZyBwcm9wZXJ0aWVzICovXG4gICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKFxuICAgICAgICAgICAgKF9kYXkpID0+XG4gICAgICAgICAgICAgICAgKF9kYXkuc2VsZWN0ZWRGaXJzdCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuc2VsZWN0ZWRMYXN0ID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaXNUYWJJbmRleGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5kaXNhYmxlZCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaG92ZXJSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuc2VsZWN0ZWRSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGF0ZXMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydERheTogQ2FsZW5kYXJEYXk8RD4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgZW5kRGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChkYXRlcy5zdGFydCkge1xuICAgICAgICAgICAgICAgIC8qKiBGaW5kIHN0YXJ0IGRhdGUgYW5kIG1hcmsgaXQgYXMgc2VsZWN0ZWQgKi9cbiAgICAgICAgICAgICAgICBzdGFydERheSA9IGNhbGVuZGFyTGlzdC5maW5kKChfZGF5KSA9PiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChfZGF5LmRhdGUsIGRhdGVzLnN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzdGFydERheSAmJlxuICAgICAgICAgICAgICAgICAgICAhc3RhcnREYXkuYmxvY2tlZCAmJlxuICAgICAgICAgICAgICAgICAgICAhc3RhcnREYXkuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24oc3RhcnREYXkuZGF0ZSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkuc2VsZWN0ZWRGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVzLmVuZCkge1xuICAgICAgICAgICAgICAgIC8qKiBGaW5kIGVuZCBkYXRlIGFuZCBtYXJrIGl0IGFzIHNlbGVjdGVkICovXG4gICAgICAgICAgICAgICAgZW5kRGF5ID0gY2FsZW5kYXJMaXN0LmZpbmQoKF9kYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKF9kYXkuZGF0ZSwgZGF0ZXMuZW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBlbmREYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWVuZERheS5ibG9ja2VkICYmXG4gICAgICAgICAgICAgICAgICAgICFlbmREYXkuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKGVuZERheS5kYXRlKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF5LnNlbGVjdGVkTGFzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiogVmVyaWZ5IGlmIHN0YXJ0IGRheSBhbmQgZW5kIGRheSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGRvbid0IHB1dCByYW5nZSBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIGlmIChkYXRlcy5zdGFydCAmJiBkYXRlcy5lbmQpIHtcbiAgICAgICAgICAgICAgICAvKiogTWFyayBhbGwgZGF5cywgd2hpY2ggYXJlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBkYXRlICovXG4gICAgICAgICAgICAgICAgY2FsZW5kYXJMaXN0XG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAoX2RheSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2RheS5zZWxlY3RlZFJhbmdlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzQmV0d2VlbihfZGF5LmRhdGUsIGRhdGVzLnN0YXJ0ISwgZGF0ZXMuZW5kISkpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKF9kYXkpID0+IChfZGF5LnNlbGVjdGVkUmFuZ2UgPSB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hUYWJJbmRleChjYWxlbmRhckxpc3QpO1xuXG4gICAgICAgIC8qKiBBcHBseSBkaXNhYmxlZCBzdGF0ZSB0byBkYXlzIG1hcmtlZCB3aXRoIHBhc3NlZCBmdW5jdGlvbiAqL1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZUZ1bmN0aW9uIShfZGF5LmRhdGUpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDAgfHwgdGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMikgJiYgdGhpcy5kaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYWxlbmRhckxpc3QuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAoX2RheSkgPT4gKF9kYXkuZGlzYWJsZWQgPSBfZGF5LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbiEoX2RheS5kYXRlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMSAmJiB0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYWxlbmRhckxpc3QuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuZGlzYWJsZWQgPSBfZGF5LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24hKF9kYXkuZGF0ZSkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWZyZXNoVGFiSW5kZXgoY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuaXNUYWJJbmRleGVkID0gZmFsc2UpKTtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXIuZmlsdGVyKChfZGF5KSA9PiBfZGF5Lm1vbnRoU3RhdHVzID09PSAnY3VycmVudCcpKTtcbiAgICAgICAgY2VsbCAmJiAoY2VsbC5pc1RhYkluZGV4ZWQgPSB0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNFbGVtZW50QnlTZWxlY3RvcihgIyR7dGhpcy5fZ2V0Q2VsbElkQnlJbmRleChpbmRleCl9YCk7XG4gICAgfVxufVxuIiwiPHRhYmxlIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RhYmxlXCIgcm9sZT1cImdyaWRcIiBbYXR0ci5hcmlhLXJvbGVkZXNjcmlwdGlvbl09XCJfdmlld1JvbGVEZXNjcmlwdGlvblwiPlxuICAgIDx0aGVhZCBjbGFzcz1cImZkLWNhbGVuZGFyX19ncm91cFwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93V2Vla051bWJlcnNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW0gZmQtY2FsZW5kYXJfX2l0ZW0tLXNpZGUtaGVscGVyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJfd2Vla0NvbHVtbkxhYmVsQXJpYUxhYmVsXCJcbiAgICAgICAgICAgID48L3RoPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBmZC1jYWxlbmRhcl9faXRlbS0tc2lkZS1oZWxwZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2Ygc2hvcnRXZWVrRGF5czsgaW5kZXggYXMgaVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsb25nV2Vla0RheXNbaV1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RleHRcIj57eyBkYXkgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5IGNsYXNzPVwiZmQtY2FsZW5kYXJfX2dyb3VwXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiByb2xlPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBfZGF5Vmlld0dyaWQ7IGxldCByb3dJbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dXZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBmZC1jYWxlbmRhcl9faXRlbS0tc2lkZS1oZWxwZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJyb3doZWFkZXJcIlxuICAgICAgICAgICAgICAgIHNjb3BlPVwicm93XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZkLWNhbGVuZGFyLXdlZWtdPVwiX3dlZWtzW3Jvd0luZGV4XVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwidmlld0lkICsgJy13ZWVrLScgKyBfd2Vla3Nbcm93SW5kZXhdXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiX3dlZWtOdW1iZXJzQ29sdW1uSGVhZGVySWQgKyAnICcgKyAodmlld0lkICsgJy13ZWVrLScgKyBfd2Vla3Nbcm93SW5kZXhdKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJfd2Vla3MgJiYgX3dlZWtzW3Jvd0luZGV4XVwiIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RleHRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgX3dlZWtzW3Jvd0luZGV4XSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW1cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93OyBsZXQgY2VsbEluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiY2VsbC5zZWxlY3RlZEZpcnN0IHx8IGNlbGwuc2VsZWN0ZWRMYXN0IHx8IGNlbGwuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tcmFuZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkUmFuZ2UgfHwgY2VsbC5ob3ZlclJhbmdlKSAmJiAhY2VsbC5zZWxlY3RlZEZpcnN0ICYmICFjZWxsLnNlbGVjdGVkTGFzdFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS1jdXJyZW50XT1cImNlbGwuY3VycmVudFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS13ZWVrZW5kXT1cImNlbGwud2Vla2VuZCAmJiBtYXJrV2Vla2VuZHMgJiYgY2VsbC5tb250aFN0YXR1cyA9PT0gJ2N1cnJlbnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLW90aGVyLW1vbnRoXT1cImNlbGwubW9udGhTdGF0dXMgIT09ICdjdXJyZW50J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRpc2FibGVkXT1cImNlbGwuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjZWxsLnNwZWNpYWxOdW1iZXIgPyAnZmQtY2FsZW5kYXJfX3NwZWNpYWwtZGF5LS0nICsgY2VsbC5zcGVjaWFsTnVtYmVyIDogJydcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNlbGwuaWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZmQtY2FsZW5kYXItZGF0ZS1kYXldPVwiY2VsbC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mZC1jYWxlbmRhci1kYXldPVwiY2VsbC5pbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJjZWxsLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImNlbGwuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwuaXNUYWJJbmRleGVkID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShjZWxsLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJfcmVmcmVzaEhvdmVyUmFuZ2UoY2VsbClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIl9vbktleWRvd25EYXlIYW5kbGVyKCRldmVudCwgY2VsbCwgX2dldEluZGV4KHJvd0luZGV4LCBjZWxsSW5kZXgpKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICctYXJpYS1sYWJlbCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkRmlyc3QgPyBfZGF0ZVJhbmdlU3RhcnRMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkTGFzdCA/IF9kYXRlUmFuZ2VFbmRMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLmN1cnJlbnQgPyBfdG9kYXlMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkICYmIGNhbFR5cGUgPT09ICdzaW5nbGUnID8gX3NlbGVjdGVkRGF0ZUxhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwucGFzdCA/IF9kYXRlSW5QYXN0TGFiZWxJZCA6ICcnKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+e3sgY2VsbC5sYWJlbCB9fTwvc3BhblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBoaWRkZW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW2F0dHIuaWRdPVwiY2VsbC5pZCArICctYXJpYS1sYWJlbCdcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5hcmlhTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgKm5nSWY9XCJfZGF5Vmlld0dyaWQubGVuZ3RoIDw9IDVcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGhpZGRlbi1kYXlcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgKm5nSWY9XCJfZGF5Vmlld0dyaWQubGVuZ3RoID09PSA0XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBoaWRkZW4tZGF5XCI+PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5cblxuPCEtLSBIaWRkZW4gZWxlbWVudHMgZm9yIGFyaWEgcHVycG9zZXMgLS0+XG48ZGl2IGhpZGRlbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl90b2RheUxhYmVsSWRcIj57eyBfdG9kYXlBcmlhTGFiZWwgfX08L2Rpdj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl9zZWxlY3RlZERhdGVMYWJlbElkXCI+e3sgX3NlbGVjdGVkRGF0ZUFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZFwiPnt7IF9yYW5nZVN0YXJ0QXJpYUxhYmVsIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZVJhbmdlRW5kTGFiZWxJZFwiPnt7IF9yYW5nZUVuZEFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2RhdGVJblBhc3RMYWJlbElkXCI+e3sgX2RhdGVJblBhc3RBcmlhTGFiZWwgfX08L2Rpdj5cbjwvZGl2PlxuIl19
810
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRyxPQUFPLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLDZCQUE2QixJQUFJLDZCQUE2QixFQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFHeEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR3JFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBRTlDLDJEQUEyRDtBQWMzRCxNQUFNLE9BQU8sd0JBQXdCO0lB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RGYsS0FBSztnQkFlRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBc0JOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixPQUFPO3NCQUROLEtBQUs7Z0JBS04sRUFBRTtzQkFERCxLQUFLO2dCQVFOLGdCQUFnQjtzQkFEZixLQUFLO2dCQU9OLFlBQVk7c0JBRFgsS0FBSztnQkFPTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sbUJBQW1CO3NCQURsQixLQUFLO2dCQVdOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtHLHVCQUF1QjtzQkFEL0IsTUFBTTtnQkFLRSxlQUFlO3NCQUR2QixNQUFNO2dCQUtFLG1CQUFtQjtzQkFEM0IsTUFBTTtnQkFLRSxrQkFBa0I7c0JBRDFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIEluamVjdCxcbiAgICBpbmplY3QsXG4gICAgRGVzdHJveVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgREFURV9USU1FX0ZPUk1BVFMsIERhdGVUaW1lRm9ybWF0cywgRGF0ZXRpbWVBZGFwdGVyIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RhdGV0aW1lJztcbmltcG9ydCB7IFNwZWNpYWxEYXlSdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGUtcmFuZ2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDdXJyZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWN1cnJlbnQnO1xuaW1wb3J0IHsgQWN0aXZlQ2FsZW5kYXJEYXlDZWxsU3RyYXRlZ3kgYXMgQ2FsZW5kYXJBY3RpdmVEYXlDZWxsU3RyYXRlZ3ksIENhbGVuZGFyRGF5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWRheSc7XG5cbmltcG9ydCB7IENhbGVuZGFyVHlwZSwgRGF5c09mV2VlayB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSB9IGZyb20gJy4uLy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJJMThuTGFiZWxzIH0gZnJvbSAnLi4vLi4vaTE4bi9jYWxlbmRhci1pMThuLWxhYmVscyc7XG5pbXBvcnQgeyBEaXNhYmxlRGF0ZUZ1bmN0aW9uLCBFc2NhcGVGb2N1c0Z1bmN0aW9uLCBGb2N1c2FibGVDYWxlbmRhclZpZXcgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tbW9uJztcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTmdJZiwgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKiogQ29tcG9uZW50IHJlcHJlc2VudGluZyB0aGUgZGF5IHZpZXcgb2YgdGhlIGNhbGVuZGFyLiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1jYWxlbmRhci1kYXktdmlldycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLWRheS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1kYXktdmlldy5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuaWRdJzogJ3ZpZXdJZCcsXG4gICAgICAgIGNsYXNzOiAnZmQtY2FsZW5kYXJfX2RhdGVzJ1xuICAgIH0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTmdJZiwgTmdGb3JdXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyRGF5Vmlld0NvbXBvbmVudDxEPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBGb2N1c2FibGVDYWxlbmRhclZpZXcge1xuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhci5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHR5cGVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhciBmb3IgdGhlIHJhbmdlIHN0YXJ0IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uOiBEaXNhYmxlRGF0ZUZ1bmN0aW9uPEQ+O1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyIGZvciB0aGUgcmFuZ2UgZW5kIHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlUmFuZ2VFbmRGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKiBDdXJyZW50bHkgZGlzcGxheWVkIG1vbnRoIGFuZCB5ZWFyIGZvciBkYXlzICovXG4gICAgQElucHV0KClcbiAgICBzZXQgY3VycmVudGx5RGlzcGxheWVkKGN1cnJlbnRseURpc3BsYXllZDogQ2FsZW5kYXJDdXJyZW50KSB7XG4gICAgICAgIGlmICghZXF1YWwoY3VycmVudGx5RGlzcGxheWVkLCB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQpKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSBjdXJyZW50bHlEaXNwbGF5ZWQ7XG4gICAgICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgY3VycmVudGx5RGlzcGxheWVkKCk6IENhbGVuZGFyQ3VycmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQ7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZSBtb2RlbCBpbiBzaW5nbGUgbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWxlY3RlZERhdGUoZGF0ZTogTnVsbGFibGU8RD4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gZGF0ZTtcbiAgICAgICAgaWYgKHRoaXMuX2RheVZpZXdHcmlkKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlGcm9tRGF0ZSA9IHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5maW5kKChkYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRheS5kYXRlLCBkYXRlKSk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VTZWxlY3RlZFNpbmdsZURheShkYXlGcm9tRGF0ZSwgdGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBzZWxlY3RlZERhdGUoKTogTnVsbGFibGU8RD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWREYXRlO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIEZkRGF0ZXMgbW9kZWwgc3RhcnQgYW5kIGVuZCBpbiByYW5nZSBtb2RlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNlbGVjdGVkUmFuZ2VEYXRlKGRhdGVSYW5nZTogRGF0ZVJhbmdlPEQ+KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGVSYW5nZSAmJlxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSAmJlxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF0ZVJhbmdlLnN0YXJ0LCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSAmJlxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF0ZVJhbmdlLmVuZCwgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5lbmQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0gZGF0ZVJhbmdlO1xuICAgICAgICBpZiAodGhpcy5fZGF5Vmlld0dyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkUmFuZ2VEYXlzKGRhdGVSYW5nZSwgdGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBzZWxlY3RlZFJhbmdlRGF0ZSgpOiBEYXRlUmFuZ2U8RD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGU7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBkYXkgb2YgdGhlIHdlZWsgdGhlIGNhbGVuZGFyIHNob3VsZCBzdGFydCBvbi4gMSByZXByZXNlbnRzIFN1bmRheSwgMiBpcyBNb25kYXksIDMgaXMgVHVlc2RheSwgYW5kIHNvIG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc3RhcnRpbmdEYXlPZldlZWs6IERheXNPZldlZWs7XG5cbiAgICAvKiogVGhlIHR5cGUgb2YgY2FsZW5kYXIsICdzaW5nbGUnIGZvciBzaW5nbGUgZGF0ZSBzZWxlY3Rpb24gb3IgJ3JhbmdlJyBmb3IgYSByYW5nZSBvZiBkYXRlcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNhbFR5cGU6IENhbGVuZGFyVHlwZSA9ICdzaW5nbGUnO1xuXG4gICAgLyoqIElkIG9mIHRoZSBjYWxlbmRhci4gSWYgbm9uZSBpcyBwcm92aWRlZCwgb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXNlciB3YW50cyB0byBtYXJrIGRheSBjZWxscyBvbiBob3Zlci5cbiAgICAgKiBXb3JrcyBvbmx5IG9uIHJhbmdlIG1vZGUsIHdoZW4gc3RhcnQgZGF0ZSBpcyBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHJhbmdlSG92ZXJFZmZlY3QgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXNlciB3YW50cyB0byBtYXJrIHN1bmRheS9zYXR1cmRheSB3aXRoIGBmZC1jYWxlbmRhcl9faXRlbS0td2Vla2VuZGAgY2xhc3NcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG1hcmtXZWVrZW5kcyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1c2VyIHdhbnRzIHRvIHNob3cgd2VlayBudW1iZXJzIG5leHQgdG8gZGF5c1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1dlZWtOdW1iZXJzID0gdHJ1ZTtcblxuICAgIC8qKiBGdW5jdGlvbiB0aGF0IGFsbG93cyB0byBzcGVjaWZ5IHdoaWNoIGZ1bmN0aW9uIHdvdWxkIGJlIGNhbGxlZCwgd2hlbiBmb2N1cyB3YW50cyB0byBlc2NhcGUgKi9cbiAgICBASW5wdXQoKVxuICAgIGZvY3VzRXNjYXBlRnVuY3Rpb246IEVzY2FwZUZvY3VzRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWFsIGRheXMgbWFyaywgaXQgY2FuIGJlIHVzZWQgYnkgcGFzc2luZyBhcnJheSBvZiBvYmplY3Qgd2l0aFxuICAgICAqIFNwZWNpYWwgZGF5IG51bWJlciwgbGlzdCAxLTIwIFtjbGFzczpgZmQtY2FsZW5kYXJfX2l0ZW0tLWxlZ2VuZC17e251bWJlcn19YF0gaXMgYXZhaWxhYmxlIHRoZXJlOlxuICAgICAqIGh0dHBzOi8vc2FwLmdpdGh1Yi5pby9mdW5kYW1lbnRhbC1zdHlsZXMvY29tcG9uZW50cy9jYWxlbmRhci5odG1sIGNhbGVuZGFyIHNwZWNpYWwgZGF5cyBzZWN0aW9uXG4gICAgICogUnVsZSBhY2NlcHRzIG1ldGhvZCB3aXRoIGRhdGUgb2JqZWN0IGFzIGEgcGFyYW1ldGVyLiBleDpcbiAgICAgKiBgcnVsZTogKGRhdGU6IEQpID0+IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF5KGRhdGUpID09PSAxYCwgd2hpY2ggd2lsbCBtYXJrIGFsbCBzdW5kYXlzIGFzIHNwZWNpYWwgZGF5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc3BlY2lhbERheXNSdWxlczogU3BlY2lhbERheVJ1bGU8RD5bXSA9IFtdO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgYWx3YXlzLCB3aGVuIG1vZGVsIGlzIGNoYW5nZWQgaW4gcmFuZ2UgbW9kZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPEQ+PiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPEQ+PigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgYWx3YXlzLCB3aGVuIG5leHQgbW9udGggaXMgc2VsZWN0ZWQsIGJ5IGZvY3VzICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgbmV4dE1vbnRoU2VsZWN0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gcHJldmlvdXMgbW9udGggaXMgc2VsZWN0ZWQsIGJ5IGZvY3VzICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgcHJldmlvdXNNb250aFNlbGVjdDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgYWx3YXlzLCB3aGVuIG1vZGVsIGlzIGNoYW5nZWQgaW4gc2luZ2xlIG1vZGUgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBzZWxlY3RlZERhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEPiA9IG5ldyBFdmVudEVtaXR0ZXI8RD4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBY3R1YWwgZGF5IGdyaWQgd2l0aCBwcmV2aW91cy9jdXJyZW50L25leHQgbW9udGggZGF5c1xuICAgICAqL1xuICAgIF9kYXlWaWV3R3JpZDogQ2FsZW5kYXJEYXk8RD5bXVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFycmF5IG9mIHdlZWsgbnVtYmVycyBkaXNwbGF5ZWQgZm9yIGN1cnJlbnQgbW9udGgveWVhclxuICAgICAqL1xuICAgIF93ZWVrczogc3RyaW5nW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGVkUmFuZ2VEYXRlOiBEYXRlUmFuZ2U8RD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGVkRGF0ZTogTnVsbGFibGU8RD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRGF5cyBwZXIgd2Vla1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Ftb3VudE9mQ29scyA9IDc7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc09uUmFuZ2VQaWNrID0gZmFsc2U7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc0luaXRpYXRlZCA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9jdXJyZW50bHlEaXNwbGF5ZWQ6IENhbGVuZGFyQ3VycmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBWYXJpYWJsZSB0aGF0IGNvbnRhaW5zIHNob3J0IHdlZWtkYXkgbmFtZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2hvcnRXZWVrRGF5czogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVmFyaWFibGUgdGhhdCBjb250YWlucyBzaG9ydCB3ZWVrZGF5IG5hbWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2xvbmdXZWVrRGF5czogc3RyaW5nW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0UmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBjYWxlbmRhclNlcnZpY2U6IENhbGVuZGFyU2VydmljZSxcbiAgICAgICAgQEluamVjdChEQVRFX1RJTUVfRk9STUFUUykgcHJpdmF0ZSBfZGF0ZVRpbWVGb3JtYXRzOiBEYXRlVGltZUZvcm1hdHMsXG4gICAgICAgIHB1YmxpYyBfZGF0ZVRpbWVBZGFwdGVyOiBEYXRldGltZUFkYXB0ZXI8RD4sXG4gICAgICAgIHByaXZhdGUgX2NhbGVuZGFySTE4bkxhYmVsczogQ2FsZW5kYXJJMThuTGFiZWxzXG4gICAgKSB7fVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3NldHVwS2V5Ym9hcmRTZXJ2aWNlKCk7XG5cbiAgICAgICAgdGhpcy5fcmVmcmVzaFNob3J0V2Vla0RheXMoKTtcblxuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG5cbiAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmxvY2FsZUNoYW5nZXMucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoU2hvcnRXZWVrRGF5cygpO1xuICAgICAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICAvKiogQ2hhbmdlcyBvZiB0aG9zZSBwcm9wZXJ0aWVzIGFyZSBkb25lIGluc2lkZSBpdHMgc2V0dGVycyAqL1xuICAgICAgICBpZiAoIWNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddICYmICFjaGFuZ2VzWydzZWxlY3RlZFJhbmdlRGF0ZSddICYmICFjaGFuZ2VzWydjdXJyZW50bHlEaXNwbGF5ZWQnXSkge1xuICAgICAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzdGFydGluZ0RheU9mV2VlayddKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoU2hvcnRXZWVrRGF5cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIGZvciBzZWxlY3RpbmcgYSBkYXRlIG9uIHRoZSBjYWxlbmRhci4gVHlwaWNhbGx5IGNhbGxlZCB3aGVuIGEgZGF0ZSBpcyBjbGlja2VkLCBidXQgY2FuIGFsc28gYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkuXG4gICAgICogQHBhcmFtIGRheSBDYWxlbmRhckRheSBvYmplY3QgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5PEQ+LCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZXJlIGFyZSBzb21lIHByb2JsZW1zIHdpdGggcG9wdXAgaW50ZWdyYXRpb24uIEFmdGVyIGNsaWNraW5nIGluc2lkZSBkYXkgY29tcG9uZW50LCB0aGUgcG9wb3ZlciBjbG9zZXMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF5LmRpc2FibGVkICYmICFkYXkuYmxvY2tlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsVHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICAvKiogUmVtb3ZlIHNlbGVjdGlvbnMgZnJvbSBvdGhlciBkYXkgYW5kIHB1dCBzZWxlY3Rpb24gdG8gY2hvc2VuIGRheSAqL1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgZGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBkYXkuZGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDAgfHwgdGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IHsgc3RhcnQ6IGRheS5kYXRlLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRlIHBpY2tlZCBpcyBoaWdoZXIgdGhhbiBhbHJlYWR5IGNob3Nlbiwgb3RoZXJ3aXNlIGp1c3QgcmV2ZXJzZSB0aGVtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCEsIGRheS5kYXRlKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZGF5LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXModGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUsIHRoaXMuX2NhbGVuZGFyRGF5TGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAncmFuZ2UnICYmIHRoaXMucmFuZ2VIb3ZlckVmZmVjdCAmJiB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxICYmIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9pc09uUmFuZ2VQaWNrID0gIXRoaXMuX2lzT25SYW5nZVBpY2s7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc09uUmFuZ2VQaWNrID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZm9jdXMgb24gZGVmYXVsdCBmb2N1c2FibGUgY2VsbFxuICAgICAqL1xuICAgIHNldEZvY3VzT25DZWxsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjZWxsVG9Gb2N1cyA9IG5ldyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneSgpLmdldEFjdGl2ZUNlbGwodGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgaWYgKCFjZWxsVG9Gb2N1cz8uaW5kZXggJiYgY2VsbFRvRm9jdXM/LmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoY2VsbFRvRm9jdXMuaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3JlZnJlc2hIb3ZlclJhbmdlKGRheTogQ2FsZW5kYXJEYXk8RD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlPy5zdGFydDtcbiAgICAgICAgaWYgKHRoaXMuX2lzT25SYW5nZVBpY2sgJiYgc3RhcnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoZGF5LmRhdGUsIHN0YXJ0KSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxlbmRhckRheUxpc3QuZm9yRWFjaCgoX2RheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfZGF5LmhvdmVyUmFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgZGF5LmRhdGUpID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgc3RhcnQpIDwgMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZvckVhY2goKF9kYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgX2RheS5ob3ZlclJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShfZGF5LmRhdGUsIGRheS5kYXRlKSA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShfZGF5LmRhdGUsIHN0YXJ0KSA+IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogIEFtb3VudCBvZiBzZWxlY3RlZCBkYXlzXG4gICAgICogIDAsIHdoZW4gdGhlcmUgaXMgbm8gZGF5IHNlbGVjdGVkLCBvciBzdGFydCBkYXRlIGlzIGludmFsaWQsXG4gICAgICogIDEsIHdoZW4gdGhlcmUgaXMgb25seSB2YWxpZCBzdGFydCBkYXRlLCBvciBlbmQgZGF0ZSBpcyBzYW1lIGFzIHN0YXJ0IGRhdGUsXG4gICAgICogIDIsIHdoZW4gYm90aCBkYXRlcyBhcmUgdmFsaWRcbiAgICAgKi9cbiAgICBnZXQgX3NlbGVjdENvdW50ZXIoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlIHx8ICF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCAmJlxuICAgICAgICAgICAgKCF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0LCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCkgJiZcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIHNob3J0IHdlZWtkYXkgbmFtZS5cbiAgICAgKiBDYW4gYmUgY2hhbmdlZCBieSB1c2VyIGJ5IHByb3ZpZGluZyBvdGhlciBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIERhdGV0aW1lQWRhcHRlclxuICAgICAqL1xuICAgIGdldCBzaG9ydFdlZWtEYXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3J0V2Vla0RheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgd2Vla2RheSBuYW1lLlxuICAgICAqIENhbiBiZSBjaGFuZ2VkIGJ5IHVzZXIgYnkgcHJvdmlkaW5nIG90aGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgRGF0ZXRpbWVBZGFwdGVyXG4gICAgICovXG4gICAgZ2V0IGxvbmdXZWVrRGF5cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb25nV2Vla0RheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEZ1bmN0aW9uIHRoYXQgZ2l2ZXMgYXJyYXkgb2YgYWxsIGRpc3BsYXllZCBDYWxlbmRhckRheXNcbiAgICAgKi9cbiAgICBnZXQgX2NhbGVuZGFyRGF5TGlzdCgpOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RheVZpZXdHcmlkLnJlZHVjZSgodG90YWxDYWxlbmRhclJvd3M6IENhbGVuZGFyRGF5PEQ+W10sIGNhbGVuZGFyUm93OiBDYWxlbmRhckRheTxEPltdKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNhbGVuZGFyUm93KSB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJSb3cgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b3RhbENhbGVuZGFyUm93cy5jb25jYXQoY2FsZW5kYXJSb3cpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVG9kYXkgY2VsbCBsYWJlbC5cbiAgICAgKiBJcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY2VsbCBkYXRlIGl0c2VsZlxuICAgICAqL1xuICAgIGdldCBfdG9kYXlBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy50b2RheUxhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZWxlY3RlZCBkYXRlIGNlbGwgbGFiZWwuXG4gICAgICogSXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNlbGwgZGF0ZSBpdHNlbGZcbiAgICAgKi9cbiAgICBnZXQgX3NlbGVjdGVkRGF0ZUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLmRhdGVTZWxlY3RlZExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBjb2x1bW4gbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX3dlZWtDb2x1bW5MYWJlbEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLndlZWtDb2x1bW5MYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmFuZ2Ugc3RhcnQgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX3JhbmdlU3RhcnRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5yYW5nZVN0YXJ0TGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJhbmdlIGVuZCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfcmFuZ2VFbmRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5yYW5nZUVuZExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIGluIHBhc3QgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJblBhc3RBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5kYXlJblBhc3RMYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVmlldyBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGdldCBfdmlld1JvbGVEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLmNhbGVuZGFyRGF5Vmlld0Rlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZpZXcgSURcbiAgICAgKi9cbiAgICBnZXQgdmlld0lkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkICsgJy1kYXktdmlldyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFdlZWsgY29sdW1uIGhlYWRlciBJRFxuICAgICAqL1xuICAgIGdldCBfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXdlZWstY29sdW1uLWhlYWRlcic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRvZGF5IGNlbGwgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX3RvZGF5TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXRvZGF5LWxhYmVsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2VsZWN0ZWQgZGF0ZSBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0ZWREYXRlTGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXNlbGVjdGVkLWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIHJhbmdlIHN0YXJ0IGRhdGUgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXJhbmdlLXN0YXJ0LWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIHJhbmdlIGVuZCBkYXRlIGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF9kYXRlUmFuZ2VFbmRMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctcmFuZ2UtZW5kLWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIGluIHBhc3QgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJblBhc3RMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctZGF5LWluLXBhc3QtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBoYW5kbGVzIGRheSBjZWxscyBrZXlkb3duIGV2ZW50cyxcbiAgICAgKiBAcGFyYW0gZXZlbnQgS2V5Ym9hcmRFdmVudFxuICAgICAqIEBwYXJhbSBjZWxsIENhbGVuZGFyRGF5XG4gICAgICogQHBhcmFtIGdyaWQgd2l0aCBzcGVjaWZpZWQgY29sdW1uIGFuZCByb3cgYXMgYSB4IGFuZCB5XG4gICAgICovXG4gICAgX29uS2V5ZG93bkRheUhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNlbGw6IENhbGVuZGFyRGF5PEQ+LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbktleWRvd25IYW5kbGVyKGV2ZW50LCBpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogIE1ldGhvZCB0aGF0IGFsbG93IHRvIGZvY3VzIGVsZW1lbnRzIGluc2lkZSB0aGlzIGNvbXBvbmVudFxuICAgICAqL1xuICAgIF9mb2N1c0VsZW1lbnRCeVNlbGVjdG9yKGVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb0ZvY3VzOiBIVE1MRWxlbWVudCA9IHRoaXMuZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudFNlbGVjdG9yKTtcbiAgICAgICAgaWYgKGVsZW1lbnRUb0ZvY3VzPy5mb2N1cykge1xuICAgICAgICAgICAgZWxlbWVudFRvRm9jdXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTdGFuZGFyZGl6ZWQgbWV0aG9kIHRvIGNhbGN1bGF0ZSBncmlkIFt4XVt5XSB0byBpbmRleCBudW1iZXIgb2YgZmxhdHRlbiBsaXN0XG4gICAgICovXG4gICAgX2dldEluZGV4KHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclNlcnZpY2UuZ2V0SWQocm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgc2VsZWN0cyBwcmV2aW91cyBtb250aFxuICAgICAqIFRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG1vbnRoIGlzIGNoYW5nZWQgZHVyaW5nIGNoYW5naW5nIGZvY3VzXG4gICAgICogQWxzbyB0cmlnZ2VycyBldmVudCB0byBwYXJlbnQgY2FsZW5kYXIgY29tcG9uZW50IGFuZCByZWJ1aWxkcyBkYXkgdmlldyBncmlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0UHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0gdGhpcy5fZ2V0UHJldmlvdXNNb250aCgpO1xuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNNb250aFNlbGVjdC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHNlbGVjdHMgbmV4dCBtb250aFxuICAgICAqIFRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG1vbnRoIGlzIGNoYW5nZWQgZHVyaW5nIGNoYW5naW5nIGZvY3VzXG4gICAgICogQWxzbyB0cmlnZ2VycyBldmVudCB0byBwYXJlbnQgY2FsZW5kYXIgY29tcG9uZW50IGFuZCByZWJ1aWxkcyBkYXkgdmlldyBncmlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB0aGlzLl9nZXROZXh0TW9udGgoKTtcbiAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB0aGlzLm5leHRNb250aFNlbGVjdC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGNyZWF0ZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXkgbW9kZWxzIHdoaWNoIHdpbGwgYmUgc2hvd24gb24gZGF5IGdyaWQsXG4gICAgICogZGVwZW5kaW5nIG9uIGN1cnJlbnQgbW9udGggYW5kIHllYXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcG9wdWxhdGVDYWxlbmRhcigpOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgbGV0IGNhbGVuZGFyOiBDYWxlbmRhckRheTxEPltdID0gW107XG5cbiAgICAgICAgY2FsZW5kYXIgPSB0aGlzLl9nZXRQcmV2aW91c01vbnRoRGF5cyhjYWxlbmRhcik7XG4gICAgICAgIGNhbGVuZGFyID0gY2FsZW5kYXIuY29uY2F0KHRoaXMuX2dldEN1cnJlbnRNb250aERheXMoKSk7XG4gICAgICAgIGNhbGVuZGFyID0gdGhpcy5fZ2V0TmV4dE1vbnRoRGF5cyhjYWxlbmRhcik7XG5cbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoY2FsbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY2FsbC5pZCA9IHRoaXMuX2dldENlbGxJZEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgY2FsbC5pbmRleCA9IGluZGV4O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAnc2luZ2xlJyAmJiB0aGlzLl9zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IF9kYXkgPSBjYWxlbmRhci5maW5kKChkYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRheS5kYXRlLCB0aGlzLl9zZWxlY3RlZERhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkU2luZ2xlRGF5KF9kYXksIGNhbGVuZGFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdyYW5nZScgJiYgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkUmFuZ2VEYXlzKHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlLCBjYWxlbmRhcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FsZW5kYXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGJ1aWxkcyAyIGRpbWVuc2lvbnMgZGF5IHZpZXcgZ3JpZCwgYWxzbyBzZXRzIHVwIGN1cnJlbnRseSBkaXNwbGF5ZWQgbW9udGgsIG9yIHllYXIsXG4gICAgICogd2hlbiB0aGVyZSBpcyBub3QgYW55LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2J1aWxkRGF5Vmlld0dyaWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIHllYXI6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMuc2VsZWN0ZWREYXRlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0ge1xuICAgICAgICAgICAgICAgICAgICBtb250aDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRvZGF5KSxcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodG9kYXkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF5cyA9IHRoaXMuX3BvcHVsYXRlQ2FsZW5kYXIoKTtcbiAgICAgICAgY29uc3QgZGF5Vmlld0dyaWQ6IENhbGVuZGFyRGF5PEQ+W11bXSA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChjYWxlbmRhckRheXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGF5Vmlld0dyaWQucHVzaChjYWxlbmRhckRheXMuc3BsaWNlKDAsIHRoaXMuX2Ftb3VudE9mQ29scykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uucm93QW1vdW50ID0gZGF5Vmlld0dyaWQubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuX2RheVZpZXdHcmlkID0gZGF5Vmlld0dyaWQ7XG4gICAgICAgIHRoaXMuX3dlZWtzID0gdGhpcy5fcmVmcmVzaFdlZWtDb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXQgaWQgb2YgY2FsZW5kYXIncyBkYXkgaXRlbVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldENlbGxJZEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctZGF5LScgKyBpbmRleCArICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2Qgd2hpY2ggcHJvdmlkZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXksXG4gICAgICogd2hpY2ggY29udGFpbnMgZXZlcnkgc2luZ2xlIGRheSBvZiBjdXJyZW50bHkgc2hvd24gbW9udGgveWVhci5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRDdXJyZW50TW9udGhEYXlzKCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLm1vbnRoO1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhcjtcbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdID0gW107XG4gICAgICAgIGNvbnN0IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKTtcbiAgICAgICAgZm9yIChsZXQgZGF5TnVtYmVyID0gMTsgZGF5TnVtYmVyIDw9IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOyBkYXlOdW1iZXIrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZTogRCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXlOdW1iZXIpO1xuICAgICAgICAgICAgY2FsZW5kYXJEYXlzLnB1c2goe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2dldERheShkYXRlKSxcbiAgICAgICAgICAgICAgICBtb250aFN0YXR1czogJ2N1cnJlbnQnLFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKHRvZGF5LCBkYXRlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzKTtcbiAgICAgICAgY2VsbCAmJiAoY2VsbC5pc1RhYkluZGV4ZWQgPSB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNhbGVuZGFyRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgcmV0dXJucyBhY3RpdmUgY2VsbCwgd2hpY2ggbWVhbnM6XG4gICAgICogaWYgdGhlcmUgaXMgYW55IHNlbGVjdGVkIGRheSwgcmV0dXJuIHNlbGVjdGVkIGRheVxuICAgICAqIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkIGRheSwgYnV0IHRoZXJlIGlzIHRvZGF5IGRheSwgcmV0dXJuIHRvZGF5IGRheVxuICAgICAqIGlmIHRoZXJlIGlzIG5vIHRvZGF5LCBvciBzZWxlY3RlZCwgcmV0dXJuIGZpcnN0IG9uZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneTxEPigpLmdldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHdoaWNoIHByb3ZpZGVzIGFycmF5IG9mIENhbGVuZGFyRGF5LFxuICAgICAqIHdoaWNoIGNvbnRhaW5zIGxhc3QgMC02IGRheXMgb2YgcHJldmlvdXMgbW9udGgveWVhci4gVGhlc2VzIGRheXNcbiAgICAgKiBmaWxscyB0aGUgZ2FwIGJldHdlZW4gc3RhcnRpbmcgc3RhcnRpbmdEYXlPZldlZWsgYW5kIGZpcnN0IGRheSBvZiBjdXJyZW50IG1vbnRoXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNNb250aERheXMoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggLSAxIDogMTI7XG4gICAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciA6IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgLSAxO1xuICAgICAgICBjb25zdCBhbW91bnRPZkRheXNJbkN1cnJlbnRNb250aDogbnVtYmVyID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByZXZNb250aExhc3REYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoKTtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTGFzdERheSA9IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoO1xuICAgICAgICBsZXQgcHJldk1vbnRoTGFzdFdlZWtEYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKHByZXZNb250aExhc3REYXRlKSAtIHRoaXMuc3RhcnRpbmdEYXlPZldlZWs7XG5cbiAgICAgICAgLyoqIENoZWNraW5nIGlmIHRoZXJlIGFyZSBzb21lIGRheXMgY3V0IGJ5IHN0YXJ0aW5nRGF5T2ZXZWVrIG9wdGlvblxuICAgICAgICAgKiAgSWYgeWVzLCB0aGVyZSBpcyB3aG9sZSB3ZWVrIGFkZGVkLCB0byBhdm9pZCBoaWRpbmdcbiAgICAgICAgICovXG4gICAgICAgIGlmIChwcmV2TW9udGhMYXN0V2Vla0RheSA8IDApIHtcbiAgICAgICAgICAgIHByZXZNb250aExhc3RXZWVrRGF5ID0gcHJldk1vbnRoTGFzdFdlZWtEYXkgKyA3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZNb250aExhc3RXZWVrRGF5IDwgNikge1xuICAgICAgICAgICAgd2hpbGUgKHByZXZNb250aExhc3RXZWVrRGF5ID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TW9udGhEYXkgPSBwcmV2TW9udGhMYXN0RGF5IC0gcHJldk1vbnRoTGFzdFdlZWtEYXk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBwcmV2TW9udGhEYXkpO1xuICAgICAgICAgICAgICAgIGNhbGVuZGFyRGF5cy5wdXNoKHsgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLCBtb250aFN0YXR1czogJ3ByZXZpb3VzJyB9KTtcbiAgICAgICAgICAgICAgICBwcmV2TW9udGhMYXN0V2Vla0RheS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxlbmRhckRheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB3aGljaCBwcm92aWRlcyBhcnJheSBvZiBDYWxlbmRhckRheSwgd2hpY2ggY29udGFpbnMgZmlyc3QgZGF5cyBvZiBuZXh0IG1vbnRoL3llYXIuIFRoZXNlcyBkYXlzXG4gICAgICogZmlsbHMgdGhlIGdhcCBiZXR3ZWVuIGxhc3QgZGF5IG9mIGN1cnJlbnQgZGF5IGFuZCBlbmQgb2YgNi13ZWVrcyBjYWxlbmRhciBncmlkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldE5leHRNb250aERheXMoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMiA/IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLm1vbnRoICsgMSA6IDE7XG4gICAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMiA/IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgOiB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyICsgMTtcblxuICAgICAgICAvLyBUaGUgY2FsZW5kYXIgZ3JpZCBjYW4gaGF2ZSA1ICgzNSBkYXlzKSBvciA2ICg0MiBkYXlzKSB3ZWVrc1xuICAgICAgICBjb25zdCBuZXh0TW9udGhEaXNwbGF5ZWREYXlzID0gKDQyIC0gY2FsZW5kYXJEYXlzLmxlbmd0aCkgJSA3O1xuXG4gICAgICAgIGZvciAobGV0IG5leHREID0gMTsgbmV4dEQgPD0gbmV4dE1vbnRoRGlzcGxheWVkRGF5czsgbmV4dEQrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBuZXh0RCk7XG4gICAgICAgICAgICBjYWxlbmRhckRheXMucHVzaCh7IC4uLnRoaXMuX2dldERheShkYXRlKSwgbW9udGhTdGF0dXM6ICduZXh0JyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsZW5kYXJEYXlzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaXNXZWVrZW5kRGF5KGRheU9mV2VlazogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkYXlPZldlZWsgPT09IDEgfHwgZGF5T2ZXZWVrID09PSA3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBnZW5lcmF0ZXMgd2hvbGUgZGF5IG1vZGVsIGJhc2luZyBvbiBkYXRlLCBkaXNhYmxpbmcgZnVuY3Rpb25zLCBibG9jayBmdW5jdGlvbnMsIGFuZCBhY3R1YWxseVxuICAgICAqIGNob3NlbiByYW5nZSAvIHNpbmdsZSBkYXRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldERheShkYXRlOiBEKTogQ2FsZW5kYXJEYXk8RD4ge1xuICAgICAgICBjb25zdCB3ZWVrRGF5ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2VlayhkYXRlKTtcbiAgICAgICAgY29uc3QgZGF5T2ZNb250aCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXRlKGRhdGUpO1xuICAgICAgICBjb25zdCBkYXRlTmFtZXMgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZU5hbWVzKCk7XG4gICAgICAgIGNvbnN0IGlzUGFzdCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShkYXRlLCB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKSkgPCAwO1xuICAgICAgICBjb25zdCBkYXk6IENhbGVuZGFyRGF5PEQ+ID0ge1xuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGxhYmVsOiBkYXRlTmFtZXNbZGF5T2ZNb250aCAtIDFdLFxuICAgICAgICAgICAgd2Vla0RheSxcbiAgICAgICAgICAgIHdlZWtlbmQ6IHRoaXMuX2lzV2Vla2VuZERheSh3ZWVrRGF5KSxcbiAgICAgICAgICAgIGFyaWFMYWJlbDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChkYXRlLCB0aGlzLl9kYXRlVGltZUZvcm1hdHMuZGlzcGxheS5kYXRlQTExeUxhYmVsKSxcbiAgICAgICAgICAgIHNwZWNpYWxOdW1iZXI6IHRoaXMuX2dldFNwZWNpYWxEYXkoZGF0ZSkgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFzdDogaXNQYXN0XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIEFwcGx5IGRpc2FibGVkIHN0YXRlIHRvIGRheXMgbWFya2VkIHdpdGggcGFzc2VkIGZ1bmN0aW9uICovXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVGdW5jdGlvbikge1xuICAgICAgICAgICAgZGF5LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRnVuY3Rpb24oZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBpcyBjYWxsZWQgdG8gcmVmcmVzaCBpMThuIHNob3J0IHdlZWsgZGF5cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9yZWZyZXNoU2hvcnRXZWVrRGF5cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2hvcnREYXlPZldlZWtOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnc2hvcnQnKTtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrTmFtZXMgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ2xvbmcnKTtcblxuICAgICAgICB0aGlzLl9zaG9ydFdlZWtEYXlzID0gc2hvcnREYXlPZldlZWtOYW1lc1xuICAgICAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKVxuICAgICAgICAgICAgLmNvbmNhdChzaG9ydERheU9mV2Vla05hbWVzLnNsaWNlKDAsIHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKSk7XG5cbiAgICAgICAgdGhpcy5fbG9uZ1dlZWtEYXlzID0gZGF5T2ZXZWVrTmFtZXNcbiAgICAgICAgICAgIC5zbGljZSh0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrIC0gMSlcbiAgICAgICAgICAgIC5jb25jYXQoZGF5T2ZXZWVrTmFtZXMuc2xpY2UoMCwgdGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpKTtcblxuICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0cyBzcGVjaWFsIGRheSBudW1iZXIgb2Ygc3BlY2lmaWVkIGRhdGUgbW9kZWxcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRTcGVjaWFsRGF5KGRhdGU6IEQpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc3BlY2lhbERheSA9IHRoaXMuc3BlY2lhbERheXNSdWxlcy5maW5kKChzcGVjaWFsRGF5UnVsZSkgPT4gc3BlY2lhbERheVJ1bGUucnVsZShkYXRlKSk7XG4gICAgICAgIGlmIChzcGVjaWFsRGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gc3BlY2lhbERheS5zcGVjaWFsRGF5TnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIGFycmF5IG9mIHdlZWsncyBjb3VudFxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hXZWVrQ291bnQoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBjYWxlbmRhckRheUxpc3QgPSB0aGlzLl9jYWxlbmRhckRheUxpc3Q7XG4gICAgICAgIGNvbnN0IHdlZWtOdW1iZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDY7IGluZGV4IDwgY2FsZW5kYXJEYXlMaXN0Lmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDYpIHtcbiAgICAgICAgICAgIHdlZWtOdW1iZXJzLnB1c2godGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFdlZWtOYW1lKGNhbGVuZGFyRGF5TGlzdFtpbmRleF0uZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrTnVtYmVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0IHllYXIgYW5kIG1vbnRoIGZvciBwcmV2aW91cyB5ZWFyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNNb250aCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudGx5RGlzcGxheWVkLm1vbnRoID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgeWVhcjogdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsIG1vbnRoOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggLSAxIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciAtIDEsIG1vbnRoOiAxMiB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldCB5ZWFyIGFuZCBtb250aCBmb3IgbmV4dCB5ZWFyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dE1vbnRoKCk6IENhbGVuZGFyQ3VycmVudCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMikge1xuICAgICAgICAgICAgcmV0dXJuIHsgeWVhcjogdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsIG1vbnRoOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggKyAxIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciArIDEsIG1vbnRoOiAxIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRvIHB1dCBjb25maWd1cmF0aW9uIGFuZCBsaXN0ZW5lcnMgb24gY2FsZW5kYXIga2V5Ym9hcmQgc2VydmljZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldHVwS2V5Ym9hcmRTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5jb2xBbW91bnQgPSB0aGlzLl9hbW91bnRPZkNvbHM7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2UuZm9jdXNFc2NhcGVGdW5jdGlvbiA9IHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbjtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbkZvY3VzSWRDaGFuZ2UucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25LZXlTZWxlY3QucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZSh0aGlzLl9jYWxlbmRhckRheUxpc3RbaW5kZXhdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25MaXN0U3RhcnRBcHByb2FjaC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0UHJldmlvdXNNb250aCgpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDYWxjdWxhdGUgZm9jdXNlZCBjZWxsIGluIG5ldyBncmlkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTW9udGggPSB0aGlzLl9nZXROZXh0TW9udGgoKTsgLy8gbW9udGggdGhhdCB3YXMgYmVmb3JlIG1vdmluZyBiYWNrXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFtb3VudE9mV2Vla3MgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0QW1vdW50T2ZXZWVrcyhcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1vbnRoLnllYXIsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxNb250aC5tb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldk1vbnRoQW1vdW50T2ZXZWVrcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRBbW91bnRPZldlZWtzKFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyLFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gdHJpZ2dlciByZW5kZXJpbmcgZm9yIG5ldyBncmlkIHNvIGZvY3VzIGNhbiBiZSBzZXRcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4IC0gNyAqIChvcmlnaW5hbEFtb3VudE9mV2Vla3MgLSBwcmV2TW9udGhBbW91bnRPZldlZWtzKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uTGlzdEVuZEFwcHJvYWNoLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3ROZXh0TW9udGgoKTtcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVuZGVyaW5nIGZvciBuZXcgZ3JpZCBzbyBmb2N1cyBjYW4gYmUgc2V0XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzT25DZWxsQnlJbmRleChpbmRleCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBDaGFuZ2Ugc2VsZWN0aW9uIGZsYWcgb24gZGF5cyB0byBmYWxzZSwgYmVzaWRlcyB0aGUgc2VsZWN0ZWQgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlU2VsZWN0ZWRTaW5nbGVEYXkoZGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZCwgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgICBpZiAoZGF5ICYmICFkYXkuYmxvY2tlZCAmJiAhZGF5LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBkYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmcmVzaFRhYkluZGV4KGNhbGVuZGFyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ2hhbmdlIHByb3BlcnRpZXMgb2YgcmFuZ2UgZGF5cywgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0byBub3QgcmVidWlsZCB3aG9sZSBncmlkIGZyb20gc2NyYXRjaCxcbiAgICAgKiBpdCBqdXN0IGNoYW5nZXMgcHJvcGVydGllcyBvZiBuZXdseSBzZWxlY3RlZC91bnNlbGVjdGVkIGRheXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZXM6IERhdGVSYW5nZTxEPiwgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgLyoqIFB1bGwgbGlzdCBvZiBjYWxlbmRhciBkYXlzICovXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyTGlzdCA9IGNhbGVuZGFyO1xuXG4gICAgICAgIC8qKiBSZXNldCBjaGFuZ2luZyBwcm9wZXJ0aWVzICovXG4gICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKFxuICAgICAgICAgICAgKF9kYXkpID0+XG4gICAgICAgICAgICAgICAgKF9kYXkuc2VsZWN0ZWRGaXJzdCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuc2VsZWN0ZWRMYXN0ID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaXNUYWJJbmRleGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5kaXNhYmxlZCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaG92ZXJSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuc2VsZWN0ZWRSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGF0ZXMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydERheTogQ2FsZW5kYXJEYXk8RD4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgZW5kRGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChkYXRlcy5zdGFydCkge1xuICAgICAgICAgICAgICAgIC8qKiBGaW5kIHN0YXJ0IGRhdGUgYW5kIG1hcmsgaXQgYXMgc2VsZWN0ZWQgKi9cbiAgICAgICAgICAgICAgICBzdGFydERheSA9IGNhbGVuZGFyTGlzdC5maW5kKChfZGF5KSA9PiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChfZGF5LmRhdGUsIGRhdGVzLnN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzdGFydERheSAmJlxuICAgICAgICAgICAgICAgICAgICAhc3RhcnREYXkuYmxvY2tlZCAmJlxuICAgICAgICAgICAgICAgICAgICAhc3RhcnREYXkuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24oc3RhcnREYXkuZGF0ZSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkuc2VsZWN0ZWRGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVzLmVuZCkge1xuICAgICAgICAgICAgICAgIC8qKiBGaW5kIGVuZCBkYXRlIGFuZCBtYXJrIGl0IGFzIHNlbGVjdGVkICovXG4gICAgICAgICAgICAgICAgZW5kRGF5ID0gY2FsZW5kYXJMaXN0LmZpbmQoKF9kYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKF9kYXkuZGF0ZSwgZGF0ZXMuZW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBlbmREYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWVuZERheS5ibG9ja2VkICYmXG4gICAgICAgICAgICAgICAgICAgICFlbmREYXkuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKGVuZERheS5kYXRlKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF5LnNlbGVjdGVkTGFzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiogVmVyaWZ5IGlmIHN0YXJ0IGRheSBhbmQgZW5kIGRheSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGRvbid0IHB1dCByYW5nZSBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIGlmIChkYXRlcy5zdGFydCAmJiBkYXRlcy5lbmQpIHtcbiAgICAgICAgICAgICAgICAvKiogTWFyayBhbGwgZGF5cywgd2hpY2ggYXJlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBkYXRlICovXG4gICAgICAgICAgICAgICAgY2FsZW5kYXJMaXN0XG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAoX2RheSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2RheS5zZWxlY3RlZFJhbmdlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzQmV0d2VlbihfZGF5LmRhdGUsIGRhdGVzLnN0YXJ0ISwgZGF0ZXMuZW5kISkpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKF9kYXkpID0+IChfZGF5LnNlbGVjdGVkUmFuZ2UgPSB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hUYWJJbmRleChjYWxlbmRhckxpc3QpO1xuXG4gICAgICAgIC8qKiBBcHBseSBkaXNhYmxlZCBzdGF0ZSB0byBkYXlzIG1hcmtlZCB3aXRoIHBhc3NlZCBmdW5jdGlvbiAqL1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZUZ1bmN0aW9uIShfZGF5LmRhdGUpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDAgfHwgdGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMikgJiYgdGhpcy5kaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYWxlbmRhckxpc3QuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAoX2RheSkgPT4gKF9kYXkuZGlzYWJsZWQgPSBfZGF5LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbiEoX2RheS5kYXRlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMSAmJiB0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYWxlbmRhckxpc3QuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuZGlzYWJsZWQgPSBfZGF5LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24hKF9kYXkuZGF0ZSkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWZyZXNoVGFiSW5kZXgoY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuaXNUYWJJbmRleGVkID0gZmFsc2UpKTtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXIuZmlsdGVyKChfZGF5KSA9PiBfZGF5Lm1vbnRoU3RhdHVzID09PSAnY3VycmVudCcpKTtcbiAgICAgICAgY2VsbCAmJiAoY2VsbC5pc1RhYkluZGV4ZWQgPSB0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNFbGVtZW50QnlTZWxlY3RvcihgIyR7dGhpcy5fZ2V0Q2VsbElkQnlJbmRleChpbmRleCl9YCk7XG4gICAgfVxufVxuIiwiPHRhYmxlXG4gICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9fY29udGVudCBmZC1jYWxlbmRhcl9fY29udGVudC0tZGF0ZXNcIlxuICAgIHJvbGU9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLXJvbGVkZXNjcmlwdGlvbl09XCJfdmlld1JvbGVEZXNjcmlwdGlvblwiXG4+XG4gICAgPHRoZWFkIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2dyb3VwXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiByb2xlPVwicm93XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dXZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBmZC1jYWxlbmRhcl9faXRlbS0tc2lkZS1oZWxwZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIl93ZWVrTnVtYmVyc0NvbHVtbkhlYWRlcklkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIl93ZWVrQ29sdW1uTGFiZWxBcmlhTGFiZWxcIlxuICAgICAgICAgICAgPjwvdGg+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBzaG9ydFdlZWtEYXlzOyBpbmRleCBhcyBpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvbmdXZWVrRGF5c1tpXVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZkLWNhbGVuZGFyX190ZXh0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgICA8dGJvZHkgY2xhc3M9XCJmZC1jYWxlbmRhcl9fZ3JvdXBcIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3Jvd1wiIHJvbGU9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIF9kYXlWaWV3R3JpZDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1dlZWtOdW1iZXJzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJvd2hlYWRlclwiXG4gICAgICAgICAgICAgICAgc2NvcGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZmQtY2FsZW5kYXItd2Vla109XCJfd2Vla3Nbcm93SW5kZXhdXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ2aWV3SWQgKyAnLXdlZWstJyArIF93ZWVrc1tyb3dJbmRleF1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZCArICcgJyArICh2aWV3SWQgKyAnLXdlZWstJyArIF93ZWVrc1tyb3dJbmRleF0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RleHQtd3JhcHBlclwiICpuZ0lmPVwiX3dlZWtzICYmIF93ZWVrc1tyb3dJbmRleF1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgX3dlZWtzW3Jvd0luZGV4XSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvdzsgbGV0IGNlbGxJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXNlbGVjdGVkXT1cImNlbGwuc2VsZWN0ZWRGaXJzdCB8fCBjZWxsLnNlbGVjdGVkTGFzdCB8fCBjZWxsLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXJhbmdlXT1cIlxuICAgICAgICAgICAgICAgICAgICAoY2VsbC5zZWxlY3RlZFJhbmdlIHx8IGNlbGwuaG92ZXJSYW5nZSkgJiYgIWNlbGwuc2VsZWN0ZWRGaXJzdCAmJiAhY2VsbC5zZWxlY3RlZExhc3RcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tdG9kYXldPVwiY2VsbC5jdXJyZW50XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRdPVwiY2VsbC53ZWVrZW5kICYmIG1hcmtXZWVrZW5kcyAmJiBjZWxsLm1vbnRoU3RhdHVzID09PSAnY3VycmVudCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tb3RoZXJdPVwiY2VsbC5tb250aFN0YXR1cyAhPT0gJ2N1cnJlbnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtZGlzYWJsZWRdPVwiY2VsbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNlbGwuc3BlY2lhbE51bWJlciA/ICdmZC1jYWxlbmRhcl9faXRlbS0tbGVnZW5kLScgKyBjZWxsLnNwZWNpYWxOdW1iZXIgOiAnJ1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2VsbC5pZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mZC1jYWxlbmRhci1kYXRlLWRheV09XCJjZWxsLmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZkLWNhbGVuZGFyLWRheV09XCJjZWxsLmluZGV4XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImNlbGwuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiY2VsbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC5pc1RhYkluZGV4ZWQgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGNlbGwsICRldmVudClcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIl9yZWZyZXNoSG92ZXJSYW5nZShjZWxsKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX29uS2V5ZG93bkRheUhhbmRsZXIoJGV2ZW50LCBjZWxsLCBfZ2V0SW5kZXgocm93SW5kZXgsIGNlbGxJbmRleCkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RleHQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWFyaWEtbGFiZWwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWRGaXJzdCA/IF9kYXRlUmFuZ2VTdGFydExhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkTGFzdCA/IF9kYXRlUmFuZ2VFbmRMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2VsbC5jdXJyZW50ID8gX3RvZGF5TGFiZWxJZCArICcgJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWQgJiYgY2FsVHlwZSA9PT0gJ3NpbmdsZScgPyBfc2VsZWN0ZWREYXRlTGFiZWxJZCArICcgJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwucGFzdCA/IF9kYXRlSW5QYXN0TGFiZWxJZCA6ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID57eyBjZWxsLmxhYmVsIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaGlkZGVuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFthdHRyLmlkXT1cImNlbGwuaWQgKyAnLWFyaWEtbGFiZWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjZWxsLmFyaWFMYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgKm5nSWY9XCJfZGF5Vmlld0dyaWQubGVuZ3RoIDw9IDVcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGhpZGRlbi1kYXlcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgKm5nSWY9XCJfZGF5Vmlld0dyaWQubGVuZ3RoID09PSA0XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBoaWRkZW4tZGF5XCI+PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5cblxuPCEtLSBIaWRkZW4gZWxlbWVudHMgZm9yIGFyaWEgcHVycG9zZXMgLS0+XG48ZGl2IGhpZGRlbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl90b2RheUxhYmVsSWRcIj57eyBfdG9kYXlBcmlhTGFiZWwgfX08L2Rpdj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl9zZWxlY3RlZERhdGVMYWJlbElkXCI+e3sgX3NlbGVjdGVkRGF0ZUFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZFwiPnt7IF9yYW5nZVN0YXJ0QXJpYUxhYmVsIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZVJhbmdlRW5kTGFiZWxJZFwiPnt7IF9yYW5nZUVuZEFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2RhdGVJblBhc3RMYWJlbElkXCI+e3sgX2RhdGVJblBhc3RBcmlhTGFiZWwgfX08L2Rpdj5cbjwvZGl2PlxuIl19