igniteui-angular 16.0.0-beta.2 → 16.0.0-beta.3

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 (348) hide show
  1. package/esm2022/lib/accordion/accordion.component.mjs +4 -4
  2. package/esm2022/lib/accordion/accordion.module.mjs +5 -5
  3. package/esm2022/lib/action-strip/action-strip.component.mjs +7 -7
  4. package/esm2022/lib/action-strip/action-strip.module.mjs +5 -5
  5. package/esm2022/lib/action-strip/grid-actions/grid-action-button.component.mjs +4 -4
  6. package/esm2022/lib/action-strip/grid-actions/grid-actions-base.directive.mjs +4 -4
  7. package/esm2022/lib/action-strip/grid-actions/grid-editing-actions.component.mjs +4 -4
  8. package/esm2022/lib/action-strip/grid-actions/grid-pinning-actions.component.mjs +4 -4
  9. package/esm2022/lib/avatar/avatar.component.mjs +4 -4
  10. package/esm2022/lib/avatar/avatar.module.mjs +5 -5
  11. package/esm2022/lib/badge/badge.component.mjs +4 -4
  12. package/esm2022/lib/badge/badge.module.mjs +5 -5
  13. package/esm2022/lib/banner/banner.component.mjs +4 -4
  14. package/esm2022/lib/banner/banner.directives.mjs +4 -4
  15. package/esm2022/lib/banner/banner.module.mjs +5 -5
  16. package/esm2022/lib/buttonGroup/buttonGroup.component.mjs +4 -4
  17. package/esm2022/lib/buttonGroup/buttongroup.module.mjs +5 -5
  18. package/esm2022/lib/calendar/calendar-base.mjs +4 -4
  19. package/esm2022/lib/calendar/calendar.component.mjs +4 -4
  20. package/esm2022/lib/calendar/calendar.directives.mjs +16 -16
  21. package/esm2022/lib/calendar/calendar.module.mjs +5 -5
  22. package/esm2022/lib/calendar/days-view/day-item.component.mjs +4 -4
  23. package/esm2022/lib/calendar/days-view/days-view.component.mjs +4 -4
  24. package/esm2022/lib/calendar/days-view/daysview-navigation.service.mjs +4 -4
  25. package/esm2022/lib/calendar/month-picker/month-picker-base.mjs +4 -4
  26. package/esm2022/lib/calendar/month-picker/month-picker.component.mjs +4 -4
  27. package/esm2022/lib/calendar/months-view/months-view.component.mjs +4 -4
  28. package/esm2022/lib/calendar/months-view.pipe.mjs +7 -7
  29. package/esm2022/lib/calendar/years-view/years-view.component.mjs +7 -7
  30. package/esm2022/lib/card/card.component.mjs +28 -28
  31. package/esm2022/lib/card/card.module.mjs +5 -5
  32. package/esm2022/lib/carousel/carousel.component.mjs +7 -7
  33. package/esm2022/lib/carousel/carousel.directives.mjs +10 -10
  34. package/esm2022/lib/carousel/carousel.module.mjs +5 -5
  35. package/esm2022/lib/carousel/slide.component.mjs +4 -4
  36. package/esm2022/lib/checkbox/checkbox.component.mjs +4 -4
  37. package/esm2022/lib/checkbox/checkbox.module.mjs +5 -5
  38. package/esm2022/lib/chips/chip.component.mjs +4 -4
  39. package/esm2022/lib/chips/chips-area.component.mjs +4 -4
  40. package/esm2022/lib/chips/chips.module.mjs +5 -5
  41. package/esm2022/lib/combo/combo-add-item.component.mjs +4 -4
  42. package/esm2022/lib/combo/combo-dropdown.component.mjs +4 -4
  43. package/esm2022/lib/combo/combo-item.component.mjs +4 -4
  44. package/esm2022/lib/combo/combo.api.mjs +4 -4
  45. package/esm2022/lib/combo/combo.common.mjs +4 -4
  46. package/esm2022/lib/combo/combo.component.mjs +4 -4
  47. package/esm2022/lib/combo/combo.directives.mjs +25 -25
  48. package/esm2022/lib/combo/combo.module.mjs +5 -5
  49. package/esm2022/lib/combo/combo.pipes.mjs +7 -7
  50. package/esm2022/lib/core/density.mjs +4 -4
  51. package/esm2022/lib/core/navigation/directives.mjs +7 -7
  52. package/esm2022/lib/core/navigation/nav.service.mjs +4 -4
  53. package/esm2022/lib/core/selection.mjs +4 -4
  54. package/esm2022/lib/core/touch.mjs +4 -4
  55. package/esm2022/lib/core/utils.mjs +4 -4
  56. package/esm2022/lib/date-common/calendar-container/calendar-container.component.mjs +4 -4
  57. package/esm2022/lib/date-common/picker-base.directive.mjs +4 -4
  58. package/esm2022/lib/date-common/picker-icons.common.mjs +10 -10
  59. package/esm2022/lib/date-picker/date-picker.component.mjs +4 -4
  60. package/esm2022/lib/date-picker/date-picker.module.mjs +5 -5
  61. package/esm2022/lib/date-range-picker/date-range-picker-inputs.common.mjs +16 -16
  62. package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +4 -4
  63. package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +5 -5
  64. package/esm2022/lib/dialog/dialog.component.mjs +4 -4
  65. package/esm2022/lib/dialog/dialog.directives.mjs +7 -7
  66. package/esm2022/lib/dialog/dialog.module.mjs +5 -5
  67. package/esm2022/lib/directives/autocomplete/autocomplete.directive.mjs +4 -4
  68. package/esm2022/lib/directives/autocomplete/autocomplete.module.mjs +5 -5
  69. package/esm2022/lib/directives/button/button.directive.mjs +4 -4
  70. package/esm2022/lib/directives/button/button.module.mjs +5 -5
  71. package/esm2022/lib/directives/date-time-editor/date-time-editor.directive.mjs +4 -4
  72. package/esm2022/lib/directives/date-time-editor/date-time-editor.module.mjs +5 -5
  73. package/esm2022/lib/directives/divider/divider.directive.mjs +4 -4
  74. package/esm2022/lib/directives/divider/divider.module.mjs +5 -5
  75. package/esm2022/lib/directives/drag-drop/drag-drop.directive.mjs +13 -13
  76. package/esm2022/lib/directives/drag-drop/drag-drop.module.mjs +5 -5
  77. package/esm2022/lib/directives/filter/filter.directive.mjs +7 -7
  78. package/esm2022/lib/directives/filter/filter.module.mjs +5 -5
  79. package/esm2022/lib/directives/focus/focus.directive.mjs +4 -4
  80. package/esm2022/lib/directives/focus/focus.module.mjs +5 -5
  81. package/esm2022/lib/directives/focus-trap/focus-trap.directive.mjs +4 -4
  82. package/esm2022/lib/directives/focus-trap/focus-trap.module.mjs +5 -5
  83. package/esm2022/lib/directives/for-of/base.helper.component.mjs +4 -4
  84. package/esm2022/lib/directives/for-of/display.container.mjs +4 -4
  85. package/esm2022/lib/directives/for-of/for_of.directive.mjs +7 -7
  86. package/esm2022/lib/directives/for-of/for_of.module.mjs +5 -5
  87. package/esm2022/lib/directives/for-of/for_of.sync.service.mjs +7 -7
  88. package/esm2022/lib/directives/for-of/horizontal.virtual.helper.component.mjs +4 -4
  89. package/esm2022/lib/directives/for-of/virtual.helper.component.mjs +4 -4
  90. package/esm2022/lib/directives/form-control/form-control.directive.mjs +4 -4
  91. package/esm2022/lib/directives/form-control/form-control.module.mjs +5 -5
  92. package/esm2022/lib/directives/hint/hint.directive.mjs +4 -4
  93. package/esm2022/lib/directives/input/input.directive.mjs +4 -4
  94. package/esm2022/lib/directives/label/label.directive.mjs +4 -4
  95. package/esm2022/lib/directives/layout/layout.directive.mjs +7 -7
  96. package/esm2022/lib/directives/layout/layout.module.mjs +5 -5
  97. package/esm2022/lib/directives/mask/mask-parsing.service.mjs +4 -4
  98. package/esm2022/lib/directives/mask/mask.directive.mjs +4 -4
  99. package/esm2022/lib/directives/mask/mask.module.mjs +5 -5
  100. package/esm2022/lib/directives/notification/notifications.directive.mjs +4 -4
  101. package/esm2022/lib/directives/prefix/prefix.directive.mjs +4 -4
  102. package/esm2022/lib/directives/radio/radio-group.directive.mjs +4 -4
  103. package/esm2022/lib/directives/radio/radio-group.module.mjs +5 -5
  104. package/esm2022/lib/directives/ripple/ripple.directive.mjs +4 -4
  105. package/esm2022/lib/directives/ripple/ripple.module.mjs +5 -5
  106. package/esm2022/lib/directives/scroll-inertia/scroll_inertia.directive.mjs +4 -4
  107. package/esm2022/lib/directives/scroll-inertia/scroll_inertia.module.mjs +5 -5
  108. package/esm2022/lib/directives/suffix/suffix.directive.mjs +4 -4
  109. package/esm2022/lib/directives/template-outlet/template_outlet.directive.mjs +4 -4
  110. package/esm2022/lib/directives/text-highlight/text-highlight.directive.mjs +4 -4
  111. package/esm2022/lib/directives/text-highlight/text-highlight.module.mjs +5 -5
  112. package/esm2022/lib/directives/text-selection/text-selection.directive.mjs +4 -4
  113. package/esm2022/lib/directives/text-selection/text-selection.module.mjs +5 -5
  114. package/esm2022/lib/directives/toggle/toggle.directive.mjs +10 -10
  115. package/esm2022/lib/directives/toggle/toggle.module.mjs +5 -5
  116. package/esm2022/lib/directives/tooltip/tooltip-target.directive.mjs +4 -4
  117. package/esm2022/lib/directives/tooltip/tooltip.component.mjs +4 -4
  118. package/esm2022/lib/directives/tooltip/tooltip.directive.mjs +4 -4
  119. package/esm2022/lib/directives/tooltip/tooltip.module.mjs +5 -5
  120. package/esm2022/lib/drop-down/drop-down-group.component.mjs +4 -4
  121. package/esm2022/lib/drop-down/drop-down-item.base.mjs +4 -4
  122. package/esm2022/lib/drop-down/drop-down-item.component.mjs +4 -4
  123. package/esm2022/lib/drop-down/drop-down-navigation.directive.mjs +4 -4
  124. package/esm2022/lib/drop-down/drop-down.base.mjs +4 -4
  125. package/esm2022/lib/drop-down/drop-down.component.mjs +4 -4
  126. package/esm2022/lib/drop-down/drop-down.module.mjs +5 -5
  127. package/esm2022/lib/expansion-panel/expansion-panel-body.component.mjs +4 -4
  128. package/esm2022/lib/expansion-panel/expansion-panel-header.component.mjs +4 -4
  129. package/esm2022/lib/expansion-panel/expansion-panel.common.mjs +4 -4
  130. package/esm2022/lib/expansion-panel/expansion-panel.component.mjs +4 -4
  131. package/esm2022/lib/expansion-panel/expansion-panel.directives.mjs +10 -10
  132. package/esm2022/lib/expansion-panel/expansion-panel.module.mjs +5 -5
  133. package/esm2022/lib/expansion-panel/toggle-animation-component.mjs +4 -4
  134. package/esm2022/lib/grids/api.service.mjs +4 -4
  135. package/esm2022/lib/grids/cell.component.mjs +4 -4
  136. package/esm2022/lib/grids/column-actions/column-actions-base.directive.mjs +4 -4
  137. package/esm2022/lib/grids/column-actions/column-actions.component.mjs +13 -13
  138. package/esm2022/lib/grids/column-actions/column-hiding.directive.mjs +4 -4
  139. package/esm2022/lib/grids/column-actions/column-pinning.directive.mjs +4 -4
  140. package/esm2022/lib/grids/column-actions/public_api.mjs +13 -0
  141. package/esm2022/lib/grids/columns/column-group.component.mjs +4 -4
  142. package/esm2022/lib/grids/columns/column-layout.component.mjs +4 -4
  143. package/esm2022/lib/grids/columns/column.component.mjs +4 -4
  144. package/esm2022/lib/grids/columns/templates.directive.mjs +25 -25
  145. package/esm2022/lib/grids/columns/validators.directive.mjs +22 -22
  146. package/esm2022/lib/grids/common/crud.service.mjs +4 -4
  147. package/esm2022/lib/grids/common/pipes.mjs +55 -55
  148. package/esm2022/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.mjs +4 -4
  149. package/esm2022/lib/grids/filtering/base/grid-filtering-cell.component.mjs +4 -4
  150. package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +4 -4
  151. package/esm2022/lib/grids/filtering/excel-style/base-filtering.component.mjs +4 -4
  152. package/esm2022/lib/grids/filtering/excel-style/excel-style-clear-filters.component.mjs +4 -4
  153. package/esm2022/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.mjs +4 -4
  154. package/esm2022/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.mjs +4 -4
  155. package/esm2022/lib/grids/filtering/excel-style/excel-style-date-expression.component.mjs +4 -4
  156. package/esm2022/lib/grids/filtering/excel-style/excel-style-default-expression.component.mjs +4 -4
  157. package/esm2022/lib/grids/filtering/excel-style/excel-style-filtering.component.mjs +10 -10
  158. package/esm2022/lib/grids/filtering/excel-style/excel-style-header.component.mjs +4 -4
  159. package/esm2022/lib/grids/filtering/excel-style/excel-style-hiding.component.mjs +4 -4
  160. package/esm2022/lib/grids/filtering/excel-style/excel-style-moving.component.mjs +4 -4
  161. package/esm2022/lib/grids/filtering/excel-style/excel-style-pinning.component.mjs +4 -4
  162. package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +7 -7
  163. package/esm2022/lib/grids/filtering/excel-style/excel-style-selecting.component.mjs +4 -4
  164. package/esm2022/lib/grids/filtering/excel-style/excel-style-sorting.component.mjs +4 -4
  165. package/esm2022/lib/grids/filtering/grid-filtering.service.mjs +4 -4
  166. package/esm2022/lib/grids/grid/expandable-cell.component.mjs +4 -4
  167. package/esm2022/lib/grids/grid/grid-api.service.mjs +4 -4
  168. package/esm2022/lib/grids/grid/grid-row.component.mjs +4 -4
  169. package/esm2022/lib/grids/grid/grid-validation.service.mjs +4 -4
  170. package/esm2022/lib/grids/grid/grid.component.mjs +4 -4
  171. package/esm2022/lib/grids/grid/grid.details.pipe.mjs +4 -4
  172. package/esm2022/lib/grids/grid/grid.directives.mjs +34 -34
  173. package/esm2022/lib/grids/grid/grid.module.mjs +27 -24
  174. package/esm2022/lib/grids/grid/grid.pipes.mjs +13 -13
  175. package/esm2022/lib/grids/grid/grid.summary.pipe.mjs +4 -4
  176. package/esm2022/lib/grids/grid/groupby-row.component.mjs +4 -4
  177. package/esm2022/lib/grids/grid-base.directive.mjs +4 -4
  178. package/esm2022/lib/grids/grid-footer/grid-footer.component.mjs +4 -4
  179. package/esm2022/lib/grids/grid-mrl-navigation.service.mjs +4 -4
  180. package/esm2022/lib/grids/grid-navigation.service.mjs +4 -4
  181. package/esm2022/lib/grids/grid.common.mjs +4 -4
  182. package/esm2022/lib/grids/grid.rowEdit.directive.mjs +16 -16
  183. package/esm2022/lib/grids/grouping/grid-group-by-area.component.mjs +4 -4
  184. package/esm2022/lib/grids/grouping/group-by-area.directive.mjs +7 -7
  185. package/esm2022/lib/grids/grouping/tree-grid-group-by-area.component.mjs +4 -4
  186. package/esm2022/lib/grids/headers/grid-header-group.component.mjs +4 -4
  187. package/esm2022/lib/grids/headers/grid-header-row.component.mjs +4 -4
  188. package/esm2022/lib/grids/headers/grid-header.component.mjs +4 -4
  189. package/esm2022/lib/grids/headers/pipes.mjs +10 -10
  190. package/esm2022/lib/grids/hierarchical-grid/hierarchical-cell.component.mjs +4 -4
  191. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-api.service.mjs +4 -4
  192. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-base.directive.mjs +4 -4
  193. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-navigation.service.mjs +4 -4
  194. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +7 -7
  195. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.module.mjs +27 -24
  196. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.pipes.mjs +7 -7
  197. package/esm2022/lib/grids/hierarchical-grid/hierarchical-row.component.mjs +4 -4
  198. package/esm2022/lib/grids/hierarchical-grid/row-island-api.service.mjs +4 -4
  199. package/esm2022/lib/grids/hierarchical-grid/row-island.component.mjs +4 -4
  200. package/esm2022/lib/grids/moving/moving.drag.directive.mjs +4 -4
  201. package/esm2022/lib/grids/moving/moving.drop.directive.mjs +4 -4
  202. package/esm2022/lib/grids/moving/moving.service.mjs +4 -4
  203. package/esm2022/lib/grids/pivot-grid/pivot-data-selector.component.mjs +4 -4
  204. package/esm2022/lib/grids/pivot-grid/pivot-filtering.service.mjs +4 -4
  205. package/esm2022/lib/grids/pivot-grid/pivot-grid-navigation.service.mjs +4 -4
  206. package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +4 -4
  207. package/esm2022/lib/grids/pivot-grid/pivot-grid.directives.mjs +4 -4
  208. package/esm2022/lib/grids/pivot-grid/pivot-grid.module.mjs +27 -24
  209. package/esm2022/lib/grids/pivot-grid/pivot-grid.pipes.mjs +31 -31
  210. package/esm2022/lib/grids/pivot-grid/pivot-header-row.component.mjs +4 -4
  211. package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-content.component.mjs +4 -4
  212. package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-header-group.component.mjs +4 -4
  213. package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-header.component.mjs +4 -4
  214. package/esm2022/lib/grids/pivot-grid/pivot-row.component.mjs +4 -4
  215. package/esm2022/lib/grids/public_api.mjs +5 -2
  216. package/esm2022/lib/grids/resizing/pivot-grid/pivot-resize-handle.directive.mjs +4 -4
  217. package/esm2022/lib/grids/resizing/pivot-grid/pivot-resizer.component.mjs +4 -4
  218. package/esm2022/lib/grids/resizing/pivot-grid/pivot-resizing.service.mjs +4 -4
  219. package/esm2022/lib/grids/resizing/resize-handle.directive.mjs +4 -4
  220. package/esm2022/lib/grids/resizing/resizer.component.mjs +4 -4
  221. package/esm2022/lib/grids/resizing/resizer.directive.mjs +4 -4
  222. package/esm2022/lib/grids/resizing/resizing.service.mjs +4 -4
  223. package/esm2022/lib/grids/row-drag.directive.mjs +10 -10
  224. package/esm2022/lib/grids/row.directive.mjs +4 -4
  225. package/esm2022/lib/grids/selection/drag-select.directive.mjs +4 -4
  226. package/esm2022/lib/grids/selection/row-selectors.mjs +10 -10
  227. package/esm2022/lib/grids/selection/selection.service.mjs +4 -4
  228. package/esm2022/lib/grids/state.directive.mjs +4 -4
  229. package/esm2022/lib/grids/summaries/grid-root-summary.pipe.mjs +4 -4
  230. package/esm2022/lib/grids/summaries/grid-summary.service.mjs +4 -4
  231. package/esm2022/lib/grids/summaries/summary-cell.component.mjs +4 -4
  232. package/esm2022/lib/grids/summaries/summary-row.component.mjs +4 -4
  233. package/esm2022/lib/grids/toolbar/common.mjs +16 -16
  234. package/esm2022/lib/grids/toolbar/grid-toolbar-advanced-filtering.component.mjs +4 -4
  235. package/esm2022/lib/grids/toolbar/grid-toolbar-exporter.component.mjs +4 -4
  236. package/esm2022/lib/grids/toolbar/grid-toolbar-hiding.component.mjs +4 -4
  237. package/esm2022/lib/grids/toolbar/grid-toolbar-pinning.component.mjs +4 -4
  238. package/esm2022/lib/grids/toolbar/grid-toolbar.base.mjs +7 -7
  239. package/esm2022/lib/grids/toolbar/grid-toolbar.component.mjs +4 -4
  240. package/esm2022/lib/grids/tree-grid/public_api.mjs +4 -1
  241. package/esm2022/lib/grids/tree-grid/tree-cell.component.mjs +4 -4
  242. package/esm2022/lib/grids/tree-grid/tree-grid-api.service.mjs +4 -4
  243. package/esm2022/lib/grids/tree-grid/tree-grid-row.component.mjs +4 -4
  244. package/esm2022/lib/grids/tree-grid/tree-grid-selection.service.mjs +4 -4
  245. package/esm2022/lib/grids/tree-grid/tree-grid.component.mjs +4 -4
  246. package/esm2022/lib/grids/tree-grid/tree-grid.directives.mjs +4 -4
  247. package/esm2022/lib/grids/tree-grid/tree-grid.filtering.pipe.mjs +4 -4
  248. package/esm2022/lib/grids/tree-grid/tree-grid.grouping.pipe.mjs +4 -4
  249. package/esm2022/lib/grids/tree-grid/tree-grid.module.mjs +43 -39
  250. package/esm2022/lib/grids/tree-grid/tree-grid.pipes.mjs +22 -22
  251. package/esm2022/lib/grids/tree-grid/tree-grid.summary.pipe.mjs +4 -4
  252. package/esm2022/lib/icon/icon.component.mjs +4 -4
  253. package/esm2022/lib/icon/icon.module.mjs +5 -5
  254. package/esm2022/lib/icon/icon.service.mjs +4 -4
  255. package/esm2022/lib/input-group/input-group.component.mjs +4 -4
  256. package/esm2022/lib/input-group/input-group.module.mjs +5 -5
  257. package/esm2022/lib/list/list-item.component.mjs +4 -4
  258. package/esm2022/lib/list/list.common.mjs +16 -16
  259. package/esm2022/lib/list/list.component.mjs +19 -19
  260. package/esm2022/lib/list/list.module.mjs +5 -5
  261. package/esm2022/lib/navbar/navbar.component.mjs +10 -10
  262. package/esm2022/lib/navbar/navbar.module.mjs +5 -5
  263. package/esm2022/lib/navigation-drawer/navigation-drawer.component.mjs +4 -4
  264. package/esm2022/lib/navigation-drawer/navigation-drawer.directives.mjs +10 -10
  265. package/esm2022/lib/navigation-drawer/navigation-drawer.module.mjs +5 -5
  266. package/esm2022/lib/paginator/paginator-interfaces.mjs +4 -4
  267. package/esm2022/lib/paginator/paginator.component.mjs +13 -13
  268. package/esm2022/lib/paginator/paginator.module.mjs +5 -5
  269. package/esm2022/lib/progressbar/progressbar.common.mjs +7 -7
  270. package/esm2022/lib/progressbar/progressbar.component.mjs +10 -10
  271. package/esm2022/lib/progressbar/progressbar.module.mjs +5 -5
  272. package/esm2022/lib/query-builder/query-builder-header.component.mjs +4 -4
  273. package/esm2022/lib/query-builder/query-builder.component.mjs +7 -7
  274. package/esm2022/lib/query-builder/query-builder.module.mjs +5 -5
  275. package/esm2022/lib/radio/radio.component.mjs +4 -4
  276. package/esm2022/lib/select/select-group.component.mjs +4 -4
  277. package/esm2022/lib/select/select-item.component.mjs +4 -4
  278. package/esm2022/lib/select/select-navigation.directive.mjs +4 -4
  279. package/esm2022/lib/select/select.component.mjs +13 -13
  280. package/esm2022/lib/select/select.module.mjs +5 -5
  281. package/esm2022/lib/services/animation/angular-animation-service.mjs +4 -4
  282. package/esm2022/lib/services/csv/csv-exporter.mjs +4 -4
  283. package/esm2022/lib/services/direction/directionality.mjs +4 -4
  284. package/esm2022/lib/services/excel/excel-exporter.mjs +4 -4
  285. package/esm2022/lib/services/overlay/overlay.mjs +4 -4
  286. package/esm2022/lib/services/transaction/transaction-factory.service.mjs +7 -7
  287. package/esm2022/lib/simple-combo/simple-combo.component.mjs +4 -4
  288. package/esm2022/lib/simple-combo/simple-combo.module.mjs +5 -5
  289. package/esm2022/lib/slider/label/thumb-label.component.mjs +4 -4
  290. package/esm2022/lib/slider/slider.common.mjs +10 -10
  291. package/esm2022/lib/slider/slider.component.mjs +4 -4
  292. package/esm2022/lib/slider/slider.module.mjs +5 -5
  293. package/esm2022/lib/slider/thumb/thumb-slider.component.mjs +4 -4
  294. package/esm2022/lib/slider/ticks/tick.pipe.mjs +4 -4
  295. package/esm2022/lib/slider/ticks/ticks.component.mjs +4 -4
  296. package/esm2022/lib/snackbar/snackbar.component.mjs +4 -4
  297. package/esm2022/lib/snackbar/snackbar.module.mjs +5 -5
  298. package/esm2022/lib/splitter/splitter-pane/splitter-pane.component.mjs +4 -4
  299. package/esm2022/lib/splitter/splitter.component.mjs +7 -7
  300. package/esm2022/lib/splitter/splitter.module.mjs +5 -5
  301. package/esm2022/lib/stepper/step/step.component.mjs +4 -4
  302. package/esm2022/lib/stepper/stepper.component.mjs +4 -4
  303. package/esm2022/lib/stepper/stepper.directive.mjs +22 -22
  304. package/esm2022/lib/stepper/stepper.module.mjs +5 -5
  305. package/esm2022/lib/stepper/stepper.service.mjs +4 -4
  306. package/esm2022/lib/switch/switch.component.mjs +4 -4
  307. package/esm2022/lib/switch/switch.module.mjs +5 -5
  308. package/esm2022/lib/tabs/bottom-nav/bottom-nav-content.component.mjs +4 -4
  309. package/esm2022/lib/tabs/bottom-nav/bottom-nav-header.component.mjs +4 -4
  310. package/esm2022/lib/tabs/bottom-nav/bottom-nav-item.component.mjs +4 -4
  311. package/esm2022/lib/tabs/bottom-nav/bottom-nav.component.mjs +4 -4
  312. package/esm2022/lib/tabs/bottom-nav/bottom-nav.directives.mjs +7 -7
  313. package/esm2022/lib/tabs/bottom-nav/bottom-nav.module.mjs +5 -5
  314. package/esm2022/lib/tabs/tab-content.directive.mjs +4 -4
  315. package/esm2022/lib/tabs/tab-header.directive.mjs +4 -4
  316. package/esm2022/lib/tabs/tab-item.directive.mjs +4 -4
  317. package/esm2022/lib/tabs/tabs/tab-content.component.mjs +4 -4
  318. package/esm2022/lib/tabs/tabs/tab-header.component.mjs +4 -4
  319. package/esm2022/lib/tabs/tabs/tab-item.component.mjs +4 -4
  320. package/esm2022/lib/tabs/tabs/tabs.component.mjs +4 -4
  321. package/esm2022/lib/tabs/tabs/tabs.directives.mjs +7 -7
  322. package/esm2022/lib/tabs/tabs/tabs.module.mjs +5 -5
  323. package/esm2022/lib/tabs/tabs.directive.mjs +4 -4
  324. package/esm2022/lib/time-picker/time-picker.component.mjs +4 -4
  325. package/esm2022/lib/time-picker/time-picker.directives.mjs +7 -7
  326. package/esm2022/lib/time-picker/time-picker.module.mjs +5 -5
  327. package/esm2022/lib/time-picker/time-picker.pipes.mjs +7 -7
  328. package/esm2022/lib/toast/toast.component.mjs +4 -4
  329. package/esm2022/lib/toast/toast.module.mjs +5 -5
  330. package/esm2022/lib/tree/tree-navigation.service.mjs +4 -4
  331. package/esm2022/lib/tree/tree-node/tree-node.component.mjs +7 -7
  332. package/esm2022/lib/tree/tree-selection.service.mjs +4 -4
  333. package/esm2022/lib/tree/tree.component.mjs +10 -10
  334. package/esm2022/lib/tree/tree.module.mjs +5 -5
  335. package/esm2022/lib/tree/tree.service.mjs +4 -4
  336. package/fesm2022/igniteui-angular.mjs +2330 -2321
  337. package/fesm2022/igniteui-angular.mjs.map +1 -1
  338. package/lib/grids/column-actions/public_api.d.ts +7 -0
  339. package/lib/grids/grid/grid.module.d.ts +23 -20
  340. package/lib/grids/grid/public_api.d.ts +1 -1
  341. package/lib/grids/hierarchical-grid/hierarchical-grid.module.d.ts +23 -20
  342. package/lib/grids/hierarchical-grid/public_api.d.ts +1 -1
  343. package/lib/grids/pivot-grid/pivot-grid.module.d.ts +23 -20
  344. package/lib/grids/pivot-grid/public_api.d.ts +1 -1
  345. package/lib/grids/public_api.d.ts +2 -1
  346. package/lib/grids/tree-grid/public_api.d.ts +3 -1
  347. package/lib/grids/tree-grid/tree-grid.module.d.ts +39 -35
  348. package/package.json +6 -6
@@ -743,10 +743,10 @@ export class IgxGridSelectionService {
743
743
  isRowDeleted(rowID) {
744
744
  return this.grid.gridAPI.row_deleted_transaction(rowID);
745
745
  }
746
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-rc.4", ngImport: i0, type: IgxGridSelectionService, deps: [{ token: i0.NgZone }, { token: i1.PlatformUtil }], target: i0.ɵɵFactoryTarget.Injectable }); }
747
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0-rc.4", ngImport: i0, type: IgxGridSelectionService }); }
746
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxGridSelectionService, deps: [{ token: i0.NgZone }, { token: i1.PlatformUtil }], target: i0.ɵɵFactoryTarget.Injectable }); }
747
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxGridSelectionService }); }
748
748
  }
749
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-rc.4", ngImport: i0, type: IgxGridSelectionService, decorators: [{
749
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxGridSelectionService, decorators: [{
750
750
  type: Injectable
751
751
  }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i1.PlatformUtil }]; } });
752
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBWWpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBSXJELE1BQU0sT0FBTyx1QkFBdUI7SUE2QmhDOzs7T0FHRztJQUNILElBQVcsTUFBTTtRQUViLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFeEUsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENB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TSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNqRyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG9CQUFvQixDQUFDLElBQVU7UUFDbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxrQkFBa0I7UUFDdEIsT0FBTyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ3RFLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQUs7UUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO21IQTF6QlEsdUJBQXVCO3VIQUF2Qix1QkFBdUI7O2dHQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgR3JpZFBhZ2luZ01vZGUgfSBmcm9tICcuLi9jb21tb24vZW51bXMnO1xuaW1wb3J0IHsgSVJvd1NlbGVjdGlvbkV2ZW50QXJncyB9IGZyb20gJy4uL2NvbW1vbi9ldmVudHMnO1xuaW1wb3J0IHsgR3JpZFR5cGUgfSBmcm9tICcuLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgICBHcmlkU2VsZWN0aW9uUmFuZ2UsXG4gICAgSUNvbHVtblNlbGVjdGlvblN0YXRlLFxuICAgIElNdWx0aVJvd0xheW91dE5vZGUsXG4gICAgSVNlbGVjdGlvbktleWJvYXJkU3RhdGUsXG4gICAgSVNlbGVjdGlvbk5vZGUsXG4gICAgSVNlbGVjdGlvblBvaW50ZXJTdGF0ZSxcbiAgICBTZWxlY3Rpb25TdGF0ZVxufSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgUGl2b3RVdGlsIH0gZnJvbSAnLi4vcGl2b3QtZ3JpZC9waXZvdC11dGlsJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSWd4R3JpZFNlbGVjdGlvblNlcnZpY2Uge1xuICAgIHB1YmxpYyBncmlkOiBHcmlkVHlwZTtcbiAgICBwdWJsaWMgZHJhZ01vZGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgYWN0aXZlRWxlbWVudDogSVNlbGVjdGlvbk5vZGUgfCBudWxsO1xuICAgIHB1YmxpYyBrZXlib2FyZFN0YXRlID0ge30gYXMgSVNlbGVjdGlvbktleWJvYXJkU3RhdGU7XG4gICAgcHVibGljIHBvaW50ZXJTdGF0ZSA9IHt9IGFzIElTZWxlY3Rpb25Qb2ludGVyU3RhdGU7XG4gICAgcHVibGljIGNvbHVtbnNTdGF0ZSA9IHt9IGFzIElDb2x1bW5TZWxlY3Rpb25TdGF0ZTtcblxuICAgIHB1YmxpYyBzZWxlY3Rpb24gPSBuZXcgTWFwPG51bWJlciwgU2V0PG51bWJlcj4+KCk7XG4gICAgcHVibGljIHRlbXAgPSBuZXcgTWFwPG51bWJlciwgU2V0PG51bWJlcj4+KCk7XG4gICAgcHVibGljIHJvd1NlbGVjdGlvbjogU2V0PGFueT4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBwdWJsaWMgaW5kZXRlcm1pbmF0ZVJvd3M6IFNldDxhbnk+ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgcHVibGljIGNvbHVtblNlbGVjdGlvbjogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZFJvd3NDaGFuZ2UgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlZCB3aGVuIGEgcG9pbnRlcmRvd24gZXZlbnQgaXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgZ3JpZCBib2R5IChjZWxscykuXG4gICAgICogV2hlbiBgZmFsc2VgIHRoZSBkcmFnIHNlbGVjdCBiZWhhdmlvciBpcyBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBvaW50ZXJFdmVudEluR3JpZEJvZHkgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgYWxsUm93c1NlbGVjdGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2xhc3RTZWxlY3RlZE5vZGU6IElTZWxlY3Rpb25Ob2RlO1xuICAgIHByaXZhdGUgX3JhbmdlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIF9zZWxlY3Rpb25SYW5nZTogUmFuZ2U7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHJhbmdlcyBpbiB0aGUgZ3JpZCBmcm9tIGJvdGhcbiAgICAgKiBrZXlib2FyZCBhbmQgcG9pbnRlciBpbnRlcmFjdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJhbmdlcygpOiBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB7XG5cbiAgICAgICAgLy8gVGhlIGxhc3QgYWN0aW9uIHdhcyBrZXlib2FyZCArIHNoaWZ0IHNlbGVjdGlvbiAtPiBhZGQgaXRcbiAgICAgICAgdGhpcy5hZGRLZXlib2FyZFJhbmdlKCk7XG5cbiAgICAgICAgY29uc3QgcmFuZ2VzID0gQXJyYXkuZnJvbSh0aGlzLl9yYW5nZXMpLm1hcChyYW5nZSA9PiBKU09OLnBhcnNlKHJhbmdlKSk7XG5cbiAgICAgICAgLy8gTm8gcmFuZ2VzIGJ1dCB3ZSBoYXZlIGEgZm9jdXNlZCBjZWxsIC0+IGFkZCBpdFxuICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGggJiYgdGhpcy5hY3RpdmVFbGVtZW50ICYmIHRoaXMuZ3JpZC5pc0NlbGxTZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICByYW5nZXMucHVzaCh0aGlzLmdlbmVyYXRlUmFuZ2UodGhpcy5hY3RpdmVFbGVtZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcHJpbWFyeUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9pbnRlclN0YXRlLnByaW1hcnlCdXR0b247XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwcmltYXJ5QnV0dG9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLnByaW1hcnlCdXR0b24gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwpIHtcbiAgICAgICAgdGhpcy5pbml0UG9pbnRlclN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5pdEtleWJvYXJkU3RhdGUoKTtcbiAgICAgICAgdGhpcy5pbml0Q29sdW1uc1N0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBrZXlib2FyZCBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0S2V5Ym9hcmRTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLm5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmtleWJvYXJkU3RhdGUuc2hpZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLnJhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgcG9pbnRlciBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0UG9pbnRlclN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUuY3RybCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5zaGlmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5yYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLnByaW1hcnlCdXR0b24gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgY29sdW1ucyBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0Q29sdW1uc1N0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA9IG51bGw7XG4gICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLnJhbmdlID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbmdsZSBub2RlLlxuICAgICAqIFNpbmdsZSBjbGlja3MgfCBDdHJsICsgc2luZ2xlIGNsaWNrcyBvbiBjZWxscyBpcyB0aGUgdXN1YWwgY2FzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBhZGRUb1JhbmdlID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaGFzKG5vZGUucm93KSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZ2V0KG5vZGUucm93KS5hZGQobm9kZS5jb2x1bW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0KG5vZGUucm93LCBuZXcgU2V0PG51bWJlcj4oKSkuZ2V0KG5vZGUucm93KS5hZGQobm9kZS5jb2x1bW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFkZFRvUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jhbmdlcy5hZGQoSlNPTi5zdHJpbmdpZnkodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBhY3RpdmUga2V5Ym9hcmQgcmFuZ2Ugc2VsZWN0aW9uIChpZiBhbnkpIHRvIHRoZSBgcmFuZ2VzYCBtZXRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRLZXlib2FyZFJhbmdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5rZXlib2FyZFN0YXRlLnJhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZXMuYWRkKEpTT04uc3RyaW5naWZ5KHRoaXMua2V5Ym9hcmRTdGF0ZS5yYW5nZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZShub2RlOiBJU2VsZWN0aW9uTm9kZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaGFzKG5vZGUucm93KSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZ2V0KG5vZGUucm93KS5kZWxldGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yYW5nZXMuZGVsZXRlKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0luTWFwKG5vZGU6IElTZWxlY3Rpb25Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zZWxlY3Rpb24uaGFzKG5vZGUucm93KSAmJiB0aGlzLnNlbGVjdGlvbi5nZXQobm9kZS5yb3cpLmhhcyhub2RlLmNvbHVtbikpIHx8XG4gICAgICAgICAgICAodGhpcy50ZW1wLmhhcyhub2RlLnJvdykgJiYgdGhpcy50ZW1wLmdldChub2RlLnJvdykuaGFzKG5vZGUuY29sdW1uKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdGVkKG5vZGU6IElTZWxlY3Rpb25Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0FjdGl2ZU5vZGUobm9kZSkgJiYgdGhpcy5ncmlkLmlzQ2VsbFNlbGVjdGFibGUpIHx8IHRoaXMuaXNJbk1hcChub2RlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY3RpdmVOb2RlKG5vZGU6IElTZWxlY3Rpb25Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5hY3RpdmVFbGVtZW50LmNvbHVtbiA9PT0gbm9kZS5jb2x1bW4gJiYgdGhpcy5hY3RpdmVFbGVtZW50LnJvdyA9PT0gbm9kZS5yb3c7XG4gICAgICAgICAgICBpZiAodGhpcy5ncmlkLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmFjdGl2ZUVsZW1lbnQubGF5b3V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0FjdGl2ZSAmJiB0aGlzLmlzQWN0aXZlTGF5b3V0KGxheW91dCwgbm9kZS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzQWN0aXZlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY3RpdmVMYXlvdXQoY3VycmVudDogSU11bHRpUm93TGF5b3V0Tm9kZSwgdGFyZ2V0OiBJTXVsdGlSb3dMYXlvdXROb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjdXJyZW50LmNvbHVtblZpc2libGVJbmRleCA9PT0gdGFyZ2V0LmNvbHVtblZpc2libGVJbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUmFuZ2VNZXRhKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzdGF0ZT86IFNlbGVjdGlvblN0YXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jhbmdlcy5hZGQoSlNPTi5zdHJpbmdpZnkodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIHN0YXRlKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVSYW5nZU1ldGEobm9kZTogSVNlbGVjdGlvbk5vZGUsIHN0YXRlPzogU2VsZWN0aW9uU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmFuZ2VzLmRlbGV0ZShKU09OLnN0cmluZ2lmeSh0aGlzLmdlbmVyYXRlUmFuZ2Uobm9kZSwgc3RhdGUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgbmV3IHNlbGVjdGlvbiByYW5nZSBmcm9tIHRoZSBnaXZlbiBgbm9kZWAuXG4gICAgICogSWYgYHN0YXRlYCBpcyBwYXNzZWQgaW5zdGVhZCBpdCB3aWxsIGdlbmVyYXRlIHRoZSByYW5nZSBiYXNlZCBvbiB0aGUgcGFzc2VkIGBub2RlYFxuICAgICAqIGFuZCB0aGUgc3RhcnQgbm9kZSBvZiB0aGUgYHN0YXRlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVSYW5nZShub2RlOiBJU2VsZWN0aW9uTm9kZSwgc3RhdGU/OiBTZWxlY3Rpb25TdGF0ZSk6IEdyaWRTZWxlY3Rpb25SYW5nZSB7XG4gICAgICAgIHRoaXMuX2xhc3RTZWxlY3RlZE5vZGUgPSBub2RlO1xuXG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcm93U3RhcnQ6IG5vZGUucm93LFxuICAgICAgICAgICAgICAgIHJvd0VuZDogbm9kZS5yb3csXG4gICAgICAgICAgICAgICAgY29sdW1uU3RhcnQ6IG5vZGUuY29sdW1uLFxuICAgICAgICAgICAgICAgIGNvbHVtbkVuZDogbm9kZS5jb2x1bW5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHJvdywgY29sdW1uIH0gPSBzdGF0ZS5ub2RlO1xuICAgICAgICBjb25zdCByb3dTdGFydCA9IE1hdGgubWluKG5vZGUucm93LCByb3cpO1xuICAgICAgICBjb25zdCByb3dFbmQgPSBNYXRoLm1heChub2RlLnJvdywgcm93KTtcbiAgICAgICAgY29uc3QgY29sdW1uU3RhcnQgPSBNYXRoLm1pbihub2RlLmNvbHVtbiwgY29sdW1uKTtcbiAgICAgICAgY29uc3QgY29sdW1uRW5kID0gTWF0aC5tYXgobm9kZS5jb2x1bW4sIGNvbHVtbik7XG5cbiAgICAgICAgcmV0dXJuIHsgcm93U3RhcnQsIHJvd0VuZCwgY29sdW1uU3RhcnQsIGNvbHVtbkVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGtleWJvYXJkU3RhdGVPbktleWRvd24obm9kZTogSVNlbGVjdGlvbk5vZGUsIHNoaWZ0OiBib29sZWFuLCBzaGlmdFRhYjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkU3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbml0UG9pbnRlclN0YXRlKCk7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5zaGlmdCA9IHNoaWZ0ICYmICFzaGlmdFRhYjtcbiAgICAgICAgaWYgKCF0aGlzLmdyaWQubmF2aWdhdGlvbi5pc0RhdGFSb3cobm9kZS5yb3cpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gS2IgbmF2aWdhdGlvbiB3aXRoIHNoaWZ0IGFuZCBubyBwcmV2aW91cyBub2RlLlxuICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW5pdCB0aGUgc3RhcnQgbm9kZS5cbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdGF0ZS5zaGlmdCAmJiAhdGhpcy5rZXlib2FyZFN0YXRlLm5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5ub2RlID0gT2JqZWN0LmFzc2lnbih7fSwgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMga2V5Ym9hcmRTdGF0ZU9uRm9jdXMobm9kZTogSVNlbGVjdGlvbk5vZGUsIGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxHcmlkU2VsZWN0aW9uUmFuZ2U+LCBkb20pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qga2JTdGF0ZSA9IHRoaXMua2V5Ym9hcmRTdGF0ZTtcblxuICAgICAgICAvLyBGb2N1cyB0cmlnZ2VyZWQgYnkga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICBpZiAoa2JTdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzQ2hyb21pdW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlU2VsZWN0aW9uQ2hyb21lKGRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdGFydCBnZW5lcmF0aW5nIGEgcmFuZ2UgaWYgc2hpZnQgaXMgaG9sZFxuICAgICAgICAgICAgaWYgKGtiU3RhdGUuc2hpZnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTZWxlY3Qobm9kZSwga2JTdGF0ZSk7XG4gICAgICAgICAgICAgICAga2JTdGF0ZS5yYW5nZSA9IHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCBrYlN0YXRlKTtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIGtiU3RhdGUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5pdEtleWJvYXJkU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBvaW50ZXJEb3duKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzaGlmdDogYm9vbGVhbiwgY3RybDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZEtleWJvYXJkUmFuZ2UoKTtcbiAgICAgICAgdGhpcy5pbml0S2V5Ym9hcmRTdGF0ZSgpO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5jdHJsID0gY3RybDtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUuc2hpZnQgPSBzaGlmdDtcbiAgICAgICAgdGhpcy5wb2ludGVyRXZlbnRJbkdyaWRCb2R5ID0gdHJ1ZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLnBvaW50ZXJPcmlnaW5IYW5kbGVyKTtcblxuICAgICAgICAvLyBObyBjdHJsIGtleSBwcmVzc2VkIC0gbm8gbXVsdGlwbGUgc2VsZWN0aW9uXG4gICAgICAgIGlmICghY3RybCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNoaWZ0KSB7XG4gICAgICAgICAgICAvLyBObyBwcmV2aW91c2x5ICdjbGlja2VkJyBub2RlLiBVc2UgdGhlIGxhc3QgYWN0aXZlIG5vZGUuXG4gICAgICAgICAgICBpZiAoIXRoaXMucG9pbnRlclN0YXRlLm5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlID0gdGhpcy5hY3RpdmVFbGVtZW50IHx8IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJEb3duU2hpZnRLZXkobm9kZSk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVSYW5nZU1ldGEobm9kZSk7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLm5vZGUgPSBub2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBwb2ludGVyRG93blNoaWZ0S2V5KG5vZGU6IElTZWxlY3Rpb25Ob2RlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RSYW5nZShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG1lcmdlTWFwKHRhcmdldDogTWFwPG51bWJlciwgU2V0PG51bWJlcj4+LCBzb3VyY2U6IE1hcDxudW1iZXIsIFNldDxudW1iZXI+Pik6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHNvdXJjZS5lbnRyaWVzKCk7XG4gICAgICAgIGxldCBwYWlyID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBsZXQga2V5OiBudW1iZXI7XG4gICAgICAgIGxldCB2YWx1ZTogU2V0PG51bWJlcj47XG5cbiAgICAgICAgd2hpbGUgKCFwYWlyLmRvbmUpIHtcbiAgICAgICAgICAgIFtrZXksIHZhbHVlXSA9IHBhaXIudmFsdWU7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0YXJnZXQuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChyZWNvcmQgPT4gbmV3VmFsdWUuYWRkKHJlY29yZCkpO1xuICAgICAgICAgICAgICAgIHRhcmdldC5zZXQoa2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWlyID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBvaW50ZXJFbnRlcihub2RlOiBJU2VsZWN0aW9uTm9kZSwgZXZlbnQ6IFBvaW50ZXJFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy8jdGhlLWJ1dHRvbi1wcm9wZXJ0eVxuICAgICAgICB0aGlzLmRyYWdNb2RlID0gKGV2ZW50LmJ1dHRvbnMgPT09IDEgJiYgKGV2ZW50LmJ1dHRvbiA9PT0gLTEgfHwgZXZlbnQuYnV0dG9uID09PSAwKSkgJiYgdGhpcy5wb2ludGVyRXZlbnRJbkdyaWRCb2R5O1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ01vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VycyB0cmlnZ2VycyBhIGRyYWctbGlrZSBldmVudCBieSBmaXJzdCBjbGlja2luZyBvdXRzaWRlIHRoZSBncmlkIGNlbGxzXG4gICAgICAgIC8vIGFuZCB0aGVuIGVudGVycyBpbiB0aGUgZ3JpZCBib2R5IHdlIG1heSBub3QgaGF2ZSBhIGluaXRpYWwgcG9pbnRlciBzdGFydGluZyBub2RlLlxuICAgICAgICAvLyBBc3N1bWUgdGhlIGZpcnN0IHBvaW50ZXJlbnRlciBub2RlIGlzIHdoZXJlIHdlIHN0YXJ0LlxuICAgICAgICBpZiAoIXRoaXMucG9pbnRlclN0YXRlLm5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRlclN0YXRlLm5vZGUgPSBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucG9pbnRlclN0YXRlLmN0cmwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0UmFuZ2Uobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUsIHRoaXMudGVtcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdTZWxlY3Qobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBwb2ludGVyVXAobm9kZTogSVNlbGVjdGlvbk5vZGUsIGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxHcmlkU2VsZWN0aW9uUmFuZ2U+LCBmaXJlZE91dHNpZGVHcmlkPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5kcmFnTW9kZSB8fCBmaXJlZE91dHNpZGVHcmlkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmFkZFJhbmdlTWV0YShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm1lcmdlTWFwKHRoaXMuc2VsZWN0aW9uLCB0aGlzLnRlbXApO1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1blRhc2soKCkgPT4gZW1pdHRlci5lbWl0KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSkpKTtcbiAgICAgICAgICAgIHRoaXMudGVtcC5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5kcmFnTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wb2ludGVyU3RhdGUuc2hpZnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmFkZFJhbmdlTWV0YShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSk7XG4gICAgICAgICAgICBlbWl0dGVyLmVtaXQodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIHRoaXMucG9pbnRlclN0YXRlKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvaW50ZXJFdmVudEluR3JpZEJvZHkgJiYgdGhpcy5pc0FjdGl2ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0UmFuZ2Uobm9kZTogSVNlbGVjdGlvbk5vZGUsIHN0YXRlOiBTZWxlY3Rpb25TdGF0ZSwgY29sbGVjdGlvbjogTWFwPG51bWJlciwgU2V0PG51bWJlcj4+ID0gdGhpcy5zZWxlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT09IHRoaXMudGVtcCkge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgcm93U3RhcnQsIHJvd0VuZCwgY29sdW1uU3RhcnQsIGNvbHVtbkVuZCB9ID0gdGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIHN0YXRlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHJvd1N0YXJ0OyBpIDw9IHJvd0VuZDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gY29sdW1uU3RhcnQgYXMgbnVtYmVyOyBqIDw9IChjb2x1bW5FbmQgYXMgbnVtYmVyKTsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24uaGFzKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZ2V0KGkpLmFkZChqKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnNldChpLCBuZXcgU2V0PG51bWJlcj4oKSkuZ2V0KGkpLmFkZChqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZHJhZ1NlbGVjdChub2RlOiBJU2VsZWN0aW9uTm9kZSwgc3RhdGU6IFNlbGVjdGlvblN0YXRlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wb2ludGVyU3RhdGUuY3RybCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFJhbmdlKG5vZGUsIHN0YXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoY2xlYXJBY3JpdmVFbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmIChjbGVhckFjcml2ZUVsKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGVtcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9yYW5nZXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJUZXh0U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvblJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlc3RvcmVUZXh0U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZSh0aGlzLl9zZWxlY3Rpb25SYW5nZSB8fCBkb2N1bWVudC5jcmVhdGVSYW5nZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWxlY3RlZFJvd3NEYXRhKCkge1xuICAgICAgICBpZiAodGhpcy5ncmlkLmlzUGl2b3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQuZGF0YVZpZXcuZmlsdGVyKHIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSByLmRpbWVuc2lvbnMubWFwKGQgPT4gUGl2b3RVdGlsLmdldFJlY29yZEtleShyLCBkKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleXMuc29tZShrID0+IHRoaXMuaXNQaXZvdFJvd1NlbGVjdGVkKGspKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucm93U2VsZWN0aW9uLnNpemUgJiYgKHRoaXMuZ3JpZCBhcyBhbnkpLnRvdGFsSXRlbUNvdW50IHx8IHRoaXMuZ3JpZC5wYWdpbmdNb2RlID09PSBHcmlkUGFnaW5nTW9kZS5SZW1vdGUpIHtcbiAgICAgICAgICAgIGlmKCF0aGlzLmdyaWQucHJpbWFyeUtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucm93U2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3Rpb24uZm9yRWFjaChySUQgPT4gIHtcbiAgICAgICAgICAgICAgICBjb25zdCByRGF0YSA9IHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKS5maW5kKHJvdyA9PiB0aGlzLmdldFJlY29yZEtleShyb3cpID09PSBySUQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxSb3dEYXRhID0ge307XG4gICAgICAgICAgICAgICAgcGFydGlhbFJvd0RhdGFbdGhpcy5ncmlkLnByaW1hcnlLZXldID0gcklEO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5wdXNoKHJEYXRhID8gckRhdGEgOiBwYXJ0aWFsUm93RGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uLnNpemUgPyB0aGlzLmdyaWQuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodHJ1ZSkuZmlsdGVyKHJvdyA9PiB0aGlzLnJvd1NlbGVjdGlvbi5oYXModGhpcy5nZXRSZWNvcmRLZXkocm93KSkpIDogW107XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgYXJyYXkgb2YgdGhlIHNlbGVjdGVkIHJvdyBpZCdzLiAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZFJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbi5zaXplID8gQXJyYXkuZnJvbSh0aGlzLnJvd1NlbGVjdGlvbi5rZXlzKCkpIDogW107XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgYXJyYXkgb2YgdGhlIHJvd3MgaW4gaW5kZXRlcm1pbmF0ZSBzdGF0ZS4gKi9cbiAgICBwdWJsaWMgZ2V0SW5kZXRlcm1pbmF0ZVJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGVSb3dzLnNpemUgPyBBcnJheS5mcm9tKHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3Mua2V5cygpKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKiBDbGVhcnMgcm93IHNlbGVjdGlvbiwgaWYgZmlsdGVyaW5nIGlzIGFwcGxpZWQgY2xlYXJzIG9ubHkgc2VsZWN0ZWQgcm93cyBmcm9tIGZpbHRlcmVkIGRhdGEuICovXG4gICAgcHVibGljIGNsZWFyUm93U2VsZWN0aW9uKGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdldFNlbGVjdGVkUm93c0RhdGEoKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZFJlYyA9IHRoaXMuaXNGaWx0ZXJpbmdBcHBsaWVkKCkgP1xuICAgICAgICAgICAgdGhpcy5hbGxEYXRhLmZpbHRlcihyb3cgPT4gdGhpcy5pc1Jvd1NlbGVjdGVkKHRoaXMuZ2V0UmVjb3JkS2V5KHJvdykpKSA6IHNlbGVjdGVkUm93cztcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5pc0ZpbHRlcmluZ0FwcGxpZWQoKSA/IHNlbGVjdGVkUm93cy5maWx0ZXIoeCA9PiAhcmVtb3ZlZFJlYy5pbmNsdWRlcyh4KSkgOiBbXTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgcmVtb3ZlZFJlYywgZXZlbnQsIHNlbGVjdGVkUm93cyk7XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdCBhbGwgcm93cywgaWYgZmlsdGVyaW5nIGlzIGFwcGxpZWQgc2VsZWN0IG9ubHkgZnJvbSBmaWx0ZXJlZCBkYXRhLiAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxSb3dzKGV2ZW50Pykge1xuICAgICAgICBjb25zdCBhZGRlZFJvd3MgPSB0aGlzLmFsbERhdGEuZmlsdGVyKChyb3cpID0+ICF0aGlzLmlzUm93U2VsZWN0ZWQodGhpcy5nZXRSZWNvcmRLZXkocm93KSkpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdldFNlbGVjdGVkUm93c0RhdGEoKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSA/IHNlbGVjdGVkUm93cy5jb25jYXQoYWRkZWRSb3dzKSA6IGFkZGVkUm93cztcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlUm93cy5jbGVhcigpO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkUm93cywgW10sIGV2ZW50LCBzZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgdGhlIHNwZWNpZmllZCByb3cgYW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIHNlbGVjdFJvd0J5SWQocm93SUQsIGNsZWFyUHJldlNlbGVjdGlvbj8sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoISh0aGlzLmdyaWQuaXNSb3dTZWxlY3RhYmxlIHx8IHRoaXMuZ3JpZC5pc1Bpdm90KSB8fCB0aGlzLmlzUm93RGVsZXRlZChyb3dJRCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjbGVhclByZXZTZWxlY3Rpb24gPSAhdGhpcy5ncmlkLmlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkIHx8IGNsZWFyUHJldlNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5pc1Bpdm90KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFBpdm90Um93QnlJZChyb3dJRCwgY2xlYXJQcmV2U2VsZWN0aW9uLCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3NEYXRhKCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IFt0aGlzLmdldFJvd0RhdGFCeUlkKHJvd0lEKV0gOiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMocm93SUQpID9cbiAgICAgICAgICAgIHNlbGVjdGVkUm93cyA6IFsuLi5zZWxlY3RlZFJvd3MsIHRoaXMuZ2V0Um93RGF0YUJ5SWQocm93SUQpXTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IHNlbGVjdGVkUm93cyA6IFtdO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIFt0aGlzLmdldFJvd0RhdGFCeUlkKHJvd0lEKV0sIHJlbW92ZWQsIGV2ZW50LCBzZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RQaXZvdFJvd0J5SWQocm93SUQsIGNsZWFyUHJldlNlbGVjdGlvbjogYm9vbGVhbiwgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IFtyb3dJRF0gOiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMocm93SUQpID8gc2VsZWN0ZWRSb3dzIDogWy4uLnNlbGVjdGVkUm93cywgcm93SURdO1xuICAgICAgICBjb25zdCBhZGRlZCA9IHRoaXMuZ2V0UGl2b3RSb3dzQnlJZHMoW3Jvd0lEXSk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLmdldFBpdm90Um93c0J5SWRzKGNsZWFyUHJldlNlbGVjdGlvbiA/IHNlbGVjdGVkUm93cyA6IFtdKTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnRQaXZvdEdyaWQoc2VsZWN0ZWRSb3dzLCBuZXdTZWxlY3Rpb24sIGFkZGVkLCByZW1vdmVkLCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIERlc2VsZWN0IHRoZSBzcGVjaWZpZWQgcm93IGFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdFJvdyhyb3dJRCwgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1Jvd1NlbGVjdGVkKHJvd0lEKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuZ3JpZC5pc1Bpdm90KSB7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGl2b3RSb3dCeUlEKHJvd0lELCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3NEYXRhKCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHNlbGVjdGVkUm93cy5maWx0ZXIociA9PiAgdGhpcy5nZXRSZWNvcmRLZXkocikgIT09IHJvd0lEKTtcbiAgICAgICAgaWYgKHRoaXMucm93U2VsZWN0aW9uLnNpemUgJiYgdGhpcy5yb3dTZWxlY3Rpb24uaGFzKHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgW3RoaXMuZ2V0Um93RGF0YUJ5SWQocm93SUQpXSwgZXZlbnQsIHNlbGVjdGVkUm93cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzZWxlY3RQaXZvdFJvd0J5SUQocm93SUQsIGV2ZW50Pykge1xuICAgICAgICBpZiAodGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSAmJiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMocm93SUQpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyU2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGN1cnJTZWxlY3Rpb24uZmlsdGVyKHIgPT4gciAhPT0gcm93SUQpO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCAgPSB0aGlzLmdldFBpdm90Um93c0J5SWRzKFtyb3dJRF0pO1xuICAgICAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnRQaXZvdEdyaWQoY3VyclNlbGVjdGlvbiwgbmV3U2VsZWN0aW9uLCBbXSwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbWl0Um93U2VsZWN0aW9uRXZlbnRQaXZvdEdyaWQoY3VyclNlbGVjdGlvbiwgbmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJlRXF1YWxDb2xsZWN0aW9ucyhjdXJyU2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUm93cyA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzRGF0YSgpO1xuICAgICAgICBjb25zdCBhcmdzOiBJUm93U2VsZWN0aW9uRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IHRoaXMuZ3JpZCxcbiAgICAgICAgICAgIG9sZFNlbGVjdGlvbjogY3VyclNlbGVjdGVkUm93cyxcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbjogdGhpcy5nZXRQaXZvdFJvd3NCeUlkcyhuZXdTZWxlY3Rpb24pLFxuICAgICAgICAgICAgYWRkZWQsXG4gICAgICAgICAgICByZW1vdmVkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlLFxuICAgICAgICAgICAgYWxsUm93c1NlbGVjdGVkOiB0aGlzLmFyZUFsbFJvd1NlbGVjdGVkKG5ld1NlbGVjdGlvbilcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ncmlkLnJvd1NlbGVjdGlvbkNoYW5naW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFJvd3NXaXRoTm9FdmVudChuZXdTZWxlY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgdGhlIHNwZWNpZmllZCByb3dzIGFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBzZWxlY3RSb3dzKGtleXM6IGFueVtdLCBjbGVhclByZXZTZWxlY3Rpb24/OiBib29sZWFuLCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyaWQuaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByb3dzVG9TZWxlY3QgPSBrZXlzLmZpbHRlcih4ID0+ICF0aGlzLmlzUm93RGVsZXRlZCh4KSAmJiAhdGhpcy5yb3dTZWxlY3Rpb24uaGFzKHgpKTtcbiAgICAgICAgaWYgKCFyb3dzVG9TZWxlY3QubGVuZ3RoICYmICFjbGVhclByZXZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIG5vIHZhbGlkL2FkZGl0aW9uYWwgcm93cyB0byBzZWxlY3QgYW5kIG5vIGNsZWFyXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdldFNlbGVjdGVkUm93c0RhdGEoKTtcbiAgICAgICAgcm93c1RvU2VsZWN0ID0gdGhpcy5ncmlkLnByaW1hcnlLZXkgPyByb3dzVG9TZWxlY3QubWFwKHIgPT4gdGhpcy5nZXRSb3dEYXRhQnlJZChyKSkgOiByb3dzVG9TZWxlY3Q7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IHJvd3NUb1NlbGVjdCA6IFsuLi5zZWxlY3RlZFJvd3MsIC4uLnJvd3NUb1NlbGVjdF07XG4gICAgICAgIGNvbnN0IGtleXNBc1NldCA9IG5ldyBTZXQocm93c1RvU2VsZWN0KTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IHNlbGVjdGVkUm93cy5maWx0ZXIoeCA9PiAha2V5c0FzU2V0Lmhhcyh4KSkgOiBbXTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCByb3dzVG9TZWxlY3QsIHJlbW92ZWQsIGV2ZW50LCBzZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXNlbGVjdFJvd3Moa2V5czogYW55W10sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucm93U2VsZWN0aW9uLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm93c1RvRGVzZWxlY3QgPSBrZXlzLmZpbHRlcih4ID0+IHRoaXMucm93U2VsZWN0aW9uLmhhcyh4KSk7XG4gICAgICAgIGlmICghcm93c1RvRGVzZWxlY3QubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3NEYXRhKCk7XG4gICAgICAgIHJvd3NUb0Rlc2VsZWN0ID0gdGhpcy5ncmlkLnByaW1hcnlLZXkgPyByb3dzVG9EZXNlbGVjdC5tYXAociA9PiB0aGlzLmdldFJvd0RhdGFCeUlkKHIpKSA6IHJvd3NUb0Rlc2VsZWN0O1xuICAgICAgICBjb25zdCBrZXlzQXNTZXQgPSBuZXcgU2V0KHJvd3NUb0Rlc2VsZWN0KTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gc2VsZWN0ZWRSb3dzLmZpbHRlcihyID0+ICFrZXlzQXNTZXQuaGFzKHIpKTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgcm93c1RvRGVzZWxlY3QsIGV2ZW50LCBzZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3Qgc3BlY2lmaWVkIHJvd3MuIE5vIGV2ZW50IGlzIGVtaXR0ZWQuICovXG4gICAgcHVibGljIHNlbGVjdFJvd3NXaXRoTm9FdmVudChyb3dJRHM6IGFueVtdLCBjbGVhclByZXZTZWxlY3Rpb24/KTogdm9pZCB7XG4gICAgICAgIGlmIChjbGVhclByZXZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcm93SURzLmZvckVhY2gocm93SUQgPT4gdGhpcy5yb3dTZWxlY3Rpb24uYWRkKHJvd0lEKSk7XG4gICAgICAgIHRoaXMuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLm5leHQoKTtcbiAgICB9XG5cbiAgICAvKiogRGVzZWxlY3Qgc3BlY2lmaWVkIHJvd3MuIE5vIGV2ZW50IGlzIGVtaXR0ZWQuICovXG4gICAgcHVibGljIGRlc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgcm93SURzLmZvckVhY2gocm93SUQgPT4gdGhpcy5yb3dTZWxlY3Rpb24uZGVsZXRlKHJvd0lEKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLm5leHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNSb3dTZWxlY3RlZChyb3dJRCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSA+IDAgJiYgdGhpcy5yb3dTZWxlY3Rpb24uaGFzKHJvd0lEKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQaXZvdFJvd1NlbGVjdGVkKHJvd0lEKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJvd1NlbGVjdGlvbi5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdFJvd0lkID0gcm93SUQucmVwbGFjZSh4LCcnKTtcbiAgICAgICAgICAgIGlmIChyb3dJRC5pbmNsdWRlcyh4KSAmJiAoY29ycmVjdFJvd0lkID09PSAnJyB8fCBjb3JyZWN0Um93SWQuc3RhcnRzV2l0aCgnXycpKSApIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uLnNpemUgPiAwICYmIGNvbnRhaW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jvd0luSW5kZXRlcm1pbmF0ZVN0YXRlKHJvd0lEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGVSb3dzLnNpemUgPiAwICYmIHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3MuaGFzKHJvd0lEKTtcbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHJhbmdlIGZyb20gbGFzdCBzZWxlY3RlZCByb3cgdG8gdGhlIGN1cnJlbnQgc3BlY2lmaWVkIHJvdy4gKi9cbiAgICBwdWJsaWMgc2VsZWN0TXVsdGlwbGVSb3dzKHJvd0lELCByb3dEYXRhLCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnJvd1NlbGVjdGlvbi5zaXplIHx8IHRoaXMuaXNSb3dEZWxldGVkKHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3dCeUlkKHJvd0lEKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuYWxsRGF0YTtcbiAgICAgICAgY29uc3QgbGFzdFJvd0lEID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKVt0aGlzLnJvd1NlbGVjdGlvbi5zaXplIC0gMV07XG4gICAgICAgIGNvbnN0IGN1cnJJbmRleCA9IGdyaWREYXRhLmluZGV4T2YodGhpcy5nZXRSb3dEYXRhQnlJZChsYXN0Um93SUQpKTtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBncmlkRGF0YS5pbmRleE9mKHJvd0RhdGEpO1xuICAgICAgICBjb25zdCByb3dzID0gZ3JpZERhdGEuc2xpY2UoTWF0aC5taW4oY3VyckluZGV4LCBuZXdJbmRleCksIE1hdGgubWF4KGN1cnJJbmRleCwgbmV3SW5kZXgpICsgMSk7XG4gICAgICAgIGNvbnN0IGN1cnJTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkUm93c0RhdGEoKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSByb3dzLmZpbHRlcihyID0+ICF0aGlzLmlzUm93U2VsZWN0ZWQodGhpcy5nZXRSZWNvcmRLZXkocikpKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY3VyclNlbGVjdGlvbi5jb25jYXQoYWRkZWQpO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkLCBbXSwgZXZlbnQsIGN1cnJTZWxlY3Rpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcmVBbGxSb3dTZWxlY3RlZChuZXdTZWxlY3Rpb24/KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLmRhdGEgJiYgIW5ld1NlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCAhPT0gdW5kZWZpbmVkICYmICFuZXdTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFsbFJvd3NTZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZERhdGEgPSBuZXdTZWxlY3Rpb24gPyBuZXdTZWxlY3Rpb24gOiBbLi4udGhpcy5yb3dTZWxlY3Rpb25dXG4gICAgICAgIGNvbnN0IGFsbERhdGEgPSB0aGlzLmdldFJvd0lEcyh0aGlzLmFsbERhdGEpO1xuICAgICAgICBjb25zdCB1blNlbGVjdGVkUm93cyA9IGFsbERhdGEuZmlsdGVyKHJvdyA9PiAhc2VsZWN0ZWREYXRhLmluY2x1ZGVzKHJvdykpO1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSB0aGlzLmFsbERhdGEubGVuZ3RoID4gMCAmJiB1blNlbGVjdGVkUm93cy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1NvbWVSb3dTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5pc0ZpbHRlcmluZ0FwcGxpZWQoKSA/XG4gICAgICAgICAgICB0aGlzLmdldFJvd0lEcyh0aGlzLmdyaWQuZmlsdGVyZWREYXRhKS5zb21lKHJJRCA9PiB0aGlzLmlzUm93U2VsZWN0ZWQocklEKSkgOiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSA+IDAgJiYgZmlsdGVyZWREYXRhICYmICF0aGlzLmFyZUFsbFJvd1NlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJlZFNlbGVjdGVkUm93SWRzKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGaWx0ZXJpbmdBcHBsaWVkKCkgP1xuICAgICAgICAgICAgdGhpcy5nZXRSb3dJRHModGhpcy5hbGxEYXRhKS5maWx0ZXIocm93SUQgPT4gdGhpcy5pc1Jvd1NlbGVjdGVkKHJvd0lEKSkgOlxuICAgICAgICAgICAgdGhpcy5nZXRTZWxlY3RlZFJvd3MoKS5maWx0ZXIocm93SUQgPT4gIXRoaXMuaXNSb3dEZWxldGVkKHJvd0lEKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkLCByZW1vdmVkLCBldmVudD8sIGN1cnJTZWxlY3Rpb24/KTogYm9vbGVhbiB7XG4gICAgICAgIGN1cnJTZWxlY3Rpb24gPSBjdXJyU2VsZWN0aW9uID8/IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzRGF0YSgpO1xuICAgICAgICBpZiAodGhpcy5hcmVFcXVhbENvbGxlY3Rpb25zKGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzOiBJUm93U2VsZWN0aW9uRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IHRoaXMuZ3JpZCxcbiAgICAgICAgICAgIG9sZFNlbGVjdGlvbjogY3VyclNlbGVjdGlvbixcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbixcbiAgICAgICAgICAgIGFkZGVkLCByZW1vdmVkLFxuICAgICAgICAgICAgZXZlbnQsIGNhbmNlbDogZmFsc2UsXG4gICAgICAgICAgICBhbGxSb3dzU2VsZWN0ZWQ6IHRoaXMuYXJlQWxsUm93U2VsZWN0ZWQobmV3U2VsZWN0aW9uLm1hcChyID0+ICB0aGlzLmdldFJlY29yZEtleShyKSkpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5ncmlkLnJvd1NlbGVjdGlvbkNoYW5naW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFJvd3NXaXRoTm9FdmVudChhcmdzLm5ld1NlbGVjdGlvbi5tYXAociA9PiB0aGlzLmdldFJlY29yZEtleShyKSksIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQaXZvdFJvd3NCeUlkcyhpZHM6IGFueVtdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuZGF0YVZpZXcuZmlsdGVyKHIgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IHIuZGltZW5zaW9ucy5tYXAoZCA9PiBQaXZvdFV0aWwuZ2V0UmVjb3JkS2V5KHIsIGQpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KGlkcy5jb25jYXQoa2V5cykpLnNpemUgPCBpZHMubGVuZ3RoICsga2V5cy5sZW5ndGg7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSb3dEYXRhQnlJZChyb3dJRCk6IGFueSB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0Um93SURzKHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKSkuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgIHJldHVybiByb3dJbmRleCA8IDAgPyByb3dJRCA6IHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKVtyb3dJbmRleF07XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFySGVhZGVyQ0JTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJvd0lEcyhkYXRhKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQucHJpbWFyeUtleSAmJiBkYXRhLmxlbmd0aCA/IGRhdGEubWFwKHJlYyA9PiByZWNbdGhpcy5ncmlkLnByaW1hcnlLZXldKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlY29yZEtleShyZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5wcmltYXJ5S2V5ID8gcmVjb3JkW3RoaXMuZ3JpZC5wcmltYXJ5S2V5XSA6IHJlY29yZDtcbiAgICB9XG5cbiAgICAvKiogQ2xlYXIgcm93U2VsZWN0aW9uIGFuZCB1cGRhdGUgY2hlY2tib3ggc3RhdGUgKi9cbiAgICBwdWJsaWMgY2xlYXJBbGxTZWxlY3RlZFJvd3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UubmV4dCgpO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIGFsbCBkYXRhIGluIHRoZSBncmlkLCB3aXRoIGFwcGxpZWQgZmlsdGVyaW5nIGFuZCBzb3J0aW5nIGFuZCB3aXRob3V0IGRlbGV0ZWQgcm93cy4gKi9cbiAgICBwdWJsaWMgZ2V0IGFsbERhdGEoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIGxldCBhbGxEYXRhO1xuICAgICAgICBpZiAodGhpcy5pc0ZpbHRlcmluZ0FwcGxpZWQoKSB8fCB0aGlzLmdyaWQuc29ydGluZ0V4cHJlc3Npb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWxsRGF0YSA9IHRoaXMuZ3JpZC5waW5uZWRSZWNvcmRzQ291bnQgPyB0aGlzLmdyaWQuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhIDogdGhpcy5ncmlkLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsbERhdGEgPSB0aGlzLmdyaWQuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbERhdGEuZmlsdGVyKHJEYXRhID0+ICF0aGlzLmlzUm93RGVsZXRlZCh0aGlzLmdyaWQuZ3JpZEFQSS5nZXRfcm93X2lkKHJEYXRhKSkpO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBjb2x1bW5zIGZpZWxkcy4gKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5TZWxlY3Rpb24uc2l6ZSA/IEFycmF5LmZyb20odGhpcy5jb2x1bW5TZWxlY3Rpb24ua2V5cygpKSA6IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbHVtblNlbGVjdGVkKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uU2VsZWN0aW9uLnNpemUgPiAwICYmIHRoaXMuY29sdW1uU2VsZWN0aW9uLmhhcyhmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgZW1pdCBldmVudC4gKi9cbiAgICBwdWJsaWMgc2VsZWN0Q29sdW1uKGZpZWxkOiBzdHJpbmcsIGNsZWFyUHJldlNlbGVjdGlvbj8sIHNlbGVjdENvbHVtbnNSYW5nZT8sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGF0ZUNvbHVtbiA9IHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkID8gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZSh0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCkgOiBudWxsO1xuICAgICAgICBpZiAoIWV2ZW50IHx8ICFzdGF0ZUNvbHVtbiB8fCBzdGF0ZUNvbHVtbi52aXNpYmxlSW5kZXggPCAwIHx8ICFzZWxlY3RDb2x1bW5zUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkID0gZmllbGQ7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5yYW5nZSA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBjbGVhclByZXZTZWxlY3Rpb24gPyBbZmllbGRdIDogdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKS5pbmRleE9mKGZpZWxkKSAhPT0gLTEgP1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkgOiBbLi4udGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKSwgZmllbGRdO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuZmlsdGVyKGNvbEZpZWxkID0+IGNvbEZpZWxkICE9PSBmaWVsZCkgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gdGhpcy5pc0NvbHVtblNlbGVjdGVkKGZpZWxkKSA/IFtdIDogW2ZpZWxkXTtcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbHVtblNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgYWRkZWQsIHJlbW92ZWQsIGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RDb2x1bW5zUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uc1JhbmdlKGZpZWxkLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLiBBbmQgZW1pdCBldmVudC4gKi9cbiAgICBwdWJsaWMgc2VsZWN0Q29sdW1ucyhmaWVsZHM6IHN0cmluZ1tdLCBjbGVhclByZXZTZWxlY3Rpb24/LCBzZWxlY3RDb2x1bW5zUmFuZ2U/LCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IGZpZWxkcy5tYXAoZiA9PiB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKGYpKS5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KTtcbiAgICAgICAgY29uc3Qgc3RhdGVDb2x1bW4gPSB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA/IHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUodGhpcy5jb2x1bW5zU3RhdGUuZmllbGQpIDogbnVsbDtcbiAgICAgICAgaWYgKCFzdGF0ZUNvbHVtbiB8fCBzdGF0ZUNvbHVtbi52aXNpYmxlSW5kZXggPCAwIHx8ICFzZWxlY3RDb2x1bW5zUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkID0gY29sdW1uc1swXSA/IGNvbHVtbnNbMF0uZmllbGQgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zU3RhdGUucmFuZ2UgPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBmaWVsZHMuZmlsdGVyKGNvbEZpZWxkID0+ICF0aGlzLmlzQ29sdW1uU2VsZWN0ZWQoY29sRmllbGQpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjbGVhclByZXZTZWxlY3Rpb24gPyB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmZpbHRlcihjb2xGaWVsZCA9PiBmaWVsZHMuaW5kZXhPZihjb2xGaWVsZCkgPT09IC0xKSA6IFtdO1xuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gZmllbGRzIDogdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKS5jb25jYXQoYWRkZWQpO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXRDb2x1bW5TZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkLCByZW1vdmVkLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlZFN0YXJ0ID0gc3RhdGVDb2x1bW4udmlzaWJsZUluZGV4ID5cbiAgICAgICAgICAgICAgICBjb2x1bW5zW2NvbHVtbnMubGVuZ3RoIC0gMV0udmlzaWJsZUluZGV4ID8gY29sdW1uc1swXS5maWVsZCA6IGNvbHVtbnNbY29sdW1ucy5sZW5ndGggLSAxXS5maWVsZDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uc1JhbmdlKGZpbGVkU3RhcnQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgcmFuZ2UgZnJvbSBsYXN0IGNsaWNrZWQgY29sdW1uIHRvIHRoZSBjdXJyZW50IHNwZWNpZmllZCBjb2x1bW4uICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbnNSYW5nZShmaWVsZDogc3RyaW5nLCBldmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJySW5kZXggPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkKS52aXNpYmxlSW5kZXg7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5ncmlkLmNvbHVtblRvVmlzaWJsZUluZGV4KGZpZWxkKTtcbiAgICAgICAgY29uc3QgY29sdW1uc0ZpZWxkcyA9IHRoaXMuZ3JpZC52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpXG4gICAgICAgICAgICAuc2xpY2UoTWF0aC5taW4oY3VyckluZGV4LCBuZXdJbmRleCksIE1hdGgubWF4KGN1cnJJbmRleCwgbmV3SW5kZXgpICsgMSlcbiAgICAgICAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5zZWxlY3RhYmxlKS5tYXAoY29sID0+IGNvbC5maWVsZCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBbXTtcbiAgICAgICAgY29uc3Qgb2xkQWRkZWQgPSBbXTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBjb2x1bW5zRmllbGRzLmZpbHRlcihjb2xGaWVsZCA9PiAhdGhpcy5pc0NvbHVtblNlbGVjdGVkKGNvbEZpZWxkKSk7XG4gICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLnJhbmdlLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uc0ZpZWxkcy5pbmRleE9mKGYpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZWQucHVzaChmKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2xkQWRkZWQucHVzaChmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLnJhbmdlID0gY29sdW1uc0ZpZWxkcy5maWx0ZXIoY29sRmllbGQgPT4gIXRoaXMuaXNDb2x1bW5TZWxlY3RlZChjb2xGaWVsZCkgfHwgb2xkQWRkZWQuaW5kZXhPZihjb2xGaWVsZCkgPiAtMSk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuY29uY2F0KGFkZGVkKS5maWx0ZXIoYyA9PiByZW1vdmVkLmluZGV4T2YoYykgPT09IC0xKTtcbiAgICAgICAgdGhpcy5lbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3Qgc3BlY2lmaWVkIGNvbHVtbnMuIE5vIGV2ZW50IGlzIGVtaXR0ZWQuICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZHM6IHN0cmluZ1tdLCBjbGVhclByZXZTZWxlY3Rpb24/KTogdm9pZCB7XG4gICAgICAgIGlmIChjbGVhclByZXZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uU2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5TZWxlY3Rpb24uYWRkKGZpZWxkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlc2VsZWN0IHRoZSBzcGVjaWZpZWQgY29sdW1uIGFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbihmaWVsZDogc3RyaW5nLCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0Q29sdW1uc1N0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuZmlsdGVyKGMgPT4gYyAhPT0gZmllbGQpO1xuICAgICAgICB0aGlzLmVtaXRDb2x1bW5TZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIFtdLCBbZmllbGRdLCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIERlc2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLiBObyBldmVudCBpcyBlbWl0dGVkLiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHRoaXMuY29sdW1uU2VsZWN0aW9uLmRlbGV0ZShmaWVsZCkpO1xuICAgIH1cblxuICAgIC8qKiBEZXNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucy4gQW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIGRlc2VsZWN0Q29sdW1ucyhmaWVsZHM6IHN0cmluZ1tdLCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuZmlsdGVyKGNvbEZpZWxkID0+IGZpZWxkcy5pbmRleE9mKGNvbEZpZWxkKSA+IC0xKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKS5maWx0ZXIoY29sRmllbGQgPT4gZmllbGRzLmluZGV4T2YoY29sRmllbGQpID09PSAtMSk7XG5cbiAgICAgICAgdGhpcy5lbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQ/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICBpZiAodGhpcy5hcmVFcXVhbENvbGxlY3Rpb25zKGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgICAgICBvbGRTZWxlY3Rpb246IGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbixcbiAgICAgICAgICAgIGFkZGVkLCByZW1vdmVkLCBldmVudCwgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdyaWQuY29sdW1uU2VsZWN0aW9uQ2hhbmdpbmcuZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoYXJncy5uZXdTZWxlY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBDbGVhciBjb2x1bW5TZWxlY3Rpb24gKi9cbiAgICBwdWJsaWMgY2xlYXJBbGxTZWxlY3RlZENvbHVtbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29sdW1uU2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFyZUVxdWFsQ29sbGVjdGlvbnMoZmlyc3QsIHNlY29uZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmlyc3QubGVuZ3RoID09PSBzZWNvbmQubGVuZ3RoICYmIG5ldyBTZXQoZmlyc3QuY29uY2F0KHNlY29uZCkpLnNpemUgPT09IGZpcnN0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAo4pWvwrDilqHCsO+8ieKVr++4tSDilLvilIHilLtcbiAgICAgKiBDaHJvbWUgYW5kIENocm9taXVtIGRvbid0IGNhcmUgYWJvdXQgdGhlIGFjdGl2ZVxuICAgICAqIHJhbmdlIGFmdGVyIGtleWJvYXJkIG5hdmlnYXRpb24sIHRodXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9tb3ZlU2VsZWN0aW9uQ2hyb21lKG5vZGU6IE5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gbmV3IFJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZSk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNGaWx0ZXJpbmdBcHBsaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5lbXB0eSh0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB8fFxuICAgICAgICAgICAgIUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5lbXB0eSh0aGlzLmdyaWQuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNSb3dEZWxldGVkKHJvd0lEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuZ3JpZEFQSS5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbihyb3dJRCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb2ludGVyT3JpZ2luSGFuZGxlciA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLnBvaW50ZXJFdmVudEluR3JpZEJvZHkgPSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLnBvaW50ZXJPcmlnaW5IYW5kbGVyKTtcblxuICAgICAgICBjb25zdCB0YXJnZXRUYWdOYW1lID0gZXZlbnQudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRhcmdldFRhZ05hbWUgIT09ICdpZ3gtZ3JpZC1jZWxsJyAmJiB0YXJnZXRUYWdOYW1lICE9PSAnaWd4LXRyZWUtZ3JpZC1jZWxsJykge1xuICAgICAgICAgICAgdGhpcy5wb2ludGVyVXAodGhpcy5fbGFzdFNlbGVjdGVkTm9kZSwgdGhpcy5ncmlkLnJhbmdlU2VsZWN0ZWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiJdfQ==
752
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBWWpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBSXJELE1BQU0sT0FBTyx1QkFBdUI7SUE2QmhDOzs7T0FHRztJQUNILElBQVcsTUFBTTtRQUViLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFeEUsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENB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TSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNqRyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG9CQUFvQixDQUFDLElBQVU7UUFDbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxrQkFBa0I7UUFDdEIsT0FBTyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ3RFLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQUs7UUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDOzhHQTF6QlEsdUJBQXVCO2tIQUF2Qix1QkFBdUI7OzJGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgR3JpZFBhZ2luZ01vZGUgfSBmcm9tICcuLi9jb21tb24vZW51bXMnO1xuaW1wb3J0IHsgSVJvd1NlbGVjdGlvbkV2ZW50QXJncyB9IGZyb20gJy4uL2NvbW1vbi9ldmVudHMnO1xuaW1wb3J0IHsgR3JpZFR5cGUgfSBmcm9tICcuLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgICBHcmlkU2VsZWN0aW9uUmFuZ2UsXG4gICAgSUNvbHVtblNlbGVjdGlvblN0YXRlLFxuICAgIElNdWx0aVJvd0xheW91dE5vZGUsXG4gICAgSVNlbGVjdGlvbktleWJvYXJkU3RhdGUsXG4gICAgSVNlbGVjdGlvbk5vZGUsXG4gICAgSVNlbGVjdGlvblBvaW50ZXJTdGF0ZSxcbiAgICBTZWxlY3Rpb25TdGF0ZVxufSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgUGl2b3RVdGlsIH0gZnJvbSAnLi4vcGl2b3QtZ3JpZC9waXZvdC11dGlsJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSWd4R3JpZFNlbGVjdGlvblNlcnZpY2Uge1xuICAgIHB1YmxpYyBncmlkOiBHcmlkVHlwZTtcbiAgICBwdWJsaWMgZHJhZ01vZGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgYWN0aXZlRWxlbWVudDogSVNlbGVjdGlvbk5vZGUgfCBudWxsO1xuICAgIHB1YmxpYyBrZXlib2FyZFN0YXRlID0ge30gYXMgSVNlbGVjdGlvbktleWJvYXJkU3RhdGU7XG4gICAgcHVibGljIHBvaW50ZXJTdGF0ZSA9IHt9IGFzIElTZWxlY3Rpb25Qb2ludGVyU3RhdGU7XG4gICAgcHVibGljIGNvbHVtbnNTdGF0ZSA9IHt9IGFzIElDb2x1bW5TZWxlY3Rpb25TdGF0ZTtcblxuICAgIHB1YmxpYyBzZWxlY3Rpb24gPSBuZXcgTWFwPG51bWJlciwgU2V0PG51bWJlcj4+KCk7XG4gICAgcHVibGljIHRlbXAgPSBuZXcgTWFwPG51bWJlciwgU2V0PG51bWJlcj4+KCk7XG4gICAgcHVibGljIHJvd1NlbGVjdGlvbjogU2V0PGFueT4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBwdWJsaWMgaW5kZXRlcm1pbmF0ZVJvd3M6IFNldDxhbnk+ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgcHVibGljIGNvbHVtblNlbGVjdGlvbjogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZFJvd3NDaGFuZ2UgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlZCB3aGVuIGEgcG9pbnRlcmRvd24gZXZlbnQgaXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgZ3JpZCBib2R5IChjZWxscykuXG4gICAgICogV2hlbiBgZmFsc2VgIHRoZSBkcmFnIHNlbGVjdCBiZWhhdmlvciBpcyBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBvaW50ZXJFdmVudEluR3JpZEJvZHkgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgYWxsUm93c1NlbGVjdGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2xhc3RTZWxlY3RlZE5vZGU6IElTZWxlY3Rpb25Ob2RlO1xuICAgIHByaXZhdGUgX3JhbmdlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIF9zZWxlY3Rpb25SYW5nZTogUmFuZ2U7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHJhbmdlcyBpbiB0aGUgZ3JpZCBmcm9tIGJvdGhcbiAgICAgKiBrZXlib2FyZCBhbmQgcG9pbnRlciBpbnRlcmFjdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJhbmdlcygpOiBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB7XG5cbiAgICAgICAgLy8gVGhlIGxhc3QgYWN0aW9uIHdhcyBrZXlib2FyZCArIHNoaWZ0IHNlbGVjdGlvbiAtPiBhZGQgaXRcbiAgICAgICAgdGhpcy5hZGRLZXlib2FyZFJhbmdlKCk7XG5cbiAgICAgICAgY29uc3QgcmFuZ2VzID0gQXJyYXkuZnJvbSh0aGlzLl9yYW5nZXMpLm1hcChyYW5nZSA9PiBKU09OLnBhcnNlKHJhbmdlKSk7XG5cbiAgICAgICAgLy8gTm8gcmFuZ2VzIGJ1dCB3ZSBoYXZlIGEgZm9jdXNlZCBjZWxsIC0+IGFkZCBpdFxuICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGggJiYgdGhpcy5hY3RpdmVFbGVtZW50ICYmIHRoaXMuZ3JpZC5pc0NlbGxTZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICByYW5nZXMucHVzaCh0aGlzLmdlbmVyYXRlUmFuZ2UodGhpcy5hY3RpdmVFbGVtZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcHJpbWFyeUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9pbnRlclN0YXRlLnByaW1hcnlCdXR0b247XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwcmltYXJ5QnV0dG9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLnByaW1hcnlCdXR0b24gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwpIHtcbiAgICAgICAgdGhpcy5pbml0UG9pbnRlclN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5pdEtleWJvYXJkU3RhdGUoKTtcbiAgICAgICAgdGhpcy5pbml0Q29sdW1uc1N0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBrZXlib2FyZCBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0S2V5Ym9hcmRTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLm5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmtleWJvYXJkU3RhdGUuc2hpZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLnJhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgcG9pbnRlciBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0UG9pbnRlclN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUuY3RybCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5zaGlmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5yYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLnByaW1hcnlCdXR0b24gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgY29sdW1ucyBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0Q29sdW1uc1N0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA9IG51bGw7XG4gICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLnJhbmdlID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbmdsZSBub2RlLlxuICAgICAqIFNpbmdsZSBjbGlja3MgfCBDdHJsICsgc2luZ2xlIGNsaWNrcyBvbiBjZWxscyBpcyB0aGUgdXN1YWwgY2FzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBhZGRUb1JhbmdlID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaGFzKG5vZGUucm93KSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZ2V0KG5vZGUucm93KS5hZGQobm9kZS5jb2x1bW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0KG5vZGUucm93LCBuZXcgU2V0PG51bWJlcj4oKSkuZ2V0KG5vZGUucm93KS5hZGQobm9kZS5jb2x1bW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFkZFRvUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jhbmdlcy5hZGQoSlNPTi5zdHJpbmdpZnkodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBhY3RpdmUga2V5Ym9hcmQgcmFuZ2Ugc2VsZWN0aW9uIChpZiBhbnkpIHRvIHRoZSBgcmFuZ2VzYCBtZXRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRLZXlib2FyZFJhbmdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5rZXlib2FyZFN0YXRlLnJhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZXMuYWRkKEpTT04uc3RyaW5naWZ5KHRoaXMua2V5Ym9hcmRTdGF0ZS5yYW5nZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZShub2RlOiBJU2VsZWN0aW9uTm9kZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaGFzKG5vZGUucm93KSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZ2V0KG5vZGUucm93KS5kZWxldGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yYW5nZXMuZGVsZXRlKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0luTWFwKG5vZGU6IElTZWxlY3Rpb25Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zZWxlY3Rpb24uaGFzKG5vZGUucm93KSAmJiB0aGlzLnNlbGVjdGlvbi5nZXQobm9kZS5yb3cpLmhhcyhub2RlLmNvbHVtbikpIHx8XG4gICAgICAgICAgICAodGhpcy50ZW1wLmhhcyhub2RlLnJvdykgJiYgdGhpcy50ZW1wLmdldChub2RlLnJvdykuaGFzKG5vZGUuY29sdW1uKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdGVkKG5vZGU6IElTZWxlY3Rpb25Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0FjdGl2ZU5vZGUobm9kZSkgJiYgdGhpcy5ncmlkLmlzQ2VsbFNlbGVjdGFibGUpIHx8IHRoaXMuaXNJbk1hcChub2RlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY3RpdmVOb2RlKG5vZGU6IElTZWxlY3Rpb25Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5hY3RpdmVFbGVtZW50LmNvbHVtbiA9PT0gbm9kZS5jb2x1bW4gJiYgdGhpcy5hY3RpdmVFbGVtZW50LnJvdyA9PT0gbm9kZS5yb3c7XG4gICAgICAgICAgICBpZiAodGhpcy5ncmlkLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmFjdGl2ZUVsZW1lbnQubGF5b3V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0FjdGl2ZSAmJiB0aGlzLmlzQWN0aXZlTGF5b3V0KGxheW91dCwgbm9kZS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzQWN0aXZlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY3RpdmVMYXlvdXQoY3VycmVudDogSU11bHRpUm93TGF5b3V0Tm9kZSwgdGFyZ2V0OiBJTXVsdGlSb3dMYXlvdXROb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjdXJyZW50LmNvbHVtblZpc2libGVJbmRleCA9PT0gdGFyZ2V0LmNvbHVtblZpc2libGVJbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUmFuZ2VNZXRhKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzdGF0ZT86IFNlbGVjdGlvblN0YXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jhbmdlcy5hZGQoSlNPTi5zdHJpbmdpZnkodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIHN0YXRlKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVSYW5nZU1ldGEobm9kZTogSVNlbGVjdGlvbk5vZGUsIHN0YXRlPzogU2VsZWN0aW9uU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmFuZ2VzLmRlbGV0ZShKU09OLnN0cmluZ2lmeSh0aGlzLmdlbmVyYXRlUmFuZ2Uobm9kZSwgc3RhdGUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgbmV3IHNlbGVjdGlvbiByYW5nZSBmcm9tIHRoZSBnaXZlbiBgbm9kZWAuXG4gICAgICogSWYgYHN0YXRlYCBpcyBwYXNzZWQgaW5zdGVhZCBpdCB3aWxsIGdlbmVyYXRlIHRoZSByYW5nZSBiYXNlZCBvbiB0aGUgcGFzc2VkIGBub2RlYFxuICAgICAqIGFuZCB0aGUgc3RhcnQgbm9kZSBvZiB0aGUgYHN0YXRlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVSYW5nZShub2RlOiBJU2VsZWN0aW9uTm9kZSwgc3RhdGU/OiBTZWxlY3Rpb25TdGF0ZSk6IEdyaWRTZWxlY3Rpb25SYW5nZSB7XG4gICAgICAgIHRoaXMuX2xhc3RTZWxlY3RlZE5vZGUgPSBub2RlO1xuXG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcm93U3RhcnQ6IG5vZGUucm93LFxuICAgICAgICAgICAgICAgIHJvd0VuZDogbm9kZS5yb3csXG4gICAgICAgICAgICAgICAgY29sdW1uU3RhcnQ6IG5vZGUuY29sdW1uLFxuICAgICAgICAgICAgICAgIGNvbHVtbkVuZDogbm9kZS5jb2x1bW5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHJvdywgY29sdW1uIH0gPSBzdGF0ZS5ub2RlO1xuICAgICAgICBjb25zdCByb3dTdGFydCA9IE1hdGgubWluKG5vZGUucm93LCByb3cpO1xuICAgICAgICBjb25zdCByb3dFbmQgPSBNYXRoLm1heChub2RlLnJvdywgcm93KTtcbiAgICAgICAgY29uc3QgY29sdW1uU3RhcnQgPSBNYXRoLm1pbihub2RlLmNvbHVtbiwgY29sdW1uKTtcbiAgICAgICAgY29uc3QgY29sdW1uRW5kID0gTWF0aC5tYXgobm9kZS5jb2x1bW4sIGNvbHVtbik7XG5cbiAgICAgICAgcmV0dXJuIHsgcm93U3RhcnQsIHJvd0VuZCwgY29sdW1uU3RhcnQsIGNvbHVtbkVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGtleWJvYXJkU3RhdGVPbktleWRvd24obm9kZTogSVNlbGVjdGlvbk5vZGUsIHNoaWZ0OiBib29sZWFuLCBzaGlmdFRhYjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkU3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbml0UG9pbnRlclN0YXRlKCk7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5zaGlmdCA9IHNoaWZ0ICYmICFzaGlmdFRhYjtcbiAgICAgICAgaWYgKCF0aGlzLmdyaWQubmF2aWdhdGlvbi5pc0RhdGFSb3cobm9kZS5yb3cpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gS2IgbmF2aWdhdGlvbiB3aXRoIHNoaWZ0IGFuZCBubyBwcmV2aW91cyBub2RlLlxuICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW5pdCB0aGUgc3RhcnQgbm9kZS5cbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdGF0ZS5zaGlmdCAmJiAhdGhpcy5rZXlib2FyZFN0YXRlLm5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5ub2RlID0gT2JqZWN0LmFzc2lnbih7fSwgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMga2V5Ym9hcmRTdGF0ZU9uRm9jdXMobm9kZTogSVNlbGVjdGlvbk5vZGUsIGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxHcmlkU2VsZWN0aW9uUmFuZ2U+LCBkb20pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qga2JTdGF0ZSA9IHRoaXMua2V5Ym9hcmRTdGF0ZTtcblxuICAgICAgICAvLyBGb2N1cyB0cmlnZ2VyZWQgYnkga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICBpZiAoa2JTdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzQ2hyb21pdW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlU2VsZWN0aW9uQ2hyb21lKGRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdGFydCBnZW5lcmF0aW5nIGEgcmFuZ2UgaWYgc2hpZnQgaXMgaG9sZFxuICAgICAgICAgICAgaWYgKGtiU3RhdGUuc2hpZnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTZWxlY3Qobm9kZSwga2JTdGF0ZSk7XG4gICAgICAgICAgICAgICAga2JTdGF0ZS5yYW5nZSA9IHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCBrYlN0YXRlKTtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIGtiU3RhdGUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5pdEtleWJvYXJkU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBvaW50ZXJEb3duKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzaGlmdDogYm9vbGVhbiwgY3RybDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZEtleWJvYXJkUmFuZ2UoKTtcbiAgICAgICAgdGhpcy5pbml0S2V5Ym9hcmRTdGF0ZSgpO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5jdHJsID0gY3RybDtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUuc2hpZnQgPSBzaGlmdDtcbiAgICAgICAgdGhpcy5wb2ludGVyRXZlbnRJbkdyaWRCb2R5ID0gdHJ1ZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLnBvaW50ZXJPcmlnaW5IYW5kbGVyKTtcblxuICAgICAgICAvLyBObyBjdHJsIGtleSBwcmVzc2VkIC0gbm8gbXVsdGlwbGUgc2VsZWN0aW9uXG4gICAgICAgIGlmICghY3RybCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNoaWZ0KSB7XG4gICAgICAgICAgICAvLyBObyBwcmV2aW91c2x5ICdjbGlja2VkJyBub2RlLiBVc2UgdGhlIGxhc3QgYWN0aXZlIG5vZGUuXG4gICAgICAgICAgICBpZiAoIXRoaXMucG9pbnRlclN0YXRlLm5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlID0gdGhpcy5hY3RpdmVFbGVtZW50IHx8IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJEb3duU2hpZnRLZXkobm9kZSk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVSYW5nZU1ldGEobm9kZSk7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLm5vZGUgPSBub2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBwb2ludGVyRG93blNoaWZ0S2V5KG5vZGU6IElTZWxlY3Rpb25Ob2RlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RSYW5nZShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG1lcmdlTWFwKHRhcmdldDogTWFwPG51bWJlciwgU2V0PG51bWJlcj4+LCBzb3VyY2U6IE1hcDxudW1iZXIsIFNldDxudW1iZXI+Pik6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHNvdXJjZS5lbnRyaWVzKCk7XG4gICAgICAgIGxldCBwYWlyID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBsZXQga2V5OiBudW1iZXI7XG4gICAgICAgIGxldCB2YWx1ZTogU2V0PG51bWJlcj47XG5cbiAgICAgICAgd2hpbGUgKCFwYWlyLmRvbmUpIHtcbiAgICAgICAgICAgIFtrZXksIHZhbHVlXSA9IHBhaXIudmFsdWU7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0YXJnZXQuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChyZWNvcmQgPT4gbmV3VmFsdWUuYWRkKHJlY29yZCkpO1xuICAgICAgICAgICAgICAgIHRhcmdldC5zZXQoa2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWlyID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBvaW50ZXJFbnRlcihub2RlOiBJU2VsZWN0aW9uTm9kZSwgZXZlbnQ6IFBvaW50ZXJFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy8jdGhlLWJ1dHRvbi1wcm9wZXJ0eVxuICAgICAgICB0aGlzLmRyYWdNb2RlID0gKGV2ZW50LmJ1dHRvbnMgPT09IDEgJiYgKGV2ZW50LmJ1dHRvbiA9PT0gLTEgfHwgZXZlbnQuYnV0dG9uID09PSAwKSkgJiYgdGhpcy5wb2ludGVyRXZlbnRJbkdyaWRCb2R5O1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ01vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VycyB0cmlnZ2VycyBhIGRyYWctbGlrZSBldmVudCBieSBmaXJzdCBjbGlja2luZyBvdXRzaWRlIHRoZSBncmlkIGNlbGxzXG4gICAgICAgIC8vIGFuZCB0aGVuIGVudGVycyBpbiB0aGUgZ3JpZCBib2R5IHdlIG1heSBub3QgaGF2ZSBhIGluaXRpYWwgcG9pbnRlciBzdGFydGluZyBub2RlLlxuICAgICAgICAvLyBBc3N1bWUgdGhlIGZpcnN0IHBvaW50ZXJlbnRlciBub2RlIGlzIHdoZXJlIHdlIHN0YXJ0LlxuICAgICAgICBpZiAoIXRoaXMucG9pbnRlclN0YXRlLm5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRlclN0YXRlLm5vZGUgPSBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucG9pbnRlclN0YXRlLmN0cmwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0UmFuZ2Uobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUsIHRoaXMudGVtcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdTZWxlY3Qobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBwb2ludGVyVXAobm9kZTogSVNlbGVjdGlvbk5vZGUsIGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxHcmlkU2VsZWN0aW9uUmFuZ2U+LCBmaXJlZE91dHNpZGVHcmlkPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5kcmFnTW9kZSB8fCBmaXJlZE91dHNpZGVHcmlkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmFkZFJhbmdlTWV0YShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm1lcmdlTWFwKHRoaXMuc2VsZWN0aW9uLCB0aGlzLnRlbXApO1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1blRhc2soKCkgPT4gZW1pdHRlci5lbWl0KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSkpKTtcbiAgICAgICAgICAgIHRoaXMudGVtcC5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5kcmFnTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wb2ludGVyU3RhdGUuc2hpZnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmFkZFJhbmdlTWV0YShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSk7XG4gICAgICAgICAgICBlbWl0dGVyLmVtaXQodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIHRoaXMucG9pbnRlclN0YXRlKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvaW50ZXJFdmVudEluR3JpZEJvZHkgJiYgdGhpcy5pc0FjdGl2ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0UmFuZ2Uobm9kZTogSVNlbGVjdGlvbk5vZGUsIHN0YXRlOiBTZWxlY3Rpb25TdGF0ZSwgY29sbGVjdGlvbjogTWFwPG51bWJlciwgU2V0PG51bWJlcj4+ID0gdGhpcy5zZWxlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT09IHRoaXMudGVtcCkge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgcm93U3RhcnQsIHJvd0VuZCwgY29sdW1uU3RhcnQsIGNvbHVtbkVuZCB9ID0gdGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIHN0YXRlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHJvd1N0YXJ0OyBpIDw9IHJvd0VuZDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gY29sdW1uU3RhcnQgYXMgbnVtYmVyOyBqIDw9IChjb2x1bW5FbmQgYXMgbnVtYmVyKTsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24uaGFzKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZ2V0KGkpLmFkZChqKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnNldChpLCBuZXcgU2V0PG51bWJlcj4oKSkuZ2V0KGkpLmFkZChqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZHJhZ1NlbGVjdChub2RlOiBJU2VsZWN0aW9uTm9kZSwgc3RhdGU6IFNlbGVjdGlvblN0YXRlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wb2ludGVyU3RhdGUuY3RybCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFJhbmdlKG5vZGUsIHN0YXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoY2xlYXJBY3JpdmVFbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmIChjbGVhckFjcml2ZUVsKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGVtcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9yYW5nZXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJUZXh0U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvblJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlc3RvcmVUZXh0U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZSh0aGlzLl9zZWxlY3Rpb25SYW5nZSB8fCBkb2N1bWVudC5jcmVhdGVSYW5nZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWxlY3RlZFJvd3NEYXRhKCkge1xuICAgICAgICBpZiAodGhpcy5ncmlkLmlzUGl2b3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQuZGF0YVZpZXcuZmlsdGVyKHIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSByLmRpbWVuc2lvbnMubWFwKGQgPT4gUGl2b3RVdGlsLmdldFJlY29yZEtleShyLCBkKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleXMuc29tZShrID0+IHRoaXMuaXNQaXZvdFJvd1NlbGVjdGVkKGspKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucm93U2VsZWN0aW9uLnNpemUgJiYgKHRoaXMuZ3JpZCBhcyBhbnkpLnRvdGFsSXRlbUNvdW50IHx8IHRoaXMuZ3JpZC5wYWdpbmdNb2RlID09PSBHcmlkUGFnaW5nTW9kZS5SZW1vdGUpIHtcbiAgICAgICAgICAgIGlmKCF0aGlzLmdyaWQucHJpbWFyeUtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucm93U2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3Rpb24uZm9yRWFjaChySUQgPT4gIHtcbiAgICAgICAgICAgICAgICBjb25zdCByRGF0YSA9IHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKS5maW5kKHJvdyA9PiB0aGlzLmdldFJlY29yZEtleShyb3cpID09PSBySUQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxSb3dEYXRhID0ge307XG4gICAgICAgICAgICAgICAgcGFydGlhbFJvd0RhdGFbdGhpcy5ncmlkLnByaW1hcnlLZXldID0gcklEO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5wdXNoKHJEYXRhID8gckRhdGEgOiBwYXJ0aWFsUm93RGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uLnNpemUgPyB0aGlzLmdyaWQuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodHJ1ZSkuZmlsdGVyKHJvdyA9PiB0aGlzLnJvd1NlbGVjdGlvbi5oYXModGhpcy5nZXRSZWNvcmRLZXkocm93KSkpIDogW107XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgYXJyYXkgb2YgdGhlIHNlbGVjdGVkIHJvdyBpZCdzLiAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZFJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbi5zaXplID8gQXJyYXkuZnJvbSh0aGlzLnJvd1NlbGVjdGlvbi5rZXlzKCkpIDogW107XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgYXJyYXkgb2YgdGhlIHJvd3MgaW4gaW5kZXRlcm1pbmF0ZSBzdGF0ZS4gKi9cbiAgICBwdWJsaWMgZ2V0SW5kZXRlcm1pbmF0ZVJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGVSb3dzLnNpemUgPyBBcnJheS5mcm9tKHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3Mua2V5cygpKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKiBDbGVhcnMgcm93IHNlbGVjdGlvbiwgaWYgZmlsdGVyaW5nIGlzIGFwcGxpZWQgY2xlYXJzIG9ubHkgc2VsZWN0ZWQgcm93cyBmcm9tIGZpbHRlcmVkIGRhdGEuICovXG4gICAgcHVibGljIGNsZWFyUm93U2VsZWN0aW9uKGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdldFNlbGVjdGVkUm93c0RhdGEoKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZFJlYyA9IHRoaXMuaXNGaWx0ZXJpbmdBcHBsaWVkKCkgP1xuICAgICAgICAgICAgdGhpcy5hbGxEYXRhLmZpbHRlcihyb3cgPT4gdGhpcy5pc1Jvd1NlbGVjdGVkKHRoaXMuZ2V0UmVjb3JkS2V5KHJvdykpKSA6IHNlbGVjdGVkUm93cztcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5pc0ZpbHRlcmluZ0FwcGxpZWQoKSA/IHNlbGVjdGVkUm93cy5maWx0ZXIoeCA9PiAhcmVtb3ZlZFJlYy5pbmNsdWRlcyh4KSkgOiBbXTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgcmVtb3ZlZFJlYywgZXZlbnQsIHNlbGVjdGVkUm93cyk7XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdCBhbGwgcm93cywgaWYgZmlsdGVyaW5nIGlzIGFwcGxpZWQgc2VsZWN0IG9ubHkgZnJvbSBmaWx0ZXJlZCBkYXRhLiAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxSb3dzKGV2ZW50Pykge1xuICAgICAgICBjb25zdCBhZGRlZFJvd3MgPSB0aGlzLmFsbERhdGEuZmlsdGVyKChyb3cpID0+ICF0aGlzLmlzUm93U2VsZWN0ZWQodGhpcy5nZXRSZWNvcmRLZXkocm93KSkpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdldFNlbGVjdGVkUm93c0RhdGEoKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSA/IHNlbGVjdGVkUm93cy5jb25jYXQoYWRkZWRSb3dzKSA6IGFkZGVkUm93cztcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlUm93cy5jbGVhcigpO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkUm93cywgW10sIGV2ZW50LCBzZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgdGhlIHNwZWNpZmllZCByb3cgYW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIHNlbGVjdFJvd0J5SWQocm93SUQsIGNsZWFyUHJldlNlbGVjdGlvbj8sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoISh0aGlzLmdyaWQuaXNSb3dTZWxlY3RhYmxlIHx8IHRoaXMuZ3JpZC5pc1Bpdm90KSB8fCB0aGlzLmlzUm93RGVsZXRlZChyb3dJRCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjbGVhclByZXZTZWxlY3Rpb24gPSAhdGhpcy5ncmlkLmlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkIHx8IGNsZWFyUHJldlNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5pc1Bpdm90KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFBpdm90Um93QnlJZChyb3dJRCwgY2xlYXJQcmV2U2VsZWN0aW9uLCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3NEYXRhKCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IFt0aGlzLmdldFJvd0RhdGFCeUlkKHJvd0lEKV0gOiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMocm93SUQpID9cbiAgICAgICAgICAgIHNlbGVjdGVkUm93cyA6IFsuLi5zZWxlY3RlZFJvd3MsIHRoaXMuZ2V0Um93RGF0YUJ5SWQocm93SUQpXTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IHNlbGVjdGVkUm93cyA6IFtdO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIFt0aGlzLmdldFJvd0RhdGFCeUlkKHJvd0lEKV0sIHJlbW92ZWQsIGV2ZW50LCBzZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RQaXZvdFJvd0J5SWQocm93SUQsIGNsZWFyUHJldlNlbGVjdGlvbjogYm9vbGVhbiwgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IFtyb3dJRF0gOiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMocm93SUQpID8gc2VsZWN0ZWRSb3dzIDogWy4uLnNlbGVjdGVkUm93cywgcm93SURdO1xuICAgICAgICBjb25zdCBhZGRlZCA9IHRoaXMuZ2V0UGl2b3RSb3dzQnlJZHMoW3Jvd0lEXSk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLmdldFBpdm90Um93c0J5SWRzKGNsZWFyUHJldlNlbGVjdGlvbiA/IHNlbGVjdGVkUm93cyA6IFtdKTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnRQaXZvdEdyaWQoc2VsZWN0ZWRSb3dzLCBuZXdTZWxlY3Rpb24sIGFkZGVkLCByZW1vdmVkLCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIERlc2VsZWN0IHRoZSBzcGVjaWZpZWQgcm93IGFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdFJvdyhyb3dJRCwgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1Jvd1NlbGVjdGVkKHJvd0lEKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuZ3JpZC5pc1Bpdm90KSB7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGl2b3RSb3dCeUlEKHJvd0lELCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3NEYXRhKCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHNlbGVjdGVkUm93cy5maWx0ZXIociA9PiAgdGhpcy5nZXRSZWNvcmRLZXkocikgIT09IHJvd0lEKTtcbiAgICAgICAgaWYgKHRoaXMucm93U2VsZWN0aW9uLnNpemUgJiYgdGhpcy5yb3dTZWxlY3Rpb24uaGFzKHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgW3RoaXMuZ2V0Um93RGF0YUJ5SWQocm93SUQpXSwgZXZlbnQsIHNlbGVjdGVkUm93cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzZWxlY3RQaXZvdFJvd0J5SUQocm93SUQsIGV2ZW50Pykge1xuICAgICAgICBpZiAodGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSAmJiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMocm93SUQpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyU2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGN1cnJTZWxlY3Rpb24uZmlsdGVyKHIgPT4gciAhPT0gcm93SUQpO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCAgPSB0aGlzLmdldFBpdm90Um93c0J5SWRzKFtyb3dJRF0pO1xuICAgICAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnRQaXZvdEdyaWQoY3VyclNlbGVjdGlvbiwgbmV3U2VsZWN0aW9uLCBbXSwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbWl0Um93U2VsZWN0aW9uRXZlbnRQaXZvdEdyaWQoY3VyclNlbGVjdGlvbiwgbmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJlRXF1YWxDb2xsZWN0aW9ucyhjdXJyU2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUm93cyA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzRGF0YSgpO1xuICAgICAgICBjb25zdCBhcmdzOiBJUm93U2VsZWN0aW9uRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IHRoaXMuZ3JpZCxcbiAgICAgICAgICAgIG9sZFNlbGVjdGlvbjogY3VyclNlbGVjdGVkUm93cyxcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbjogdGhpcy5nZXRQaXZvdFJvd3NCeUlkcyhuZXdTZWxlY3Rpb24pLFxuICAgICAgICAgICAgYWRkZWQsXG4gICAgICAgICAgICByZW1vdmVkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlLFxuICAgICAgICAgICAgYWxsUm93c1NlbGVjdGVkOiB0aGlzLmFyZUFsbFJvd1NlbGVjdGVkKG5ld1NlbGVjdGlvbilcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ncmlkLnJvd1NlbGVjdGlvbkNoYW5naW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFJvd3NXaXRoTm9FdmVudChuZXdTZWxlY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgdGhlIHNwZWNpZmllZCByb3dzIGFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBzZWxlY3RSb3dzKGtleXM6IGFueVtdLCBjbGVhclByZXZTZWxlY3Rpb24/OiBib29sZWFuLCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyaWQuaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByb3dzVG9TZWxlY3QgPSBrZXlzLmZpbHRlcih4ID0+ICF0aGlzLmlzUm93RGVsZXRlZCh4KSAmJiAhdGhpcy5yb3dTZWxlY3Rpb24uaGFzKHgpKTtcbiAgICAgICAgaWYgKCFyb3dzVG9TZWxlY3QubGVuZ3RoICYmICFjbGVhclByZXZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIG5vIHZhbGlkL2FkZGl0aW9uYWwgcm93cyB0byBzZWxlY3QgYW5kIG5vIGNsZWFyXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdldFNlbGVjdGVkUm93c0RhdGEoKTtcbiAgICAgICAgcm93c1RvU2VsZWN0ID0gdGhpcy5ncmlkLnByaW1hcnlLZXkgPyByb3dzVG9TZWxlY3QubWFwKHIgPT4gdGhpcy5nZXRSb3dEYXRhQnlJZChyKSkgOiByb3dzVG9TZWxlY3Q7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IHJvd3NUb1NlbGVjdCA6IFsuLi5zZWxlY3RlZFJvd3MsIC4uLnJvd3NUb1NlbGVjdF07XG4gICAgICAgIGNvbnN0IGtleXNBc1NldCA9IG5ldyBTZXQocm93c1RvU2VsZWN0KTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IHNlbGVjdGVkUm93cy5maWx0ZXIoeCA9PiAha2V5c0FzU2V0Lmhhcyh4KSkgOiBbXTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCByb3dzVG9TZWxlY3QsIHJlbW92ZWQsIGV2ZW50LCBzZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXNlbGVjdFJvd3Moa2V5czogYW55W10sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucm93U2VsZWN0aW9uLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm93c1RvRGVzZWxlY3QgPSBrZXlzLmZpbHRlcih4ID0+IHRoaXMucm93U2VsZWN0aW9uLmhhcyh4KSk7XG4gICAgICAgIGlmICghcm93c1RvRGVzZWxlY3QubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3NEYXRhKCk7XG4gICAgICAgIHJvd3NUb0Rlc2VsZWN0ID0gdGhpcy5ncmlkLnByaW1hcnlLZXkgPyByb3dzVG9EZXNlbGVjdC5tYXAociA9PiB0aGlzLmdldFJvd0RhdGFCeUlkKHIpKSA6IHJvd3NUb0Rlc2VsZWN0O1xuICAgICAgICBjb25zdCBrZXlzQXNTZXQgPSBuZXcgU2V0KHJvd3NUb0Rlc2VsZWN0KTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gc2VsZWN0ZWRSb3dzLmZpbHRlcihyID0+ICFrZXlzQXNTZXQuaGFzKHIpKTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgcm93c1RvRGVzZWxlY3QsIGV2ZW50LCBzZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3Qgc3BlY2lmaWVkIHJvd3MuIE5vIGV2ZW50IGlzIGVtaXR0ZWQuICovXG4gICAgcHVibGljIHNlbGVjdFJvd3NXaXRoTm9FdmVudChyb3dJRHM6IGFueVtdLCBjbGVhclByZXZTZWxlY3Rpb24/KTogdm9pZCB7XG4gICAgICAgIGlmIChjbGVhclByZXZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcm93SURzLmZvckVhY2gocm93SUQgPT4gdGhpcy5yb3dTZWxlY3Rpb24uYWRkKHJvd0lEKSk7XG4gICAgICAgIHRoaXMuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLm5leHQoKTtcbiAgICB9XG5cbiAgICAvKiogRGVzZWxlY3Qgc3BlY2lmaWVkIHJvd3MuIE5vIGV2ZW50IGlzIGVtaXR0ZWQuICovXG4gICAgcHVibGljIGRlc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgcm93SURzLmZvckVhY2gocm93SUQgPT4gdGhpcy5yb3dTZWxlY3Rpb24uZGVsZXRlKHJvd0lEKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLm5leHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNSb3dTZWxlY3RlZChyb3dJRCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSA+IDAgJiYgdGhpcy5yb3dTZWxlY3Rpb24uaGFzKHJvd0lEKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQaXZvdFJvd1NlbGVjdGVkKHJvd0lEKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJvd1NlbGVjdGlvbi5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdFJvd0lkID0gcm93SUQucmVwbGFjZSh4LCcnKTtcbiAgICAgICAgICAgIGlmIChyb3dJRC5pbmNsdWRlcyh4KSAmJiAoY29ycmVjdFJvd0lkID09PSAnJyB8fCBjb3JyZWN0Um93SWQuc3RhcnRzV2l0aCgnXycpKSApIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uLnNpemUgPiAwICYmIGNvbnRhaW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jvd0luSW5kZXRlcm1pbmF0ZVN0YXRlKHJvd0lEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGVSb3dzLnNpemUgPiAwICYmIHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3MuaGFzKHJvd0lEKTtcbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHJhbmdlIGZyb20gbGFzdCBzZWxlY3RlZCByb3cgdG8gdGhlIGN1cnJlbnQgc3BlY2lmaWVkIHJvdy4gKi9cbiAgICBwdWJsaWMgc2VsZWN0TXVsdGlwbGVSb3dzKHJvd0lELCByb3dEYXRhLCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnJvd1NlbGVjdGlvbi5zaXplIHx8IHRoaXMuaXNSb3dEZWxldGVkKHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3dCeUlkKHJvd0lEKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuYWxsRGF0YTtcbiAgICAgICAgY29uc3QgbGFzdFJvd0lEID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKVt0aGlzLnJvd1NlbGVjdGlvbi5zaXplIC0gMV07XG4gICAgICAgIGNvbnN0IGN1cnJJbmRleCA9IGdyaWREYXRhLmluZGV4T2YodGhpcy5nZXRSb3dEYXRhQnlJZChsYXN0Um93SUQpKTtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBncmlkRGF0YS5pbmRleE9mKHJvd0RhdGEpO1xuICAgICAgICBjb25zdCByb3dzID0gZ3JpZERhdGEuc2xpY2UoTWF0aC5taW4oY3VyckluZGV4LCBuZXdJbmRleCksIE1hdGgubWF4KGN1cnJJbmRleCwgbmV3SW5kZXgpICsgMSk7XG4gICAgICAgIGNvbnN0IGN1cnJTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkUm93c0RhdGEoKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSByb3dzLmZpbHRlcihyID0+ICF0aGlzLmlzUm93U2VsZWN0ZWQodGhpcy5nZXRSZWNvcmRLZXkocikpKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY3VyclNlbGVjdGlvbi5jb25jYXQoYWRkZWQpO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkLCBbXSwgZXZlbnQsIGN1cnJTZWxlY3Rpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcmVBbGxSb3dTZWxlY3RlZChuZXdTZWxlY3Rpb24/KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLmRhdGEgJiYgIW5ld1NlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCAhPT0gdW5kZWZpbmVkICYmICFuZXdTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFsbFJvd3NTZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZERhdGEgPSBuZXdTZWxlY3Rpb24gPyBuZXdTZWxlY3Rpb24gOiBbLi4udGhpcy5yb3dTZWxlY3Rpb25dXG4gICAgICAgIGNvbnN0IGFsbERhdGEgPSB0aGlzLmdldFJvd0lEcyh0aGlzLmFsbERhdGEpO1xuICAgICAgICBjb25zdCB1blNlbGVjdGVkUm93cyA9IGFsbERhdGEuZmlsdGVyKHJvdyA9PiAhc2VsZWN0ZWREYXRhLmluY2x1ZGVzKHJvdykpO1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSB0aGlzLmFsbERhdGEubGVuZ3RoID4gMCAmJiB1blNlbGVjdGVkUm93cy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1NvbWVSb3dTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5pc0ZpbHRlcmluZ0FwcGxpZWQoKSA/XG4gICAgICAgICAgICB0aGlzLmdldFJvd0lEcyh0aGlzLmdyaWQuZmlsdGVyZWREYXRhKS5zb21lKHJJRCA9PiB0aGlzLmlzUm93U2VsZWN0ZWQocklEKSkgOiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSA+IDAgJiYgZmlsdGVyZWREYXRhICYmICF0aGlzLmFyZUFsbFJvd1NlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJlZFNlbGVjdGVkUm93SWRzKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGaWx0ZXJpbmdBcHBsaWVkKCkgP1xuICAgICAgICAgICAgdGhpcy5nZXRSb3dJRHModGhpcy5hbGxEYXRhKS5maWx0ZXIocm93SUQgPT4gdGhpcy5pc1Jvd1NlbGVjdGVkKHJvd0lEKSkgOlxuICAgICAgICAgICAgdGhpcy5nZXRTZWxlY3RlZFJvd3MoKS5maWx0ZXIocm93SUQgPT4gIXRoaXMuaXNSb3dEZWxldGVkKHJvd0lEKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkLCByZW1vdmVkLCBldmVudD8sIGN1cnJTZWxlY3Rpb24/KTogYm9vbGVhbiB7XG4gICAgICAgIGN1cnJTZWxlY3Rpb24gPSBjdXJyU2VsZWN0aW9uID8/IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzRGF0YSgpO1xuICAgICAgICBpZiAodGhpcy5hcmVFcXVhbENvbGxlY3Rpb25zKGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzOiBJUm93U2VsZWN0aW9uRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IHRoaXMuZ3JpZCxcbiAgICAgICAgICAgIG9sZFNlbGVjdGlvbjogY3VyclNlbGVjdGlvbixcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbixcbiAgICAgICAgICAgIGFkZGVkLCByZW1vdmVkLFxuICAgICAgICAgICAgZXZlbnQsIGNhbmNlbDogZmFsc2UsXG4gICAgICAgICAgICBhbGxSb3dzU2VsZWN0ZWQ6IHRoaXMuYXJlQWxsUm93U2VsZWN0ZWQobmV3U2VsZWN0aW9uLm1hcChyID0+ICB0aGlzLmdldFJlY29yZEtleShyKSkpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5ncmlkLnJvd1NlbGVjdGlvbkNoYW5naW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFJvd3NXaXRoTm9FdmVudChhcmdzLm5ld1NlbGVjdGlvbi5tYXAociA9PiB0aGlzLmdldFJlY29yZEtleShyKSksIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQaXZvdFJvd3NCeUlkcyhpZHM6IGFueVtdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuZGF0YVZpZXcuZmlsdGVyKHIgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IHIuZGltZW5zaW9ucy5tYXAoZCA9PiBQaXZvdFV0aWwuZ2V0UmVjb3JkS2V5KHIsIGQpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KGlkcy5jb25jYXQoa2V5cykpLnNpemUgPCBpZHMubGVuZ3RoICsga2V5cy5sZW5ndGg7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSb3dEYXRhQnlJZChyb3dJRCk6IGFueSB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0Um93SURzKHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKSkuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgIHJldHVybiByb3dJbmRleCA8IDAgPyByb3dJRCA6IHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKVtyb3dJbmRleF07XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFySGVhZGVyQ0JTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJvd0lEcyhkYXRhKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQucHJpbWFyeUtleSAmJiBkYXRhLmxlbmd0aCA/IGRhdGEubWFwKHJlYyA9PiByZWNbdGhpcy5ncmlkLnByaW1hcnlLZXldKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlY29yZEtleShyZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5wcmltYXJ5S2V5ID8gcmVjb3JkW3RoaXMuZ3JpZC5wcmltYXJ5S2V5XSA6IHJlY29yZDtcbiAgICB9XG5cbiAgICAvKiogQ2xlYXIgcm93U2VsZWN0aW9uIGFuZCB1cGRhdGUgY2hlY2tib3ggc3RhdGUgKi9cbiAgICBwdWJsaWMgY2xlYXJBbGxTZWxlY3RlZFJvd3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UubmV4dCgpO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIGFsbCBkYXRhIGluIHRoZSBncmlkLCB3aXRoIGFwcGxpZWQgZmlsdGVyaW5nIGFuZCBzb3J0aW5nIGFuZCB3aXRob3V0IGRlbGV0ZWQgcm93cy4gKi9cbiAgICBwdWJsaWMgZ2V0IGFsbERhdGEoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIGxldCBhbGxEYXRhO1xuICAgICAgICBpZiAodGhpcy5pc0ZpbHRlcmluZ0FwcGxpZWQoKSB8fCB0aGlzLmdyaWQuc29ydGluZ0V4cHJlc3Npb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWxsRGF0YSA9IHRoaXMuZ3JpZC5waW5uZWRSZWNvcmRzQ291bnQgPyB0aGlzLmdyaWQuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhIDogdGhpcy5ncmlkLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsbERhdGEgPSB0aGlzLmdyaWQuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbERhdGEuZmlsdGVyKHJEYXRhID0+ICF0aGlzLmlzUm93RGVsZXRlZCh0aGlzLmdyaWQuZ3JpZEFQSS5nZXRfcm93X2lkKHJEYXRhKSkpO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBjb2x1bW5zIGZpZWxkcy4gKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5TZWxlY3Rpb24uc2l6ZSA/IEFycmF5LmZyb20odGhpcy5jb2x1bW5TZWxlY3Rpb24ua2V5cygpKSA6IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbHVtblNlbGVjdGVkKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uU2VsZWN0aW9uLnNpemUgPiAwICYmIHRoaXMuY29sdW1uU2VsZWN0aW9uLmhhcyhmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgZW1pdCBldmVudC4gKi9cbiAgICBwdWJsaWMgc2VsZWN0Q29sdW1uKGZpZWxkOiBzdHJpbmcsIGNsZWFyUHJldlNlbGVjdGlvbj8sIHNlbGVjdENvbHVtbnNSYW5nZT8sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGF0ZUNvbHVtbiA9IHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkID8gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZSh0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCkgOiBudWxsO1xuICAgICAgICBpZiAoIWV2ZW50IHx8ICFzdGF0ZUNvbHVtbiB8fCBzdGF0ZUNvbHVtbi52aXNpYmxlSW5kZXggPCAwIHx8ICFzZWxlY3RDb2x1bW5zUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkID0gZmllbGQ7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5yYW5nZSA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBjbGVhclByZXZTZWxlY3Rpb24gPyBbZmllbGRdIDogdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKS5pbmRleE9mKGZpZWxkKSAhPT0gLTEgP1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkgOiBbLi4udGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKSwgZmllbGRdO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuZmlsdGVyKGNvbEZpZWxkID0+IGNvbEZpZWxkICE9PSBmaWVsZCkgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gdGhpcy5pc0NvbHVtblNlbGVjdGVkKGZpZWxkKSA/IFtdIDogW2ZpZWxkXTtcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbHVtblNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgYWRkZWQsIHJlbW92ZWQsIGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RDb2x1bW5zUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uc1JhbmdlKGZpZWxkLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLiBBbmQgZW1pdCBldmVudC4gKi9cbiAgICBwdWJsaWMgc2VsZWN0Q29sdW1ucyhmaWVsZHM6IHN0cmluZ1tdLCBjbGVhclByZXZTZWxlY3Rpb24/LCBzZWxlY3RDb2x1bW5zUmFuZ2U/LCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IGZpZWxkcy5tYXAoZiA9PiB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKGYpKS5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KTtcbiAgICAgICAgY29uc3Qgc3RhdGVDb2x1bW4gPSB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA/IHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUodGhpcy5jb2x1bW5zU3RhdGUuZmllbGQpIDogbnVsbDtcbiAgICAgICAgaWYgKCFzdGF0ZUNvbHVtbiB8fCBzdGF0ZUNvbHVtbi52aXNpYmxlSW5kZXggPCAwIHx8ICFzZWxlY3RDb2x1bW5zUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkID0gY29sdW1uc1swXSA/IGNvbHVtbnNbMF0uZmllbGQgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zU3RhdGUucmFuZ2UgPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBmaWVsZHMuZmlsdGVyKGNvbEZpZWxkID0+ICF0aGlzLmlzQ29sdW1uU2VsZWN0ZWQoY29sRmllbGQpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjbGVhclByZXZTZWxlY3Rpb24gPyB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmZpbHRlcihjb2xGaWVsZCA9PiBmaWVsZHMuaW5kZXhPZihjb2xGaWVsZCkgPT09IC0xKSA6IFtdO1xuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gZmllbGRzIDogdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKS5jb25jYXQoYWRkZWQpO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXRDb2x1bW5TZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkLCByZW1vdmVkLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlZFN0YXJ0ID0gc3RhdGVDb2x1bW4udmlzaWJsZUluZGV4ID5cbiAgICAgICAgICAgICAgICBjb2x1bW5zW2NvbHVtbnMubGVuZ3RoIC0gMV0udmlzaWJsZUluZGV4ID8gY29sdW1uc1swXS5maWVsZCA6IGNvbHVtbnNbY29sdW1ucy5sZW5ndGggLSAxXS5maWVsZDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uc1JhbmdlKGZpbGVkU3RhcnQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgcmFuZ2UgZnJvbSBsYXN0IGNsaWNrZWQgY29sdW1uIHRvIHRoZSBjdXJyZW50IHNwZWNpZmllZCBjb2x1bW4uICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbnNSYW5nZShmaWVsZDogc3RyaW5nLCBldmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJySW5kZXggPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkKS52aXNpYmxlSW5kZXg7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5ncmlkLmNvbHVtblRvVmlzaWJsZUluZGV4KGZpZWxkKTtcbiAgICAgICAgY29uc3QgY29sdW1uc0ZpZWxkcyA9IHRoaXMuZ3JpZC52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpXG4gICAgICAgICAgICAuc2xpY2UoTWF0aC5taW4oY3VyckluZGV4LCBuZXdJbmRleCksIE1hdGgubWF4KGN1cnJJbmRleCwgbmV3SW5kZXgpICsgMSlcbiAgICAgICAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5zZWxlY3RhYmxlKS5tYXAoY29sID0+IGNvbC5maWVsZCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBbXTtcbiAgICAgICAgY29uc3Qgb2xkQWRkZWQgPSBbXTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBjb2x1bW5zRmllbGRzLmZpbHRlcihjb2xGaWVsZCA9PiAhdGhpcy5pc0NvbHVtblNlbGVjdGVkKGNvbEZpZWxkKSk7XG4gICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLnJhbmdlLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uc0ZpZWxkcy5pbmRleE9mKGYpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZWQucHVzaChmKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2xkQWRkZWQucHVzaChmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLnJhbmdlID0gY29sdW1uc0ZpZWxkcy5maWx0ZXIoY29sRmllbGQgPT4gIXRoaXMuaXNDb2x1bW5TZWxlY3RlZChjb2xGaWVsZCkgfHwgb2xkQWRkZWQuaW5kZXhPZihjb2xGaWVsZCkgPiAtMSk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuY29uY2F0KGFkZGVkKS5maWx0ZXIoYyA9PiByZW1vdmVkLmluZGV4T2YoYykgPT09IC0xKTtcbiAgICAgICAgdGhpcy5lbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3Qgc3BlY2lmaWVkIGNvbHVtbnMuIE5vIGV2ZW50IGlzIGVtaXR0ZWQuICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZHM6IHN0cmluZ1tdLCBjbGVhclByZXZTZWxlY3Rpb24/KTogdm9pZCB7XG4gICAgICAgIGlmIChjbGVhclByZXZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uU2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5TZWxlY3Rpb24uYWRkKGZpZWxkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlc2VsZWN0IHRoZSBzcGVjaWZpZWQgY29sdW1uIGFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbihmaWVsZDogc3RyaW5nLCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0Q29sdW1uc1N0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuZmlsdGVyKGMgPT4gYyAhPT0gZmllbGQpO1xuICAgICAgICB0aGlzLmVtaXRDb2x1bW5TZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIFtdLCBbZmllbGRdLCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIERlc2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLiBObyBldmVudCBpcyBlbWl0dGVkLiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHRoaXMuY29sdW1uU2VsZWN0aW9uLmRlbGV0ZShmaWVsZCkpO1xuICAgIH1cblxuICAgIC8qKiBEZXNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucy4gQW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIGRlc2VsZWN0Q29sdW1ucyhmaWVsZHM6IHN0cmluZ1tdLCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuZmlsdGVyKGNvbEZpZWxkID0+IGZpZWxkcy5pbmRleE9mKGNvbEZpZWxkKSA+IC0xKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKS5maWx0ZXIoY29sRmllbGQgPT4gZmllbGRzLmluZGV4T2YoY29sRmllbGQpID09PSAtMSk7XG5cbiAgICAgICAgdGhpcy5lbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQ/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICBpZiAodGhpcy5hcmVFcXVhbENvbGxlY3Rpb25zKGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgICAgICBvbGRTZWxlY3Rpb246IGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbixcbiAgICAgICAgICAgIGFkZGVkLCByZW1vdmVkLCBldmVudCwgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdyaWQuY29sdW1uU2VsZWN0aW9uQ2hhbmdpbmcuZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoYXJncy5uZXdTZWxlY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBDbGVhciBjb2x1bW5TZWxlY3Rpb24gKi9cbiAgICBwdWJsaWMgY2xlYXJBbGxTZWxlY3RlZENvbHVtbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29sdW1uU2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFyZUVxdWFsQ29sbGVjdGlvbnMoZmlyc3QsIHNlY29uZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmlyc3QubGVuZ3RoID09PSBzZWNvbmQubGVuZ3RoICYmIG5ldyBTZXQoZmlyc3QuY29uY2F0KHNlY29uZCkpLnNpemUgPT09IGZpcnN0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAo4pWvwrDilqHCsO+8ieKVr++4tSDilLvilIHilLtcbiAgICAgKiBDaHJvbWUgYW5kIENocm9taXVtIGRvbid0IGNhcmUgYWJvdXQgdGhlIGFjdGl2ZVxuICAgICAqIHJhbmdlIGFmdGVyIGtleWJvYXJkIG5hdmlnYXRpb24sIHRodXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9tb3ZlU2VsZWN0aW9uQ2hyb21lKG5vZGU6IE5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gbmV3IFJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZSk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNGaWx0ZXJpbmdBcHBsaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5lbXB0eSh0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB8fFxuICAgICAgICAgICAgIUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5lbXB0eSh0aGlzLmdyaWQuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNSb3dEZWxldGVkKHJvd0lEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuZ3JpZEFQSS5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbihyb3dJRCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb2ludGVyT3JpZ2luSGFuZGxlciA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLnBvaW50ZXJFdmVudEluR3JpZEJvZHkgPSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLnBvaW50ZXJPcmlnaW5IYW5kbGVyKTtcblxuICAgICAgICBjb25zdCB0YXJnZXRUYWdOYW1lID0gZXZlbnQudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRhcmdldFRhZ05hbWUgIT09ICdpZ3gtZ3JpZC1jZWxsJyAmJiB0YXJnZXRUYWdOYW1lICE9PSAnaWd4LXRyZWUtZ3JpZC1jZWxsJykge1xuICAgICAgICAgICAgdGhpcy5wb2ludGVyVXAodGhpcy5fbGFzdFNlbGVjdGVkTm9kZSwgdGhpcy5ncmlkLnJhbmdlU2VsZWN0ZWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiJdfQ==