@fundamental-ngx/core 0.46.2-rc.2 → 0.46.2-rc.21

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 (294) hide show
  1. package/calendar/calendar-directives.d.ts +5 -9
  2. package/calendar/calendar-header/calendar-header.component.d.ts +7 -25
  3. package/calendar/calendar-views/calendar-aggregated-year-view/calendar-aggregated-year-view.component.d.ts +1 -20
  4. package/calendar/calendar-views/calendar-day-view/calendar-day-view.component.d.ts +6 -44
  5. package/calendar/calendar-views/calendar-month-view/calendar-month-view.component.d.ts +2 -21
  6. package/calendar/calendar-views/calendar-year-view/calendar-year-view.component.d.ts +3 -22
  7. package/calendar/calendar.component.d.ts +9 -9
  8. package/calendar/i18n/calendar-i18n-labels.d.ts +20 -22
  9. package/calendar/patch-deprecated-i18n-labels.d.ts +6 -0
  10. package/combobox/combobox-item.directive.d.ts +16 -0
  11. package/combobox/combobox.component.d.ts +11 -7
  12. package/combobox/combobox.interface.d.ts +4 -0
  13. package/combobox/combobox.module.d.ts +3 -2
  14. package/combobox/index.d.ts +1 -0
  15. package/dialog/dialog.module.d.ts +5 -4
  16. package/dialog/directives/dialog-template.directive.d.ts +20 -0
  17. package/dialog/index.d.ts +1 -0
  18. package/dialog/utils/dialog-config.class.d.ts +1 -0
  19. package/esm2022/action-bar/action-bar.component.mjs +2 -2
  20. package/esm2022/action-sheet/action-sheet.component.mjs +3 -3
  21. package/esm2022/avatar/avatar.component.mjs +2 -2
  22. package/esm2022/avatar-group/avatar-group.component.mjs +2 -2
  23. package/esm2022/bar/bar.component.mjs +2 -2
  24. package/esm2022/breadcrumb/breadcrumb.component.mjs +3 -3
  25. package/esm2022/busy-indicator/busy-indicator.component.mjs +3 -3
  26. package/esm2022/button/button.component.mjs +2 -2
  27. package/esm2022/calendar/calendar-directives.mjs +10 -18
  28. package/esm2022/calendar/calendar-header/calendar-header.component.mjs +30 -60
  29. package/esm2022/calendar/calendar-views/calendar-aggregated-year-view/calendar-aggregated-year-view.component.mjs +10 -35
  30. package/esm2022/calendar/calendar-views/calendar-day-view/calendar-day-view.component.mjs +13 -65
  31. package/esm2022/calendar/calendar-views/calendar-month-view/calendar-month-view.component.mjs +11 -36
  32. package/esm2022/calendar/calendar-views/calendar-year-view/calendar-year-view.component.mjs +12 -37
  33. package/esm2022/calendar/calendar.component.mjs +22 -12
  34. package/esm2022/calendar/i18n/calendar-i18n-labels.mjs +22 -28
  35. package/esm2022/calendar/patch-deprecated-i18n-labels.mjs +21 -0
  36. package/esm2022/card/card.component.mjs +2 -2
  37. package/esm2022/carousel/carousel.component.mjs +2 -2
  38. package/esm2022/checkbox/checkbox/checkbox.component.mjs +2 -2
  39. package/esm2022/combobox/combobox-item.directive.mjs +24 -0
  40. package/esm2022/combobox/combobox-mobile/combobox-mobile.component.mjs +3 -3
  41. package/esm2022/combobox/combobox.component.mjs +14 -7
  42. package/esm2022/combobox/combobox.interface.mjs +1 -1
  43. package/esm2022/combobox/combobox.module.mjs +5 -4
  44. package/esm2022/combobox/index.mjs +2 -1
  45. package/esm2022/date-picker/date-picker-mobile/date-picker-mobile.component.mjs +3 -3
  46. package/esm2022/datetime-picker/datetime-picker-mobile/datetime-picker-mobile.component.mjs +3 -3
  47. package/esm2022/dialog/dialog-body/dialog-body.component.mjs +1 -2
  48. package/esm2022/dialog/dialog-close-button/dialog-close-button.component.mjs +1 -1
  49. package/esm2022/dialog/dialog-container/dialog-container.component.mjs +1 -1
  50. package/esm2022/dialog/dialog-full-screen-toggler-button/dialog-full-screen-toggler-button.component.mjs +1 -1
  51. package/esm2022/dialog/dialog.component.mjs +3 -3
  52. package/esm2022/dialog/dialog.module.mjs +8 -4
  53. package/esm2022/dialog/directives/dialog-template.directive.mjs +24 -0
  54. package/esm2022/dialog/index.mjs +2 -1
  55. package/esm2022/dialog/utils/dialog-config.class.mjs +1 -1
  56. package/esm2022/dynamic-page/dynamic-page.component.mjs +2 -2
  57. package/esm2022/dynamic-side-content/dynamic-side-content.component.mjs +2 -2
  58. package/esm2022/facets/facet/facet.component.mjs +2 -2
  59. package/esm2022/feed-input/feed-input.component.mjs +2 -2
  60. package/esm2022/feed-list-item/components/list/feed-list.component.mjs +2 -2
  61. package/esm2022/file-uploader/file-uploader.component.mjs +2 -2
  62. package/esm2022/fixed-card-layout/fixed-card-layout.component.mjs +2 -2
  63. package/esm2022/flexible-column-layout/flexible-column-layout.component.mjs +2 -2
  64. package/esm2022/form/fieldset/fieldset.component.mjs +2 -2
  65. package/esm2022/form/form-control/form-control.component.mjs +2 -2
  66. package/esm2022/form/form-group/form-group.component.mjs +2 -2
  67. package/esm2022/form/form-header/form-header.component.mjs +2 -2
  68. package/esm2022/form/form-item/form-item.component.mjs +2 -2
  69. package/esm2022/form/form-label/form-label.component.mjs +3 -3
  70. package/esm2022/form/form-message/form-message.component.mjs +2 -2
  71. package/esm2022/generic-tag/generic-tag.component.mjs +2 -2
  72. package/esm2022/grid-list/components/grid-list/grid-list.component.mjs +2 -2
  73. package/esm2022/grid-list/components/grid-list-filter-bar/grid-list-filter-bar.component.mjs +2 -2
  74. package/esm2022/grid-list/components/grid-list-item/grid-list-item.component.mjs +2 -2
  75. package/esm2022/icon/icon.component.mjs +78 -29
  76. package/esm2022/illustrated-message/illustrated-message.component.mjs +2 -2
  77. package/esm2022/info-label/info-label.component.mjs +2 -2
  78. package/esm2022/input-group/input-group.component.mjs +2 -2
  79. package/esm2022/layout-grid/layout-grid.component.mjs +2 -2
  80. package/esm2022/layout-panel/layout-panel.component.mjs +2 -2
  81. package/esm2022/link/link.component.mjs +3 -3
  82. package/esm2022/list/list-navigation-item/list-navigation-item.component.mjs +2 -2
  83. package/esm2022/list/list.component.mjs +2 -2
  84. package/esm2022/menu/menu-mobile/menu-mobile.component.mjs +3 -3
  85. package/esm2022/menu/menu.component.mjs +4 -8
  86. package/esm2022/message-box/directives/message-box-template.directive.mjs +24 -0
  87. package/esm2022/message-box/index.mjs +8 -7
  88. package/esm2022/message-box/message-box.component.mjs +2 -2
  89. package/esm2022/message-box/message-box.module.mjs +8 -4
  90. package/esm2022/message-page/message-page.component.mjs +2 -2
  91. package/esm2022/message-strip/alert/message-strip-alert-container/message-strip-alert-container.component.mjs +2 -2
  92. package/esm2022/message-strip/message-strip.component.mjs +2 -2
  93. package/esm2022/message-toast/message-toast.component.mjs +2 -2
  94. package/esm2022/micro-process-flow/components/micro-process-flow/micro-process-flow.component.mjs +2 -2
  95. package/esm2022/micro-process-flow/components/micro-process-flow-icon/micro-process-flow-icon.component.mjs +1 -1
  96. package/esm2022/multi-combobox/index.mjs +2 -1
  97. package/esm2022/multi-combobox/mobile/mobile-multi-combobox.component.mjs +3 -3
  98. package/esm2022/multi-combobox/multi-announcer/multi-announcer.directive.mjs +74 -0
  99. package/esm2022/multi-combobox/multi-combobox.component.mjs +6 -4
  100. package/esm2022/multi-combobox/multi-combobox.module.mjs +5 -4
  101. package/esm2022/multi-input/multi-input-mobile/multi-input-mobile.component.mjs +3 -3
  102. package/esm2022/multi-input/multi-input.component.mjs +18 -7
  103. package/esm2022/nested-list/nested-list-directives.mjs +2 -2
  104. package/esm2022/notification/notification/notification.component.mjs +2 -2
  105. package/esm2022/object-identifier/object-identifier.component.mjs +2 -2
  106. package/esm2022/object-marker/object-marker.component.mjs +2 -2
  107. package/esm2022/object-number/object-number.component.mjs +2 -2
  108. package/esm2022/object-status/object-status.component.mjs +3 -3
  109. package/esm2022/pagination/pagination.component.mjs +2 -2
  110. package/esm2022/panel/panel.component.mjs +2 -2
  111. package/esm2022/popover/base/base-popover.class.mjs +2 -6
  112. package/esm2022/popover/popover-body/popover-body.component.mjs +3 -5
  113. package/esm2022/popover/popover-mobile/popover-mobile.component.mjs +3 -3
  114. package/esm2022/popover/popover-service/popover.service.mjs +1 -2
  115. package/esm2022/product-switch/product-switch-body/product-switch-body.component.mjs +2 -2
  116. package/esm2022/progress-indicator/progress-indicator.component.mjs +2 -2
  117. package/esm2022/quick-view/quick-view/quick-view.component.mjs +2 -2
  118. package/esm2022/radio/radio-button/radio-button.component.mjs +2 -2
  119. package/esm2022/rating-indicator/components/rating-indicator.component.mjs +14 -6
  120. package/esm2022/resizable-card-layout/resizable-card-layout/resizable-card-item/resizable-card-item.component.mjs +2 -2
  121. package/esm2022/resizable-card-layout/resizable-card-layout/resizable-card-layout.component.mjs +2 -2
  122. package/esm2022/scrollbar/scrollbar.directive.mjs +2 -13
  123. package/esm2022/segmented-button/segmented-button.component.mjs +2 -2
  124. package/esm2022/select/select-mobile/select-mobile.component.mjs +3 -3
  125. package/esm2022/select/select.component.mjs +3 -3
  126. package/esm2022/shellbar/product-menu/product-menu.component.mjs +2 -2
  127. package/esm2022/shellbar/shellbar.component.mjs +2 -2
  128. package/esm2022/shellbar/user-menu/shellbar-user-menu.component.mjs +2 -2
  129. package/esm2022/side-navigation/side-navigation.component.mjs +2 -2
  130. package/esm2022/skeleton/components/skeleton.component.mjs +2 -2
  131. package/esm2022/slider/slider.component.mjs +2 -2
  132. package/esm2022/split-button/split-button.component.mjs +2 -2
  133. package/esm2022/splitter/splitter-resizer/splitter-resizer.component.mjs +1 -1
  134. package/esm2022/splitter/splitter.component.mjs +2 -2
  135. package/esm2022/status-indicator/status-indicator.component.mjs +2 -2
  136. package/esm2022/step-input/step-input.component.mjs +2 -2
  137. package/esm2022/switch/switch.component.mjs +2 -2
  138. package/esm2022/table/table-wrapper.component.mjs +2 -2
  139. package/esm2022/table/table.component.mjs +2 -2
  140. package/esm2022/tabs/tab-item-expand/tab-item-expand.component.mjs +2 -2
  141. package/esm2022/tabs/tab-list.component.mjs +3 -3
  142. package/esm2022/tabs/tab-nav/tab-nav.component.mjs +2 -2
  143. package/esm2022/tabs/tab-utils/tab-directives.mjs +1 -1
  144. package/esm2022/text/text.component.mjs +2 -2
  145. package/esm2022/tile/tile.component.mjs +2 -2
  146. package/esm2022/time/time.component.mjs +2 -2
  147. package/esm2022/timeline/components/timeline-node/timeline-node.component.mjs +1 -1
  148. package/esm2022/title/title.component.mjs +2 -2
  149. package/esm2022/token/token.component.mjs +2 -2
  150. package/esm2022/token/tokenizer.component.mjs +2 -2
  151. package/esm2022/toolbar/toolbar.component.mjs +2 -2
  152. package/esm2022/tree/components/tree-item/tree-item.component.mjs +2 -2
  153. package/esm2022/tree/tree.component.mjs +2 -2
  154. package/esm2022/upload-collection/upload-collection.component.mjs +2 -2
  155. package/esm2022/vertical-navigation/vertical-navigation-main-navigation.component.mjs +2 -2
  156. package/esm2022/vertical-navigation/vertical-navigation.component.mjs +2 -2
  157. package/esm2022/wizard/wizard-step-indicator/wizard-step-indicator.component.mjs +1 -1
  158. package/esm2022/wizard/wizard.component.mjs +3 -3
  159. package/fesm2022/fundamental-ngx-core-action-bar.mjs +2 -2
  160. package/fesm2022/fundamental-ngx-core-action-sheet.mjs +2 -2
  161. package/fesm2022/fundamental-ngx-core-action-sheet.mjs.map +1 -1
  162. package/fesm2022/fundamental-ngx-core-avatar-group.mjs +2 -2
  163. package/fesm2022/fundamental-ngx-core-avatar.mjs +2 -2
  164. package/fesm2022/fundamental-ngx-core-avatar.mjs.map +1 -1
  165. package/fesm2022/fundamental-ngx-core-bar.mjs +2 -2
  166. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs +2 -2
  167. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  168. package/fesm2022/fundamental-ngx-core-busy-indicator.mjs +2 -2
  169. package/fesm2022/fundamental-ngx-core-busy-indicator.mjs.map +1 -1
  170. package/fesm2022/fundamental-ngx-core-button.mjs +2 -2
  171. package/fesm2022/fundamental-ngx-core-button.mjs.map +1 -1
  172. package/fesm2022/fundamental-ngx-core-calendar.mjs +152 -290
  173. package/fesm2022/fundamental-ngx-core-calendar.mjs.map +1 -1
  174. package/fesm2022/fundamental-ngx-core-card.mjs +2 -2
  175. package/fesm2022/fundamental-ngx-core-carousel.mjs +2 -2
  176. package/fesm2022/fundamental-ngx-core-checkbox.mjs +2 -2
  177. package/fesm2022/fundamental-ngx-core-combobox.mjs +40 -12
  178. package/fesm2022/fundamental-ngx-core-combobox.mjs.map +1 -1
  179. package/fesm2022/fundamental-ngx-core-date-picker.mjs +2 -2
  180. package/fesm2022/fundamental-ngx-core-date-picker.mjs.map +1 -1
  181. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs +2 -2
  182. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
  183. package/fesm2022/fundamental-ngx-core-dialog.mjs +33 -9
  184. package/fesm2022/fundamental-ngx-core-dialog.mjs.map +1 -1
  185. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs +2 -2
  186. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs.map +1 -1
  187. package/fesm2022/fundamental-ngx-core-dynamic-side-content.mjs +2 -2
  188. package/fesm2022/fundamental-ngx-core-facets.mjs +2 -2
  189. package/fesm2022/fundamental-ngx-core-feed-input.mjs +2 -2
  190. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs +2 -2
  191. package/fesm2022/fundamental-ngx-core-file-uploader.mjs +2 -2
  192. package/fesm2022/fundamental-ngx-core-fixed-card-layout.mjs +2 -2
  193. package/fesm2022/fundamental-ngx-core-flexible-column-layout.mjs +2 -2
  194. package/fesm2022/fundamental-ngx-core-form.mjs +14 -14
  195. package/fesm2022/fundamental-ngx-core-form.mjs.map +1 -1
  196. package/fesm2022/fundamental-ngx-core-generic-tag.mjs +2 -2
  197. package/fesm2022/fundamental-ngx-core-grid-list.mjs +4 -4
  198. package/fesm2022/fundamental-ngx-core-grid-list.mjs.map +1 -1
  199. package/fesm2022/fundamental-ngx-core-icon.mjs +78 -29
  200. package/fesm2022/fundamental-ngx-core-icon.mjs.map +1 -1
  201. package/fesm2022/fundamental-ngx-core-illustrated-message.mjs +2 -2
  202. package/fesm2022/fundamental-ngx-core-info-label.mjs +2 -2
  203. package/fesm2022/fundamental-ngx-core-info-label.mjs.map +1 -1
  204. package/fesm2022/fundamental-ngx-core-input-group.mjs +2 -2
  205. package/fesm2022/fundamental-ngx-core-layout-grid.mjs +2 -2
  206. package/fesm2022/fundamental-ngx-core-layout-panel.mjs +2 -2
  207. package/fesm2022/fundamental-ngx-core-link.mjs +2 -2
  208. package/fesm2022/fundamental-ngx-core-link.mjs.map +1 -1
  209. package/fesm2022/fundamental-ngx-core-list.mjs +4 -4
  210. package/fesm2022/fundamental-ngx-core-list.mjs.map +1 -1
  211. package/fesm2022/fundamental-ngx-core-menu.mjs +5 -9
  212. package/fesm2022/fundamental-ngx-core-menu.mjs.map +1 -1
  213. package/fesm2022/fundamental-ngx-core-message-box.mjs +35 -10
  214. package/fesm2022/fundamental-ngx-core-message-box.mjs.map +1 -1
  215. package/fesm2022/fundamental-ngx-core-message-page.mjs +2 -2
  216. package/fesm2022/fundamental-ngx-core-message-strip.mjs +3 -3
  217. package/fesm2022/fundamental-ngx-core-message-strip.mjs.map +1 -1
  218. package/fesm2022/fundamental-ngx-core-message-toast.mjs +2 -2
  219. package/fesm2022/fundamental-ngx-core-micro-process-flow.mjs +3 -3
  220. package/fesm2022/fundamental-ngx-core-micro-process-flow.mjs.map +1 -1
  221. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs +84 -13
  222. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  223. package/fesm2022/fundamental-ngx-core-multi-input.mjs +19 -8
  224. package/fesm2022/fundamental-ngx-core-multi-input.mjs.map +1 -1
  225. package/fesm2022/fundamental-ngx-core-nested-list.mjs +1 -1
  226. package/fesm2022/fundamental-ngx-core-nested-list.mjs.map +1 -1
  227. package/fesm2022/fundamental-ngx-core-notification.mjs +2 -2
  228. package/fesm2022/fundamental-ngx-core-object-identifier.mjs +2 -2
  229. package/fesm2022/fundamental-ngx-core-object-marker.mjs +2 -2
  230. package/fesm2022/fundamental-ngx-core-object-number.mjs +2 -2
  231. package/fesm2022/fundamental-ngx-core-object-status.mjs +2 -2
  232. package/fesm2022/fundamental-ngx-core-object-status.mjs.map +1 -1
  233. package/fesm2022/fundamental-ngx-core-pagination.mjs +2 -2
  234. package/fesm2022/fundamental-ngx-core-panel.mjs +2 -2
  235. package/fesm2022/fundamental-ngx-core-popover.mjs +5 -12
  236. package/fesm2022/fundamental-ngx-core-popover.mjs.map +1 -1
  237. package/fesm2022/fundamental-ngx-core-product-switch.mjs +2 -2
  238. package/fesm2022/fundamental-ngx-core-progress-indicator.mjs +2 -2
  239. package/fesm2022/fundamental-ngx-core-quick-view.mjs +2 -2
  240. package/fesm2022/fundamental-ngx-core-radio.mjs +2 -2
  241. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs +13 -5
  242. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs.map +1 -1
  243. package/fesm2022/fundamental-ngx-core-resizable-card-layout.mjs +4 -4
  244. package/fesm2022/fundamental-ngx-core-scrollbar.mjs +1 -12
  245. package/fesm2022/fundamental-ngx-core-scrollbar.mjs.map +1 -1
  246. package/fesm2022/fundamental-ngx-core-segmented-button.mjs +2 -2
  247. package/fesm2022/fundamental-ngx-core-select.mjs +4 -4
  248. package/fesm2022/fundamental-ngx-core-select.mjs.map +1 -1
  249. package/fesm2022/fundamental-ngx-core-shellbar.mjs +4 -4
  250. package/fesm2022/fundamental-ngx-core-shellbar.mjs.map +1 -1
  251. package/fesm2022/fundamental-ngx-core-side-navigation.mjs +2 -2
  252. package/fesm2022/fundamental-ngx-core-skeleton.mjs +2 -2
  253. package/fesm2022/fundamental-ngx-core-slider.mjs +2 -2
  254. package/fesm2022/fundamental-ngx-core-split-button.mjs +2 -2
  255. package/fesm2022/fundamental-ngx-core-splitter.mjs +3 -3
  256. package/fesm2022/fundamental-ngx-core-splitter.mjs.map +1 -1
  257. package/fesm2022/fundamental-ngx-core-status-indicator.mjs +2 -2
  258. package/fesm2022/fundamental-ngx-core-step-input.mjs +2 -2
  259. package/fesm2022/fundamental-ngx-core-switch.mjs +2 -2
  260. package/fesm2022/fundamental-ngx-core-table.mjs +4 -4
  261. package/fesm2022/fundamental-ngx-core-table.mjs.map +1 -1
  262. package/fesm2022/fundamental-ngx-core-tabs.mjs +6 -6
  263. package/fesm2022/fundamental-ngx-core-tabs.mjs.map +1 -1
  264. package/fesm2022/fundamental-ngx-core-text.mjs +2 -2
  265. package/fesm2022/fundamental-ngx-core-tile.mjs +2 -2
  266. package/fesm2022/fundamental-ngx-core-time.mjs +2 -2
  267. package/fesm2022/fundamental-ngx-core-timeline.mjs +1 -1
  268. package/fesm2022/fundamental-ngx-core-timeline.mjs.map +1 -1
  269. package/fesm2022/fundamental-ngx-core-title.mjs +2 -2
  270. package/fesm2022/fundamental-ngx-core-token.mjs +4 -4
  271. package/fesm2022/fundamental-ngx-core-toolbar.mjs +2 -2
  272. package/fesm2022/fundamental-ngx-core-tree.mjs +3 -3
  273. package/fesm2022/fundamental-ngx-core-tree.mjs.map +1 -1
  274. package/fesm2022/fundamental-ngx-core-upload-collection.mjs +2 -2
  275. package/fesm2022/fundamental-ngx-core-vertical-navigation.mjs +4 -4
  276. package/fesm2022/fundamental-ngx-core-wizard.mjs +3 -3
  277. package/fesm2022/fundamental-ngx-core-wizard.mjs.map +1 -1
  278. package/fundamental-ngx-core-v0.46.2-rc.21.tgz +0 -0
  279. package/icon/icon.component.d.ts +26 -9
  280. package/menu/menu.component.d.ts +1 -3
  281. package/message-box/directives/message-box-template.directive.d.ts +20 -0
  282. package/message-box/index.d.ts +7 -6
  283. package/message-box/message-box.module.d.ts +2 -1
  284. package/multi-combobox/index.d.ts +1 -0
  285. package/multi-combobox/multi-announcer/multi-announcer.directive.d.ts +23 -0
  286. package/multi-combobox/multi-combobox.module.d.ts +2 -1
  287. package/multi-input/multi-input.component.d.ts +3 -1
  288. package/package.json +4 -4
  289. package/popover/base/base-popover.class.d.ts +1 -3
  290. package/popover/popover-body/popover-body.component.d.ts +0 -2
  291. package/rating-indicator/components/rating-indicator.component.d.ts +5 -2
  292. package/schematics/add-dependencies/index.js +6 -6
  293. package/scrollbar/scrollbar.directive.d.ts +1 -5
  294. package/fundamental-ngx-core-v0.46.2-rc.2.tgz +0 -0
@@ -1,16 +1,15 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewEncapsulation, Inject, inject, DestroyRef } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef, EventEmitter, Inject, Input, Output, ViewEncapsulation, inject } from '@angular/core';
2
2
  import { DATE_TIME_FORMATS, DatetimeAdapter } from '@fundamental-ngx/core/datetime';
3
3
  import equal from 'fast-deep-equal';
4
- import { DateRange } from '../../models/date-range';
5
4
  import { ActiveCalendarDayCellStrategy as CalendarActiveDayCellStrategy } from '../../models/calendar-day';
6
- import { CalendarService } from '../../calendar.service';
7
- import { CalendarI18nLabels } from '../../i18n/calendar-i18n-labels';
5
+ import { DateRange } from '../../models/date-range';
6
+ import { NgFor, NgIf } from '@angular/common';
8
7
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
- import { NgIf, NgFor } from '@angular/common';
8
+ import { FdTranslatePipe } from '@fundamental-ngx/i18n';
9
+ import { CalendarService } from '../../calendar.service';
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
- import * as i3 from "../../i18n/calendar-i18n-labels";
14
13
  /** Component representing the day view of the calendar. */
15
14
  export class CalendarDayViewComponent {
16
15
  /** Currently displayed month and year for days */
@@ -51,13 +50,12 @@ export class CalendarDayViewComponent {
51
50
  return this._selectedRangeDate;
52
51
  }
53
52
  /** @hidden */
54
- constructor(eRef, changeDetRef, calendarService, _dateTimeFormats, _dateTimeAdapter, _calendarI18nLabels) {
53
+ constructor(eRef, changeDetRef, calendarService, _dateTimeFormats, _dateTimeAdapter) {
55
54
  this.eRef = eRef;
56
55
  this.changeDetRef = changeDetRef;
57
56
  this.calendarService = calendarService;
58
57
  this._dateTimeFormats = _dateTimeFormats;
59
58
  this._dateTimeAdapter = _dateTimeAdapter;
60
- this._calendarI18nLabels = _calendarI18nLabels;
61
59
  /** The type of calendar, 'single' for single date selection or 'range' for a range of dates. */
62
60
  this.calType = 'single';
63
61
  /**
@@ -126,6 +124,7 @@ export class CalendarDayViewComponent {
126
124
  /**
127
125
  * Function for selecting a date on the calendar. Typically called when a date is clicked, but can also be called programmatically.
128
126
  * @param day CalendarDay object to be selected.
127
+ * @param event
129
128
  */
130
129
  selectDate(day, event) {
131
130
  if (event) {
@@ -255,57 +254,6 @@ export class CalendarDayViewComponent {
255
254
  return totalCalendarRows.concat(calendarRow);
256
255
  });
257
256
  }
258
- /**
259
- * @hidden
260
- * Today cell label.
261
- * Is used in conjunction with cell date itself
262
- */
263
- get _todayAriaLabel() {
264
- return this._calendarI18nLabels.todayLabel;
265
- }
266
- /**
267
- * @hidden
268
- * Selected date cell label.
269
- * Is used in conjunction with cell date itself
270
- */
271
- get _selectedDateAriaLabel() {
272
- return this._calendarI18nLabels.dateSelectedLabel;
273
- }
274
- /**
275
- * @hidden
276
- * column label
277
- */
278
- get _weekColumnLabelAriaLabel() {
279
- return this._calendarI18nLabels.weekColumnLabel;
280
- }
281
- /**
282
- * @hidden
283
- * Range start label
284
- */
285
- get _rangeStartAriaLabel() {
286
- return this._calendarI18nLabels.rangeStartLabel;
287
- }
288
- /**
289
- * @hidden
290
- * Range end label
291
- */
292
- get _rangeEndAriaLabel() {
293
- return this._calendarI18nLabels.rangeEndLabel;
294
- }
295
- /**
296
- * @hidden
297
- * Date in past label
298
- */
299
- get _dateInPastAriaLabel() {
300
- return this._calendarI18nLabels.dayInPastLabel;
301
- }
302
- /**
303
- * @hidden
304
- * View description
305
- */
306
- get _viewRoleDescription() {
307
- return this._calendarI18nLabels.calendarDayViewDescription;
308
- }
309
257
  /**
310
258
  * View ID
311
259
  */
@@ -359,7 +307,7 @@ export class CalendarDayViewComponent {
359
307
  * Method that handles day cells keydown events,
360
308
  * @param event KeyboardEvent
361
309
  * @param cell CalendarDay
362
- * @param grid with specified column and row as a x and y
310
+ * @param index with specified column and row as a x and y
363
311
  */
364
312
  _onKeydownDayHandler(event, cell, index) {
365
313
  if (event.key === 'Tab' && !event.shiftKey) {
@@ -758,19 +706,19 @@ export class CalendarDayViewComponent {
758
706
  focusOnCellByIndex(index) {
759
707
  this._focusElementBySelector(`#${this._getCellIdByIndex(index)}`);
760
708
  }
761
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", 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 }); }
762
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", 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 }); }
709
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: CalendarDayViewComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.CalendarService }, { token: DATE_TIME_FORMATS }, { token: i2.DatetimeAdapter }], target: i0.ɵɵFactoryTarget.Component }); }
710
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", 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]=\"'coreCalendar.calendarDayViewDescription' | fdTranslate\"\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]=\"'coreCalendar.weekColumnLabel' | fdTranslate\"\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\">{{ 'coreCalendar.todayLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ 'coreCalendar.dateSelectedLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ 'coreCalendar.rangeStartLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ 'coreCalendar.rangeEndLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ 'coreCalendar.dayInPastLabel' | fdTranslate }}</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"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
763
711
  }
764
712
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: CalendarDayViewComponent, decorators: [{
765
713
  type: Component,
766
714
  args: [{ selector: 'fd-calendar-day-view', encapsulation: ViewEncapsulation.None, host: {
767
715
  '[attr.id]': 'viewId',
768
716
  class: 'fd-calendar__dates'
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"] }]
717
+ }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, NgFor, FdTranslatePipe], template: "<table\n class=\"fd-calendar__content fd-calendar__content--dates\"\n role=\"grid\"\n [attr.aria-roledescription]=\"'coreCalendar.calendarDayViewDescription' | fdTranslate\"\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]=\"'coreCalendar.weekColumnLabel' | fdTranslate\"\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\">{{ 'coreCalendar.todayLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ 'coreCalendar.dateSelectedLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ 'coreCalendar.rangeStartLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ 'coreCalendar.rangeEndLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ 'coreCalendar.dayInPastLabel' | fdTranslate }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"] }]
770
718
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.CalendarService }, { type: undefined, decorators: [{
771
719
  type: Inject,
772
720
  args: [DATE_TIME_FORMATS]
773
- }] }, { type: i2.DatetimeAdapter }, { type: i3.CalendarI18nLabels }]; }, propDecorators: { disableFunction: [{
721
+ }] }, { type: i2.DatetimeAdapter }]; }, propDecorators: { disableFunction: [{
774
722
  type: Input
775
723
  }], disableRangeStartFunction: [{
776
724
  type: Input
@@ -807,4 +755,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImpor
807
755
  }], selectedDateChange: [{
808
756
  type: Output
809
757
  }] } });
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
758
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLGlCQUFpQixFQUNqQixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRyxPQUFPLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUdwQyxPQUFPLEVBQUUsNkJBQTZCLElBQUksNkJBQTZCLEVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4SCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBSXpELDJEQUEyRDtBQWMzRCxNQUFNLE9BQU8sd0JBQXdCO0lBc0Jq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LGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0YsV0FBVyxFQUFFLFFBQVE7d0JBQ3JCLEtBQUssRUFBRSxvQkFBb0I7cUJBQzlCLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDOzswQkF3TGxDLE1BQU07MkJBQUMsaUJBQWlCOzBFQWhMN0IsZUFBZTtzQkFEZCxLQUFLO2dCQVFOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFRTix1QkFBdUI7c0JBRHRCLEtBQUs7Z0JBS0Ysa0JBQWtCO3NCQURyQixLQUFLO2dCQWNGLFlBQVk7c0JBRGYsS0FBSztnQkFlRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBc0JOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixPQUFPO3NCQUROLEtBQUs7Z0JBS04sRUFBRTtzQkFERCxLQUFLO2dCQVFOLGdCQUFnQjtzQkFEZixLQUFLO2dCQU9OLFlBQVk7c0JBRFgsS0FBSztnQkFPTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sbUJBQW1CO3NCQURsQixLQUFLO2dCQVdOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtHLHVCQUF1QjtzQkFEL0IsTUFBTTtnQkFLRSxlQUFlO3NCQUR2QixNQUFNO2dCQUtFLG1CQUFtQjtzQkFEM0IsTUFBTTtnQkFLRSxrQkFBa0I7c0JBRDFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgREFURV9USU1FX0ZPUk1BVFMsIERhdGVUaW1lRm9ybWF0cywgRGF0ZXRpbWVBZGFwdGVyIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RhdGV0aW1lJztcbmltcG9ydCB7IFNwZWNpYWxEYXlSdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuaW1wb3J0IHsgQ2FsZW5kYXJDdXJyZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWN1cnJlbnQnO1xuaW1wb3J0IHsgQWN0aXZlQ2FsZW5kYXJEYXlDZWxsU3RyYXRlZ3kgYXMgQ2FsZW5kYXJBY3RpdmVEYXlDZWxsU3RyYXRlZ3ksIENhbGVuZGFyRGF5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWRheSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZS1yYW5nZSc7XG5cbmltcG9ydCB7IE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgRmRUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9pMThuJztcbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSB9IGZyb20gJy4uLy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlzYWJsZURhdGVGdW5jdGlvbiwgRXNjYXBlRm9jdXNGdW5jdGlvbiwgRm9jdXNhYmxlQ2FsZW5kYXJWaWV3IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbW1vbic7XG5pbXBvcnQgeyBDYWxlbmRhclR5cGUsIERheXNPZldlZWsgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbi8qKiBDb21wb25lbnQgcmVwcmVzZW50aW5nIHRoZSBkYXkgdmlldyBvZiB0aGUgY2FsZW5kYXIuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLWNhbGVuZGFyLWRheS12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLWRheS12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbYXR0ci5pZF0nOiAndmlld0lkJyxcbiAgICAgICAgY2xhc3M6ICdmZC1jYWxlbmRhcl9fZGF0ZXMnXG4gICAgfSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0lmLCBOZ0ZvciwgRmRUcmFuc2xhdGVQaXBlXVxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckRheVZpZXdDb21wb25lbnQ8RD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgRm9jdXNhYmxlQ2FsZW5kYXJWaWV3IHtcbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgY2VydGFpbiBkYXRlcyBpbiB0aGUgY2FsZW5kYXIuXG4gICAgICogQHBhcmFtIGRhdGUgZGF0ZSB0eXBlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlRnVuY3Rpb246IERpc2FibGVEYXRlRnVuY3Rpb248RD47XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgY2VydGFpbiBkYXRlcyBpbiB0aGUgY2FsZW5kYXIgZm9yIHRoZSByYW5nZSBzdGFydCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIGRhdGUgZGF0ZSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhciBmb3IgdGhlIHJhbmdlIGVuZCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIGRhdGUgZGF0ZSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb246IERpc2FibGVEYXRlRnVuY3Rpb248RD47XG5cbiAgICAvKiogQ3VycmVudGx5IGRpc3BsYXllZCBtb250aCBhbmQgeWVhciBmb3IgZGF5cyAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGN1cnJlbnRseURpc3BsYXllZChjdXJyZW50bHlEaXNwbGF5ZWQ6IENhbGVuZGFyQ3VycmVudCkge1xuICAgICAgICBpZiAoIWVxdWFsKGN1cnJlbnRseURpc3BsYXllZCwgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0gY3VycmVudGx5RGlzcGxheWVkO1xuICAgICAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRseURpc3BsYXllZCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudGx5RGlzcGxheWVkO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUgbW9kZWwgaW4gc2luZ2xlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBzZXQgc2VsZWN0ZWREYXRlKGRhdGU6IE51bGxhYmxlPEQ+KSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgICAgIGlmICh0aGlzLl9kYXlWaWV3R3JpZCkge1xuICAgICAgICAgICAgY29uc3QgZGF5RnJvbURhdGUgPSB0aGlzLl9jYWxlbmRhckRheUxpc3QuZmluZCgoZGF5KSA9PiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXkuZGF0ZSwgZGF0ZSkpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRTaW5nbGVEYXkoZGF5RnJvbURhdGUsIHRoaXMuX2NhbGVuZGFyRGF5TGlzdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWREYXRlKCk6IE51bGxhYmxlPEQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBGZERhdGVzIG1vZGVsIHN0YXJ0IGFuZCBlbmQgaW4gcmFuZ2UgbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWxlY3RlZFJhbmdlRGF0ZShkYXRlUmFuZ2U6IERhdGVSYW5nZTxEPikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRlUmFuZ2UgJiZcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUgJiZcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRhdGVSYW5nZS5zdGFydCwgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCkgJiZcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRhdGVSYW5nZS5lbmQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IGRhdGVSYW5nZTtcbiAgICAgICAgaWYgKHRoaXMuX2RheVZpZXdHcmlkKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VTZWxlY3RlZFJhbmdlRGF5cyhkYXRlUmFuZ2UsIHRoaXMuX2NhbGVuZGFyRGF5TGlzdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWRSYW5nZURhdGUoKTogRGF0ZVJhbmdlPEQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlO1xuICAgIH1cblxuICAgIC8qKiBUaGUgZGF5IG9mIHRoZSB3ZWVrIHRoZSBjYWxlbmRhciBzaG91bGQgc3RhcnQgb24uIDEgcmVwcmVzZW50cyBTdW5kYXksIDIgaXMgTW9uZGF5LCAzIGlzIFR1ZXNkYXksIGFuZCBzbyBvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIHN0YXJ0aW5nRGF5T2ZXZWVrOiBEYXlzT2ZXZWVrO1xuXG4gICAgLyoqIFRoZSB0eXBlIG9mIGNhbGVuZGFyLCAnc2luZ2xlJyBmb3Igc2luZ2xlIGRhdGUgc2VsZWN0aW9uIG9yICdyYW5nZScgZm9yIGEgcmFuZ2Ugb2YgZGF0ZXMuICovXG4gICAgQElucHV0KClcbiAgICBjYWxUeXBlOiBDYWxlbmRhclR5cGUgPSAnc2luZ2xlJztcblxuICAgIC8qKiBJZCBvZiB0aGUgY2FsZW5kYXIuIElmIG5vbmUgaXMgcHJvdmlkZWQsIG9uZSB3aWxsIGJlIGdlbmVyYXRlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gbWFyayBkYXkgY2VsbHMgb24gaG92ZXIuXG4gICAgICogV29ya3Mgb25seSBvbiByYW5nZSBtb2RlLCB3aGVuIHN0YXJ0IGRhdGUgaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByYW5nZUhvdmVyRWZmZWN0ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gbWFyayBzdW5kYXkvc2F0dXJkYXkgd2l0aCBgZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRgIGNsYXNzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBtYXJrV2Vla2VuZHMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXNlciB3YW50cyB0byBzaG93IHdlZWsgbnVtYmVycyBuZXh0IHRvIGRheXNcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dXZWVrTnVtYmVycyA9IHRydWU7XG5cbiAgICAvKiogRnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gc3BlY2lmeSB3aGljaCBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsZWQsIHdoZW4gZm9jdXMgd2FudHMgdG8gZXNjYXBlICovXG4gICAgQElucHV0KClcbiAgICBmb2N1c0VzY2FwZUZ1bmN0aW9uOiBFc2NhcGVGb2N1c0Z1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lhbCBkYXlzIG1hcmssIGl0IGNhbiBiZSB1c2VkIGJ5IHBhc3NpbmcgYXJyYXkgb2Ygb2JqZWN0IHdpdGhcbiAgICAgKiBTcGVjaWFsIGRheSBudW1iZXIsIGxpc3QgMS0yMCBbY2xhc3M6YGZkLWNhbGVuZGFyX19pdGVtLS1sZWdlbmQte3tudW1iZXJ9fWBdIGlzIGF2YWlsYWJsZSB0aGVyZTpcbiAgICAgKiBodHRwczovL3NhcC5naXRodWIuaW8vZnVuZGFtZW50YWwtc3R5bGVzL2NvbXBvbmVudHMvY2FsZW5kYXIuaHRtbCBjYWxlbmRhciBzcGVjaWFsIGRheXMgc2VjdGlvblxuICAgICAqIFJ1bGUgYWNjZXB0cyBtZXRob2Qgd2l0aCBkYXRlIG9iamVjdCBhcyBhIHBhcmFtZXRlci4gZXg6XG4gICAgICogYHJ1bGU6IChkYXRlOiBEKSA9PiB0aGlzLmRhdGVBZGFwdGVyLmdldERheShkYXRlKSA9PT0gMWAsIHdoaWNoIHdpbGwgbWFyayBhbGwgc3VuZGF5cyBhcyBzcGVjaWFsIGRheS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNwZWNpYWxEYXlzUnVsZXM6IFNwZWNpYWxEYXlSdWxlPEQ+W10gPSBbXTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBtb2RlbCBpcyBjaGFuZ2VkIGluIHJhbmdlIG1vZGUgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBzZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPERhdGVSYW5nZTxEPj4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZTxEPj4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBuZXh0IG1vbnRoIGlzIHNlbGVjdGVkLCBieSBmb2N1cyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IG5leHRNb250aFNlbGVjdDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgYWx3YXlzLCB3aGVuIHByZXZpb3VzIG1vbnRoIGlzIHNlbGVjdGVkLCBieSBmb2N1cyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHByZXZpb3VzTW9udGhTZWxlY3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBtb2RlbCBpcyBjaGFuZ2VkIGluIHNpbmdsZSBtb2RlICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWREYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RD4gPSBuZXcgRXZlbnRFbWl0dGVyPEQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQWN0dWFsIGRheSBncmlkIHdpdGggcHJldmlvdXMvY3VycmVudC9uZXh0IG1vbnRoIGRheXNcbiAgICAgKi9cbiAgICBfZGF5Vmlld0dyaWQ6IENhbGVuZGFyRGF5PEQ+W11bXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBcnJheSBvZiB3ZWVrIG51bWJlcnMgZGlzcGxheWVkIGZvciBjdXJyZW50IG1vbnRoL3llYXJcbiAgICAgKi9cbiAgICBfd2Vla3M6IHN0cmluZ1tdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZFJhbmdlRGF0ZTogRGF0ZVJhbmdlPEQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZERhdGU6IE51bGxhYmxlPEQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERheXMgcGVyIHdlZWtcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9hbW91bnRPZkNvbHMgPSA3O1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaXNPblJhbmdlUGljayA9IGZhbHNlO1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaXNJbml0aWF0ZWQgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY3VycmVudGx5RGlzcGxheWVkOiBDYWxlbmRhckN1cnJlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVmFyaWFibGUgdGhhdCBjb250YWlucyBzaG9ydCB3ZWVrZGF5IG5hbWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3Nob3J0V2Vla0RheXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFZhcmlhYmxlIHRoYXQgY29udGFpbnMgc2hvcnQgd2Vla2RheSBuYW1lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb25nV2Vla0RheXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoREFURV9USU1FX0ZPUk1BVFMpIHByaXZhdGUgX2RhdGVUaW1lRm9ybWF0czogRGF0ZVRpbWVGb3JtYXRzLFxuICAgICAgICBwdWJsaWMgX2RhdGVUaW1lQWRhcHRlcjogRGF0ZXRpbWVBZGFwdGVyPEQ+XG4gICAgKSB7fVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3NldHVwS2V5Ym9hcmRTZXJ2aWNlKCk7XG5cbiAgICAgICAgdGhpcy5fcmVmcmVzaFNob3J0V2Vla0RheXMoKTtcblxuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG5cbiAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmxvY2FsZUNoYW5nZXMucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoU2hvcnRXZWVrRGF5cygpO1xuICAgICAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICAvKiogQ2hhbmdlcyBvZiB0aG9zZSBwcm9wZXJ0aWVzIGFyZSBkb25lIGluc2lkZSBpdHMgc2V0dGVycyAqL1xuICAgICAgICBpZiAoIWNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddICYmICFjaGFuZ2VzWydzZWxlY3RlZFJhbmdlRGF0ZSddICYmICFjaGFuZ2VzWydjdXJyZW50bHlEaXNwbGF5ZWQnXSkge1xuICAgICAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzdGFydGluZ0RheU9mV2VlayddKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoU2hvcnRXZWVrRGF5cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIGZvciBzZWxlY3RpbmcgYSBkYXRlIG9uIHRoZSBjYWxlbmRhci4gVHlwaWNhbGx5IGNhbGxlZCB3aGVuIGEgZGF0ZSBpcyBjbGlja2VkLCBidXQgY2FuIGFsc28gYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkuXG4gICAgICogQHBhcmFtIGRheSBDYWxlbmRhckRheSBvYmplY3QgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICovXG4gICAgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5PEQ+LCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZXJlIGFyZSBzb21lIHByb2JsZW1zIHdpdGggcG9wdXAgaW50ZWdyYXRpb24uIEFmdGVyIGNsaWNraW5nIGluc2lkZSBkYXkgY29tcG9uZW50LCB0aGUgcG9wb3ZlciBjbG9zZXMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF5LmRpc2FibGVkICYmICFkYXkuYmxvY2tlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsVHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICAvKiogUmVtb3ZlIHNlbGVjdGlvbnMgZnJvbSBvdGhlciBkYXkgYW5kIHB1dCBzZWxlY3Rpb24gdG8gY2hvc2VuIGRheSAqL1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgZGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBkYXkuZGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDAgfHwgdGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IHsgc3RhcnQ6IGRheS5kYXRlLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRlIHBpY2tlZCBpcyBoaWdoZXIgdGhhbiBhbHJlYWR5IGNob3Nlbiwgb3RoZXJ3aXNlIGp1c3QgcmV2ZXJzZSB0aGVtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCEsIGRheS5kYXRlKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZGF5LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXModGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUsIHRoaXMuX2NhbGVuZGFyRGF5TGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAncmFuZ2UnICYmIHRoaXMucmFuZ2VIb3ZlckVmZmVjdCAmJiB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxICYmIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9pc09uUmFuZ2VQaWNrID0gIXRoaXMuX2lzT25SYW5nZVBpY2s7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc09uUmFuZ2VQaWNrID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZm9jdXMgb24gZGVmYXVsdCBmb2N1c2FibGUgY2VsbFxuICAgICAqL1xuICAgIHNldEZvY3VzT25DZWxsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjZWxsVG9Gb2N1cyA9IG5ldyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneSgpLmdldEFjdGl2ZUNlbGwodGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgaWYgKCFjZWxsVG9Gb2N1cz8uaW5kZXggJiYgY2VsbFRvRm9jdXM/LmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoY2VsbFRvRm9jdXMuaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3JlZnJlc2hIb3ZlclJhbmdlKGRheTogQ2FsZW5kYXJEYXk8RD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlPy5zdGFydDtcbiAgICAgICAgaWYgKHRoaXMuX2lzT25SYW5nZVBpY2sgJiYgc3RhcnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoZGF5LmRhdGUsIHN0YXJ0KSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxlbmRhckRheUxpc3QuZm9yRWFjaCgoX2RheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfZGF5LmhvdmVyUmFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgZGF5LmRhdGUpID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgc3RhcnQpIDwgMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZvckVhY2goKF9kYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgX2RheS5ob3ZlclJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShfZGF5LmRhdGUsIGRheS5kYXRlKSA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShfZGF5LmRhdGUsIHN0YXJ0KSA+IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogIEFtb3VudCBvZiBzZWxlY3RlZCBkYXlzXG4gICAgICogIDAsIHdoZW4gdGhlcmUgaXMgbm8gZGF5IHNlbGVjdGVkLCBvciBzdGFydCBkYXRlIGlzIGludmFsaWQsXG4gICAgICogIDEsIHdoZW4gdGhlcmUgaXMgb25seSB2YWxpZCBzdGFydCBkYXRlLCBvciBlbmQgZGF0ZSBpcyBzYW1lIGFzIHN0YXJ0IGRhdGUsXG4gICAgICogIDIsIHdoZW4gYm90aCBkYXRlcyBhcmUgdmFsaWRcbiAgICAgKi9cbiAgICBnZXQgX3NlbGVjdENvdW50ZXIoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlIHx8ICF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCAmJlxuICAgICAgICAgICAgKCF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0LCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCkgJiZcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIHNob3J0IHdlZWtkYXkgbmFtZS5cbiAgICAgKiBDYW4gYmUgY2hhbmdlZCBieSB1c2VyIGJ5IHByb3ZpZGluZyBvdGhlciBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIERhdGV0aW1lQWRhcHRlclxuICAgICAqL1xuICAgIGdldCBzaG9ydFdlZWtEYXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3J0V2Vla0RheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgd2Vla2RheSBuYW1lLlxuICAgICAqIENhbiBiZSBjaGFuZ2VkIGJ5IHVzZXIgYnkgcHJvdmlkaW5nIG90aGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgRGF0ZXRpbWVBZGFwdGVyXG4gICAgICovXG4gICAgZ2V0IGxvbmdXZWVrRGF5cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb25nV2Vla0RheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEZ1bmN0aW9uIHRoYXQgZ2l2ZXMgYXJyYXkgb2YgYWxsIGRpc3BsYXllZCBDYWxlbmRhckRheXNcbiAgICAgKi9cbiAgICBnZXQgX2NhbGVuZGFyRGF5TGlzdCgpOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RheVZpZXdHcmlkLnJlZHVjZSgodG90YWxDYWxlbmRhclJvd3M6IENhbGVuZGFyRGF5PEQ+W10sIGNhbGVuZGFyUm93OiBDYWxlbmRhckRheTxEPltdKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNhbGVuZGFyUm93KSB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJSb3cgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b3RhbENhbGVuZGFyUm93cy5jb25jYXQoY2FsZW5kYXJSb3cpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWaWV3IElEXG4gICAgICovXG4gICAgZ2V0IHZpZXdJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pZCArICctZGF5LXZpZXcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBXZWVrIGNvbHVtbiBoZWFkZXIgSURcbiAgICAgKi9cbiAgICBnZXQgX3dlZWtOdW1iZXJzQ29sdW1uSGVhZGVySWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy13ZWVrLWNvbHVtbi1oZWFkZXInO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUb2RheSBjZWxsIGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF90b2RheUxhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy10b2RheS1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNlbGVjdGVkIGRhdGUgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX3NlbGVjdGVkRGF0ZUxhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1zZWxlY3RlZC1kYXRlLWxhYmVsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRGF0ZSByYW5nZSBzdGFydCBkYXRlIGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF9kYXRlUmFuZ2VTdGFydExhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1yYW5nZS1zdGFydC1kYXRlLWxhYmVsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRGF0ZSByYW5nZSBlbmQgZGF0ZSBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfZGF0ZVJhbmdlRW5kTGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXJhbmdlLWVuZC1kYXRlLWxhYmVsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRGF0ZSBpbiBwYXN0IGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF9kYXRlSW5QYXN0TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLWRheS1pbi1wYXN0LWxhYmVsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgaGFuZGxlcyBkYXkgY2VsbHMga2V5ZG93biBldmVudHMsXG4gICAgICogQHBhcmFtIGV2ZW50IEtleWJvYXJkRXZlbnRcbiAgICAgKiBAcGFyYW0gY2VsbCBDYWxlbmRhckRheVxuICAgICAqIEBwYXJhbSBpbmRleCB3aXRoIHNwZWNpZmllZCBjb2x1bW4gYW5kIHJvdyBhcyBhIHggYW5kIHlcbiAgICAgKi9cbiAgICBfb25LZXlkb3duRGF5SGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCwgY2VsbDogQ2FsZW5kYXJEYXk8RD4sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uS2V5ZG93bkhhbmRsZXIoZXZlbnQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiAgTWV0aG9kIHRoYXQgYWxsb3cgdG8gZm9jdXMgZWxlbWVudHMgaW5zaWRlIHRoaXMgY29tcG9uZW50XG4gICAgICovXG4gICAgX2ZvY3VzRWxlbWVudEJ5U2VsZWN0b3IoZWxlbWVudFNlbGVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFRvRm9jdXM6IEhUTUxFbGVtZW50ID0gdGhpcy5lUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50U2VsZWN0b3IpO1xuICAgICAgICBpZiAoZWxlbWVudFRvRm9jdXM/LmZvY3VzKSB7XG4gICAgICAgICAgICBlbGVtZW50VG9Gb2N1cy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFN0YW5kYXJkaXplZCBtZXRob2QgdG8gY2FsY3VsYXRlIGdyaWQgW3hdW3ldIHRvIGluZGV4IG51bWJlciBvZiBmbGF0dGVuIGxpc3RcbiAgICAgKi9cbiAgICBfZ2V0SW5kZXgocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU2VydmljZS5nZXRJZChyb3dJbmRleCwgY29sSW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBzZWxlY3RzIHByZXZpb3VzIG1vbnRoXG4gICAgICogVHJpZ2dlcmVkIG9ubHkgd2hlbiB0aGUgbW9udGggaXMgY2hhbmdlZCBkdXJpbmcgY2hhbmdpbmcgZm9jdXNcbiAgICAgKiBBbHNvIHRyaWdnZXJzIGV2ZW50IHRvIHBhcmVudCBjYWxlbmRhciBjb21wb25lbnQgYW5kIHJlYnVpbGRzIGRheSB2aWV3IGdyaWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3RQcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB0aGlzLl9nZXRQcmV2aW91c01vbnRoKCk7XG4gICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c01vbnRoU2VsZWN0LmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgc2VsZWN0cyBuZXh0IG1vbnRoXG4gICAgICogVHJpZ2dlcmVkIG9ubHkgd2hlbiB0aGUgbW9udGggaXMgY2hhbmdlZCBkdXJpbmcgY2hhbmdpbmcgZm9jdXNcbiAgICAgKiBBbHNvIHRyaWdnZXJzIGV2ZW50IHRvIHBhcmVudCBjYWxlbmRhciBjb21wb25lbnQgYW5kIHJlYnVpbGRzIGRheSB2aWV3IGdyaWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3ROZXh0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZCA9IHRoaXMuX2dldE5leHRNb250aCgpO1xuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIHRoaXMubmV4dE1vbnRoU2VsZWN0LmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgY3JlYXRlcyBhcnJheSBvZiBDYWxlbmRhckRheSBtb2RlbHMgd2hpY2ggd2lsbCBiZSBzaG93biBvbiBkYXkgZ3JpZCxcbiAgICAgKiBkZXBlbmRpbmcgb24gY3VycmVudCBtb250aCBhbmQgeWVhci5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9wb3B1bGF0ZUNhbGVuZGFyKCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICBsZXQgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10gPSBbXTtcblxuICAgICAgICBjYWxlbmRhciA9IHRoaXMuX2dldFByZXZpb3VzTW9udGhEYXlzKGNhbGVuZGFyKTtcbiAgICAgICAgY2FsZW5kYXIgPSBjYWxlbmRhci5jb25jYXQodGhpcy5fZ2V0Q3VycmVudE1vbnRoRGF5cygpKTtcbiAgICAgICAgY2FsZW5kYXIgPSB0aGlzLl9nZXROZXh0TW9udGhEYXlzKGNhbGVuZGFyKTtcblxuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChjYWxsLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjYWxsLmlkID0gdGhpcy5fZ2V0Q2VsbElkQnlJbmRleChpbmRleCk7XG4gICAgICAgICAgICBjYWxsLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdzaW5nbGUnICYmIHRoaXMuX3NlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgX2RheSA9IGNhbGVuZGFyLmZpbmQoKGRheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF5LmRhdGUsIHRoaXMuX3NlbGVjdGVkRGF0ZSkpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRTaW5nbGVEYXkoX2RheSwgY2FsZW5kYXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsVHlwZSA9PT0gJ3JhbmdlJyAmJiB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXModGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUsIGNhbGVuZGFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxlbmRhcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgYnVpbGRzIDIgZGltZW5zaW9ucyBkYXkgdmlldyBncmlkLCBhbHNvIHNldHMgdXAgY3VycmVudGx5IGRpc3BsYXllZCBtb250aCwgb3IgeWVhcixcbiAgICAgKiB3aGVuIHRoZXJlIGlzIG5vdCBhbnkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYnVpbGREYXlWaWV3R3JpZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRseURpc3BsYXllZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0ge1xuICAgICAgICAgICAgICAgICAgICBtb250aDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5zZWxlY3RlZERhdGUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgodG9kYXkpLFxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcih0b2RheSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXlzID0gdGhpcy5fcG9wdWxhdGVDYWxlbmRhcigpO1xuICAgICAgICBjb25zdCBkYXlWaWV3R3JpZDogQ2FsZW5kYXJEYXk8RD5bXVtdID0gW107XG5cbiAgICAgICAgd2hpbGUgKGNhbGVuZGFyRGF5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkYXlWaWV3R3JpZC5wdXNoKGNhbGVuZGFyRGF5cy5zcGxpY2UoMCwgdGhpcy5fYW1vdW50T2ZDb2xzKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5yb3dBbW91bnQgPSBkYXlWaWV3R3JpZC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fZGF5Vmlld0dyaWQgPSBkYXlWaWV3R3JpZDtcbiAgICAgICAgdGhpcy5fd2Vla3MgPSB0aGlzLl9yZWZyZXNoV2Vla0NvdW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldCBpZCBvZiBjYWxlbmRhcidzIGRheSBpdGVtXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0Q2VsbElkQnlJbmRleChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1kYXktJyArIGluZGV4ICsgJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB3aGljaCBwcm92aWRlcyBhcnJheSBvZiBDYWxlbmRhckRheSxcbiAgICAgKiB3aGljaCBjb250YWlucyBldmVyeSBzaW5nbGUgZGF5IG9mIGN1cnJlbnRseSBzaG93biBtb250aC95ZWFyLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEN1cnJlbnRNb250aERheXMoKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGg7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyO1xuICAgICAgICBjb25zdCBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10gPSBbXTtcbiAgICAgICAgY29uc3QgYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg6IG51bWJlciA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCAxKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b2RheSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci50b2RheSgpO1xuICAgICAgICBmb3IgKGxldCBkYXlOdW1iZXIgPSAxOyBkYXlOdW1iZXIgPD0gYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg7IGRheU51bWJlcisrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlOiBEID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRheU51bWJlcik7XG4gICAgICAgICAgICBjYWxlbmRhckRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLFxuICAgICAgICAgICAgICAgIG1vbnRoU3RhdHVzOiAnY3VycmVudCcsXG4gICAgICAgICAgICAgICAgY3VycmVudDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwodG9kYXksIGRhdGUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5fZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXMpO1xuICAgICAgICBjZWxsICYmIChjZWxsLmlzVGFiSW5kZXhlZCA9IHRydWUpO1xuICAgICAgICByZXR1cm4gY2FsZW5kYXJEYXlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIGFjdGl2ZSBjZWxsLCB3aGljaCBtZWFuczpcbiAgICAgKiBpZiB0aGVyZSBpcyBhbnkgc2VsZWN0ZWQgZGF5LCByZXR1cm4gc2VsZWN0ZWQgZGF5XG4gICAgICogaWYgdGhlcmUgaXMgbm8gc2VsZWN0ZWQgZGF5LCBidXQgdGhlcmUgaXMgdG9kYXkgZGF5LCByZXR1cm4gdG9kYXkgZGF5XG4gICAgICogaWYgdGhlcmUgaXMgbm8gdG9kYXksIG9yIHNlbGVjdGVkLCByZXR1cm4gZmlyc3Qgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gbmV3IENhbGVuZGFyQWN0aXZlRGF5Q2VsbFN0cmF0ZWd5PEQ+KCkuZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2Qgd2hpY2ggcHJvdmlkZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXksXG4gICAgICogd2hpY2ggY29udGFpbnMgbGFzdCAwLTYgZGF5cyBvZiBwcmV2aW91cyBtb250aC95ZWFyLiBUaGVzZXMgZGF5c1xuICAgICAqIGZpbGxzIHRoZSBnYXAgYmV0d2VlbiBzdGFydGluZyBzdGFydGluZ0RheU9mV2VlayBhbmQgZmlyc3QgZGF5IG9mIGN1cnJlbnQgbW9udGhcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRQcmV2aW91c01vbnRoRGF5cyhjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA+IDEgPyB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCAtIDEgOiAxMjtcbiAgICAgICAgY29uc3QgeWVhciA9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA+IDEgPyB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyIDogdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciAtIDE7XG4gICAgICAgIGNvbnN0IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTGFzdERhdGUgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGgpO1xuICAgICAgICBjb25zdCBwcmV2TW9udGhMYXN0RGF5ID0gYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg7XG4gICAgICAgIGxldCBwcmV2TW9udGhMYXN0V2Vla0RheSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWsocHJldk1vbnRoTGFzdERhdGUpIC0gdGhpcy5zdGFydGluZ0RheU9mV2VlaztcblxuICAgICAgICAvKiogQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIHNvbWUgZGF5cyBjdXQgYnkgc3RhcnRpbmdEYXlPZldlZWsgb3B0aW9uXG4gICAgICAgICAqICBJZiB5ZXMsIHRoZXJlIGlzIHdob2xlIHdlZWsgYWRkZWQsIHRvIGF2b2lkIGhpZGluZ1xuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHByZXZNb250aExhc3RXZWVrRGF5IDwgMCkge1xuICAgICAgICAgICAgcHJldk1vbnRoTGFzdFdlZWtEYXkgPSBwcmV2TW9udGhMYXN0V2Vla0RheSArIDc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldk1vbnRoTGFzdFdlZWtEYXkgPCA2KSB7XG4gICAgICAgICAgICB3aGlsZSAocHJldk1vbnRoTGFzdFdlZWtEYXkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNb250aERheSA9IHByZXZNb250aExhc3REYXkgLSBwcmV2TW9udGhMYXN0V2Vla0RheTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIHByZXZNb250aERheSk7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJEYXlzLnB1c2goeyAuLi50aGlzLl9nZXREYXkoZGF0ZSksIG1vbnRoU3RhdHVzOiAncHJldmlvdXMnIH0pO1xuICAgICAgICAgICAgICAgIHByZXZNb250aExhc3RXZWVrRGF5LS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGVuZGFyRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHdoaWNoIHByb3ZpZGVzIGFycmF5IG9mIENhbGVuZGFyRGF5LCB3aGljaCBjb250YWlucyBmaXJzdCBkYXlzIG9mIG5leHQgbW9udGgveWVhci4gVGhlc2VzIGRheXNcbiAgICAgKiBmaWxscyB0aGUgZ2FwIGJldHdlZW4gbGFzdCBkYXkgb2YgY3VycmVudCBkYXkgYW5kIGVuZCBvZiA2LXdlZWtzIGNhbGVuZGFyIGdyaWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dE1vbnRoRGF5cyhjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggKyAxIDogMTtcbiAgICAgICAgY29uc3QgeWVhciA9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciA6IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgKyAxO1xuXG4gICAgICAgIC8vIFRoZSBjYWxlbmRhciBncmlkIGNhbiBoYXZlIDUgKDM1IGRheXMpIG9yIDYgKDQyIGRheXMpIHdlZWtzXG4gICAgICAgIGNvbnN0IG5leHRNb250aERpc3BsYXllZERheXMgPSAoNDIgLSBjYWxlbmRhckRheXMubGVuZ3RoKSAlIDc7XG5cbiAgICAgICAgZm9yIChsZXQgbmV4dEQgPSAxOyBuZXh0RCA8PSBuZXh0TW9udGhEaXNwbGF5ZWREYXlzOyBuZXh0RCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIG5leHREKTtcbiAgICAgICAgICAgIGNhbGVuZGFyRGF5cy5wdXNoKHsgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLCBtb250aFN0YXR1czogJ25leHQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxlbmRhckRheXM7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc1dlZWtlbmREYXkoZGF5T2ZXZWVrOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGRheU9mV2VlayA9PT0gMSB8fCBkYXlPZldlZWsgPT09IDc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGdlbmVyYXRlcyB3aG9sZSBkYXkgbW9kZWwgYmFzaW5nIG9uIGRhdGUsIGRpc2FibGluZyBmdW5jdGlvbnMsIGJsb2NrIGZ1bmN0aW9ucywgYW5kIGFjdHVhbGx5XG4gICAgICogY2hvc2VuIHJhbmdlIC8gc2luZ2xlIGRhdGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0RGF5KGRhdGU6IEQpOiBDYWxlbmRhckRheTxEPiB7XG4gICAgICAgIGNvbnN0IHdlZWtEYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKGRhdGUpO1xuICAgICAgICBjb25zdCBkYXlPZk1vbnRoID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERhdGUoZGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXRlTmFtZXMoKTtcbiAgICAgICAgY29uc3QgaXNQYXN0ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKGRhdGUsIHRoaXMuX2RhdGVUaW1lQWRhcHRlci50b2RheSgpKSA8IDA7XG4gICAgICAgIGNvbnN0IGRheTogQ2FsZW5kYXJEYXk8RD4gPSB7XG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgbGFiZWw6IGRhdGVOYW1lc1tkYXlPZk1vbnRoIC0gMV0sXG4gICAgICAgICAgICB3ZWVrRGF5LFxuICAgICAgICAgICAgd2Vla2VuZDogdGhpcy5faXNXZWVrZW5kRGF5KHdlZWtEYXkpLFxuICAgICAgICAgICAgYXJpYUxhYmVsOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuX2RhdGVUaW1lRm9ybWF0cy5kaXNwbGF5LmRhdGVBMTF5TGFiZWwpLFxuICAgICAgICAgICAgc3BlY2lhbE51bWJlcjogdGhpcy5fZ2V0U3BlY2lhbERheShkYXRlKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICBwYXN0OiBpc1Bhc3RcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogQXBwbHkgZGlzYWJsZWQgc3RhdGUgdG8gZGF5cyBtYXJrZWQgd2l0aCBwYXNzZWQgZnVuY3Rpb24gKi9cbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBkYXkuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVGdW5jdGlvbihkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGlzIGNhbGxlZCB0byByZWZyZXNoIGkxOG4gc2hvcnQgd2VlayBkYXlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzaG9ydERheU9mV2Vla05hbWVzID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdzaG9ydCcpO1xuICAgICAgICBjb25zdCBkYXlPZldlZWtOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbG9uZycpO1xuXG4gICAgICAgIHRoaXMuX3Nob3J0V2Vla0RheXMgPSBzaG9ydERheU9mV2Vla05hbWVzXG4gICAgICAgICAgICAuc2xpY2UodGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpXG4gICAgICAgICAgICAuY29uY2F0KHNob3J0RGF5T2ZXZWVrTmFtZXMuc2xpY2UoMCwgdGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpKTtcblxuICAgICAgICB0aGlzLl9sb25nV2Vla0RheXMgPSBkYXlPZldlZWtOYW1lc1xuICAgICAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKVxuICAgICAgICAgICAgLmNvbmNhdChkYXlPZldlZWtOYW1lcy5zbGljZSgwLCB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrIC0gMSkpO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXRzIHNwZWNpYWwgZGF5IG51bWJlciBvZiBzcGVjaWZpZWQgZGF0ZSBtb2RlbFxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldFNwZWNpYWxEYXkoZGF0ZTogRCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBzcGVjaWFsRGF5ID0gdGhpcy5zcGVjaWFsRGF5c1J1bGVzLmZpbmQoKHNwZWNpYWxEYXlSdWxlKSA9PiBzcGVjaWFsRGF5UnVsZS5ydWxlKGRhdGUpKTtcbiAgICAgICAgaWYgKHNwZWNpYWxEYXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzcGVjaWFsRGF5LnNwZWNpYWxEYXlOdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgYXJyYXkgb2Ygd2VlaydzIGNvdW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfcmVmcmVzaFdlZWtDb3VudCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF5TGlzdCA9IHRoaXMuX2NhbGVuZGFyRGF5TGlzdDtcbiAgICAgICAgY29uc3Qgd2Vla051bWJlcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gNjsgaW5kZXggPCBjYWxlbmRhckRheUxpc3QubGVuZ3RoOyBpbmRleCA9IGluZGV4ICsgNikge1xuICAgICAgICAgICAgd2Vla051bWJlcnMucHVzaCh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0V2Vla05hbWUoY2FsZW5kYXJEYXlMaXN0W2luZGV4XS5kYXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtOdW1iZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXQgeWVhciBhbmQgbW9udGggZm9yIHByZXZpb3VzIHllYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRQcmV2aW91c01vbnRoKCk6IENhbGVuZGFyQ3VycmVudCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciwgbW9udGg6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCAtIDEgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHllYXI6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyIC0gMSwgbW9udGg6IDEyIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0IHllYXIgYW5kIG1vbnRoIGZvciBuZXh0IHllYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXROZXh0TW9udGgoKTogQ2FsZW5kYXJDdXJyZW50IHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyKSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciwgbW9udGg6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCArIDEgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHllYXI6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyICsgMSwgbW9udGg6IDEgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdG8gcHV0IGNvbmZpZ3VyYXRpb24gYW5kIGxpc3RlbmVycyBvbiBjYWxlbmRhciBrZXlib2FyZCBzZXJ2aWNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0dXBLZXlib2FyZFNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmNvbEFtb3VudCA9IHRoaXMuX2Ftb3VudE9mQ29scztcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5mb2N1c0VzY2FwZUZ1bmN0aW9uID0gdGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uRm9jdXNJZENoYW5nZS5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbktleVNlbGVjdC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKHRoaXMuX2NhbGVuZGFyRGF5TGlzdFtpbmRleF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbkxpc3RTdGFydEFwcHJvYWNoLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RQcmV2aW91c01vbnRoKCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENhbGN1bGF0ZSBmb2N1c2VkIGNlbGwgaW4gbmV3IGdyaWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNb250aCA9IHRoaXMuX2dldE5leHRNb250aCgpOyAvLyBtb250aCB0aGF0IHdhcyBiZWZvcmUgbW92aW5nIGJhY2tcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQW1vdW50T2ZXZWVrcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRBbW91bnRPZldlZWtzKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTW9udGgueWVhcixcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1vbnRoLm1vbnRoLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRpbmdEYXlPZldlZWtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcmV2TW9udGhBbW91bnRPZldlZWtzID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldEFtb3VudE9mV2Vla3MoXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLm1vbnRoLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRpbmdEYXlPZldlZWtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyB0cmlnZ2VyIHJlbmRlcmluZyBmb3IgbmV3IGdyaWQgc28gZm9jdXMgY2FuIGJlIHNldFxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXggLSA3ICogKG9yaWdpbmFsQW1vdW50T2ZXZWVrcyAtIHByZXZNb250aEFtb3VudE9mV2Vla3MpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25MaXN0RW5kQXBwcm9hY2gucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE5leHRNb250aCgpO1xuICAgICAgICAgICAgLy8gdHJpZ2dlciByZW5kZXJpbmcgZm9yIG5ldyBncmlkIHNvIGZvY3VzIGNhbiBiZSBzZXRcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIENoYW5nZSBzZWxlY3Rpb24gZmxhZyBvbiBkYXlzIHRvIGZhbHNlLCBiZXNpZGVzIHRoZSBzZWxlY3RlZCBvbmVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaGFuZ2VTZWxlY3RlZFNpbmdsZURheShkYXk6IENhbGVuZGFyRGF5PEQ+IHwgdW5kZWZpbmVkLCBjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICAgIGlmIChkYXkgJiYgIWRheS5ibG9ja2VkICYmICFkYXkuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGRheS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWZyZXNoVGFiSW5kZXgoY2FsZW5kYXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBDaGFuZ2UgcHJvcGVydGllcyBvZiByYW5nZSBkYXlzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRvIG5vdCByZWJ1aWxkIHdob2xlIGdyaWQgZnJvbSBzY3JhdGNoLFxuICAgICAqIGl0IGp1c3QgY2hhbmdlcyBwcm9wZXJ0aWVzIG9mIG5ld2x5IHNlbGVjdGVkL3Vuc2VsZWN0ZWQgZGF5cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaGFuZ2VTZWxlY3RlZFJhbmdlRGF5cyhkYXRlczogRGF0ZVJhbmdlPEQ+LCBjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICAvKiogUHVsbCBsaXN0IG9mIGNhbGVuZGFyIGRheXMgKi9cbiAgICAgICAgY29uc3QgY2FsZW5kYXJMaXN0ID0gY2FsZW5kYXI7XG5cbiAgICAgICAgLyoqIFJlc2V0IGNoYW5naW5nIHByb3BlcnRpZXMgKi9cbiAgICAgICAgY2FsZW5kYXJMaXN0LmZvckVhY2goXG4gICAgICAgICAgICAoX2RheSkgPT5cbiAgICAgICAgICAgICAgICAoX2RheS5zZWxlY3RlZEZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZExhc3QgPVxuICAgICAgICAgICAgICAgICAgICBfZGF5LnNlbGVjdGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5pc1RhYkluZGV4ZWQgPVxuICAgICAgICAgICAgICAgICAgICBfZGF5LmRpc2FibGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5ob3ZlclJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZFJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkYXRlcykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0RGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBlbmREYXk6IENhbGVuZGFyRGF5PEQ+IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGRhdGVzLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgLyoqIEZpbmQgc3RhcnQgZGF0ZSBhbmQgbWFyayBpdCBhcyBzZWxlY3RlZCAqL1xuICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gY2FsZW5kYXJMaXN0LmZpbmQoKF9kYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKF9kYXkuZGF0ZSwgZGF0ZXMuc3RhcnQpKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ICYmXG4gICAgICAgICAgICAgICAgICAgICFzdGFydERheS5ibG9ja2VkICYmXG4gICAgICAgICAgICAgICAgICAgICFzdGFydERheS5kaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbihzdGFydERheS5kYXRlKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGFydERheS5zZWxlY3RlZEZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgLyoqIEZpbmQgZW5kIGRhdGUgYW5kIG1hcmsgaXQgYXMgc2VsZWN0ZWQgKi9cbiAgICAgICAgICAgICAgICBlbmREYXkgPSBjYWxlbmRhckxpc3QuZmluZCgoX2RheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoX2RheS5kYXRlLCBkYXRlcy5lbmQpKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVuZERheSAmJlxuICAgICAgICAgICAgICAgICAgICAhZW5kRGF5LmJsb2NrZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIWVuZERheS5kaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24gIT09ICdmdW5jdGlvbicgfHwgIXRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24oZW5kRGF5LmRhdGUpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBlbmREYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBlbmREYXkuc2VsZWN0ZWRMYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiBWZXJpZnkgaWYgc3RhcnQgZGF5IGFuZCBlbmQgZGF5IGlzIHZhbGlkLCBvdGhlcndpc2UgZG9uJ3QgcHV0IHJhbmdlIHNlbGVjdGlvbiAqL1xuICAgICAgICAgICAgaWYgKGRhdGVzLnN0YXJ0ICYmIGRhdGVzLmVuZCkge1xuICAgICAgICAgICAgICAgIC8qKiBNYXJrIGFsbCBkYXlzLCB3aGljaCBhcmUgYmV0d2VlbiBzdGFydCBhbmQgZW5kIGRhdGUgKi9cbiAgICAgICAgICAgICAgICBjYWxlbmRhckxpc3RcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIChfZGF5KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZGF5LnNlbGVjdGVkUmFuZ2UgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNCZXR3ZWVuKF9kYXkuZGF0ZSwgZGF0ZXMuc3RhcnQhLCBkYXRlcy5lbmQhKSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuc2VsZWN0ZWRSYW5nZSA9IHRydWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaFRhYkluZGV4KGNhbGVuZGFyTGlzdCk7XG5cbiAgICAgICAgLyoqIEFwcGx5IGRpc2FibGVkIHN0YXRlIHRvIGRheXMgbWFya2VkIHdpdGggcGFzc2VkIGZ1bmN0aW9uICovXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVGdW5jdGlvbikge1xuICAgICAgICAgICAgY2FsZW5kYXJMaXN0LmZvckVhY2goKF9kYXkpID0+IChfZGF5LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRnVuY3Rpb24hKF9kYXkuZGF0ZSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMCB8fCB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAyKSAmJiB0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IF9kYXkuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uIShfZGF5LmRhdGUpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxICYmIHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IF9kYXkuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlUmFuZ2VFbmRGdW5jdGlvbiEoX2RheS5kYXRlKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlZnJlc2hUYWJJbmRleChjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5pc1RhYkluZGV4ZWQgPSBmYWxzZSkpO1xuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5fZ2V0QWN0aXZlQ2VsbChjYWxlbmRhci5maWx0ZXIoKF9kYXkpID0+IF9kYXkubW9udGhTdGF0dXMgPT09ICdjdXJyZW50JykpO1xuICAgICAgICBjZWxsICYmIChjZWxsLmlzVGFiSW5kZXhlZCA9IHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBmb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c0VsZW1lbnRCeVNlbGVjdG9yKGAjJHt0aGlzLl9nZXRDZWxsSWRCeUluZGV4KGluZGV4KX1gKTtcbiAgICB9XG59XG4iLCI8dGFibGVcbiAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19jb250ZW50IGZkLWNhbGVuZGFyX19jb250ZW50LS1kYXRlc1wiXG4gICAgcm9sZT1cImdyaWRcIlxuICAgIFthdHRyLmFyaWEtcm9sZWRlc2NyaXB0aW9uXT1cIidjb3JlQ2FsZW5kYXIuY2FsZW5kYXJEYXlWaWV3RGVzY3JpcHRpb24nIHwgZmRUcmFuc2xhdGVcIlxuPlxuICAgIDx0aGVhZCBjbGFzcz1cImZkLWNhbGVuZGFyX19ncm91cFwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93V2Vla051bWJlcnNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW0gZmQtY2FsZW5kYXJfX2l0ZW0tLXNpZGUtaGVscGVyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInY29yZUNhbGVuZGFyLndlZWtDb2x1bW5MYWJlbCcgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+PC90aD5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW0gZmQtY2FsZW5kYXJfX2l0ZW0tLXNpZGUtaGVscGVyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIHNob3J0V2Vla0RheXM7IGluZGV4IGFzIGlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9uZ1dlZWtEYXlzW2ldXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RleHQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZkLWNhbGVuZGFyX190ZXh0XCI+e3sgZGF5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keSBjbGFzcz1cImZkLWNhbGVuZGFyX19ncm91cFwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgcm9sZT1cInJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgX2RheVZpZXdHcmlkOyBsZXQgcm93SW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93V2Vla051bWJlcnNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW0gZmQtY2FsZW5kYXJfX2l0ZW0tLXNpZGUtaGVscGVyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicm93aGVhZGVyXCJcbiAgICAgICAgICAgICAgICBzY29wZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mZC1jYWxlbmRhci13ZWVrXT1cIl93ZWVrc1tyb3dJbmRleF1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cInZpZXdJZCArICctd2Vlay0nICsgX3dlZWtzW3Jvd0luZGV4XVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIl93ZWVrTnVtYmVyc0NvbHVtbkhlYWRlcklkICsgJyAnICsgKHZpZXdJZCArICctd2Vlay0nICsgX3dlZWtzW3Jvd0luZGV4XSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dC13cmFwcGVyXCIgKm5nSWY9XCJfd2Vla3MgJiYgX3dlZWtzW3Jvd0luZGV4XVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZkLWNhbGVuZGFyX190ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBfd2Vla3Nbcm93SW5kZXhdIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW1cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93OyBsZXQgY2VsbEluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tc2VsZWN0ZWRdPVwiY2VsbC5zZWxlY3RlZEZpcnN0IHx8IGNlbGwuc2VsZWN0ZWRMYXN0IHx8IGNlbGwuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tcmFuZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkUmFuZ2UgfHwgY2VsbC5ob3ZlclJhbmdlKSAmJiAhY2VsbC5zZWxlY3RlZEZpcnN0ICYmICFjZWxsLnNlbGVjdGVkTGFzdFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS10b2RheV09XCJjZWxsLmN1cnJlbnRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0td2Vla2VuZF09XCJjZWxsLndlZWtlbmQgJiYgbWFya1dlZWtlbmRzICYmIGNlbGwubW9udGhTdGF0dXMgPT09ICdjdXJyZW50J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS1vdGhlcl09XCJjZWxsLm1vbnRoU3RhdHVzICE9PSAnY3VycmVudCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kaXNhYmxlZF09XCJjZWxsLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2VsbC5zcGVjaWFsTnVtYmVyID8gJ2ZkLWNhbGVuZGFyX19pdGVtLS1sZWdlbmQtJyArIGNlbGwuc3BlY2lhbE51bWJlciA6ICcnXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZkLWNhbGVuZGFyLWRhdGUtZGF5XT1cImNlbGwubGFiZWxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZmQtY2FsZW5kYXItZGF5XT1cImNlbGwuaW5kZXhcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiY2VsbC5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJjZWxsLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjZWxsLmlzVGFiSW5kZXhlZCA/IDAgOiAtMVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoY2VsbCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiX3JlZnJlc2hIb3ZlclJhbmdlKGNlbGwpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJfb25LZXlkb3duRGF5SGFuZGxlcigkZXZlbnQsIGNlbGwsIF9nZXRJbmRleChyb3dJbmRleCwgY2VsbEluZGV4KSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX190ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuaWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICctYXJpYS1sYWJlbCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2VsbC5zZWxlY3RlZEZpcnN0ID8gX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZCArICcgJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWRMYXN0ID8gX2RhdGVSYW5nZUVuZExhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLmN1cnJlbnQgPyBfdG9kYXlMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2VsbC5zZWxlY3RlZCAmJiBjYWxUeXBlID09PSAnc2luZ2xlJyA/IF9zZWxlY3RlZERhdGVMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2VsbC5wYXN0ID8gX2RhdGVJblBhc3RMYWJlbElkIDogJycpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGNlbGwubGFiZWwgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBoaWRkZW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW2F0dHIuaWRdPVwiY2VsbC5pZCArICctYXJpYS1sYWJlbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNlbGwuYXJpYUxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiAqbmdJZj1cIl9kYXlWaWV3R3JpZC5sZW5ndGggPD0gNVwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW0gaGlkZGVuLWRheVwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiAqbmdJZj1cIl9kYXlWaWV3R3JpZC5sZW5ndGggPT09IDRcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGhpZGRlbi1kYXlcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGJvZHk+XG48L3RhYmxlPlxuXG48IS0tIEhpZGRlbiBlbGVtZW50cyBmb3IgYXJpYSBwdXJwb3NlcyAtLT5cbjxkaXYgaGlkZGVuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX3RvZGF5TGFiZWxJZFwiPnt7ICdjb3JlQ2FsZW5kYXIudG9kYXlMYWJlbCcgfCBmZFRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX3NlbGVjdGVkRGF0ZUxhYmVsSWRcIj57eyAnY29yZUNhbGVuZGFyLmRhdGVTZWxlY3RlZExhYmVsJyB8IGZkVHJhbnNsYXRlIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZVJhbmdlU3RhcnRMYWJlbElkXCI+e3sgJ2NvcmVDYWxlbmRhci5yYW5nZVN0YXJ0TGFiZWwnIHwgZmRUcmFuc2xhdGUgfX08L2Rpdj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl9kYXRlUmFuZ2VFbmRMYWJlbElkXCI+e3sgJ2NvcmVDYWxlbmRhci5yYW5nZUVuZExhYmVsJyB8IGZkVHJhbnNsYXRlIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZUluUGFzdExhYmVsSWRcIj57eyAnY29yZUNhbGVuZGFyLmRheUluUGFzdExhYmVsJyB8IGZkVHJhbnNsYXRlIH19PC9kaXY+XG48L2Rpdj5cbiJdfQ==