ontimize-web-ngx 15.6.2 → 15.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/esm2020/lib/components/app-header/o-app-header.component.mjs +4 -4
  2. package/esm2020/lib/components/app-header/o-app-header.module.mjs +5 -5
  3. package/esm2020/lib/components/app-sidenav/image/o-app-sidenav-image.component.mjs +4 -4
  4. package/esm2020/lib/components/app-sidenav/menu-group/o-app-sidenav-menu-group.component.mjs +4 -4
  5. package/esm2020/lib/components/app-sidenav/menu-item/o-app-sidenav-menu-item.component.mjs +4 -4
  6. package/esm2020/lib/components/app-sidenav/o-app-sidenav.component.mjs +4 -4
  7. package/esm2020/lib/components/app-sidenav/o-app-sidenav.module.mjs +5 -5
  8. package/esm2020/lib/components/bar-menu/locale-menu-item/o-locale-bar-menu-item.component.mjs +4 -4
  9. package/esm2020/lib/components/bar-menu/menu-group/o-bar-menu-group.component.mjs +4 -4
  10. package/esm2020/lib/components/bar-menu/menu-item/o-bar-menu-item.component.mjs +4 -4
  11. package/esm2020/lib/components/bar-menu/menu-nested/o-bar-menu-nested.component.mjs +4 -4
  12. package/esm2020/lib/components/bar-menu/menu-separator/o-bar-menu-separator.component.mjs +4 -4
  13. package/esm2020/lib/components/bar-menu/o-bar-menu-base.class.mjs +4 -4
  14. package/esm2020/lib/components/bar-menu/o-bar-menu.component.mjs +4 -4
  15. package/esm2020/lib/components/bar-menu/o-bar-menu.module.mjs +5 -5
  16. package/esm2020/lib/components/bar-menu/o-base-menu-item.class.mjs +4 -4
  17. package/esm2020/lib/components/breadcrumb/o-breadcrumb.component.mjs +4 -4
  18. package/esm2020/lib/components/breadcrumb/o-breadcrumb.module.mjs +5 -5
  19. package/esm2020/lib/components/button/o-button.component.mjs +4 -4
  20. package/esm2020/lib/components/button/o-button.module.mjs +5 -5
  21. package/esm2020/lib/components/button-toggle/o-button-toggle-group/o-button-toggle-group.component.mjs +4 -4
  22. package/esm2020/lib/components/button-toggle/o-button-toggle.component.mjs +4 -4
  23. package/esm2020/lib/components/button-toggle/o-button-toggle.module.mjs +5 -5
  24. package/esm2020/lib/components/card-menu-item/o-card-menu-item.component.mjs +4 -4
  25. package/esm2020/lib/components/card-menu-item/o-card-menu-item.module.mjs +5 -5
  26. package/esm2020/lib/components/container/column/o-column.component.mjs +4 -4
  27. package/esm2020/lib/components/container/column/o-column.module.mjs +5 -5
  28. package/esm2020/lib/components/container/column-collapsible/o-column-collapsible.component.mjs +4 -4
  29. package/esm2020/lib/components/container/column-collapsible/o-column-collapsible.module.mjs +5 -5
  30. package/esm2020/lib/components/container/o-container-collapsible-component.class.mjs +4 -4
  31. package/esm2020/lib/components/container/o-container-component.class.mjs +4 -4
  32. package/esm2020/lib/components/container/row/o-row.component.mjs +4 -4
  33. package/esm2020/lib/components/container/row/o-row.module.mjs +5 -5
  34. package/esm2020/lib/components/container/row-collapsible/o-row-collapsible.component.mjs +4 -4
  35. package/esm2020/lib/components/container/row-collapsible/o-row-collapsible.module.mjs +5 -5
  36. package/esm2020/lib/components/contextmenu/context-menu/o-context-menu-content.component.mjs +4 -4
  37. package/esm2020/lib/components/contextmenu/context-menu/o-wrapper-content-menu/o-wrapper-content-menu.component.mjs +4 -4
  38. package/esm2020/lib/components/contextmenu/context-menu-group/o-context-menu-group.component.mjs +4 -4
  39. package/esm2020/lib/components/contextmenu/context-menu-item/o-context-menu-item.component.mjs +4 -4
  40. package/esm2020/lib/components/contextmenu/context-menu-separator/o-context-menu-separator.component.mjs +4 -4
  41. package/esm2020/lib/components/contextmenu/o-content-menu-base-item.class.mjs +4 -4
  42. package/esm2020/lib/components/contextmenu/o-context-menu-overlay.service.mjs +4 -4
  43. package/esm2020/lib/components/contextmenu/o-context-menu.component.mjs +4 -4
  44. package/esm2020/lib/components/contextmenu/o-context-menu.directive.mjs +4 -4
  45. package/esm2020/lib/components/contextmenu/o-context-menu.module.mjs +5 -5
  46. package/esm2020/lib/components/contextmenu/o-context-menu.service.mjs +4 -4
  47. package/esm2020/lib/components/dual-list-selector/dual-list-selector-item/date/o-dual-list-selector-date-item.component.mjs +4 -4
  48. package/esm2020/lib/components/dual-list-selector/o-dual-list-selector.component.mjs +4 -4
  49. package/esm2020/lib/components/dual-list-selector/o-dual-list-selector.module.mjs +5 -5
  50. package/esm2020/lib/components/expandable-container/o-expandable-container.component.mjs +4 -4
  51. package/esm2020/lib/components/expandable-container/o-expandable-container.module.mjs +5 -5
  52. package/esm2020/lib/components/filter-builder/filter-builder-menu/filter-builder-menu.component.mjs +4 -4
  53. package/esm2020/lib/components/filter-builder/o-filter-builder-clear.directive.mjs +4 -4
  54. package/esm2020/lib/components/filter-builder/o-filter-builder-query.directive.mjs +4 -4
  55. package/esm2020/lib/components/filter-builder/o-filter-builder.component.mjs +4 -4
  56. package/esm2020/lib/components/filter-builder/o-filter-builder.module.mjs +5 -5
  57. package/esm2020/lib/components/form/guards/o-form-can-deactivate.guard.mjs +4 -4
  58. package/esm2020/lib/components/form/navigation/o-form-confirm-exit.service.mjs +4 -4
  59. package/esm2020/lib/components/form/navigation/o-form-navigation.component.mjs +4 -4
  60. package/esm2020/lib/components/form/o-form.component.mjs +4 -4
  61. package/esm2020/lib/components/form/o-form.module.mjs +5 -5
  62. package/esm2020/lib/components/form/services/o-form-message.service.mjs +4 -4
  63. package/esm2020/lib/components/form/toolbar/o-form-toolbar.component.mjs +4 -4
  64. package/esm2020/lib/components/form/toolbar/o-form-toolbar.module.mjs +5 -5
  65. package/esm2020/lib/components/form-container/o-form-container.component.mjs +4 -4
  66. package/esm2020/lib/components/form-container/o-form-container.module.mjs +5 -5
  67. package/esm2020/lib/components/grid/grid-item/o-grid-item.component.mjs +4 -4
  68. package/esm2020/lib/components/grid/grid-item/o-grid-item.directive.mjs +4 -4
  69. package/esm2020/lib/components/grid/o-grid.component.mjs +4 -4
  70. package/esm2020/lib/components/grid/o-grid.module.mjs +5 -5
  71. package/esm2020/lib/components/grid/skeketon/o-grid-skeleton.component.mjs +4 -4
  72. package/esm2020/lib/components/image/fullscreen/fullscreen-dialog.component.mjs +4 -4
  73. package/esm2020/lib/components/image/o-image.component.mjs +4 -4
  74. package/esm2020/lib/components/image/o-image.module.mjs +5 -5
  75. package/esm2020/lib/components/input/checkbox/o-checkbox.component.mjs +4 -4
  76. package/esm2020/lib/components/input/checkbox/o-checkbox.module.mjs +5 -5
  77. package/esm2020/lib/components/input/combo/combo-renderer/boolean/o-combo-renderer-boolean.component.mjs +4 -4
  78. package/esm2020/lib/components/input/combo/combo-renderer/currency/o-combo-renderer-currency.component.mjs +4 -4
  79. package/esm2020/lib/components/input/combo/combo-renderer/date/o-combo-renderer-date.component.mjs +4 -4
  80. package/esm2020/lib/components/input/combo/combo-renderer/icon/o-combo-renderer-icon.component.mjs +4 -4
  81. package/esm2020/lib/components/input/combo/combo-renderer/integer/o-combo-renderer-integer.component.mjs +4 -4
  82. package/esm2020/lib/components/input/combo/combo-renderer/o-combo-renderer.class.mjs +4 -4
  83. package/esm2020/lib/components/input/combo/combo-renderer/percentage/o-combo-renderer-percentage.component.mjs +4 -4
  84. package/esm2020/lib/components/input/combo/combo-renderer/real/o-combo-renderer-real.component.mjs +4 -4
  85. package/esm2020/lib/components/input/combo/combo-search/o-combo-search.component.mjs +4 -4
  86. package/esm2020/lib/components/input/combo/o-combo.component.mjs +4 -4
  87. package/esm2020/lib/components/input/combo/o-combo.module.mjs +5 -5
  88. package/esm2020/lib/components/input/currency-input/o-currency-input.component.mjs +4 -4
  89. package/esm2020/lib/components/input/currency-input/o-currency-input.module.mjs +5 -5
  90. package/esm2020/lib/components/input/date-input/o-date-input.component.mjs +4 -4
  91. package/esm2020/lib/components/input/date-input/o-date-input.module.mjs +5 -5
  92. package/esm2020/lib/components/input/date-range/o-daterange-input.component.mjs +4 -4
  93. package/esm2020/lib/components/input/date-range/o-daterange-input.module.mjs +5 -5
  94. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.component.mjs +4 -4
  95. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.directive.mjs +4 -4
  96. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.module.mjs +5 -5
  97. package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.component.mjs +4 -4
  98. package/esm2020/lib/components/input/email-input/o-email-input.component.mjs +4 -4
  99. package/esm2020/lib/components/input/email-input/o-email-input.module.mjs +5 -5
  100. package/esm2020/lib/components/input/file-input/o-file-input.component.mjs +4 -4
  101. package/esm2020/lib/components/input/file-input/o-file-input.module.mjs +5 -5
  102. package/esm2020/lib/components/input/hour-input/index.mjs +4 -0
  103. package/esm2020/lib/components/input/hour-input/o-hour-input.component.mjs +38 -9
  104. package/esm2020/lib/components/input/hour-input/o-hour-input.directive.mjs +46 -0
  105. package/esm2020/lib/components/input/hour-input/o-hour-input.module.mjs +8 -7
  106. package/esm2020/lib/components/input/html-input/o-html-input.component.mjs +4 -4
  107. package/esm2020/lib/components/input/html-input/o-html-input.module.mjs +5 -5
  108. package/esm2020/lib/components/input/index.mjs +2 -3
  109. package/esm2020/lib/components/input/integer-input/o-integer-input.component.mjs +4 -4
  110. package/esm2020/lib/components/input/integer-input/o-integer-input.module.mjs +5 -5
  111. package/esm2020/lib/components/input/listpicker/listpicker-renderer/currency/o-list-picker-renderer-currency.component.mjs +4 -4
  112. package/esm2020/lib/components/input/listpicker/listpicker-renderer/date/o-list-picker-renderer-date.component.mjs +4 -4
  113. package/esm2020/lib/components/input/listpicker/listpicker-renderer/integer/o-list-picker-renderer-integer.component.mjs +4 -4
  114. package/esm2020/lib/components/input/listpicker/listpicker-renderer/o-list-picker-renderer.class.mjs +4 -4
  115. package/esm2020/lib/components/input/listpicker/listpicker-renderer/percentage/o-list-picker-renderer-percentage.component.mjs +4 -4
  116. package/esm2020/lib/components/input/listpicker/listpicker-renderer/real/o-list-picker-renderer-real.component.mjs +4 -4
  117. package/esm2020/lib/components/input/listpicker/o-list-picker-dialog.component.mjs +4 -4
  118. package/esm2020/lib/components/input/listpicker/o-list-picker.component.mjs +4 -4
  119. package/esm2020/lib/components/input/listpicker/o-list-picker.module.mjs +5 -5
  120. package/esm2020/lib/components/input/nif-input/o-nif-input.component.mjs +4 -4
  121. package/esm2020/lib/components/input/nif-input/o-nif-input.module.mjs +5 -5
  122. package/esm2020/lib/components/input/o-boolean-form-data-component.class.mjs +4 -4
  123. package/esm2020/lib/components/input/o-form-service-component.class.mjs +4 -4
  124. package/esm2020/lib/components/input/password-input/o-password-input.component.mjs +4 -4
  125. package/esm2020/lib/components/input/password-input/o-password-input.module.mjs +5 -5
  126. package/esm2020/lib/components/input/percent-input/o-percent-input.component.mjs +4 -4
  127. package/esm2020/lib/components/input/percent-input/o-percent-input.module.mjs +5 -5
  128. package/esm2020/lib/components/input/phone-input/data/country-code.mjs +4 -4
  129. package/esm2020/lib/components/input/phone-input/o-phone-input.component.mjs +4 -4
  130. package/esm2020/lib/components/input/phone-input/o-phone-input.module.mjs +5 -5
  131. package/esm2020/lib/components/input/radio/o-radio.component.mjs +4 -4
  132. package/esm2020/lib/components/input/radio/o-radio.module.mjs +5 -5
  133. package/esm2020/lib/components/input/real-input/o-real-input.component.mjs +4 -4
  134. package/esm2020/lib/components/input/real-input/o-real-input.module.mjs +5 -5
  135. package/esm2020/lib/components/input/search-input/o-search-input.component.mjs +4 -4
  136. package/esm2020/lib/components/input/search-input/o-search-input.module.mjs +5 -5
  137. package/esm2020/lib/components/input/slide-toggle/o-slide-toggle.component.mjs +4 -4
  138. package/esm2020/lib/components/input/slide-toggle/o-slide-toggle.module.mjs +5 -5
  139. package/esm2020/lib/components/input/slider/o-slider.component.mjs +4 -4
  140. package/esm2020/lib/components/input/slider/o-slider.module.mjs +5 -5
  141. package/esm2020/lib/components/input/text-input/o-text-input.component.mjs +4 -4
  142. package/esm2020/lib/components/input/text-input/o-text-input.module.mjs +5 -5
  143. package/esm2020/lib/components/input/textarea-input/o-textarea-input.component.mjs +4 -4
  144. package/esm2020/lib/components/input/textarea-input/o-textarea-input.module.mjs +5 -5
  145. package/esm2020/lib/components/input/time-input/o-time-input.component.mjs +4 -4
  146. package/esm2020/lib/components/input/time-input/o-time-input.module.mjs +5 -5
  147. package/esm2020/lib/components/language-selector/o-language-selector.component.mjs +4 -4
  148. package/esm2020/lib/components/language-selector/o-language-selector.module.mjs +5 -5
  149. package/esm2020/lib/components/list/list-item/o-list-item.component.mjs +4 -4
  150. package/esm2020/lib/components/list/list-item/o-list-item.directive.mjs +4 -4
  151. package/esm2020/lib/components/list/o-list.component.mjs +4 -4
  152. package/esm2020/lib/components/list/o-list.module.mjs +5 -5
  153. package/esm2020/lib/components/list/renderers/avatar/o-list-item-avatar.component.mjs +4 -4
  154. package/esm2020/lib/components/list/renderers/card/o-list-item-card.component.mjs +4 -4
  155. package/esm2020/lib/components/list/renderers/card-image/o-list-item-card-image.component.mjs +4 -4
  156. package/esm2020/lib/components/list/renderers/o-list-item-card-renderer.class.mjs +4 -4
  157. package/esm2020/lib/components/list/renderers/o-list-item-text-renderer.class.mjs +4 -4
  158. package/esm2020/lib/components/list/renderers/text/o-list-item-text.component.mjs +4 -4
  159. package/esm2020/lib/components/list/skeleton/o-list-skeleton.component.mjs +4 -4
  160. package/esm2020/lib/components/material/ckeditor/ck-editor.component.mjs +4 -4
  161. package/esm2020/lib/components/material/ckeditor/ck-editor.module.mjs +5 -5
  162. package/esm2020/lib/components/o-data-toolbar/o-data-toolbar.component.mjs +4 -4
  163. package/esm2020/lib/components/o-data-toolbar/o-data-toolbar.module.mjs +5 -5
  164. package/esm2020/lib/components/o-form-data-component.class.mjs +4 -4
  165. package/esm2020/lib/components/o-repeatable-skeleton.component.mjs +4 -4
  166. package/esm2020/lib/components/o-service-base-component.class.mjs +24 -10
  167. package/esm2020/lib/components/o-service-component.class.mjs +7 -7
  168. package/esm2020/lib/components/o-skeleton.component.mjs +4 -4
  169. package/esm2020/lib/components/table/column/calculated/o-table-column-calculated.component.mjs +4 -4
  170. package/esm2020/lib/components/table/column/cell-editor/boolean/o-table-cell-editor-boolean.component.mjs +4 -4
  171. package/esm2020/lib/components/table/column/cell-editor/date/o-table-cell-editor-date.component.mjs +4 -4
  172. package/esm2020/lib/components/table/column/cell-editor/email/o-table-cell-editor-email.component.mjs +4 -4
  173. package/esm2020/lib/components/table/column/cell-editor/integer/o-table-cell-editor-integer.component.mjs +4 -4
  174. package/esm2020/lib/components/table/column/cell-editor/o-base-table-cell-editor.class.mjs +10 -4
  175. package/esm2020/lib/components/table/column/cell-editor/real/o-table-cell-editor-real.component.mjs +4 -4
  176. package/esm2020/lib/components/table/column/cell-editor/text/o-table-cell-editor-text.component.mjs +4 -4
  177. package/esm2020/lib/components/table/column/cell-editor/time/o-table-cell-editor-time.component.mjs +26 -12
  178. package/esm2020/lib/components/table/column/cell-renderer/action/o-table-cell-renderer-action.component.mjs +4 -4
  179. package/esm2020/lib/components/table/column/cell-renderer/boolean/o-table-cell-renderer-boolean.component.mjs +4 -4
  180. package/esm2020/lib/components/table/column/cell-renderer/currency/o-table-cell-renderer-currency.component.mjs +4 -4
  181. package/esm2020/lib/components/table/column/cell-renderer/date/o-table-cell-renderer-date.component.mjs +4 -4
  182. package/esm2020/lib/components/table/column/cell-renderer/image/o-table-cell-renderer-image.component.mjs +4 -4
  183. package/esm2020/lib/components/table/column/cell-renderer/integer/o-table-cell-renderer-integer.component.mjs +4 -4
  184. package/esm2020/lib/components/table/column/cell-renderer/o-base-table-cell-renderer.class.mjs +4 -4
  185. package/esm2020/lib/components/table/column/cell-renderer/percentage/o-table-cell-renderer-percentage.component.mjs +4 -4
  186. package/esm2020/lib/components/table/column/cell-renderer/real/o-table-cell-renderer-real.component.mjs +4 -4
  187. package/esm2020/lib/components/table/column/cell-renderer/service/o-table-cell-renderer-service.component.mjs +4 -4
  188. package/esm2020/lib/components/table/column/cell-renderer/time/o-table-cell-renderer-time.component.mjs +4 -4
  189. package/esm2020/lib/components/table/column/cell-renderer/translate/o-table-cell-renderer-translate.component.mjs +4 -4
  190. package/esm2020/lib/components/table/column/o-table-column.component.mjs +4 -4
  191. package/esm2020/lib/components/table/extensions/contextmenu/o-table-context-menu.component.mjs +20 -14
  192. package/esm2020/lib/components/table/extensions/default-o-table.datasource.mjs +137 -66
  193. package/esm2020/lib/components/table/extensions/dialog/apply-configuration/o-table-apply-configuration-dialog.component.mjs +4 -4
  194. package/esm2020/lib/components/table/extensions/dialog/export/o-table-export-dialog.component.mjs +4 -4
  195. package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.mjs +42 -65
  196. package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column.service.mjs +78 -11
  197. package/esm2020/lib/components/table/extensions/dialog/group-by-columns/o-table-group-by-columns-dialog.component.mjs +4 -4
  198. package/esm2020/lib/components/table/extensions/dialog/o-table-base-dialog.class.mjs +4 -4
  199. package/esm2020/lib/components/table/extensions/dialog/store-configuration/o-table-store-configuration-dialog.component.mjs +4 -4
  200. package/esm2020/lib/components/table/extensions/dialog/visible-columns/o-table-visible-columns-dialog.component.mjs +5 -5
  201. package/esm2020/lib/components/table/extensions/export-button/o-table-export-button.component.mjs +4 -4
  202. package/esm2020/lib/components/table/extensions/export-button/o-table-export-button.service.mjs +4 -4
  203. package/esm2020/lib/components/table/extensions/footer/aggregate/o-table-column-aggregate.component.mjs +6 -6
  204. package/esm2020/lib/components/table/extensions/footer/expanded/o-table-expanded-footer.directive.mjs +11 -14
  205. package/esm2020/lib/components/table/extensions/footer/paginator/o-table-mat-paginator-intl.mjs +4 -4
  206. package/esm2020/lib/components/table/extensions/footer/paginator/o-table-paginator.component.mjs +4 -4
  207. package/esm2020/lib/components/table/extensions/header/table-button/o-table-button.component.mjs +4 -4
  208. package/esm2020/lib/components/table/extensions/header/table-buttons/o-table-buttons.component.mjs +4 -4
  209. package/esm2020/lib/components/table/extensions/header/table-column-resizer/o-table-column-resizer.component.mjs +4 -4
  210. package/esm2020/lib/components/table/extensions/header/table-column-select-all/o-table-column-select-all.directive.mjs +4 -4
  211. package/esm2020/lib/components/table/extensions/header/table-columns-filter/columns/o-table-columns-filter-column.component.mjs +21 -5
  212. package/esm2020/lib/components/table/extensions/header/table-columns-filter/o-table-columns-filter.component.mjs +70 -53
  213. package/esm2020/lib/components/table/extensions/header/table-columns-grouping/columns/o-table-columns-grouping-column.component.mjs +4 -4
  214. package/esm2020/lib/components/table/extensions/header/table-columns-grouping/o-table-columns-grouping.component.mjs +4 -4
  215. package/esm2020/lib/components/table/extensions/header/table-header/o-table-header.component.mjs +4 -4
  216. package/esm2020/lib/components/table/extensions/header/table-header-column-filter-icon/o-table-header-column-filter-icon.component.mjs +28 -13
  217. package/esm2020/lib/components/table/extensions/header/table-header-select-all/o-table-header-select-all.component.mjs +4 -4
  218. package/esm2020/lib/components/table/extensions/header/table-insertable-row/o-table-insertable-row.component.mjs +4 -4
  219. package/esm2020/lib/components/table/extensions/header/table-menu/o-table-menu.component.mjs +4 -4
  220. package/esm2020/lib/components/table/extensions/header/table-option/o-table-option.component.mjs +4 -4
  221. package/esm2020/lib/components/table/extensions/header/table-quickfilter/o-table-quickfilter.component.mjs +4 -4
  222. package/esm2020/lib/components/table/extensions/o-table-datasource.service.mjs +4 -4
  223. package/esm2020/lib/components/table/extensions/o-table-strategy.service.mjs +10 -4
  224. package/esm2020/lib/components/table/extensions/pipes/o-table-row-class.pipe.mjs +4 -4
  225. package/esm2020/lib/components/table/extensions/row/o-table-row.directive.mjs +4 -4
  226. package/esm2020/lib/components/table/extensions/row/table-row-expandable/o-table-row-expandable.component.mjs +4 -4
  227. package/esm2020/lib/components/table/extensions/skeleton/o-table-skeleton.component.mjs +19 -19
  228. package/esm2020/lib/components/table/extensions/sort/o-mat-sort-header.mjs +14 -7
  229. package/esm2020/lib/components/table/extensions/sort/o-mat-sort-module.mjs +5 -5
  230. package/esm2020/lib/components/table/extensions/sort/o-mat-sort.mjs +4 -4
  231. package/esm2020/lib/components/table/index.mjs +2 -1
  232. package/esm2020/lib/components/table/o-table-base.class.mjs +1 -1
  233. package/esm2020/lib/components/table/o-table-loading.service.mjs +113 -0
  234. package/esm2020/lib/components/table/o-table.component.mjs +107 -65
  235. package/esm2020/lib/components/table/o-table.module.mjs +12 -8
  236. package/esm2020/lib/components/tree/header/tree-menu/o-tree-menu.component.mjs +4 -4
  237. package/esm2020/lib/components/tree/o-tree-dao.service.mjs +35 -4
  238. package/esm2020/lib/components/tree/o-tree.component.mjs +147 -25
  239. package/esm2020/lib/components/tree/o-tree.datasource.mjs +28 -14
  240. package/esm2020/lib/components/tree/o-tree.module.mjs +5 -5
  241. package/esm2020/lib/components/tree/tree-node/tree-node.component.mjs +5 -23
  242. package/esm2020/lib/components/user-info/o-user-info.component.mjs +4 -4
  243. package/esm2020/lib/components/user-info/o-user-info.module.mjs +5 -5
  244. package/esm2020/lib/components/user-info/user-info-configuration/o-user-info-configuration.directive.mjs +4 -4
  245. package/esm2020/lib/components/user-info/user-info-configuration-item/o-user-info-configuration-item.directive.mjs +4 -4
  246. package/esm2020/lib/config/o-modules.mjs +5 -5
  247. package/esm2020/lib/directives/input-regulate.directive.mjs +4 -4
  248. package/esm2020/lib/directives/keyboard-listener.directive.mjs +4 -4
  249. package/esm2020/lib/directives/locker.directive.mjs +4 -4
  250. package/esm2020/lib/directives/o-file-drag-and-drop.directive.mjs +4 -4
  251. package/esm2020/lib/directives/o-hidden.directive.mjs +4 -4
  252. package/esm2020/lib/directives/o-mat-error.directive.mjs +4 -4
  253. package/esm2020/lib/directives/o-mat-prefix.directive.mjs +4 -4
  254. package/esm2020/lib/directives/o-mat-suffix.directive.mjs +4 -4
  255. package/esm2020/lib/directives/o-tab-group.directive.mjs +4 -4
  256. package/esm2020/lib/i18n/i18n.mjs +13 -4
  257. package/esm2020/lib/interfaces/pagination-data.interface.mjs +2 -0
  258. package/esm2020/lib/layouts/app-layout/app-layout-header/o-app-layout-header.component.mjs +4 -4
  259. package/esm2020/lib/layouts/app-layout/app-layout-sidenav/o-app-layout-sidenav.component.mjs +4 -4
  260. package/esm2020/lib/layouts/app-layout/o-app-layout.component.mjs +4 -4
  261. package/esm2020/lib/layouts/app-layout/o-app-layout.module.mjs +5 -5
  262. package/esm2020/lib/layouts/card-menu-layout/o-card-menu-layout.component.mjs +4 -4
  263. package/esm2020/lib/layouts/card-menu-layout/o-card-menu-layout.module.mjs +5 -5
  264. package/esm2020/lib/layouts/form-layout/dialog/o-form-layout-dialog.component.mjs +4 -4
  265. package/esm2020/lib/layouts/form-layout/dialog/options/o-form-layout-dialog-options.directive.mjs +4 -4
  266. package/esm2020/lib/layouts/form-layout/directives/o-form-layout-manager-content.directive.mjs +4 -4
  267. package/esm2020/lib/layouts/form-layout/guards/o-form-layout-can-activate-child.guard.mjs +4 -4
  268. package/esm2020/lib/layouts/form-layout/o-form-layout-manager.component.mjs +4 -4
  269. package/esm2020/lib/layouts/form-layout/o-form-layout-manager.module.mjs +5 -5
  270. package/esm2020/lib/layouts/form-layout/split-pane/o-form-layout-split-pane.component.mjs +4 -4
  271. package/esm2020/lib/layouts/form-layout/split-pane/options/o-form-layout-split-pane-options.directive.mjs +4 -4
  272. package/esm2020/lib/layouts/form-layout/tabgroup/o-form-layout-tabgroup.component.mjs +4 -4
  273. package/esm2020/lib/layouts/form-layout/tabgroup/options/o-form-layout-tabgroup-options.directive.mjs +4 -4
  274. package/esm2020/lib/ontimize-web-ngx.module.mjs +5 -5
  275. package/esm2020/lib/pipes/columns-filter.pipe.mjs +4 -4
  276. package/esm2020/lib/pipes/is-empty-value.pipe.mjs +4 -4
  277. package/esm2020/lib/pipes/o-currency.pipe.mjs +4 -4
  278. package/esm2020/lib/pipes/o-icon.pipe.mjs +4 -4
  279. package/esm2020/lib/pipes/o-integer.pipe.mjs +4 -4
  280. package/esm2020/lib/pipes/o-moment.pipe.mjs +4 -4
  281. package/esm2020/lib/pipes/o-percentage.pipe.mjs +4 -4
  282. package/esm2020/lib/pipes/o-real.pipe.mjs +4 -4
  283. package/esm2020/lib/pipes/o-safe.pipe.mjs +4 -4
  284. package/esm2020/lib/pipes/o-translate.pipe.mjs +8 -8
  285. package/esm2020/lib/pipes/order-by.pipe.mjs +4 -4
  286. package/esm2020/lib/services/app-menu.service.mjs +4 -4
  287. package/esm2020/lib/services/appearance.service.mjs +4 -4
  288. package/esm2020/lib/services/auth-guard.service.mjs +4 -4
  289. package/esm2020/lib/services/auth.service.mjs +4 -4
  290. package/esm2020/lib/services/base-service-response.adapter.mjs +4 -4
  291. package/esm2020/lib/services/base-service.class.mjs +4 -4
  292. package/esm2020/lib/services/currency.service.mjs +4 -4
  293. package/esm2020/lib/services/dialog.service.mjs +4 -4
  294. package/esm2020/lib/services/icon.service.mjs +4 -4
  295. package/esm2020/lib/services/jsonapi/jsonapi-preferences.service.mjs +4 -4
  296. package/esm2020/lib/services/jsonapi/jsonapi-service-response.adapter.mjs +4 -4
  297. package/esm2020/lib/services/jsonapi/jsonapi.service.mjs +4 -4
  298. package/esm2020/lib/services/local-storage.service.mjs +4 -4
  299. package/esm2020/lib/services/login-storage.service.mjs +4 -4
  300. package/esm2020/lib/services/moment.service.mjs +4 -4
  301. package/esm2020/lib/services/navigation.service.mjs +4 -4
  302. package/esm2020/lib/services/number.service.mjs +4 -4
  303. package/esm2020/lib/services/o-auth.service.mjs +4 -4
  304. package/esm2020/lib/services/o-breadcrumb.service.mjs +4 -4
  305. package/esm2020/lib/services/o-error-dialog-manager.service.mjs +4 -4
  306. package/esm2020/lib/services/o-form-layout-manager.service.mjs +4 -4
  307. package/esm2020/lib/services/o-modules-info.service.mjs +4 -4
  308. package/esm2020/lib/services/o-user-info.service.mjs +4 -4
  309. package/esm2020/lib/services/ontimize/o-preference-response.adapter.mjs +4 -4
  310. package/esm2020/lib/services/ontimize/ontimize-base-service.class.mjs +4 -4
  311. package/esm2020/lib/services/ontimize/ontimize-ee.service.mjs +4 -4
  312. package/esm2020/lib/services/ontimize/ontimize-export-3xx.service.mjs +4 -4
  313. package/esm2020/lib/services/ontimize/ontimize-export.service.mjs +4 -4
  314. package/esm2020/lib/services/ontimize/ontimize-file.service.mjs +4 -4
  315. package/esm2020/lib/services/ontimize/ontimize-preferences.service.mjs +4 -4
  316. package/esm2020/lib/services/ontimize/ontimize-service-response.adapter.mjs +4 -4
  317. package/esm2020/lib/services/ontimize/ontimize.service.mjs +4 -4
  318. package/esm2020/lib/services/ontimize-export-data-base-provider.service.mjs +4 -4
  319. package/esm2020/lib/services/ontimize-export-data-provider-3x.service.mjs +4 -4
  320. package/esm2020/lib/services/ontimize-export-data-provider.service.mjs +4 -4
  321. package/esm2020/lib/services/ontimize-icon-registry.service.mjs +4 -4
  322. package/esm2020/lib/services/pagination-context.service.mjs +4 -4
  323. package/esm2020/lib/services/parser/o-service-response.parser.mjs +4 -4
  324. package/esm2020/lib/services/permissions/o-permissions.module.mjs +5 -5
  325. package/esm2020/lib/services/permissions/ontimize-ee-permissions.service.mjs +4 -4
  326. package/esm2020/lib/services/permissions/ontimize-permissions.service.mjs +4 -4
  327. package/esm2020/lib/services/permissions/permissions-can-activate.guard.mjs +4 -4
  328. package/esm2020/lib/services/permissions/permissions.service.mjs +4 -4
  329. package/esm2020/lib/services/remote-config.service.mjs +5 -5
  330. package/esm2020/lib/services/request-adapter/jsonapi-request-arguments.adapter.mjs +4 -4
  331. package/esm2020/lib/services/request-adapter/ontimize-request-arguments.adapter.mjs +4 -4
  332. package/esm2020/lib/services/share-can-activate-child.service.mjs +4 -4
  333. package/esm2020/lib/services/snackbar.service.mjs +4 -4
  334. package/esm2020/lib/services/state/index.mjs +3 -1
  335. package/esm2020/lib/services/state/o-app-menu-component-state.service.mjs +4 -4
  336. package/esm2020/lib/services/state/o-component-state.service.mjs +10 -10
  337. package/esm2020/lib/services/state/o-filter-builder-component-state.service.mjs +4 -4
  338. package/esm2020/lib/services/state/o-form-layout-manager-component-state.service.mjs +4 -4
  339. package/esm2020/lib/services/state/o-grid-component-state.service.mjs +4 -4
  340. package/esm2020/lib/services/state/o-list-component-state.service.mjs +4 -4
  341. package/esm2020/lib/services/state/o-table-component-state.class.mjs +1 -1
  342. package/esm2020/lib/services/state/o-table-component-state.service.mjs +4 -4
  343. package/esm2020/lib/services/state/o-tree-component-state.class.mjs +1 -1
  344. package/esm2020/lib/services/state/o-tree-component-state.service.mjs +57 -17
  345. package/esm2020/lib/services/translate/o-translate.parser.mjs +4 -4
  346. package/esm2020/lib/services/translate/o-translate.service.mjs +4 -4
  347. package/esm2020/lib/shared/components/dialog/o-dialog-internal.component.mjs +4 -4
  348. package/esm2020/lib/shared/components/dialog/o-dialog.component.mjs +4 -4
  349. package/esm2020/lib/shared/components/error403/o-error-403.component.mjs +4 -4
  350. package/esm2020/lib/shared/components/filter/load-filter/o-load-filter-dialog.component.mjs +4 -4
  351. package/esm2020/lib/shared/components/filter/store-filter/o-store-filter-dialog.component.mjs +4 -4
  352. package/esm2020/lib/shared/components/snackbar/o-snackbar-base.class.mjs +4 -4
  353. package/esm2020/lib/shared/components/snackbar/o-snackbar.component.mjs +4 -4
  354. package/esm2020/lib/shared/components/validation/o-error.component.mjs +4 -4
  355. package/esm2020/lib/shared/components/validation/o-validator.component.mjs +4 -4
  356. package/esm2020/lib/shared/material/custom.material.module.mjs +5 -5
  357. package/esm2020/lib/shared/material/date/ontimize-moment-date-adapter.mjs +4 -4
  358. package/esm2020/lib/shared/shared.module.mjs +5 -5
  359. package/esm2020/lib/types/aggregate-function.type.mjs +1 -1
  360. package/esm2020/lib/types/table/o-table-global-config.type.mjs +1 -1
  361. package/esm2020/lib/types/table/o-table-initialization-options.type.mjs +1 -1
  362. package/esm2020/lib/types/tree-flat-node.type.mjs +1 -1
  363. package/fesm2015/ontimize-web-ngx.mjs +2150 -1464
  364. package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
  365. package/fesm2020/ontimize-web-ngx.mjs +2121 -1459
  366. package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
  367. package/lib/components/dual-list-selector/o-dual-list-selector.component.d.ts +1 -1
  368. package/lib/components/input/hour-input/index.d.ts +3 -0
  369. package/lib/components/input/hour-input/o-hour-input.component.d.ts +6 -2
  370. package/lib/components/input/hour-input/o-hour-input.directive.d.ts +8 -0
  371. package/lib/components/input/hour-input/o-hour-input.module.d.ts +5 -4
  372. package/lib/components/input/index.d.ts +1 -2
  373. package/lib/components/o-service-base-component.class.d.ts +6 -1
  374. package/lib/components/table/column/cell-editor/o-base-table-cell-editor.class.d.ts +5 -3
  375. package/lib/components/table/column/cell-editor/time/o-table-cell-editor-time.component.d.ts +2 -2
  376. package/lib/components/table/extensions/default-o-table.datasource.d.ts +6 -1
  377. package/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.d.ts +10 -3
  378. package/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column.service.d.ts +10 -3
  379. package/lib/components/table/extensions/dialog/group-by-columns/o-table-group-by-columns-dialog.component.d.ts +1 -1
  380. package/lib/components/table/extensions/footer/aggregate/o-table-column-aggregate.component.d.ts +1 -1
  381. package/lib/components/table/extensions/footer/expanded/o-table-expanded-footer.directive.d.ts +1 -2
  382. package/lib/components/table/extensions/header/o-table-header-components.d.ts +2 -2
  383. package/lib/components/table/extensions/header/table-columns-filter/columns/o-table-columns-filter-column.component.d.ts +19 -2
  384. package/lib/components/table/extensions/header/table-columns-filter/o-table-columns-filter.component.d.ts +10 -9
  385. package/lib/components/table/extensions/header/table-header-column-filter-icon/o-table-header-column-filter-icon.component.d.ts +7 -1
  386. package/lib/components/table/extensions/o-table-strategy.service.d.ts +2 -1
  387. package/lib/components/table/extensions/skeleton/o-table-skeleton.component.d.ts +1 -0
  388. package/lib/components/table/extensions/sort/o-mat-sort-header.d.ts +5 -3
  389. package/lib/components/table/index.d.ts +1 -0
  390. package/lib/components/table/o-table-base.class.d.ts +15 -4
  391. package/lib/components/table/o-table-loading.service.d.ts +28 -0
  392. package/lib/components/table/o-table.component.d.ts +7 -3
  393. package/lib/components/table/o-table.module.d.ts +2 -1
  394. package/lib/components/tree/o-tree-dao.service.d.ts +4 -2
  395. package/lib/components/tree/o-tree.component.d.ts +21 -2
  396. package/lib/components/tree/o-tree.datasource.d.ts +3 -0
  397. package/lib/components/tree/tree-node/tree-node.component.d.ts +0 -4
  398. package/lib/i18n/i18n.d.ts +9 -0
  399. package/lib/interfaces/pagination-data.interface.d.ts +6 -0
  400. package/lib/services/state/index.d.ts +2 -0
  401. package/lib/services/state/o-table-component-state.class.d.ts +1 -1
  402. package/lib/services/state/o-tree-component-state.class.d.ts +3 -0
  403. package/lib/services/state/o-tree-component-state.service.d.ts +4 -1
  404. package/lib/types/aggregate-function.type.d.ts +2 -1
  405. package/lib/types/table/o-table-global-config.type.d.ts +4 -0
  406. package/lib/types/table/o-table-initialization-options.type.d.ts +4 -0
  407. package/lib/types/tree-flat-node.type.d.ts +5 -1
  408. package/package.json +2 -2
@@ -10,7 +10,7 @@ import { MatTab, MatTabGroup } from '@angular/material/tabs';
10
10
  import { MatTooltip } from '@angular/material/tooltip';
11
11
  import moment from 'moment';
12
12
  import { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';
13
- import { debounceTime, distinctUntilChanged, filter, map } from 'rxjs/operators';
13
+ import { debounceTime, distinctUntilChanged, filter } from 'rxjs/operators';
14
14
  import { BooleanConverter, BooleanInputConverter } from '../../decorators/input-converter';
15
15
  import { ComponentStateServiceProvider, OntimizeServiceProvider } from '../../services/factories';
16
16
  import { SnackBarService } from '../../services/snackbar.service';
@@ -47,6 +47,7 @@ import { O_TABLE_GLOBAL_CONFIG } from './utils/o-table.tokens';
47
47
  import { O_COMPONENT_STATE_SERVICE } from '../../injection-tokens';
48
48
  import { MatRow, MatTable } from '@angular/material/table';
49
49
  import { OTableFilterByColumnService } from './extensions/dialog/filter-by-column/o-table-filter-by-column.service';
50
+ import { OTableLoadingService } from './o-table-loading.service';
50
51
  import * as i0 from "@angular/core";
51
52
  import * as i1 from "@angular/material/dialog";
52
53
  import * as i2 from "@angular/common";
@@ -338,11 +339,6 @@ export class OTableComponent extends AbstractOServiceComponent {
338
339
  this.loadingSorting = this.loadingSortingSubject.asObservable();
339
340
  this.loadingScrollSubject = new BehaviorSubject(false);
340
341
  this.loadingScroll = this.loadingScrollSubject.asObservable();
341
- this.showLoading = combineLatest([
342
- this.loading.pipe(debounceTime(200)),
343
- this.loadingSorting,
344
- this.loadingScroll
345
- ]).pipe(distinctUntilChanged((prev, curr) => prev[0] === curr[0] && prev[1] === curr[1] && prev[2] === curr[2]), map((res) => res.some(r => r)));
346
342
  this.showFirstInsertableRow = false;
347
343
  this.showLastInsertableRow = false;
348
344
  this.clickDelay = 200;
@@ -354,6 +350,11 @@ export class OTableComponent extends AbstractOServiceComponent {
354
350
  this._isColumnFiltersActive = false;
355
351
  this.groupingHeadersRows = [];
356
352
  this.triggerSelectionEvents = true;
353
+ this.loadingService = this.injector.get(OTableLoadingService);
354
+ this.loadingSubject.subscribe((loading) => {
355
+ this.loadingService.setLoading(loading);
356
+ });
357
+ this.showLoading = this.loadingService.showLoading$;
357
358
  this._oTableOptions = new DefaultOTableOptions();
358
359
  try {
359
360
  this.tabGroupContainer = this.injector.get(MatTabGroup);
@@ -537,6 +538,9 @@ export class OTableComponent extends AbstractOServiceComponent {
537
538
  this.initializeDao();
538
539
  this.permissions = this.permissionsService.getTablePermissions(this.oattr, this.actRoute);
539
540
  }
541
+ initializeLoadingSubject() {
542
+ this.loadingService.setLoading(true);
543
+ }
540
544
  registerClickListener() {
541
545
  if (this.clickSubjectSubscription) {
542
546
  this.clickSubjectSubscription.unsubscribe();
@@ -641,9 +645,35 @@ export class OTableComponent extends AbstractOServiceComponent {
641
645
  this.destroy();
642
646
  this.initialize();
643
647
  this.state.reset(this.pageable);
648
+ if (options?.data) {
649
+ this.setData(options.data.data, options.data?.sqlTypes);
650
+ this.updatePaginationInfo(options.data.data);
651
+ this.currentPage = 0;
652
+ }
653
+ if (options?.paginationData) {
654
+ this.reinitializePaginationInfo(options.paginationData);
655
+ }
644
656
  this.initTableAfterViewInit();
645
657
  this.onReinitialize.emit(null);
646
658
  }
659
+ reinitializePaginationInfo(paginationData) {
660
+ this.currentPage = paginationData.pageNumber;
661
+ this.queryRows = paginationData.pageSize;
662
+ if (this.pageable) {
663
+ if (paginationData.startRecordIndex !== undefined) {
664
+ const resultEndIndex = paginationData.startRecordIndex + (this.getDataArray() ? this.getDataArray().length : 0);
665
+ this.state.queryRecordOffset = resultEndIndex;
666
+ }
667
+ if (paginationData.totalQueryRecordsNumber !== undefined) {
668
+ this.state.totalQueryRecordsNumber = paginationData.totalQueryRecordsNumber;
669
+ }
670
+ const pageNumber = this.state.queryRecordOffset == 0 ? 0 : this.dataService?.getPaginationContext().pageNumber;
671
+ super.updatePaginationContext({ pageNumber: pageNumber, offset: this.state.queryRecordOffset, totalSize: this.state.totalQueryRecordsNumber, pageSize: this.state.queryRows });
672
+ }
673
+ else {
674
+ this.updatePaginationContext({ totalSize: this.getDataArray().length });
675
+ }
676
+ }
647
677
  initTableAfterViewInit() {
648
678
  this.parseVisibleColumns();
649
679
  this.parseSearcheableColumns();
@@ -706,6 +736,9 @@ export class OTableComponent extends AbstractOServiceComponent {
706
736
  this.asyncLoadSubscriptions[idx].unsubscribe();
707
737
  }
708
738
  });
739
+ if (this.loadingService) {
740
+ this.loadingService.ngOnDestroy?.();
741
+ }
709
742
  }
710
743
  getDataToStore() {
711
744
  return this.componentStateService.getDataToStore();
@@ -717,7 +750,9 @@ export class OTableComponent extends AbstractOServiceComponent {
717
750
  if (Util.isDefined(this.oTableQuickFilterComponent)) {
718
751
  this.oTableQuickFilterComponent.setValue(this.state.quickFilterValue, false);
719
752
  this.quickFilterSubscription = this.oTableQuickFilterComponent.onChange.subscribe(val => {
720
- this.onSearch.emit(val);
753
+ if (this.loadingService.handleProtected()) {
754
+ this.onSearch.emit(val);
755
+ }
721
756
  });
722
757
  }
723
758
  }
@@ -839,27 +874,38 @@ export class OTableComponent extends AbstractOServiceComponent {
839
874
  }
840
875
  }
841
876
  checkChangesVisibleColummnsInInitialConfiguration(stateCols) {
842
- if (this.state.initialConfiguration.columnsDisplay) {
843
- const originalVisibleColArray = this.state.initialConfiguration.columnsDisplay.filter(x => x.visible).map(x => x.attr);
844
- const visibleColArray = Util.parseArray(this.visibleColumns, true);
845
- const colToAddInVisibleCol = Util.differenceArrays(visibleColArray, originalVisibleColArray);
846
- colToAddInVisibleCol.forEach((colAdd) => {
847
- let indexCol = stateCols.findIndex(col => col.attr === colAdd);
877
+ if (!this.state.initialConfiguration.columnsDisplay) {
878
+ return stateCols;
879
+ }
880
+ const originalVisibleColArray = this.state.initialConfiguration.columnsDisplay.filter(x => x.visible).map(x => x.attr);
881
+ const currentVisibleColArray = Util.parseArray(this.visibleColumns, true);
882
+ const colToAddInVisibleCol = Util.differenceArrays(currentVisibleColArray, originalVisibleColArray);
883
+ for (const newColAttr of colToAddInVisibleCol) {
884
+ const columnExists = this._oTableOptions.columns.some(col => col.attr === newColAttr);
885
+ if (columnExists) {
886
+ let indexCol = stateCols.findIndex(col => col.attr === newColAttr);
848
887
  if (indexCol > -1) {
849
888
  stateCols[indexCol].visible = true;
850
889
  }
851
- stateCols.sort((a, b) => visibleColArray.indexOf(a.attr) - visibleColArray.indexOf(b.attr));
852
- });
853
- const colToDeleteInVisibleCol = Util.differenceArrays(originalVisibleColArray, visibleColArray);
854
- if (colToDeleteInVisibleCol.length > 0) {
855
- stateCols = stateCols.filter(col => colToDeleteInVisibleCol.indexOf(col.attr) === -1);
856
- }
857
- const changeSortVisibleColumns = JSON.stringify(visibleColArray) !== JSON.stringify(originalVisibleColArray);
858
- if (changeSortVisibleColumns && visibleColArray.length === originalVisibleColArray.length) {
859
- visibleColArray.forEach((col, toIndex) => {
860
- const fromIndexToChange = stateCols.findIndex(stateCol => stateCol.attr === col);
861
- moveItemInArray(stateCols, fromIndexToChange, toIndex);
862
- });
890
+ else {
891
+ stateCols.push({
892
+ attr: newColAttr,
893
+ visible: true,
894
+ width: undefined
895
+ });
896
+ }
897
+ }
898
+ stateCols.sort((a, b) => currentVisibleColArray.indexOf(a.attr) - currentVisibleColArray.indexOf(b.attr));
899
+ }
900
+ const colToDeleteInVisibleCol = Util.differenceArrays(originalVisibleColArray, currentVisibleColArray);
901
+ if (colToDeleteInVisibleCol.length > 0) {
902
+ stateCols = stateCols.filter(col => colToDeleteInVisibleCol.indexOf(col.attr) === -1);
903
+ }
904
+ const changeSortVisibleColumns = JSON.stringify(currentVisibleColArray) !== JSON.stringify(originalVisibleColArray);
905
+ if (changeSortVisibleColumns && currentVisibleColArray.length === originalVisibleColArray.length) {
906
+ for (const [toIndex, col] of currentVisibleColArray.entries()) {
907
+ const fromIndexToChange = stateCols.findIndex(stateCol => stateCol.attr === col);
908
+ moveItemInArray(stateCols, fromIndexToChange, toIndex);
863
909
  }
864
910
  }
865
911
  return stateCols;
@@ -998,18 +1044,6 @@ export class OTableComponent extends AbstractOServiceComponent {
998
1044
  this.sort.setMultipleSort(this.multipleSort);
999
1045
  }
1000
1046
  }
1001
- updateSortingSubject(value) {
1002
- const ngZone = this.injector.get(NgZone);
1003
- if (ngZone) {
1004
- ngZone.run(() => this.loadingSortingSubject.next(value));
1005
- }
1006
- else {
1007
- this.loadingSortingSubject.next(value);
1008
- if (this.cd && !this.cd.destroyed) {
1009
- this.cd.detectChanges();
1010
- }
1011
- }
1012
- }
1013
1047
  onSortChange(sortArray) {
1014
1048
  this.sortColArray = [];
1015
1049
  sortArray.forEach((sort) => {
@@ -1023,9 +1057,6 @@ export class OTableComponent extends AbstractOServiceComponent {
1023
1057
  if (this.pageable) {
1024
1058
  this.reloadData();
1025
1059
  }
1026
- else {
1027
- this.updateSortingSubject(true);
1028
- }
1029
1060
  }
1030
1061
  setDatasource() {
1031
1062
  delete this.dataSource;
@@ -1040,14 +1071,6 @@ export class OTableComponent extends AbstractOServiceComponent {
1040
1071
  this.onRenderedDataChange = this.dataSource.onRenderedDataChange.subscribe(() => {
1041
1072
  this.stopEdition();
1042
1073
  this.checkSelectedItemData();
1043
- if (!this.pageable) {
1044
- setTimeout(() => {
1045
- this.updateSortingSubject(false);
1046
- if (this.cd && !this.cd.destroyed) {
1047
- this.cd.detectChanges();
1048
- }
1049
- }, 500);
1050
- }
1051
1074
  });
1052
1075
  }
1053
1076
  getExpandedRowContainerClass(rowIndex) {
@@ -1261,13 +1284,12 @@ export class OTableComponent extends AbstractOServiceComponent {
1261
1284
  }
1262
1285
  }
1263
1286
  projectContentChanged() {
1264
- this.loadingScrollSubject.next(false);
1265
1287
  this.initViewPort(this.dataSource.renderedData);
1266
1288
  if (this.previousRendererData !== this.dataSource.renderedData) {
1267
1289
  this.previousRendererData = this.dataSource.renderedData;
1268
1290
  ObservableWrapper.callEmit(this.onContentChange, this.dataSource.renderedData);
1269
1291
  }
1270
- if (this.state.selection && this.dataSource.renderedData.length > 0 && this.getSelectedItems().length === 0) {
1292
+ if (this.state.selection && this.dataSource?.renderedData?.length > 0 && this.getSelectedItems().length === 0) {
1271
1293
  this.checkSelectedItemData();
1272
1294
  }
1273
1295
  if (this.refreshExpandableRowState) {
@@ -1373,6 +1395,7 @@ export class OTableComponent extends AbstractOServiceComponent {
1373
1395
  if (this.dataService && (this.deleteMethod in this.dataService) && this.entity && (this.keysArray.length > 0)) {
1374
1396
  const filters = ServiceUtils.getArrayProperties(selectedItems, this.keysArray);
1375
1397
  const sqlTypesArg = this.getSqlTypesOfKeys();
1398
+ this.loadingService.setLoading(true);
1376
1399
  this.daoTable.removeQuery(filters, sqlTypesArg).subscribe({
1377
1400
  next: (v) => {
1378
1401
  ObservableWrapper.callEmit(this.onRowDeleted, selectedItems);
@@ -1419,6 +1442,7 @@ export class OTableComponent extends AbstractOServiceComponent {
1419
1442
  }
1420
1443
  }
1421
1444
  reloadData(clearSelectedItems = true) {
1445
+ this.loadingService.setLoading(true);
1422
1446
  this.reloadDataWithClearExpandableRows(clearSelectedItems, clearSelectedItems);
1423
1447
  }
1424
1448
  reloadDataWithClearExpandableRows(clearSelectedItems = true, clearExpandableItems = true) {
@@ -1615,16 +1639,16 @@ export class OTableComponent extends AbstractOServiceComponent {
1615
1639
  this.updateStateExpandedColumn();
1616
1640
  }
1617
1641
  getNumRowSelectedInCurrentData() {
1618
- return this.dataSource ? this.dataSource.renderedData.filter(x => !this.isDisableCheckbox(x) && this.isRowSelected(x)).length : 0;
1642
+ return this.dataSource?.renderedData ? this.dataSource.renderedData.filter(x => !this.isDisableCheckbox(x) && this.isRowSelected(x)).length : 0;
1619
1643
  }
1620
1644
  isAllSelected() {
1621
1645
  const numSelected = this.getNumRowSelectedInCurrentData();
1622
- const numRows = this.dataSource ? this.dataSource.renderedData.length : 0;
1646
+ const numRows = this.dataSource?.renderedData?.length ?? 0;
1623
1647
  return numSelected > 0 && numSelected === numRows;
1624
1648
  }
1625
1649
  isIndeterminate() {
1626
1650
  const numSelected = this.getNumRowSelectedInCurrentData();
1627
- const numRows = this.dataSource ? this.dataSource.renderedData.length : 0;
1651
+ const numRows = this.dataSource?.renderedData?.length ?? 0;
1628
1652
  return numSelected > 0 && numRows > 0 && numSelected !== numRows;
1629
1653
  }
1630
1654
  masterToggle(event) {
@@ -1818,11 +1842,13 @@ export class OTableComponent extends AbstractOServiceComponent {
1818
1842
  }
1819
1843
  }
1820
1844
  clearColumnFilter(attr, triggerDatasourceUpdate = true) {
1845
+ this.loadingService.setLoading(true);
1821
1846
  this.dataSource.clearColumnFilter(attr, triggerDatasourceUpdate);
1822
1847
  this.onFilterByColumnChange.emit();
1823
1848
  this.reloadPaginatedDataFromStart(false);
1824
1849
  }
1825
1850
  filterByColumn(columnValueFilter) {
1851
+ this.loadingService.setLoading(true);
1826
1852
  this.dataSource.addColumnFilter(columnValueFilter);
1827
1853
  this.onFilterByColumnChange.emit();
1828
1854
  if (this.pageable) {
@@ -2006,6 +2032,9 @@ export class OTableComponent extends AbstractOServiceComponent {
2006
2032
  return this.selectionMode === Codes.SELECTION_MODE_NONE;
2007
2033
  }
2008
2034
  onChangePage(evt) {
2035
+ if (!this.loadingService.handleProtected(evt)) {
2036
+ return;
2037
+ }
2009
2038
  this.finishQuerySubscription = false;
2010
2039
  this.dataService?.setPaginationContext({ pageNumber: evt.pageIndex, pageSize: evt.pageSize });
2011
2040
  if (!this.pageable) {
@@ -2682,10 +2711,21 @@ export class OTableComponent extends AbstractOServiceComponent {
2682
2711
  getSnackService() {
2683
2712
  return this.snackBarService;
2684
2713
  }
2685
- getSourceDataByFilterColumn(column) {
2686
- return (this.oTableColumnsFilterComponent?.getFilterValuesInData(column.attr) ||
2687
- (this.oTableColumnsFilterComponent?.filterValuesInData ||
2688
- 'current-page'));
2714
+ getFilterColumnByAttr(attr) {
2715
+ if (this.oTableColumnsFilterComponent?.columnsArray?.length) {
2716
+ return this.oTableColumnsFilterComponent?.columnsArray.find(filterColumn => filterColumn.attr === attr);
2717
+ }
2718
+ const visibleColumn = this.oTableOptions.columns?.find(col => col.attr === attr && col.visible);
2719
+ if (visibleColumn) {
2720
+ return {
2721
+ attr: visibleColumn.attr,
2722
+ title: visibleColumn.title,
2723
+ filterValuesInData: 'current-page',
2724
+ sort: '',
2725
+ startView: ''
2726
+ };
2727
+ }
2728
+ return undefined;
2689
2729
  }
2690
2730
  updateColumnTitles(columns) {
2691
2731
  if (!this.matTable || !this.oTableOptions?.columns)
@@ -2705,16 +2745,17 @@ OTableComponent.FIRST_LAST_CELL_PADDING = 24;
2705
2745
  OTableComponent.EXPANDED_ROW_CONTAINER_CLASS = 'expanded-row-container-';
2706
2746
  OTableComponent.AVAILABLE_GROUPING_COLUMNS_RENDERERS = ['currency', 'integer', 'real'];
2707
2747
  OTableComponent.DEFAULT_ROW_HEIGHT = 36;
2708
- OTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OTableComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i1.MatDialog }, { token: i0.ViewContainerRef }, { token: i0.ApplicationRef }, { token: forwardRef(() => OFormComponent), optional: true }, { token: VIRTUAL_SCROLL_STRATEGY, optional: true }], target: i0.ɵɵFactoryTarget.Component });
2709
- OTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: OTableComponent, selector: "o-table", inputs: { visibleColumns: ["visible-columns", "visibleColumns"], defaultVisibleColumns: ["default-visible-columns", "defaultVisibleColumns"], sortColumns: ["sort-columns", "sortColumns"], quickFilterCallback: ["quick-filter-function", "quickFilterCallback"], deleteButton: ["delete-button", "deleteButton"], refreshButton: ["refresh-button", "refreshButton"], columnsVisibilityButton: ["columns-visibility-button", "columnsVisibilityButton"], exportButton: ["export-button", "exportButton"], showConfigurationOption: ["show-configuration-option", "showConfigurationOption"], showButtonsText: ["show-buttons-text", "showButtonsText"], selectAllCheckbox: ["select-all-checkbox", "selectAllCheckbox"], paginationControls: ["pagination-controls", "paginationControls"], fixedHeader: ["fixed-header", "fixedHeader"], showTitle: ["show-title", "showTitle"], editionMode: ["edition-mode", "editionMode"], selectionMode: ["selection-mode", "selectionMode"], horizontalScroll: ["horizontal-scroll", "horizontalScroll"], showPaginatorFirstLastButtons: ["show-paginator-first-last-buttons", "showPaginatorFirstLastButtons"], autoAlignTitles: ["auto-align-titles", "autoAlignTitles"], multipleSort: ["multiple-sort", "multipleSort"], selectAllCheckboxVisible: ["select-all-checkbox-visible", "selectAllCheckboxVisible"], orderable: "orderable", resizable: "resizable", keepSelectedItems: ["keep-selected-items", "keepSelectedItems"], exportMode: ["export-mode", "exportMode"], exportServiceType: ["export-service-type", "exportServiceType"], autoAdjust: ["auto-adjust", "autoAdjust"], showFilterOption: ["show-filter-option", "showFilterOption"], visibleExportDialogButtons: ["visible-export-dialog-buttons", "visibleExportDialogButtons"], rowClass: ["row-class", "rowClass"], filterColumnActiveByDefault: ["filter-column-active-by-default", "filterColumnActiveByDefault"], groupedColumns: ["grouped-columns", "groupedColumns"], groupable: "groupable", expandGroupsSameLevel: ["expand-groups-same-level", "expandGroupsSameLevel"], collapseGroupedColumns: ["collapse-grouped-columns", "collapseGroupedColumns"], virtualScroll: ["virtual-scroll", "virtualScroll"], contextMenu: ["context-menu", "contextMenu"], showExpandableIconFunction: ["show-expandable-icon-function", "showExpandableIconFunction"], showReportOnDemandOption: ["show-report-on-demand-option", "showReportOnDemandOption"], showChartsOnDemandOption: ["show-charts-on-demand-option", "showChartsOnDemandOption"], showResetWidthOption: ["show-reset-width-option", "showResetWidthOption"], disableSelectionFunction: ["disable-selection-function", "disableSelectionFunction"], nonHidableColumns: ["non-hidable-columns", "nonHidableColumns"], readOnly: ["read-only", "readOnly"], readOnlyConfiguration: ["read-only-configuration", "readOnlyConfiguration"], showNotificationOfReadOnly: ["show-notification-of-read-only", "showNotificationOfReadOnly"] }, outputs: { onRowSelected: "onRowSelected", onRowDeselected: "onRowDeselected", onRowDeleted: "onRowDeleted" }, host: { listeners: { "document:click": "handleDOMClick($event)", "window:resize": "updateScrolledState()" }, properties: { "class.o-table": "true", "class.ontimize-table": "true", "class.o-table-fixed": "fixedHeader", "class.o-table-disabled": "!enabled" } }, providers: [
2748
+ OTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i1.MatDialog }, { token: i0.ViewContainerRef }, { token: i0.ApplicationRef }, { token: forwardRef(() => OFormComponent), optional: true }, { token: VIRTUAL_SCROLL_STRATEGY, optional: true }], target: i0.ɵɵFactoryTarget.Component });
2749
+ OTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableComponent, selector: "o-table", inputs: { visibleColumns: ["visible-columns", "visibleColumns"], defaultVisibleColumns: ["default-visible-columns", "defaultVisibleColumns"], sortColumns: ["sort-columns", "sortColumns"], quickFilterCallback: ["quick-filter-function", "quickFilterCallback"], deleteButton: ["delete-button", "deleteButton"], refreshButton: ["refresh-button", "refreshButton"], columnsVisibilityButton: ["columns-visibility-button", "columnsVisibilityButton"], exportButton: ["export-button", "exportButton"], showConfigurationOption: ["show-configuration-option", "showConfigurationOption"], showButtonsText: ["show-buttons-text", "showButtonsText"], selectAllCheckbox: ["select-all-checkbox", "selectAllCheckbox"], paginationControls: ["pagination-controls", "paginationControls"], fixedHeader: ["fixed-header", "fixedHeader"], showTitle: ["show-title", "showTitle"], editionMode: ["edition-mode", "editionMode"], selectionMode: ["selection-mode", "selectionMode"], horizontalScroll: ["horizontal-scroll", "horizontalScroll"], showPaginatorFirstLastButtons: ["show-paginator-first-last-buttons", "showPaginatorFirstLastButtons"], autoAlignTitles: ["auto-align-titles", "autoAlignTitles"], multipleSort: ["multiple-sort", "multipleSort"], selectAllCheckboxVisible: ["select-all-checkbox-visible", "selectAllCheckboxVisible"], orderable: "orderable", resizable: "resizable", keepSelectedItems: ["keep-selected-items", "keepSelectedItems"], exportMode: ["export-mode", "exportMode"], exportServiceType: ["export-service-type", "exportServiceType"], autoAdjust: ["auto-adjust", "autoAdjust"], showFilterOption: ["show-filter-option", "showFilterOption"], visibleExportDialogButtons: ["visible-export-dialog-buttons", "visibleExportDialogButtons"], rowClass: ["row-class", "rowClass"], filterColumnActiveByDefault: ["filter-column-active-by-default", "filterColumnActiveByDefault"], groupedColumns: ["grouped-columns", "groupedColumns"], groupable: "groupable", expandGroupsSameLevel: ["expand-groups-same-level", "expandGroupsSameLevel"], collapseGroupedColumns: ["collapse-grouped-columns", "collapseGroupedColumns"], virtualScroll: ["virtual-scroll", "virtualScroll"], contextMenu: ["context-menu", "contextMenu"], showExpandableIconFunction: ["show-expandable-icon-function", "showExpandableIconFunction"], showReportOnDemandOption: ["show-report-on-demand-option", "showReportOnDemandOption"], showChartsOnDemandOption: ["show-charts-on-demand-option", "showChartsOnDemandOption"], showResetWidthOption: ["show-reset-width-option", "showResetWidthOption"], disableSelectionFunction: ["disable-selection-function", "disableSelectionFunction"], nonHidableColumns: ["non-hidable-columns", "nonHidableColumns"], readOnly: ["read-only", "readOnly"], readOnlyConfiguration: ["read-only-configuration", "readOnlyConfiguration"], showNotificationOfReadOnly: ["show-notification-of-read-only", "showNotificationOfReadOnly"] }, outputs: { onRowSelected: "onRowSelected", onRowDeselected: "onRowDeselected", onRowDeleted: "onRowDeleted" }, host: { listeners: { "document:click": "handleDOMClick($event)", "window:resize": "updateScrolledState()" }, properties: { "class.o-table": "true", "class.ontimize-table": "true", "class.o-table-fixed": "fixedHeader", "class.o-table-disabled": "!enabled" } }, providers: [
2710
2750
  OntimizeServiceProvider,
2711
2751
  ComponentStateServiceProvider,
2712
2752
  OTableDataSourceService,
2713
2753
  OTableFilterByColumnService,
2714
2754
  { provide: O_COMPONENT_STATE_SERVICE, useClass: OTableComponentStateService },
2715
2755
  { provide: VIRTUAL_SCROLL_STRATEGY, useClass: OTableVirtualScrollStrategy },
2716
- { provide: OTableBase, useExisting: forwardRef(() => OTableComponent) }
2717
- ], queries: [{ propertyName: "tableRowExpandable", first: true, predicate: OTableRowExpandableComponent, descendants: true }, { propertyName: "quickfilterContentChild", first: true, predicate: ["o-table-quickfilter"], descendants: true, static: true }, { propertyName: "tableColumnSelectAllContentChild", first: true, predicate: OTableColumnSelectAllDirective, descendants: true }, { propertyName: "contextMenuContentChild", first: true, predicate: OTableContextMenuComponent, descendants: true, static: true }, { propertyName: "tableOptions", predicate: OTableOptionComponent }, { propertyName: "tableButtons", predicate: OTableButtonComponent }, { propertyName: "exportOptsTemplate", predicate: OTableExportButtonComponent }], viewQueries: [{ propertyName: "oMatSort", first: true, predicate: OMatSort, descendants: true }, { propertyName: "cdkVirtualScrollViewport", first: true, predicate: ["virtualScrollViewPort"], descendants: true }, { propertyName: "spinnerContainer", first: true, predicate: ["spinnerContainer"], descendants: true, read: ElementRef }, { propertyName: "tableBodyEl", first: true, predicate: ["tableBody"], descendants: true }, { propertyName: "tableHeaderEl", first: true, predicate: ["tableHeader"], descendants: true, read: ElementRef }, { propertyName: "tableToolbarEl", first: true, predicate: ["tableToolbar"], descendants: true, read: ElementRef }, { propertyName: "matTable", first: true, predicate: MatTable, descendants: true }, { propertyName: "oTableMenu", first: true, predicate: ["tableMenu"], descendants: true }, { propertyName: "rows", predicate: MatRow, descendants: true }, { propertyName: "tooltip", predicate: MatTooltip, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"o-table-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [style.display]=\"isVisible()? '' : 'none'\"\n [class.block-events]=\"showLoading | async\">\n\n <o-data-toolbar #tableToolbar *ngIf=\"hasControls()\" [title]=\"title\" [show-title]=\"showTitle\" class=\"o-table-toolbar\">\n <ng-container o-data-toolbar-projection-start>\n <o-table-buttons #tableButtons [insert-button]=\"insertButton\" [refresh-button]=\"refreshButton\" [delete-button]=\"showDeleteButton\">\n <ng-content select=\"o-table-button\"></ng-content>\n </o-table-buttons>\n </ng-container>\n <ng-content select=\"[o-table-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <ng-container *ngIf=\"quickfilterContentChild; else defaultQuickFilter\">\n <ng-content select=\"o-table-quickfilter\"></ng-content>\n </ng-container>\n <ng-template #defaultQuickFilter>\n <ng-container *ngIf=\"quickFilter\">\n <o-table-quickfilter (onChange)=\"tableQuickFilterChanged($event)\">\n </o-table-quickfilter>\n </ng-container>\n </ng-template>\n <button type=\"button\" *ngIf=\"showTableMenuButton\" mat-icon-button class=\"o-table-menu-button\" [matMenuTriggerFor]=\"tableMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-table-menu #tableMenu [select-all-checkbox]=\"selectAllCheckbox\" [export-button]=\"exportButton\"\n [columns-visibility-button]=\"columnsVisibilityButton\" [show-configuration-option]=\"showConfigurationOption\"\n [show-filter-option]=\"showFilterOption\" [show-report-on-demand-option]=\"showReportOnDemandOption\"\n [show-charts-on-demand-option]=\"showChartsOnDemandOption\" [show-reset-width-option]=\"showResetWidthOption\" [show-group-by-option]=\"groupable\">\n <ng-content select=\"o-table-option\"></ng-content>\n </o-table-menu>\n </ng-container>\n </o-data-toolbar>\n\n <div #tableBody class=\"o-table-body o-scroll\" [class.horizontal-scroll]=\"horizontalScroll\" [class.scrolled]=\"horizontalScrolled\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n <ng-container *ngIf=\"!enabledVirtualScroll; else tableWithVirtualScroll\">\n <div class=\"o-table-overflow o-scroll\">\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </div>\n </ng-container>\n <ng-template #tableWithVirtualScroll>\n <cdk-virtual-scroll-viewport #virtualScrollViewPort fxFlex>\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n </div>\n <!--TABLE PAGINATOR-->\n <mat-paginator *ngIf=\"paginator\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageIndex]=\"paginator.pageIndex\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"paginator.pageSizeOptions\" (page)=\"onChangePage($event)\" [showFirstLastButtons]=\"paginator.showFirstLastButtons\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n </mat-paginator>\n\n <!--LOADING-->\n <div #spinnerContainer *ngIf=\"showLoading | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" [ngStyle]=\"{'top.px': toolBarHeight}\"\n class=\"spinner-container\" [class.spinner-container-scrollable]=\"loadingScroll | async\">\n <o-table-skeleton></o-table-skeleton>\n </div>\n\n <!-- Disable blocker -->\n <div *ngIf=\"!enabled\" class=\"o-table-disabled-blocker\"></div>\n</div>\n\n<ng-template #table>\n\n <table mat-table #table [class.autoadjusted]=\"autoAdjust\" [trackBy]=\"getTrackByFunction()\" [dataSource]=\"dataSource\" oMatSort\n [oMatSortColumns]=\"sortColArray\" [ngClass]=\"rowHeightObservable | async\" (cdkObserveContent)=\"projectContentChanged()\"\n [oTableExpandedFooter]=\"(loading | async) === false\" [oTableExpandedFooterColspan]=\"visibleColArray.length\" [multiTemplateDataRows]=\"showExpandableRow()\"\n aria-describedby=\"ontimize-web table\">\n\n <!--Checkbox Column -->\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <ng-container *ngIf=\"!tableColumnSelectAllContentChild; else customHeaderSelectAllTemplate\">\n <th mat-header-cell *matHeaderCellDef>\n <div class=\"content\" *ngIf=\"isSelectionModeMultiple()\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-template #customHeaderSelectAllTemplate>\n <th mat-header-cell *matHeaderCellDef [class.resizable]=\"resizable\" class=\"mat-header-select-all-with-title o-center\"\n [style.width]=\"oTableOptions.selectColumn.width\" [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\"\n [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <div class=\"content\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"o-center\" [style.width]=\"oTableOptions.selectColumn.width\"\n [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\" [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-template>\n\n\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!--Expandable Column -->\n <ng-container [matColumnDef]=\"oTableOptions.expandableColumn.name\" *ngIf=\"isColumnExpandable()\">\n <th mat-header-cell *matHeaderCellDef>\n {{ oTableOptions.expandableColumn.title }}\n </th>\n <td mat-cell *matCellDef=\"let row;let rowIndex = dataIndex\">\n <mat-icon *ngIf=\"showExpandableIcon(row, rowIndex) | async\"\n (click)=\"toggleRowExpandable(row, $event)\"\n (keydown)=\"toggleRowExpandable(row, $event)\">\n <ng-container *ngIf=\"isExpanded(row)\">{{ tableRowExpandable.iconCollapse }}</ng-container>\n <ng-container *ngIf=\"!isExpanded(row)\">{{ tableRowExpandable.iconExpand }}</ng-container>\n </mat-icon>\n </td>\n </ng-container>\n\n <!-- Generic column definition -->\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name\">\n <!--Define header-cell-->\n\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"getTitleAlignClass(column)\" [class.resizable]=\"resizable\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\">\n\n <div class=\"content\">\n <o-table-header [column]=\"column\"></o-table-header>\n </div>\n </th>\n\n\n <!--Define mat-cell-->\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else cellTemplateMultiTemplateDataRows\">\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = index \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n </td>\n </ng-container>\n <ng-template #cellTemplateMultiTemplateDataRows>\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = dataIndex \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n\n </td>\n </ng-template>\n <!--Define mat-footer-cell-->\n <ng-container *ngIf=\"showTotals | async\">\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"column.className\">\n <div class=\"title\" *ngIf=\"column.aggregate && column.aggregate.title\">\n {{ column.aggregate.title | oTranslate }}\n </div>\n <ng-container *ngIf=\"!column.renderer\">\n {{ dataSource.getAggregateData(column) }}\n </ng-container>\n <ng-template *ngIf=\"column.renderer && column.aggregate\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{cellvalue: dataSource.getAggregateData(column)}\"></ng-template>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"hasExpandedRow\">\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row;let rowIndex= dataIndex\" [attr.colspan]=\"oTableOptions.visibleColumns.length\">\n <div [ngClass]=\"getExpandedRowContainerClass(rowIndex)\" [@detailExpand]=\"getStateExpand(row)\">\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <!--FOOTER-INSERTABLE-->\n <ng-container *ngIf=\"showLastInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name + getSuffixColumnInsertable()\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-footer-cell *matFooterCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name+ getSuffixColumnInsertable()\">\n\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field o-table-cell-editor-text o-table-cell-editor\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <ng-container *ngIf=\"showFirstInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"getColumnInsertable(oTableOptions.selectColumn.name)\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-header-cell *matHeaderCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"getColumnInsertable(column.name)\">\n\n <td mat-header-cell *matHeaderCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Definition column group header -->\n <ng-container *ngFor=\"let column of groupingHeadersRows; let i = index\" [matColumnDef]=\"column\">\n <td mat-cell *matCellDef=\"let group\" class=\"grouping-row\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column, rowValue:group, rowIndex:i}\" [ngClass]=\"getGroupHeaderCellAlignClass(column)\">\n <div *ngIf=\"i===0\" class=\"grouping-title-wrapper\" [ngStyle]=\"{'padding-left': 20*(group.level-1)+'px'}\">\n <mat-icon>{{ group.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n {{ group.title }}\n </div>\n <div class=\"grouping-aggregate\" *ngIf=\"group.hasActiveAggregate(visibleColArray[i])\">\n {{ group.getColumnActiveAggregateTitle(visibleColArray[i]) | oTranslate }} :\n <ng-container *ngIf=\"!getOColumnFromGroupHeaderColumn(column).renderer\">\n {{ group.getColumnAggregateValue(visibleColArray[i])}}\n </ng-container>\n <ng-container *ngIf=\"getOColumnFromGroupHeaderColumn(column).renderer\">\n <ng-template\n *ngTemplateOutlet=\"getOColumnFromGroupHeaderColumn(column).renderer?.templateref; context:{ cellvalue: group.getColumnAggregateValue(visibleColArray[i]) }\">\n </ng-template>\n </ng-container>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"position\">\n <td mat-cell *matCellDef=\"let row\"> {{row}} </td>\n </ng-container>\n\n <tr #tableHeader mat-header-row *matHeaderRowDef=\"oTableOptions.visibleColumns; sticky: fixedHeader\"></tr>\n\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else rowTemplateMultiTemplateDataRows\">\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = index\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-container>\n <ng-template #rowTemplateMultiTemplateDataRows>\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = dataIndex\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-template>\n\n <!-- Row Group header -->\n <tr mat-row *matRowDef=\"let row; columns: groupingHeadersRows; when:isGroup\" (click)=\"groupHeaderClick(row)\"\n [ngClass]=\"getClassNameGroupHeader(row)\">\n </tr>\n\n <!-- Expanded detail row-->\n <ng-container *ngIf=\"hasExpandedRow\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"o-table-row-expanded\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"showLastInsertableRow\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"></tr>\n </ng-container>\n <ng-container *ngIf=\"showFirstInsertableRow\">\n <tr mat-header-row *matHeaderRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"> </tr>\n </ng-container>\n <ng-container *ngIf=\"showTotals | async\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.visibleColumns; sticky: true\" class=\"o-table-aggregate\">\n </tr>\n </ng-container>\n </table>\n\n</ng-template>\n\n<ng-container *ngIf=\"!contextMenuContentChild && contextMenu\">\n <o-table-context-menu [insert]=\"insertButton\" [edit]=\"editionMode !== EDIT_MODE_NONE\" [view-detail]=\"detailMode !== DETAIL_MODE_NONE\"\n [refresh]=\"refreshButton\" [delete]=\"deleteButton\" [filter]=\"showFilterOption\" [group-by-row]=\"groupable\">\n </o-table-context-menu>\n</ng-container>\n\n<ng-template #cellRenderer let-row=\"row\" let-column=\"column\">\n <div class=\"content\">\n\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"column.renderer != null && (!column.editing || column.editing && !isRowSelected(row))\">\n <ng-template *ngTemplateOutlet=\"column.renderer?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"isRowSelected(row) && column.editing\">\n <ng-template *ngTemplateOutlet=\"column.editor?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"column.type === 'editButtonInRow' || column.type === 'detailButtonInRow'\">\n <div fxLayoutAlign=\"center center\" class=\"o-action-cell-renderer\" (click)=\"onDetailButtonClick(column, row, $event)\">\n <mat-icon>{{ getDetailButtonIcon(column) }}</mat-icon>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ row[column.name] }}</ng-container>\n </ng-container>\n\n </div>\n</ng-template>\n", styles: [".o-table{height:100%;max-height:100%;width:100%}.o-table.o-table-disabled{opacity:.4}.o-table .o-table-container{height:100%;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-content:stretch;min-width:100%;min-height:400px;position:relative;padding:0 .5%}.o-table .o-table-container .o-table-body{display:flex;flex:1 1 auto}.o-table .o-table-container .o-table-body .o-table-overflow{overflow-y:auto;overflow-x:hidden;min-width:100%}.o-table .o-table-container .o-table-body.horizontal-scroll .o-table-overflow{overflow-x:auto}.o-table .o-table-container .o-table-body thead .mat-mdc-header-row th:last-child .o-table-column-resizer{display:none}.o-table .o-table-container.block-events{pointer-events:none}.o-table .o-table-container.block-events>.o-table-toolbar,.o-table .o-table-container.block-events>.o-table-body .mat-mdc-header-row{opacity:.75}.o-table .o-table-container .o-table-toolbar{height:40px}.o-table .o-table-container .o-table-toolbar>div{max-height:100%}.o-table .o-table-container .o-table-toolbar .buttons{margin:0 10px 0 4px}.o-table .o-table-container .o-table-body{max-width:100%;height:100%;overflow:hidden;position:relative}.o-table .o-table-container .o-table-body .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .o-table-container .o-table-body.horizontal-scroll{overflow-x:auto;padding-bottom:16px}.o-table .o-table-container .o-table-body.horizontal-scroll .mat-mdc-header-cell{width:150px}.o-table .o-table-container .o-table-body .o-table-no-results{cursor:default;text-align:center}.o-table .o-table-container .o-table-body .o-table-no-results td{text-align:center}.o-table .o-table-container .mat-mdc-table{table-layout:fixed;width:100%}.o-table .o-table-container .mat-mdc-table.autoadjusted{table-layout:auto}.o-table .o-table-container .mat-mdc-table td .content,.o-table .o-table-container .mat-mdc-table th .content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-header-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:24px;height:24px}.o-table .o-table-container .mat-mdc-table.large .column-filter-icon{margin-top:4px}.o-table .o-table-container .mat-mdc-table.large .mat-sort-header-arrow{margin-top:7px}.o-table .o-table-container .mat-mdc-table tr.mat-mdc-row.o-table-row-expanded{height:0}.o-table .o-table-container .mat-mdc-table tr.o-table-insertable td{height:1px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell{padding:0 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row{box-sizing:border-box;transition:background-color .2s;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell{padding:0 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row{padding-top:30px;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-title-wrapper,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-title-wrapper{position:absolute;width:100%;left:0;top:0;text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-aggregate,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-aggregate{font-weight:700;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-bottom:8px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.empty-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.empty-cell{min-height:16px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .action-cell-renderer,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .action-cell-renderer{cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-start,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-center,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-end,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell *,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell *{vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell),.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell){padding:6px 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline .content,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline .content{overflow:initial;white-space:normal;text-overflow:unset}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:32px;height:32px;margin:1px auto;overflow:hidden;border-radius:50%;position:relative;z-index:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar img,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:inherit;max-height:inherit}.o-table .o-table-container .mat-mdc-table .o-action-cell-renderer{display:inline-block;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell{overflow:hidden;position:relative;box-sizing:border-box;padding:0 12px;vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select.mat-header-select-all-with-title{padding-right:12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:first-of-type{padding-left:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:not(.o-column-image){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .o-table-header-indicator-numbered{font-size:8px;position:absolute;text-align:center;display:inline-block;width:18px;height:18px;line-height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;bottom:-10px;right:-9px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .column-filter-icon{cursor:pointer;font-size:18px;width:18px;height:18px;line-height:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{flex:1;display:block;place-content:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container{cursor:default;min-height:20px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start .mat-sort-header-button{text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center .mat-sort-header-button{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end .mat-sort-header-button{text-align:right}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select{box-sizing:content-box;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select:not(.mat-header-select-all-with-title),.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select:not(.mat-header-select-all-with-title){width:30px}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select .mat-checkbox-layout,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select .mat-checkbox-layout{text-overflow:ellipsis;overflow:hidden;display:inline}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-expandable,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-expandable{width:40px;box-sizing:content-box;padding:0 0 0 24px;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell .row-container-expanded{overflow:hidden;display:flex}.o-table .o-table-container .o-table-disabled-blocker{bottom:0;left:0;position:absolute;right:0;top:0;z-index:100}.o-table .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .spinner-container-scrollable{position:relative}.o-table.o-table-fixed{display:flex}.o-table.o-table-fixed .o-table-container{display:flex;flex-direction:column}.o-table.o-table-fixed .o-table-body{display:flex;flex:1}.o-table.o-table-fixed .o-table-body .o-table-overflow{flex:1;overflow-y:auto}.mat-mdc-tooltip.o-table-cell-tooltip{word-wrap:break-word;overflow:hidden;min-width:140px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i4.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i14.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i14.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i14.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i14.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i14.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i14.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i14.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i14.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i14.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i14.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i14.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i14.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i14.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i15.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i16.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i17.OContextMenuDirective, selector: "[oContextMenu]", inputs: ["oContextMenu", "oContextMenuData"] }, { kind: "directive", type: i18.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "directive", type: i19.OMatSort, selector: "[oMatSort]", inputs: ["oMatSortDisabled", "oMatSortColumns"], outputs: ["matSortChange"], exportAs: ["oMatSort"] }, { kind: "component", type: i20.ODataToolbarComponent, selector: "o-data-toolbar", inputs: ["show-title", "title"] }, { kind: "component", type: i21.OTableContextMenuComponent, selector: "o-table-context-menu", inputs: ["context-menu", "insert", "edit", "view-detail", "copy", "select-all", "refresh", "delete", "filter", "group-by-row"] }, { kind: "directive", type: i22.OTableRowDirective, selector: "[oTableRow]" }, { kind: "directive", type: i23.OTableExpandedFooterDirective, selector: "[oTableExpandedFooter]", inputs: ["oTableExpandedFooter", "oTableExpandedFooterColspan"] }, { kind: "component", type: i24.OTableButtonsComponent, selector: "o-table-buttons", inputs: ["insert-button", "refresh-button", "delete-button"] }, { kind: "component", type: i25.OTableMenuComponent, selector: "o-table-menu", inputs: ["select-all-checkbox", "export-button", "columns-visibility-button", "show-configuration-option", "show-filter-option", "show-group-by-option", "show-reset-width-option", "show-report-on-demand-option", "show-charts-on-demand-option"] }, { kind: "component", type: i26.OTableQuickfilterComponent, selector: "o-table-quickfilter", inputs: ["placeholder"], outputs: ["onChange"] }, { kind: "component", type: i27.OTableHeaderComponent, selector: "o-table-header", inputs: ["column"] }, { kind: "component", type: i28.OTableHeaderSelectAllComponent, selector: "o-table-header-select-all", inputs: ["column"] }, { kind: "component", type: i29.OTableSkeletonComponent, selector: "o-table-skeleton" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i30.OTranslatePipe, name: "oTranslate" }, { kind: "pipe", type: i31.OTableRowClassPipe, name: "oTableRowClass" }], animations: [
2756
+ { provide: OTableBase, useExisting: forwardRef(() => OTableComponent) },
2757
+ OTableLoadingService
2758
+ ], queries: [{ propertyName: "tableRowExpandable", first: true, predicate: OTableRowExpandableComponent, descendants: true }, { propertyName: "quickfilterContentChild", first: true, predicate: ["o-table-quickfilter"], descendants: true, static: true }, { propertyName: "tableColumnSelectAllContentChild", first: true, predicate: OTableColumnSelectAllDirective, descendants: true }, { propertyName: "contextMenuContentChild", first: true, predicate: OTableContextMenuComponent, descendants: true, static: true }, { propertyName: "tableOptions", predicate: OTableOptionComponent }, { propertyName: "tableButtons", predicate: OTableButtonComponent }, { propertyName: "exportOptsTemplate", predicate: OTableExportButtonComponent }], viewQueries: [{ propertyName: "oMatSort", first: true, predicate: OMatSort, descendants: true }, { propertyName: "cdkVirtualScrollViewport", first: true, predicate: ["virtualScrollViewPort"], descendants: true }, { propertyName: "spinnerContainer", first: true, predicate: ["spinnerContainer"], descendants: true, read: ElementRef }, { propertyName: "tableBodyEl", first: true, predicate: ["tableBody"], descendants: true }, { propertyName: "tableHeaderEl", first: true, predicate: ["tableHeader"], descendants: true, read: ElementRef }, { propertyName: "tableToolbarEl", first: true, predicate: ["tableToolbar"], descendants: true, read: ElementRef }, { propertyName: "matTable", first: true, predicate: MatTable, descendants: true }, { propertyName: "oTableMenu", first: true, predicate: ["tableMenu"], descendants: true }, { propertyName: "rows", predicate: MatRow, descendants: true }, { propertyName: "tooltip", predicate: MatTooltip, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"o-table-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [style.display]=\"isVisible()? '' : 'none'\"\n [class.block-events]=\"loadingService.isProcessing$ | async\">\n <o-data-toolbar #tableToolbar *ngIf=\"hasControls()\" [title]=\"title\" [show-title]=\"showTitle\" class=\"o-table-toolbar\">\n <ng-container o-data-toolbar-projection-start>\n <o-table-buttons #tableButtons [insert-button]=\"insertButton\" [refresh-button]=\"refreshButton\" [delete-button]=\"showDeleteButton\">\n <ng-content select=\"o-table-button\"></ng-content>\n </o-table-buttons>\n </ng-container>\n <ng-content select=\"[o-table-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <ng-container *ngIf=\"quickfilterContentChild; else defaultQuickFilter\">\n <ng-content select=\"o-table-quickfilter\"></ng-content>\n </ng-container>\n <ng-template #defaultQuickFilter>\n <ng-container *ngIf=\"quickFilter\">\n <o-table-quickfilter (onChange)=\"tableQuickFilterChanged($event)\">\n </o-table-quickfilter>\n </ng-container>\n </ng-template>\n <button type=\"button\" *ngIf=\"showTableMenuButton\" mat-icon-button class=\"o-table-menu-button\" [matMenuTriggerFor]=\"tableMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-table-menu #tableMenu [select-all-checkbox]=\"selectAllCheckbox\" [export-button]=\"exportButton\"\n [columns-visibility-button]=\"columnsVisibilityButton\" [show-configuration-option]=\"showConfigurationOption\"\n [show-filter-option]=\"showFilterOption\" [show-report-on-demand-option]=\"showReportOnDemandOption\"\n [show-charts-on-demand-option]=\"showChartsOnDemandOption\" [show-reset-width-option]=\"showResetWidthOption\" [show-group-by-option]=\"groupable\">\n <ng-content select=\"o-table-option\"></ng-content>\n </o-table-menu>\n </ng-container>\n </o-data-toolbar>\n\n <div #tableBody class=\"o-table-body o-scroll\" [class.horizontal-scroll]=\"horizontalScroll\" [class.scrolled]=\"horizontalScrolled\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n <ng-container *ngIf=\"!enabledVirtualScroll; else tableWithVirtualScroll\">\n <div class=\"o-table-overflow o-scroll\">\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </div>\n </ng-container>\n <ng-template #tableWithVirtualScroll>\n <cdk-virtual-scroll-viewport #virtualScrollViewPort fxFlex>\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n </div>\n <!--TABLE PAGINATOR-->\n <mat-paginator *ngIf=\"paginator\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageIndex]=\"paginator.pageIndex\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"paginator.pageSizeOptions\" (page)=\"onChangePage($event)\" [showFirstLastButtons]=\"paginator.showFirstLastButtons\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n </mat-paginator>\n\n <!--LOADING-->\n <div #spinnerContainer *ngIf=\"showLoading | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" [ngStyle]=\"{'top.px': toolBarHeight}\"\n class=\"spinner-container\" [class.spinner-container-scrollable]=\"loadingScroll | async\">\n <o-table-skeleton></o-table-skeleton>\n </div>\n\n <!-- Disable blocker -->\n <div *ngIf=\"!enabled\" class=\"o-table-disabled-blocker\"></div>\n</div>\n\n<ng-template #table>\n <table mat-table #table [class.autoadjusted]=\"autoAdjust\" [trackBy]=\"getTrackByFunction()\" [dataSource]=\"dataSource\" oMatSort\n [oMatSortColumns]=\"sortColArray\" [ngClass]=\"rowHeightObservable | async\" (cdkObserveContent)=\"projectContentChanged()\"\n oTableExpandedFooter [oTableExpandedFooterColspan]=\"visibleColArray.length\"\n [multiTemplateDataRows]=\"showExpandableRow()\" aria-describedby=\"ontimize-web table\">\n\n <!--Checkbox Column -->\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <ng-container *ngIf=\"!tableColumnSelectAllContentChild; else customHeaderSelectAllTemplate\">\n <th mat-header-cell *matHeaderCellDef>\n <div class=\"content\" *ngIf=\"isSelectionModeMultiple()\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-template #customHeaderSelectAllTemplate>\n <th mat-header-cell *matHeaderCellDef [class.resizable]=\"resizable\" class=\"mat-header-select-all-with-title o-center\"\n [style.width]=\"oTableOptions.selectColumn.width\" [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\"\n [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <div class=\"content\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"o-center\" [style.width]=\"oTableOptions.selectColumn.width\"\n [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\" [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-template>\n\n\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!--Expandable Column -->\n <ng-container [matColumnDef]=\"oTableOptions.expandableColumn.name\" *ngIf=\"isColumnExpandable()\">\n <th mat-header-cell *matHeaderCellDef>\n {{ oTableOptions.expandableColumn.title }}\n </th>\n <td mat-cell *matCellDef=\"let row;let rowIndex = dataIndex\">\n <mat-icon *ngIf=\"showExpandableIcon(row, rowIndex) | async\" (click)=\"toggleRowExpandable(row, $event)\"\n (keydown)=\"toggleRowExpandable(row, $event)\">\n <ng-container *ngIf=\"isExpanded(row)\">{{ tableRowExpandable.iconCollapse }}</ng-container>\n <ng-container *ngIf=\"!isExpanded(row)\">{{ tableRowExpandable.iconExpand }}</ng-container>\n </mat-icon>\n </td>\n </ng-container>\n\n <!-- Generic column definition -->\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name\">\n <!--Define header-cell-->\n\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"getTitleAlignClass(column)\" [class.resizable]=\"resizable\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\">\n\n <div class=\"content\">\n <o-table-header [column]=\"column\"></o-table-header>\n </div>\n </th>\n\n\n <!--Define mat-cell-->\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else cellTemplateMultiTemplateDataRows\">\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = index \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n </td>\n </ng-container>\n <ng-template #cellTemplateMultiTemplateDataRows>\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = dataIndex \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n\n </td>\n </ng-template>\n <!--Define mat-footer-cell-->\n <ng-container *ngIf=\"showTotals | async\">\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"column.className\">\n <div class=\"title\" *ngIf=\"column.aggregate && column.aggregate.title\">\n {{ column.aggregate.title | oTranslate }}\n </div>\n <ng-container *ngIf=\"!column.renderer || column.aggregate?.operator === 'count'; else rendererTemplate\">\n {{ dataSource.getAggregateData(column) }}\n </ng-container>\n <ng-template #rendererTemplate>\n <ng-template *ngIf=\"column.renderer && column.aggregate\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{cellvalue: dataSource.getAggregateData(column)}\">\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"hasExpandedRow\">\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row;let rowIndex= dataIndex\" [attr.colspan]=\"oTableOptions.visibleColumns.length\">\n <div [ngClass]=\"getExpandedRowContainerClass(rowIndex)\" [@detailExpand]=\"getStateExpand(row)\">\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <!--FOOTER-INSERTABLE-->\n <ng-container *ngIf=\"showLastInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name + getSuffixColumnInsertable()\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-footer-cell *matFooterCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name+ getSuffixColumnInsertable()\">\n\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field o-table-cell-editor-text o-table-cell-editor\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <ng-container *ngIf=\"showFirstInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"getColumnInsertable(oTableOptions.selectColumn.name)\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-header-cell *matHeaderCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"getColumnInsertable(column.name)\">\n\n <td mat-header-cell *matHeaderCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Definition column group header -->\n <ng-container *ngFor=\"let column of groupingHeadersRows; let i = index\" [matColumnDef]=\"column\">\n <td mat-cell *matCellDef=\"let group\" class=\"grouping-row\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column, rowValue:group, rowIndex:i}\" [ngClass]=\"getGroupHeaderCellAlignClass(column)\">\n <div *ngIf=\"i===0\" class=\"grouping-title-wrapper\" [ngStyle]=\"{'padding-left': 20*(group.level-1)+'px'}\">\n <mat-icon>{{ group.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n {{ group.title }}\n </div>\n <div class=\"grouping-aggregate\" *ngIf=\"group.hasActiveAggregate(visibleColArray[i])\">\n {{ group.getColumnActiveAggregateTitle(visibleColArray[i]) | oTranslate }} :\n <ng-container *ngIf=\"!getOColumnFromGroupHeaderColumn(column).renderer\">\n {{ group.getColumnAggregateValue(visibleColArray[i])}}\n </ng-container>\n <ng-container *ngIf=\"getOColumnFromGroupHeaderColumn(column).renderer\">\n <ng-template\n *ngTemplateOutlet=\"getOColumnFromGroupHeaderColumn(column).renderer?.templateref; context:{ cellvalue: group.getColumnAggregateValue(visibleColArray[i]) }\">\n </ng-template>\n </ng-container>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"position\">\n <td mat-cell *matCellDef=\"let row\"> {{row}} </td>\n </ng-container>\n\n <tr #tableHeader mat-header-row *matHeaderRowDef=\"oTableOptions.visibleColumns; sticky: fixedHeader\"></tr>\n\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else rowTemplateMultiTemplateDataRows\">\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = index\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-container>\n <ng-template #rowTemplateMultiTemplateDataRows>\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = dataIndex\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-template>\n\n <!-- Row Group header -->\n <tr mat-row *matRowDef=\"let row; columns: groupingHeadersRows; when:isGroup\" (click)=\"groupHeaderClick(row)\"\n [ngClass]=\"getClassNameGroupHeader(row)\">\n </tr>\n\n <!-- Expanded detail row-->\n <ng-container *ngIf=\"hasExpandedRow\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"o-table-row-expanded\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"showLastInsertableRow\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"></tr>\n </ng-container>\n <ng-container *ngIf=\"showFirstInsertableRow\">\n <tr mat-header-row *matHeaderRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"> </tr>\n </ng-container>\n <ng-container *ngIf=\"showTotals | async\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.visibleColumns; sticky: true\" class=\"o-table-aggregate\">\n </tr>\n </ng-container>\n </table>\n\n</ng-template>\n\n<ng-container *ngIf=\"!contextMenuContentChild && contextMenu\">\n <o-table-context-menu [insert]=\"insertButton\" [edit]=\"editionMode !== EDIT_MODE_NONE\" [view-detail]=\"detailMode !== DETAIL_MODE_NONE\"\n [refresh]=\"refreshButton\" [delete]=\"deleteButton\" [filter]=\"showFilterOption\" [group-by-row]=\"groupable\">\n </o-table-context-menu>\n</ng-container>\n\n<ng-template #cellRenderer let-row=\"row\" let-column=\"column\">\n <div class=\"content\">\n\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"column.renderer != null && (!column.editing || column.editing && !isRowSelected(row))\">\n <ng-template *ngTemplateOutlet=\"column.renderer?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"isRowSelected(row) && column.editing\">\n <ng-template *ngTemplateOutlet=\"column.editor?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"column.type === 'editButtonInRow' || column.type === 'detailButtonInRow'\">\n <div fxLayoutAlign=\"center center\" class=\"o-action-cell-renderer\" (click)=\"onDetailButtonClick(column, row, $event)\">\n <mat-icon>{{ getDetailButtonIcon(column) }}</mat-icon>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ row[column.name] }}</ng-container>\n </ng-container>\n\n </div>\n</ng-template>\n", styles: [".o-table{height:100%;max-height:100%;width:100%}.o-table.o-table-disabled{opacity:.4}.o-table .o-table-container{height:100%;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-content:stretch;min-width:100%;min-height:400px;position:relative;padding:0 .5%}.o-table .o-table-container .o-table-body{display:flex;flex:1 1 auto}.o-table .o-table-container .o-table-body .o-table-overflow{overflow-y:auto;overflow-x:hidden;min-width:100%}.o-table .o-table-container .o-table-body.horizontal-scroll .o-table-overflow{overflow-x:auto}.o-table .o-table-container .o-table-body thead .mat-mdc-header-row th:last-child .o-table-column-resizer{display:none}.o-table .o-table-container.block-events{pointer-events:none}.o-table .o-table-container .o-table-toolbar{height:40px}.o-table .o-table-container .o-table-toolbar>div{max-height:100%}.o-table .o-table-container .o-table-toolbar .buttons{margin:0 10px 0 4px}.o-table .o-table-container .o-table-body{max-width:100%;height:100%;overflow:hidden;position:relative}.o-table .o-table-container .o-table-body .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .o-table-container .o-table-body.horizontal-scroll{overflow-x:auto;padding-bottom:16px}.o-table .o-table-container .o-table-body.horizontal-scroll .mat-mdc-header-cell{width:150px}.o-table .o-table-container .o-table-body .o-table-no-results{cursor:default;text-align:center}.o-table .o-table-container .o-table-body .o-table-no-results td{text-align:center}.o-table .o-table-container .mat-mdc-table{table-layout:fixed;width:100%}.o-table .o-table-container .mat-mdc-table.autoadjusted{table-layout:auto}.o-table .o-table-container .mat-mdc-table td .content,.o-table .o-table-container .mat-mdc-table th .content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-header-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:24px;height:24px}.o-table .o-table-container .mat-mdc-table.large .column-filter-icon{margin-top:4px}.o-table .o-table-container .mat-mdc-table.large .mat-sort-header-arrow{margin-top:7px}.o-table .o-table-container .mat-mdc-table tr.mat-mdc-row.o-table-row-expanded{height:0}.o-table .o-table-container .mat-mdc-table tr.o-table-insertable td{height:1px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell{padding:0 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row{box-sizing:border-box;transition:background-color .2s;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell{padding:0 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row{padding-top:30px;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-title-wrapper,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-title-wrapper{position:absolute;width:100%;left:0;top:0;text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-aggregate,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-aggregate{font-weight:700;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-bottom:8px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.empty-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.empty-cell{min-height:16px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .action-cell-renderer,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .action-cell-renderer{cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-start,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-center,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-end,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell *,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell *{vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell),.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell){padding:6px 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline .content,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline .content{overflow:initial;white-space:normal;text-overflow:unset}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:32px;height:32px;margin:1px auto;overflow:hidden;border-radius:50%;position:relative;z-index:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar img,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:inherit;max-height:inherit}.o-table .o-table-container .mat-mdc-table .o-action-cell-renderer{display:inline-block;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell{overflow:hidden;position:relative;box-sizing:border-box;padding:0 12px;vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select.mat-header-select-all-with-title{padding-right:12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:first-of-type{padding-left:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:not(.o-column-image){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:has(.o-table-column-resizer){padding-right:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .o-table-header-indicator-numbered{font-size:8px;position:absolute;text-align:center;display:inline-block;width:18px;height:18px;line-height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;bottom:-10px;right:-9px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .column-filter-icon{cursor:pointer;font-size:18px;width:18px;height:18px;line-height:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{flex:1;display:block;place-content:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container{cursor:default;min-height:20px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start .mat-sort-header-button{text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center .mat-sort-header-button{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end .mat-sort-header-button{text-align:right}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select{box-sizing:content-box;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select:not(.mat-header-select-all-with-title),.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select:not(.mat-header-select-all-with-title){width:30px}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select .mat-checkbox-layout,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select .mat-checkbox-layout{text-overflow:ellipsis;overflow:hidden;display:inline}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-expandable,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-expandable{width:40px;box-sizing:content-box;padding:0 0 0 24px;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell .row-container-expanded{overflow:hidden;display:flex}.o-table .o-table-container .o-table-disabled-blocker{bottom:0;left:0;position:absolute;right:0;top:0;z-index:100}.o-table .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .spinner-container-scrollable{position:relative}.o-table.o-table-fixed{display:flex}.o-table.o-table-fixed .o-table-container{display:flex;flex-direction:column}.o-table.o-table-fixed .o-table-body{display:flex;flex:1}.o-table.o-table-fixed .o-table-body .o-table-overflow{flex:1;overflow-y:auto}.mat-mdc-tooltip.o-table-cell-tooltip{word-wrap:break-word;overflow:hidden;min-width:140px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i4.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i14.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i14.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i14.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i14.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i14.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i14.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i14.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i14.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i14.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i14.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i14.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i14.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i14.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i15.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i16.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i17.OContextMenuDirective, selector: "[oContextMenu]", inputs: ["oContextMenu", "oContextMenuData"] }, { kind: "directive", type: i18.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "directive", type: i19.OMatSort, selector: "[oMatSort]", inputs: ["oMatSortDisabled", "oMatSortColumns"], outputs: ["matSortChange"], exportAs: ["oMatSort"] }, { kind: "component", type: i20.ODataToolbarComponent, selector: "o-data-toolbar", inputs: ["show-title", "title"] }, { kind: "component", type: i21.OTableContextMenuComponent, selector: "o-table-context-menu", inputs: ["context-menu", "insert", "edit", "view-detail", "copy", "select-all", "refresh", "delete", "filter", "group-by-row"] }, { kind: "directive", type: i22.OTableRowDirective, selector: "[oTableRow]" }, { kind: "directive", type: i23.OTableExpandedFooterDirective, selector: "[oTableExpandedFooter]", inputs: ["oTableExpandedFooterColspan"] }, { kind: "component", type: i24.OTableButtonsComponent, selector: "o-table-buttons", inputs: ["insert-button", "refresh-button", "delete-button"] }, { kind: "component", type: i25.OTableMenuComponent, selector: "o-table-menu", inputs: ["select-all-checkbox", "export-button", "columns-visibility-button", "show-configuration-option", "show-filter-option", "show-group-by-option", "show-reset-width-option", "show-report-on-demand-option", "show-charts-on-demand-option"] }, { kind: "component", type: i26.OTableQuickfilterComponent, selector: "o-table-quickfilter", inputs: ["placeholder"], outputs: ["onChange"] }, { kind: "component", type: i27.OTableHeaderComponent, selector: "o-table-header", inputs: ["column"] }, { kind: "component", type: i28.OTableHeaderSelectAllComponent, selector: "o-table-header-select-all", inputs: ["column"] }, { kind: "component", type: i29.OTableSkeletonComponent, selector: "o-table-skeleton" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i30.OTranslatePipe, name: "oTranslate" }, { kind: "pipe", type: i31.OTableRowClassPipe, name: "oTableRowClass" }], animations: [
2718
2759
  trigger('detailExpand', [
2719
2760
  state('collapsed', style({ height: '0px', minHeight: '0' })),
2720
2761
  state('expanded', style({ height: '*' })),
@@ -2842,7 +2883,7 @@ __decorate([
2842
2883
  BooleanInputConverter(),
2843
2884
  __metadata("design:type", Boolean)
2844
2885
  ], OTableComponent.prototype, "keepSelectedItems", void 0);
2845
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OTableComponent, decorators: [{
2886
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableComponent, decorators: [{
2846
2887
  type: Component,
2847
2888
  args: [{ selector: 'o-table', providers: [
2848
2889
  OntimizeServiceProvider,
@@ -2851,7 +2892,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2851
2892
  OTableFilterByColumnService,
2852
2893
  { provide: O_COMPONENT_STATE_SERVICE, useClass: OTableComponentStateService },
2853
2894
  { provide: VIRTUAL_SCROLL_STRATEGY, useClass: OTableVirtualScrollStrategy },
2854
- { provide: OTableBase, useExisting: forwardRef(() => OTableComponent) }
2895
+ { provide: OTableBase, useExisting: forwardRef(() => OTableComponent) },
2896
+ OTableLoadingService
2855
2897
  ], animations: [
2856
2898
  trigger('detailExpand', [
2857
2899
  state('collapsed', style({ height: '0px', minHeight: '0' })),
@@ -2864,7 +2906,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2864
2906
  '[class.o-table-fixed]': 'fixedHeader',
2865
2907
  '[class.o-table-disabled]': '!enabled',
2866
2908
  '(document:click)': 'handleDOMClick($event)'
2867
- }, template: "<div class=\"o-table-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [style.display]=\"isVisible()? '' : 'none'\"\n [class.block-events]=\"showLoading | async\">\n\n <o-data-toolbar #tableToolbar *ngIf=\"hasControls()\" [title]=\"title\" [show-title]=\"showTitle\" class=\"o-table-toolbar\">\n <ng-container o-data-toolbar-projection-start>\n <o-table-buttons #tableButtons [insert-button]=\"insertButton\" [refresh-button]=\"refreshButton\" [delete-button]=\"showDeleteButton\">\n <ng-content select=\"o-table-button\"></ng-content>\n </o-table-buttons>\n </ng-container>\n <ng-content select=\"[o-table-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <ng-container *ngIf=\"quickfilterContentChild; else defaultQuickFilter\">\n <ng-content select=\"o-table-quickfilter\"></ng-content>\n </ng-container>\n <ng-template #defaultQuickFilter>\n <ng-container *ngIf=\"quickFilter\">\n <o-table-quickfilter (onChange)=\"tableQuickFilterChanged($event)\">\n </o-table-quickfilter>\n </ng-container>\n </ng-template>\n <button type=\"button\" *ngIf=\"showTableMenuButton\" mat-icon-button class=\"o-table-menu-button\" [matMenuTriggerFor]=\"tableMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-table-menu #tableMenu [select-all-checkbox]=\"selectAllCheckbox\" [export-button]=\"exportButton\"\n [columns-visibility-button]=\"columnsVisibilityButton\" [show-configuration-option]=\"showConfigurationOption\"\n [show-filter-option]=\"showFilterOption\" [show-report-on-demand-option]=\"showReportOnDemandOption\"\n [show-charts-on-demand-option]=\"showChartsOnDemandOption\" [show-reset-width-option]=\"showResetWidthOption\" [show-group-by-option]=\"groupable\">\n <ng-content select=\"o-table-option\"></ng-content>\n </o-table-menu>\n </ng-container>\n </o-data-toolbar>\n\n <div #tableBody class=\"o-table-body o-scroll\" [class.horizontal-scroll]=\"horizontalScroll\" [class.scrolled]=\"horizontalScrolled\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n <ng-container *ngIf=\"!enabledVirtualScroll; else tableWithVirtualScroll\">\n <div class=\"o-table-overflow o-scroll\">\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </div>\n </ng-container>\n <ng-template #tableWithVirtualScroll>\n <cdk-virtual-scroll-viewport #virtualScrollViewPort fxFlex>\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n </div>\n <!--TABLE PAGINATOR-->\n <mat-paginator *ngIf=\"paginator\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageIndex]=\"paginator.pageIndex\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"paginator.pageSizeOptions\" (page)=\"onChangePage($event)\" [showFirstLastButtons]=\"paginator.showFirstLastButtons\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n </mat-paginator>\n\n <!--LOADING-->\n <div #spinnerContainer *ngIf=\"showLoading | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" [ngStyle]=\"{'top.px': toolBarHeight}\"\n class=\"spinner-container\" [class.spinner-container-scrollable]=\"loadingScroll | async\">\n <o-table-skeleton></o-table-skeleton>\n </div>\n\n <!-- Disable blocker -->\n <div *ngIf=\"!enabled\" class=\"o-table-disabled-blocker\"></div>\n</div>\n\n<ng-template #table>\n\n <table mat-table #table [class.autoadjusted]=\"autoAdjust\" [trackBy]=\"getTrackByFunction()\" [dataSource]=\"dataSource\" oMatSort\n [oMatSortColumns]=\"sortColArray\" [ngClass]=\"rowHeightObservable | async\" (cdkObserveContent)=\"projectContentChanged()\"\n [oTableExpandedFooter]=\"(loading | async) === false\" [oTableExpandedFooterColspan]=\"visibleColArray.length\" [multiTemplateDataRows]=\"showExpandableRow()\"\n aria-describedby=\"ontimize-web table\">\n\n <!--Checkbox Column -->\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <ng-container *ngIf=\"!tableColumnSelectAllContentChild; else customHeaderSelectAllTemplate\">\n <th mat-header-cell *matHeaderCellDef>\n <div class=\"content\" *ngIf=\"isSelectionModeMultiple()\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-template #customHeaderSelectAllTemplate>\n <th mat-header-cell *matHeaderCellDef [class.resizable]=\"resizable\" class=\"mat-header-select-all-with-title o-center\"\n [style.width]=\"oTableOptions.selectColumn.width\" [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\"\n [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <div class=\"content\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"o-center\" [style.width]=\"oTableOptions.selectColumn.width\"\n [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\" [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-template>\n\n\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!--Expandable Column -->\n <ng-container [matColumnDef]=\"oTableOptions.expandableColumn.name\" *ngIf=\"isColumnExpandable()\">\n <th mat-header-cell *matHeaderCellDef>\n {{ oTableOptions.expandableColumn.title }}\n </th>\n <td mat-cell *matCellDef=\"let row;let rowIndex = dataIndex\">\n <mat-icon *ngIf=\"showExpandableIcon(row, rowIndex) | async\"\n (click)=\"toggleRowExpandable(row, $event)\"\n (keydown)=\"toggleRowExpandable(row, $event)\">\n <ng-container *ngIf=\"isExpanded(row)\">{{ tableRowExpandable.iconCollapse }}</ng-container>\n <ng-container *ngIf=\"!isExpanded(row)\">{{ tableRowExpandable.iconExpand }}</ng-container>\n </mat-icon>\n </td>\n </ng-container>\n\n <!-- Generic column definition -->\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name\">\n <!--Define header-cell-->\n\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"getTitleAlignClass(column)\" [class.resizable]=\"resizable\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\">\n\n <div class=\"content\">\n <o-table-header [column]=\"column\"></o-table-header>\n </div>\n </th>\n\n\n <!--Define mat-cell-->\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else cellTemplateMultiTemplateDataRows\">\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = index \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n </td>\n </ng-container>\n <ng-template #cellTemplateMultiTemplateDataRows>\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = dataIndex \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n\n </td>\n </ng-template>\n <!--Define mat-footer-cell-->\n <ng-container *ngIf=\"showTotals | async\">\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"column.className\">\n <div class=\"title\" *ngIf=\"column.aggregate && column.aggregate.title\">\n {{ column.aggregate.title | oTranslate }}\n </div>\n <ng-container *ngIf=\"!column.renderer\">\n {{ dataSource.getAggregateData(column) }}\n </ng-container>\n <ng-template *ngIf=\"column.renderer && column.aggregate\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{cellvalue: dataSource.getAggregateData(column)}\"></ng-template>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"hasExpandedRow\">\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row;let rowIndex= dataIndex\" [attr.colspan]=\"oTableOptions.visibleColumns.length\">\n <div [ngClass]=\"getExpandedRowContainerClass(rowIndex)\" [@detailExpand]=\"getStateExpand(row)\">\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <!--FOOTER-INSERTABLE-->\n <ng-container *ngIf=\"showLastInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name + getSuffixColumnInsertable()\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-footer-cell *matFooterCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name+ getSuffixColumnInsertable()\">\n\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field o-table-cell-editor-text o-table-cell-editor\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <ng-container *ngIf=\"showFirstInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"getColumnInsertable(oTableOptions.selectColumn.name)\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-header-cell *matHeaderCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"getColumnInsertable(column.name)\">\n\n <td mat-header-cell *matHeaderCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Definition column group header -->\n <ng-container *ngFor=\"let column of groupingHeadersRows; let i = index\" [matColumnDef]=\"column\">\n <td mat-cell *matCellDef=\"let group\" class=\"grouping-row\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column, rowValue:group, rowIndex:i}\" [ngClass]=\"getGroupHeaderCellAlignClass(column)\">\n <div *ngIf=\"i===0\" class=\"grouping-title-wrapper\" [ngStyle]=\"{'padding-left': 20*(group.level-1)+'px'}\">\n <mat-icon>{{ group.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n {{ group.title }}\n </div>\n <div class=\"grouping-aggregate\" *ngIf=\"group.hasActiveAggregate(visibleColArray[i])\">\n {{ group.getColumnActiveAggregateTitle(visibleColArray[i]) | oTranslate }} :\n <ng-container *ngIf=\"!getOColumnFromGroupHeaderColumn(column).renderer\">\n {{ group.getColumnAggregateValue(visibleColArray[i])}}\n </ng-container>\n <ng-container *ngIf=\"getOColumnFromGroupHeaderColumn(column).renderer\">\n <ng-template\n *ngTemplateOutlet=\"getOColumnFromGroupHeaderColumn(column).renderer?.templateref; context:{ cellvalue: group.getColumnAggregateValue(visibleColArray[i]) }\">\n </ng-template>\n </ng-container>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"position\">\n <td mat-cell *matCellDef=\"let row\"> {{row}} </td>\n </ng-container>\n\n <tr #tableHeader mat-header-row *matHeaderRowDef=\"oTableOptions.visibleColumns; sticky: fixedHeader\"></tr>\n\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else rowTemplateMultiTemplateDataRows\">\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = index\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-container>\n <ng-template #rowTemplateMultiTemplateDataRows>\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = dataIndex\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-template>\n\n <!-- Row Group header -->\n <tr mat-row *matRowDef=\"let row; columns: groupingHeadersRows; when:isGroup\" (click)=\"groupHeaderClick(row)\"\n [ngClass]=\"getClassNameGroupHeader(row)\">\n </tr>\n\n <!-- Expanded detail row-->\n <ng-container *ngIf=\"hasExpandedRow\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"o-table-row-expanded\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"showLastInsertableRow\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"></tr>\n </ng-container>\n <ng-container *ngIf=\"showFirstInsertableRow\">\n <tr mat-header-row *matHeaderRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"> </tr>\n </ng-container>\n <ng-container *ngIf=\"showTotals | async\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.visibleColumns; sticky: true\" class=\"o-table-aggregate\">\n </tr>\n </ng-container>\n </table>\n\n</ng-template>\n\n<ng-container *ngIf=\"!contextMenuContentChild && contextMenu\">\n <o-table-context-menu [insert]=\"insertButton\" [edit]=\"editionMode !== EDIT_MODE_NONE\" [view-detail]=\"detailMode !== DETAIL_MODE_NONE\"\n [refresh]=\"refreshButton\" [delete]=\"deleteButton\" [filter]=\"showFilterOption\" [group-by-row]=\"groupable\">\n </o-table-context-menu>\n</ng-container>\n\n<ng-template #cellRenderer let-row=\"row\" let-column=\"column\">\n <div class=\"content\">\n\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"column.renderer != null && (!column.editing || column.editing && !isRowSelected(row))\">\n <ng-template *ngTemplateOutlet=\"column.renderer?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"isRowSelected(row) && column.editing\">\n <ng-template *ngTemplateOutlet=\"column.editor?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"column.type === 'editButtonInRow' || column.type === 'detailButtonInRow'\">\n <div fxLayoutAlign=\"center center\" class=\"o-action-cell-renderer\" (click)=\"onDetailButtonClick(column, row, $event)\">\n <mat-icon>{{ getDetailButtonIcon(column) }}</mat-icon>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ row[column.name] }}</ng-container>\n </ng-container>\n\n </div>\n</ng-template>\n", styles: [".o-table{height:100%;max-height:100%;width:100%}.o-table.o-table-disabled{opacity:.4}.o-table .o-table-container{height:100%;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-content:stretch;min-width:100%;min-height:400px;position:relative;padding:0 .5%}.o-table .o-table-container .o-table-body{display:flex;flex:1 1 auto}.o-table .o-table-container .o-table-body .o-table-overflow{overflow-y:auto;overflow-x:hidden;min-width:100%}.o-table .o-table-container .o-table-body.horizontal-scroll .o-table-overflow{overflow-x:auto}.o-table .o-table-container .o-table-body thead .mat-mdc-header-row th:last-child .o-table-column-resizer{display:none}.o-table .o-table-container.block-events{pointer-events:none}.o-table .o-table-container.block-events>.o-table-toolbar,.o-table .o-table-container.block-events>.o-table-body .mat-mdc-header-row{opacity:.75}.o-table .o-table-container .o-table-toolbar{height:40px}.o-table .o-table-container .o-table-toolbar>div{max-height:100%}.o-table .o-table-container .o-table-toolbar .buttons{margin:0 10px 0 4px}.o-table .o-table-container .o-table-body{max-width:100%;height:100%;overflow:hidden;position:relative}.o-table .o-table-container .o-table-body .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .o-table-container .o-table-body.horizontal-scroll{overflow-x:auto;padding-bottom:16px}.o-table .o-table-container .o-table-body.horizontal-scroll .mat-mdc-header-cell{width:150px}.o-table .o-table-container .o-table-body .o-table-no-results{cursor:default;text-align:center}.o-table .o-table-container .o-table-body .o-table-no-results td{text-align:center}.o-table .o-table-container .mat-mdc-table{table-layout:fixed;width:100%}.o-table .o-table-container .mat-mdc-table.autoadjusted{table-layout:auto}.o-table .o-table-container .mat-mdc-table td .content,.o-table .o-table-container .mat-mdc-table th .content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-header-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:24px;height:24px}.o-table .o-table-container .mat-mdc-table.large .column-filter-icon{margin-top:4px}.o-table .o-table-container .mat-mdc-table.large .mat-sort-header-arrow{margin-top:7px}.o-table .o-table-container .mat-mdc-table tr.mat-mdc-row.o-table-row-expanded{height:0}.o-table .o-table-container .mat-mdc-table tr.o-table-insertable td{height:1px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell{padding:0 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row{box-sizing:border-box;transition:background-color .2s;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell{padding:0 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row{padding-top:30px;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-title-wrapper,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-title-wrapper{position:absolute;width:100%;left:0;top:0;text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-aggregate,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-aggregate{font-weight:700;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-bottom:8px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.empty-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.empty-cell{min-height:16px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .action-cell-renderer,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .action-cell-renderer{cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-start,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-center,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-end,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell *,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell *{vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell),.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell){padding:6px 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline .content,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline .content{overflow:initial;white-space:normal;text-overflow:unset}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:32px;height:32px;margin:1px auto;overflow:hidden;border-radius:50%;position:relative;z-index:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar img,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:inherit;max-height:inherit}.o-table .o-table-container .mat-mdc-table .o-action-cell-renderer{display:inline-block;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell{overflow:hidden;position:relative;box-sizing:border-box;padding:0 12px;vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select.mat-header-select-all-with-title{padding-right:12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:first-of-type{padding-left:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:not(.o-column-image){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .o-table-header-indicator-numbered{font-size:8px;position:absolute;text-align:center;display:inline-block;width:18px;height:18px;line-height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;bottom:-10px;right:-9px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .column-filter-icon{cursor:pointer;font-size:18px;width:18px;height:18px;line-height:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{flex:1;display:block;place-content:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container{cursor:default;min-height:20px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start .mat-sort-header-button{text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center .mat-sort-header-button{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end .mat-sort-header-button{text-align:right}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select{box-sizing:content-box;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select:not(.mat-header-select-all-with-title),.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select:not(.mat-header-select-all-with-title){width:30px}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select .mat-checkbox-layout,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select .mat-checkbox-layout{text-overflow:ellipsis;overflow:hidden;display:inline}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-expandable,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-expandable{width:40px;box-sizing:content-box;padding:0 0 0 24px;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell .row-container-expanded{overflow:hidden;display:flex}.o-table .o-table-container .o-table-disabled-blocker{bottom:0;left:0;position:absolute;right:0;top:0;z-index:100}.o-table .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .spinner-container-scrollable{position:relative}.o-table.o-table-fixed{display:flex}.o-table.o-table-fixed .o-table-container{display:flex;flex-direction:column}.o-table.o-table-fixed .o-table-body{display:flex;flex:1}.o-table.o-table-fixed .o-table-body .o-table-overflow{flex:1;overflow-y:auto}.mat-mdc-tooltip.o-table-cell-tooltip{word-wrap:break-word;overflow:hidden;min-width:140px}\n"] }]
2909
+ }, template: "<div class=\"o-table-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [style.display]=\"isVisible()? '' : 'none'\"\n [class.block-events]=\"loadingService.isProcessing$ | async\">\n <o-data-toolbar #tableToolbar *ngIf=\"hasControls()\" [title]=\"title\" [show-title]=\"showTitle\" class=\"o-table-toolbar\">\n <ng-container o-data-toolbar-projection-start>\n <o-table-buttons #tableButtons [insert-button]=\"insertButton\" [refresh-button]=\"refreshButton\" [delete-button]=\"showDeleteButton\">\n <ng-content select=\"o-table-button\"></ng-content>\n </o-table-buttons>\n </ng-container>\n <ng-content select=\"[o-table-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <ng-container *ngIf=\"quickfilterContentChild; else defaultQuickFilter\">\n <ng-content select=\"o-table-quickfilter\"></ng-content>\n </ng-container>\n <ng-template #defaultQuickFilter>\n <ng-container *ngIf=\"quickFilter\">\n <o-table-quickfilter (onChange)=\"tableQuickFilterChanged($event)\">\n </o-table-quickfilter>\n </ng-container>\n </ng-template>\n <button type=\"button\" *ngIf=\"showTableMenuButton\" mat-icon-button class=\"o-table-menu-button\" [matMenuTriggerFor]=\"tableMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-table-menu #tableMenu [select-all-checkbox]=\"selectAllCheckbox\" [export-button]=\"exportButton\"\n [columns-visibility-button]=\"columnsVisibilityButton\" [show-configuration-option]=\"showConfigurationOption\"\n [show-filter-option]=\"showFilterOption\" [show-report-on-demand-option]=\"showReportOnDemandOption\"\n [show-charts-on-demand-option]=\"showChartsOnDemandOption\" [show-reset-width-option]=\"showResetWidthOption\" [show-group-by-option]=\"groupable\">\n <ng-content select=\"o-table-option\"></ng-content>\n </o-table-menu>\n </ng-container>\n </o-data-toolbar>\n\n <div #tableBody class=\"o-table-body o-scroll\" [class.horizontal-scroll]=\"horizontalScroll\" [class.scrolled]=\"horizontalScrolled\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n <ng-container *ngIf=\"!enabledVirtualScroll; else tableWithVirtualScroll\">\n <div class=\"o-table-overflow o-scroll\">\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </div>\n </ng-container>\n <ng-template #tableWithVirtualScroll>\n <cdk-virtual-scroll-viewport #virtualScrollViewPort fxFlex>\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n </div>\n <!--TABLE PAGINATOR-->\n <mat-paginator *ngIf=\"paginator\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageIndex]=\"paginator.pageIndex\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"paginator.pageSizeOptions\" (page)=\"onChangePage($event)\" [showFirstLastButtons]=\"paginator.showFirstLastButtons\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n </mat-paginator>\n\n <!--LOADING-->\n <div #spinnerContainer *ngIf=\"showLoading | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" [ngStyle]=\"{'top.px': toolBarHeight}\"\n class=\"spinner-container\" [class.spinner-container-scrollable]=\"loadingScroll | async\">\n <o-table-skeleton></o-table-skeleton>\n </div>\n\n <!-- Disable blocker -->\n <div *ngIf=\"!enabled\" class=\"o-table-disabled-blocker\"></div>\n</div>\n\n<ng-template #table>\n <table mat-table #table [class.autoadjusted]=\"autoAdjust\" [trackBy]=\"getTrackByFunction()\" [dataSource]=\"dataSource\" oMatSort\n [oMatSortColumns]=\"sortColArray\" [ngClass]=\"rowHeightObservable | async\" (cdkObserveContent)=\"projectContentChanged()\"\n oTableExpandedFooter [oTableExpandedFooterColspan]=\"visibleColArray.length\"\n [multiTemplateDataRows]=\"showExpandableRow()\" aria-describedby=\"ontimize-web table\">\n\n <!--Checkbox Column -->\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <ng-container *ngIf=\"!tableColumnSelectAllContentChild; else customHeaderSelectAllTemplate\">\n <th mat-header-cell *matHeaderCellDef>\n <div class=\"content\" *ngIf=\"isSelectionModeMultiple()\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-template #customHeaderSelectAllTemplate>\n <th mat-header-cell *matHeaderCellDef [class.resizable]=\"resizable\" class=\"mat-header-select-all-with-title o-center\"\n [style.width]=\"oTableOptions.selectColumn.width\" [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\"\n [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <div class=\"content\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"o-center\" [style.width]=\"oTableOptions.selectColumn.width\"\n [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\" [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-template>\n\n\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!--Expandable Column -->\n <ng-container [matColumnDef]=\"oTableOptions.expandableColumn.name\" *ngIf=\"isColumnExpandable()\">\n <th mat-header-cell *matHeaderCellDef>\n {{ oTableOptions.expandableColumn.title }}\n </th>\n <td mat-cell *matCellDef=\"let row;let rowIndex = dataIndex\">\n <mat-icon *ngIf=\"showExpandableIcon(row, rowIndex) | async\" (click)=\"toggleRowExpandable(row, $event)\"\n (keydown)=\"toggleRowExpandable(row, $event)\">\n <ng-container *ngIf=\"isExpanded(row)\">{{ tableRowExpandable.iconCollapse }}</ng-container>\n <ng-container *ngIf=\"!isExpanded(row)\">{{ tableRowExpandable.iconExpand }}</ng-container>\n </mat-icon>\n </td>\n </ng-container>\n\n <!-- Generic column definition -->\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name\">\n <!--Define header-cell-->\n\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"getTitleAlignClass(column)\" [class.resizable]=\"resizable\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\">\n\n <div class=\"content\">\n <o-table-header [column]=\"column\"></o-table-header>\n </div>\n </th>\n\n\n <!--Define mat-cell-->\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else cellTemplateMultiTemplateDataRows\">\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = index \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n </td>\n </ng-container>\n <ng-template #cellTemplateMultiTemplateDataRows>\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = dataIndex \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n\n </td>\n </ng-template>\n <!--Define mat-footer-cell-->\n <ng-container *ngIf=\"showTotals | async\">\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"column.className\">\n <div class=\"title\" *ngIf=\"column.aggregate && column.aggregate.title\">\n {{ column.aggregate.title | oTranslate }}\n </div>\n <ng-container *ngIf=\"!column.renderer || column.aggregate?.operator === 'count'; else rendererTemplate\">\n {{ dataSource.getAggregateData(column) }}\n </ng-container>\n <ng-template #rendererTemplate>\n <ng-template *ngIf=\"column.renderer && column.aggregate\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{cellvalue: dataSource.getAggregateData(column)}\">\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"hasExpandedRow\">\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row;let rowIndex= dataIndex\" [attr.colspan]=\"oTableOptions.visibleColumns.length\">\n <div [ngClass]=\"getExpandedRowContainerClass(rowIndex)\" [@detailExpand]=\"getStateExpand(row)\">\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <!--FOOTER-INSERTABLE-->\n <ng-container *ngIf=\"showLastInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name + getSuffixColumnInsertable()\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-footer-cell *matFooterCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name+ getSuffixColumnInsertable()\">\n\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field o-table-cell-editor-text o-table-cell-editor\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <ng-container *ngIf=\"showFirstInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"getColumnInsertable(oTableOptions.selectColumn.name)\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-header-cell *matHeaderCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"getColumnInsertable(column.name)\">\n\n <td mat-header-cell *matHeaderCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Definition column group header -->\n <ng-container *ngFor=\"let column of groupingHeadersRows; let i = index\" [matColumnDef]=\"column\">\n <td mat-cell *matCellDef=\"let group\" class=\"grouping-row\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column, rowValue:group, rowIndex:i}\" [ngClass]=\"getGroupHeaderCellAlignClass(column)\">\n <div *ngIf=\"i===0\" class=\"grouping-title-wrapper\" [ngStyle]=\"{'padding-left': 20*(group.level-1)+'px'}\">\n <mat-icon>{{ group.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n {{ group.title }}\n </div>\n <div class=\"grouping-aggregate\" *ngIf=\"group.hasActiveAggregate(visibleColArray[i])\">\n {{ group.getColumnActiveAggregateTitle(visibleColArray[i]) | oTranslate }} :\n <ng-container *ngIf=\"!getOColumnFromGroupHeaderColumn(column).renderer\">\n {{ group.getColumnAggregateValue(visibleColArray[i])}}\n </ng-container>\n <ng-container *ngIf=\"getOColumnFromGroupHeaderColumn(column).renderer\">\n <ng-template\n *ngTemplateOutlet=\"getOColumnFromGroupHeaderColumn(column).renderer?.templateref; context:{ cellvalue: group.getColumnAggregateValue(visibleColArray[i]) }\">\n </ng-template>\n </ng-container>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"position\">\n <td mat-cell *matCellDef=\"let row\"> {{row}} </td>\n </ng-container>\n\n <tr #tableHeader mat-header-row *matHeaderRowDef=\"oTableOptions.visibleColumns; sticky: fixedHeader\"></tr>\n\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else rowTemplateMultiTemplateDataRows\">\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = index\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-container>\n <ng-template #rowTemplateMultiTemplateDataRows>\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = dataIndex\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-template>\n\n <!-- Row Group header -->\n <tr mat-row *matRowDef=\"let row; columns: groupingHeadersRows; when:isGroup\" (click)=\"groupHeaderClick(row)\"\n [ngClass]=\"getClassNameGroupHeader(row)\">\n </tr>\n\n <!-- Expanded detail row-->\n <ng-container *ngIf=\"hasExpandedRow\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"o-table-row-expanded\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"showLastInsertableRow\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"></tr>\n </ng-container>\n <ng-container *ngIf=\"showFirstInsertableRow\">\n <tr mat-header-row *matHeaderRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"> </tr>\n </ng-container>\n <ng-container *ngIf=\"showTotals | async\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.visibleColumns; sticky: true\" class=\"o-table-aggregate\">\n </tr>\n </ng-container>\n </table>\n\n</ng-template>\n\n<ng-container *ngIf=\"!contextMenuContentChild && contextMenu\">\n <o-table-context-menu [insert]=\"insertButton\" [edit]=\"editionMode !== EDIT_MODE_NONE\" [view-detail]=\"detailMode !== DETAIL_MODE_NONE\"\n [refresh]=\"refreshButton\" [delete]=\"deleteButton\" [filter]=\"showFilterOption\" [group-by-row]=\"groupable\">\n </o-table-context-menu>\n</ng-container>\n\n<ng-template #cellRenderer let-row=\"row\" let-column=\"column\">\n <div class=\"content\">\n\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"column.renderer != null && (!column.editing || column.editing && !isRowSelected(row))\">\n <ng-template *ngTemplateOutlet=\"column.renderer?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"isRowSelected(row) && column.editing\">\n <ng-template *ngTemplateOutlet=\"column.editor?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"column.type === 'editButtonInRow' || column.type === 'detailButtonInRow'\">\n <div fxLayoutAlign=\"center center\" class=\"o-action-cell-renderer\" (click)=\"onDetailButtonClick(column, row, $event)\">\n <mat-icon>{{ getDetailButtonIcon(column) }}</mat-icon>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ row[column.name] }}</ng-container>\n </ng-container>\n\n </div>\n</ng-template>\n", styles: [".o-table{height:100%;max-height:100%;width:100%}.o-table.o-table-disabled{opacity:.4}.o-table .o-table-container{height:100%;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-content:stretch;min-width:100%;min-height:400px;position:relative;padding:0 .5%}.o-table .o-table-container .o-table-body{display:flex;flex:1 1 auto}.o-table .o-table-container .o-table-body .o-table-overflow{overflow-y:auto;overflow-x:hidden;min-width:100%}.o-table .o-table-container .o-table-body.horizontal-scroll .o-table-overflow{overflow-x:auto}.o-table .o-table-container .o-table-body thead .mat-mdc-header-row th:last-child .o-table-column-resizer{display:none}.o-table .o-table-container.block-events{pointer-events:none}.o-table .o-table-container .o-table-toolbar{height:40px}.o-table .o-table-container .o-table-toolbar>div{max-height:100%}.o-table .o-table-container .o-table-toolbar .buttons{margin:0 10px 0 4px}.o-table .o-table-container .o-table-body{max-width:100%;height:100%;overflow:hidden;position:relative}.o-table .o-table-container .o-table-body .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .o-table-container .o-table-body.horizontal-scroll{overflow-x:auto;padding-bottom:16px}.o-table .o-table-container .o-table-body.horizontal-scroll .mat-mdc-header-cell{width:150px}.o-table .o-table-container .o-table-body .o-table-no-results{cursor:default;text-align:center}.o-table .o-table-container .o-table-body .o-table-no-results td{text-align:center}.o-table .o-table-container .mat-mdc-table{table-layout:fixed;width:100%}.o-table .o-table-container .mat-mdc-table.autoadjusted{table-layout:auto}.o-table .o-table-container .mat-mdc-table td .content,.o-table .o-table-container .mat-mdc-table th .content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-header-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:24px;height:24px}.o-table .o-table-container .mat-mdc-table.large .column-filter-icon{margin-top:4px}.o-table .o-table-container .mat-mdc-table.large .mat-sort-header-arrow{margin-top:7px}.o-table .o-table-container .mat-mdc-table tr.mat-mdc-row.o-table-row-expanded{height:0}.o-table .o-table-container .mat-mdc-table tr.o-table-insertable td{height:1px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell{padding:0 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row{box-sizing:border-box;transition:background-color .2s;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell{padding:0 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row{padding-top:30px;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-title-wrapper,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-title-wrapper{position:absolute;width:100%;left:0;top:0;text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-aggregate,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-aggregate{font-weight:700;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-bottom:8px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.empty-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.empty-cell{min-height:16px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .action-cell-renderer,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .action-cell-renderer{cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-start,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-center,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-end,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell *,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell *{vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell),.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell){padding:6px 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline .content,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline .content{overflow:initial;white-space:normal;text-overflow:unset}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:32px;height:32px;margin:1px auto;overflow:hidden;border-radius:50%;position:relative;z-index:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar img,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:inherit;max-height:inherit}.o-table .o-table-container .mat-mdc-table .o-action-cell-renderer{display:inline-block;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell{overflow:hidden;position:relative;box-sizing:border-box;padding:0 12px;vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select.mat-header-select-all-with-title{padding-right:12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:first-of-type{padding-left:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:not(.o-column-image){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:has(.o-table-column-resizer){padding-right:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .o-table-header-indicator-numbered{font-size:8px;position:absolute;text-align:center;display:inline-block;width:18px;height:18px;line-height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;bottom:-10px;right:-9px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .column-filter-icon{cursor:pointer;font-size:18px;width:18px;height:18px;line-height:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{flex:1;display:block;place-content:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container{cursor:default;min-height:20px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start .mat-sort-header-button{text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center .mat-sort-header-button{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end .mat-sort-header-button{text-align:right}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select{box-sizing:content-box;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select:not(.mat-header-select-all-with-title),.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select:not(.mat-header-select-all-with-title){width:30px}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select .mat-checkbox-layout,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select .mat-checkbox-layout{text-overflow:ellipsis;overflow:hidden;display:inline}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-expandable,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-expandable{width:40px;box-sizing:content-box;padding:0 0 0 24px;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell .row-container-expanded{overflow:hidden;display:flex}.o-table .o-table-container .o-table-disabled-blocker{bottom:0;left:0;position:absolute;right:0;top:0;z-index:100}.o-table .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .spinner-container-scrollable{position:relative}.o-table.o-table-fixed{display:flex}.o-table.o-table-fixed .o-table-container{display:flex;flex-direction:column}.o-table.o-table-fixed .o-table-body{display:flex;flex:1}.o-table.o-table-fixed .o-table-body .o-table-overflow{flex:1;overflow-y:auto}.mat-mdc-tooltip.o-table-cell-tooltip{word-wrap:break-word;overflow:hidden;min-width:140px}\n"] }]
2868
2910
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i1.MatDialog }, { type: i0.ViewContainerRef }, { type: i0.ApplicationRef }, { type: i32.OFormComponent, decorators: [{
2869
2911
  type: Optional
2870
2912
  }, {
@@ -2930,4 +2972,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2930
2972
  type: ViewChildren,
2931
2973
  args: [MatTooltip]
2932
2974
  }] } });
2933
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9vLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL28tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBSUwsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBR04sUUFBUSxFQUNSLFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFFbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFN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O3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFLckQsa0JBQWtCO3NCQURqQixlQUFlO3VCQUFDLDJCQUEyQjtnQkFJNUMsZ0NBQWdDO3NCQUQvQixZQUFZO3VCQUFDLDhCQUE4QjtnQkFPNUMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFO2dCQStCakMsdUJBQXVCO3NCQUR0QixZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFNMUQsT0FBTztzQkFETixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IFNlbGVjdGlvbkNoYW5nZSwgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBEb21Qb3J0YWxPdXRsZXQsIFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIFZJUlRVQUxfU0NST0xMX1NUUkFURUdZIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdDaGVja2VkLFxuICBBZnRlclZpZXdJbml0LFxuICBBcHBsaWNhdGlvblJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgVmlld1JlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdE1lbnUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCb29sZWFuQ29udmVydGVyLCBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZVNlcnZpY2VQcm92aWRlciwgT250aW1pemVTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgU25hY2tCYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc25hY2tiYXIuc2VydmljZSc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10YWJsZS1jb21wb25lbnQtc3RhdGUuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQ29tcG9uZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10YWJsZS1jb21wb25lbnQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBPQ29sdW1uRGlzcGxheSwgT0ZpbHRlckRlZmluaXRpb24sIE9Hcm91cGVkQ29sdW1uVHlwZXMsIE9UYWJsZUdsb2JhbENvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi90eXBlcy9leHByZXNzaW9uLnR5cGUnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9RdWVyeURhdGFBcmdzIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktZGF0YS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXJGdW5jdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL3F1aWNrLWZpbHRlci1mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IFNRTE9yZGVyIH0gZnJvbSAnLi4vLi4vdHlwZXMvc3FsLW9yZGVyLnR5cGUnO1xuaW1wb3J0IHsgT0NvbHVtbkFnZ3JlZ2F0ZSB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLWFnZ3JlZ2F0ZS50eXBlJztcbmltcG9ydCB7IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IsIE9Db2x1bW5WYWx1ZUZpbHRlciB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLXZhbHVlLWZpbHRlci50eXBlJztcbmltcG9ydCB7IFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4tZGF0YS50eXBlJztcbmltcG9ydCB7IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtaW5pdGlhbGl6YXRpb24tb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9UYWJsZU1lbnVQZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtbWVudS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9UYWJsZVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9ic2VydmFibGVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbC9hc3luYyc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvblV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9maWx0ZXItZXhwcmVzc2lvbi51dGlscyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc1V0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgeyBTZXJ2aWNlVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3NlcnZpY2UudXRpbHMnO1xuaW1wb3J0IHsgU1FMVHlwZXMgfSBmcm9tICcuLi8uLi91dGlsL3NxbHR5cGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT0NvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi4vY29udGV4dG1lbnUvby1jb250ZXh0LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9vLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEFic3RyYWN0T1NlcnZpY2VDb21wb25lbnQgfSBmcm9tICcuLi9vLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbkNhbGN1bGF0ZWRDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi9jYWxjdWxhdGVkL28tdGFibGUtY29sdW1uLWNhbGN1bGF0ZWQuY29tcG9uZW50JztcbmltcG9ydCB7IE9CYXNlVGFibGVDZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyL28tYmFzZS10YWJsZS1jZWxsLXJlbmRlcmVyLmNsYXNzJztcbmltcG9ydCB7IE9Db2x1bW4gfSBmcm9tICcuL2NvbHVtbi9vLWNvbHVtbi5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi9vLXRhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCB7IE9UYWJsZUNvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2NvbnRleHRtZW51L28tdGFibGUtY29udGV4dC1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWZhdWx0T1RhYmxlT3B0aW9ucyB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kZWZhdWx0LW8tdGFibGUtb3B0aW9ucy5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPQmFzZVRhYmxlUGFnaW5hdG9yIH0gZnJvbSAnLi9leHRlbnNpb25zL2Zvb3Rlci9wYWdpbmF0b3Ivby1iYXNlLXRhYmxlLXBhZ2luYXRvci5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWJ1dHRvbi9vLXRhYmxlLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uU2VsZWN0QWxsRGlyZWN0aXZlIH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW4tc2VsZWN0LWFsbC9vLXRhYmxlLWNvbHVtbi1zZWxlY3QtYWxsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPRmlsdGVyQ29sdW1uIH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9jb2x1bW5zL28tdGFibGUtY29sdW1ucy1maWx0ZXItY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9vLXRhYmxlLWNvbHVtbnMtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5zR3JvdXBpbmdDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWNvbHVtbnMtZ3JvdXBpbmcvY29sdW1ucy9vLXRhYmxlLWNvbHVtbnMtZ3JvdXBpbmctY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWhlYWRlci9vLXRhYmxlLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtaW5zZXJ0YWJsZS1yb3cvby10YWJsZS1pbnNlcnRhYmxlLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlT3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1vcHRpb24vby10YWJsZS1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUtZGF0YXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9UYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9vLXRhYmxlLXN0cmF0ZWd5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RhYmxlRGFvIH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUuZGFvJztcbmltcG9ydCB7IE9UYWJsZUdyb3VwZWRSb3cgfSBmcm9tICcuL2V4dGVuc2lvbnMvcm93L28tdGFibGUtcm93LWdyb3VwLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZVJvd0V4cGFuZGFibGVDb21wb25lbnQsIE9UYWJsZVJvd0V4cGFuZGVkQ2hhbmdlIH0gZnJvbSAnLi9leHRlbnNpb25zL3Jvdy90YWJsZS1yb3ctZXhwYW5kYWJsZS9vLXRhYmxlLXJvdy1leHBhbmRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPTWF0U29ydCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9zb3J0L28tbWF0LXNvcnQnO1xuaW1wb3J0IHsgT1RhYmxlQmFzZSB9IGZyb20gJy4vby10YWJsZS1iYXNlLmNsYXNzJztcbmltcG9ydCB7IE9fVEFCTEVfR0xPQkFMX0NPTkZJRyB9IGZyb20gJy4vdXRpbHMvby10YWJsZS50b2tlbnMnO1xuXG5pbXBvcnQgdHlwZSB7IElPQ29udGV4dE1lbnVDb250ZXh0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLWNvbnRleHQtbWVudS5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVCdXR0b24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtYnV0dG9uLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZUJ1dHRvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtYnV0dG9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVDb2x1bW5zR3JvdXBpbmcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtY29sdW1ucy1ncm91cGluZy1pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWRhdGFzb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlTWVudSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1tZW51LmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVQYWdpbmF0b3IgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtcGFnaW5hdG9yLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZVF1aWNrZmlsdGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLXF1aWNrZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2VydmljZS1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT1F1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktcGFyYW1zLnR5cGUnO1xuaW1wb3J0IHsgT19DT01QT05FTlRfU1RBVEVfU0VSVklDRSB9IGZyb20gJy4uLy4uL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHsgTWF0Um93LCBNYXRUYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE9UYWJsZUZpbHRlckJ5Q29sdW1uU2VydmljZSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kaWFsb2cvZmlsdGVyLWJ5LWNvbHVtbi9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4uc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX1RBQkxFID0gW1xuICAvLyB2aXNpYmxlLWNvbHVtbnMgW3N0cmluZ106IHZpc2libGUgY29sdW1ucywgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICd2aXNpYmxlQ29sdW1uczogdmlzaWJsZS1jb2x1bW5zJyxcblxuICAvLyB2aXNpYmxlLWNvbHVtbnMtYnktZGVmYXVsdCBbc3RyaW5nXTogY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlIGJ5IGRlZmF1bHQsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAnZGVmYXVsdFZpc2libGVDb2x1bW5zOiBkZWZhdWx0LXZpc2libGUtY29sdW1ucycsXG5cbiAgLy8gZWRpdGFibGUtY29sdW1ucyBbc3RyaW5nXTogY29sdW1ucyB0aGF0IGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgb3ZlciB0aGUgdGFibGUsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAvLyAnZWRpdGFibGVDb2x1bW5zOiBlZGl0YWJsZS1jb2x1bW5zJyxcblxuICAvLyBzb3J0LWNvbHVtbnMgW3N0cmluZ106IGluaXRpYWwgc29ydGluZywgd2l0aCB0aGUgZm9ybWF0IGNvbHVtbjpbQVNDfERFU0NdLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NvcnRDb2x1bW5zOiBzb3J0LWNvbHVtbnMnLFxuXG4gICdxdWlja0ZpbHRlckNhbGxiYWNrOiBxdWljay1maWx0ZXItZnVuY3Rpb24nLFxuXG4gIC8vIGRlbGV0ZS1idXR0b24gW25vfHllc106IHNob3cgZGVsZXRlIGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnZGVsZXRlQnV0dG9uOiBkZWxldGUtYnV0dG9uJyxcblxuICAvLyByZWZyZXNoLWJ1dHRvbiBbbm98eWVzXTogc2hvdyByZWZyZXNoIGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAncmVmcmVzaEJ1dHRvbjogcmVmcmVzaC1idXR0b24nLFxuXG4gIC8vIGNvbHVtbnMtdmlzaWJpbGl0eS1idXR0b24gW25vfHllc106IHNob3cgY29sdW1ucyB2aXNpYmlsaXR5IGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnY29sdW1uc1Zpc2liaWxpdHlCdXR0b246IGNvbHVtbnMtdmlzaWJpbGl0eS1idXR0b24nLFxuXG4gIC8vIC8vIGNvbHVtbnMtcmVzaXplLWJ1dHRvbiBbbm98eWVzXTogc2hvdyBjb2x1bW5zIHJlc2l6ZSBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgLy8gJ2NvbHVtbnNSZXNpemVCdXR0b246IGNvbHVtbnMtcmVzaXplLWJ1dHRvbicsXG5cbiAgLy8gLy8gY29sdW1ucy1ncm91cC1idXR0b24gW25vfHllc106IHNob3cgY29sdW1ucyBncm91cCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgLy8gJ2NvbHVtbnNHcm91cEJ1dHRvbjogY29sdW1ucy1ncm91cC1idXR0b24nLFxuXG4gIC8vIGV4cG9ydC1idXR0b24gW25vfHllc106IHNob3cgZXhwb3J0IGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnZXhwb3J0QnV0dG9uOiBleHBvcnQtYnV0dG9uJyxcblxuICAvLyBzaG93LWNvbmZpZ3VyYXRpb24tb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgY29uZmlndXJhdGlvbiBidXR0b24gaW4gaGVhZGVyLiBEZWZhdWx0OiB5ZXMuXG4gICdzaG93Q29uZmlndXJhdGlvbk9wdGlvbjogc2hvdy1jb25maWd1cmF0aW9uLW9wdGlvbicsXG5cbiAgLy8gc2hvdy1idXR0b25zLXRleHQgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyB0ZXh0IG9mIGhlYWRlciBidXR0b25zLiBEZWZhdWx0OiB5ZXMuXG4gICdzaG93QnV0dG9uc1RleHQ6IHNob3ctYnV0dG9ucy10ZXh0JyxcblxuICAvLyBzZWxlY3QtYWxsLWNoZWNrYm94IFt5ZXN8bm98dHJ1ZXxmYWxzZV06ICBzaG93IGluIHRoZSBtZW51IHRoZSBvcHRpb24gb2Ygc2VsZWN0aW9uIGNoZWNrIGJveGVzIC4gRGVmYXVsdDogbm8uXG4gICdzZWxlY3RBbGxDaGVja2JveDogc2VsZWN0LWFsbC1jaGVja2JveCcsXG5cbiAgLy8gcGFnaW5hdGlvbi1jb250cm9scyBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHBhZ2luYXRpb24gY29udHJvbHMuIERlZmF1bHQ6IHllcy5cbiAgJ3BhZ2luYXRpb25Db250cm9sczogcGFnaW5hdGlvbi1jb250cm9scycsXG5cbiAgLy8gZml4LWhlYWRlciBbeWVzfG5vfHRydWV8ZmFsc2VdOiBmaXhlZCBoZWFkZXIgYW5kIGZvb3RlciB3aGVuIHRoZSBjb250ZW50IGlzIGdyZWF0aGVyIHRoYW4gaXRzIG93biBoZWlnaHQuIERlZmF1bHQ6IHllcy5cbiAgJ2ZpeGVkSGVhZGVyOiBmaXhlZC1oZWFkZXInLFxuXG4gIC8vIHNob3ctdGl0bGUgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyB0aGUgdGFibGUgdGl0bGUuIERlZmF1bHQ6IG5vLlxuICAnc2hvd1RpdGxlOiBzaG93LXRpdGxlJyxcblxuICAvLyBlZGl0aW9uLW1vZGUgW25vbmUgfCBpbmxpbmUgfCBjbGljayB8IGRibGNsaWNrXTogZWRpdGlvbiBtb2RlLiBEZWZhdWx0IG5vbmVcbiAgJ2VkaXRpb25Nb2RlOiBlZGl0aW9uLW1vZGUnLFxuXG4gIC8vIHNlbGVjdGlvbi1tb2RlIFtub25lIHwgc2ltcGxlIHwgbXVsdGlwbGUgXTogc2VsZWN0aW9uIG1vZGUuIERlZmF1bHQgbXVsdGlwbGVcbiAgJ3NlbGVjdGlvbk1vZGU6IHNlbGVjdGlvbi1tb2RlJyxcblxuICAnaG9yaXpvbnRhbFNjcm9sbDogaG9yaXpvbnRhbC1zY3JvbGwnLFxuXG4gICdzaG93UGFnaW5hdG9yRmlyc3RMYXN0QnV0dG9uczogc2hvdy1wYWdpbmF0b3ItZmlyc3QtbGFzdC1idXR0b25zJyxcblxuICAnYXV0b0FsaWduVGl0bGVzOiBhdXRvLWFsaWduLXRpdGxlcycsXG5cbiAgJ211bHRpcGxlU29ydDogbXVsdGlwbGUtc29ydCcsXG4gIC8vIHNlbGVjdC1hbGwtY2hlY2tib3gtdmlzaWJsZSBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHNlbGVjdGlvbiBjaGVjayBib3hlcy5EZWZhdWx0OiBuby5cbiAgJ3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZTogc2VsZWN0LWFsbC1jaGVja2JveC12aXNpYmxlJyxcblxuICAnb3JkZXJhYmxlJyxcblxuICAncmVzaXphYmxlJyxcblxuICAna2VlcFNlbGVjdGVkSXRlbXM6IGtlZXAtc2VsZWN0ZWQtaXRlbXMnLFxuXG4gIC8vIGV4cG9ydC1tb2RlIFsndmlzaWJsZSd8J2xvY2FsJ3wnYWxsJ106IHNldHMgdGhlIG1vZGUgdG8gZXhwb3J0IGRhdGEuIERlZmF1bHQ6ICd2aXNpYmxlJ1xuICAnZXhwb3J0TW9kZTogZXhwb3J0LW1vZGUnLFxuXG4gIC8vIGV4cG9ydFNlcnZpY2VUeXBlIFsgc3RyaW5nIF06IFRoZSBzZXJ2aWNlIHVzZWQgYnkgdGhlIHRhYmxlIGZvciBleHBvcnRpbmcgaXQncyBkYXRhLCBpdCBtdXN0IGltcGxlbWVudCAnSUV4cG9ydFNlcnZpY2UnIGludGVyZmFjZS4gRGVmYXVsdDogJ09udGltaXplRXhwb3J0U2VydmljZSdcbiAgJ2V4cG9ydFNlcnZpY2VUeXBlOiBleHBvcnQtc2VydmljZS10eXBlJyxcblxuICAvLyBhdXRvLWFkanVzdCBbdHJ1ZXxmYWxzZV06IEF1dG8gYWRqdXN0IGNvbHVtbiB3aWR0aCB0byBmaXQgaXRzIGNvbnRlbnQuIERlZmF1bHQ6IHRydWVcbiAgJ2F1dG9BZGp1c3Q6IGF1dG8tYWRqdXN0JyxcblxuICAvLyBzaG93LWZpbHRlci1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBmaWx0ZXIgbWVudSBvcHRpb24gaW4gdGhlIGhlYWRlciBtZW51LiBEZWZhdWx0OiB5ZXMuXG4gICdzaG93RmlsdGVyT3B0aW9uOiBzaG93LWZpbHRlci1vcHRpb24nLFxuXG4gIC8vIHZpc2libGUtZXhwb3J0LWRpYWxvZy1idXR0b25zIFtzdHJpbmddOiB2aXNpYmxlIGJ1dHRvbnMgaW4gZXhwb3J0IGRpYWxvZywgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdC9ubyBjb25maWd1cmVkOiBzaG93IGFsbC4gRW1wdHkgdmFsdWU6IGhpZGUgYWxsLlxuICAndmlzaWJsZUV4cG9ydERpYWxvZ0J1dHRvbnM6IHZpc2libGUtZXhwb3J0LWRpYWxvZy1idXR0b25zJyxcblxuICAvLyByb3ctY2xhc3MgW2Z1bmN0aW9uLCAocm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXV06IGFkZHMgdGhlIGNsYXNzIG9yIGNsYXNzZXMgcmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHRvIHRoZSB0YWJsZSByb3dzLlxuICAncm93Q2xhc3M6IHJvdy1jbGFzcycsXG5cbiAgLy8gZmlsdGVyLWNvbHVtbi1hY3RpdmUtYnktZGVmYXVsdCBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IGljb24gZmlsdGVyIGJ5IGRlZmF1bHQgaW4gdGhlIHRhYmxlLiBEZWZhdWx0Onllc1xuICAnZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0OmZpbHRlci1jb2x1bW4tYWN0aXZlLWJ5LWRlZmF1bHQnLFxuXG4gIC8vIGdyb3VwZWQtY29sdW1ucyBbc3RyaW5nXTogZ3JvdXBlZCBjb2x1bW5zIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAnZ3JvdXBlZENvbHVtbnM6IGdyb3VwZWQtY29sdW1ucycsXG5cbiAgLy8gZ3JvdXBhYmxlW2Jvb2xlYW5dOiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgZ3JvdXBhYmxlLiBCeSBkZWZhdWx0OiB0cnVlXG4gICdncm91cGFibGUnLFxuXG4gIC8vIGV4cGFuZC1ncm91cHMtc2FtZS1sZXZlbFtib29sZWFuXTogSW5kaWNhdGVzIGlmIGNsaWNrIGluIHJvdyBleHBhbmRzL2NvbGxhcHNlcyBhbGwgcm93cyBvbiBzYW1lIGxldmVsLiBCeSBkZWZhdWx0OiB0cnVlXG4gICdleHBhbmRHcm91cHNTYW1lTGV2ZWw6IGV4cGFuZC1ncm91cHMtc2FtZS1sZXZlbCcsXG5cbiAgLy8gY29sbGFwc2UtZ3JvdXBlZC1jb2x1bW5zIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IFdoZXRoZXIgY29sbGFwc2UgdGhlIGdyb3VwZWQgY29sdW1ucyBieSBkZWZhdWx0XG4gICdjb2xsYXBzZUdyb3VwZWRDb2x1bW5zOiBjb2xsYXBzZS1ncm91cGVkLWNvbHVtbnMnLFxuXG4gIC8vIHZpcnR1YWwtc2Nyb2xsIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IFdoZXRoZXIgZW5hYmxlZCBvciBub3QgdGhlIHZpcnR1YWwgc2Nyb2xsXG4gICd2aXJ0dWFsU2Nyb2xsOiB2aXJ0dWFsLXNjcm9sbCcsXG5cbiAgLy9jb250ZXh0LW1lbnUgW3llc3xub3x0cnVlfGZhbHNlXTogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIHRhYmxlIGNvbnRleHQgbWVudVxuICAnY29udGV4dE1lbnU6IGNvbnRleHQtbWVudScsXG5cbiAgLy8gc2hvdy1leHBhbmRhYmxlLWljb24tZnVuY3Rpb24gW2Z1bmN0aW9uXTogRXhwYW5kYWJsZSBmdW5jdGlvbiB0byBjaGVjayBpZiBleHBhbmRhYmxlIGhhcyBkYXRhIHRvIHNob3cgb3Igbm90IGljb25cbiAgJ3Nob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uOiBzaG93LWV4cGFuZGFibGUtaWNvbi1mdW5jdGlvbicsXG5cbiAgLy8gc2hvdy1yZXBvcnQtb24tZGVtYW5kLW9wdGlvbiBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHJlcG9ydCBvbiBkZW1hbmQgb3B0aW9uIGluIHRoZSB0YWJsZSBtZW51LiBEZWZhdWx0OiB5ZXMuXG4gICdzaG93UmVwb3J0T25EZW1hbmRPcHRpb246IHNob3ctcmVwb3J0LW9uLWRlbWFuZC1vcHRpb24nLFxuXG4gIC8vIHNob3ctY2hhcnRzLW9uLWRlbWFuZC1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBjaGFydHMgb24gZGVtYW5kIG9wdGlvbiBpbiB0aGUgaGVhZGVyIG1lbnVcbiAgJ3Nob3dDaGFydHNPbkRlbWFuZE9wdGlvbjogc2hvdy1jaGFydHMtb24tZGVtYW5kLW9wdGlvbicsXG5cbiAgLy8gc2hvdy1yZXNldC13aWR0aC1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyByZXNldCB3aWR0aCBtZW51IG9wdGlvbiBpbiB0aGUgaGVhZGVyIG1lbnVcbiAgJ3Nob3dSZXNldFdpZHRoT3B0aW9uOiBzaG93LXJlc2V0LXdpZHRoLW9wdGlvbicsXG5cbiAgJ2Rpc2FibGVTZWxlY3Rpb25GdW5jdGlvbjogZGlzYWJsZS1zZWxlY3Rpb24tZnVuY3Rpb24nLFxuXG4gICdub25IaWRhYmxlQ29sdW1uczogbm9uLWhpZGFibGUtY29sdW1ucycsXG4gICdyZWFkT25seTogcmVhZC1vbmx5JyxcbiAgJ3JlYWRPbmx5Q29uZmlndXJhdGlvbjogcmVhZC1vbmx5LWNvbmZpZ3VyYXRpb24nLFxuICAnc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHk6IHNob3ctbm90aWZpY2F0aW9uLW9mLXJlYWQtb25seSdcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19UQUJMRSA9IFtcbiAgJ29uUm93U2VsZWN0ZWQnLFxuICAnb25Sb3dEZXNlbGVjdGVkJyxcbiAgJ29uUm93RGVsZXRlZCdcbl07XG5cbmNvbnN0IHN0aWNreUhlYWRlclNlbGVjdG9yID0gJy5tYXQtbWRjLWhlYWRlci1yb3cgLm1hdC1tZGMtdGFibGUtc3RpY2t5JztcbmNvbnN0IHN0aWNreUZvb3RlclNlbGVjdG9yID0gJy5tYXQtbWRjLWZvb3Rlci1yb3cgLm1hdC1tZGMtdGFibGUtc3RpY2t5JztcbmNvbnN0IHJvd1NlbGVjdG9yID0gJy5tYXQtbWRjLXJvdyc7XG5jb25zdCBoZWFkZXJTZWxlY3RvciA9ICcubWF0LW1kYy1oZWFkZXItcm93JztcbmNvbnN0IGZvb3RlclNlbGVjdG9yID0gJy5tYXQtbWRjLWhlYWRlci1yb3cnO1xuXG50eXBlIERpc2FibGVTZWxlY3Rpb25GdW5jdGlvbiA9IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vby10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgT250aW1pemVTZXJ2aWNlUHJvdmlkZXIsXG4gICAgQ29tcG9uZW50U3RhdGVTZXJ2aWNlUHJvdmlkZXIsXG4gICAgT1RhYmxlRGF0YVNvdXJjZVNlcnZpY2UsXG4gICAgT1RhYmxlRmlsdGVyQnlDb2x1bW5TZXJ2aWNlLFxuICAgIHsgcHJvdmlkZTogT19DT01QT05FTlRfU1RBVEVfU0VSVklDRSwgdXNlQ2xhc3M6IE9UYWJsZUNvbXBvbmVudFN0YXRlU2VydmljZSB9LFxuICAgIHsgcHJvdmlkZTogVklSVFVBTF9TQ1JPTExfU1RSQVRFR1ksIHVzZUNsYXNzOiBPVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgfSxcbiAgICB7IHByb3ZpZGU6IE9UYWJsZUJhc2UsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9UYWJsZUNvbXBvbmVudCkgfVxuICBdLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xuICAgICAgc3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pXG4gIF0sXG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19UQUJMRSxcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fVEFCTEUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5vLXRhYmxlXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLm9udGltaXplLXRhYmxlXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLm8tdGFibGUtZml4ZWRdJzogJ2ZpeGVkSGVhZGVyJyxcbiAgICAnW2NsYXNzLm8tdGFibGUtZGlzYWJsZWRdJzogJyFlbmFibGVkJyxcbiAgICAnKGRvY3VtZW50OmNsaWNrKSc6ICdoYW5kbGVET01DbGljaygkZXZlbnQpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9UYWJsZUNvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0T1NlcnZpY2VDb21wb25lbnQ8T1RhYmxlQ29tcG9uZW50U3RhdGVTZXJ2aWNlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkLCBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0JBU0VfU0laRV9TUElOTkVSID0gMTAwO1xuICBwdWJsaWMgc3RhdGljIEZJUlNUX0xBU1RfQ0VMTF9QQURESU5HID0gMjQ7XG4gIHB1YmxpYyBzdGF0aWMgRVhQQU5ERURfUk9XX0NPTlRBSU5FUl9DTEFTUyA9ICdleHBhbmRlZC1yb3ctY29udGFpbmVyLSc7XG4gIHB1YmxpYyBzdGF0aWMgQVZBSUxBQkxFX0dST1VQSU5HX0NPTFVNTlNfUkVOREVSRVJTID0gWydjdXJyZW5jeScsICdpbnRlZ2VyJywgJ3JlYWwnXTtcblxuICBwdWJsaWMgREVUQUlMX01PREVfTk9ORSA9IENvZGVzLkRFVEFJTF9NT0RFX05PTkU7XG4gIHB1YmxpYyBFRElUX01PREVfTk9ORSA9IENvZGVzLkVESVRJT05fTU9ERV9OT05FO1xuXG4gIHByb3RlY3RlZCBzbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZTtcblxuICBwdWJsaWMgcGFnaW5hdG9yOiBPVGFibGVQYWdpbmF0b3I7XG5cbiAgc29ydDogT01hdFNvcnQ7XG4gIGNsaWNrU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgcm93OiBhbnksIGNvbHVtbjogYW55LCBjZWxsUmVmOiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGV2ZW50OiBNb3VzZUV2ZW50IH0+KCk7XG4gIGRibGNsaWNrU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgcm93OiBhbnksIGNvbHVtbjogYW55LCBjZWxsUmVmOiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGV2ZW50OiBNb3VzZUV2ZW50IH0+KCk7XG4gIHByb3RlY3RlZCBjbGlja1N1YmplY3RTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCByb3dDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcmVmcmVzaEV4cGFuZGFibGVSb3dTdGF0ZSA9IGZhbHNlO1xuXG5cbiAgQFZpZXdDaGlsZChPTWF0U29ydClcbiAgc2V0IG9NYXRTb3J0KF9zb3J0OiBPTWF0U29ydCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChfc29ydCkgJiZcbiAgICAgICghVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSB8fCAoVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSAmJiBVdGlsLnN0cmluZ2lmeSh0aGlzLnNvcnQpICE9PSBVdGlsLnN0cmluZ2lmeShfc29ydCkpKSkge1xuICAgICAgdGhpcy5zb3J0ID0gX3NvcnQ7XG4gICAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHZpcnR1YWxTY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gIHB1YmxpYyBvVGFibGVHbG9iYWxDb25maWc6IE9UYWJsZUdsb2JhbENvbmZpZztcbiAgQFZpZXdDaGlsZCgndmlydHVhbFNjcm9sbFZpZXdQb3J0Jykgc2V0IGNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCh2YWx1ZTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgaWYgKHZhbHVlICE9IHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJBbmRGb290ZXJTdGlja3lQb3NpdGlvbnMoKTtcbiAgICAgIGlmICh0aGlzLmNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24gPSB0aGlzLmNoZWNrVmlld1BvcnRTdWJqZWN0LnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gb25seSBmb3IgaW5zaWRlVGFiQnVnV29ya2Fyb3VuZFxuICBwcm90ZWN0ZWQgdGFibGVIZWFkZXJzOiBBcnJheTxPVGFibGVIZWFkZXJDb21wb25lbnQ+ID0gW107XG5cbiAgQFZpZXdDaGlsZCgnc3Bpbm5lckNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBzcGlubmVyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoT1RhYmxlUm93RXhwYW5kYWJsZUNvbXBvbmVudClcbiAgdGFibGVSb3dFeHBhbmRhYmxlOiBPVGFibGVSb3dFeHBhbmRhYmxlQ29tcG9uZW50O1xuXG4gIF9maWx0ZXJDb2x1bW5zOiBBcnJheTxPRmlsdGVyQ29sdW1uPjtcbiAgcG9ydGFsSG9zdDogQXJyYXk8RG9tUG9ydGFsT3V0bGV0PiA9IFtdO1xuICBvbkRhdGFMb2FkZWRDZWxsUmVuZGVyZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgdGFibGVDb250ZXh0TWVudTogT0NvbnRleHRNZW51Q29tcG9uZW50O1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZWxlY3RBbGxDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZXhwb3J0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDb25maWd1cmF0aW9uT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dGaWx0ZXJPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDaGFydHNPbkRlbWFuZE9wdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93QnV0dG9uc1RleHQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dSZXNldFdpZHRoT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEV4cGFuZGFibGUgaW5wdXQgY2FsbGJhY2sgZnVuY3Rpb25cbiAgc2hvd0V4cGFuZGFibGVJY29uRnVuY3Rpb246IChyb3c6IGFueSwgcm93SW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIHJlYWRPbmx5RnVuY3Rpb246IChjb25maWd1cmF0aW9uOiBhbnkpID0+IGJvb2xlYW47XG4gIHJlYWRPbmx5Q29uZmlndXJhdGlvbjogYW55O1xuXG4gIGlzQ29tcG9uZW50UmVhZE9ubHkoc2VsZWN0b3I6IHN0cmluZywgYXR0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHlDb25maWd1cmF0aW9uPy5bc2VsZWN0b3JdPy5bYXR0cl07XG4gIH1cbiAgcHJvdGVjdGVkIF9vVGFibGVPcHRpb25zOiBPVGFibGVPcHRpb25zO1xuXG4gIGdldCBvVGFibGVPcHRpb25zKCk6IE9UYWJsZU9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLl9vVGFibGVPcHRpb25zO1xuICB9XG5cbiAgc2V0IG9UYWJsZU9wdGlvbnModmFsdWU6IE9UYWJsZU9wdGlvbnMpIHtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zID0gdmFsdWU7XG4gIH1cblxuICBzZXQgcXVpY2tGaWx0ZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB2YWx1ZSA9IFV0aWwucGFyc2VCb29sZWFuKFN0cmluZyh2YWx1ZSkpO1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyID0gdmFsdWU7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXIgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBxdWlja0ZpbHRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcXVpY2tGaWx0ZXI7XG4gIH1cblxuICBzZXQgZmlsdGVyQ2FzZVNlbnNpdGl2ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2ZpbHRlckNhc2VTZW5zaXRpdmUgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucykge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXJDYXNlU2Vuc2l0aXZlID0gdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmlsdGVyQ2FzZVNlbnNpdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgfVxuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBpbnNlcnRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcmVmcmVzaEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBkZWxldGVCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZml4ZWRIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1RpdGxlOiBib29sZWFuID0gZmFsc2U7XG4gIGVkaXRpb25Nb2RlOiBzdHJpbmcgPSBDb2Rlcy5FRElUSU9OX01PREVfTk9ORTtcbiAgc2VsZWN0aW9uTW9kZTogc3RyaW5nID0gQ29kZXMuU0VMRUNUSU9OX01PREVfTVVMVElQTEU7XG5cbiAgcHJvdGVjdGVkIF9ob3Jpem9udGFsU2Nyb2xsID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZXQgaG9yaXpvbnRhbFNjcm9sbCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hvcml6b250YWxTY3JvbGwgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tT3JpZ2luYWxEZWZpbml0aW9uKCk7XG4gIH1cblxuICBnZXQgaG9yaXpvbnRhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faG9yaXpvbnRhbFNjcm9sbDtcbiAgfVxuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93UGFnaW5hdG9yRmlyc3RMYXN0QnV0dG9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBhdXRvQWxpZ25UaXRsZXM6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgbXVsdGlwbGVTb3J0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIG9yZGVyYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICByZXNpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgYXV0b0FkanVzdDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBncm91cGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZXhwYW5kR3JvdXBzU2FtZUxldmVsOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbGxhcHNlR3JvdXBlZENvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHZpcnR1YWxTY3JvbGw6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgY29udGV4dE1lbnU6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBNYWludGFpbmluZyB0aGlzIGdldHRlciB0byBhbGxvdyBjb21wb25lbnQgZXh0ZW5zaW9ucyAoYXZvaWRpbmcgYSBicmVha2luZyBjaGFuZ2UpXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9lbmFibGVkO1xuICB9XG4gIHByb3RlY3RlZCBfc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlOiBib29sZWFuO1xuICBzZXQgc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID0gQm9vbGVhbkNvbnZlcnRlcih2YWx1ZSk7XG4gICAgaWYgKHRoaXMuc3RhdGUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZSA9IEJvb2xlYW5Db252ZXJ0ZXIodGhpcy5zdGF0ZS5zZWxlY3RDb2x1bW5WaXNpYmxlKTtcbiAgICB9XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9IHRoaXMuX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZTtcbiAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlO1xuICB9XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGtlZXBTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgZXhwb3J0TW9kZTogc3RyaW5nID0gQ29kZXMuRVhQT1JUX01PREVfVklTSUJMRTtcbiAgcHVibGljIGV4cG9ydFNlcnZpY2VUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyB2aXNpYmxlRXhwb3J0RGlhbG9nQnV0dG9uczogc3RyaW5nO1xuICBwdWJsaWMgZGFvVGFibGU6IE9UYWJsZURhbyB8IG51bGw7XG4gIHB1YmxpYyBkYXRhU291cmNlOiBPVGFibGVEYXRhU291cmNlIHwgbnVsbDtcbiAgcHVibGljIHZpc2libGVDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBzZWFyY2hlYWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBkZWZhdWx0VmlzaWJsZUNvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIGdyb3VwZWRDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBub25IaWRhYmxlQ29sdW1uczogc3RyaW5nO1xuXG4gIHB1YmxpYyBzb3J0Q29sdW1uczogc3RyaW5nO1xuICBwdWJsaWMgZ3JvdXBlZENvbHVtblR5cGVzOiBPR3JvdXBlZENvbHVtblR5cGVzW10gPSBbXTtcbiAgcHVibGljIHJvd0NsYXNzOiAocm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKnBhcnNlZCBpbnB1dHMgdmFyaWFibGVzICovXG4gIHByb3RlY3RlZCBfdmlzaWJsZUNvbEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuXG4gIGdldCB2aXNpYmxlQ29sQXJyYXkoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sQXJyYXk7XG4gIH1cblxuICBzZXQgdmlzaWJsZUNvbEFycmF5KGFyZzogYW55W10pIHtcbiAgICBjb25zdCBwZXJtaXNzaW9uc0Jsb2NrZWQgPSB0aGlzLnBlcm1pc3Npb25zPy5jb2x1bW5zPy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlID09PSBmYWxzZSkubWFwKGNvbCA9PiBjb2wuYXR0cikgPz8gW107XG4gICAgY29uc3QgcGVybWlzc2lvbnNDaGVja2VkID0gYXJnLmZpbHRlcih2YWx1ZSA9PiBwZXJtaXNzaW9uc0Jsb2NrZWQuaW5kZXhPZih2YWx1ZSkgPT09IC0xKTtcblxuICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheSA9IHBlcm1pc3Npb25zQ2hlY2tlZDtcbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucykge1xuICAgICAgY29uc3QgY29udGFpbnNTZWxlY3Rpb25Db2wgPSB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmluZGV4T2YoQ29kZXMuTkFNRV9DT0xVTU5fU0VMRUNUKSAhPT0gLTE7XG4gICAgICBjb25zdCBjb250YWluc0V4cGFuZGFibGVDb2wgPSB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmluZGV4T2YoQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSkgIT09IC0xO1xuICAgICAgaWYgKGNvbnRhaW5zU2VsZWN0aW9uQ29sKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheS51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgICB9XG4gICAgICBpZiAoY29udGFpbnNTZWxlY3Rpb25Db2wgJiYgY29udGFpbnNFeHBhbmRhYmxlQ29sKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheSA9IFt0aGlzLl92aXNpYmxlQ29sQXJyYXlbMF1dLmNvbmNhdChDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFLCB0aGlzLl92aXNpYmxlQ29sQXJyYXkuc3BsaWNlKDEpKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRhaW5zRXhwYW5kYWJsZUNvbCkge1xuICAgICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheS51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zID0gdGhpcy5fdmlzaWJsZUNvbEFycmF5O1xuICAgICAgdGhpcy5ncm91cGluZ0hlYWRlcnNSb3dzID0gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5tYXAodmlzaWJsZUNvbCA9PiAnZ3JvdXBIZWFkZXItJyArIHZpc2libGVDb2wpO1xuICAgIH1cbiAgfVxuXG4gIHNvcnRDb2xBcnJheTogU1FMT3JkZXJbXSA9IFtdO1xuICAvKmVuZCBvZiBwYXJzZWQgaW5wdXRzIHZhcmlhYmxlcyAqL1xuXG4gIHByb3RlY3RlZCB0YWJHcm91cENvbnRhaW5lcjogTWF0VGFiR3JvdXA7XG4gIHByb3RlY3RlZCB0YWJDb250YWluZXI6IE1hdFRhYjtcbiAgdGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgcGVuZGluZ1F1ZXJ5OiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBwZW5kaW5nUXVlcnlGaWx0ZXIgPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIHNldFN0YXRpY0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGF2b2lkUXVlcnlDb2x1bW5zOiBBcnJheTxhbnk+ID0gW107XG4gIHByb3RlY3RlZCBhc3luY0xvYWRDb2x1bW5zOiBBcnJheTxhbnk+ID0gW107XG4gIHByb3RlY3RlZCBhc3luY0xvYWRTdWJzY3JpcHRpb25zOiBvYmplY3QgPSB7fTtcblxuICBwcm90ZWN0ZWQgcXVlcnlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGNvbnRleHRNZW51U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCB2aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBjaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgZmluaXNoUXVlcnlTdWJzY3JpcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgb25Sb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblJvd0Rlc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25Sb3dEZWxldGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uUmVpbml0aWFsaXplOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uQ29udGVudENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvbkZpbHRlckJ5Q29sdW1uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcm90ZWN0ZWQgc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHVibGljIG9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudDogT1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50O1xuICBwdWJsaWMgb1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDogT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dUb3RhbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBzaG93VG90YWxzOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zaG93VG90YWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU29ydGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdTb3J0aW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU29ydGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1Njcm9sbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGxvYWRpbmdTY3JvbGw6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTY3JvbGxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHB1YmxpYyBzaG93TG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMubG9hZGluZy5waXBlKGRlYm91bmNlVGltZSgyMDApKSwgLy8gYXZvaWQgZGlzcGxheWluZyBsb2FkaW5nIHNwaW5uZXIgZm9yIGEgdmVyeSBzaG9ydCB0aW1lXG4gICAgdGhpcy5sb2FkaW5nU29ydGluZyxcbiAgICB0aGlzLmxvYWRpbmdTY3JvbGxcbiAgXSkucGlwZShcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gcHJldlswXSA9PT0gY3VyclswXSAmJiBwcmV2WzFdID09PSBjdXJyWzFdICYmIHByZXZbMl0gPT09IGN1cnJbMl0pLCAvLyBhdm9pZCBlbWl0dGluZyBzYW1lIHZhbHVlIG11bHRpcGxlIHRpbWVzXG4gICAgbWFwKChyZXM6IGJvb2xlYW5bXSkgPT4gcmVzLnNvbWUociA9PiByKSlcbiAgKTtcblxuICBwdWJsaWMgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDogT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDtcbiAgcHVibGljIHNob3dGaXJzdEluc2VydGFibGVSb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dMYXN0SW5zZXJ0YWJsZVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZXhwYW5kYWJsZUl0ZW06IFNlbGVjdGlvbk1vZGVsPGFueT47XG5cbiAgcHJvdGVjdGVkIGNsaWNrVGltZXI7XG4gIHByb3RlY3RlZCBjbGlja0RlbGF5ID0gMjAwO1xuICBwcm90ZWN0ZWQgY2xpY2tQcmV2ZW50ID0gZmFsc2U7XG4gIHB1YmxpYyBlZGl0aW5nQ2VsbDogYW55O1xuICBwcm90ZWN0ZWQgZWRpdGluZ1JvdzogYW55O1xuXG4gIHNldCBjdXJyZW50UGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gdmFsO1xuICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gdmFsO1xuICAgICAgaWYgKHRoaXMubWF0cGFnaW5hdG9yKSB7XG4gICAgICAgIHRoaXMubWF0cGFnaW5hdG9yLnBhZ2VJbmRleCA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBwdWJsaWMgb1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQ6IE9UYWJsZVF1aWNrZmlsdGVyO1xuICBwcm90ZWN0ZWQgc29ydFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgb25SZW5kZXJlZERhdGFDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHByZXZpb3VzUmVuZGVyZXJEYXRhO1xuXG4gIHF1aWNrRmlsdGVyQ2FsbGJhY2s6IFF1aWNrRmlsdGVyRnVuY3Rpb247XG4gIGRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbjogRGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keScpXG4gIHByb3RlY3RlZCB0YWJsZUJvZHlFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVIZWFkZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgdGFibGVIZWFkZXJFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVUb29sYmFyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHRhYmxlVG9vbGJhckVsOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGRyZW4oTWF0Um93KSByb3dzITogUXVlcnlMaXN0PE1hdFJvdz47XG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUpIHByb3RlY3RlZCBtYXRUYWJsZTogTWF0VGFibGU8YW55PjtcblxuICBob3Jpem9udGFsU2Nyb2xsZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBvblVwZGF0ZVNjcm9sbGVkU3RhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgcm93V2lkdGg7XG5cbiAgc3RvcmVQYWdpbmF0aW9uU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiBJbiB0aGUgY2FzZSB0aGUgdGFibGUgaGF2ZW50IHBhZ2luYXRpb25Db250cm9sIGFuZCBwYWdlYWJsZSwgdGhlIHRhYmxlIGhhcyBwYWdpbmF0aW9uIHZpcnR1YWwqL1xuICBwYWdlU2Nyb2xsVmlydHVhbCA9IDE7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1JPV19IRUlHSFQgPSAzNjtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPVGFibGVQZXJtaXNzaW9ucztcbiAgbWF0TWVudTogTWF0TWVudTtcblxuICBAVmlld0NoaWxkKCd0YWJsZU1lbnUnKVxuICBvVGFibGVNZW51OiBPVGFibGVNZW51O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlT3B0aW9uQ29tcG9uZW50KVxuICB0YWJsZU9wdGlvbnM6IFF1ZXJ5TGlzdDxPVGFibGVPcHRpb25Db21wb25lbnQ+O1xuXG4gIG9UYWJsZUJ1dHRvbnM6IE9UYWJsZUJ1dHRvbnM7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihPVGFibGVCdXR0b25Db21wb25lbnQpXG4gIHRhYmxlQnV0dG9uczogUXVlcnlMaXN0PE9UYWJsZUJ1dHRvbj47XG5cbiAgQENvbnRlbnRDaGlsZCgnby10YWJsZS1xdWlja2ZpbHRlcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHF1aWNrZmlsdGVyQ29udGVudENoaWxkOiBPVGFibGVRdWlja2ZpbHRlcjtcblxuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50KVxuICBleHBvcnRPcHRzVGVtcGxhdGU6IFF1ZXJ5TGlzdDxPVGFibGVFeHBvcnRCdXR0b25Db21wb25lbnQ+XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUpXG4gIHRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkOiBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmU7XG5cblxuXG4gIHB1YmxpYyBncm91cGVkQ29sdW1uc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgW10pXG4gIHVwZGF0ZVNjcm9sbGVkU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG9yaXpvbnRhbFNjcm9sbCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZHlXaWR0aCA9IHRoaXMudGFibGVCb2R5RWwubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSB0aGlzLnRhYmxlQm9keUVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0aGlzLmhvcml6b250YWxTY3JvbGxlZDtcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsU2Nyb2xsZWQgPSBzY3JvbGxXaWR0aCA+IGJvZHlXaWR0aDtcbiAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT09IHRoaXMuaG9yaXpvbnRhbFNjcm9sbGVkKSB7XG4gICAgICAgICAgdGhpcy5vblVwZGF0ZVNjcm9sbGVkU3RhdGUuZW1pdCh0aGlzLmhvcml6b250YWxTY3JvbGxlZCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVmlld3BvcnRTaXplKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2lzQ29sdW1uRmlsdGVyc0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBpc0NvbHVtbkZpbHRlcnNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQ29sdW1uRmlsdGVyc0FjdGl2ZTtcbiAgfVxuXG4gIHNldCBpc0NvbHVtbkZpbHRlcnNBY3RpdmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gdmFsO1xuICB9XG5cbiAgZ3JvdXBpbmdIZWFkZXJzUm93czogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgb1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50OiBPVGFibGVDb2x1bW5zR3JvdXBpbmc7XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVDb250ZXh0TWVudUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgY29udGV4dE1lbnVDb250ZW50Q2hpbGQ6IE9UYWJsZUNvbnRleHRNZW51Q29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCB0cmlnZ2VyU2VsZWN0aW9uRXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcblxuICBAVmlld0NoaWxkcmVuKE1hdFRvb2x0aXApXG4gIHRvb2x0aXA6IFF1ZXJ5TGlzdDxNYXRUb29sdGlwPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gT0Zvcm1Db21wb25lbnQpKSBmb3JtOiBPRm9ybUNvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZJUlRVQUxfU0NST0xMX1NUUkFURUdZKSBwdWJsaWMgcmVhZG9ubHkgc2Nyb2xsU3RyYXRlZ3k6IE9UYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneVxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgZWxSZWYsIGZvcm0pO1xuXG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucyA9IG5ldyBEZWZhdWx0T1RhYmxlT3B0aW9ucygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudGFiR3JvdXBDb250YWluZXIgPSB0aGlzLmluamVjdG9yLmdldChNYXRUYWJHcm91cCk7XG4gICAgICB0aGlzLnRhYkNvbnRhaW5lciA9IHRoaXMuaW5qZWN0b3IuZ2V0KE1hdFRhYik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgZHVlIHRvIG5vdCBhbHdheXMgaXMgY29udGFpbmVkIG9uIHRhYi5cbiAgICB9XG5cbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFNuYWNrQmFyU2VydmljZSk7XG4gICAgdGhpcy5nZXRJbmplY3Rpb25Ub2tlbkNvbmZpZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbmplY3Rpb25Ub2tlbkNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb1RhYmxlR2xvYmFsQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQoT19UQUJMRV9HTE9CQUxfQ09ORklHKTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuYXV0b0FkanVzdCkpIHtcbiAgICAgICAgdGhpcy5hdXRvQWRqdXN0ID0gb1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BZGp1c3Q7XG4gICAgICB9O1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5hdXRvQWxpZ25UaXRsZXMpKSB7XG4gICAgICAgIHRoaXMuYXV0b0FsaWduVGl0bGVzID0gb1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BbGlnblRpdGxlcztcbiAgICAgIH1cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KSkge1xuICAgICAgICB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCA9IG9UYWJsZUdsb2JhbENvbmZpZy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlKSAmJiBDb2Rlcy5pc1ZhbGlkRWRpdGlvbk1vZGUob1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlKSkge1xuICAgICAgICB0aGlzLmVkaXRpb25Nb2RlID0gb1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5kZXRhaWxNb2RlICYmIENvZGVzLmlzVmFsaWREZXRhaWxNb2RlKG9UYWJsZUdsb2JhbENvbmZpZy5kZXRhaWxNb2RlKSkpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxNb2RlID0gb1RhYmxlR2xvYmFsQ29uZmlnLmRldGFpbE1vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcucm93SGVpZ2h0KSAmJiBDb2Rlcy5pc1ZhbGlkUm93SGVpZ2h0KG9UYWJsZUdsb2JhbENvbmZpZy5yb3dIZWlnaHQpKSB7XG4gICAgICAgIHRoaXMucm93SGVpZ2h0ID0gb1RhYmxlR2xvYmFsQ29uZmlnLnJvd0hlaWdodDtcbiAgICAgIH07XG5cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuc2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uKSkge1xuICAgICAgICB0aGlzLnNob3dDaGFydHNPbkRlbWFuZE9wdGlvbiA9IG9UYWJsZUdsb2JhbENvbmZpZy5zaG93Q2hhcnRzT25EZW1hbmRPcHRpb247XG4gICAgICB9O1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5zaG93UmVwb3J0T25EZW1hbmRPcHRpb24pKSB7XG4gICAgICAgIHRoaXMuc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uID0gb1RhYmxlR2xvYmFsQ29uZmlnLnNob3dSZXBvcnRPbkRlbWFuZE9wdGlvbjtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgYmVjYXVzZSBpcyBvcHRpb25hbFxuICAgIH1cblxuICB9XG5cbiAgZ2V0IHN0YXRlKCk6IE9UYWJsZUNvbXBvbmVudFN0YXRlQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFN0YXRlU2VydmljZS5zdGF0ZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIGlmICh0aGlzLm9UYWJsZUJ1dHRvbnMgJiYgdGhpcy50YWJsZUJ1dHRvbnMgJiYgdGhpcy50YWJsZUJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5vVGFibGVCdXR0b25zLnJlZ2lzdGVyQnV0dG9ucyh0aGlzLnRhYmxlQnV0dG9ucy50b0FycmF5KCkpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzdXBlci5hZnRlclZpZXdJbml0KCk7XG4gICAgdGhpcy5pbml0VGFibGVBZnRlclZpZXdJbml0KCk7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5tYXRNZW51ID0gdGhpcy5vVGFibGVNZW51Lm1hdE1lbnU7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUucmVnaXN0ZXJPcHRpb25zKHRoaXMudGFibGVPcHRpb25zLnRvQXJyYXkoKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFibGVSb3dFeHBhbmRhYmxlKSB7XG4gICAgICB0aGlzLmV4cGFuZGFibGVJdGVtID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy50YWJsZVJvd0V4cGFuZGFibGUubXVsdGlwbGUsIFtdLCB0cnVlLCB0aGlzLmNvbXBhcmVSb3coKSk7XG4gICAgICB0aGlzLmNyZWF0ZUV4cGFuZGFibGVDb2x1bW4oKTtcbiAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0uY2hhbmdlZC5zdWJzY3JpYmUoKGNoYW5nZSkgPT4ge1xuICAgICAgICB0aGlzLnNhdmVSb3dFeHBhbmRTdGF0ZShjaGFuZ2UuYWRkZWQsIGNoYW5nZS5yZW1vdmVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnJvd0NoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMucm93cy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZVRhYmxlRGF0YUNoYW5nZSgpO1xuICAgIH0pO1xuXG5cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodGhpcy50YWJsZUNvbHVtblNlbGVjdEFsbENvbnRlbnRDaGlsZCkge1xuICAgICAgdGhpcy5zZXRDdXN0b21EZWZpbml0aW9uSW5TZWxlY3RDb2x1bW4odGhpcy50YWJsZUNvbHVtblNlbGVjdEFsbENvbnRlbnRDaGlsZClcbiAgICB9XG4gIH1cblxuICBoYW5kbGVUYWJsZURhdGFDaGFuZ2UoKSB7XG4gICAgdGhpcy5yZXN0b3JlRXhwYW5kYWJsZVJvd1N0YXRlKCk7XG4gIH1cblxuICBzZXRDdXN0b21EZWZpbml0aW9uSW5TZWxlY3RDb2x1bW4oZGVmaW5pdGlvbjogT1RhYmxlQ29sdW1uU2VsZWN0QWxsRGlyZWN0aXZlKSB7XG4gICAgaWYgKGRlZmluaXRpb24udGl0bGUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnRpdGxlID0gZGVmaW5pdGlvbi50aXRsZTtcbiAgICB9XG4gICAgaWYgKGRlZmluaXRpb24ud2lkdGgpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLndpZHRoID0gZGVmaW5pdGlvbi53aWR0aDtcbiAgICB9XG4gICAgaWYgKGRlZmluaXRpb24ubWluV2lkdGgpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm1pbldpZHRoID0gZGVmaW5pdGlvbi5taW5XaWR0aDtcbiAgICB9XG4gICAgaWYgKGRlZmluaXRpb24ubWF4V2lkdGgpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm1heFdpZHRoID0gZGVmaW5pdGlvbi5tYXhXaWR0aDtcbiAgICB9XG4gICAgaWYgKGRlZmluaXRpb24ucmVzaXphYmxlKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5yZXNpemFibGUgPSBkZWZpbml0aW9uLnJlc2l6YWJsZTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtwcm9wTmFtZTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY2hhbmdlcy5hdXRvQWRqdXN0KSAmJiBjaGFuZ2VzLmF1dG9BZGp1c3QuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLmF1dG9BZGp1c3QucHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy5hdXRvQWRqdXN0ID0gY2hhbmdlcy5hdXRvQWRqdXN0LmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVIZWFkZXJBbmRGb290ZXJTdGlja3lQb3NpdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICBjb25zdCB6b25lID0gdGhpcy5pbmplY3Rvci5nZXQoTmdab25lKTtcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbiA9IHRoaXMuc2Nyb2xsU3RyYXRlZ3kuc3RpY2t5Q2hhbmdlLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmZpeGVkSGVhZGVyIHx8IHRoaXMuaGFzSW5zZXJ0YWJsZVJvdygpKVxuICAgICAgKS5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgIHpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzdGlja3lIZWFkZXJTZWxlY3RvcikuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbC5zdHlsZS50b3AgPSAtIHggKyAncHgnO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUZvb3RlclNlbGVjdG9yKS5mb3JFYWNoKChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9IHggKyAncHgnO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVFeHBhbmRhYmxlQ29sdW1uKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZXhwYW5kYWJsZUNvbHVtbiA9IG5ldyBPQ29sdW1uKCk7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uLnZpc2libGUgPSB0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSAmJiB0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5leHBhbmRhYmxlQ29sdW1uVmlzaWJsZTtcbiAgICB0aGlzLnVwZGF0ZVN0YXRlRXhwYW5kZWRDb2x1bW4oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuXG4gICAgLy9kZXRhY2ggYWxsIHBvcnRhIGhvc3QgY3JlYXRlZFxuICAgIGlmICh0aGlzLnBvcnRhbEhvc3QpIHtcbiAgICAgIHRoaXMucG9ydGFsSG9zdC5mb3JFYWNoKHggPT4geC5kZXRhY2goKSk7XG4gICAgfVxuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9XG5cbiAgZ2V0U3VmZml4Q29sdW1uSW5zZXJ0YWJsZSgpIHtcbiAgICByZXR1cm4gQ29kZXMuU1VGRklYX0NPTFVNTl9JTlNFUlRBQkxFO1xuICB9XG5cbiAgZ2V0QWN0aW9uc1Blcm1pc3Npb25zKCk6IE9QZXJtaXNzaW9uc1tdIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucyA/ICh0aGlzLnBlcm1pc3Npb25zLmFjdGlvbnMgfHwgW10pIDogW107XG4gIH1cblxuICBnZXRNZW51UGVybWlzc2lvbnMoKTogT1RhYmxlTWVudVBlcm1pc3Npb25zIHtcbiAgICBjb25zdCByZXN1bHQ6IE9UYWJsZU1lbnVQZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnMgPyB0aGlzLnBlcm1pc3Npb25zLm1lbnUgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IHtcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgaXRlbXM6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGdldE9Db2x1bW5QZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcpOiBPUGVybWlzc2lvbnMge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuY29sdW1ucyB8fCBbXSkgOiBbXTtcbiAgICByZXR1cm4gY29sdW1ucy5maW5kKGNvbXAgPT4gY29tcC5hdHRyID09PSBhdHRyKSB8fCB7IGF0dHI6IGF0dHIsIGVuYWJsZWQ6IHRydWUsIHZpc2libGU6IHRydWUgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBY3Rpb25QZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcpOiBPUGVybWlzc2lvbnMge1xuICAgIGNvbnN0IGFjdGlvbnNQZXJtID0gdGhpcy5wZXJtaXNzaW9ucyA/ICh0aGlzLnBlcm1pc3Npb25zLmFjdGlvbnMgfHwgW10pIDogW107XG4gICAgY29uc3QgcGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IGFjdGlvbnNQZXJtLmZpbmQocCA9PiBwLmF0dHIgPT09IGF0dHIpO1xuICAgIHJldHVybiBwZXJtaXNzaW9ucyB8fCB7XG4gICAgICBhdHRyOiBhdHRyLFxuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRW5hYmxlZEFjdGlvblBlcm1pc3Npb24oYXR0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aW9uc1Blcm0gPSB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gYWN0aW9uc1Blcm0uZmluZChwID0+IHAuYXR0ciA9PT0gYXR0cik7XG4gICAgY29uc3QgZW5hYmxlZFBlcm1pc2lvbiA9IFBlcm1pc3Npb25zVXRpbHMuY2hlY2tFbmFibGVkUGVybWlzc2lvbihwZXJtaXNzaW9ucyk7XG4gICAgaWYgKCFlbmFibGVkUGVybWlzaW9uKSB7XG4gICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUEVSTUlTU0lPTicpO1xuICAgIH1cbiAgICByZXR1cm4gZW5hYmxlZFBlcm1pc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2Qgd2hhdCBpbml0aWFsaXplIHZhcnMgYW5kIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGluaXRpYWxpemUoKTogYW55IHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG5cbiAgICB0aGlzLl9vVGFibGVPcHRpb25zID0gbmV3IERlZmF1bHRPVGFibGVPcHRpb25zKCk7XG4gICAgaWYgKHRoaXMudGFiR3JvdXBDb250YWluZXIgJiYgdGhpcy50YWJDb250YWluZXIpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJUYWJMaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHRoaXMucmVnaXN0ZXJDbGlja0xpc3RlbmVyKCk7XG4gICAgdGhpcy5yZWdpc3RlckRibENsaWNrTGlzdGVuZXIoKTtcbiAgICAvLyBJbml0aWFsaXplIHBhcmFtcyBvZiB0aGUgdGFibGVcbiAgICB0aGlzLmluaXRpYWxpemVQYXJhbXMoKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZURhbygpO1xuXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlLmdldFRhYmxlUGVybWlzc2lvbnModGhpcy5vYXR0ciwgdGhpcy5hY3RSb3V0ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24gPSB0aGlzLmNsaWNrU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuY2xpY2tEZWxheSkpIC8vIEVzcGVyYSBlbCB0aWVtcG8gY29uZmlndXJhZG8gYW50ZXMgZGUgZWplY3V0YXJcbiAgICAgIC5zdWJzY3JpYmUoKHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm9lbmFibGVkICYmICF0aGlzLnJlYWRPbmx5ICYmIGNvbHVtbi5lZGl0b3JcbiAgICAgICAgICAmJiAodGhpcy5kZXRhaWxNb2RlICE9PSBDb2Rlcy5ERVRBSUxfTU9ERV9DTElDSylcbiAgICAgICAgICAmJiAodGhpcy5lZGl0aW9uTW9kZSA9PT0gQ29kZXMuRURJVElPTl9NT0RFX0NMSUNLKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbiwgcm93LCBjZWxsUmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRvSGFuZGxlQ2xpY2socm93LCBjb2x1bW4uYXR0ciwgcm93SW5kZXgsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJEYmxDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbiA9IHRoaXMuZGJsY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5jbGlja0RlbGF5KSkgLy8gRXNwZXJhIGVsIHRpZW1wbyBjb25maWd1cmFkbyBhbnRlcyBkZSBlamVjdXRhclxuICAgICAgLnN1YnNjcmliZSgoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZW5hYmxlZCAmJiBjb2x1bW4uZWRpdG9yXG4gICAgICAgICAgJiYgKCFDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmRldGFpbE1vZGUpKVxuICAgICAgICAgICYmIChDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmVkaXRpb25Nb2RlKSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlQ29sdW1uRWRpdGlvbihjb2x1bW4sIHJvdywgY2VsbFJlZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRvdWJsZUNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiBldmVudCwgY29sdW1uTmFtZTogY29sdW1uLmF0dHIsIGNlbGw6IHJvd1tjb2x1bW4uYXR0cl0gfSk7XG4gICAgICAgICAgaWYgKHRoaXMub2VuYWJsZWQgJiYgQ29kZXMuaXNEb3VibGVDbGlja01vZGUodGhpcy5kZXRhaWxNb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGV0YWlsKHJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVEYW8oKSB7XG4gICAgLy8gQ29uZmlndXJlIGRhbyBtZXRob2RzXG4gICAgY29uc3QgcXVlcnlNZXRob2ROYW1lID0gdGhpcy5wYWdlYWJsZSA/IHRoaXMucGFnaW5hdGVkUXVlcnlNZXRob2QgOiB0aGlzLnF1ZXJ5TWV0aG9kO1xuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBxdWVyeTogcXVlcnlNZXRob2ROYW1lLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZU1ldGhvZCxcbiAgICAgIGRlbGV0ZTogdGhpcy5kZWxldGVNZXRob2QsXG4gICAgICBpbnNlcnQ6IHRoaXMuaW5zZXJ0TWV0aG9kXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnN0YXRpY0RhdGEpIHtcbiAgICAgIHRoaXMucXVlcnlPbkJpbmQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlcnlPbkluaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGFvVGFibGUgPSBuZXcgT1RhYmxlRGFvKHVuZGVmaW5lZCwgdGhpcy5lbnRpdHksIG1ldGhvZHMpO1xuICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5zdGF0aWNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgICB0aGlzLmRhb1RhYmxlID0gbmV3IE9UYWJsZURhbyh0aGlzLmRhdGFTZXJ2aWNlLCB0aGlzLmVudGl0eSwgbWV0aG9kcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHJlaW5pdGlhbGl6ZSB0YWJsZSBhZGRpbmcgb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgcmVpbml0aWFsaXplKG9wdGlvbnM6IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBjb25zdCBjbG9uZWRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZW50aXR5JykpIHtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBjbG9uZWRPcHRzLmVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdzZXJ2aWNlJykpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gY2xvbmVkT3B0cy5zZXJ2aWNlO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2NvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBjbG9uZWRPcHRzLmNvbHVtbnM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gY2xvbmVkT3B0cy52aXNpYmxlQ29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA9IGNsb25lZE9wdHMuZGVmYXVsdFZpc2libGVDb2x1bW5zO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2tleXMnKSkge1xuICAgICAgICB0aGlzLmtleXMgPSBjbG9uZWRPcHRzLmtleXM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnc29ydENvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zID0gY2xvbmVkT3B0cy5zb3J0Q29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdwYXJlbnRLZXlzJykpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRLZXlzID0gY2xvbmVkT3B0cy5wYXJlbnRLZXlzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyQ29sdW1ucycpKSB7XG4gICAgICAgIGlmICghdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ID0gbmV3IE9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQodGhpcy5pbmplY3RvciwgdGhpcyk7XG4gICAgICAgICAgdGhpcy5vVGFibGVNZW51Lm9uVmlzaWJsZUZpbHRlck9wdGlvbkNoYW5nZS5uZXh0KHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KTtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IGNsb25lZE9wdHMuZmlsdGVyQ29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IHRoaXMuc2VhcmNoZWFibGVDb2x1bW5zLmpvaW4oXCI7XCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdGF0ZS5yZXNldCh0aGlzLnBhZ2VhYmxlKTtcbiAgICB0aGlzLmluaXRUYWJsZUFmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLm9uUmVpbml0aWFsaXplLmVtaXQobnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdFRhYmxlQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnBhcnNlVmlzaWJsZUNvbHVtbnMoKTtcbiAgICB0aGlzLnBhcnNlU2VhcmNoZWFibGVDb2x1bW5zKCk7XG4gICAgdGhpcy5zZXREYXRhc291cmNlKCk7XG4gICAgdGhpcy5wYXJzZUdyb3VwZWRDb2x1bW5zKCk7XG4gICAgdGhpcy5wYXJzZUdyb3VwZWRDb2x1bW5UeXBlcygpO1xuICAgIHRoaXMucGFyc2VTb3J0Q29sdW1ucygpO1xuICAgIHRoaXMuc2V0RmlsdGVyc0NvbmZpZ3VyYXRpb24oKTtcbiAgICB0aGlzLmFkZERlZmF1bHRSb3dCdXR0b25zKCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50KSkge1xuICAgICAgdGhpcy5zZXRHcm91cENvbHVtbnModGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQuY29sdW1uc0FycmF5KTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVlcnlPbkluaXQpIHtcbiAgICAgIHRoaXMucXVlcnlEYXRhKCk7XG4gICAgfVxuICB9XG4gIHBhcnNlU2VhcmNoZWFibGVDb2x1bW5zKCkge1xuICAgIHRoaXMuc2VhcmNoZWFibGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sQXJyYXkuZmlsdGVyKGNvbCA9PiB7XG4gICAgICBjb25zdCBvQ29sID0gdGhpcy5nZXRPQ29sdW1uKGNvbCk7XG4gICAgICByZXR1cm4gb0NvbCAmJiBvQ29sLnNlYXJjaGFibGU7XG4gICAgfSlcblxuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLnRhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnRhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zb3J0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY3JvbGxTdHJhdGVneSkge1xuICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneS5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJvd0NoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3dDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnMpLmZvckVhY2goaWR4ID0+IHtcbiAgICAgIGlmICh0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbaWR4XSkge1xuICAgICAgICB0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbaWR4XS51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGUgc3RvcmUgbG9jYWxzdG9yYWdlLCBjYWxsIG9mIHRoZSBJTG9jYWxTdG9yYWdlXG4gICAqL1xuICBnZXREYXRhVG9TdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2UuZ2V0RGF0YVRvU3RvcmUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyUXVpY2tGaWx0ZXIoYXJnOiBhbnkpIHtcbiAgICBjb25zdCBxdWlja0ZpbHRlciA9IChhcmcgYXMgT1RhYmxlUXVpY2tmaWx0ZXIpO1xuICAgIC8vIGZvcmNpbmcgcXVpY2tGaWx0ZXJDb21wb25lbnQgdG8gYmUgdW5kZWZpbmVkLCB0YWJsZSB1c2VzIG9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50XG4gICAgdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50ID0gcXVpY2tGaWx0ZXI7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnNldFZhbHVlKHRoaXMuc3RhdGUucXVpY2tGaWx0ZXJWYWx1ZSwgZmFsc2UpO1xuICAgICAgdGhpcy5xdWlja0ZpbHRlclN1YnNjcmlwdGlvbiA9IHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQub25DaGFuZ2Uuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2guZW1pdCh2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJQYWdpbmF0aW9uKHZhbHVlOiBPVGFibGVQYWdpbmF0b3IpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25Db250cm9scyA9IHRydWU7XG4gICAgdGhpcy5wYWdpbmF0b3IgPSB2YWx1ZTtcbiAgfVxuXG4gIHJlZ2lzdGVyQ29udGV4dE1lbnUodmFsdWU6IE9Db250ZXh0TWVudUNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMudGFibGVDb250ZXh0TWVudSA9IHZhbHVlO1xuICAgIHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlQ29udGV4dE1lbnUub25TaG93LnN1YnNjcmliZSgocGFyYW1zOiBJT0NvbnRleHRNZW51Q29udGV4dCkgPT4ge1xuICAgICAgcGFyYW1zLmNsYXNzID0gJ28tdGFibGUtY29udGV4dC1tZW51ICcgKyB0aGlzLnJvd0hlaWdodDtcbiAgICAgIGlmIChwYXJhbXMuZGF0YSAmJiAhdGhpcy5pc1Jvd1NlbGVjdGVkKHBhcmFtcy5kYXRhLnJvd1ZhbHVlKSkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocGFyYW1zLmRhdGEucm93VmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJEZWZhdWx0Q29sdW1uKGNvbHVtbjogc3RyaW5nKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4pKSkge1xuICAgICAgLy8gYSBkZWZhdWx0IGNvbHVtbiBkZWZpbml0aW9uIHRyeWluZyB0byByZXBsYWNlIGFuIGFscmVhZHkgZXhpc3RpbmcgZGVmaW5pdGlvblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2xEZWY6IE9Db2x1bW4gPSB0aGlzLmNyZWF0ZU9Db2x1bW4oY29sdW1uLCB0aGlzKTtcbiAgICB0aGlzLnB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIGFsbCBjb2x1bW5zIGFuZCBwcm9wZXJ0aWVzIGluIHZhciBjb2x1bW5zQXJyYXlcbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcmVnaXN0ZXJDb2x1bW4oY29sdW1uOiBPVGFibGVDb2x1bW5Db21wb25lbnQgfCBPVGFibGVDb2x1bW5DYWxjdWxhdGVkQ29tcG9uZW50IHwgYW55KSB7XG4gICAgY29uc3QgY29sdW1uQXR0ciA9ICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykgPyBjb2x1bW4gOiBjb2x1bW4uYXR0cjtcbiAgICBjb25zdCBjb2x1bW5QZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gdGhpcy5nZXRPQ29sdW1uUGVybWlzc2lvbnMoY29sdW1uQXR0cik7XG4gICAgaWYgKCFjb2x1bW5QZXJtaXNzaW9ucy52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRGVmYXVsdENvbHVtbihjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbkRlZiA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4uYXR0cik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbkRlZikgJiYgVXRpbC5pc0RlZmluZWQoY29sdW1uRGVmLmRlZmluaXRpb24pKSB7XG4gICAgICAvLyBhIG8tdGFibGUtY29sdW1uIGRlZmluaXRpb24gdHJ5aW5nIHRvIHJlcGxhY2UgYW4gYWxyZWFkeSBleGlzdGluZyBvLXRhYmxlLWNvbHVtbiBkZWZpbml0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sRGVmOiBPQ29sdW1uID0gdGhpcy5jcmVhdGVPQ29sdW1uKGNvbHVtbi5hdHRyLCB0aGlzLCBjb2x1bW4pO1xuICAgIGxldCBjb2x1bW5XaWR0aCA9IHRoaXMuZ2V0Q29sdW1uV2lkdGhGcm9tU3RhdGUoY29sRGVmKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uV2lkdGgpKSB7XG4gICAgICBjb2xEZWYud2lkdGggPSBjb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgaWYgKGNvbHVtbiAmJiAoY29sdW1uLmFzeW5jTG9hZCB8fCBjb2x1bW4udHlwZSA9PT0gJ2FjdGlvbicpKSB7XG4gICAgICB0aGlzLmF2b2lkUXVlcnlDb2x1bW5zLnB1c2goY29sdW1uLmF0dHIpO1xuICAgICAgaWYgKGNvbHVtbi5hc3luY0xvYWQpIHtcbiAgICAgICAgdGhpcy5hc3luY0xvYWRDb2x1bW5zLnB1c2goY29sdW1uLmF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWY6IE9Db2x1bW4pIHtcbiAgICBjb2xEZWYudmlzaWJsZSA9ICh0aGlzLl92aXNpYmxlQ29sQXJyYXkuaW5kZXhPZihjb2xEZWYuYXR0cikgIT09IC0xKTtcbiAgICAvLyBGaW5kIGNvbHVtbiBkZWZpbml0aW9uIGJ5IG5hbWVcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RpbmcgPSB0aGlzLmdldE9Db2x1bW4oY29sRGVmLmF0dHIpO1xuICAgIGlmIChhbHJlYWR5RXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVwbGFjaW5nSW5kZXggPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuaW5kZXhPZihhbHJlYWR5RXhpc3RpbmcpO1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zW3JlcGxhY2luZ0luZGV4XSA9IGNvbERlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnB1c2goY29sRGVmKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVDb2x1bW5zT3JkZXIoKTtcbiAgICB0aGlzLnJlZnJlc2hFZGl0aW9uTW9kZVdhcm4oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoRWRpdGlvbk1vZGVXYXJuKCkge1xuICAgIGlmICh0aGlzLmVkaXRpb25Nb2RlICE9PSBDb2Rlcy5FRElUSU9OX01PREVfTk9ORSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlZGl0YWJsZUNvbHVtbnMgPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiB7XG4gICAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQoY29sLmVkaXRvcik7XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoZWRpdGFibGVDb2x1bW5zLmxlbmd0aCA+IDAgJiYgIXRoaXMuaGFzSW5zZXJ0YWJsZVJvdygpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVXNpbmcgYSBjb2x1bW4gd2l0aCBhIGVkaXRvciBidXQgdGhlcmUgaXMgbm8gZWRpdGlvbi1tb2RlIGRlZmluZWQnKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcmVnaXN0ZXJDb2x1bW5BZ2dyZWdhdGUoY29sdW1uOiBPQ29sdW1uQWdncmVnYXRlKSB7XG4gICAgdGhpcy5zaG93VG90YWxzU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIGNvbnN0IGFscmVhZHlFeGlzdGluZyA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4uYXR0cik7XG4gICAgaWYgKGFscmVhZHlFeGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXBsYWNpbmdJbmRleCA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5pbmRleE9mKGFscmVhZHlFeGlzdGluZyk7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnNbcmVwbGFjaW5nSW5kZXhdLmFnZ3JlZ2F0ZSA9IGNvbHVtbjtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlSGVhZGVycyh0YWJsZUhlYWRlcjogT1RhYmxlSGVhZGVyQ29tcG9uZW50KSB7XG4gICAgaWYgKHRoaXMudGFibGVIZWFkZXJzLmZpbmRJbmRleChoZWFkZXIgPT4gaGVhZGVyLmNvbHVtbi5hdHRyID09PSB0YWJsZUhlYWRlci5jb2x1bW4uYXR0cikgPT09IC0xKSB7XG4gICAgICB0aGlzLnRhYmxlSGVhZGVycy5wdXNoKHRhYmxlSGVhZGVyKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZVZpc2libGVDb2x1bW5zKGRlZmF1bHRDb25maWd1cmF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5jb2x1bW5zRGlzcGxheSkge1xuXG4gICAgICAvLyBmaWx0ZXJpbmcgY29sdW1ucyB0aGF0IG1pZ2h0IGJlIGluIHN0YXRlIHN0b3JhZ2UgYnV0IG5vdCBpbiB0aGUgYWN0dWFsIHRhYmxlIGRlZmluaXRpb25cbiAgICAgIGxldCBzdGF0ZUNvbHM6IE9Db2x1bW5EaXNwbGF5W10gPSBbXTtcbiAgICAgIHRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkuZm9yRWFjaCgob0NvbCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlQ29sSW5Db2x1bW5zID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5hdHRyID09PSBvQ29sLmF0dHIpICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGlzVmlzaWJsZUNvbEluQ29sdW1ucykge1xuICAgICAgICAgIHN0YXRlQ29scy5wdXNoKG9Db2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIGxvYWQgdGhlIGNvbHVtbiAnICsgb0NvbC5hdHRyICsgJyBmcm9tIHRoZSBsb2NhbHN0b3JhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgc3RhdGVDb2xzID0gdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5jb2x1bW5zRGlzcGxheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlQ29scyA9IHRoaXMuY2hlY2tDaGFuZ2VzVmlzaWJsZUNvbHVtbW5zSW5Jbml0aWFsQ29uZmlndXJhdGlvbihzdGF0ZUNvbHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29ydCgoYTogT0NvbHVtbiwgYjogT0NvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBpbmRleEEgPSBzdGF0ZUNvbHMuZmluZEluZGV4KGNvbCA9PiBjb2wuYXR0ciA9PT0gYS5hdHRyKTtcbiAgICAgICAgY29uc3QgaW5kZXhCID0gc3RhdGVDb2xzLmZpbmRJbmRleChjb2wgPT4gY29sLmF0dHIgPT09IGIuYXR0cik7XG4gICAgICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlzaWJsZUNvbEFycmF5ID0gc3RhdGVDb2xzLmZpbHRlcihpdGVtID0+IGl0ZW0udmlzaWJsZSkubWFwKGl0ZW0gPT4gaXRlbS5hdHRyKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aGlzLnZpc2libGVDb2xBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA/IHRoaXMuZGVmYXVsdFZpc2libGVDb2x1bW5zIDogdGhpcy52aXNpYmxlQ29sdW1ucywgdHJ1ZSk7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29ydCgoYTogT0NvbHVtbiwgYjogT0NvbHVtbikgPT4gdGhpcy52aXNpYmxlQ29sQXJyYXkuaW5kZXhPZihhLmF0dHIpIC0gdGhpcy52aXNpYmxlQ29sQXJyYXkuaW5kZXhPZihiLmF0dHIpKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0NoYW5nZXNWaXNpYmxlQ29sdW1tbnNJbkluaXRpYWxDb25maWd1cmF0aW9uKHN0YXRlQ29sczogT0NvbHVtbkRpc3BsYXlbXSk6IE9Db2x1bW5EaXNwbGF5W10ge1xuICAgIGlmICh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmNvbHVtbnNEaXNwbGF5KSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFZpc2libGVDb2xBcnJheSA9XG4gICAgICAgIHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uY29sdW1uc0Rpc3BsYXkuZmlsdGVyKHggPT4geC52aXNpYmxlKS5tYXAoeCA9PiB4LmF0dHIpO1xuXG4gICAgICBjb25zdCB2aXNpYmxlQ29sQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy52aXNpYmxlQ29sdW1ucywgdHJ1ZSk7XG5cbiAgICAgIC8vIEZpbmQgdmFsdWVzIGluIHZpc2libGUtY29sdW1ucyB0aGF0IHRoZXkgYXJlbnQgaW4gb3JpZ2luYWwtdmlzaWJsZS1jb2x1bW5zIGluIGxvY2Fsc3RvcmFnZVxuICAgICAgLy8gaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIGFkZCB0aGlzIGNvbHVtbiB0byB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgICAgY29uc3QgY29sVG9BZGRJblZpc2libGVDb2wgPSBVdGlsLmRpZmZlcmVuY2VBcnJheXModmlzaWJsZUNvbEFycmF5LCBvcmlnaW5hbFZpc2libGVDb2xBcnJheSk7XG4gICAgICBjb2xUb0FkZEluVmlzaWJsZUNvbC5mb3JFYWNoKChjb2xBZGQpID0+IHtcbiAgICAgICAgbGV0IGluZGV4Q29sID0gc3RhdGVDb2xzLmZpbmRJbmRleChjb2wgPT4gY29sLmF0dHIgPT09IGNvbEFkZCk7XG4gICAgICAgIGlmIChpbmRleENvbCA+IC0xKSB7XG4gICAgICAgICAgc3RhdGVDb2xzW2luZGV4Q29sXS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZUNvbHMuc29ydCgoYTogT0NvbHVtbiwgYjogT0NvbHVtbikgPT4gdmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYS5hdHRyKSAtIHZpc2libGVDb2xBcnJheS5pbmRleE9mKGIuYXR0cikpO1xuICAgICAgfSk7XG5cblxuICAgICAgLy8gRmluZCB2YWx1ZXMgaW4gb3JpZ2luYWwtdmlzaWJsZS1jb2x1bW5zIGluIGxvY2Fsc3RvcmFnZSB0aGF0IHRoZXkgYXJlbnQgaW4gdGhpcy52aXNpYmxlQ29sQXJyYXlcbiAgICAgIC8vIGluIHRoaXMgY2FzZSB5b3UgaGF2ZSB0byBkZWxldGUgdGhpcyBjb2x1bW4gdG8gdGhpcy52aXNpYmxlQ29sQXJyYXlcbiAgICAgIGNvbnN0IGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sID0gVXRpbC5kaWZmZXJlbmNlQXJyYXlzKG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5LCB2aXNpYmxlQ29sQXJyYXkpO1xuICAgICAgaWYgKGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RhdGVDb2xzID0gc3RhdGVDb2xzLmZpbHRlcihjb2wgPT4gY29sVG9EZWxldGVJblZpc2libGVDb2wuaW5kZXhPZihjb2wuYXR0cikgPT09IC0xKTtcbiAgICAgIH1cblxuICAgICAgLy9JZiB0aGUgY29sdW1ucyBpbiBvcmlnaW5hbFZpc2libGVDb2xBcnJheSBoYXMgY2hhbmdlZCB0aGUgc29ydGluZ1xuICAgICAgY29uc3QgY2hhbmdlU29ydFZpc2libGVDb2x1bW5zID0gSlNPTi5zdHJpbmdpZnkodmlzaWJsZUNvbEFycmF5KSAhPT0gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkpO1xuICAgICAgaWYgKGNoYW5nZVNvcnRWaXNpYmxlQ29sdW1ucyAmJiB2aXNpYmxlQ29sQXJyYXkubGVuZ3RoID09PSBvcmlnaW5hbFZpc2libGVDb2xBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgdmlzaWJsZUNvbEFycmF5LmZvckVhY2goKGNvbCwgdG9JbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZyb21JbmRleFRvQ2hhbmdlID0gc3RhdGVDb2xzLmZpbmRJbmRleChzdGF0ZUNvbCA9PiBzdGF0ZUNvbC5hdHRyID09PSBjb2wpO1xuICAgICAgICAgIG1vdmVJdGVtSW5BcnJheShzdGF0ZUNvbHMsIGZyb21JbmRleFRvQ2hhbmdlLCB0b0luZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlQ29scztcbiAgfVxuXG4gIHBhcnNlU29ydENvbHVtbnMoKSB7XG4gICAgY29uc3Qgc29ydENvbHVtbnNQYXJhbSA9IHRoaXMuc3RhdGUuc29ydENvbHVtbnMgfHwgdGhpcy5zb3J0Q29sdW1ucztcbiAgICB0aGlzLnNvcnRDb2xBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHNvcnRDb2x1bW5zUGFyYW0pO1xuXG4gICAgLy8gY2hlY2tpbmcgdGhlIG9yaWdpbmFsIHNvcnQgY29sdW1ucyB3aXRoIHRoZSBzb3J0IGNvbHVtbnMgaW4gaW5pdGlhbCBjb25maWd1cmF0aW9uIGluIGxvY2FsIHN0b3JhZ2VcbiAgICBpZiAodGhpcy5zdGF0ZS5zb3J0Q29sdW1ucyAmJiB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNvcnRDb2x1bW5zKSB7XG5cbiAgICAgIGNvbnN0IGluaXRpYWxDb25maWdTb3J0Q29sdW1uc0FycmF5ID0gU2VydmljZVV0aWxzLnBhcnNlU29ydENvbHVtbnModGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5zb3J0Q29sdW1ucyk7XG4gICAgICBjb25zdCBvcmlnaW5hbFNvcnRDb2x1bW5zQXJyYXkgPSBTZXJ2aWNlVXRpbHMucGFyc2VTb3J0Q29sdW1ucyh0aGlzLnNvcnRDb2x1bW5zKTtcbiAgICAgIC8vIEZpbmQgdmFsdWVzIGluIHZpc2libGUtY29sdW1ucyB0aGF0IHRoZXkgYXJlbnQgaW4gb3JpZ2luYWwtdmlzaWJsZS1jb2x1bW5zIGluIGxvY2Fsc3RvcmFnZVxuICAgICAgLy8gaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIGFkZCB0aGlzIGNvbHVtbiB0byB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgICAgY29uc3QgY29sVG9BZGRJblZpc2libGVDb2wgPSBVdGlsLmRpZmZlcmVuY2VBcnJheXMob3JpZ2luYWxTb3J0Q29sdW1uc0FycmF5LCBpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSk7XG4gICAgICBpZiAoY29sVG9BZGRJblZpc2libGVDb2wubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xUb0FkZEluVmlzaWJsZUNvbC5mb3JFYWNoKGNvbEFkZCA9PiB7XG4gICAgICAgICAgdGhpcy5zb3J0Q29sQXJyYXkucHVzaChjb2xBZGQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sVG9EZWxJblZpc2libGVDb2wgPSBVdGlsLmRpZmZlcmVuY2VBcnJheXMoaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXksIG9yaWdpbmFsU29ydENvbHVtbnNBcnJheSk7XG4gICAgICBpZiAoY29sVG9EZWxJblZpc2libGVDb2wubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xUb0RlbEluVmlzaWJsZUNvbC5mb3JFYWNoKChjb2xEZWwpID0+IHtcbiAgICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5mb3JFYWNoKChjb2wsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wuY29sdW1uTmFtZSA9PT0gY29sRGVsLmNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zb3J0Q29sQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnN1cmluZyBjb2x1bW4gZXhpc3RlbmNlIGFuZCBjaGVja2luZyBpdHMgb3JkZXJhYmxlIHN0YXRlXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuc29ydENvbEFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2xOYW1lID0gdGhpcy5zb3J0Q29sQXJyYXlbaV0uY29sdW1uTmFtZTtcbiAgICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sTmFtZSk7XG4gICAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpIHx8ICFvQ29sLm9yZGVyYWJsZSkge1xuICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBwcm90ZWN0ZWQgZW5zdXJlQ29sdW1uc09yZGVyKCkge1xuXG4gICAgbGV0IGNvbHVtbnNPcmRlciA9IFtdO1xuICAgIGlmICh0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5KSB7XG4gICAgICBjb2x1bW5zT3JkZXIgPSB0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5Lm1hcChpdGVtID0+IGl0ZW0uYXR0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHVtbnNPcmRlciA9IHRoaXMuY29sQXJyYXkuZmlsdGVyKGF0dHIgPT4gdGhpcy52aXNpYmxlQ29sQXJyYXkuaW5kZXhPZihhdHRyKSA9PT0gLTEpO1xuICAgICAgY29sdW1uc09yZGVyLnB1c2goLi4udGhpcy52aXNpYmxlQ29sQXJyYXkpO1xuICAgIH1cblxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb3J0KChhOiBPQ29sdW1uLCBiOiBPQ29sdW1uKSA9PiB7XG4gICAgICBpZiAoY29sdW1uc09yZGVyLmluZGV4T2YoYS5hdHRyKSA9PT0gLTEpIHtcbiAgICAgICAgLy8gaWYgaXQgaXMgbm90IGluIGxvY2FsIHN0b3JhZ2UgYmVjYXVzZSBpdCBpcyBuZXcsIGtlZXAgb3JkZXJcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29sdW1uc09yZGVyLmluZGV4T2YoYS5hdHRyKSAtIGNvbHVtbnNPcmRlci5pbmRleE9mKGIuYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICB9XG5cbiAgaW5pdGlhbGl6ZVBhcmFtcygpOiB2b2lkIHtcbiAgICAvLyBJZiB2aXNpYmxlLWNvbHVtbnMgaXMgbm90IHByZXNlbnQgdGhlbiB2aXNpYmxlLWNvbHVtbnMgaXMgYWxsIGNvbHVtbnNcbiAgICBpZiAoIXRoaXMudmlzaWJsZUNvbHVtbnMpIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbEFycmF5Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb2xBcnJheS5mb3JFYWNoKCh4OiBzdHJpbmcpID0+IHRoaXMucmVnaXN0ZXJDb2x1bW4oeCkpO1xuICAgICAgdGhpcy5lbnN1cmVDb2x1bW5zT3JkZXIoKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBxdWlja0ZpbHRlclxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyID0gdGhpcy5xdWlja0ZpbHRlcjtcblxuICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5zdGF0ZS5jdXJyZW50UGFnZTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHBhZ2luYXRvclxuICAgIGlmICghdGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0aW9uQ29udHJvbHMpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yID0gbmV3IE9CYXNlVGFibGVQYWdpbmF0b3IoKTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdGhpcy5xdWVyeVJvd3M7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgdGhpcy5wYWdpbmF0b3Iuc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPSB0aGlzLnNob3dQYWdpbmF0b3JGaXJzdExhc3RCdXR0b25zO1xuICAgIH1cblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5zZWxlY3RBbGxDaGVja2JveFZpc2libGUpKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gISF0aGlzLnN0YXRlLnNlbGVjdENvbHVtblZpc2libGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNoZWNraW5nIHRoZSBvcmlnaW5hbCBzZWxlY3RBbGxDaGVja2JveFZpc2libGUgd2l0aCBzZWxlY3QtY29sdW1uLXZpc2libGUgaW4gaW5pdGlhbCBjb25maWd1cmF0aW9uIGluIGxvY2FsIHN0b3JhZ2VcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNlbGVjdENvbHVtblZpc2libGUpXG4gICAgICAgICYmIHRoaXMuc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID09PSB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNlbGVjdENvbHVtblZpc2libGUpIHtcbiAgICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9ICEhdGhpcy5zdGF0ZS5zZWxlY3RDb2x1bW5WaXNpYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9IHRoaXMuc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vSW5pdGlhbGl6ZSBzaG93IGZpbHRlciBieSBjb2x1bW4gaWNvblxuICAgIHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gdGhpcy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ7XG5cbiAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuXG4gICAgaWYgKHRoaXMuc3RvcmVTdGF0ZSkge1xuICAgICAgLy8gaWYgcXVlcnktcm93cyBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaXMgZXF1YWxzIHRvIG9yaWdpbmFsIHF1ZXJ5LXJvd3MgaW5wdXRcbiAgICAgIC8vIHF1ZXJ5X3Jvd3Mgd2lsbCBiZSB0aGUgdmFsdWUgaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUucXVlcnlSb3dzKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cylcbiAgICAgICAgJiYgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5xdWVyeVJvd3MgPT09IHRoaXMub3JpZ2luYWxRdWVyeVJvd3MpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLnF1ZXJ5Um93cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5fc2VsZWN0aW9uKSkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpLCBbXSwgdHJ1ZSwgdGhpcy5jb21wYXJlUm93KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uO1xuICB9XG5cbiAgdXBkYXRlU3RhdGVFeHBhbmRlZENvbHVtbigpIHtcbiAgICBpZiAoIXRoaXMudGFibGVSb3dFeHBhbmRhYmxlPy5leHBhbmRhYmxlQ29sdW1uVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdID09PSBDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QgJiZcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMV0gIT09IENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuc3BsaWNlKDEsIDAsIENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uc1swXSAhPT0gQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpO1xuICAgIH1cblxuICB9XG5cbiAgcmVnaXN0ZXJUYWJMaXN0ZW5lcigpIHtcbiAgICAvLyBXaGVuIHRhYmxlIGlzIGNvbnRhaW5lZCBpbnRvIHRhYiBjb21wb25lbnQsIGl0IGlzIG5lY2Vzc2FyeSB0byBpbml0IHRhYmxlIGNvbXBvbmVudCB3aGVuIGF0dGFjaGVkIHRvIERPTS5cbiAgICB0aGlzLnRhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy50YWJHcm91cENvbnRhaW5lci5zZWxlY3RlZFRhYkNoYW5nZS5zdWJzY3JpYmUoKGV2dCkgPT4ge1xuICAgICAgbGV0IGludGVydmFsO1xuICAgICAgY29uc3QgdGltZXJDYWxsYmFjayA9ICh0YWI6IE1hdFRhYikgPT4ge1xuICAgICAgICBpZiAodGFiICYmIHRhYi5jb250ZW50LmlzQXR0YWNoZWQpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICBpZiAodGFiID09PSB0aGlzLnRhYkNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5pbnNpZGVUYWJCdWdXb3JrYXJvdW5kKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nUXVlcnkpIHtcbiAgICAgICAgICAgICAgdGhpcy5xdWVyeURhdGEodGhpcy5wZW5kaW5nUXVlcnlGaWx0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB0aW1lckNhbGxiYWNrKGV2dC50YWIpOyB9LCAxMDApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc2lkZVRhYkJ1Z1dvcmthcm91bmQoKSB7XG4gICAgdGhpcy5yZWZyZXNoU29ydEhlYWRlcnMoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyU29ydExpc3RlbmVyKCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNvcnQpKSB7XG4gICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24gPSB0aGlzLnNvcnQub1NvcnRDaGFuZ2Uuc3Vic2NyaWJlKHRoaXMub25Tb3J0Q2hhbmdlLmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5zb3J0LnNldE11bHRpcGxlU29ydCh0aGlzLm11bHRpcGxlU29ydCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnRpbmdTdWJqZWN0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgLyogdGhlIGxvYWRpbmdTb3J0aW5nU3ViamVjdCBub3QgcmVmcmVzaCBpbiB0aGUgdGVtcGxhdGVcbiAgICBiZWNhdXNlIGNoYW5nZSBkZXRlY3Rpb24gbm90IHdvcmtpbmcgd2l0aCB2aXJ0dWFsIHNjcm9sbGluZyAqL1xuICAgIGNvbnN0IG5nWm9uZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XG4gICAgaWYgKG5nWm9uZSkge1xuICAgICAgbmdab25lLnJ1bigoKSA9PiB0aGlzLmxvYWRpbmdTb3J0aW5nU3ViamVjdC5uZXh0KHZhbHVlKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2FkaW5nU29ydGluZ1N1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgICBpZiAodGhpcy5jZCAmJiAhKHRoaXMuY2QgYXMgVmlld1JlZikuZGVzdHJveWVkKSB7XG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblNvcnRDaGFuZ2Uoc29ydEFycmF5OiBhbnlbXSkge1xuICAgIHRoaXMuc29ydENvbEFycmF5ID0gW107XG4gICAgc29ydEFycmF5LmZvckVhY2goKHNvcnQpID0+IHtcbiAgICAgIGlmIChzb3J0LmRpcmVjdGlvbiAhPT0gJycpIHtcbiAgICAgICAgdGhpcy5zb3J0Q29sQXJyYXkucHVzaCh7XG4gICAgICAgICAgY29sdW1uTmFtZTogc29ydC5pZCxcbiAgICAgICAgICBhc2NlbmRlbnQ6IHNvcnQuZGlyZWN0aW9uID09PSBDb2Rlcy5BU0NfU09SVFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlU29ydGluZ1N1YmplY3QodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGF0YXNvdXJjZSgpIHtcbiAgICAvL0RlbGV0ZWQgcHJldmlvdXMgaW5zdGFuY2UgYW5kIHN1YnNjcmliZXJzXG4gICAgZGVsZXRlIHRoaXMuZGF0YVNvdXJjZTtcbiAgICBpZiAodGhpcy5vblJlbmRlcmVkRGF0YUNoYW5nZSkgdGhpcy5vblJlbmRlcmVkRGF0YUNoYW5nZS51bnN1YnNjcmliZSgpO1xuXG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChPVGFibGVEYXRhU291cmNlU2VydmljZSk7XG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZVNlcnZpY2UuZ2V0SW5zdGFuY2UodGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlckRhdGFTb3VyY2VMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyU29ydExpc3RlbmVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJEYXRhU291cmNlTGlzdGVuZXJzKCkge1xuICAgIHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UgPSB0aGlzLmRhdGFTb3VyY2Uub25SZW5kZXJlZERhdGFDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc3RvcEVkaXRpb24oKTtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZEl0ZW1EYXRhKCk7XG4gICAgICBpZiAoIXRoaXMucGFnZWFibGUpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nU3ViamVjdChmYWxzZSk7XG4gICAgICAgICAgaWYgKHRoaXMuY2QgJiYgISh0aGlzLmNkIGFzIFZpZXdSZWYpLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MDApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9UYWJsZUNvbXBvbmVudC5FWFBBTkRFRF9ST1dfQ09OVEFJTkVSX0NMQVNTICsgcm93SW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwYW5kYWJsZUl0ZW1zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIGV4cGFuZGFibGUgcm93LlxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dFeHBhbmRhYmxlKGl0ZW06IGFueSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0udG9nZ2xlKGl0ZW0pO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5nZXRWYWx1ZSgpLmZpbmRJbmRleCgocm93KSA9PiB0aGlzLmtleXNBcnJheS5ldmVyeShrZXkgPT4gcm93W2tleV0gPT09IGl0ZW1ba2V5XSkpO1xuXG4gICAgaWYgKHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0pIHtcbiAgICAgIHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0uZGV0YWNoKCk7XG4gICAgfVxuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gdGhpcy5nZXRTdGF0ZUV4cGFuZChpdGVtKSA9PT0gJ2NvbGxhcHNlZCc7XG4gICAgY29uc3QgZXZlbnRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2UgPSB0aGlzLmVtaXRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2VFdmVudChpdGVtLCByb3dJbmRleCk7XG4gICAgaWYgKGlzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5vbkNvbGxhcHNlZC5lbWl0KGV2ZW50VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuJyArIHRoaXMuZ2V0RXhwYW5kZWRSb3dDb250YWluZXJDbGFzcyhyb3dJbmRleCkpO1xuICAgICAgdGhpcy5wb3J0YWxIb3N0W3Jvd0luZGV4XSA9IG5ldyBEb21Qb3J0YWxPdXRsZXQoXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuYXBwUmVmLFxuICAgICAgICB0aGlzLmluamVjdG9yXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZVBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS50ZW1wbGF0ZVJlZiwgdGhpcy5fdmlld0NvbnRhaW5lclJlZiwgeyAkaW1wbGljaXQ6IGl0ZW0gfSk7XG4gICAgICB0aGlzLnBvcnRhbEhvc3Rbcm93SW5kZXhdLmF0dGFjaFRlbXBsYXRlUG9ydGFsKHRlbXBsYXRlUG9ydGFsKTtcbiAgICAgIHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLm9uRXhwYW5kZWQuZW1pdChldmVudFRhYmxlUm93RXhwYW5kYWJsZUNoYW5nZSk7XG4gICAgfVxuXG4gIH1cblxuICBzYXZlUm93RXhwYW5kU3RhdGUoYWRkZWQ6IGFueVtdLCByZW1vdmVkOiBhbnlbXSkge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3MgPz8gW107XG5cbiAgICBjb25zdCBleHRyYWN0S2V5cyA9IChpdGVtOiBhbnkpID0+XG4gICAgICBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoaXRlbSkuZmlsdGVyKChba2V5XSkgPT4gdGhpcy5rZXlzQXJyYXkuaW5jbHVkZXMoa2V5KSkpO1xuXG4gICAgY29uc3QgaXNTYW1lUm93ID0gdGhpcy5jb21wYXJlUm93KCk7XG5cbiAgICAvLyBBZGQgZXhwYW5kYWJsZSBpdGVtc1xuICAgIGlmIChhZGRlZD8ubGVuZ3RoKSB7XG4gICAgICBhZGRlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0VmFsdWUoKS5maW5kSW5kZXgocm93ID0+IGlzU2FtZVJvdyhyb3csIGl0ZW0pKTtcbiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IHN0YXRlLnNvbWUoc3RhdGVJdGVtID0+IGlzU2FtZVJvdyhzdGF0ZUl0ZW0ua2V5cywgaXRlbSkpO1xuXG4gICAgICAgIGlmIChyb3dJbmRleCAhPT0gLTEgJiYgIWFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICBzdGF0ZS5wdXNoKHsga2V5czogZXh0cmFjdEtleXMoaXRlbSkgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBleHBhbmRhYmxlIGl0ZW1zXG4gICAgaWYgKHJlbW92ZWQ/Lmxlbmd0aCkge1xuICAgICAgcmVtb3ZlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gc3RhdGUuZmluZEluZGV4KHN0YXRlSXRlbSA9PiBpc1NhbWVSb3coc3RhdGVJdGVtLmtleXMsIGl0ZW0pKTtcbiAgICAgICAgaWYgKGluZGV4VG9SZW1vdmUgIT09IC0xKSB7XG4gICAgICAgICAgc3RhdGUuc3BsaWNlKGluZGV4VG9SZW1vdmUsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzID0gc3RhdGU7XG4gIH1cblxuICBkZXN0cm95QWxsUG9ydGFsSG9zdHMoKTogdm9pZCB7XG4gICAgdGhpcy5wb3J0YWxIb3N0LmZvckVhY2goaG9zdCA9PiB7XG4gICAgICBpZiAoaG9zdC5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgIGhvc3QuZGV0YWNoKCk7ICAgLy8gRGV0YWNoIHRoZSBwb3J0YWwgY29udGVudFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgcm93IGV4cGFuZGFibGUgYnkgcm93IGluZGV4XG4gICAqIEBwYXJhbSByb3dJbmRleFxuICAgKiBAcGFyYW0gW2V2ZW50XVxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVJvd0V4cGFuZGFibGVCeVJvd0luZGV4KHJvd0luZGV4OiBudW1iZXIsIGV2ZW50PzogRXZlbnQpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRWYWx1ZSgpW3Jvd0luZGV4XTtcbiAgICB0aGlzLnRvZ2dsZVJvd0V4cGFuZGFibGUoaXRlbSwgZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlRXZlbnQoZGF0YSwgcm93SW5kZXgpIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBPVGFibGVSb3dFeHBhbmRlZENoYW5nZSgpO1xuICAgIGV2ZW50LnJvd0luZGV4ID0gcm93SW5kZXg7XG4gICAgZXZlbnQuZGF0YSA9IGRhdGE7XG5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNFeHBhbmRlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5pc1NlbGVjdGVkKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXRlRXhwYW5kKHJvdykge1xuICAgIHJldHVybiB0aGlzLmlzRXhwYW5kZWQocm93KSA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJztcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbHVtbkV4cGFuZGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uKSkgPyB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udmlzaWJsZSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGhhc0V4cGFuZGVkUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSk7XG4gIH1cblxuICBwdWJsaWMgaGFzSW5zZXJ0YWJsZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROdW1WaXNpYmxlQ29sdW1ucygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIG1hbmFnZXMgdGhlIGNhbGwgdG8gdGhlIHNlcnZpY2VcbiAgICogQHBhcmFtIGZpbHRlclxuICAgKiBAcGFyYW0gb3ZyckFyZ3NcbiAgICovXG4gIHF1ZXJ5RGF0YShmaWx0ZXI/OiBhbnksIG92cnJBcmdzPzogT1F1ZXJ5RGF0YUFyZ3MpIHtcbiAgICAvLyBJZiB0YWIgZXhpc3RzIGFuZCBpcyBub3QgYWN0aXZlIHRoZW4gd2FpdCBmb3IgcXVlcnlEYXRhXG4gICAgaWYgKHRoaXMuaXNJbnNpZGVJbmFjdGl2ZVRhYigpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdRdWVyeSA9IHRydWU7XG4gICAgICB0aGlzLnBlbmRpbmdRdWVyeUZpbHRlciA9IGZpbHRlcjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nUXVlcnkgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdRdWVyeUZpbHRlciA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMucXVlcnlDZWxsUmVuZGVyZXJzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHBvcnRhbCBob3N0cyBiZWZvcmUgcmUtcmVuZGVyaW5nIHRvIHByZXZlbnQgZHVwbGljYXRlIG9yIG9ycGhhbmVkIGNvbXBvbmVudHNcbiAgICAgIHRoaXMuZGVzdHJveUFsbFBvcnRhbEhvc3RzKCk7XG4gICAgICBzdXBlci5xdWVyeURhdGEoZmlsdGVyLCBvdnJyQXJncyk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJbnNpZGVJbmFjdGl2ZVRhYigpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGFiQ29udGFpbmVyICYmIHRoaXMudGFiR3JvdXBDb250YWluZXIpIHtcbiAgICAgIHJlc3VsdCA9ICEodGhpcy50YWJDb250YWluZXIuaXNBY3RpdmUgfHwgKHRoaXMudGFiR3JvdXBDb250YWluZXIuc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy50YWJDb250YWluZXIucG9zaXRpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldENvbXBvbmVudEZpbHRlcihleGlzdGluZ0ZpbHRlcjogYW55ID0ge30pOiBhbnkge1xuICAgIGxldCBmaWx0ZXIgPSBleGlzdGluZ0ZpbHRlcjtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJdGVtRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Gcm9tT2JqZWN0KGZpbHRlcik7XG4gICAgICAgIGZpbHRlciA9IHt9O1xuICAgICAgICBmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0gPSBwYXJlbnRJdGVtRXhwcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJlQ29sRmlsdGVyID0gdGhpcy5nZXRDb2x1bW5GaWx0ZXJzRXhwcmVzc2lvbigpO1xuICAgICAgLy8gQWRkIGNvbHVtbiBmaWx0ZXJzIGJhc2ljIGV4cHJlc3Npb24gdG8gY3VycmVudCBmaWx0ZXJcbiAgICAgIGlmIChiZUNvbEZpbHRlciAmJiAhVXRpbC5pc0RlZmluZWQoZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldKSkge1xuICAgICAgICBmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0gPSBiZUNvbEZpbHRlcjtcbiAgICAgIH0gZWxzZSBpZiAoYmVDb2xGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldID1cbiAgICAgICAgICBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRDb21wbGV4RXhwcmVzc2lvbihmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0sIGJlQ29sRmlsdGVyLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0Q29tcG9uZW50RmlsdGVyKGZpbHRlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UXVpY2tGaWx0ZXJFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSAmJiB0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5maWx0ZXJFeHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Q29sdW1uRmlsdGVyc0V4cHJlc3Npb24oKTogRXhwcmVzc2lvbiB7XG4gICAgLy8gQXBwbHkgY29sdW1uIGZpbHRlcnNcbiAgICBjb25zdCBjb2x1bW5GaWx0ZXJzOiBPQ29sdW1uVmFsdWVGaWx0ZXJbXSA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb2x1bW5WYWx1ZUZpbHRlcnMoKTtcbiAgICBjb25zdCBiZUNvbHVtbkZpbHRlcnM6IEFycmF5PEV4cHJlc3Npb24+ID0gW107XG4gICAgY29sdW1uRmlsdGVycy5mb3JFYWNoKGNvbEZpbHRlciA9PiB7XG4gICAgICAvLyBQcmVwYXJlIGJhc2ljIGV4cHJlc3Npb25zXG4gICAgICBzd2l0Y2ggKGNvbEZpbHRlci5vcGVyYXRvcikge1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU46XG4gICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShjb2xGaWx0ZXIudmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgYmVzSW46IEFycmF5PEV4cHJlc3Npb24+ID0gY29sRmlsdGVyLnZhbHVlcy5tYXAodmFsdWUgPT4gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkVxdWFscyhjb2xGaWx0ZXIuYXR0ciwgdmFsdWUpKTtcbiAgICAgICAgICAgIGxldCBiZUluOiBFeHByZXNzaW9uID0gYmVzSW4ucG9wKCk7XG4gICAgICAgICAgICBiZXNJbi5mb3JFYWNoKGJlID0+IHtcbiAgICAgICAgICAgICAgYmVJbiA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKGJlSW4sIGJlLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfT1IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBiZUNvbHVtbkZpbHRlcnMucHVzaChiZUluKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5CRVRXRUVOOlxuICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkoY29sRmlsdGVyLnZhbHVlcykgJiYgY29sRmlsdGVyLnZhbHVlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlRnJvbSA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Nb3JlRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXNbMF0pO1xuICAgICAgICAgICAgY29uc3QgYmVUbyA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25MZXNzRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXNbMV0pO1xuICAgICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oYmVGcm9tLCBiZVRvLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkxpa2UoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXMpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkxFU1NfRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkxlc3NFcXVhbChjb2xGaWx0ZXIuYXR0ciwgY29sRmlsdGVyLnZhbHVlcykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTU9SRV9FUVVBTDpcbiAgICAgICAgICBiZUNvbHVtbkZpbHRlcnMucHVzaChGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uTW9yZUVxdWFsKGNvbEZpbHRlci5hdHRyLCBjb2xGaWx0ZXIudmFsdWVzKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICAvLyBCdWlsZCBjb21wbGV0ZSBjb2x1bW4gZmlsdGVycyBiYXNpYyBleHByZXNzaW9uXG4gICAgbGV0IGJlQ29sRmlsdGVyOiBFeHByZXNzaW9uID0gYmVDb2x1bW5GaWx0ZXJzLnBvcCgpO1xuICAgIGJlQ29sdW1uRmlsdGVycy5mb3JFYWNoKGJlID0+IHtcbiAgICAgIGJlQ29sRmlsdGVyID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oYmVDb2xGaWx0ZXIsIGJlLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmVDb2xGaWx0ZXI7XG4gIH1cblxuICB1cGRhdGVQYWdpbmF0aW9uSW5mbyhxdWVyeVJlczogYW55KSB7XG4gICAgc3VwZXIudXBkYXRlUGFnaW5hdGlvbkluZm8ocXVlcnlSZXMpO1xuICB9XG5cbiAgaW5pdFZpZXdQb3J0KGRhdGE6IGFueVtdKSB7XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQgJiYgZGF0YSkge1xuICAgICAgY29uc3QgaGVhZGVyRWxSZWYgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihoZWFkZXJTZWxlY3Rvcik7XG4gICAgICBjb25zdCBmb290ZXJFbFJlZiA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGZvb3RlclNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHJvd0VsUmVmID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Iocm93U2VsZWN0b3IpO1xuXG4gICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBoZWFkZXJFbFJlZiA/IGhlYWRlckVsUmVmLm9mZnNldEhlaWdodCA6IDA7XG4gICAgICBjb25zdCBmb290ZXJIZWlnaHQgPSBmb290ZXJFbFJlZiA/IGZvb3RlckVsUmVmLm9mZnNldEhlaWdodCA6IDA7XG4gICAgICBjb25zdCByb3dIZWlnaHQgPSByb3dFbFJlZiA/IHJvd0VsUmVmLm9mZnNldEhlaWdodCA6IE9UYWJsZUNvbXBvbmVudC5ERUZBVUxUX1JPV19IRUlHSFQ7XG5cbiAgICAgIC8vIHNldCBjb25maWcgdmlld3BvcnRcbiAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kuc2V0Q29uZmlnKHJvd0hlaWdodCwgaGVhZGVySGVpZ2h0LCBmb290ZXJIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNSZW5kZXJlckRhdGEgIT09IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneS5kYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldERhdGEoZGF0YTogYW55LCBzcWxUeXBlczogYW55KSB7XG4gICAgLyogVGhpcyBjb2RlIGlzIG5vdCBwdXQgaW4gdGhlIHN1cGVyIG1ldGhvZCBiZWNhdXNlIGl0IGlzIG5vdCBjYWxsZWQgZnJvbSB0aGUgY2xhc3MgaXRzZWxmICovXG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kYXRhU2VydmljZT8ucmVpbml0aWFsaXplUGFnaW5hdGlvbkNvbnRleHQodGhpcy5xdWVyeVJvd3MpO1xuICAgIH1cblxuICAgIHRoaXMuZGFvVGFibGUuc3FsVHlwZXNDaGFuZ2UubmV4dChzcWxUeXBlcyk7XG4gICAgdGhpcy5kYW9UYWJsZS5zZXREYXRhQXJyYXkoZGF0YSk7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25QYWdpbmF0ZWREYXRhTG9hZGVkLCBkYXRhKTtcbiAgICB9XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkRhdGFMb2FkZWQsIHRoaXMuZGFvVGFibGUuZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuU2V0U3RhdGljRGF0YShzdGF0aWNEYXRhKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmNhblNldFN0YXRpY0RhdGEoc3RhdGljRGF0YSkgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5kYW9UYWJsZSk7XG4gIH1cblxuICBzaG93RGlhbG9nRXJyb3IoZXJyb3I6IHN0cmluZywgZXJyb3JPcHRpb25hbD86IHN0cmluZykge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChlcnJvcikgJiYgIVV0aWwuaXNPYmplY3QoZXJyb3IpKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyb3JPcHRpb25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvamVjdENvbnRlbnRDaGFuZ2VkKCkge1xuICAgIHRoaXMubG9hZGluZ1Njcm9sbFN1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICB0aGlzLmluaXRWaWV3UG9ydCh0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhKTtcblxuICAgIGlmICh0aGlzLnByZXZpb3VzUmVuZGVyZXJEYXRhICE9PSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhKSB7XG4gICAgICB0aGlzLnByZXZpb3VzUmVuZGVyZXJEYXRhID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YTtcbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25Db250ZW50Q2hhbmdlLCB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3Rpb24gJiYgdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jaGVja1NlbGVjdGVkSXRlbURhdGEoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWZyZXNoRXhwYW5kYWJsZVJvd1N0YXRlKSB7XG4gICAgICB0aGlzLnJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNlbGVjdGlvbkl0ZW1zID0gdGhpcy5zdGF0ZS5leHBhbmRhYmxlUm93cz8uc2xpY2UoKSB8fCBbXVxuICAgICAgdGhpcy5leHBhbmRhYmxlSXRlbT8uY2xlYXIoKTtcbiAgICAgIHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3MgPSBzZWxlY3Rpb25JdGVtcztcbiAgICAgIHRoaXMucmVzdG9yZUV4cGFuZGFibGVSb3dTdGF0ZSgpO1xuICAgIH1cblxuICB9XG5cbiAgcmVzdG9yZUV4cGFuZGFibGVSb3dTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50YWJsZVJvd0V4cGFuZGFibGUgJiYgdGhpcy5zdGF0ZT8uZXhwYW5kYWJsZVJvd3MpIHtcbiAgICAgIHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3MuZm9yRWFjaChleHBhbmRhYmxlUm93ID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UmVuZGVyZWRWYWx1ZSgpOztcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgY29uc3Qgcm93SW5kZXggPSBkYXRhLmZpbmRJbmRleCgocm93KSA9PiB0aGlzLmtleXNBcnJheS5ldmVyeShrZXkgPT4gcm93W2tleV0gPT09IGV4cGFuZGFibGVSb3cua2V5c1trZXldKSk7XG4gICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gcm93SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUm93RXhwYW5kYWJsZShkYXRhW3Jvd0luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVzVmFsdWVzVG9RdWVyeSgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb2x1bW5zID0gc3VwZXIuZ2V0QXR0cmlidXRlc1ZhbHVlc1RvUXVlcnkoKTtcbiAgICBpZiAodGhpcy5hdm9pZFF1ZXJ5Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gY29sdW1ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBjb2wgPSBjb2x1bW5zW2ldO1xuICAgICAgICBpZiAodGhpcy5hdm9pZFF1ZXJ5Q29sdW1ucy5pbmRleE9mKGNvbCkgIT09IC0xKSB7XG4gICAgICAgICAgY29sdW1ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICBnZXRRdWVyeUFyZ3VtZW50cyhmaWx0ZXI6IG9iamVjdCwgb3ZyckFyZ3M/OiBPUXVlcnlEYXRhQXJncyk6IE9RdWVyeVBhcmFtcyB7XG4gICAgY29uc3QgcXVlcnlBcmd1bWVudHMgPSBzdXBlci5nZXRRdWVyeUFyZ3VtZW50cyhmaWx0ZXIsIG92cnJBcmdzKTtcbiAgICBxdWVyeUFyZ3VtZW50cy5zcWxUeXBlcyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0U3FsVHlwZXNGb3JGaWx0ZXIocXVlcnlBcmd1bWVudHMuY29sdW1ucyksXG4gICAgICAuLi5vdnJyQXJncyA/IG92cnJBcmdzLnNxbHR5cGVzIHx8IHt9IDoge31cbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHF1ZXJ5QXJndW1lbnRzLnNvcnQgPSB0aGlzLnNvcnRDb2xBcnJheTtcbiAgICAgIGlmICh0aGlzLnBhZ2luYXRvci5pc1Nob3dpbmdBbGxSb3dzKG92cnJBcmdzPy5vZmZzZXQpICYmIHRoaXMuc3RhdGU/LnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyKSB7XG4gICAgICAgIHF1ZXJ5QXJndW1lbnRzLm92cnJBcmdzLmxlbmd0aCA9IHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWVyeUFyZ3VtZW50cztcbiAgfVxuXG4gIGdldFNxbFR5cGVzRm9yRmlsdGVyKGZpbHRlcik6IG9iamVjdCB7XG4gICAgY29uc3QgYWxsU3FsVHlwZXMgPSB0aGlzLmdldFNxbFR5cGVzKCk7XG4gICAgY29uc3Qgc3FsVHlwZXMgPSB7fTtcbiAgICBpZiAoIVV0aWwuaXNPYmplY3RFbXB0eShmaWx0ZXIpKSB7XG4gICAgICBPYmplY3Qua2V5cyhhbGxTcWxUeXBlcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmluZGV4T2Yoa2V5KSAhPT0gLTEgJiYgYWxsU3FsVHlwZXNba2V5XSAhPT0gU1FMVHlwZXMuT1RIRVIpIHtcbiAgICAgICAgICBzcWxUeXBlc1trZXldID0gYWxsU3FsVHlwZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzcWxUeXBlcztcbiAgfVxuXG4gIG9uRXhwb3J0QnV0dG9uQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25FeHBvcnRCdXR0b25DbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VDb2x1bW5zVmlzaWJpbGl0eUNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uQ2hhbmdlQ29sdW1uc1Zpc2liaWxpdHlDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25NYXRUYWJsZUNvbnRlbnRDaGFuZ2VkKCkge1xuICAgIC8vXG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgbmF2aWdhdGlvbiB0byBuZXcgaXRlbSBpbnNlcnRpb25cbiAgICovXG4gIGFkZCgpIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgaWYgKHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX0lOU0VSVCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuaW5zZXJ0RGV0YWlsKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBzZWxlY3RlZCByb3dzXG4gICAqIEBwYXJhbSBbY2xlYXJTZWxlY3RlZEl0ZW1zXVxuICAgKi9cbiAgcmVtb3ZlKGNsZWFyU2VsZWN0ZWRJdGVtczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9ERUxFVEUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY29uZmlybSgnQ09ORklSTScsICdNRVNTQUdFUy5DT05GSVJNX0RFTEVURScpLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVNlcnZpY2UgJiYgKHRoaXMuZGVsZXRlTWV0aG9kIGluIHRoaXMuZGF0YVNlcnZpY2UpICYmIHRoaXMuZW50aXR5ICYmICh0aGlzLmtleXNBcnJheS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBTZXJ2aWNlVXRpbHMuZ2V0QXJyYXlQcm9wZXJ0aWVzKHNlbGVjdGVkSXRlbXMsIHRoaXMua2V5c0FycmF5KTtcbiAgICAgICAgICBjb25zdCBzcWxUeXBlc0FyZyA9IHRoaXMuZ2V0U3FsVHlwZXNPZktleXMoKTtcbiAgICAgICAgICB0aGlzLmRhb1RhYmxlLnJlbW92ZVF1ZXJ5KGZpbHRlcnMsIHNxbFR5cGVzQXJnKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5leHQ6ICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblJvd0RlbGV0ZWQsIHNlbGVjdGVkSXRlbXMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dEaWFsb2dFcnJvcihlLCAnTUVTU0FHRVMuRVJST1JfREVMRVRFJyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRW5zdXJpbmcgdGhhdCB0aGUgZGVsZXRlZCBpdGVtcyB3aWxsIG5vdCBsb25nZXIgYmUgcGFydCBvZiB0aGUgc2VsZWN0aW9uTW9kZWxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdChpdGVtKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5jbG9zZURldGFpbHMoZmlsdGVycywgeyBleGl0V2l0aG91dENvbmZpcm1hdGlvbjogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZWxldGVMb2NhbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2xlYXJTZWxlY3RlZEl0ZW1zKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hzIHRhYmxlIGNvbXBvbmVudFxuICAgKi9cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhbmQgc2VsZWN0IGFsbCBjaGVja2JveFxuICAgKi9cbiAgc2hvd0FuZFNlbGVjdEFsbENoZWNrYm94KCkge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKCkpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdEFsbENoZWNrYm94KSB7XG4gICAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplQ2hlY2tib3hDb2x1bW4oKTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkUGFnaW5hdGVkRGF0YUZyb21TdGFydChjbGVhclNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIC8vIEluaXRpYWxpemUgcGFnZSBpbmRleFxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XG4gICAgICB0aGlzLnJlbG9hZERhdGEoY2xlYXJTZWxlY3RlZEl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkcyBkYXRhXG4gICAqL1xuICByZWxvYWREYXRhKGNsZWFyU2VsZWN0ZWRJdGVtczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLnJlbG9hZERhdGFXaXRoQ2xlYXJFeHBhbmRhYmxlUm93cyhjbGVhclNlbGVjdGVkSXRlbXMsIGNsZWFyU2VsZWN0ZWRJdGVtcylcbiAgfVxuXG4gIHJlbG9hZERhdGFXaXRoQ2xlYXJFeHBhbmRhYmxlUm93cyhjbGVhclNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSB0cnVlLCBjbGVhckV4cGFuZGFibGVJdGVtczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9SRUZSRVNIKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkge1xuICAgICAgaWYgKGNsZWFyRXhwYW5kYWJsZUl0ZW1zKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0/LmNsZWFyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLnJlZnJlc2hTZWxlY3Rpb24oKTtcblxuICAgIGlmIChjbGVhclNlbGVjdGVkSXRlbXMpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1F1ZXJ5ID0gdHJ1ZTtcbiAgICBsZXQgcXVlcnlBcmdzOiBPUXVlcnlEYXRhQXJncztcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgcXVlcnlBcmdzID0ge1xuICAgICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cyxcbiAgICAgICAgbGVuZ3RoOiB0aGlzLnF1ZXJ5Um93c1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5zdG9wRWRpdGlvbihmYWxzZSk7XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogT0NvbHVtbiwgcm93SW5kZXg6IG51bWJlciwgY2VsbFJlZjogRWxlbWVudFJlZiwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNsaWNrU3ViamVjdC5uZXh0KHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KTtcbiAgfVxuXG4gIGRvSGFuZGxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogc3RyaW5nLCByb3dJbmRleDogbnVtYmVyLCAkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSAmJiB0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub2VuYWJsZWQgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoKHRoaXMuZGV0YWlsTW9kZSA9PT0gQ29kZXMuREVUQUlMX01PREVfQ0xJQ0spKSB7XG5cbiAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmlzTmF2aWdhdGluZykgcmV0dXJuO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc05hdmlnYXRpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgICAgIHRoaXMuc2F2ZURhdGFOYXZpZ2F0aW9uSW5Mb2NhbFN0b3JhZ2UoKTtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICAgIHRoaXMudmlld0RldGFpbChyb3cpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpICYmICgkZXZlbnQuY3RybEtleSB8fCAkZXZlbnQubWV0YUtleSkpIHtcbiAgICAgIC8vIFRPRE86IHRlc3QgJGV2ZW50Lm1ldGFLZXkgb24gTUFDXG4gICAgICB0aGlzLnNlbGVjdGVkUm93KHJvdyk7XG4gICAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKSAmJiAkZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24ocm93KTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xuICAgICAgaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChyb3cpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAxICYmIHRoaXMuZWRpdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbkFuZEVkaXRpbmcoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICAgIHRoaXMub25DbGljay5lbWl0KHsgcm93OiByb3csIHJvd0luZGV4OiByb3dJbmRleCwgbW91c2VFdmVudDogJGV2ZW50LCBjb2x1bW5OYW1lOiBjb2x1bW4sIGNlbGw6IHJvd1tjb2x1bW5dIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKGl0ZW06IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuaW5kZXhPZih0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZFswXSk7XG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5pbmRleE9mKGl0ZW0pO1xuICAgICAgY29uc3QgaW5kZXhGcm9tID0gTWF0aC5taW4oZmlyc3QsIGxhc3QpO1xuICAgICAgY29uc3QgaW5kZXhUbyA9IE1hdGgubWF4KGZpcnN0LCBsYXN0KTtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuc2xpY2UoaW5kZXhGcm9tLCBpbmRleFRvICsgMSkuZm9yRWFjaChlID0+IHRoaXMuc2VsZWN0ZWRSb3coZSkpO1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkNsaWNrLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCkge1xuICAgIHN1cGVyLnNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCk7XG4gICAgdGhpcy5zdG9yZVBhZ2luYXRpb25TdGF0ZSA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVEb3VibGVDbGljayhyb3c6IGFueSwgY29sdW1uOiBPQ29sdW1uLCByb3dJbmRleDogbnVtYmVyLCBjZWxsUmVmOiBFbGVtZW50UmVmLCBldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuZGJsY2xpY2tTdWJqZWN0Lm5leHQoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pO1xuICB9XG5cbiAgZ2V0IGVkaXRpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29tZShpdGVtID0+IGl0ZW0uZWRpdGluZyk7XG4gIH1cblxuICBoYW5kbGVET01DbGljayhldmVudCkge1xuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRpdGlvbkVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5Q29udGFpbmVyID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjZGstb3ZlcmxheS1jb250YWluZXInKVswXTtcbiAgICBpZiAob3ZlcmxheUNvbnRhaW5lciAmJiBvdmVybGF5Q29udGFpbmVyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuby10YWJsZS1jb250YWluZXInKTtcbiAgICBjb25zdCB0YWJsZUNvbnRlbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm8tdGFibGUtY29udGFpbmVyIHRhYmxlLm1hdC10YWJsZScpO1xuICAgIGlmICh0YWJsZUNvbnRhaW5lciAmJiB0YWJsZUNvbnRlbnQgJiYgdGFibGVDb250YWluZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhdGFibGVDb250ZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnksIGNlbGxSZWY6IGFueSkge1xuICAgIGlmIChjZWxsUmVmICYmIGNvbHVtbi5lZGl0aW5nICYmIHRoaXMuZWRpdGluZ0NlbGwgPT09IGNlbGxSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uUGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IHRoaXMuZ2V0T0NvbHVtblBlcm1pc3Npb25zKGNvbHVtbi5hdHRyKTtcbiAgICBpZiAoY29sdW1uUGVybWlzc2lvbnMuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHtjb2x1bW4uYXR0cn0gZWRpdGlvbiBub3QgYWxsb3dlZCBkdWUgdG8gcGVybWlzc2lvbnNgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uQW5kRWRpdGluZygpO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICB0aGlzLmVkaXRpbmdDZWxsID0gY2VsbFJlZjtcbiAgICBjb25zdCByb3dEYXRhID0ge307XG4gICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICByb3dEYXRhW2tleV0gPSByb3dba2V5XTtcbiAgICB9KTtcbiAgICByb3dEYXRhW2NvbHVtbi5hdHRyXSA9IHJvd1tjb2x1bW4uYXR0cl07XG4gICAgdGhpcy5lZGl0aW5nUm93ID0gcm93O1xuICAgIGNvbHVtbi5lZGl0aW5nID0gdHJ1ZTtcbiAgICBjb2x1bW4uZWRpdG9yLnN0YXJ0RWRpdGlvbihyb3dEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZUNlbGxEYXRhKGNvbHVtbjogT0NvbHVtbiwgZGF0YTogYW55LCBzYXZlQ2hhbmdlczogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX1VQREFURSkpIHtcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBPYnNlcnZhYmxlKGlubmVyT2JzZXJ2ZXIgPT4ge1xuICAgICAgICBpbm5lck9ic2VydmVyLmVycm9yKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGNvbHVtbi5lZGl0aW5nID0gZmFsc2U7XG4gICAgaWYgKHNhdmVDaGFuZ2VzICYmIHRoaXMuZWRpdGluZ1JvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZWRpdGluZ1JvdywgZGF0YSk7XG4gICAgfVxuICAgIHRoaXMuc3RvcEVkaXRpb24oKTtcbiAgICBpZiAoc2F2ZUNoYW5nZXMgJiYgY29sdW1uLmVkaXRvci51cGRhdGVSZWNvcmRPbkVkaXQpIHtcbiAgICAgIGNvbnN0IHRvVXBkYXRlID0ge307XG4gICAgICB0b1VwZGF0ZVtjb2x1bW4uYXR0cl0gPSBkYXRhW2NvbHVtbi5hdHRyXTtcbiAgICAgIGNvbnN0IGt2ID0gdGhpcy5leHRyYWN0S2V5c0Zyb21SZWNvcmQoZGF0YSk7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVSZWNvcmQoa3YsIHRvVXBkYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRLZXlzVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gZGF0YS5tYXAoKHJvdykgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICB0aGlzLmtleXNBcnJheS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKHJvd1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IHJvd1trZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2hvd3NTZWxlY3RzKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vblNob3dzU2VsZWN0cygpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemVDaGVja2JveENvbHVtbigpIHtcbiAgICAvLyBJbml0aWFsaXppbmcgcm93IHNlbGVjdGlvbiBsaXN0ZW5lclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gJiYgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLnN1YnNjcmliZSgoc2VsZWN0aW9uRGF0YTogU2VsZWN0aW9uQ2hhbmdlPGFueT4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyAmJiBzZWxlY3Rpb25EYXRhKSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEuYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblJvd1NlbGVjdGVkLCBzZWxlY3Rpb25EYXRhLmFkZGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEucmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uUm93RGVzZWxlY3RlZCwgc2VsZWN0aW9uRGF0YS5yZW1vdmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkNvbHVtblN0YXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0aW9uQ29sdW1uU3RhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zICYmIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcbiAgICAgICYmIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMF0gIT09IENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zICYmICF0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXG4gICAgICAmJiB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdID09PSBDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTdGF0ZUV4cGFuZGVkQ29sdW1uKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZSA/IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuZmlsdGVyKHggPT4gIXRoaXMuaXNEaXNhYmxlQ2hlY2tib3goeCkgJiYgdGhpcy5pc1Jvd1NlbGVjdGVkKHgpKS5sZW5ndGggOiAwO1xuICB9XG5cbiAgcHVibGljIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLmdldE51bVJvd1NlbGVjdGVkSW5DdXJyZW50RGF0YSgpO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UgPyB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhLmxlbmd0aCA6IDA7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID4gMCAmJiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcbiAgfVxuXG4gIHB1YmxpYyBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLmdldE51bVJvd1NlbGVjdGVkSW5DdXJyZW50RGF0YSgpO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UgPyB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhLmxlbmd0aCA6IDA7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID4gMCAmJiBudW1Sb3dzID4gMCAmJiBudW1TZWxlY3RlZCAhPT0gbnVtUm93cztcbiAgfVxuXG4gIHB1YmxpYyBtYXN0ZXJUb2dnbGUoZXZlbnQ6IE1hdENoZWNrYm94Q2hhbmdlKTogdm9pZCB7XG4gICAgZXZlbnQuY2hlY2tlZCA/IHRoaXMuc2VsZWN0QWxsKCkgOiB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuZm9yRWFjaChyb3cgPT4gdGhpcy5zZXRTZWxlY3RlZChyb3cpKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3Rpb25DaGVja2JveFRvZ2dsZShldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UsIHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlU2luZ2xlKCkpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgZXZlbnQuY2hlY2tlZCA/IHRoaXMuc2VsZWN0ZWRSb3cocm93KSA6IHRoaXMuc2VsZWN0aW9uLmRlc2VsZWN0KHJvdyk7XG4gICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RlZFJvdyhyb3c6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2V0U2VsZWN0ZWQocm93KTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0aW9uID0gW107XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFNlbGVjdGVkKGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZUNoZWNrYm94KGl0ZW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzUm93U2VsZWN0ZWQoaXRlbSkpIHtcbiAgICAgIC8qKlRoZSBzZWxlY3RlZCBpdGVtIGlzIGNsZWFyZWQgaWYgdGhlIGl0ZW0gY2hhbmdlcyB2YWx1ZSovXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcihpdGVtKTtcbiAgICB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgc2V0U2VsZWN0ZWRCeUtleXMoa2V5VmFsdWVzOiBBcnJheTxhbnk+KSB7XG4gICAgY29uc3Qgcm93c1RvU2VsZWN0ID0gdGhpcy5nZXREYXRhQXJyYXkoKS5maWx0ZXIocm93ID0+IHtcbiAgICAgIHJldHVybiBrZXlWYWx1ZXMuZmluZEluZGV4KGtleVZhbHVlID0+IHJvd1t0aGlzLmtleXNdID09PSBrZXlWYWx1ZSkgPiAtMTtcbiAgICB9KTtcbiAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoLi4ucm93c1RvU2VsZWN0KTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkQnlNdWx0aXBsZUtleXMoa2V5VmFsdWVzOiBBcnJheTxPYmplY3Q+KSB7XG4gICAgY29uc3Qgcm93c1RvU2VsZWN0ID0gdGhpcy5nZXREYXRhQXJyYXkoKS5maWx0ZXIocm93ID0+IHtcbiAgICAgIHJldHVybiBrZXlWYWx1ZXMuZmluZEluZGV4KGtleVZhbHVlID0+XG4gICAgICAgIE9iamVjdC5rZXlzKGtleVZhbHVlKS5ldmVyeShrZXkgPT4ga2V5VmFsdWVba2V5XSA9PT0gcm93W2tleV0pXG4gICAgICApID4gLTE7XG4gICAgfSk7XG4gICAgcm93c1RvU2VsZWN0LmV2ZXJ5KHJvd1RvU2VsZWN0ID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3dUb1NlbGVjdCkpO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWRCeVJvd0lkcyhyb3dJZHM6IEFycmF5PG51bWJlcj4pIHtcbiAgICByb3dJZHMuZm9yRWFjaChyb3dJZCA9PiB0aGlzLnNlbGVjdGVkUm93KHRoaXMuZ2V0RGF0YUFycmF5KClbcm93SWRdKSk7XG4gIH1cblxuICBnZXQgc2hvd0RlbGV0ZUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVCdXR0b247XG4gIH1cblxuICBnZXRUcmFja0J5RnVuY3Rpb24oKTogKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkgPT4gc3RyaW5nIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIHJldHVybiAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiB7XG5cbiAgICAgIGxldCBpdGVtSWQ6IHN0cmluZyA9ICcnO1xuXG4gICAgICBpZiAodGhpcy5pc0dyb3VwKGluZGV4LCBpdGVtKSkge1xuICAgICAgICBpdGVtSWQgKz0gaXRlbS5jb2x1bW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrZXlzTGVuZ2h0ID0gc2VsZi5rZXlzQXJyYXkubGVuZ3RoO1xuICAgICAgICBzZWxmLmtleXNBcnJheS5mb3JFYWNoKChrZXk6IHN0cmluZywgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBpZHggPCAoa2V5c0xlbmdodCAtIDEpID8gJzsnIDogJyc7XG4gICAgICAgICAgaXRlbUlkICs9IGl0ZW1ba2V5XSArIHN1ZmZpeDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0FzeW5jQW5kVmlzaWJsZUNvbHMgPSB0aGlzLmFzeW5jTG9hZENvbHVtbnMuc29tZShjID0+IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuaW5jbHVkZXMoYykpO1xuICAgICAgaWYgKHNlbGYuYXN5bmNMb2FkQ29sdW1ucy5sZW5ndGggJiYgaGFzQXN5bmNBbmRWaXNpYmxlQ29scyAmJiAhc2VsZi5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbikge1xuICAgICAgICBzZWxmLnF1ZXJ5Um93QXN5bmNEYXRhKGluZGV4LCBpdGVtKTtcbiAgICAgICAgaWYgKHNlbGYucGFnaW5hdG9yICYmIGluZGV4ID09PSAoc2VsZi5wYWdpbmF0b3IucGFnZVNpemUgLSAxKSkge1xuICAgICAgICAgIHNlbGYuZmluaXNoUXVlcnlTdWJzY3JpcHRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXRlbUlkO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBxdWVyeVJvd0FzeW5jRGF0YShyb3dJbmRleDogbnVtYmVyLCByb3dEYXRhOiBhbnkpIHtcbiAgICBjb25zdCBrdiA9IFNlcnZpY2VVdGlscy5nZXRPYmplY3RQcm9wZXJ0aWVzKHJvd0RhdGEsIHRoaXMua2V5c0FycmF5KTtcbiAgICAvLyBSZXBlYXRpbmcgY2hlY2tpbmcgb2YgdmlzaWJsZSBjb2x1bW5cbiAgICBjb25zdCBhdiA9IHRoaXMuYXN5bmNMb2FkQ29sdW1ucy5maWx0ZXIoYyA9PiB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmluZGV4T2YoYykgIT09IC0xKTtcbiAgICBpZiAoYXYubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBTa2lwcGluZyBxdWVyeSBpZiB0aGVyZSBhcmUgbm90IHZpc2libGUgYXN5bmNyb24gY29sdW1uc1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5RdWVyeUFyZ3MgPSBba3YsIGF2LCB0aGlzLmVudGl0eSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbiAgICBjb25zdCBxdWVyeU1ldGhvZE5hbWUgPSB0aGlzLnBhZ2VhYmxlID8gdGhpcy5wYWdpbmF0ZWRRdWVyeU1ldGhvZCA6IHRoaXMucXVlcnlNZXRob2Q7XG4gICAgaWYgKHRoaXMuZGF0YVNlcnZpY2UgJiYgKHF1ZXJ5TWV0aG9kTmFtZSBpbiB0aGlzLmRhdGFTZXJ2aWNlKSAmJiB0aGlzLmVudGl0eSkge1xuICAgICAgaWYgKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tyb3dJbmRleF0pIHtcbiAgICAgICAgdGhpcy5hc3luY0xvYWRTdWJzY3JpcHRpb25zW3Jvd0luZGV4XS51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5hc3luY0xvYWRTdWJzY3JpcHRpb25zW3Jvd0luZGV4XSA9IHRoaXMuZGF0YVNlcnZpY2VbcXVlcnlNZXRob2ROYW1lXSguLi5jb2x1bW5RdWVyeUFyZ3MpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlczogU2VydmljZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICAgICAgbGV0IGRhdGE7XG4gICAgICAgICAgICBpZiAoVXRpbC5pc0FycmF5KHJlcy5kYXRhKSAmJiByZXMuZGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgZGF0YSA9IHJlcy5kYXRhWzBdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChVdGlsLmlzT2JqZWN0KHJlcy5kYXRhKSkge1xuICAgICAgICAgICAgICBkYXRhID0gcmVzLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhb1RhYmxlLnNldEFzeW5jaHJvbm91c0NvbHVtbihkYXRhLCByb3dEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIHRhYmxlIGRhdGEuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldEN1cnJlbnREYXRhKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB2YWx1ZXNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEFsbFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldEN1cnJlbnRBbGxEYXRhKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCByZW5kZXJlZCB2YWx1ZXNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEFsbFJlbmRlcmVkVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0QWxsUmVuZGVyZXJEYXRhKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcmVuZGVyZXIgZGF0YS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFJlbmRlcmVkVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRDdXJyZW50UmVuZGVyZXJEYXRhKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXRzIHNxbCB0eXBlcyBmcm9tIGRhdGEgc291cmNlIGFuZCB0YWJsZSBjb2x1bW5zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRTcWxUeXBlcygpIHtcbiAgICBjb25zdCBhbGxTcWxUeXBlcyA9IFV0aWwuaXNEZWZpbmVkKHRoaXMuZGF0YVNvdXJjZS5zcWxUeXBlcykgPyB0aGlzLmRhdGFTb3VyY2Uuc3FsVHlwZXMgOiB7fTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCgoY29sOiBPQ29sdW1uKSA9PiB7XG4gICAgICBpZiAoY29sLnNxbFR5cGUpIHtcbiAgICAgICAgYWxsU3FsVHlwZXNbY29sLmF0dHJdID0gY29sLnNxbFR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFsbFNxbFR5cGVzO1xuICB9XG5cbiAgc2V0T1RhYmxlQ29sdW1uc0ZpbHRlcih0YWJsZUNvbHVtbnNGaWx0ZXI6IE9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQgPSB0YWJsZUNvbHVtbnNGaWx0ZXI7XG4gIH1cblxuICBnZXQgZmlsdGVyQ29sdW1ucygpOiBPRmlsdGVyQ29sdW1uW10ge1xuICAgIGlmICh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmZpbHRlckNvbHVtbnMgPT09IHRoaXMub3JpZ2luYWxGaWx0ZXJDb2x1bW5zXG4gICAgICAmJiB0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsRmlsdGVyQ29sdW1ucztcbiAgfVxuXG4gIGdldCBvcmlnaW5hbEZpbHRlckNvbHVtbnMoKTogQXJyYXk8T0ZpbHRlckNvbHVtbj4ge1xuICAgIGxldCBzb3J0Q29sdW1uc0ZpbHRlciA9IFtdO1xuICAgIGlmICh0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHNvcnRDb2x1bW5zRmlsdGVyID0gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50LmNvbHVtbnNBcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRDb2x1bW5zRmlsdGVyO1xuICB9XG5cbiAgZ2V0IG9yaWdpbmFsR3JvdXBlZENvbHVtbnNBcnJheSgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gVXRpbC5wYXJzZUFycmF5KHRoaXMuZ3JvdXBlZENvbHVtbnMsIHRydWUpO1xuICB9XG5cbiAgZ2V0U3RvcmVkQ29sdW1uc0ZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc3RvcmVkRmlsdGVycztcbiAgfVxuXG4gIGdldFN0b3JlZEdyb3VwZWRDb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLnN0b3JlZENvbmZpZ3VyYXRpb25zO1xuICB9XG5cbiAgb25GaWx0ZXJCeUNvbHVtbkNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uRmlsdGVyQnlDb2x1bW5DbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25TdG9yZUZpbHRlckNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uU3RvcmVGaWx0ZXJDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25Mb2FkRmlsdGVyQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25Mb2FkRmlsdGVyQ2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xlYXJGaWx0ZXJDbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkNsZWFyRmlsdGVyQ2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZmlsdGVycyhjb2x1bW4gZmlsdGVyLCBxdWlja2ZpbHRlciBhbmQgZmlsdGVyIGJ1aWxkZXIpIGFuZCByZWxvYWQgZGF0YVxuICAgKiBAcGFyYW0gW3RyaWdnZXJEYXRhc291cmNlVXBkYXRlXVxuICAgKi9cbiAgY2xlYXJGaWx0ZXJzKHRyaWdnZXJEYXRhc291cmNlVXBkYXRlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuXG4gICAgdGhpcy5kYXRhU291cmNlLmNsZWFyQ29sdW1uRmlsdGVycyh0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZSk7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSAmJiB0aGlzLm9UYWJsZU1lbnUuY29sdW1uRmlsdGVyT3B0aW9uKSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUuY29sdW1uRmlsdGVyT3B0aW9uLnNldEFjdGl2ZSh0aGlzLmlzQ29sdW1uRmlsdGVyc0FjdGl2ZSk7XG4gICAgfVxuICAgIHRoaXMub25GaWx0ZXJCeUNvbHVtbkNoYW5nZS5lbWl0KCk7XG4gICAgaWYgKHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQuc2V0VmFsdWUodm9pZCAwKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJCdWlsZGVyKSB7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIuY2xlYXJGaWx0ZXIoKTtcbiAgICAgIHRoaXMuZmlsdGVyQnVpbGRlci50cmlnZ2VyUmVsb2FkKCk7XG4gICAgfVxuXG4gIH1cblxuICBjbGVhckNvbHVtbkZpbHRlcihhdHRyOiBzdHJpbmcsIHRyaWdnZXJEYXRhc291cmNlVXBkYXRlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5jbGVhckNvbHVtbkZpbHRlcihhdHRyLCB0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZSk7XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICB9XG5cbiAgZmlsdGVyQnlDb2x1bW4oY29sdW1uVmFsdWVGaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcikge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5hZGRDb2x1bW5GaWx0ZXIoY29sdW1uVmFsdWVGaWx0ZXIpO1xuICAgIHRoaXMub25GaWx0ZXJCeUNvbHVtbkNoYW5nZS5lbWl0KCk7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMucmVsb2FkUGFnaW5hdGVkRGF0YUZyb21TdGFydChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJDb2x1bW5GaWx0ZXJzKHRyaWdnZXJEYXRhc291cmNlVXBkYXRlOiBib29sZWFuID0gdHJ1ZSwgY29sdW1uc0F0dHI/OiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5jbGVhckNvbHVtbkZpbHRlcnModHJpZ2dlckRhdGFzb3VyY2VVcGRhdGUsIGNvbHVtbnNBdHRyKTtcbiAgICB0aGlzLm9uRmlsdGVyQnlDb2x1bW5DaGFuZ2UuZW1pdCgpO1xuICAgIHRoaXMucmVsb2FkUGFnaW5hdGVkRGF0YUZyb21TdGFydChmYWxzZSk7XG4gIH1cblxuICBpc0NvbHVtbkZpbHRlcmFibGUoY29sdW1uOiBPQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkgPyB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuaXNDb2x1bW5GaWx0ZXJhYmxlKGNvbHVtbi5hdHRyKSA6IHRoaXMuaXNTZWFyY2hlYWJsZUNvbHVtbihjb2x1bW4pO1xuICB9XG5cbiAgaXNTZWFyY2hlYWJsZUNvbHVtbihjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hlYWJsZUNvbHVtbnMuaW5jbHVkZXMoY29sdW1uLmF0dHIpO1xuICB9XG4gIGlzQ29sdW1uRmlsdGVyQWN0aXZlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQ29sdW1uRmlsdGVyc0FjdGl2ZSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLmRhdGFTb3VyY2UuZ2V0Q29sdW1uVmFsdWVGaWx0ZXJCeUF0dHIoY29sdW1uLmF0dHIpKTtcbiAgfVxuXG4gIG9wZW5Db2x1bW5GaWx0ZXJEaWFsb2coY29sdW1uOiBPQ29sdW1uLCBldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oT1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICB0YWJsZTogdGhpc1xuICAgICAgfSxcbiAgICAgIG1pbldpZHRoOiAnMzgwcHgnLFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgcGFuZWxDbGFzczogWydvLWRpYWxvZy1jbGFzcycsICdvLXRhYmxlLWRpYWxvZyddXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIHN3aXRjaCAocmVzdWx0KSB7XG4gICAgICAgIGNhc2UgVGFibGVGaWx0ZXJCeUNvbHVtbkRpYWxvZ1Jlc3VsdC5BQ0NFUFQ6XG4gICAgICAgICAgY29uc3QgY29sdW1uVmFsdWVGaWx0ZXIgPSBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZ2V0Q29sdW1uVmFsdWVzRmlsdGVyKCk7XG4gICAgICAgICAgdGhpcy5maWx0ZXJCeUNvbHVtbihjb2x1bW5WYWx1ZUZpbHRlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVGFibGVGaWx0ZXJCeUNvbHVtbkRpYWxvZ1Jlc3VsdC5DTEVBUjpcbiAgICAgICAgICBjb25zdCBjb2wgPSBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuY29sdW1uO1xuICAgICAgICAgIHRoaXMuY2xlYXJDb2x1bW5GaWx0ZXIoY29sLmF0dHIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5vblNvcnRGaWx0ZXJWYWx1ZXNDaGFuZ2Uuc3Vic2NyaWJlKHNvcnRlZEZpbHRlcmFibGVDb2x1bW4gPT4ge1xuICAgICAgLy8gZ3VhcmRhciBlbiBsb2NhbHN0b3JhZ2UgZWwgY2FtYmlvXG4gICAgICB0aGlzLnN0b3JlRmlsdGVyQ29sdW1ucyhzb3J0ZWRGaWx0ZXJhYmxlQ29sdW1uKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0b3JlRmlsdGVyQ29sdW1ucyhzb3J0Q29sdW1uRmlsdGVyOiBPRmlsdGVyQ29sdW1uKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucykge1xuICAgICAgLy8gaWYgZXhpc3RzIGluIHN0YXRlIHRoZW4gdXBkYXRlZCBzb3J0IHZhbHVlXG4gICAgICBjb25zdCBmaWx0ZXJDb2x1bW4gPSB0aGlzLmZpbHRlckNvbHVtbnMuZmluZCh4ID0+IHguYXR0ciA9PT0gc29ydENvbHVtbkZpbHRlci5hdHRyKTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChmaWx0ZXJDb2x1bW4pKSB7XG4gICAgICAgIGZpbHRlckNvbHVtbi5zb3J0ID0gc29ydENvbHVtbkZpbHRlci5zb3J0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZWxzZSBleGlzdHMgaW4gc3RhdGUgdGhlbiBhZGRlZCBmaWx0ZXIgY29sdW1uXG4gICAgICAgIHRoaXMuZmlsdGVyQ29sdW1ucy5wdXNoKHNvcnRDb2x1bW5GaWx0ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMgPSB0aGlzLmZpbHRlckNvbHVtbnM7XG4gIH1cblxuICBnZXRTdGFydFZpZXdGaWx0ZXJDb2x1bW4oY29sdW1uOiBPQ29sdW1uKTogJ21vbnRoJyB8ICd5ZWFyJyB8ICdtdWx0aS15ZWFyJyB8ICcnIHtcbiAgICBsZXQgc3RhcnRWaWV3O1xuICAgIC8vIGF0IGZpcnN0LCBnZXQgc3RhdGUgaW4gbG9jYWxzdG9yYWdlXG4gICAgaWYgKHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucykge1xuICAgICAgdGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zLmZvckVhY2goKGVsZW1lbnQ6IE9GaWx0ZXJDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuYXR0ciA9PT0gY29sdW1uLmF0dHIpIHtcbiAgICAgICAgICBzdGFydFZpZXcgPSBlbGVtZW50LnN0YXJ0VmlldztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzdGFydFZpZXcpICYmIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgc3RhcnRWaWV3ID0gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50LmdldFN0YXJ0Vmlld1ZhbHVlT2ZGaWx0ZXJDb2x1bW4oY29sdW1uLmF0dHIpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFydFZpZXc7XG4gIH1cblxuICBnZXRTb3J0RmlsdGVyQ29sdW1uKGNvbHVtbjogT0NvbHVtbik6ICdhc2MnIHwgJ2Rlc2MnIHwgJycge1xuICAgIGxldCBzb3J0Q29sdW1uO1xuICAgIC8vIGF0IGZpcnN0LCBnZXQgc3RhdGUgaW4gbG9jYWxzdG9yYWdlXG4gICAgaWYgKHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucykge1xuICAgICAgY29uc3QgZmlsdGVyQ29sID0gdGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zLmZpbmQoKGVsZW1lbnQ6IE9GaWx0ZXJDb2x1bW4pID0+IGVsZW1lbnQuYXR0ciA9PT0gY29sdW1uLmF0dHIpO1xuICAgICAgaWYgKGZpbHRlckNvbCkge1xuICAgICAgICBzb3J0Q29sdW1uID0gZmlsdGVyQ29sLnNvcnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgbm90IHZhbHVlIGluIGxvY2Fsc3RvcmFnZSwgZ2V0IHNvcnQgdmFsdWUgaW4gby10YWJsZS1jb2x1bW4tZmlsdGVyLWNvbHVtbiBjb21wb25lbnRcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHNvcnRDb2x1bW4pICYmIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgc29ydENvbHVtbiA9IHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudC5nZXRTb3J0VmFsdWVPZkZpbHRlckNvbHVtbihjb2x1bW4uYXR0cik7XG4gICAgfVxuXG4gICAgLy8gaWYgZWl0aGVyIHZhbHVlIGluIG8tdGFibGUtY29sdW1uLWZpbHRlci1jb2x1bW4gb3IgbG9jYWxzdG9yYWdlLCBnZXQgc29ydCB2YWx1ZSBpbiBzb3J0Q29sQXJyYXlcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHNvcnRDb2x1bW4pICYmIHRoaXMuc29ydENvbEFycmF5LmZpbmQoeCA9PiB4LmNvbHVtbk5hbWUgPT09IGNvbHVtbi5hdHRyKSkge1xuICAgICAgc29ydENvbHVtbiA9IHRoaXMuaXNDb2x1bW5Tb3J0QWN0aXZlKGNvbHVtbikgPyAnYXNjJyA6ICdkZXNjJztcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydENvbHVtbjtcbiAgfVxuXG4gIGdldCBkaXNhYmxlVGFibGVNZW51QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBlcm1pc3Npb25zICYmIHRoaXMucGVybWlzc2lvbnMubWVudSAmJiB0aGlzLnBlcm1pc3Npb25zLm1lbnUuZW5hYmxlZCA9PT0gZmFsc2UpO1xuICB9XG5cbiAgZ2V0IHNob3dUYWJsZU1lbnVCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGVybWlzc2lvbkhpZGRlbiA9ICEhKHRoaXMucGVybWlzc2lvbnMgJiYgdGhpcy5wZXJtaXNzaW9ucy5tZW51ICYmIHRoaXMucGVybWlzc2lvbnMubWVudS52aXNpYmxlID09PSBmYWxzZSk7XG4gICAgaWYgKHBlcm1pc3Npb25IaWRkZW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGljT3B0ID0gdGhpcy5zZWxlY3RBbGxDaGVja2JveCB8fCB0aGlzLmV4cG9ydEJ1dHRvbiB8fCB0aGlzLnNob3dDb25maWd1cmF0aW9uT3B0aW9uIHx8IHRoaXMuY29sdW1uc1Zpc2liaWxpdHlCdXR0b24gfHwgKHRoaXMuc2hvd0ZpbHRlck9wdGlvbiAmJiB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHN0YXRpY09wdCB8fCB0aGlzLnRhYmxlT3B0aW9ucy5sZW5ndGggPiAwO1xuICB9XG5cbiAgc2V0T1RhYmxlSW5zZXJ0YWJsZVJvdyh0YWJsZUluc2VydGFibGVSb3c6IE9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQpIHtcbiAgICBjb25zdCBpbnNlcnRQZXJtOiBPUGVybWlzc2lvbnMgPSB0aGlzLmdldEFjdGlvblBlcm1pc3Npb25zKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX0lOU0VSVCk7XG4gICAgaWYgKGluc2VydFBlcm0udmlzaWJsZSkge1xuICAgICAgdGFibGVJbnNlcnRhYmxlUm93LmVuYWJsZWQgPSBpbnNlcnRQZXJtLmVuYWJsZWQ7XG4gICAgICB0aGlzLm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQgPSB0YWJsZUluc2VydGFibGVSb3c7XG4gICAgICB0aGlzLnNob3dGaXJzdEluc2VydGFibGVSb3cgPSB0aGlzLm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNGaXJzdFJvdygpO1xuICAgICAgdGhpcy5zaG93TGFzdEluc2VydGFibGVSb3cgPSAhdGhpcy5zaG93Rmlyc3RJbnNlcnRhYmxlUm93O1xuICAgICAgdGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmluaXRpYWxpemVFZGl0b3JzKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb25BbmRFZGl0aW5nKGNsZWFyU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChjbGVhclNlbGVjdGlvbikge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIob0NvbHVtbiA9PiBvQ29sdW1uLmVkaXRpbmcpXG4gICAgICAuZm9yRWFjaChvQ29sdW1uID0+IHtcbiAgICAgICAgb0NvbHVtbi5lZGl0aW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1NlbGVjdGVkSXRlbURhdGEoKSB7XG4gICAgdGhpcy50cmlnZ2VyU2VsZWN0aW9uRXZlbnRzID0gZmFsc2U7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUuc2VsZWN0aW9uKSAmJiB0aGlzLnN0YXRlLnNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbi5mb3JFYWNoKHNlbGVjdGVkSXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbUtleXMgPSBPYmplY3Qua2V5cyhzZWxlY3RlZEl0ZW0pO1xuICAgICAgICAvLyBmaW5kaW5nIHNlbGVjdGVkIGl0ZW0gZGF0YSBpbiB0aGUgdGFibGUgcmVuZGVyZWQgZGF0YVxuICAgICAgICBjb25zdCBmb3VuZEl0ZW0gPSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhLmZpbmQoZGF0YSA9PlxuICAgICAgICAgIHNlbGVjdGVkSXRlbUtleXMuZXZlcnkoa2V5ID0+IGRhdGFba2V5XSA9PT0gc2VsZWN0ZWRJdGVtW2tleV0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmb3VuZEl0ZW0pIHtcbiAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGZvdW5kSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSB0cnVlO1xuICB9XG5cbiAgdXNlRGV0YWlsQnV0dG9uKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2x1bW4udHlwZSA9PT0gJ2VkaXRCdXR0b25JblJvdycgfHwgY29sdW1uLnR5cGUgPT09ICdkZXRhaWxCdXR0b25JblJvdyc7XG4gIH1cblxuICBvbkRldGFpbEJ1dHRvbkNsaWNrKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2VkaXRCdXR0b25JblJvdyc6XG4gICAgICAgIHRoaXMuZWRpdERldGFpbChyb3cpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RldGFpbEJ1dHRvbkluUm93JzpcbiAgICAgICAgdGhpcy52aWV3RGV0YWlsKHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGdldERldGFpbEJ1dHRvbkljb24oY29sdW1uOiBPQ29sdW1uKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2VkaXRCdXR0b25JblJvdyc6XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuZWRpdEJ1dHRvbkluUm93SWNvbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZXRhaWxCdXR0b25JblJvdyc6XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuZGV0YWlsQnV0dG9uSW5Sb3dJY29uO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHVzZVBsYWluUmVuZGVyKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudXNlRGV0YWlsQnV0dG9uKGNvbHVtbikgJiYgIWNvbHVtbi5yZW5kZXJlciAmJiAoIWNvbHVtbi5lZGl0b3IgfHwgKCFjb2x1bW4uZWRpdGluZyB8fCAhdGhpcy5pc1Jvd1NlbGVjdGVkKHJvdykpKTtcbiAgfVxuXG4gIHVzZUNlbGxSZW5kZXJlcihjb2x1bW46IE9Db2x1bW4sIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbHVtbi5yZW5kZXJlciAmJiAoIWNvbHVtbi5lZGl0aW5nIHx8IGNvbHVtbi5lZGl0aW5nICYmICF0aGlzLmlzUm93U2VsZWN0ZWQocm93KSk7XG4gIH1cblxuICB1c2VDZWxsRWRpdG9yKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPIEFkZCBjb2x1bW4uZWRpdG9yIGluc3RhbmNlb2YgT1RhYmxlQ2VsbEVkaXRvckJvb2xlYW5Db21wb25lbnQgdG8gY29uZGl0aW9uXG4gICAgaWYgKGNvbHVtbi5lZGl0b3IgJiYgY29sdW1uLmVkaXRvci5hdXRvQ29tbWl0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0aW5nICYmIHRoaXMuaXNSb3dTZWxlY3RlZChyb3cpO1xuICB9XG5cbiAgaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gQ29kZXMuU0VMRUNUSU9OX01PREVfTVVMVElQTEU7XG4gIH1cblxuICBpc1NlbGVjdGlvbk1vZGVTaW5nbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gQ29kZXMuU0VMRUNUSU9OX01PREVfU0lOR0xFO1xuICB9XG5cbiAgaXNTZWxlY3Rpb25Nb2RlTm9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBDb2Rlcy5TRUxFQ1RJT05fTU9ERV9OT05FO1xuICB9XG5cbiAgb25DaGFuZ2VQYWdlKGV2dDogUGFnZUV2ZW50KSB7XG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YVNlcnZpY2U/LnNldFBhZ2luYXRpb25Db250ZXh0KHsgcGFnZU51bWJlcjogZXZ0LnBhZ2VJbmRleCwgcGFnZVNpemU6IGV2dC5wYWdlU2l6ZSB9KTtcbiAgICBpZiAoIXRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldnQucGFnZUluZGV4O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGdvaW5nQmFjayA9IGV2dC5wYWdlSW5kZXggPCB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldnQucGFnZUluZGV4O1xuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3IuaXNTaG93aW5nQWxsUm93cyhldnQucGFnZVNpemUpID8gdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciA6IGV2dC5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IG9sZFF1ZXJ5Um93cyA9IHRoaXMucXVlcnlSb3dzO1xuICAgIGNvbnN0IGNoYW5naW5nUGFnZVNpemUgPSAob2xkUXVlcnlSb3dzICE9PSBwYWdlU2l6ZSk7XG4gICAgdGhpcy5xdWVyeVJvd3MgPSBwYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuXG4gICAgbGV0IG5ld1N0YXJ0UmVjb3JkOiBudW1iZXI7XG4gICAgbGV0IHF1ZXJ5TGVuZ3RoOiBudW1iZXI7XG5cbiAgICBpZiAoZ29pbmdCYWNrIHx8IGNoYW5naW5nUGFnZVNpemUpIHtcbiAgICAgIG5ld1N0YXJ0UmVjb3JkID0gKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cyk7XG4gICAgICBxdWVyeUxlbmd0aCA9IHRoaXMucXVlcnlSb3dzO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTdGFydFJlY29yZCA9IE1hdGgubWF4KHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQsICh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5xdWVyeVJvd3MpKTtcbiAgICAgIGNvbnN0IG5ld0VuZFJlY29yZCA9IE1hdGgubWluKG5ld1N0YXJ0UmVjb3JkICsgdGhpcy5xdWVyeVJvd3MsIHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIpO1xuICAgICAgcXVlcnlMZW5ndGggPSB0aGlzLmRpc2FibGVQYWdlU2l6ZUNhbGN1bGF0aW9uID8gdGhpcy5xdWVyeVJvd3MgOiBNYXRoLm1pbih0aGlzLnF1ZXJ5Um93cywgbmV3RW5kUmVjb3JkIC0gbmV3U3RhcnRSZWNvcmQpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5QXJnczogT1F1ZXJ5RGF0YUFyZ3MgPSB7XG4gICAgICBvZmZzZXQ6IG5ld1N0YXJ0UmVjb3JkLFxuICAgICAgbGVuZ3RoOiBxdWVyeUxlbmd0aFxuICAgIH07XG5cbiAgICB0aGlzLmZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgZ2V0T0NvbHVtbihhdHRyOiBzdHJpbmcpOiBPQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5fb1RhYmxlT3B0aW9ucyA/IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09PSBhdHRyKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGluc2VydFJlY29yZChyZWNvcmREYXRhOiBhbnksIHNxbFR5cGVzPzogb2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgaWYgKHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc2VydCBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgYmVjYXVzZSB0aGUgdGFibGUgaXMgcmVhZC1vbmx5LmApXG4gICAgfVxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX0lOU0VSVCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc3FsVHlwZXMpKSB7XG4gICAgICBjb25zdCBhbGxTcWxUeXBlcyA9IHRoaXMuZ2V0U3FsVHlwZXMoKTtcbiAgICAgIHNxbFR5cGVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhyZWNvcmREYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhb1RhYmxlLmluc2VydFF1ZXJ5KHJlY29yZERhdGEsIHNxbFR5cGVzKTtcbiAgfVxuXG4gIHVwZGF0ZVJlY29yZChmaWx0ZXI6IGFueSwgdXBkYXRlRGF0YTogYW55LCBzcWxUeXBlcz86IG9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVcGRhdGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIHRhYmxlIGlzIHJlYWQtb25seS5gKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX1VQREFURSkpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLmRhdGFTb3VyY2UuZGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IHNxbFR5cGVzQXJnID0gc3FsVHlwZXMgfHwge307XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzcWxUeXBlcykpIHtcbiAgICAgIGNvbnN0IGFsbFNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlcygpO1xuICAgICAgT2JqZWN0LmtleXMoZmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzQXJnW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgICBPYmplY3Qua2V5cyh1cGRhdGVEYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzQXJnW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhb1RhYmxlLnVwZGF0ZVF1ZXJ5KGZpbHRlciwgdXBkYXRlRGF0YSwgc3FsVHlwZXNBcmcpO1xuICB9XG5cblxuICAvKipcbiAgICogR2V0cyBkYXRhIHRhYmxlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXREYXRhQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGFvVGFibGUuZGF0YTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgZGF0YSB0YWJsZSB3aGVuIGlzIHN0YXRpYyAoT05MWSBJTiBUSElTIENBU0UpXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBzZXREYXRhQXJyYXkoZGF0YTogQXJyYXk8YW55Pikge1xuICAgIGlmICh0aGlzLmRhb1RhYmxlKSB7XG4gICAgICAvLyByZW1vdGUgcGFnaW5hdGlvbiBoYXMgbm8gc2Vuc2Ugd2hlbiB1c2luZyBzdGF0aWMtZGF0YVxuICAgICAgdGhpcy5wYWdlYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0aWNEYXRhID0gZGF0YTtcbiAgICAgIHRoaXMuZGFvVGFibGUudXNpbmdTdGF0aWNEYXRhID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGFvVGFibGUuc2V0RGF0YUFycmF5KHRoaXMuc3RhdGljRGF0YSk7XG4gICAgICB0aGlzLm9uRGF0YUxvYWRlZC5lbWl0KHRoaXMuZGFvVGFibGUuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlbGV0ZUxvY2FsSXRlbXMoKSB7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gdGhpcy5nZXREYXRhQXJyYXkoKTtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKChzZWxlY3RlZEl0ZW06IGFueSkgPT4ge1xuICAgICAgZm9yIChsZXQgaiA9IGRhdGFBcnJheS5sZW5ndGggLSAxOyBqID49IDA7IC0taikge1xuICAgICAgICBpZiAoVXRpbC5lcXVhbHMoc2VsZWN0ZWRJdGVtLCBkYXRhQXJyYXlbal0pKSB7XG4gICAgICAgICAgZGF0YUFycmF5LnNwbGljZShqLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnNldERhdGFBcnJheShkYXRhQXJyYXkpO1xuICB9XG5cbiAgaXNDb2x1bW5Tb3J0QWN0aXZlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zb3J0Q29sQXJyYXkuZmluZChzb3J0QyA9PiBzb3J0Qy5jb2x1bW5OYW1lID09PSBjb2x1bW4uYXR0cik7XG4gICAgcmV0dXJuIGZvdW5kICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0NvbHVtbkRlc2NTb3J0QWN0aXZlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zb3J0Q29sQXJyYXkuZmluZChzb3J0QyA9PiBzb3J0Qy5jb2x1bW5OYW1lID09PSBjb2x1bW4uYXR0ciAmJiAhc29ydEMuYXNjZW5kZW50KTtcbiAgICByZXR1cm4gZm91bmQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhc1RhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0VtcHR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIVV0aWwuaXNEZWZpbmVkKHZhbHVlKSB8fCAoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpICYmICF2YWx1ZSk7XG4gIH1cblxuICBzZXRGaWx0ZXJzQ29uZmlndXJhdGlvbihzdG9yYWdlOiBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzID0gdGhpcy5zdGF0ZSkge1xuICAgIC8qXG4gICAgICBDaGVja2luZyB0aGUgb3JpZ2luYWwgZmlsdGVyQ2FzZVNlbnNpdGl2ZSB3aXRoIHRoZSBmaWx0ZXJDYXNlU2Vuc2l0aXZlIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpbiBsb2NhbCBzdG9yYWdlXG4gICAgICBpZiBmaWx0ZXJDYXNlU2Vuc2l0aXZlIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpcyBlcXVhbHMgdG8gb3JpZ2luYWwgZmlsdGVyQ2FzZVNlbnNpdGl2ZSBpbnB1dFxuICAgICAgZmlsdGVyQ2FzZVNlbnNpdGl2ZSB3aWxsIGJlIHRoZSB2YWx1ZSBpbiBsb2NhbCBzdG9yYWdlXG4gICAgKi9cbiAgICBpZiAoc3RvcmFnZS5pbml0aWFsQ29uZmlndXJhdGlvbi5maWx0ZXJDYXNlU2Vuc2l0aXZlICE9PSB0aGlzLmZpbHRlckNhc2VTZW5zaXRpdmUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IHRoaXMuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXJDYXNlU2Vuc2l0aXZlID0gc3RvcmFnZS5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyLWNhc2Utc2Vuc2l0aXZlJykgPyBzdG9yYWdlWydmaWx0ZXItY2FzZS1zZW5zaXRpdmUnXSA6IHRoaXMuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmFnZS5pbml0aWFsQ29uZmlndXJhdGlvbi5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQgIT09IHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KSB7XG4gICAgICB0aGlzLmlzQ29sdW1uRmlsdGVyc0FjdGl2ZSA9IHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb25mRmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0ID0gc3RvcmFnZS5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyLWNvbHVtbi1hY3RpdmUnKSA/IHN0b3JhZ2VbJ2ZpbHRlci1jb2x1bW4tYWN0aXZlJ10gOiB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcbiAgICAgIHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gY29uZkZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCB8fCB0aGlzLnN0YXRlLmNvbHVtblZhbHVlRmlsdGVycy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzdG9yYWdlLmNvbHVtblZhbHVlRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5pbml0aWFsaXplQ29sdW1uc0ZpbHRlcnModGhpcy5zdGF0ZS5jb2x1bW5WYWx1ZUZpbHRlcnMpO1xuICAgICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5zZXRWYWx1ZShzdG9yYWdlWydmaWx0ZXInXSk7XG4gICAgICAoc3RvcmFnZVsnb0NvbHVtbnMnXSB8fCBbXSkuZm9yRWFjaCgob0NvbERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBvQ29sID0gdGhpcy5nZXRPQ29sdW1uKG9Db2xEYXRhLmF0dHIpO1xuICAgICAgICBpZiAob0NvbCAmJiBvQ29sRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VhcmNoaW5nJykpIHtcbiAgICAgICAgICBvQ29sLnNlYXJjaGluZyA9IG9Db2xEYXRhLnNlYXJjaGluZztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyQnVpbGRlciAmJiBVdGlsLmlzRGVmaW5lZChzdG9yYWdlLmZpbHRlckJ1aWxkZXJWYWx1ZXMpKSB7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIuc2V0RmlsdGVyVmFsdWVzKHN0b3JhZ2UuZmlsdGVyQnVpbGRlclZhbHVlcyk7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIudHJpZ2dlclJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RvcmVDb25maWd1cmF0aW9uQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25TdG9yZUNvbmZpZ3VyYXRpb25DbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25BcHBseUNvbmZpZ3VyYXRpb25DbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkFwcGx5Q29uZmlndXJhdGlvbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURlZmF1bHRDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtcygpO1xuICAgIHRoaXMucGFyc2VWaXNpYmxlQ29sdW1ucyh0cnVlKTtcbiAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tT3JpZ2luYWxEZWZpbml0aW9uKCk7XG4gICAgdGhpcy5yZWluaXRpYWxpemF0ZVF1aWNrRmlsdGVyQ29sdW1ucygpO1xuICAgIHRoaXMucmVzZXRRdWVyeVJvd3MoKTtcbiAgICBjb25zdCBpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc29ydENvbHVtbnMpO1xuICAgIHRoaXMucmVpbml0aWFsaXplU29ydENvbHVtbnMoaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXkpO1xuICAgIHRoaXMub25SZWluaXRpYWxpemUuZW1pdChudWxsKTtcbiAgICB0aGlzLmNsZWFyRmlsdGVycyhmYWxzZSk7XG4gICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gIH1cbiAgcmVzZXRRdWVyeVJvd3MoKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24ucXVlcnlSb3dzKSkge1xuICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cztcbiAgICB9XG4gIH1cbiAgYXBwbHlDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdG9yZWRDb25maWd1cmF0aW9uID0gdGhpcy5zdGF0ZS5nZXRTdG9yZWRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb25OYW1lKTtcbiAgICBpZiAoc3RvcmVkQ29uZmlndXJhdGlvbikge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHN0b3JlZENvbmZpZ3VyYXRpb25bJ3N0b3JlZC1wcm9wZXJ0aWVzJ10gfHwgW107XG5cbiAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICAgICAgICBjYXNlICdzb3J0LWNvbHVtbnMnOlxuICAgICAgICAgICAgdGhpcy5yZWluaXRpYWxpemVTb3J0Q29sdW1ucygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnb0NvbHVtbnMtZGlzcGxheSc6XG4gICAgICAgICAgICB0aGlzLnBhcnNlVmlzaWJsZUNvbHVtbnMoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdxdWljay1maWx0ZXInOlxuICAgICAgICAgIGNhc2UgJ2NvbHVtbnMtZmlsdGVyJzpcbiAgICAgICAgICBjYXNlICdmaWx0ZXItYnVpbGRlcic6XG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcnNDb25maWd1cmF0aW9uKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdncm91cGVkLWNvbHVtbnMnOlxuICAgICAgICAgICAgdGhpcy5wYXJzZUdyb3VwZWRDb2x1bW5zKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwYWdlJzpcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnN0YXRlLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLnF1ZXJ5Um93cztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFRpdGxlQWxpZ25DbGFzcyhvQ29sOiBPQ29sdW1uKSB7XG5cbiAgICBjb25zdCBoYXNUaXRsZUFsaWduID0gVXRpbC5pc0RlZmluZWQob0NvbC5kZWZpbml0aW9uKSAmJiBVdGlsLmlzRGVmaW5lZChvQ29sLmRlZmluaXRpb24udGl0bGVBbGlnbik7XG4gICAgY29uc3QgYXV0b0FsaWduID0gKHRoaXMuYXV0b0FsaWduVGl0bGVzICYmICFoYXNUaXRsZUFsaWduKSB8fCAoaGFzVGl0bGVBbGlnbiAmJiBvQ29sLmRlZmluaXRpb24udGl0bGVBbGlnbiA9PT0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0FVVE8pO1xuICAgIGlmICghYXV0b0FsaWduKSB7XG4gICAgICByZXR1cm4gb0NvbC5nZXRUaXRsZUFsaWduQ2xhc3MoKTtcbiAgICB9XG5cbiAgICBsZXQgYWxpZ24gPSB0aGlzLmdldENlbGxBbGlnbkNsYXNzKG9Db2wpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChhbGlnbikgJiYgYWxpZ24ubGVuZ3RoID4gMCkge1xuICAgICAgYWxpZ24gPSBhbGlnbi5zdWJzdHJpbmcoMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAob0NvbC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIGNhc2UgJ2FjdGlvbic6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgIGFsaWduID0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0NFTlRFUjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY3VycmVuY3knOlxuICAgICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgY2FzZSAncmVhbCc6XG4gICAgICAgIGNhc2UgJ3BlcmNlbnRhZ2UnOlxuICAgICAgICAgIGFsaWduID0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0VORDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2VydmljZSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYWxpZ24gPSBDb2Rlcy5DT0xVTU5fVElUTEVfQUxJR05fU1RBUlQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGlnbjtcblxuICB9XG5cbiAgcHVibGljIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbjogT0NvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5kZWZpbml0aW9uKSAmJiBVdGlsLmlzRGVmaW5lZChjb2x1bW4uZGVmaW5pdGlvbi5jb250ZW50QWxpZ24pID8gJ28tJyArIGNvbHVtbi5kZWZpbml0aW9uLmNvbnRlbnRBbGlnbiA6ICcnO1xuICB9XG5cblxuICBwdWJsaWMgZ2V0R3JvdXBIZWFkZXJDZWxsQWxpZ25DbGFzcyhjb2x1bW46IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjbGFzc05hbWVBcnJheSA9IFtdO1xuICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uLnN1YnN0cignZ3JvdXBIZWFkZXItJy5sZW5ndGgpKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQob0NvbCkpIHtcbiAgICAgIGNsYXNzTmFtZUFycmF5LnB1c2godGhpcy5nZXRDZWxsQWxpZ25DbGFzcyhvQ29sKSk7XG4gICAgICBjbGFzc05hbWVBcnJheS5wdXNoKG9Db2wuY2xhc3NOYW1lID8gb0NvbC5jbGFzc05hbWUgOiAnJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVBcnJheTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGREZWZhdWx0Um93QnV0dG9ucygpIHtcbiAgICAvLyBjaGVjayBwZXJtaXNzaW9uc1xuICAgIGlmICh0aGlzLmVkaXRCdXR0b25JblJvdykge1xuICAgICAgdGhpcy5hZGRCdXR0b25JblJvdygnZWRpdEJ1dHRvbkluUm93Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRldGFpbEJ1dHRvbkluUm93KSB7XG4gICAgICB0aGlzLmFkZEJ1dHRvbkluUm93KCdkZXRhaWxCdXR0b25JblJvdycpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRCdXR0b25JblJvdyhuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb2xEZWY6IE9Db2x1bW4gPSB0aGlzLmNyZWF0ZU9Db2x1bW4obmFtZSwgdGhpcyk7XG4gICAgY29sRGVmLnR5cGUgPSBuYW1lO1xuICAgIGNvbERlZi52aXNpYmxlID0gdHJ1ZTtcbiAgICBjb2xEZWYuc2VhcmNoYWJsZSA9IGZhbHNlO1xuICAgIGNvbERlZi5vcmRlcmFibGUgPSBmYWxzZTtcbiAgICBjb2xEZWYucmVzaXphYmxlID0gZmFsc2U7XG4gICAgY29sRGVmLmdyb3VwYWJsZSA9IGZhbHNlO1xuICAgIGNvbERlZi50aXRsZSA9IHVuZGVmaW5lZDtcbiAgICBjb2xEZWYud2lkdGggPSAnNDhweCc7XG4gICAgdGhpcy5wdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmKTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLnB1c2gobmFtZSk7XG4gIH1cblxuICBnZXQgaGVhZGVySGVpZ2h0KCkge1xuICAgIGxldCBoZWlnaHQgPSAwO1xuICAgIGlmICh0aGlzLnRhYmxlSGVhZGVyRWw/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGhlaWdodCArPSB0aGlzLnRhYmxlSGVhZGVyRWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYmxlVG9vbGJhckVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBoZWlnaHQgKz0gdGhpcy50YWJsZVRvb2xiYXJFbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIGhlaWdodDtcbiAgfVxuXG4gIGdldCB0b29sQmFySGVpZ2h0KCkge1xuICAgIGxldCBoZWlnaHQgPSAwO1xuXG4gICAgaWYgKHRoaXMudGFibGVUb29sYmFyRWw/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGhlaWdodCArPSB0aGlzLnRhYmxlVG9vbGJhckVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgaXNEZXRhaWxNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRldGFpbE1vZGUgIT09IENvZGVzLkRFVEFJTF9NT0RFX05PTkU7XG4gIH1cblxuICBjb3B5QWxsKCkge1xuICAgIFV0aWwuY29weVRvQ2xpcGJvYXJkKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0UmVuZGVyZWRWYWx1ZSgpKSk7XG4gIH1cblxuICBjb3B5U2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVuZGVyZWREYXRhKHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpKTtcbiAgICBVdGlsLmNvcHlUb0NsaXBib2FyZChKU09OLnN0cmluZ2lmeShzZWxlY3RlZEl0ZW1zKSk7XG4gIH1cblxuICBkZXN0cm95QWN0aXZlZFRvb2x0aXBzKCkge1xuICAgIHRoaXMudG9vbHRpcC5mb3JFYWNoKHRwID0+IHtcbiAgICAgIGlmICh0cC5fb3ZlcmxheVJlZikge1xuICAgICAgICB0cC5fb3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBuYXZpZ2F0aW9uIHRvIGl0ZW0gZGV0YWlsLCByZWNlaXZpbmcgaXRlbSBkYXRhXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm5zIGRldGFpbFxuICAgKi9cbiAgdmlld0RldGFpbChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSAmJiB0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbignZGV0YWlsJykgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3lBY3RpdmVkVG9vbHRpcHMoKTtcbiAgICBzdXBlci52aWV3RGV0YWlsKGl0ZW0pO1xuICB9XG5cblxuICAvKipcbiAgICogVHJpZ2dlcnMgbmF2aWdhdGlvbiB0byBpdGVtIGVkaXRpb24sIHJlY2VpdmluZyBpdGVtIGRhdGFcbiAgICogQHBhcmFtIGl0ZW1cbiAgICogQHJldHVybnMgZGV0YWlsXG4gICAqL1xuICBlZGl0RGV0YWlsKGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5ICYmIHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKCdlZGl0JykgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5lZGl0RGV0YWlsKGl0ZW0pO1xuICB9XG5cbiAgZ2V0T0NvbHVtbkZyb21UaCh0aDogYW55KTogT0NvbHVtbiB7XG4gICAgbGV0IHJlc3VsdDogT0NvbHVtbjtcbiAgICBjb25zdCBjbGFzc0xpc3Q6IGFueVtdID0gQXJyYXkuZnJvbSgodGggYXMgRWxlbWVudCkuY2xhc3NMaXN0IHx8IFtdKTtcbiAgICBjb25zdCBjb2x1bW5DbGFzcyA9IGNsYXNzTGlzdC5maW5kKChjbGFzc05hbWU6IHN0cmluZykgPT4gKGNsYXNzTmFtZS5zdGFydHNXaXRoKCdtYXQtY29sdW1uLScpKSk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbkNsYXNzKSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5nZXRPQ29sdW1uKGNvbHVtbkNsYXNzLnN1YnN0cignbWF0LWNvbHVtbi0nLmxlbmd0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0T0NvbHVtbkZyb21Hcm91cEhlYWRlckNvbHVtbihhdHRyOiBzdHJpbmcpOiBPQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPQ29sdW1uKGF0dHIuc3Vic3RyKCdncm91cEhlYWRlci0nLmxlbmd0aCkpO1xuICB9XG5cbiAgZ2V0VGhXaWR0aEZyb21PQ29sdW1uKG9Db2x1bW46IE9Db2x1bW4pOiBhbnkge1xuICAgIGxldCB3aWR0aENvbHVtbjogbnVtYmVyO1xuICAgIGNvbnN0IHRoQXJyYXkgPSB0aGlzLnRhYmxlSGVhZGVyRWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoQXJyYXkubGVuZ3RoICYmICFVdGlsLmlzRGVmaW5lZCh3aWR0aENvbHVtbik7IGkrKykge1xuICAgICAgY29uc3QgdGggPSB0aEFycmF5W2ldO1xuICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdGguY2xhc3NMaXN0O1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGFzc0xpc3QubGVuZ3RoICYmICFVdGlsLmlzRGVmaW5lZCh3aWR0aENvbHVtbik7IGorKykge1xuICAgICAgICBpZiAoY2xhc3NMaXN0W2pdID09PSAnbWF0LWNvbHVtbi0nICsgb0NvbHVtbi5hdHRyKSB7XG4gICAgICAgICAgd2lkdGhDb2x1bW4gPSB0aC5jbGllbnRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2lkdGhDb2x1bW47XG4gIH1cblxuICBnZXRDb2x1bW5JbnNlcnRhYmxlKG5hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lICsgdGhpcy5nZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKCk7XG4gIH1cblxuICBpc1Jvd1NlbGVjdGVkKHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSAmJiB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sdW1uV2lkdGhGcm9tU3RhdGUoY29sRGVmOiBPQ29sdW1uKTogc3RyaW5nIHtcbiAgICAvLzEuIEJ5IGRlZmF1bHQsIHNldCB3aWR0aCBkZWZpbml0aW9uXG4gICAgbGV0IGNvbHVtbldpZHRoID0gY29sRGVmLmRlZmluaXRpb24gJiYgY29sRGVmLmRlZmluaXRpb24ud2lkdGggPyBjb2xEZWYuZGVmaW5pdGlvbi53aWR0aCA6IHZvaWQgMDtcbiAgICBjb25zdCBzdG9yZWREYXRhID0gdGhpcy5zdGF0ZS5nZXRDb2x1bW5EaXNwbGF5KGNvbERlZik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHN0b3JlZERhdGEpICYmIFV0aWwuaXNEZWZpbmVkKHN0b3JlZERhdGEud2lkdGgpKSB7XG4gICAgICAvLzIuIFNldCB3aWR0aCBpZiB0aGUgd2lkdGggaXMgc3RvcmVkXG4gICAgICBjb2x1bW5XaWR0aCA9IHN0b3JlZERhdGEud2lkdGg7XG4gICAgICAvLyBjaGVjayB0aGF0IHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucyBzYXZlZCBpbiB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBpbiB0aGUgbG9jYWwgc3RvcmFnZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgIGlmICh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmNvbHVtbnNEaXNwbGF5KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxTdG9yZWREYXRhID0gdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5nZXRDb2x1bW5EaXNwbGF5KGNvbERlZik7XG4gICAgICAgIC8vIElmIG9yaWdpbmFsIHdpZHRoIGNoYW5nZWQgdGhlbiB0aGUgd2lkdGggaXMgcmVzZXRlZCB3aXRoIHRoaXMgdmFsdWVcbiAgICAgICAgaWYgKGluaXRpYWxTdG9yZWREYXRhICYmIGluaXRpYWxTdG9yZWREYXRhLndpZHRoICYmIGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGgpIHtcbiAgICAgICAgICBpZiAoaW5pdGlhbFN0b3JlZERhdGEud2lkdGggIT09IGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoID0gY29sRGVmLmRlZmluaXRpb24ub3JpZ2luYWxXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICB9XG5cbiAgcmVmcmVzaENvbHVtbnNXaWR0aEZyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCh4ID0+IHtcbiAgICAgIHgud2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRoRnJvbVN0YXRlKHgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaENvbHVtbnNXaWR0aEZyb21PcmlnaW5hbERlZmluaXRpb24oKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgICBjLndpZHRoID0gYy5ET01XaWR0aCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbikgJiYgVXRpbC5pc0RlZmluZWQoYy5kZWZpbml0aW9uLndpZHRoKSkge1xuICAgICAgICAgIGMud2lkdGggPSBjLmRlZmluaXRpb24ud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgYy5zZXRSZW5kZXJXaWR0aCh0aGlzLmhvcml6b250YWxTY3JvbGwsIHRoaXMuZ2V0Q2xpZW50V2lkdGhDb2x1bW4oYykpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT0NvbHVtbihhdHRyPzogc3RyaW5nLCB0YWJsZT86IE9UYWJsZUNvbXBvbmVudCwgY29sdW1uPzogT1RhYmxlQ29sdW1uQ29tcG9uZW50ICYgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCk6IE9Db2x1bW4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE9Db2x1bW4oKTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgaW5zdGFuY2UuYXR0ciA9IGF0dHI7XG4gICAgfVxuICAgIGlmICh0YWJsZSkge1xuICAgICAgaW5zdGFuY2Uuc2V0RGVmYXVsdFByb3BlcnRpZXMoe1xuICAgICAgICBvcmRlcmFibGU6IHRoaXMub3JkZXJhYmxlLFxuICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlLFxuICAgICAgICBncm91cGFibGU6IHRoaXMuZ3JvdXBhYmxlLFxuICAgICAgICBwYWdlYWJsZTogdGhpcy5wYWdlYWJsZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIGluc3RhbmNlLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT1RhYmxlQnV0dG9ucyhhcmc6IE9UYWJsZUJ1dHRvbnMpIHtcbiAgICB0aGlzLm9UYWJsZUJ1dHRvbnMgPSBhcmc7XG4gICAgaWYgKHRoaXMub1RhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9UYWJsZUJ1dHRvbnMucmVnaXN0ZXJCdXR0b25zKHRoaXMudGFibGVCdXR0b25zLnRvQXJyYXkoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENsaWVudFdpZHRoQ29sdW1uKGNvbDogT0NvbHVtbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGNvbC5ET01XaWR0aCB8fCB0aGlzLmdldFRoV2lkdGhGcm9tT0NvbHVtbihjb2wpO1xuICB9XG5cbiAgcHVibGljIGdldE1pbldpZHRoQ29sdW1uKGNvbDogT0NvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFV0aWwuZXh0cmFjdFBpeGVsc1ZhbHVlKGNvbC5taW5XaWR0aCwgQ29kZXMuREVGQVVMVF9DT0xVTU5fTUlOX1dJRFRIKSArICdweCc7XG4gIH1cblxuICBzaG93RXhwYW5kYWJsZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZW5hYmxlIHZpcnR1YWwgc2Nyb2xsXG4gICAqL1xuICBnZXQgZW5hYmxlZFZpcnR1YWxTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlydHVhbFNjcm9sbCAmJiAhdGhpcy5zaG93RXhwYW5kYWJsZVJvdygpICYmIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5sZW5ndGggPT09IDA7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBncm91cGVkIGNvbHVtbnNcbiAgICovXG4gIHBhcnNlR3JvdXBlZENvbHVtbnMoKSB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuc3RhdGUuZ3JvdXBlZENvbHVtbnMgfHwgdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXk7XG4gICAgaWYgKHRoaXMuc3RhdGUuZ3JvdXBlZENvbHVtbnMgJiYgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5ncm91cGVkQ29sdW1ucykge1xuICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZ3JvdXBlZENvbHVtbnNcbiAgICAgICAgLmZpbHRlcih4ID0+ICF0aGlzLm9yaWdpbmFsR3JvdXBlZENvbHVtbnNBcnJheS5pbmNsdWRlcyh4KSk7XG5cbiAgICAgIGlmIChkaWZmZXJlbmNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0R3JvdXBDb2x1bW5zKHJlc3VsdCk7XG4gIH1cbiAgcGFyc2VHcm91cGVkQ29sdW1uVHlwZXMoKSB7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMgPSB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5UeXBlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcm91cHMgYnkgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIGdyb3VwQnlDb2x1bW4oY29sdW1uOiBPQ29sdW1uLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uLmF0dHIsIHRydWUpO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyb3VwZWRDb2x1bW5UeXBlcyhjb2x1bW4uYXR0ciwgdHJ1ZSwgdHlwZSk7XG4gICAgfVxuICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVHcm91cGVkQ29sdW1ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZ3JvdXAgYnkgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIHVuR3JvdXBCeUNvbHVtbihjb2x1bW46IE9Db2x1bW4pIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW4uYXR0ciwgZmFsc2UpO1xuICAgIHRoaXMudXBkYXRlR3JvdXBlZENvbHVtblR5cGVzKGNvbHVtbi5hdHRyLCBmYWxzZSk7XG4gICAgdGhpcy5kYXRhU291cmNlLnVwZGF0ZUdyb3VwZWRDb2x1bW5zKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5ncm91cCBieSBhbGwgY29sdW1uc1xuICAgKi9cbiAgdW5Hcm91cEJ5QWxsQ29sdW1ucygpIHtcbiAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyhbXSk7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMgPSBbXTtcbiAgfVxuXG4gIHNldEdyb3VwQ29sdW1ucyh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLmdyb3VwZWRDb2x1bW5zQXJyYXkgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGFTb3VyY2UudXBkYXRlR3JvdXBlZENvbHVtbnMoKTtcbiAgfVxuICBzZXRHcm91cGVkQ29sdW1uVHlwZXModmFsdWU6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSkge1xuICAgIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzID0gdmFsdWU7XG4gIH1cbiAgY2hlY2tHcm91cEJ5Q29sdW1uKGZpZWxkOiBzdHJpbmcsIGFkZDogYm9vbGVhbikge1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cGVkQ29sdW1uc0FycmF5KSB7XG4gICAgICBpZiAoY29sdW1uID09PSBmaWVsZCkge1xuICAgICAgICBmb3VuZCA9IHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5pbmRleE9mKGNvbHVtbiwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3VuZCAhPSBudWxsICYmIGZvdW5kID49IDApIHtcbiAgICAgIGlmICghYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5wdXNoKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW0gaXMgZ3JvdXBcbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm5zIHRydWUgaWYgZ3JvdXBcbiAgICovXG4gIGlzR3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIE9UYWJsZUdyb3VwZWRSb3c7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW0gaXMgbm90IGdyb3VwXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vdCBncm91cFxuICAgKi9cbiAgaXNOb3RHcm91cChpbmRleCwgaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKGl0ZW0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KTtcbiAgfVxuXG4gIGdldExhc3RHcm91cHMoKSB7XG4gICAgLy8gR2V0IGxhc3QgZ3JvdXBzXG4gICAgY29uc3Qgc2NvcmVzID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YTtcbiAgICBjb25zdCBtYXhMZXZlbCA9IHNjb3Jlcy5yZWR1Y2UoKGFjYywgY3VycikgPT4gY3Vyci5sZXZlbCA+IGFjYyA/IGN1cnIubGV2ZWwgOiBhY2MsIDApO1xuICAgIGNvbnN0IG1heExldmVsUmVuZGVyZWREYXRhID0gc2NvcmVzLnJlZHVjZSgociwgbykgPT4gby5sZXZlbCA9PT0gbWF4TGV2ZWwgPyBbLi4uciwgb10gOiByLCBbXSk7XG4gICAgcmV0dXJuIG1heExldmVsUmVuZGVyZWREYXRhLmxlbmd0aDtcbiAgfVxuXG4gIGdyb3VwSGVhZGVyQ2xpY2socm93OiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnRvZ2dsZUdyb3VwQnlDb2x1bW4ocm93KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnN0YW5jZU9mT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudChyZW5kZXJlcjogT0Jhc2VUYWJsZUNlbGxSZW5kZXJlcikge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChyZW5kZXJlcikgJiYgKHJlbmRlcmVyIGFzIGFueSkub25EYXRhTG9hZGVkICYmIChyZW5kZXJlciBhcyBhbnkpLnF1ZXJ5QWxsRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbHVtbiBkYXRhIGJ5IGF0dHJcbiAgICogQHBhcmFtIGF0dHJcbiAgICogQHBhcmFtIHJvd1xuICAgKiBAcmV0dXJucyBjb2x1bW4gZGF0YSBieSBhdHRyXG4gICAqL1xuICBnZXRDb2x1bW5EYXRhQnlBdHRyKGF0dHIsIHJvdzogYW55KTogYW55IHtcbiAgICBsZXQgb3BlcmF0aW9uID0gbnVsbDtcbiAgICBpZiAodGhpcy5ncm91cGVkQ29sdW1uVHlwZXMubGVuZ3RoICE9IDAgJiYgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uYXR0ciA9PSBhdHRyKSAhPSAtMSkge1xuICAgICAgb3BlcmF0aW9uID0gdGhpcy5ncm91cGVkQ29sdW1uVHlwZXNbdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uYXR0ciA9PSBhdHRyKV0udHlwZTtcbiAgICB9XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihhdHRyKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICByZXR1cm4gcm93W2F0dHJdO1xuICAgIH1cbiAgICBjb25zdCB1c2VSZW5kZXJlciA9IG9Db2wucmVuZGVyZXIgJiYgb0NvbC5yZW5kZXJlci5nZXRDZWxsRGF0YTtcbiAgICBpZiAob3BlcmF0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KHJvd1tvQ29sLmF0dHJdKTtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldEN1cnJlbnRMYW5nKCk7XG4gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgICBjYXNlIFwiWUVBUlwiOiByZXR1cm4gZGF0ZS55ZWFyKCk7XG4gICAgICAgIGNhc2UgXCJNT05USFwiOiByZXR1cm4gbW9tZW50KCkubG9jYWxlKGxhbmd1YWdlKS5tb250aChkYXRlLm1vbnRoKCkpLmZvcm1hdChcIk1NTU1cIik7XG4gICAgICAgIGNhc2UgXCJZRUFSX01PTlRIXCI6IHJldHVybiBtb21lbnQoKS5sb2NhbGUobGFuZ3VhZ2UpLm1vbnRoKGRhdGUubW9udGgoKSkueWVhcihkYXRlLnllYXIoKSkuZm9ybWF0KFwiTU1NTSwgWVlZWVwiKTtcbiAgICAgICAgY2FzZSBcIllFQVJfTU9OVEhfREFZXCI6IHJldHVybiB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXBkYXRlR3JvdXBlZENvbHVtblR5cGVzKGF0dHI6IHN0cmluZywgYWRkOiBib29sZWFuLCBvcGVyYXRpb24/OiBzdHJpbmcpIHtcbiAgICBsZXQgZ3JvdXBlZENvbHVtbnM6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSA9IFtdO1xuICAgIGxldCBpbmRleCA9IHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmF0dHIgPT0gYXR0cik7XG4gICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwZWRDb2x1bW5UeXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMucHVzaCh7IFwiYXR0clwiOiBhdHRyLCBcInR5cGVcIjogb3BlcmF0aW9uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5UeXBlcyA9IGdyb3VwZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lR3JvdXBIZWFkZXIocm93OiBPVGFibGVHcm91cGVkUm93KTogc3RyaW5nIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gICAgaWYgKHJvdy5sZXZlbCA8PSAxMCkge1xuICAgICAgY2xhc3NOYW1lID0gJ28tdGFibGUtZ3JvdXAtcm93IG8tdGFibGUtZ3JvdXAtcm93LWxldmVsLScgKyByb3cubGV2ZWw7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBwcml2YXRlIHN0b3BFZGl0aW9uKGNsZWFyU2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgIGNsZWFyU2VsZWN0aW9uID0gY2xlYXJTZWxlY3Rpb24gPyBjbGVhclNlbGVjdGlvbiA6IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ0NlbGwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0aW5nUm93ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25BbmRFZGl0aW5nKGNsZWFyU2VsZWN0aW9uKTtcbiAgfVxuXG4gIHN0b3JlRmlsdGVySW5TdGF0ZShhcmc6IE9GaWx0ZXJEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2Uuc3RvcmVGaWx0ZXIoYXJnKTtcbiAgfVxuXG4gIHJlaW5pdGlhbGl6YXRlUXVpY2tGaWx0ZXJDb2x1bW5zKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1xuICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnNlYXJjaGFibGUgJiYgY29sdW1uLnZpc2libGUpXG4gICAgICAuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLnNlYXJjaGluZyA9IHRydWUpXG4gIH1cblxuICByZWluaXRpYWxpemVTb3J0Q29sdW1ucyhzb3J0Q29sdW1ucz86IFNRTE9yZGVyW10pIHtcbiAgICB0aGlzLnRhYmxlSGVhZGVycyA9IFtdO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzb3J0Q29sdW1ucykpIHtcbiAgICAgIHRoaXMuc29ydENvbEFycmF5ID0gc29ydENvbHVtbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyc2VTb3J0Q29sdW1ucygpO1xuICAgIH1cbiAgICB0aGlzLnNvcnQuc2V0U29ydENvbHVtbnModGhpcy5zb3J0Q29sQXJyYXkpO1xuICAgIHRoaXMucmVmcmVzaFNvcnRIZWFkZXJzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaFNvcnRIZWFkZXJzKCkge1xuICAgIHRoaXMudGFibGVIZWFkZXJzLmZpbHRlcihoZWFkZXIgPT4gVXRpbC5pc0RlZmluZWQoaGVhZGVyLm1hdFNvcnRIZWFkZXIpKS5mb3JFYWNoKGhlYWRlciA9PiBoZWFkZXIubWF0U29ydEhlYWRlci5yZWZyZXNoKCkpO1xuICB9XG5cbiAgZ2V0UXVpY2tGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSA/XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnZhbHVlIDpcbiAgICAgICcnO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5Q2VsbFJlbmRlcmVycygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHF1aWNrRmlsdGVyVmFsdWUgPSB0aGlzLmdldFF1aWNrRmlsdGVyVmFsdWUoKTtcblxuICAgIGlmICgoVXRpbC5pc0RlZmluZWQocXVpY2tGaWx0ZXJWYWx1ZSkgJiYgcXVpY2tGaWx0ZXJWYWx1ZS5sZW5ndGggPiAwKSB8fCB0aGlzLnNvcnRDb2xBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnNcbiAgICAgICAgLmZpbHRlcihvQ29sID0+IG9Db2wuc2VhcmNoaW5nICYmIHRoaXMuaXNJbnN0YW5jZU9mT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudChvQ29sLnJlbmRlcmVyKSlcbiAgICAgICAgLm1hcChvQ29sID0+IChvQ29sLnJlbmRlcmVyIGFzIGFueSkucXVlcnlBbGxEYXRhKCkpO1xuXG4gICAgICByZXR1cm4gcXVlcmllcy5sZW5ndGggPiAwID8gY29tYmluZUxhdGVzdChxdWVyaWVzKSA6IG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobnVsbCk7XG4gIH1cblxuICB0YWJsZVF1aWNrRmlsdGVyQ2hhbmdlZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMucXVlcnlDZWxsUmVuZGVyZXJzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5xdWlja0ZpbHRlciA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG9uTWF0U29ydENoYW5nZVxuICBwdWJsaWMgZmlsdGVyRGF0YSh2YWx1ZT86IHN0cmluZywgbG9hZE1vcmU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgLy9cbiAgfVxuXG4gIHNldE9UYWJsZUNvbHVtbnNHcm91cGluZyh2YWx1ZTogT1RhYmxlQ29sdW1uc0dyb3VwaW5nKSB7XG4gICAgdGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldENvbHVtbkdyb3VwaW5nQ29tcG9uZW50KGNvbHVtbkF0dHI6IHN0cmluZyk6IE9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbHVtbkNvbXBvbmVudCB7XG4gICAgbGV0IHJlc3VsdDogT1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29sdW1uQ29tcG9uZW50O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudCkpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LmdldENvbHVtbkdyb3VwaW5nKGNvbHVtbkF0dHIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXNlQ29sdW1uR3JvdXBpbmdBZ2dyZWdhdGUoY29sdW1uQXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW5BdHRyKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNxbFR5cGUgPSB0aGlzLmdldFNxbFR5cGVzKClbY29sdW1uQXR0cl07XG4gICAgY29uc3QgaGFzRGVmYXVsdEFnZ3JlZ2F0ZSA9IFNRTFR5cGVzLmlzTnVtZXJpY1NRTFR5cGUoc3FsVHlwZSlcbiAgICAgICYmICghVXRpbC5pc0RlZmluZWQob0NvbC5yZW5kZXJlcikgfHwgT1RhYmxlQ29tcG9uZW50LkFWQUlMQUJMRV9HUk9VUElOR19DT0xVTU5TX1JFTkRFUkVSUy5pbmNsdWRlcyhvQ29sLnR5cGUpKTtcblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gaGFzRGVmYXVsdEFnZ3JlZ2F0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LnVzZUNvbHVtbkFnZ3JlZ2F0ZShjb2x1bW5BdHRyLCBoYXNEZWZhdWx0QWdncmVnYXRlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1ZpZXdwb3J0U2l6ZSgpIHtcbiAgICAvLyBJdHMgYSB0ZW1wb3JhcmlseSBmaXhlZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTAxMTdcbiAgICAvLyBTb2x2ZSB0aGUgaXNzdWUgd2hlbiBzd2l0Y2hpbmcgdGFicyB3aGVuIHRoZSB2aXJ0dWFsIHNjcm9sbGluZyBjb21wb25lbnQgaXMgdXNlZFxuICAgIC8vIGluIGEgbWF0IC0gdGFiIGNvbXBvbmVudCBhbmQgdmlydHVhbCBzY3JvbGwgd29yayBhYm5vcm1hbGx5XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNob3cgZXhwYW5kYWJsZSBpY29uIG9yIG5vdCBpZiBoYXMgZGF0YSBvciBub3RcbiAgc2hvd0V4cGFuZGFibGVJY29uKHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uKSAmJiB0aGlzLnNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pID8gVXRpbC53cmFwSW50b09ic2VydmFibGUodGhpcy5zaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbihyb3csIHJvd0luZGV4KSkgOiBvZih0cnVlKTtcbiAgfVxuXG4gIGdldENvbHVtbnNOb3RJbmNsdWRlZCgpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGNvbHNOb3RJbmNsdWRlZCA9IFtdO1xuICAgIGNvbHNOb3RJbmNsdWRlZCA9IHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IHZvaWQgMCAhPT0gYy5yZW5kZXJlciAmJiAoYy50eXBlID09PSAnaW1hZ2UnIHx8IGMudHlwZSA9PT0gJ2FjdGlvbicpKS5tYXAoYyA9PiBjLmF0dHIpO1xuICAgIGNvbHNOb3RJbmNsdWRlZC5wdXNoKENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgY29sc05vdEluY2x1ZGVkLnB1c2goQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgcmV0dXJuIGNvbHNOb3RJbmNsdWRlZDtcbiAgfVxuXG4gIGdldENvbHVtbk5hbWVzKGNvbHVtbnM6IHN0cmluZ1tdKTogeyBbY29sdW1uSWQ6IHN0cmluZ106IHN0cmluZzsgfSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5OYW1lcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IG9Db2x1bW4gPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChvYyA9PiBvYy5hdHRyID09PSBjKTtcbiAgICAgIHRhYmxlQ29sdW1uTmFtZXNbY10gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KG9Db2x1bW4udGl0bGUgPyBvQ29sdW1uLnRpdGxlIDogb0NvbHVtbi5hdHRyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFibGVDb2x1bW5OYW1lcztcbiAgfVxuXG4gIHJlc2V0Q29sdW1uc1dpZHRoKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbikpIHtcbiAgICAgICAgYy53aWR0aCA9IFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbi53aWR0aCkgPyBjLmRlZmluaXRpb24ud2lkdGggOiBjLmRlZmluaXRpb24ub3JpZ2luYWxXaWR0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYy53aWR0aCA9IFwiYXV0b1wiO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0RPTVdpZHRoKCk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW5zRE9NV2lkdGgoKSB7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XG4gICAgICBjLkRPTVdpZHRoID0gdGhpcy5nZXRUaFdpZHRoRnJvbU9Db2x1bW4oYyk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVDaGVja2JveChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgZGlzYWJsZSA9IGZhbHNlO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbih7IC4uLml0ZW0gfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXNhYmxlO1xuXG4gIH1cblxuICBnZXRTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgZ2V0U25hY2tTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLnNuYWNrQmFyU2VydmljZTtcbiAgfVxuXG4gIC8qKlxuICogUmVzb2x2ZXMgdGhlIGRhdGEgc291cmNlIHR5cGUgZm9yIGZpbHRlcmluZyBiYXNlZCBvbiB0YWJsZSBmaWx0ZXIgY29tcG9uZW50IHN0YXRlLlxuICogSXQgcHJpb3JpdGl6ZXMgc3BlY2lmaWMgY29tcG9uZW50IHZhbHVlcyBhbmQgZmFsbHMgYmFjayB0byBwYWdlYWJsZSBzdGF0ZS5cbiAqXG4gKiBAcmV0dXJucyAnY3VycmVudC1wYWdlJyB8ICdhbGwtZGF0YSdcbiAqL1xuICBnZXRTb3VyY2VEYXRhQnlGaWx0ZXJDb2x1bW4oY29sdW1uOiBPQ29sdW1uKTogJ2N1cnJlbnQtcGFnZScgfCAnYWxsLWRhdGEnIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50Py5nZXRGaWx0ZXJWYWx1ZXNJbkRhdGEoY29sdW1uLmF0dHIpIHx8XG4gICAgICAodGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50Py5maWx0ZXJWYWx1ZXNJbkRhdGEgfHxcbiAgICAgICAgJ2N1cnJlbnQtcGFnZScpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtblRpdGxlcyhjb2x1bW5zOiB7IGF0dHI6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF0VGFibGUgfHwgIXRoaXMub1RhYmxlT3B0aW9ucz8uY29sdW1ucykgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlcyB0aGUgdGl0bGVzIG9mIGV4aXN0aW5nIGNvbHVtbnNcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLm9UYWJsZU9wdGlvbnMuY29sdW1ucykge1xuICAgICAgY29uc3QgdXBkYXRlZCA9IGNvbHVtbnMuZmluZChjID0+IGMuYXR0ciA9PT0gY29sLmF0dHIpO1xuICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgY29sLnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh1cGRhdGVkLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5tYXRUYWJsZT8ucmVtb3ZlSGVhZGVyUm93RGVmKG51bGwpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiby10YWJsZS1jb250YWluZXJcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBzdHJldGNoXCIgW3N0eWxlLmRpc3BsYXldPVwiaXNWaXNpYmxlKCk/ICcnIDogJ25vbmUnXCJcbiAgW2NsYXNzLmJsb2NrLWV2ZW50c109XCJzaG93TG9hZGluZyB8IGFzeW5jXCI+XG5cbiAgPG8tZGF0YS10b29sYmFyICN0YWJsZVRvb2xiYXIgKm5nSWY9XCJoYXNDb250cm9scygpXCIgW3RpdGxlXT1cInRpdGxlXCIgW3Nob3ctdGl0bGVdPVwic2hvd1RpdGxlXCIgY2xhc3M9XCJvLXRhYmxlLXRvb2xiYXJcIj5cbiAgICA8bmctY29udGFpbmVyIG8tZGF0YS10b29sYmFyLXByb2plY3Rpb24tc3RhcnQ+XG4gICAgICA8by10YWJsZS1idXR0b25zICN0YWJsZUJ1dHRvbnMgW2luc2VydC1idXR0b25dPVwiaW5zZXJ0QnV0dG9uXCIgW3JlZnJlc2gtYnV0dG9uXT1cInJlZnJlc2hCdXR0b25cIiBbZGVsZXRlLWJ1dHRvbl09XCJzaG93RGVsZXRlQnV0dG9uXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm8tdGFibGUtYnV0dG9uXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9vLXRhYmxlLWJ1dHRvbnM+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdGFibGUtdG9vbGJhcl1bcG9zaXRpb249c3RhcnRdXCIgbmdQcm9qZWN0QXM9XCJbby1kYXRhLXRvb2xiYXItY3VzdG9tLXByb2plY3Rpb24tc3RhcnRdXCI+XG4gICAgPC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltvLXRhYmxlLXRvb2xiYXJdW3Bvc2l0aW9uPWVuZF1cIiBuZ1Byb2plY3RBcz1cIltvLWRhdGEtdG9vbGJhci1jdXN0b20tcHJvamVjdGlvbi1lbmRdXCI+XG4gICAgPC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltvLXRhYmxlLXRvb2xiYXJdXCIgbmdQcm9qZWN0QXM9XCJbby1kYXRhLXRvb2xiYXItY3VzdG9tLXByb2plY3Rpb24tc3RhcnRdXCI+XG4gICAgPC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250YWluZXIgby1kYXRhLXRvb2xiYXItcHJvamVjdGlvbi1lbmQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVpY2tmaWx0ZXJDb250ZW50Q2hpbGQ7IGVsc2UgZGVmYXVsdFF1aWNrRmlsdGVyXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm8tdGFibGUtcXVpY2tmaWx0ZXJcIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFF1aWNrRmlsdGVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVpY2tGaWx0ZXJcIj5cbiAgICAgICAgICA8by10YWJsZS1xdWlja2ZpbHRlciAob25DaGFuZ2UpPVwidGFibGVRdWlja0ZpbHRlckNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvby10YWJsZS1xdWlja2ZpbHRlcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93VGFibGVNZW51QnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGNsYXNzPVwiby10YWJsZS1tZW51LWJ1dHRvblwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ0YWJsZU1lbnUubWF0TWVudVwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTptb3JlX3ZlcnRcIj48L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8by10YWJsZS1tZW51ICN0YWJsZU1lbnUgW3NlbGVjdC1hbGwtY2hlY2tib3hdPVwic2VsZWN0QWxsQ2hlY2tib3hcIiBbZXhwb3J0LWJ1dHRvbl09XCJleHBvcnRCdXR0b25cIlxuICAgICAgICBbY29sdW1ucy12aXNpYmlsaXR5LWJ1dHRvbl09XCJjb2x1bW5zVmlzaWJpbGl0eUJ1dHRvblwiIFtzaG93LWNvbmZpZ3VyYXRpb24tb3B0aW9uXT1cInNob3dDb25maWd1cmF0aW9uT3B0aW9uXCJcbiAgICAgICAgW3Nob3ctZmlsdGVyLW9wdGlvbl09XCJzaG93RmlsdGVyT3B0aW9uXCIgW3Nob3ctcmVwb3J0LW9uLWRlbWFuZC1vcHRpb25dPVwic2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uXCJcbiAgICAgICAgW3Nob3ctY2hhcnRzLW9uLWRlbWFuZC1vcHRpb25dPVwic2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uXCIgW3Nob3ctcmVzZXQtd2lkdGgtb3B0aW9uXT1cInNob3dSZXNldFdpZHRoT3B0aW9uXCIgW3Nob3ctZ3JvdXAtYnktb3B0aW9uXT1cImdyb3VwYWJsZVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJvLXRhYmxlLW9wdGlvblwiPjwvbmctY29udGVudD5cbiAgICAgIDwvby10YWJsZS1tZW51PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L28tZGF0YS10b29sYmFyPlxuXG4gIDxkaXYgI3RhYmxlQm9keSBjbGFzcz1cIm8tdGFibGUtYm9keSBvLXNjcm9sbFwiIFtjbGFzcy5ob3Jpem9udGFsLXNjcm9sbF09XCJob3Jpem9udGFsU2Nyb2xsXCIgW2NsYXNzLnNjcm9sbGVkXT1cImhvcml6b250YWxTY3JvbGxlZFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsndmlzaWJpbGl0eSc6IHNwaW5uZXJDb250YWluZXIgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ31cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWVuYWJsZWRWaXJ0dWFsU2Nyb2xsOyBlbHNlIHRhYmxlV2l0aFZpcnR1YWxTY3JvbGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLXRhYmxlLW92ZXJmbG93IG8tc2Nyb2xsXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjdGFibGVXaXRoVmlydHVhbFNjcm9sbD5cbiAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgI3ZpcnR1YWxTY3JvbGxWaWV3UG9ydCBmeEZsZXg+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuICA8IS0tVEFCTEUgUEFHSU5BVE9SLS0+XG4gIDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hdG9yXCIgI21hdHBhZ2luYXRvciBbbGVuZ3RoXT1cImRhdGFTb3VyY2U/LnJlc3VsdHNMZW5ndGhcIiBbcGFnZUluZGV4XT1cInBhZ2luYXRvci5wYWdlSW5kZXhcIiBbcGFnZVNpemVdPVwicXVlcnlSb3dzXCJcbiAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2luYXRvci5wYWdlU2l6ZU9wdGlvbnNcIiAocGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJwYWdpbmF0b3Iuc2hvd0ZpcnN0TGFzdEJ1dHRvbnNcIlxuICAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBzcGlubmVyQ29udGFpbmVyID8gJ2hpZGRlbicgOiAndmlzaWJsZSd9XCI+XG4gIDwvbWF0LXBhZ2luYXRvcj5cblxuICA8IS0tTE9BRElORy0tPlxuICA8ZGl2ICNzcGlubmVyQ29udGFpbmVyICpuZ0lmPVwic2hvd0xvYWRpbmcgfCBhc3luY1wiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBbbmdTdHlsZV09XCJ7J3RvcC5weCc6IHRvb2xCYXJIZWlnaHR9XCJcbiAgICBjbGFzcz1cInNwaW5uZXItY29udGFpbmVyXCIgW2NsYXNzLnNwaW5uZXItY29udGFpbmVyLXNjcm9sbGFibGVdPVwibG9hZGluZ1Njcm9sbCB8IGFzeW5jXCI+XG4gICAgPG8tdGFibGUtc2tlbGV0b24+PC9vLXRhYmxlLXNrZWxldG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIERpc2FibGUgYmxvY2tlciAtLT5cbiAgPGRpdiAqbmdJZj1cIiFlbmFibGVkXCIgY2xhc3M9XCJvLXRhYmxlLWRpc2FibGVkLWJsb2NrZXJcIj48L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RhYmxlPlxuXG4gIDx0YWJsZSBtYXQtdGFibGUgI3RhYmxlIFtjbGFzcy5hdXRvYWRqdXN0ZWRdPVwiYXV0b0FkanVzdFwiIFt0cmFja0J5XT1cImdldFRyYWNrQnlGdW5jdGlvbigpXCIgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIG9NYXRTb3J0XG4gICAgW29NYXRTb3J0Q29sdW1uc109XCJzb3J0Q29sQXJyYXlcIiBbbmdDbGFzc109XCJyb3dIZWlnaHRPYnNlcnZhYmxlIHwgYXN5bmNcIiAoY2RrT2JzZXJ2ZUNvbnRlbnQpPVwicHJvamVjdENvbnRlbnRDaGFuZ2VkKClcIlxuICAgIFtvVGFibGVFeHBhbmRlZEZvb3Rlcl09XCIobG9hZGluZyB8IGFzeW5jKSA9PT0gZmFsc2VcIiBbb1RhYmxlRXhwYW5kZWRGb290ZXJDb2xzcGFuXT1cInZpc2libGVDb2xBcnJheS5sZW5ndGhcIiBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cInNob3dFeHBhbmRhYmxlUm93KClcIlxuICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJvbnRpbWl6ZS13ZWIgdGFibGVcIj5cblxuICAgIDwhLS1DaGVja2JveCBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm5hbWVcIiAqbmdJZj1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQ7IGVsc2UgY3VzdG9tSGVhZGVyU2VsZWN0QWxsVGVtcGxhdGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiICpuZ0lmPVwiaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKVwiPlxuICAgICAgICAgICAgPG8tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGwgW2NvbHVtbl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtblwiPjwvby10YWJsZS1oZWFkZXItc2VsZWN0LWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggbmFtZT1cImlkW11cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZUNoZWNrYm94KHJvdylcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3Rpb25DaGVja2JveFRvZ2dsZSgkZXZlbnQsIHJvdylcIiBbY2hlY2tlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21IZWFkZXJTZWxlY3RBbGxUZW1wbGF0ZT5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiIGNsYXNzPVwibWF0LWhlYWRlci1zZWxlY3QtYWxsLXdpdGgtdGl0bGUgby1jZW50ZXJcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi53aWR0aFwiIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4ob1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4pXCJcbiAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm1heFdpZHRoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxvLXRhYmxlLWhlYWRlci1zZWxlY3QtYWxsIFtjb2x1bW5dPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW5cIj48L28tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm8tY2VudGVyXCIgW3N0eWxlLndpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKG9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWF4V2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJpZFtdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVDaGVja2JveChyb3cpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0aW9uQ2hlY2tib3hUb2dnbGUoJGV2ZW50LCByb3cpXCIgW2NoZWNrZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG5cbiAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS1FeHBhbmRhYmxlIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwib1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uLm5hbWVcIiAqbmdJZj1cImlzQ29sdW1uRXhwYW5kYWJsZSgpXCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICB7eyBvVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udGl0bGUgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGRhdGFJbmRleFwiPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzaG93RXhwYW5kYWJsZUljb24ocm93LCByb3dJbmRleCkgfCBhc3luY1wiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVSb3dFeHBhbmRhYmxlKHJvdywgJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cInRvZ2dsZVJvd0V4cGFuZGFibGUocm93LCAkZXZlbnQpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRXhwYW5kZWQocm93KVwiPnt7IHRhYmxlUm93RXhwYW5kYWJsZS5pY29uQ29sbGFwc2UgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRXhwYW5kZWQocm93KVwiPnt7IHRhYmxlUm93RXhwYW5kYWJsZS5pY29uRXhwYW5kIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBHZW5lcmljIGNvbHVtbiBkZWZpbml0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBvVGFibGVPcHRpb25zLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCI+XG4gICAgICA8IS0tRGVmaW5lIGhlYWRlci1jZWxsLS0+XG5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW25nQ2xhc3NdPVwiZ2V0VGl0bGVBbGlnbkNsYXNzKGNvbHVtbilcIiBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKGNvbHVtbilcIiBbc3R5bGUubWF4LXdpZHRoXT1cImNvbHVtbi5tYXhXaWR0aFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgICAgPG8tdGFibGUtaGVhZGVyIFtjb2x1bW5dPVwiY29sdW1uXCI+PC9vLXRhYmxlLWhlYWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RoPlxuXG5cbiAgICAgIDwhLS1EZWZpbmUgbWF0LWNlbGwtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGUubXVsdGlUZW1wbGF0ZURhdGFSb3dzOyBlbHNlIGNlbGxUZW1wbGF0ZU11bHRpVGVtcGxhdGVEYXRhUm93c1wiPlxuICAgICAgICA8dGQgI2NlbGwgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGluZGV4IFwiIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiIChkYmxjbGljayk9XCJoYW5kbGVEb3VibGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIlxuICAgICAgICAgIFtjbGFzcy5lbXB0eS1jZWxsXT1cImlzRW1wdHkocm93W2NvbHVtbi5uYW1lXSlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFjb2x1bW4uaGFzVG9vbHRpcCgpXCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLmdldFRvb2x0aXAocm93KVwiXG4gICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNzUwXCIgbWF0VG9vbHRpcENsYXNzPVwiby10YWJsZS1jZWxsLXRvb2x0aXBcIlxuICAgICAgICAgIFtjbGFzcy5vLW1hdC1jZWxsLW11bHRpbGluZV09XCIoY29sdW1uLmlzTXVsdGlsaW5lIHwgYXN5bmMpXCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgICBbb0NvbnRleHRNZW51RGF0YV09XCJ7IGNlbGxOYW1lOmNvbHVtbi5uYW1lLCByb3dWYWx1ZTpyb3csIHJvd0luZGV4OnJvd0luZGV4fVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCJcbiAgICAgICAgICBbY2xhc3Muby10YWJsZS1lZGl0aW5nLWNlbGxdPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxSZW5kZXJlcjtjb250ZXh0Ontjb2x1bW46Y29sdW1uLHJvdzpyb3d9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbFRlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxuICAgICAgICA8dGQgI2NlbGwgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGRhdGFJbmRleCBcIiBbbmdDbGFzc109XCJbY29sdW1uLmNsYXNzTmFtZSwgZ2V0Q2VsbEFsaWduQ2xhc3MoY29sdW1uKV1cIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIiAoZGJsY2xpY2spPVwiaGFuZGxlRG91YmxlQ2xpY2socm93LCBjb2x1bW4sIHJvd0luZGV4LCBjZWxsLCAkZXZlbnQpXCJcbiAgICAgICAgICBbY2xhc3MuZW1wdHktY2VsbF09XCJpc0VtcHR5KHJvd1tjb2x1bW4ubmFtZV0pXCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhY29sdW1uLmhhc1Rvb2x0aXAoKVwiIFttYXRUb29sdGlwXT1cImNvbHVtbi5nZXRUb29sdGlwKHJvdylcIlxuICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcFNob3dEZWxheT1cIjc1MFwiIG1hdFRvb2x0aXBDbGFzcz1cIm8tdGFibGUtY2VsbC10b29sdGlwXCJcbiAgICAgICAgICBbY2xhc3Muby1tYXQtY2VsbC1tdWx0aWxpbmVdPVwiKGNvbHVtbi5pc011bHRpbGluZSB8IGFzeW5jKVwiIFtvQ29udGV4dE1lbnVdPVwidGFibGVDb250ZXh0TWVudVwiXG4gICAgICAgICAgW29Db250ZXh0TWVudURhdGFdPVwieyBjZWxsTmFtZTpjb2x1bW4ubmFtZSwgcm93VmFsdWU6cm93LCByb3dJbmRleDpyb3dJbmRleH1cIiBbc3R5bGUud2lkdGhdPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKGNvbHVtbilcIiBbc3R5bGUubWF4LXdpZHRoXT1cImNvbHVtbi5tYXhXaWR0aFwiXG4gICAgICAgICAgW2NsYXNzLm8tdGFibGUtZWRpdGluZy1jZWxsXT1cImlzUm93U2VsZWN0ZWQocm93KSAmJiBjb2x1bW4uZWRpdGluZ1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsUmVuZGVyZXI7Y29udGV4dDp7Y29sdW1uOmNvbHVtbixyb3c6cm93fVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPCEtLURlZmluZSBtYXQtZm9vdGVyLWNlbGwtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93VG90YWxzIHwgYXN5bmNcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbbmdDbGFzc109XCJjb2x1bW4uY2xhc3NOYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCIgKm5nSWY9XCJjb2x1bW4uYWdncmVnYXRlICYmIGNvbHVtbi5hZ2dyZWdhdGUudGl0bGVcIj5cbiAgICAgICAgICAgIHt7IGNvbHVtbi5hZ2dyZWdhdGUudGl0bGUgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW4ucmVuZGVyZXJcIj5cbiAgICAgICAgICAgIHt7IGRhdGFTb3VyY2UuZ2V0QWdncmVnYXRlRGF0YShjb2x1bW4pIH19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiY29sdW1uLnJlbmRlcmVyICYmIGNvbHVtbi5hZ2dyZWdhdGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4ucmVuZGVyZXIudGVtcGxhdGVyZWZcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjZWxsdmFsdWU6IGRhdGFTb3VyY2UuZ2V0QWdncmVnYXRlRGF0YShjb2x1bW4pfVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFeHBhbmRlZCBDb250ZW50IENvbHVtbiAtIFRoZSBkZXRhaWwgcm93IGlzIG1hZGUgdXAgb2YgdGhpcyBvbmUgY29sdW1uIHRoYXQgc3BhbnMgYWNyb3NzIGFsbCBjb2x1bW5zIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNFeHBhbmRlZFJvd1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJleHBhbmRlZERldGFpbFwiPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleD0gZGF0YUluZGV4XCIgW2F0dHIuY29sc3Bhbl09XCJvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0RXhwYW5kZWRSb3dDb250YWluZXJDbGFzcyhyb3dJbmRleClcIiBbQGRldGFpbEV4cGFuZF09XCJnZXRTdGF0ZUV4cGFuZChyb3cpXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS1GT09URVItSU5TRVJUQUJMRS0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TGFzdEluc2VydGFibGVSb3cgJiYgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm5hbWUgKyBnZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKClcIiAqbmdJZj1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIG9UYWJsZU9wdGlvbnMuY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWUrIGdldFN1ZmZpeENvbHVtbkluc2VydGFibGUoKVwiPlxuXG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWYgW25nQ2xhc3NdPVwiW2NvbHVtbi5jbGFzc05hbWUsIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbildXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgIW9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnNlcnRhYmxlLWZvcm0tZmllbGQgby10YWJsZS1jZWxsLWVkaXRvci10ZXh0IG8tdGFibGUtY2VsbC1lZGl0b3JcIiBbaGlkZVJlcXVpcmVkTWFya2VyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmdldFBsYWNlaG9sZGVyKGNvbHVtbilcIiBbaWRdPVwiY29sdW1uLmF0dHJcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmdldENvbnRyb2woY29sdW1uKVwiIFtyZXF1aXJlZF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uUmVxdWlyZWQoY29sdW1uKVwiPlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmNvbHVtbkhhc0Vycm9yKGNvbHVtbiwgJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICB7eyAnRk9STV9WQUxJREFUSU9OLlJFUVVJUkVEJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC51c2VDZWxsRWRpdG9yKGNvbHVtbilcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmNvbHVtbkVkaXRvcnNbY29sdW1uLmF0dHJdLnRlbXBsYXRlcmVmXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcm93dmFsdWU6IG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQucm93RGF0YSB9XCI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Rmlyc3RJbnNlcnRhYmxlUm93ICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJnZXRDb2x1bW5JbnNlcnRhYmxlKG9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm5hbWUpXCIgKm5nSWY9XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXCI+XG4gICAgICAgIDx0ZCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBvVGFibGVPcHRpb25zLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImdldENvbHVtbkluc2VydGFibGUoY29sdW1uLm5hbWUpXCI+XG5cbiAgICAgICAgPHRkIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbbmdDbGFzc109XCJbY29sdW1uLmNsYXNzTmFtZSwgZ2V0Q2VsbEFsaWduQ2xhc3MoY29sdW1uKV1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtbkluc2VydGFibGUoY29sdW1uKSAmJiAhb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC51c2VDZWxsRWRpdG9yKGNvbHVtbilcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImluc2VydGFibGUtZm9ybS1maWVsZFwiIFtoaWRlUmVxdWlyZWRNYXJrZXJdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuZ2V0UGxhY2Vob2xkZXIoY29sdW1uKVwiIFtpZF09XCJjb2x1bW4uYXR0clwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuZ2V0Q29udHJvbChjb2x1bW4pXCIgW3JlcXVpcmVkXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5SZXF1aXJlZChjb2x1bW4pXCI+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuY29sdW1uSGFzRXJyb3IoY29sdW1uLCAncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uUkVRVUlSRUQnIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtbkluc2VydGFibGUoY29sdW1uKSAmJiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnVzZUNlbGxFZGl0b3IoY29sdW1uKVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuY29sdW1uRWRpdG9yc1tjb2x1bW4uYXR0cl0udGVtcGxhdGVyZWZcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyByb3d2YWx1ZTogb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5yb3dEYXRhIH1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBEZWZpbml0aW9uIGNvbHVtbiBncm91cCBoZWFkZXIgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGdyb3VwaW5nSGVhZGVyc1Jvd3M7IGxldCBpID0gaW5kZXhcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtblwiPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGdyb3VwXCIgY2xhc3M9XCJncm91cGluZy1yb3dcIiBbb0NvbnRleHRNZW51XT1cInRhYmxlQ29udGV4dE1lbnVcIlxuICAgICAgICBbb0NvbnRleHRNZW51RGF0YV09XCJ7IGNlbGxOYW1lOmNvbHVtbiwgcm93VmFsdWU6Z3JvdXAsIHJvd0luZGV4Oml9XCIgW25nQ2xhc3NdPVwiZ2V0R3JvdXBIZWFkZXJDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpPT09MFwiIGNsYXNzPVwiZ3JvdXBpbmctdGl0bGUtd3JhcHBlclwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzogMjAqKGdyb3VwLmxldmVsLTEpKydweCd9XCI+XG4gICAgICAgICAgPG1hdC1pY29uPnt7IGdyb3VwLmV4cGFuZGVkID8gJ2V4cGFuZF9tb3JlJyA6ICdjaGV2cm9uX3JpZ2h0JyB9fTwvbWF0LWljb24+XG4gICAgICAgICAge3sgZ3JvdXAudGl0bGUgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cGluZy1hZ2dyZWdhdGVcIiAqbmdJZj1cImdyb3VwLmhhc0FjdGl2ZUFnZ3JlZ2F0ZSh2aXNpYmxlQ29sQXJyYXlbaV0pXCI+XG4gICAgICAgICAge3sgZ3JvdXAuZ2V0Q29sdW1uQWN0aXZlQWdncmVnYXRlVGl0bGUodmlzaWJsZUNvbEFycmF5W2ldKSB8IG9UcmFuc2xhdGUgfX0gOlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZ2V0T0NvbHVtbkZyb21Hcm91cEhlYWRlckNvbHVtbihjb2x1bW4pLnJlbmRlcmVyXCI+XG4gICAgICAgICAgICB7eyBncm91cC5nZXRDb2x1bW5BZ2dyZWdhdGVWYWx1ZSh2aXNpYmxlQ29sQXJyYXlbaV0pfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0T0NvbHVtbkZyb21Hcm91cEhlYWRlckNvbHVtbihjb2x1bW4pLnJlbmRlcmVyXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRPQ29sdW1uRnJvbUdyb3VwSGVhZGVyQ29sdW1uKGNvbHVtbikucmVuZGVyZXI/LnRlbXBsYXRlcmVmOyBjb250ZXh0OnsgY2VsbHZhbHVlOiAgZ3JvdXAuZ2V0Q29sdW1uQWdncmVnYXRlVmFsdWUodmlzaWJsZUNvbEFycmF5W2ldKSB9XCI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInBvc2l0aW9uXCI+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+IHt7cm93fX0gPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0ciAjdGFibGVIZWFkZXIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cIm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnM7IHN0aWNreTogZml4ZWRIZWFkZXJcIj48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWJsZS5tdWx0aVRlbXBsYXRlRGF0YVJvd3M7IGVsc2Ugcm93VGVtcGxhdGVNdWx0aVRlbXBsYXRlRGF0YVJvd3NcIj5cbiAgICAgIDx0ciBtYXQtcm93IG9UYWJsZVJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uczsgd2hlbjppc05vdEdyb3VwOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIiBbbmdDbGFzc109XCJyb3cgfCBvVGFibGVSb3dDbGFzczogcm93SW5kZXg6IHJvd0NsYXNzXCI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjcm93VGVtcGxhdGVNdWx0aVRlbXBsYXRlRGF0YVJvd3M+XG4gICAgICA8dHIgbWF0LXJvdyBvVGFibGVSb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IG9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnM7IHdoZW46aXNOb3RHcm91cDsgbGV0IHJvd0luZGV4ID0gZGF0YUluZGV4XCJcbiAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiIFtuZ0NsYXNzXT1cInJvdyB8IG9UYWJsZVJvd0NsYXNzOiByb3dJbmRleDogcm93Q2xhc3NcIj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gUm93IEdyb3VwIGhlYWRlciAtLT5cbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZ3JvdXBpbmdIZWFkZXJzUm93czsgd2hlbjppc0dyb3VwXCIgKGNsaWNrKT1cImdyb3VwSGVhZGVyQ2xpY2socm93KVwiXG4gICAgICBbbmdDbGFzc109XCJnZXRDbGFzc05hbWVHcm91cEhlYWRlcihyb3cpXCI+XG4gICAgPC90cj5cblxuICAgIDwhLS0gRXhwYW5kZWQgZGV0YWlsIHJvdy0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNFeHBhbmRlZFJvd1wiPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiby10YWJsZS1yb3ctZXhwYW5kZWRcIj48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dMYXN0SW5zZXJ0YWJsZVJvd1wiPlxuICAgICAgPHRyIG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLmNvbHVtbnNJbnNlcnRhYmxlczsgc3RpY2t5OiB0cnVlXCJcbiAgICAgICAgKGtleXVwKT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaGFuZGxlS2V5Ym9hcmRFdmVudCgkZXZlbnQpXCIgY2xhc3M9XCJvLXRhYmxlLWluc2VydGFibGVcIj48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Rmlyc3RJbnNlcnRhYmxlUm93XCI+XG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cIm9UYWJsZU9wdGlvbnMuY29sdW1uc0luc2VydGFibGVzOyBzdGlja3k6IHRydWVcIlxuICAgICAgICAoa2V5dXApPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5oYW5kbGVLZXlib2FyZEV2ZW50KCRldmVudClcIiBjbGFzcz1cIm8tdGFibGUtaW5zZXJ0YWJsZVwiPiA8L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93VG90YWxzIHwgYXN5bmNcIj5cbiAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwib1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uczsgc3RpY2t5OiB0cnVlXCIgY2xhc3M9XCJvLXRhYmxlLWFnZ3JlZ2F0ZVwiPlxuICAgICAgPC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90YWJsZT5cblxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZXh0TWVudUNvbnRlbnRDaGlsZCAmJiBjb250ZXh0TWVudVwiPlxuICA8by10YWJsZS1jb250ZXh0LW1lbnUgW2luc2VydF09XCJpbnNlcnRCdXR0b25cIiBbZWRpdF09XCJlZGl0aW9uTW9kZSAhPT0gRURJVF9NT0RFX05PTkVcIiBbdmlldy1kZXRhaWxdPVwiZGV0YWlsTW9kZSAhPT0gREVUQUlMX01PREVfTk9ORVwiXG4gICAgW3JlZnJlc2hdPVwicmVmcmVzaEJ1dHRvblwiIFtkZWxldGVdPVwiZGVsZXRlQnV0dG9uXCIgW2ZpbHRlcl09XCJzaG93RmlsdGVyT3B0aW9uXCIgW2dyb3VwLWJ5LXJvd109XCJncm91cGFibGVcIj5cbiAgPC9vLXRhYmxlLWNvbnRleHQtbWVudT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2NlbGxSZW5kZXJlciBsZXQtcm93PVwicm93XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiY29sdW1uLnJlbmRlcmVyICE9IG51bGwgJiYgKCFjb2x1bW4uZWRpdGluZyB8fCBjb2x1bW4uZWRpdGluZyAmJiAhaXNSb3dTZWxlY3RlZChyb3cpKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4ucmVuZGVyZXI/LnRlbXBsYXRlcmVmOyBjb250ZXh0OnsgY2VsbHZhbHVlOiByb3dbY29sdW1uLm5hbWVdLCByb3d2YWx1ZTpyb3cgfVwiPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc1Jvd1NlbGVjdGVkKHJvdykgJiYgY29sdW1uLmVkaXRpbmdcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uLmVkaXRvcj8udGVtcGxhdGVyZWY7IGNvbnRleHQ6eyBjZWxsdmFsdWU6IHJvd1tjb2x1bW4ubmFtZV0sIHJvd3ZhbHVlOnJvdyB9XCI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiY29sdW1uLnR5cGUgPT09ICdlZGl0QnV0dG9uSW5Sb3cnIHx8IGNvbHVtbi50eXBlID09PSAnZGV0YWlsQnV0dG9uSW5Sb3cnXCI+XG4gICAgICAgIDxkaXYgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBjbGFzcz1cIm8tYWN0aW9uLWNlbGwtcmVuZGVyZXJcIiAoY2xpY2spPVwib25EZXRhaWxCdXR0b25DbGljayhjb2x1bW4sIHJvdywgJGV2ZW50KVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj57eyBnZXREZXRhaWxCdXR0b25JY29uKGNvbHVtbikgfX08L21hdC1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0Pnt7IHJvd1tjb2x1bW4ubmFtZV0gfX08L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
2975
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9vLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL28tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBSUwsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBR04sUUFBUSxFQUNSLFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFN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QUFTLE1BTUwsZ0JBQWdCLE1BVXBCLDZCQUE2QixNQUU3QixlQUFlLE1BRWYsWUFBWSxNQUVaLFNBQVMsTUFFVCxTQUFTLE1BRVQsVUFBVSxNQUVWLFNBQVMsTUFFVCxxQkFBcUIsTUFFckIsc0JBQXNCLE1BRXRCLGFBQWEsTUFFYixXQUFXLE1Bb0JYLGlCQUFpQixNQTRIUCxXQUFXO3NCQURwQixTQUFTO3VCQUFDLFdBQVc7Z0JBR3RCLGFBQWE7c0JBRFosU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUc5QyxjQUFjO3NCQURiLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHekIsSUFBSTtzQkFBekIsWUFBWTt1QkFBQyxNQUFNO2dCQUNXLFFBQVE7c0JBQXRDLFNBQVM7dUJBQUMsUUFBUTtnQkFnQm5CLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxXQUFXO2dCQUl0QixZQUFZO3NCQURYLGVBQWU7dUJBQUMscUJBQXFCO2dCQU10QyxZQUFZO3NCQURYLGVBQWU7dUJBQUMscUJBQXFCO2dCQUl0Qyx1QkFBdUI7c0JBRHRCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUtyRCxrQkFBa0I7c0JBRGpCLGVBQWU7dUJBQUMsMkJBQTJCO2dCQUk1QyxnQ0FBZ0M7c0JBRC9CLFlBQVk7dUJBQUMsOEJBQThCO2dCQU81QyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUU7Z0JBK0JqQyx1QkFBdUI7c0JBRHRCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU0xRCxPQUFPO3NCQUROLFlBQVk7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uQ2hhbmdlLCBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IERvbVBvcnRhbE91dGxldCwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgVklSVFVBTF9TQ1JPTExfU1RSQVRFR1kgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TWVudSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFRhYiwgTWF0VGFiR3JvdXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCb29sZWFuQ29udmVydGVyLCBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZVNlcnZpY2VQcm92aWRlciwgT250aW1pemVTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgU25hY2tCYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc25hY2tiYXIuc2VydmljZSc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10YWJsZS1jb21wb25lbnQtc3RhdGUuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQ29tcG9uZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10YWJsZS1jb21wb25lbnQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBPQ29sdW1uRGlzcGxheSwgT0ZpbHRlckRlZmluaXRpb24sIE9Hcm91cGVkQ29sdW1uVHlwZXMsIE9UYWJsZUdsb2JhbENvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi90eXBlcy9leHByZXNzaW9uLnR5cGUnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9RdWVyeURhdGFBcmdzIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktZGF0YS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXJGdW5jdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL3F1aWNrLWZpbHRlci1mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IFNRTE9yZGVyIH0gZnJvbSAnLi4vLi4vdHlwZXMvc3FsLW9yZGVyLnR5cGUnO1xuaW1wb3J0IHsgT0NvbHVtbkFnZ3JlZ2F0ZSB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLWFnZ3JlZ2F0ZS50eXBlJztcbmltcG9ydCB7IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IsIE9Db2x1bW5WYWx1ZUZpbHRlciB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLXZhbHVlLWZpbHRlci50eXBlJztcbmltcG9ydCB7IFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4tZGF0YS50eXBlJztcbmltcG9ydCB7IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtaW5pdGlhbGl6YXRpb24tb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9UYWJsZU1lbnVQZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtbWVudS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9UYWJsZVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9ic2VydmFibGVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbC9hc3luYyc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvblV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9maWx0ZXItZXhwcmVzc2lvbi51dGlscyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc1V0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgeyBTZXJ2aWNlVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3NlcnZpY2UudXRpbHMnO1xuaW1wb3J0IHsgU1FMVHlwZXMgfSBmcm9tICcuLi8uLi91dGlsL3NxbHR5cGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT0NvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi4vY29udGV4dG1lbnUvby1jb250ZXh0LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9vLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEFic3RyYWN0T1NlcnZpY2VDb21wb25lbnQgfSBmcm9tICcuLi9vLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbkNhbGN1bGF0ZWRDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi9jYWxjdWxhdGVkL28tdGFibGUtY29sdW1uLWNhbGN1bGF0ZWQuY29tcG9uZW50JztcbmltcG9ydCB7IE9CYXNlVGFibGVDZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyL28tYmFzZS10YWJsZS1jZWxsLXJlbmRlcmVyLmNsYXNzJztcbmltcG9ydCB7IE9Db2x1bW4gfSBmcm9tICcuL2NvbHVtbi9vLWNvbHVtbi5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi9vLXRhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCB7IE9UYWJsZUNvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2NvbnRleHRtZW51L28tdGFibGUtY29udGV4dC1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWZhdWx0T1RhYmxlT3B0aW9ucyB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kZWZhdWx0LW8tdGFibGUtb3B0aW9ucy5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPQmFzZVRhYmxlUGFnaW5hdG9yIH0gZnJvbSAnLi9leHRlbnNpb25zL2Zvb3Rlci9wYWdpbmF0b3Ivby1iYXNlLXRhYmxlLXBhZ2luYXRvci5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWJ1dHRvbi9vLXRhYmxlLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uU2VsZWN0QWxsRGlyZWN0aXZlIH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW4tc2VsZWN0LWFsbC9vLXRhYmxlLWNvbHVtbi1zZWxlY3QtYWxsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPRmlsdGVyQ29sdW1uIH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9jb2x1bW5zL28tdGFibGUtY29sdW1ucy1maWx0ZXItY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9vLXRhYmxlLWNvbHVtbnMtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5zR3JvdXBpbmdDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWNvbHVtbnMtZ3JvdXBpbmcvY29sdW1ucy9vLXRhYmxlLWNvbHVtbnMtZ3JvdXBpbmctY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWhlYWRlci9vLXRhYmxlLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtaW5zZXJ0YWJsZS1yb3cvby10YWJsZS1pbnNlcnRhYmxlLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlT3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1vcHRpb24vby10YWJsZS1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUtZGF0YXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9UYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9vLXRhYmxlLXN0cmF0ZWd5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RhYmxlRGFvIH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUuZGFvJztcbmltcG9ydCB7IE9UYWJsZUdyb3VwZWRSb3cgfSBmcm9tICcuL2V4dGVuc2lvbnMvcm93L28tdGFibGUtcm93LWdyb3VwLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZVJvd0V4cGFuZGFibGVDb21wb25lbnQsIE9UYWJsZVJvd0V4cGFuZGVkQ2hhbmdlIH0gZnJvbSAnLi9leHRlbnNpb25zL3Jvdy90YWJsZS1yb3ctZXhwYW5kYWJsZS9vLXRhYmxlLXJvdy1leHBhbmRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPTWF0U29ydCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9zb3J0L28tbWF0LXNvcnQnO1xuaW1wb3J0IHsgT1RhYmxlQmFzZSB9IGZyb20gJy4vby10YWJsZS1iYXNlLmNsYXNzJztcbmltcG9ydCB7IE9fVEFCTEVfR0xPQkFMX0NPTkZJRyB9IGZyb20gJy4vdXRpbHMvby10YWJsZS50b2tlbnMnO1xuXG5pbXBvcnQgdHlwZSB7IElPQ29udGV4dE1lbnVDb250ZXh0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLWNvbnRleHQtbWVudS5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVCdXR0b24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtYnV0dG9uLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZUJ1dHRvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtYnV0dG9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVDb2x1bW5zR3JvdXBpbmcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtY29sdW1ucy1ncm91cGluZy1pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWRhdGFzb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlTWVudSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1tZW51LmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVQYWdpbmF0b3IgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtcGFnaW5hdG9yLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZVF1aWNrZmlsdGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLXF1aWNrZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2VydmljZS1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT1F1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktcGFyYW1zLnR5cGUnO1xuaW1wb3J0IHsgT19DT01QT05FTlRfU1RBVEVfU0VSVklDRSB9IGZyb20gJy4uLy4uL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHsgTWF0Um93LCBNYXRUYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE9UYWJsZUZpbHRlckJ5Q29sdW1uU2VydmljZSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kaWFsb2cvZmlsdGVyLWJ5LWNvbHVtbi9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4uc2VydmljZSc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uRGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGFnaW5hdGlvbi1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPVGFibGVMb2FkaW5nU2VydmljZSB9IGZyb20gJy4vby10YWJsZS1sb2FkaW5nLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlBVVFNfT19UQUJMRSA9IFtcbiAgLy8gdmlzaWJsZS1jb2x1bW5zIFtzdHJpbmddOiB2aXNpYmxlIGNvbHVtbnMsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAndmlzaWJsZUNvbHVtbnM6IHZpc2libGUtY29sdW1ucycsXG5cbiAgLy8gdmlzaWJsZS1jb2x1bW5zLWJ5LWRlZmF1bHQgW3N0cmluZ106IGNvbHVtbnMgdGhhdCBhcmUgdmlzaWJsZSBieSBkZWZhdWx0LCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2RlZmF1bHRWaXNpYmxlQ29sdW1uczogZGVmYXVsdC12aXNpYmxlLWNvbHVtbnMnLFxuXG4gIC8vIGVkaXRhYmxlLWNvbHVtbnMgW3N0cmluZ106IGNvbHVtbnMgdGhhdCBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IG92ZXIgdGhlIHRhYmxlLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgLy8gJ2VkaXRhYmxlQ29sdW1uczogZWRpdGFibGUtY29sdW1ucycsXG5cbiAgLy8gc29ydC1jb2x1bW5zIFtzdHJpbmddOiBpbml0aWFsIHNvcnRpbmcsIHdpdGggdGhlIGZvcm1hdCBjb2x1bW46W0FTQ3xERVNDXSwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdzb3J0Q29sdW1uczogc29ydC1jb2x1bW5zJyxcblxuICAncXVpY2tGaWx0ZXJDYWxsYmFjazogcXVpY2stZmlsdGVyLWZ1bmN0aW9uJyxcblxuICAvLyBkZWxldGUtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGRlbGV0ZSBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2RlbGV0ZUJ1dHRvbjogZGVsZXRlLWJ1dHRvbicsXG5cbiAgLy8gcmVmcmVzaC1idXR0b24gW25vfHllc106IHNob3cgcmVmcmVzaCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ3JlZnJlc2hCdXR0b246IHJlZnJlc2gtYnV0dG9uJyxcblxuICAvLyBjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uIFtub3x5ZXNdOiBzaG93IGNvbHVtbnMgdmlzaWJpbGl0eSBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2NvbHVtbnNWaXNpYmlsaXR5QnV0dG9uOiBjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uJyxcblxuICAvLyAvLyBjb2x1bW5zLXJlc2l6ZS1idXR0b24gW25vfHllc106IHNob3cgY29sdW1ucyByZXNpemUgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gIC8vICdjb2x1bW5zUmVzaXplQnV0dG9uOiBjb2x1bW5zLXJlc2l6ZS1idXR0b24nLFxuXG4gIC8vIC8vIGNvbHVtbnMtZ3JvdXAtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGNvbHVtbnMgZ3JvdXAgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gIC8vICdjb2x1bW5zR3JvdXBCdXR0b246IGNvbHVtbnMtZ3JvdXAtYnV0dG9uJyxcblxuICAvLyBleHBvcnQtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGV4cG9ydCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2V4cG9ydEJ1dHRvbjogZXhwb3J0LWJ1dHRvbicsXG5cbiAgLy8gc2hvdy1jb25maWd1cmF0aW9uLW9wdGlvbiBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IGNvbmZpZ3VyYXRpb24gYnV0dG9uIGluIGhlYWRlci4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0NvbmZpZ3VyYXRpb25PcHRpb246IHNob3ctY29uZmlndXJhdGlvbi1vcHRpb24nLFxuXG4gIC8vIHNob3ctYnV0dG9ucy10ZXh0IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGV4dCBvZiBoZWFkZXIgYnV0dG9ucy4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0J1dHRvbnNUZXh0OiBzaG93LWJ1dHRvbnMtdGV4dCcsXG5cbiAgLy8gc2VsZWN0LWFsbC1jaGVja2JveCBbeWVzfG5vfHRydWV8ZmFsc2VdOiAgc2hvdyBpbiB0aGUgbWVudSB0aGUgb3B0aW9uIG9mIHNlbGVjdGlvbiBjaGVjayBib3hlcyAuIERlZmF1bHQ6IG5vLlxuICAnc2VsZWN0QWxsQ2hlY2tib3g6IHNlbGVjdC1hbGwtY2hlY2tib3gnLFxuXG4gIC8vIHBhZ2luYXRpb24tY29udHJvbHMgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBwYWdpbmF0aW9uIGNvbnRyb2xzLiBEZWZhdWx0OiB5ZXMuXG4gICdwYWdpbmF0aW9uQ29udHJvbHM6IHBhZ2luYXRpb24tY29udHJvbHMnLFxuXG4gIC8vIGZpeC1oZWFkZXIgW3llc3xub3x0cnVlfGZhbHNlXTogZml4ZWQgaGVhZGVyIGFuZCBmb290ZXIgd2hlbiB0aGUgY29udGVudCBpcyBncmVhdGhlciB0aGFuIGl0cyBvd24gaGVpZ2h0LiBEZWZhdWx0OiB5ZXMuXG4gICdmaXhlZEhlYWRlcjogZml4ZWQtaGVhZGVyJyxcblxuICAvLyBzaG93LXRpdGxlIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGhlIHRhYmxlIHRpdGxlLiBEZWZhdWx0OiBuby5cbiAgJ3Nob3dUaXRsZTogc2hvdy10aXRsZScsXG5cbiAgLy8gZWRpdGlvbi1tb2RlIFtub25lIHwgaW5saW5lIHwgY2xpY2sgfCBkYmxjbGlja106IGVkaXRpb24gbW9kZS4gRGVmYXVsdCBub25lXG4gICdlZGl0aW9uTW9kZTogZWRpdGlvbi1tb2RlJyxcblxuICAvLyBzZWxlY3Rpb24tbW9kZSBbbm9uZSB8IHNpbXBsZSB8IG11bHRpcGxlIF06IHNlbGVjdGlvbiBtb2RlLiBEZWZhdWx0IG11bHRpcGxlXG4gICdzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb24tbW9kZScsXG5cbiAgJ2hvcml6b250YWxTY3JvbGw6IGhvcml6b250YWwtc2Nyb2xsJyxcblxuICAnc2hvd1BhZ2luYXRvckZpcnN0TGFzdEJ1dHRvbnM6IHNob3ctcGFnaW5hdG9yLWZpcnN0LWxhc3QtYnV0dG9ucycsXG5cbiAgJ2F1dG9BbGlnblRpdGxlczogYXV0by1hbGlnbi10aXRsZXMnLFxuXG4gICdtdWx0aXBsZVNvcnQ6IG11bHRpcGxlLXNvcnQnLFxuICAvLyBzZWxlY3QtYWxsLWNoZWNrYm94LXZpc2libGUgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBzZWxlY3Rpb24gY2hlY2sgYm94ZXMuRGVmYXVsdDogbm8uXG4gICdzZWxlY3RBbGxDaGVja2JveFZpc2libGU6IHNlbGVjdC1hbGwtY2hlY2tib3gtdmlzaWJsZScsXG5cbiAgJ29yZGVyYWJsZScsXG5cbiAgJ3Jlc2l6YWJsZScsXG5cbiAgJ2tlZXBTZWxlY3RlZEl0ZW1zOiBrZWVwLXNlbGVjdGVkLWl0ZW1zJyxcblxuICAvLyBleHBvcnQtbW9kZSBbJ3Zpc2libGUnfCdsb2NhbCd8J2FsbCddOiBzZXRzIHRoZSBtb2RlIHRvIGV4cG9ydCBkYXRhLiBEZWZhdWx0OiAndmlzaWJsZSdcbiAgJ2V4cG9ydE1vZGU6IGV4cG9ydC1tb2RlJyxcblxuICAvLyBleHBvcnRTZXJ2aWNlVHlwZSBbIHN0cmluZyBdOiBUaGUgc2VydmljZSB1c2VkIGJ5IHRoZSB0YWJsZSBmb3IgZXhwb3J0aW5nIGl0J3MgZGF0YSwgaXQgbXVzdCBpbXBsZW1lbnQgJ0lFeHBvcnRTZXJ2aWNlJyBpbnRlcmZhY2UuIERlZmF1bHQ6ICdPbnRpbWl6ZUV4cG9ydFNlcnZpY2UnXG4gICdleHBvcnRTZXJ2aWNlVHlwZTogZXhwb3J0LXNlcnZpY2UtdHlwZScsXG5cbiAgLy8gYXV0by1hZGp1c3QgW3RydWV8ZmFsc2VdOiBBdXRvIGFkanVzdCBjb2x1bW4gd2lkdGggdG8gZml0IGl0cyBjb250ZW50LiBEZWZhdWx0OiB0cnVlXG4gICdhdXRvQWRqdXN0OiBhdXRvLWFkanVzdCcsXG5cbiAgLy8gc2hvdy1maWx0ZXItb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgZmlsdGVyIG1lbnUgb3B0aW9uIGluIHRoZSBoZWFkZXIgbWVudS4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0ZpbHRlck9wdGlvbjogc2hvdy1maWx0ZXItb3B0aW9uJyxcblxuICAvLyB2aXNpYmxlLWV4cG9ydC1kaWFsb2ctYnV0dG9ucyBbc3RyaW5nXTogdmlzaWJsZSBidXR0b25zIGluIGV4cG9ydCBkaWFsb2csIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQvbm8gY29uZmlndXJlZDogc2hvdyBhbGwuIEVtcHR5IHZhbHVlOiBoaWRlIGFsbC5cbiAgJ3Zpc2libGVFeHBvcnREaWFsb2dCdXR0b25zOiB2aXNpYmxlLWV4cG9ydC1kaWFsb2ctYnV0dG9ucycsXG5cbiAgLy8gcm93LWNsYXNzIFtmdW5jdGlvbiwgKHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlcikgPT4gc3RyaW5nIHwgc3RyaW5nW11dOiBhZGRzIHRoZSBjbGFzcyBvciBjbGFzc2VzIHJldHVybmVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvbiB0byB0aGUgdGFibGUgcm93cy5cbiAgJ3Jvd0NsYXNzOiByb3ctY2xhc3MnLFxuXG4gIC8vIGZpbHRlci1jb2x1bW4tYWN0aXZlLWJ5LWRlZmF1bHQgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBpY29uIGZpbHRlciBieSBkZWZhdWx0IGluIHRoZSB0YWJsZS4gRGVmYXVsdDp5ZXNcbiAgJ2ZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDpmaWx0ZXItY29sdW1uLWFjdGl2ZS1ieS1kZWZhdWx0JyxcblxuICAvLyBncm91cGVkLWNvbHVtbnMgW3N0cmluZ106IGdyb3VwZWQgY29sdW1ucyBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2dyb3VwZWRDb2x1bW5zOiBncm91cGVkLWNvbHVtbnMnLFxuXG4gIC8vIGdyb3VwYWJsZVtib29sZWFuXTogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBjb2x1bW4gY2FuIGJlIGdyb3VwYWJsZS4gQnkgZGVmYXVsdDogdHJ1ZVxuICAnZ3JvdXBhYmxlJyxcblxuICAvLyBleHBhbmQtZ3JvdXBzLXNhbWUtbGV2ZWxbYm9vbGVhbl06IEluZGljYXRlcyBpZiBjbGljayBpbiByb3cgZXhwYW5kcy9jb2xsYXBzZXMgYWxsIHJvd3Mgb24gc2FtZSBsZXZlbC4gQnkgZGVmYXVsdDogdHJ1ZVxuICAnZXhwYW5kR3JvdXBzU2FtZUxldmVsOiBleHBhbmQtZ3JvdXBzLXNhbWUtbGV2ZWwnLFxuXG4gIC8vIGNvbGxhcHNlLWdyb3VwZWQtY29sdW1ucyBbeWVzfG5vfHRydWV8ZmFsc2VdOiBXaGV0aGVyIGNvbGxhcHNlIHRoZSBncm91cGVkIGNvbHVtbnMgYnkgZGVmYXVsdFxuICAnY29sbGFwc2VHcm91cGVkQ29sdW1uczogY29sbGFwc2UtZ3JvdXBlZC1jb2x1bW5zJyxcblxuICAvLyB2aXJ0dWFsLXNjcm9sbCBbeWVzfG5vfHRydWV8ZmFsc2VdOiBXaGV0aGVyIGVuYWJsZWQgb3Igbm90IHRoZSB2aXJ0dWFsIHNjcm9sbFxuICAndmlydHVhbFNjcm9sbDogdmlydHVhbC1zY3JvbGwnLFxuXG4gIC8vY29udGV4dC1tZW51IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0YWJsZSBjb250ZXh0IG1lbnVcbiAgJ2NvbnRleHRNZW51OiBjb250ZXh0LW1lbnUnLFxuXG4gIC8vIHNob3ctZXhwYW5kYWJsZS1pY29uLWZ1bmN0aW9uIFtmdW5jdGlvbl06IEV4cGFuZGFibGUgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZXhwYW5kYWJsZSBoYXMgZGF0YSB0byBzaG93IG9yIG5vdCBpY29uXG4gICdzaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbjogc2hvdy1leHBhbmRhYmxlLWljb24tZnVuY3Rpb24nLFxuXG4gIC8vIHNob3ctcmVwb3J0LW9uLWRlbWFuZC1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyByZXBvcnQgb24gZGVtYW5kIG9wdGlvbiBpbiB0aGUgdGFibGUgbWVudS4gRGVmYXVsdDogeWVzLlxuICAnc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uOiBzaG93LXJlcG9ydC1vbi1kZW1hbmQtb3B0aW9uJyxcblxuICAvLyBzaG93LWNoYXJ0cy1vbi1kZW1hbmQtb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgY2hhcnRzIG9uIGRlbWFuZCBvcHRpb24gaW4gdGhlIGhlYWRlciBtZW51XG4gICdzaG93Q2hhcnRzT25EZW1hbmRPcHRpb246IHNob3ctY2hhcnRzLW9uLWRlbWFuZC1vcHRpb24nLFxuXG4gIC8vIHNob3ctcmVzZXQtd2lkdGgtb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgcmVzZXQgd2lkdGggbWVudSBvcHRpb24gaW4gdGhlIGhlYWRlciBtZW51XG4gICdzaG93UmVzZXRXaWR0aE9wdGlvbjogc2hvdy1yZXNldC13aWR0aC1vcHRpb24nLFxuXG4gICdkaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb246IGRpc2FibGUtc2VsZWN0aW9uLWZ1bmN0aW9uJyxcblxuICAnbm9uSGlkYWJsZUNvbHVtbnM6IG5vbi1oaWRhYmxlLWNvbHVtbnMnLFxuICAncmVhZE9ubHk6IHJlYWQtb25seScsXG4gICdyZWFkT25seUNvbmZpZ3VyYXRpb246IHJlYWQtb25seS1jb25maWd1cmF0aW9uJyxcbiAgJ3Nob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5OiBzaG93LW5vdGlmaWNhdGlvbi1vZi1yZWFkLW9ubHknXG5dO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PVVRQVVRTX09fVEFCTEUgPSBbXG4gICdvblJvd1NlbGVjdGVkJyxcbiAgJ29uUm93RGVzZWxlY3RlZCcsXG4gICdvblJvd0RlbGV0ZWQnXG5dO1xuXG5jb25zdCBzdGlja3lIZWFkZXJTZWxlY3RvciA9ICcubWF0LW1kYy1oZWFkZXItcm93IC5tYXQtbWRjLXRhYmxlLXN0aWNreSc7XG5jb25zdCBzdGlja3lGb290ZXJTZWxlY3RvciA9ICcubWF0LW1kYy1mb290ZXItcm93IC5tYXQtbWRjLXRhYmxlLXN0aWNreSc7XG5jb25zdCByb3dTZWxlY3RvciA9ICcubWF0LW1kYy1yb3cnO1xuY29uc3QgaGVhZGVyU2VsZWN0b3IgPSAnLm1hdC1tZGMtaGVhZGVyLXJvdyc7XG5jb25zdCBmb290ZXJTZWxlY3RvciA9ICcubWF0LW1kYy1oZWFkZXItcm93JztcblxudHlwZSBEaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb24gPSAoaXRlbTogYW55KSA9PiBib29sZWFuO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIE9udGltaXplU2VydmljZVByb3ZpZGVyLFxuICAgIENvbXBvbmVudFN0YXRlU2VydmljZVByb3ZpZGVyLFxuICAgIE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlLFxuICAgIE9UYWJsZUZpbHRlckJ5Q29sdW1uU2VydmljZSxcbiAgICB7IHByb3ZpZGU6IE9fQ09NUE9ORU5UX1NUQVRFX1NFUlZJQ0UsIHVzZUNsYXNzOiBPVGFibGVDb21wb25lbnRTdGF0ZVNlcnZpY2UgfSxcbiAgICB7IHByb3ZpZGU6IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLCB1c2VDbGFzczogT1RhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0sXG4gICAgeyBwcm92aWRlOiBPVGFibGVCYXNlLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPVGFibGVDb21wb25lbnQpIH0sXG4gICAgT1RhYmxlTG9hZGluZ1NlcnZpY2VcbiAgXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG1pbkhlaWdodDogJzAnIH0pKSxcbiAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcbiAgICBdKVxuICBdLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fVEFCTEUsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1RBQkxFLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby10YWJsZV0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5vbnRpbWl6ZS10YWJsZV0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5vLXRhYmxlLWZpeGVkXSc6ICdmaXhlZEhlYWRlcicsXG4gICAgJ1tjbGFzcy5vLXRhYmxlLWRpc2FibGVkXSc6ICchZW5hYmxlZCcsXG4gICAgJyhkb2N1bWVudDpjbGljayknOiAnaGFuZGxlRE9NQ2xpY2soJGV2ZW50KSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBPVGFibGVDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdE9TZXJ2aWNlQ29tcG9uZW50PE9UYWJsZUNvbXBvbmVudFN0YXRlU2VydmljZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9CQVNFX1NJWkVfU1BJTk5FUiA9IDEwMDtcbiAgcHVibGljIHN0YXRpYyBGSVJTVF9MQVNUX0NFTExfUEFERElORyA9IDI0O1xuICBwdWJsaWMgc3RhdGljIEVYUEFOREVEX1JPV19DT05UQUlORVJfQ0xBU1MgPSAnZXhwYW5kZWQtcm93LWNvbnRhaW5lci0nO1xuICBwdWJsaWMgc3RhdGljIEFWQUlMQUJMRV9HUk9VUElOR19DT0xVTU5TX1JFTkRFUkVSUyA9IFsnY3VycmVuY3knLCAnaW50ZWdlcicsICdyZWFsJ107XG5cbiAgcHVibGljIERFVEFJTF9NT0RFX05PTkUgPSBDb2Rlcy5ERVRBSUxfTU9ERV9OT05FO1xuICBwdWJsaWMgRURJVF9NT0RFX05PTkUgPSBDb2Rlcy5FRElUSU9OX01PREVfTk9ORTtcblxuICBwcm90ZWN0ZWQgc25hY2tCYXJTZXJ2aWNlOiBTbmFja0JhclNlcnZpY2U7XG5cbiAgcHVibGljIHBhZ2luYXRvcjogT1RhYmxlUGFnaW5hdG9yO1xuXG4gIHNvcnQ6IE9NYXRTb3J0O1xuICBjbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDx7IHJvdzogYW55LCBjb2x1bW46IGFueSwgY2VsbFJlZjogYW55LCByb3dJbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCB9PigpO1xuICBkYmxjbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDx7IHJvdzogYW55LCBjb2x1bW46IGFueSwgY2VsbFJlZjogYW55LCByb3dJbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCB9PigpO1xuICBwcm90ZWN0ZWQgY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBkYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgcm93Q2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUgPSBmYWxzZTtcblxuICBsb2FkaW5nU2VydmljZTogT1RhYmxlTG9hZGluZ1NlcnZpY2U7XG5cbiAgQFZpZXdDaGlsZChPTWF0U29ydClcbiAgc2V0IG9NYXRTb3J0KF9zb3J0OiBPTWF0U29ydCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChfc29ydCkgJiZcbiAgICAgICghVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSB8fCAoVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSAmJiBVdGlsLnN0cmluZ2lmeSh0aGlzLnNvcnQpICE9PSBVdGlsLnN0cmluZ2lmeShfc29ydCkpKSkge1xuICAgICAgdGhpcy5zb3J0ID0gX3NvcnQ7XG4gICAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHZpcnR1YWxTY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gIHB1YmxpYyBvVGFibGVHbG9iYWxDb25maWc6IE9UYWJsZUdsb2JhbENvbmZpZztcbiAgQFZpZXdDaGlsZCgndmlydHVhbFNjcm9sbFZpZXdQb3J0Jykgc2V0IGNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCh2YWx1ZTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgaWYgKHZhbHVlICE9IHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJBbmRGb290ZXJTdGlja3lQb3NpdGlvbnMoKTtcbiAgICAgIGlmICh0aGlzLmNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24gPSB0aGlzLmNoZWNrVmlld1BvcnRTdWJqZWN0LnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gb25seSBmb3IgaW5zaWRlVGFiQnVnV29ya2Fyb3VuZFxuICBwcm90ZWN0ZWQgdGFibGVIZWFkZXJzOiBBcnJheTxPVGFibGVIZWFkZXJDb21wb25lbnQ+ID0gW107XG5cbiAgQFZpZXdDaGlsZCgnc3Bpbm5lckNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBzcGlubmVyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoT1RhYmxlUm93RXhwYW5kYWJsZUNvbXBvbmVudClcbiAgdGFibGVSb3dFeHBhbmRhYmxlOiBPVGFibGVSb3dFeHBhbmRhYmxlQ29tcG9uZW50O1xuXG4gIF9maWx0ZXJDb2x1bW5zOiBBcnJheTxPRmlsdGVyQ29sdW1uPjtcbiAgcG9ydGFsSG9zdDogQXJyYXk8RG9tUG9ydGFsT3V0bGV0PiA9IFtdO1xuICBvbkRhdGFMb2FkZWRDZWxsUmVuZGVyZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgdGFibGVDb250ZXh0TWVudTogT0NvbnRleHRNZW51Q29tcG9uZW50O1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZWxlY3RBbGxDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZXhwb3J0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDb25maWd1cmF0aW9uT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dGaWx0ZXJPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDaGFydHNPbkRlbWFuZE9wdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93QnV0dG9uc1RleHQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dSZXNldFdpZHRoT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEV4cGFuZGFibGUgaW5wdXQgY2FsbGJhY2sgZnVuY3Rpb25cbiAgc2hvd0V4cGFuZGFibGVJY29uRnVuY3Rpb246IChyb3c6IGFueSwgcm93SW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIHJlYWRPbmx5RnVuY3Rpb246IChjb25maWd1cmF0aW9uOiBhbnkpID0+IGJvb2xlYW47XG4gIHJlYWRPbmx5Q29uZmlndXJhdGlvbjogYW55O1xuXG4gIGlzQ29tcG9uZW50UmVhZE9ubHkoc2VsZWN0b3I6IHN0cmluZywgYXR0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHlDb25maWd1cmF0aW9uPy5bc2VsZWN0b3JdPy5bYXR0cl07XG4gIH1cbiAgcHJvdGVjdGVkIF9vVGFibGVPcHRpb25zOiBPVGFibGVPcHRpb25zO1xuXG4gIGdldCBvVGFibGVPcHRpb25zKCk6IE9UYWJsZU9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLl9vVGFibGVPcHRpb25zO1xuICB9XG5cbiAgc2V0IG9UYWJsZU9wdGlvbnModmFsdWU6IE9UYWJsZU9wdGlvbnMpIHtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zID0gdmFsdWU7XG4gIH1cblxuICBzZXQgcXVpY2tGaWx0ZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB2YWx1ZSA9IFV0aWwucGFyc2VCb29sZWFuKFN0cmluZyh2YWx1ZSkpO1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyID0gdmFsdWU7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXIgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBxdWlja0ZpbHRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcXVpY2tGaWx0ZXI7XG4gIH1cblxuICBzZXQgZmlsdGVyQ2FzZVNlbnNpdGl2ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2ZpbHRlckNhc2VTZW5zaXRpdmUgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucykge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXJDYXNlU2Vuc2l0aXZlID0gdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmlsdGVyQ2FzZVNlbnNpdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgfVxuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBpbnNlcnRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcmVmcmVzaEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBkZWxldGVCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZml4ZWRIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1RpdGxlOiBib29sZWFuID0gZmFsc2U7XG4gIGVkaXRpb25Nb2RlOiBzdHJpbmcgPSBDb2Rlcy5FRElUSU9OX01PREVfTk9ORTtcbiAgc2VsZWN0aW9uTW9kZTogc3RyaW5nID0gQ29kZXMuU0VMRUNUSU9OX01PREVfTVVMVElQTEU7XG5cbiAgcHJvdGVjdGVkIF9ob3Jpem9udGFsU2Nyb2xsID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZXQgaG9yaXpvbnRhbFNjcm9sbCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hvcml6b250YWxTY3JvbGwgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tT3JpZ2luYWxEZWZpbml0aW9uKCk7XG4gIH1cblxuICBnZXQgaG9yaXpvbnRhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faG9yaXpvbnRhbFNjcm9sbDtcbiAgfVxuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93UGFnaW5hdG9yRmlyc3RMYXN0QnV0dG9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBhdXRvQWxpZ25UaXRsZXM6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgbXVsdGlwbGVTb3J0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIG9yZGVyYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICByZXNpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgYXV0b0FkanVzdDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBncm91cGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZXhwYW5kR3JvdXBzU2FtZUxldmVsOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbGxhcHNlR3JvdXBlZENvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHZpcnR1YWxTY3JvbGw6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgY29udGV4dE1lbnU6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBNYWludGFpbmluZyB0aGlzIGdldHRlciB0byBhbGxvdyBjb21wb25lbnQgZXh0ZW5zaW9ucyAoYXZvaWRpbmcgYSBicmVha2luZyBjaGFuZ2UpXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9lbmFibGVkO1xuICB9XG4gIHByb3RlY3RlZCBfc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlOiBib29sZWFuO1xuICBzZXQgc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID0gQm9vbGVhbkNvbnZlcnRlcih2YWx1ZSk7XG4gICAgaWYgKHRoaXMuc3RhdGUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZSA9IEJvb2xlYW5Db252ZXJ0ZXIodGhpcy5zdGF0ZS5zZWxlY3RDb2x1bW5WaXNpYmxlKTtcbiAgICB9XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9IHRoaXMuX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZTtcbiAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlO1xuICB9XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGtlZXBTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgZXhwb3J0TW9kZTogc3RyaW5nID0gQ29kZXMuRVhQT1JUX01PREVfVklTSUJMRTtcbiAgcHVibGljIGV4cG9ydFNlcnZpY2VUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyB2aXNpYmxlRXhwb3J0RGlhbG9nQnV0dG9uczogc3RyaW5nO1xuICBwdWJsaWMgZGFvVGFibGU6IE9UYWJsZURhbyB8IG51bGw7XG4gIHB1YmxpYyBkYXRhU291cmNlOiBPVGFibGVEYXRhU291cmNlIHwgbnVsbDtcbiAgcHVibGljIHZpc2libGVDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBzZWFyY2hlYWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBkZWZhdWx0VmlzaWJsZUNvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIGdyb3VwZWRDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBub25IaWRhYmxlQ29sdW1uczogc3RyaW5nO1xuXG4gIHB1YmxpYyBzb3J0Q29sdW1uczogc3RyaW5nO1xuICBwdWJsaWMgZ3JvdXBlZENvbHVtblR5cGVzOiBPR3JvdXBlZENvbHVtblR5cGVzW10gPSBbXTtcbiAgcHVibGljIHJvd0NsYXNzOiAocm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKnBhcnNlZCBpbnB1dHMgdmFyaWFibGVzICovXG4gIHByb3RlY3RlZCBfdmlzaWJsZUNvbEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuXG4gIGdldCB2aXNpYmxlQ29sQXJyYXkoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sQXJyYXk7XG4gIH1cblxuICBzZXQgdmlzaWJsZUNvbEFycmF5KGFyZzogYW55W10pIHtcbiAgICBjb25zdCBwZXJtaXNzaW9uc0Jsb2NrZWQgPSB0aGlzLnBlcm1pc3Npb25zPy5jb2x1bW5zPy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlID09PSBmYWxzZSkubWFwKGNvbCA9PiBjb2wuYXR0cikgPz8gW107XG4gICAgY29uc3QgcGVybWlzc2lvbnNDaGVja2VkID0gYXJnLmZpbHRlcih2YWx1ZSA9PiBwZXJtaXNzaW9uc0Jsb2NrZWQuaW5kZXhPZih2YWx1ZSkgPT09IC0xKTtcblxuICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheSA9IHBlcm1pc3Npb25zQ2hlY2tlZDtcbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucykge1xuICAgICAgY29uc3QgY29udGFpbnNTZWxlY3Rpb25Db2wgPSB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmluZGV4T2YoQ29kZXMuTkFNRV9DT0xVTU5fU0VMRUNUKSAhPT0gLTE7XG4gICAgICBjb25zdCBjb250YWluc0V4cGFuZGFibGVDb2wgPSB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmluZGV4T2YoQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSkgIT09IC0xO1xuICAgICAgaWYgKGNvbnRhaW5zU2VsZWN0aW9uQ29sKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheS51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgICB9XG4gICAgICBpZiAoY29udGFpbnNTZWxlY3Rpb25Db2wgJiYgY29udGFpbnNFeHBhbmRhYmxlQ29sKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheSA9IFt0aGlzLl92aXNpYmxlQ29sQXJyYXlbMF1dLmNvbmNhdChDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFLCB0aGlzLl92aXNpYmxlQ29sQXJyYXkuc3BsaWNlKDEpKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRhaW5zRXhwYW5kYWJsZUNvbCkge1xuICAgICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheS51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zID0gdGhpcy5fdmlzaWJsZUNvbEFycmF5O1xuICAgICAgdGhpcy5ncm91cGluZ0hlYWRlcnNSb3dzID0gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5tYXAodmlzaWJsZUNvbCA9PiAnZ3JvdXBIZWFkZXItJyArIHZpc2libGVDb2wpO1xuICAgIH1cbiAgfVxuXG4gIHNvcnRDb2xBcnJheTogU1FMT3JkZXJbXSA9IFtdO1xuICAvKmVuZCBvZiBwYXJzZWQgaW5wdXRzIHZhcmlhYmxlcyAqL1xuXG4gIHByb3RlY3RlZCB0YWJHcm91cENvbnRhaW5lcjogTWF0VGFiR3JvdXA7XG4gIHByb3RlY3RlZCB0YWJDb250YWluZXI6IE1hdFRhYjtcbiAgdGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgcGVuZGluZ1F1ZXJ5OiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBwZW5kaW5nUXVlcnlGaWx0ZXIgPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIHNldFN0YXRpY0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGF2b2lkUXVlcnlDb2x1bW5zOiBBcnJheTxhbnk+ID0gW107XG4gIHByb3RlY3RlZCBhc3luY0xvYWRDb2x1bW5zOiBBcnJheTxhbnk+ID0gW107XG4gIHByb3RlY3RlZCBhc3luY0xvYWRTdWJzY3JpcHRpb25zOiBvYmplY3QgPSB7fTtcblxuICBwcm90ZWN0ZWQgcXVlcnlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGNvbnRleHRNZW51U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCB2aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBjaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgZmluaXNoUXVlcnlTdWJzY3JpcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgb25Sb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblJvd0Rlc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25Sb3dEZWxldGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uUmVpbml0aWFsaXplOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uQ29udGVudENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvbkZpbHRlckJ5Q29sdW1uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcm90ZWN0ZWQgc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHVibGljIG9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudDogT1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50O1xuICBwdWJsaWMgb1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDogT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dUb3RhbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBzaG93VG90YWxzOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zaG93VG90YWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU29ydGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdTb3J0aW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU29ydGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1Njcm9sbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGxvYWRpbmdTY3JvbGw6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTY3JvbGxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHB1YmxpYyBzaG93TG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBwdWJsaWMgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDogT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDtcbiAgcHVibGljIHNob3dGaXJzdEluc2VydGFibGVSb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dMYXN0SW5zZXJ0YWJsZVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZXhwYW5kYWJsZUl0ZW06IFNlbGVjdGlvbk1vZGVsPGFueT47XG5cbiAgcHJvdGVjdGVkIGNsaWNrVGltZXI7XG4gIHByb3RlY3RlZCBjbGlja0RlbGF5ID0gMjAwO1xuICBwcm90ZWN0ZWQgY2xpY2tQcmV2ZW50ID0gZmFsc2U7XG4gIHB1YmxpYyBlZGl0aW5nQ2VsbDogYW55O1xuICBwcm90ZWN0ZWQgZWRpdGluZ1JvdzogYW55O1xuXG4gIHNldCBjdXJyZW50UGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gdmFsO1xuICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gdmFsO1xuICAgICAgaWYgKHRoaXMubWF0cGFnaW5hdG9yKSB7XG4gICAgICAgIHRoaXMubWF0cGFnaW5hdG9yLnBhZ2VJbmRleCA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBwdWJsaWMgb1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQ6IE9UYWJsZVF1aWNrZmlsdGVyO1xuICBwcm90ZWN0ZWQgc29ydFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgb25SZW5kZXJlZERhdGFDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHByZXZpb3VzUmVuZGVyZXJEYXRhO1xuXG4gIHF1aWNrRmlsdGVyQ2FsbGJhY2s6IFF1aWNrRmlsdGVyRnVuY3Rpb247XG4gIGRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbjogRGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keScpXG4gIHByb3RlY3RlZCB0YWJsZUJvZHlFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVIZWFkZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgdGFibGVIZWFkZXJFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVUb29sYmFyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHRhYmxlVG9vbGJhckVsOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGRyZW4oTWF0Um93KSByb3dzITogUXVlcnlMaXN0PE1hdFJvdz47XG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUpIHByb3RlY3RlZCBtYXRUYWJsZTogTWF0VGFibGU8YW55PjtcblxuICBob3Jpem9udGFsU2Nyb2xsZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBvblVwZGF0ZVNjcm9sbGVkU3RhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgcm93V2lkdGg7XG5cbiAgc3RvcmVQYWdpbmF0aW9uU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiBJbiB0aGUgY2FzZSB0aGUgdGFibGUgaGF2ZW50IHBhZ2luYXRpb25Db250cm9sIGFuZCBwYWdlYWJsZSwgdGhlIHRhYmxlIGhhcyBwYWdpbmF0aW9uIHZpcnR1YWwqL1xuICBwYWdlU2Nyb2xsVmlydHVhbCA9IDE7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1JPV19IRUlHSFQgPSAzNjtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPVGFibGVQZXJtaXNzaW9ucztcbiAgbWF0TWVudTogTWF0TWVudTtcblxuICBAVmlld0NoaWxkKCd0YWJsZU1lbnUnKVxuICBvVGFibGVNZW51OiBPVGFibGVNZW51O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlT3B0aW9uQ29tcG9uZW50KVxuICB0YWJsZU9wdGlvbnM6IFF1ZXJ5TGlzdDxPVGFibGVPcHRpb25Db21wb25lbnQ+O1xuXG4gIG9UYWJsZUJ1dHRvbnM6IE9UYWJsZUJ1dHRvbnM7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihPVGFibGVCdXR0b25Db21wb25lbnQpXG4gIHRhYmxlQnV0dG9uczogUXVlcnlMaXN0PE9UYWJsZUJ1dHRvbj47XG5cbiAgQENvbnRlbnRDaGlsZCgnby10YWJsZS1xdWlja2ZpbHRlcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHF1aWNrZmlsdGVyQ29udGVudENoaWxkOiBPVGFibGVRdWlja2ZpbHRlcjtcblxuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50KVxuICBleHBvcnRPcHRzVGVtcGxhdGU6IFF1ZXJ5TGlzdDxPVGFibGVFeHBvcnRCdXR0b25Db21wb25lbnQ+XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUpXG4gIHRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkOiBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmU7XG5cblxuXG4gIHB1YmxpYyBncm91cGVkQ29sdW1uc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgW10pXG4gIHVwZGF0ZVNjcm9sbGVkU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG9yaXpvbnRhbFNjcm9sbCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZHlXaWR0aCA9IHRoaXMudGFibGVCb2R5RWwubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSB0aGlzLnRhYmxlQm9keUVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0aGlzLmhvcml6b250YWxTY3JvbGxlZDtcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsU2Nyb2xsZWQgPSBzY3JvbGxXaWR0aCA+IGJvZHlXaWR0aDtcbiAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT09IHRoaXMuaG9yaXpvbnRhbFNjcm9sbGVkKSB7XG4gICAgICAgICAgdGhpcy5vblVwZGF0ZVNjcm9sbGVkU3RhdGUuZW1pdCh0aGlzLmhvcml6b250YWxTY3JvbGxlZCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVmlld3BvcnRTaXplKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2lzQ29sdW1uRmlsdGVyc0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBpc0NvbHVtbkZpbHRlcnNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQ29sdW1uRmlsdGVyc0FjdGl2ZTtcbiAgfVxuXG4gIHNldCBpc0NvbHVtbkZpbHRlcnNBY3RpdmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gdmFsO1xuICB9XG5cbiAgZ3JvdXBpbmdIZWFkZXJzUm93czogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgb1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50OiBPVGFibGVDb2x1bW5zR3JvdXBpbmc7XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVDb250ZXh0TWVudUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgY29udGV4dE1lbnVDb250ZW50Q2hpbGQ6IE9UYWJsZUNvbnRleHRNZW51Q29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCB0cmlnZ2VyU2VsZWN0aW9uRXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcblxuICBAVmlld0NoaWxkcmVuKE1hdFRvb2x0aXApXG4gIHRvb2x0aXA6IFF1ZXJ5TGlzdDxNYXRUb29sdGlwPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gT0Zvcm1Db21wb25lbnQpKSBmb3JtOiBPRm9ybUNvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZJUlRVQUxfU0NST0xMX1NUUkFURUdZKSBwdWJsaWMgcmVhZG9ubHkgc2Nyb2xsU3RyYXRlZ3k6IE9UYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneVxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgZWxSZWYsIGZvcm0pO1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChPVGFibGVMb2FkaW5nU2VydmljZSk7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5zdWJzY3JpYmUoKGxvYWRpbmc6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyhsb2FkaW5nKTtcbiAgICB9KTtcbiAgICB0aGlzLnNob3dMb2FkaW5nID0gdGhpcy5sb2FkaW5nU2VydmljZS5zaG93TG9hZGluZyQ7XG5cbiAgICB0aGlzLl9vVGFibGVPcHRpb25zID0gbmV3IERlZmF1bHRPVGFibGVPcHRpb25zKCk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy50YWJHcm91cENvbnRhaW5lciA9IHRoaXMuaW5qZWN0b3IuZ2V0KE1hdFRhYkdyb3VwKTtcbiAgICAgIHRoaXMudGFiQ29udGFpbmVyID0gdGhpcy5pbmplY3Rvci5nZXQoTWF0VGFiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG8gbm90aGluZyBkdWUgdG8gbm90IGFsd2F5cyBpcyBjb250YWluZWQgb24gdGFiLlxuICAgIH1cblxuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoU25hY2tCYXJTZXJ2aWNlKTtcbiAgICB0aGlzLmdldEluamVjdGlvblRva2VuQ29uZmlnKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEluamVjdGlvblRva2VuQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvVGFibGVHbG9iYWxDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChPX1RBQkxFX0dMT0JBTF9DT05GSUcpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5hdXRvQWRqdXN0KSkge1xuICAgICAgICB0aGlzLmF1dG9BZGp1c3QgPSBvVGFibGVHbG9iYWxDb25maWcuYXV0b0FkanVzdDtcbiAgICAgIH07XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BbGlnblRpdGxlcykpIHtcbiAgICAgICAgdGhpcy5hdXRvQWxpZ25UaXRsZXMgPSBvVGFibGVHbG9iYWxDb25maWcuYXV0b0FsaWduVGl0bGVzO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQpKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0ID0gb1RhYmxlR2xvYmFsQ29uZmlnLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuZWRpdGlvbk1vZGUpICYmIENvZGVzLmlzVmFsaWRFZGl0aW9uTW9kZShvVGFibGVHbG9iYWxDb25maWcuZWRpdGlvbk1vZGUpKSB7XG4gICAgICAgIHRoaXMuZWRpdGlvbk1vZGUgPSBvVGFibGVHbG9iYWxDb25maWcuZWRpdGlvbk1vZGU7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmRldGFpbE1vZGUgJiYgQ29kZXMuaXNWYWxpZERldGFpbE1vZGUob1RhYmxlR2xvYmFsQ29uZmlnLmRldGFpbE1vZGUpKSkge1xuICAgICAgICB0aGlzLmRldGFpbE1vZGUgPSBvVGFibGVHbG9iYWxDb25maWcuZGV0YWlsTW9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5yb3dIZWlnaHQpICYmIENvZGVzLmlzVmFsaWRSb3dIZWlnaHQob1RhYmxlR2xvYmFsQ29uZmlnLnJvd0hlaWdodCkpIHtcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSBvVGFibGVHbG9iYWxDb25maWcucm93SGVpZ2h0O1xuICAgICAgfTtcblxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5zaG93Q2hhcnRzT25EZW1hbmRPcHRpb24pKSB7XG4gICAgICAgIHRoaXMuc2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uID0gb1RhYmxlR2xvYmFsQ29uZmlnLnNob3dDaGFydHNPbkRlbWFuZE9wdGlvbjtcbiAgICAgIH07XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLnNob3dSZXBvcnRPbkRlbWFuZE9wdGlvbikpIHtcbiAgICAgICAgdGhpcy5zaG93UmVwb3J0T25EZW1hbmRPcHRpb24gPSBvVGFibGVHbG9iYWxDb25maWcuc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uO1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG8gbm90aGluZyBiZWNhdXNlIGlzIG9wdGlvbmFsXG4gICAgfVxuXG4gIH1cblxuICBnZXQgc3RhdGUoKTogT1RhYmxlQ29tcG9uZW50U3RhdGVDbGFzcyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLnN0YXRlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgaWYgKHRoaXMub1RhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9UYWJsZUJ1dHRvbnMucmVnaXN0ZXJCdXR0b25zKHRoaXMudGFibGVCdXR0b25zLnRvQXJyYXkoKSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLmFmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLmluaXRUYWJsZUFmdGVyVmlld0luaXQoKTtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm1hdE1lbnUgPSB0aGlzLm9UYWJsZU1lbnUubWF0TWVudTtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5yZWdpc3Rlck9wdGlvbnModGhpcy50YWJsZU9wdGlvbnMudG9BcnJheSgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpIHtcbiAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5tdWx0aXBsZSwgW10sIHRydWUsIHRoaXMuY29tcGFyZVJvdygpKTtcbiAgICAgIHRoaXMuY3JlYXRlRXhwYW5kYWJsZUNvbHVtbigpO1xuICAgICAgdGhpcy5leHBhbmRhYmxlSXRlbS5jaGFuZ2VkLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZVJvd0V4cGFuZFN0YXRlKGNoYW5nZS5hZGRlZCwgY2hhbmdlLnJlbW92ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucm93Q2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3dzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlVGFibGVEYXRhQ2hhbmdlKCk7XG4gICAgfSk7XG5cblxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkKSB7XG4gICAgICB0aGlzLnNldEN1c3RvbURlZmluaXRpb25JblNlbGVjdENvbHVtbih0aGlzLnRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVRhYmxlRGF0YUNoYW5nZSgpIHtcbiAgICB0aGlzLnJlc3RvcmVFeHBhbmRhYmxlUm93U3RhdGUoKTtcbiAgfVxuXG4gIHNldEN1c3RvbURlZmluaXRpb25JblNlbGVjdENvbHVtbihkZWZpbml0aW9uOiBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUpIHtcbiAgICBpZiAoZGVmaW5pdGlvbi50aXRsZSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udGl0bGUgPSBkZWZpbml0aW9uLnRpdGxlO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi53aWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ud2lkdGggPSBkZWZpbml0aW9uLndpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5taW5XaWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWluV2lkdGggPSBkZWZpbml0aW9uLm1pbldpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5tYXhXaWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWF4V2lkdGggPSBkZWZpbml0aW9uLm1heFdpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5yZXNpemFibGUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnJlc2l6YWJsZSA9IGRlZmluaXRpb24ucmVzaXphYmxlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BOYW1lOiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjaGFuZ2VzLmF1dG9BZGp1c3QpICYmIGNoYW5nZXMuYXV0b0FkanVzdC5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuYXV0b0FkanVzdC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLmF1dG9BZGp1c3QgPSBjaGFuZ2VzLmF1dG9BZGp1c3QuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUhlYWRlckFuZEZvb3RlclN0aWNreVBvc2l0aW9ucygpIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uID0gdGhpcy5zY3JvbGxTdHJhdGVneS5zdGlja3lDaGFuZ2UucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZml4ZWRIZWFkZXIgfHwgdGhpcy5oYXNJbnNlcnRhYmxlUm93KCkpXG4gICAgICApLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUhlYWRlclNlbGVjdG9yKS5mb3JFYWNoKChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRvcCA9IC0geCArICdweCc7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3RpY2t5Rm9vdGVyU2VsZWN0b3IpLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm90dG9tID0geCArICdweCc7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUV4cGFuZGFibGVDb2x1bW4oKSB7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uID0gbmV3IE9Db2x1bW4oKTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udmlzaWJsZSA9IHRoaXMudGFibGVSb3dFeHBhbmRhYmxlICYmIHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLmV4cGFuZGFibGVDb2x1bW5WaXNpYmxlO1xuICAgIHRoaXMudXBkYXRlU3RhdGVFeHBhbmRlZENvbHVtbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG5cbiAgICAvL2RldGFjaCBhbGwgcG9ydGEgaG9zdCBjcmVhdGVkXG4gICAgaWYgKHRoaXMucG9ydGFsSG9zdCkge1xuICAgICAgdGhpcy5wb3J0YWxIb3N0LmZvckVhY2goeCA9PiB4LmRldGFjaCgpKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBnZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKCkge1xuICAgIHJldHVybiBDb2Rlcy5TVUZGSVhfQ09MVU1OX0lOU0VSVEFCTEU7XG4gIH1cblxuICBnZXRBY3Rpb25zUGVybWlzc2lvbnMoKTogT1Blcm1pc3Npb25zW10ge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgfVxuXG4gIGdldE1lbnVQZXJtaXNzaW9ucygpOiBPVGFibGVNZW51UGVybWlzc2lvbnMge1xuICAgIGNvbnN0IHJlc3VsdDogT1RhYmxlTWVudVBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9ucyA/IHRoaXMucGVybWlzc2lvbnMubWVudSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDoge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBpdGVtczogW11cbiAgICB9O1xuICB9XG5cbiAgZ2V0T0NvbHVtblBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5jb2x1bW5zIHx8IFtdKSA6IFtdO1xuICAgIHJldHVybiBjb2x1bW5zLmZpbmQoY29tcCA9PiBjb21wLmF0dHIgPT09IGF0dHIpIHx8IHsgYXR0cjogYXR0ciwgZW5hYmxlZDogdHJ1ZSwgdmlzaWJsZTogdHJ1ZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFjdGlvblBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgYWN0aW9uc1Blcm0gPSB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gYWN0aW9uc1Blcm0uZmluZChwID0+IHAuYXR0ciA9PT0gYXR0cik7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zIHx8IHtcbiAgICAgIGF0dHI6IGF0dHIsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihhdHRyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3Rpb25zUGVybSA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5hY3Rpb25zIHx8IFtdKSA6IFtdO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnMgPSBhY3Rpb25zUGVybS5maW5kKHAgPT4gcC5hdHRyID09PSBhdHRyKTtcbiAgICBjb25zdCBlbmFibGVkUGVybWlzaW9uID0gUGVybWlzc2lvbnNVdGlscy5jaGVja0VuYWJsZWRQZXJtaXNzaW9uKHBlcm1pc3Npb25zKTtcbiAgICBpZiAoIWVuYWJsZWRQZXJtaXNpb24pIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9QRVJNSVNTSU9OJyk7XG4gICAgfVxuICAgIHJldHVybiBlbmFibGVkUGVybWlzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB3aGF0IGluaXRpYWxpemUgdmFycyBhbmQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpOiBhbnkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMgPSBuZXcgRGVmYXVsdE9UYWJsZU9wdGlvbnMoKTtcbiAgICBpZiAodGhpcy50YWJHcm91cENvbnRhaW5lciAmJiB0aGlzLnRhYkNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZWdpc3RlclRhYkxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlckNsaWNrTGlzdGVuZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGJsQ2xpY2tMaXN0ZW5lcigpO1xuICAgIC8vIEluaXRpYWxpemUgcGFyYW1zIG9mIHRoZSB0YWJsZVxuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtcygpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplRGFvKCk7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuZ2V0VGFibGVQZXJtaXNzaW9ucyh0aGlzLm9hdHRyLCB0aGlzLmFjdFJvdXRlKTtcbiAgfVxuXG4gIGluaXRpYWxpemVMb2FkaW5nU3ViamVjdCgpIHtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24gPSB0aGlzLmNsaWNrU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuY2xpY2tEZWxheSkpIC8vIEVzcGVyYSBlbCB0aWVtcG8gY29uZmlndXJhZG8gYW50ZXMgZGUgZWplY3V0YXJcbiAgICAgIC5zdWJzY3JpYmUoKHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm9lbmFibGVkICYmICF0aGlzLnJlYWRPbmx5ICYmIGNvbHVtbi5lZGl0b3JcbiAgICAgICAgICAmJiAodGhpcy5kZXRhaWxNb2RlICE9PSBDb2Rlcy5ERVRBSUxfTU9ERV9DTElDSylcbiAgICAgICAgICAmJiAodGhpcy5lZGl0aW9uTW9kZSA9PT0gQ29kZXMuRURJVElPTl9NT0RFX0NMSUNLKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbiwgcm93LCBjZWxsUmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRvSGFuZGxlQ2xpY2socm93LCBjb2x1bW4uYXR0ciwgcm93SW5kZXgsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJEYmxDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbiA9IHRoaXMuZGJsY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5jbGlja0RlbGF5KSkgLy8gRXNwZXJhIGVsIHRpZW1wbyBjb25maWd1cmFkbyBhbnRlcyBkZSBlamVjdXRhclxuICAgICAgLnN1YnNjcmliZSgoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZW5hYmxlZCAmJiBjb2x1bW4uZWRpdG9yXG4gICAgICAgICAgJiYgKCFDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmRldGFpbE1vZGUpKVxuICAgICAgICAgICYmIChDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmVkaXRpb25Nb2RlKSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlQ29sdW1uRWRpdGlvbihjb2x1bW4sIHJvdywgY2VsbFJlZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRvdWJsZUNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiBldmVudCwgY29sdW1uTmFtZTogY29sdW1uLmF0dHIsIGNlbGw6IHJvd1tjb2x1bW4uYXR0cl0gfSk7XG4gICAgICAgICAgaWYgKHRoaXMub2VuYWJsZWQgJiYgQ29kZXMuaXNEb3VibGVDbGlja01vZGUodGhpcy5kZXRhaWxNb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGV0YWlsKHJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVEYW8oKSB7XG4gICAgLy8gQ29uZmlndXJlIGRhbyBtZXRob2RzXG4gICAgY29uc3QgcXVlcnlNZXRob2ROYW1lID0gdGhpcy5wYWdlYWJsZSA/IHRoaXMucGFnaW5hdGVkUXVlcnlNZXRob2QgOiB0aGlzLnF1ZXJ5TWV0aG9kO1xuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBxdWVyeTogcXVlcnlNZXRob2ROYW1lLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZU1ldGhvZCxcbiAgICAgIGRlbGV0ZTogdGhpcy5kZWxldGVNZXRob2QsXG4gICAgICBpbnNlcnQ6IHRoaXMuaW5zZXJ0TWV0aG9kXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnN0YXRpY0RhdGEpIHtcbiAgICAgIHRoaXMucXVlcnlPbkJpbmQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlcnlPbkluaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGFvVGFibGUgPSBuZXcgT1RhYmxlRGFvKHVuZGVmaW5lZCwgdGhpcy5lbnRpdHksIG1ldGhvZHMpO1xuICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5zdGF0aWNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgICB0aGlzLmRhb1RhYmxlID0gbmV3IE9UYWJsZURhbyh0aGlzLmRhdGFTZXJ2aWNlLCB0aGlzLmVudGl0eSwgbWV0aG9kcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHJlaW5pdGlhbGl6ZSB0YWJsZSBhZGRpbmcgb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgcmVpbml0aWFsaXplKG9wdGlvbnM6IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBjb25zdCBjbG9uZWRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZW50aXR5JykpIHtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBjbG9uZWRPcHRzLmVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdzZXJ2aWNlJykpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gY2xvbmVkT3B0cy5zZXJ2aWNlO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2NvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBjbG9uZWRPcHRzLmNvbHVtbnM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gY2xvbmVkT3B0cy52aXNpYmxlQ29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA9IGNsb25lZE9wdHMuZGVmYXVsdFZpc2libGVDb2x1bW5zO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2tleXMnKSkge1xuICAgICAgICB0aGlzLmtleXMgPSBjbG9uZWRPcHRzLmtleXM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnc29ydENvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zID0gY2xvbmVkT3B0cy5zb3J0Q29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdwYXJlbnRLZXlzJykpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRLZXlzID0gY2xvbmVkT3B0cy5wYXJlbnRLZXlzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyQ29sdW1ucycpKSB7XG4gICAgICAgIGlmICghdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ID0gbmV3IE9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQodGhpcy5pbmplY3RvciwgdGhpcyk7XG4gICAgICAgICAgdGhpcy5vVGFibGVNZW51Lm9uVmlzaWJsZUZpbHRlck9wdGlvbkNoYW5nZS5uZXh0KHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KTtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IGNsb25lZE9wdHMuZmlsdGVyQ29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IHRoaXMuc2VhcmNoZWFibGVDb2x1bW5zLmpvaW4oXCI7XCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdGF0ZS5yZXNldCh0aGlzLnBhZ2VhYmxlKTtcbiAgICBpZiAob3B0aW9ucz8uZGF0YSkge1xuICAgICAgdGhpcy5zZXREYXRhKG9wdGlvbnMuZGF0YS5kYXRhLCBvcHRpb25zLmRhdGE/LnNxbFR5cGVzKTtcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbkluZm8ob3B0aW9ucy5kYXRhLmRhdGEpO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5wYWdpbmF0aW9uRGF0YSkge1xuICAgICAgdGhpcy5yZWluaXRpYWxpemVQYWdpbmF0aW9uSW5mbyhvcHRpb25zLnBhZ2luYXRpb25EYXRhKTtcbiAgICB9XG4gICAgdGhpcy5pbml0VGFibGVBZnRlclZpZXdJbml0KCk7XG4gICAgdGhpcy5vblJlaW5pdGlhbGl6ZS5lbWl0KG51bGwpO1xuICB9XG5cbiAgcmVpbml0aWFsaXplUGFnaW5hdGlvbkluZm8ocGFnaW5hdGlvbkRhdGE6IFBhZ2luYXRpb25EYXRhKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2luYXRpb25EYXRhLnBhZ2VOdW1iZXI7XG4gICAgdGhpcy5xdWVyeVJvd3MgPSBwYWdpbmF0aW9uRGF0YS5wYWdlU2l6ZTtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgaWYgKHBhZ2luYXRpb25EYXRhLnN0YXJ0UmVjb3JkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHRFbmRJbmRleCA9IHBhZ2luYXRpb25EYXRhLnN0YXJ0UmVjb3JkSW5kZXggKyAodGhpcy5nZXREYXRhQXJyYXkoKSA/IHRoaXMuZ2V0RGF0YUFycmF5KCkubGVuZ3RoIDogMCk7XG4gICAgICAgIHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQgPSByZXN1bHRFbmRJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdpbmF0aW9uRGF0YS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIgPSBwYWdpbmF0aW9uRGF0YS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzLnN0YXRlLnF1ZXJ5UmVjb3JkT2Zmc2V0ID09IDAgPyAwIDogdGhpcy5kYXRhU2VydmljZT8uZ2V0UGFnaW5hdGlvbkNvbnRleHQoKS5wYWdlTnVtYmVyO1xuICAgICAgc3VwZXIudXBkYXRlUGFnaW5hdGlvbkNvbnRleHQoeyBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyLCBvZmZzZXQ6IHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQsIHRvdGFsU2l6ZTogdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciwgcGFnZVNpemU6IHRoaXMuc3RhdGUucXVlcnlSb3dzIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25Db250ZXh0KHsgdG90YWxTaXplOiB0aGlzLmdldERhdGFBcnJheSgpLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0VGFibGVBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucGFyc2VWaXNpYmxlQ29sdW1ucygpO1xuICAgIHRoaXMucGFyc2VTZWFyY2hlYWJsZUNvbHVtbnMoKTtcbiAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtbnMoKTtcbiAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtblR5cGVzKCk7XG4gICAgdGhpcy5wYXJzZVNvcnRDb2x1bW5zKCk7XG4gICAgdGhpcy5zZXRGaWx0ZXJzQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuYWRkRGVmYXVsdFJvd0J1dHRvbnMoKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudC5jb2x1bW5zQXJyYXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeU9uSW5pdCkge1xuICAgICAgdGhpcy5xdWVyeURhdGEoKTtcbiAgICB9XG4gIH1cbiAgcGFyc2VTZWFyY2hlYWJsZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5zZWFyY2hlYWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2xBcnJheS5maWx0ZXIoY29sID0+IHtcbiAgICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sKTtcbiAgICAgIHJldHVybiBvQ29sICYmIG9Db2wuc2VhcmNoYWJsZTtcbiAgICB9KVxuXG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjcm9sbFN0cmF0ZWd5KSB7XG4gICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93Q2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvd0NoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9ucykuZm9yRWFjaChpZHggPT4ge1xuICAgICAgaWYgKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tpZHhdKSB7XG4gICAgICAgIHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tpZHhdLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5sb2FkaW5nU2VydmljZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS5uZ09uRGVzdHJveT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGUgc3RvcmUgbG9jYWxzdG9yYWdlLCBjYWxsIG9mIHRoZSBJTG9jYWxTdG9yYWdlXG4gICAqL1xuICBnZXREYXRhVG9TdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2UuZ2V0RGF0YVRvU3RvcmUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyUXVpY2tGaWx0ZXIoYXJnOiBhbnkpIHtcbiAgICBjb25zdCBxdWlja0ZpbHRlciA9IChhcmcgYXMgT1RhYmxlUXVpY2tmaWx0ZXIpO1xuICAgIC8vIGZvcmNpbmcgcXVpY2tGaWx0ZXJDb21wb25lbnQgdG8gYmUgdW5kZWZpbmVkLCB0YWJsZSB1c2VzIG9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50XG4gICAgdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50ID0gcXVpY2tGaWx0ZXI7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnNldFZhbHVlKHRoaXMuc3RhdGUucXVpY2tGaWx0ZXJWYWx1ZSwgZmFsc2UpO1xuICAgICAgdGhpcy5xdWlja0ZpbHRlclN1YnNjcmlwdGlvbiA9IHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQub25DaGFuZ2Uuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTZXJ2aWNlLmhhbmRsZVByb3RlY3RlZCgpKSB7XG4gICAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyUGFnaW5hdGlvbih2YWx1ZTogT1RhYmxlUGFnaW5hdG9yKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uQ29udHJvbHMgPSB0cnVlO1xuICAgIHRoaXMucGFnaW5hdG9yID0gdmFsdWU7XG4gIH1cblxuICByZWdpc3RlckNvbnRleHRNZW51KHZhbHVlOiBPQ29udGV4dE1lbnVDb21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnRhYmxlQ29udGV4dE1lbnUgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbnRleHRNZW51U3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZUNvbnRleHRNZW51Lm9uU2hvdy5zdWJzY3JpYmUoKHBhcmFtczogSU9Db250ZXh0TWVudUNvbnRleHQpID0+IHtcbiAgICAgIHBhcmFtcy5jbGFzcyA9ICdvLXRhYmxlLWNvbnRleHQtbWVudSAnICsgdGhpcy5yb3dIZWlnaHQ7XG4gICAgICBpZiAocGFyYW1zLmRhdGEgJiYgIXRoaXMuaXNSb3dTZWxlY3RlZChwYXJhbXMuZGF0YS5yb3dWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93KHBhcmFtcy5kYXRhLnJvd1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyRGVmYXVsdENvbHVtbihjb2x1bW46IHN0cmluZykge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmdldE9Db2x1bW4oY29sdW1uKSkpIHtcbiAgICAgIC8vIGEgZGVmYXVsdCBjb2x1bW4gZGVmaW5pdGlvbiB0cnlpbmcgdG8gcmVwbGFjZSBhbiBhbHJlYWR5IGV4aXN0aW5nIGRlZmluaXRpb25cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sRGVmOiBPQ29sdW1uID0gdGhpcy5jcmVhdGVPQ29sdW1uKGNvbHVtbiwgdGhpcyk7XG4gICAgdGhpcy5wdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBhbGwgY29sdW1ucyBhbmQgcHJvcGVydGllcyBpbiB2YXIgY29sdW1uc0FycmF5XG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIHJlZ2lzdGVyQ29sdW1uKGNvbHVtbjogT1RhYmxlQ29sdW1uQ29tcG9uZW50IHwgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCB8IGFueSkge1xuICAgIGNvbnN0IGNvbHVtbkF0dHIgPSAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycpID8gY29sdW1uIDogY29sdW1uLmF0dHI7XG4gICAgY29uc3QgY29sdW1uUGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IHRoaXMuZ2V0T0NvbHVtblBlcm1pc3Npb25zKGNvbHVtbkF0dHIpO1xuICAgIGlmICghY29sdW1uUGVybWlzc2lvbnMudmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yZWdpc3RlckRlZmF1bHRDb2x1bW4oY29sdW1uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5EZWYgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uLmF0dHIpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW5EZWYpICYmIFV0aWwuaXNEZWZpbmVkKGNvbHVtbkRlZi5kZWZpbml0aW9uKSkge1xuICAgICAgLy8gYSBvLXRhYmxlLWNvbHVtbiBkZWZpbml0aW9uIHRyeWluZyB0byByZXBsYWNlIGFuIGFscmVhZHkgZXhpc3Rpbmcgby10YWJsZS1jb2x1bW4gZGVmaW5pdGlvblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbERlZjogT0NvbHVtbiA9IHRoaXMuY3JlYXRlT0NvbHVtbihjb2x1bW4uYXR0ciwgdGhpcywgY29sdW1uKTtcbiAgICBsZXQgY29sdW1uV2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRoRnJvbVN0YXRlKGNvbERlZik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbldpZHRoKSkge1xuICAgICAgY29sRGVmLndpZHRoID0gY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIGlmIChjb2x1bW4gJiYgKGNvbHVtbi5hc3luY0xvYWQgfHwgY29sdW1uLnR5cGUgPT09ICdhY3Rpb24nKSkge1xuICAgICAgdGhpcy5hdm9pZFF1ZXJ5Q29sdW1ucy5wdXNoKGNvbHVtbi5hdHRyKTtcbiAgICAgIGlmIChjb2x1bW4uYXN5bmNMb2FkKSB7XG4gICAgICAgIHRoaXMuYXN5bmNMb2FkQ29sdW1ucy5wdXNoKGNvbHVtbi5hdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmOiBPQ29sdW1uKSB7XG4gICAgY29sRGVmLnZpc2libGUgPSAodGhpcy5fdmlzaWJsZUNvbEFycmF5LmluZGV4T2YoY29sRGVmLmF0dHIpICE9PSAtMSk7XG4gICAgLy8gRmluZCBjb2x1bW4gZGVmaW5pdGlvbiBieSBuYW1lXG4gICAgY29uc3QgYWxyZWFkeUV4aXN0aW5nID0gdGhpcy5nZXRPQ29sdW1uKGNvbERlZi5hdHRyKTtcbiAgICBpZiAoYWxyZWFkeUV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2luZ0luZGV4ID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmluZGV4T2YoYWxyZWFkeUV4aXN0aW5nKTtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1tyZXBsYWNpbmdJbmRleF0gPSBjb2xEZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5wdXNoKGNvbERlZik7XG4gICAgfVxuICAgIHRoaXMuZW5zdXJlQ29sdW1uc09yZGVyKCk7XG4gICAgdGhpcy5yZWZyZXNoRWRpdGlvbk1vZGVXYXJuKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaEVkaXRpb25Nb2RlV2FybigpIHtcbiAgICBpZiAodGhpcy5lZGl0aW9uTW9kZSAhPT0gQ29kZXMuRURJVElPTl9NT0RFX05PTkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdGFibGVDb2x1bW5zID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjb2wgPT4ge1xuICAgICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKGNvbC5lZGl0b3IpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGVkaXRhYmxlQ29sdW1ucy5sZW5ndGggPiAwICYmICF0aGlzLmhhc0luc2VydGFibGVSb3coKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VzaW5nIGEgY29sdW1uIHdpdGggYSBlZGl0b3IgYnV0IHRoZXJlIGlzIG5vIGVkaXRpb24tbW9kZSBkZWZpbmVkJyk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHJlZ2lzdGVyQ29sdW1uQWdncmVnYXRlKGNvbHVtbjogT0NvbHVtbkFnZ3JlZ2F0ZSkge1xuICAgIHRoaXMuc2hvd1RvdGFsc1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RpbmcgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uLmF0dHIpO1xuICAgIGlmIChhbHJlYWR5RXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVwbGFjaW5nSW5kZXggPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuaW5kZXhPZihhbHJlYWR5RXhpc3RpbmcpO1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zW3JlcGxhY2luZ0luZGV4XS5hZ2dyZWdhdGUgPSBjb2x1bW47XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZUhlYWRlcnModGFibGVIZWFkZXI6IE9UYWJsZUhlYWRlckNvbXBvbmVudCkge1xuICAgIGlmICh0aGlzLnRhYmxlSGVhZGVycy5maW5kSW5kZXgoaGVhZGVyID0+IGhlYWRlci5jb2x1bW4uYXR0ciA9PT0gdGFibGVIZWFkZXIuY29sdW1uLmF0dHIpID09PSAtMSkge1xuICAgICAgdGhpcy50YWJsZUhlYWRlcnMucHVzaCh0YWJsZUhlYWRlcik7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VWaXNpYmxlQ29sdW1ucyhkZWZhdWx0Q29uZmlndXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkpIHtcblxuICAgICAgLy8gZmlsdGVyaW5nIGNvbHVtbnMgdGhhdCBtaWdodCBiZSBpbiBzdGF0ZSBzdG9yYWdlIGJ1dCBub3QgaW4gdGhlIGFjdHVhbCB0YWJsZSBkZWZpbml0aW9uXG4gICAgICBsZXQgc3RhdGVDb2xzOiBPQ29sdW1uRGlzcGxheVtdID0gW107XG4gICAgICB0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5LmZvckVhY2goKG9Db2wsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVmlzaWJsZUNvbEluQ29sdW1ucyA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuYXR0ciA9PT0gb0NvbC5hdHRyKSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChpc1Zpc2libGVDb2xJbkNvbHVtbnMpIHtcbiAgICAgICAgICBzdGF0ZUNvbHMucHVzaChvQ29sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBsb2FkIHRoZSBjb2x1bW4gJyArIG9Db2wuYXR0ciArICcgZnJvbSB0aGUgbG9jYWxzdG9yYWdlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGRlZmF1bHRDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHN0YXRlQ29scyA9IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uY29sdW1uc0Rpc3BsYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZUNvbHMgPSB0aGlzLmNoZWNrQ2hhbmdlc1Zpc2libGVDb2x1bW1uc0luSW5pdGlhbENvbmZpZ3VyYXRpb24oc3RhdGVDb2xzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGE6IE9Db2x1bW4sIGI6IE9Db2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhBID0gc3RhdGVDb2xzLmZpbmRJbmRleChjb2wgPT4gY29sLmF0dHIgPT09IGEuYXR0cik7XG4gICAgICAgIGNvbnN0IGluZGV4QiA9IHN0YXRlQ29scy5maW5kSW5kZXgoY29sID0+IGNvbC5hdHRyID09PSBiLmF0dHIpO1xuICAgICAgICByZXR1cm4gaW5kZXhBIC0gaW5kZXhCO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnZpc2libGVDb2xBcnJheSA9IHN0YXRlQ29scy5maWx0ZXIoaXRlbSA9PiBpdGVtLnZpc2libGUpLm1hcChpdGVtID0+IGl0ZW0uYXR0cik7XG4gICAgfSBlbHNlIHtcblxuICAgICAgdGhpcy52aXNpYmxlQ29sQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5kZWZhdWx0VmlzaWJsZUNvbHVtbnMgPyB0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA6IHRoaXMudmlzaWJsZUNvbHVtbnMsIHRydWUpO1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGE6IE9Db2x1bW4sIGI6IE9Db2x1bW4pID0+IHRoaXMudmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYS5hdHRyKSAtIHRoaXMudmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYi5hdHRyKSk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDaGFuZ2VzVmlzaWJsZUNvbHVtbW5zSW5Jbml0aWFsQ29uZmlndXJhdGlvbihzdGF0ZUNvbHM6IE9Db2x1bW5EaXNwbGF5W10pOiBPQ29sdW1uRGlzcGxheVtdIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uY29sdW1uc0Rpc3BsYXkpIHtcbiAgICAgIHJldHVybiBzdGF0ZUNvbHM7XG4gICAgfVxuICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgdmlzaWJsZSBjb2x1bW5zIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgY29uc3Qgb3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkgPVxuICAgICAgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5jb2x1bW5zRGlzcGxheS5maWx0ZXIoeCA9PiB4LnZpc2libGUpLm1hcCh4ID0+IHguYXR0cik7XG5cbiAgICBjb25zdCBjdXJyZW50VmlzaWJsZUNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMudmlzaWJsZUNvbHVtbnMsIHRydWUpO1xuXG4gICAgLy8gRmluZCB2YWx1ZXMgaW4gdmlzaWJsZS1jb2x1bW5zIHRoYXQgdGhleSBhcmVudCBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlXG4gICAgLy8gaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIGFkZCB0aGlzIGNvbHVtbiB0byB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgIGNvbnN0IGNvbFRvQWRkSW5WaXNpYmxlQ29sID0gVXRpbC5kaWZmZXJlbmNlQXJyYXlzKGN1cnJlbnRWaXNpYmxlQ29sQXJyYXksIG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5KTtcbiAgICBmb3IgKGNvbnN0IG5ld0NvbEF0dHIgb2YgY29sVG9BZGRJblZpc2libGVDb2wpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkV4aXN0cyA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb21lKGNvbCA9PiBjb2wuYXR0ciA9PT0gbmV3Q29sQXR0cik7XG5cbiAgICAgIGlmIChjb2x1bW5FeGlzdHMpIHtcbiAgICAgICAgbGV0IGluZGV4Q29sID0gc3RhdGVDb2xzLmZpbmRJbmRleChjb2wgPT4gY29sLmF0dHIgPT09IG5ld0NvbEF0dHIpO1xuICAgICAgICBpZiAoaW5kZXhDb2wgPiAtMSkge1xuICAgICAgICAgIHN0YXRlQ29sc1tpbmRleENvbF0udmlzaWJsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIGNvbHVtbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc3RhdGUsIGFkZCBpdCBhcyB2aXNpYmxlXG4gICAgICAgICAgc3RhdGVDb2xzLnB1c2goe1xuICAgICAgICAgICAgYXR0cjogbmV3Q29sQXR0cixcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICB3aWR0aDogdW5kZWZpbmVkXG4gICAgICAgICAgfSBhcyBPQ29sdW1uRGlzcGxheSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YXRlQ29scy5zb3J0KChhOiBPQ29sdW1uLCBiOiBPQ29sdW1uKSA9PiBjdXJyZW50VmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYS5hdHRyKSAtIGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkuaW5kZXhPZihiLmF0dHIpKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHZhbHVlcyBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlIHRoYXQgdGhleSBhcmVudCBpbiB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgIC8vIGluIHRoaXMgY2FzZSB5b3UgaGF2ZSB0byBkZWxldGUgdGhpcyBjb2x1bW4gdG8gdGhpcy52aXNpYmxlQ29sQXJyYXlcbiAgICBjb25zdCBjb2xUb0RlbGV0ZUluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhvcmlnaW5hbFZpc2libGVDb2xBcnJheSwgY3VycmVudFZpc2libGVDb2xBcnJheSk7XG4gICAgaWYgKGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0YXRlQ29scyA9IHN0YXRlQ29scy5maWx0ZXIoY29sID0+IGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sLmluZGV4T2YoY29sLmF0dHIpID09PSAtMSk7XG4gICAgfVxuXG4gICAgLy9JZiB0aGUgY29sdW1ucyBpbiBvcmlnaW5hbFZpc2libGVDb2xBcnJheSBoYXMgY2hhbmdlZCB0aGUgc29ydGluZ1xuICAgIGNvbnN0IGNoYW5nZVNvcnRWaXNpYmxlQ29sdW1ucyA9IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkpICE9PSBKU09OLnN0cmluZ2lmeShvcmlnaW5hbFZpc2libGVDb2xBcnJheSk7XG4gICAgaWYgKGNoYW5nZVNvcnRWaXNpYmxlQ29sdW1ucyAmJiBjdXJyZW50VmlzaWJsZUNvbEFycmF5Lmxlbmd0aCA9PT0gb3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0b0luZGV4LCBjb2xdIG9mIGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IGZyb21JbmRleFRvQ2hhbmdlID0gc3RhdGVDb2xzLmZpbmRJbmRleChzdGF0ZUNvbCA9PiBzdGF0ZUNvbC5hdHRyID09PSBjb2wpO1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoc3RhdGVDb2xzLCBmcm9tSW5kZXhUb0NoYW5nZSwgdG9JbmRleCk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVDb2xzO1xuICB9XG5cbiAgcGFyc2VTb3J0Q29sdW1ucygpIHtcbiAgICBjb25zdCBzb3J0Q29sdW1uc1BhcmFtID0gdGhpcy5zdGF0ZS5zb3J0Q29sdW1ucyB8fCB0aGlzLnNvcnRDb2x1bW5zO1xuICAgIHRoaXMuc29ydENvbEFycmF5ID0gU2VydmljZVV0aWxzLnBhcnNlU29ydENvbHVtbnMoc29ydENvbHVtbnNQYXJhbSk7XG5cbiAgICAvLyBjaGVja2luZyB0aGUgb3JpZ2luYWwgc29ydCBjb2x1bW5zIHdpdGggdGhlIHNvcnQgY29sdW1ucyBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaW4gbG9jYWwgc3RvcmFnZVxuICAgIGlmICh0aGlzLnN0YXRlLnNvcnRDb2x1bW5zICYmIHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc29ydENvbHVtbnMpIHtcblxuICAgICAgY29uc3QgaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXkgPSBTZXJ2aWNlVXRpbHMucGFyc2VTb3J0Q29sdW1ucyh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNvcnRDb2x1bW5zKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsU29ydENvbHVtbnNBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHRoaXMuc29ydENvbHVtbnMpO1xuICAgICAgLy8gRmluZCB2YWx1ZXMgaW4gdmlzaWJsZS1jb2x1bW5zIHRoYXQgdGhleSBhcmVudCBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlXG4gICAgICAvLyBpbiB0aGlzIGNhc2UgeW91IGhhdmUgdG8gYWRkIHRoaXMgY29sdW1uIHRvIHRoaXMudmlzaWJsZUNvbEFycmF5XG4gICAgICBjb25zdCBjb2xUb0FkZEluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhvcmlnaW5hbFNvcnRDb2x1bW5zQXJyYXksIGluaXRpYWxDb25maWdTb3J0Q29sdW1uc0FycmF5KTtcbiAgICAgIGlmIChjb2xUb0FkZEluVmlzaWJsZUNvbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbFRvQWRkSW5WaXNpYmxlQ29sLmZvckVhY2goY29sQWRkID0+IHtcbiAgICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5wdXNoKGNvbEFkZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2xUb0RlbEluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSwgb3JpZ2luYWxTb3J0Q29sdW1uc0FycmF5KTtcbiAgICAgIGlmIChjb2xUb0RlbEluVmlzaWJsZUNvbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbFRvRGVsSW5WaXNpYmxlQ29sLmZvckVhY2goKGNvbERlbCkgPT4ge1xuICAgICAgICAgIHRoaXMuc29ydENvbEFycmF5LmZvckVhY2goKGNvbCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5OYW1lID09PSBjb2xEZWwuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVuc3VyaW5nIGNvbHVtbiBleGlzdGVuY2UgYW5kIGNoZWNraW5nIGl0cyBvcmRlcmFibGUgc3RhdGVcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zb3J0Q29sQXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGNvbE5hbWUgPSB0aGlzLnNvcnRDb2xBcnJheVtpXS5jb2x1bW5OYW1lO1xuICAgICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2xOYW1lKTtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQob0NvbCkgfHwgIW9Db2wub3JkZXJhYmxlKSB7XG4gICAgICAgIHRoaXMuc29ydENvbEFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBlbnN1cmVDb2x1bW5zT3JkZXIoKSB7XG5cbiAgICBsZXQgY29sdW1uc09yZGVyID0gW107XG4gICAgaWYgKHRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkpIHtcbiAgICAgIGNvbHVtbnNPcmRlciA9IHRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkubWFwKGl0ZW0gPT4gaXRlbS5hdHRyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29sdW1uc09yZGVyID0gdGhpcy5jb2xBcnJheS5maWx0ZXIoYXR0ciA9PiB0aGlzLnZpc2libGVDb2xBcnJheS5pbmRleE9mKGF0dHIpID09PSAtMSk7XG4gICAgICBjb2x1bW5zT3JkZXIucHVzaCguLi50aGlzLnZpc2libGVDb2xBcnJheSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGE6IE9Db2x1bW4sIGI6IE9Db2x1bW4pID0+IHtcbiAgICAgIGlmIChjb2x1bW5zT3JkZXIuaW5kZXhPZihhLmF0dHIpID09PSAtMSkge1xuICAgICAgICAvLyBpZiBpdCBpcyBub3QgaW4gbG9jYWwgc3RvcmFnZSBiZWNhdXNlIGl0IGlzIG5ldywga2VlcCBvcmRlclxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zT3JkZXIuaW5kZXhPZihhLmF0dHIpIC0gY29sdW1uc09yZGVyLmluZGV4T2YoYi5hdHRyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuXG4gIH1cblxuICBpbml0aWFsaXplUGFyYW1zKCk6IHZvaWQge1xuICAgIC8vIElmIHZpc2libGUtY29sdW1ucyBpcyBub3QgcHJlc2VudCB0aGVuIHZpc2libGUtY29sdW1ucyBpcyBhbGwgY29sdW1uc1xuICAgIGlmICghdGhpcy52aXNpYmxlQ29sdW1ucykge1xuICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuY29sQXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbEFycmF5LmZvckVhY2goKHg6IHN0cmluZykgPT4gdGhpcy5yZWdpc3RlckNvbHVtbih4KSk7XG4gICAgICB0aGlzLmVuc3VyZUNvbHVtbnNPcmRlcigpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIHF1aWNrRmlsdGVyXG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXIgPSB0aGlzLnF1aWNrRmlsdGVyO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnN0YXRlLmN1cnJlbnRQYWdlO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgcGFnaW5hdG9yXG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvciAmJiB0aGlzLnBhZ2luYXRpb25Db250cm9scykge1xuICAgICAgdGhpcy5wYWdpbmF0b3IgPSBuZXcgT0Jhc2VUYWJsZVBhZ2luYXRvcigpO1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSB0aGlzLnF1ZXJ5Um93cztcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgICB0aGlzLnBhZ2luYXRvci5zaG93Rmlyc3RMYXN0QnV0dG9ucyA9IHRoaXMuc2hvd1BhZ2luYXRvckZpcnN0TGFzdEJ1dHRvbnM7XG4gICAgfVxuXG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLnNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSkpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGUgPSAhIXRoaXMuc3RhdGUuc2VsZWN0Q29sdW1uVmlzaWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hlY2tpbmcgdGhlIG9yaWdpbmFsIHNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSB3aXRoIHNlbGVjdC1jb2x1bW4tdmlzaWJsZSBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc2VsZWN0Q29sdW1uVmlzaWJsZSlcbiAgICAgICAgJiYgdGhpcy5zZWxlY3RBbGxDaGVja2JveFZpc2libGUgPT09IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc2VsZWN0Q29sdW1uVmlzaWJsZSkge1xuICAgICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gISF0aGlzLnN0YXRlLnNlbGVjdENvbHVtblZpc2libGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gdGhpcy5zZWxlY3RBbGxDaGVja2JveFZpc2libGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9Jbml0aWFsaXplIHNob3cgZmlsdGVyIGJ5IGNvbHVtbiBpY29uXG4gICAgdGhpcy5pc0NvbHVtbkZpbHRlcnNBY3RpdmUgPSB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCk7XG5cbiAgICBpZiAodGhpcy5zdG9yZVN0YXRlKSB7XG4gICAgICAvLyBpZiBxdWVyeS1yb3dzIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpcyBlcXVhbHMgdG8gb3JpZ2luYWwgcXVlcnktcm93cyBpbnB1dFxuICAgICAgLy8gcXVlcnlfcm93cyB3aWxsIGJlIHRoZSB2YWx1ZSBpbiBsb2NhbCBzdG9yYWdlXG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZS5xdWVyeVJvd3MpICYmIFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24ucXVlcnlSb3dzKVxuICAgICAgICAmJiB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cyA9PT0gdGhpcy5vcmlnaW5hbFF1ZXJ5Um93cykge1xuICAgICAgICB0aGlzLnF1ZXJ5Um93cyA9IHRoaXMuc3RhdGUucXVlcnlSb3dzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLl9zZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0aGlzLmlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKCksIFtdLCB0cnVlLCB0aGlzLmNvbXBhcmVSb3coKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb247XG4gIH1cblxuICB1cGRhdGVTdGF0ZUV4cGFuZGVkQ29sdW1uKCkge1xuICAgIGlmICghdGhpcy50YWJsZVJvd0V4cGFuZGFibGU/LmV4cGFuZGFibGVDb2x1bW5WaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMF0gPT09IENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCAmJlxuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uc1sxXSAhPT0gQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5zcGxpY2UoMSwgMCwgQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdICE9PSBDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLnVuc2hpZnQoQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgfVxuXG4gIH1cblxuICByZWdpc3RlclRhYkxpc3RlbmVyKCkge1xuICAgIC8vIFdoZW4gdGFibGUgaXMgY29udGFpbmVkIGludG8gdGFiIGNvbXBvbmVudCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGluaXQgdGFibGUgY29tcG9uZW50IHdoZW4gYXR0YWNoZWQgdG8gRE9NLlxuICAgIHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnRhYkdyb3VwQ29udGFpbmVyLnNlbGVjdGVkVGFiQ2hhbmdlLnN1YnNjcmliZSgoZXZ0KSA9PiB7XG4gICAgICBsZXQgaW50ZXJ2YWw7XG4gICAgICBjb25zdCB0aW1lckNhbGxiYWNrID0gKHRhYjogTWF0VGFiKSA9PiB7XG4gICAgICAgIGlmICh0YWIgJiYgdGFiLmNvbnRlbnQuaXNBdHRhY2hlZCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIGlmICh0YWIgPT09IHRoaXMudGFiQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmluc2lkZVRhYkJ1Z1dvcmthcm91bmQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdRdWVyeSkge1xuICAgICAgICAgICAgICB0aGlzLnF1ZXJ5RGF0YSh0aGlzLnBlbmRpbmdRdWVyeUZpbHRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7IHRpbWVyQ2FsbGJhY2soZXZ0LnRhYik7IH0sIDEwMCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5zaWRlVGFiQnVnV29ya2Fyb3VuZCgpIHtcbiAgICB0aGlzLnJlZnJlc2hTb3J0SGVhZGVycygpO1xuICB9XG5cbiAgcmVnaXN0ZXJTb3J0TGlzdGVuZXIoKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc29ydCkpIHtcbiAgICAgIHRoaXMuc29ydFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc29ydFN1YnNjcmlwdGlvbiA9IHRoaXMuc29ydC5vU29ydENoYW5nZS5zdWJzY3JpYmUodGhpcy5vblNvcnRDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLnNvcnQuc2V0TXVsdGlwbGVTb3J0KHRoaXMubXVsdGlwbGVTb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Tb3J0Q2hhbmdlKHNvcnRBcnJheTogYW55W10pIHtcbiAgICB0aGlzLnNvcnRDb2xBcnJheSA9IFtdO1xuICAgIHNvcnRBcnJheS5mb3JFYWNoKChzb3J0KSA9PiB7XG4gICAgICBpZiAoc29ydC5kaXJlY3Rpb24gIT09ICcnKSB7XG4gICAgICAgIHRoaXMuc29ydENvbEFycmF5LnB1c2goe1xuICAgICAgICAgIGNvbHVtbk5hbWU6IHNvcnQuaWQsXG4gICAgICAgICAgYXNjZW5kZW50OiBzb3J0LmRpcmVjdGlvbiA9PT0gQ29kZXMuQVNDX1NPUlRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGFzb3VyY2UoKSB7XG4gICAgLy9EZWxldGVkIHByZXZpb3VzIGluc3RhbmNlIGFuZCBzdWJzY3JpYmVyc1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFTb3VyY2U7XG4gICAgaWYgKHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UpIHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UudW5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoT1RhYmxlRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2VTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJEYXRhU291cmNlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZWdpc3RlclNvcnRMaXN0ZW5lcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyRGF0YVNvdXJjZUxpc3RlbmVycygpIHtcbiAgICB0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlID0gdGhpcy5kYXRhU291cmNlLm9uUmVuZGVyZWREYXRhQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BFZGl0aW9uKCk7XG4gICAgICB0aGlzLmNoZWNrU2VsZWN0ZWRJdGVtRGF0YSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9UYWJsZUNvbXBvbmVudC5FWFBBTkRFRF9ST1dfQ09OVEFJTkVSX0NMQVNTICsgcm93SW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwYW5kYWJsZUl0ZW1zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIGV4cGFuZGFibGUgcm93LlxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dFeHBhbmRhYmxlKGl0ZW06IGFueSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0udG9nZ2xlKGl0ZW0pO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5nZXRWYWx1ZSgpLmZpbmRJbmRleCgocm93KSA9PiB0aGlzLmtleXNBcnJheS5ldmVyeShrZXkgPT4gcm93W2tleV0gPT09IGl0ZW1ba2V5XSkpO1xuXG4gICAgaWYgKHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0pIHtcbiAgICAgIHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0uZGV0YWNoKCk7XG4gICAgfVxuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gdGhpcy5nZXRTdGF0ZUV4cGFuZChpdGVtKSA9PT0gJ2NvbGxhcHNlZCc7XG4gICAgY29uc3QgZXZlbnRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2UgPSB0aGlzLmVtaXRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2VFdmVudChpdGVtLCByb3dJbmRleCk7XG4gICAgaWYgKGlzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5vbkNvbGxhcHNlZC5lbWl0KGV2ZW50VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuJyArIHRoaXMuZ2V0RXhwYW5kZWRSb3dDb250YWluZXJDbGFzcyhyb3dJbmRleCkpO1xuICAgICAgdGhpcy5wb3J0YWxIb3N0W3Jvd0luZGV4XSA9IG5ldyBEb21Qb3J0YWxPdXRsZXQoXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuYXBwUmVmLFxuICAgICAgICB0aGlzLmluamVjdG9yXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZVBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS50ZW1wbGF0ZVJlZiwgdGhpcy5fdmlld0NvbnRhaW5lclJlZiwgeyAkaW1wbGljaXQ6IGl0ZW0gfSk7XG4gICAgICB0aGlzLnBvcnRhbEhvc3Rbcm93SW5kZXhdLmF0dGFjaFRlbXBsYXRlUG9ydGFsKHRlbXBsYXRlUG9ydGFsKTtcbiAgICAgIHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLm9uRXhwYW5kZWQuZW1pdChldmVudFRhYmxlUm93RXhwYW5kYWJsZUNoYW5nZSk7XG4gICAgfVxuXG4gIH1cblxuICBzYXZlUm93RXhwYW5kU3RhdGUoYWRkZWQ6IGFueVtdLCByZW1vdmVkOiBhbnlbXSkge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3MgPz8gW107XG5cbiAgICBjb25zdCBleHRyYWN0S2V5cyA9IChpdGVtOiBhbnkpID0+XG4gICAgICBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoaXRlbSkuZmlsdGVyKChba2V5XSkgPT4gdGhpcy5rZXlzQXJyYXkuaW5jbHVkZXMoa2V5KSkpO1xuXG4gICAgY29uc3QgaXNTYW1lUm93ID0gdGhpcy5jb21wYXJlUm93KCk7XG5cbiAgICAvLyBBZGQgZXhwYW5kYWJsZSBpdGVtc1xuICAgIGlmIChhZGRlZD8ubGVuZ3RoKSB7XG4gICAgICBhZGRlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0VmFsdWUoKS5maW5kSW5kZXgocm93ID0+IGlzU2FtZVJvdyhyb3csIGl0ZW0pKTtcbiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IHN0YXRlLnNvbWUoc3RhdGVJdGVtID0+IGlzU2FtZVJvdyhzdGF0ZUl0ZW0ua2V5cywgaXRlbSkpO1xuXG4gICAgICAgIGlmIChyb3dJbmRleCAhPT0gLTEgJiYgIWFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICBzdGF0ZS5wdXNoKHsga2V5czogZXh0cmFjdEtleXMoaXRlbSkgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBleHBhbmRhYmxlIGl0ZW1zXG4gICAgaWYgKHJlbW92ZWQ/Lmxlbmd0aCkge1xuICAgICAgcmVtb3ZlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gc3RhdGUuZmluZEluZGV4KHN0YXRlSXRlbSA9PiBpc1NhbWVSb3coc3RhdGVJdGVtLmtleXMsIGl0ZW0pKTtcbiAgICAgICAgaWYgKGluZGV4VG9SZW1vdmUgIT09IC0xKSB7XG4gICAgICAgICAgc3RhdGUuc3BsaWNlKGluZGV4VG9SZW1vdmUsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzID0gc3RhdGU7XG4gIH1cblxuICBkZXN0cm95QWxsUG9ydGFsSG9zdHMoKTogdm9pZCB7XG4gICAgdGhpcy5wb3J0YWxIb3N0LmZvckVhY2goaG9zdCA9PiB7XG4gICAgICBpZiAoaG9zdC5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgIGhvc3QuZGV0YWNoKCk7ICAgLy8gRGV0YWNoIHRoZSBwb3J0YWwgY29udGVudFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgcm93IGV4cGFuZGFibGUgYnkgcm93IGluZGV4XG4gICAqIEBwYXJhbSByb3dJbmRleFxuICAgKiBAcGFyYW0gW2V2ZW50XVxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVJvd0V4cGFuZGFibGVCeVJvd0luZGV4KHJvd0luZGV4OiBudW1iZXIsIGV2ZW50PzogRXZlbnQpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRWYWx1ZSgpW3Jvd0luZGV4XTtcbiAgICB0aGlzLnRvZ2dsZVJvd0V4cGFuZGFibGUoaXRlbSwgZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlRXZlbnQoZGF0YSwgcm93SW5kZXgpIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBPVGFibGVSb3dFeHBhbmRlZENoYW5nZSgpO1xuICAgIGV2ZW50LnJvd0luZGV4ID0gcm93SW5kZXg7XG4gICAgZXZlbnQuZGF0YSA9IGRhdGE7XG5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNFeHBhbmRlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5pc1NlbGVjdGVkKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXRlRXhwYW5kKHJvdykge1xuICAgIHJldHVybiB0aGlzLmlzRXhwYW5kZWQocm93KSA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJztcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbHVtbkV4cGFuZGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uKSkgPyB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udmlzaWJsZSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGhhc0V4cGFuZGVkUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSk7XG4gIH1cblxuICBwdWJsaWMgaGFzSW5zZXJ0YWJsZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROdW1WaXNpYmxlQ29sdW1ucygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIG1hbmFnZXMgdGhlIGNhbGwgdG8gdGhlIHNlcnZpY2VcbiAgICogQHBhcmFtIGZpbHRlclxuICAgKiBAcGFyYW0gb3ZyckFyZ3NcbiAgICovXG4gIHF1ZXJ5RGF0YShmaWx0ZXI/OiBhbnksIG92cnJBcmdzPzogT1F1ZXJ5RGF0YUFyZ3MpIHtcbiAgICAvLyBJZiB0YWIgZXhpc3RzIGFuZCBpcyBub3QgYWN0aXZlIHRoZW4gd2FpdCBmb3IgcXVlcnlEYXRhXG4gICAgaWYgKHRoaXMuaXNJbnNpZGVJbmFjdGl2ZVRhYigpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdRdWVyeSA9IHRydWU7XG4gICAgICB0aGlzLnBlbmRpbmdRdWVyeUZpbHRlciA9IGZpbHRlcjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nUXVlcnkgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdRdWVyeUZpbHRlciA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMucXVlcnlDZWxsUmVuZGVyZXJzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHBvcnRhbCBob3N0cyBiZWZvcmUgcmUtcmVuZGVyaW5nIHRvIHByZXZlbnQgZHVwbGljYXRlIG9yIG9ycGhhbmVkIGNvbXBvbmVudHNcbiAgICAgIHRoaXMuZGVzdHJveUFsbFBvcnRhbEhvc3RzKCk7XG4gICAgICBzdXBlci5xdWVyeURhdGEoZmlsdGVyLCBvdnJyQXJncyk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJbnNpZGVJbmFjdGl2ZVRhYigpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGFiQ29udGFpbmVyICYmIHRoaXMudGFiR3JvdXBDb250YWluZXIpIHtcbiAgICAgIHJlc3VsdCA9ICEodGhpcy50YWJDb250YWluZXIuaXNBY3RpdmUgfHwgKHRoaXMudGFiR3JvdXBDb250YWluZXIuc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy50YWJDb250YWluZXIucG9zaXRpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldENvbXBvbmVudEZpbHRlcihleGlzdGluZ0ZpbHRlcjogYW55ID0ge30pOiBhbnkge1xuICAgIGxldCBmaWx0ZXIgPSBleGlzdGluZ0ZpbHRlcjtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJdGVtRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Gcm9tT2JqZWN0KGZpbHRlcik7XG4gICAgICAgIGZpbHRlciA9IHt9O1xuICAgICAgICBmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0gPSBwYXJlbnRJdGVtRXhwcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJlQ29sRmlsdGVyID0gdGhpcy5nZXRDb2x1bW5GaWx0ZXJzRXhwcmVzc2lvbigpO1xuICAgICAgLy8gQWRkIGNvbHVtbiBmaWx0ZXJzIGJhc2ljIGV4cHJlc3Npb24gdG8gY3VycmVudCBmaWx0ZXJcbiAgICAgIGlmIChiZUNvbEZpbHRlciAmJiAhVXRpbC5pc0RlZmluZWQoZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldKSkge1xuICAgICAgICBmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0gPSBiZUNvbEZpbHRlcjtcbiAgICAgIH0gZWxzZSBpZiAoYmVDb2xGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldID1cbiAgICAgICAgICBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRDb21wbGV4RXhwcmVzc2lvbihmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0sIGJlQ29sRmlsdGVyLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0Q29tcG9uZW50RmlsdGVyKGZpbHRlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UXVpY2tGaWx0ZXJFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSAmJiB0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5maWx0ZXJFeHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Q29sdW1uRmlsdGVyc0V4cHJlc3Npb24oKTogRXhwcmVzc2lvbiB7XG4gICAgLy8gQXBwbHkgY29sdW1uIGZpbHRlcnNcbiAgICBjb25zdCBjb2x1bW5GaWx0ZXJzOiBPQ29sdW1uVmFsdWVGaWx0ZXJbXSA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb2x1bW5WYWx1ZUZpbHRlcnMoKTtcbiAgICBjb25zdCBiZUNvbHVtbkZpbHRlcnM6IEFycmF5PEV4cHJlc3Npb24+ID0gW107XG4gICAgY29sdW1uRmlsdGVycy5mb3JFYWNoKGNvbEZpbHRlciA9PiB7XG4gICAgICAvLyBQcmVwYXJlIGJhc2ljIGV4cHJlc3Npb25zXG4gICAgICBzd2l0Y2ggKGNvbEZpbHRlci5vcGVyYXRvcikge1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU46XG4gICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShjb2xGaWx0ZXIudmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgYmVzSW46IEFycmF5PEV4cHJlc3Npb24+ID0gY29sRmlsdGVyLnZhbHVlcy5tYXAodmFsdWUgPT4gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkVxdWFscyhjb2xGaWx0ZXIuYXR0ciwgdmFsdWUpKTtcbiAgICAgICAgICAgIGxldCBiZUluOiBFeHByZXNzaW9uID0gYmVzSW4ucG9wKCk7XG4gICAgICAgICAgICBiZXNJbi5mb3JFYWNoKGJlID0+IHtcbiAgICAgICAgICAgICAgYmVJbiA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKGJlSW4sIGJlLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfT1IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBiZUNvbHVtbkZpbHRlcnMucHVzaChiZUluKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5CRVRXRUVOOlxuICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkoY29sRmlsdGVyLnZhbHVlcykgJiYgY29sRmlsdGVyLnZhbHVlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlRnJvbSA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Nb3JlRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXNbMF0pO1xuICAgICAgICAgICAgY29uc3QgYmVUbyA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25MZXNzRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXNbMV0pO1xuICAgICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oYmVGcm9tLCBiZVRvLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkxpa2UoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXMpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkxFU1NfRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkxlc3NFcXVhbChjb2xGaWx0ZXIuYXR0ciwgY29sRmlsdGVyLnZhbHVlcykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTU9SRV9FUVVBTDpcbiAgICAgICAgICBiZUNvbHVtbkZpbHRlcnMucHVzaChGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uTW9yZUVxdWFsKGNvbEZpbHRlci5hdHRyLCBjb2xGaWx0ZXIudmFsdWVzKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICAvLyBCdWlsZCBjb21wbGV0ZSBjb2x1bW4gZmlsdGVycyBiYXNpYyBleHByZXNzaW9uXG4gICAgbGV0IGJlQ29sRmlsdGVyOiBFeHByZXNzaW9uID0gYmVDb2x1bW5GaWx0ZXJzLnBvcCgpO1xuICAgIGJlQ29sdW1uRmlsdGVycy5mb3JFYWNoKGJlID0+IHtcbiAgICAgIGJlQ29sRmlsdGVyID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oYmVDb2xGaWx0ZXIsIGJlLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmVDb2xGaWx0ZXI7XG4gIH1cblxuICB1cGRhdGVQYWdpbmF0aW9uSW5mbyhxdWVyeVJlczogU2VydmljZVJlc3BvbnNlKSB7XG4gICAgc3VwZXIudXBkYXRlUGFnaW5hdGlvbkluZm8ocXVlcnlSZXMpO1xuICB9XG5cbiAgaW5pdFZpZXdQb3J0KGRhdGE6IGFueVtdKSB7XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQgJiYgZGF0YSkge1xuICAgICAgY29uc3QgaGVhZGVyRWxSZWYgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihoZWFkZXJTZWxlY3Rvcik7XG4gICAgICBjb25zdCBmb290ZXJFbFJlZiA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGZvb3RlclNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHJvd0VsUmVmID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Iocm93U2VsZWN0b3IpO1xuXG4gICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBoZWFkZXJFbFJlZiA/IGhlYWRlckVsUmVmLm9mZnNldEhlaWdodCA6IDA7XG4gICAgICBjb25zdCBmb290ZXJIZWlnaHQgPSBmb290ZXJFbFJlZiA/IGZvb3RlckVsUmVmLm9mZnNldEhlaWdodCA6IDA7XG4gICAgICBjb25zdCByb3dIZWlnaHQgPSByb3dFbFJlZiA/IHJvd0VsUmVmLm9mZnNldEhlaWdodCA6IE9UYWJsZUNvbXBvbmVudC5ERUZBVUxUX1JPV19IRUlHSFQ7XG5cbiAgICAgIC8vIHNldCBjb25maWcgdmlld3BvcnRcbiAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kuc2V0Q29uZmlnKHJvd0hlaWdodCwgaGVhZGVySGVpZ2h0LCBmb290ZXJIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNSZW5kZXJlckRhdGEgIT09IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneS5kYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldERhdGEoZGF0YTogYW55LCBzcWxUeXBlczogYW55KSB7XG4gICAgLyogVGhpcyBjb2RlIGlzIG5vdCBwdXQgaW4gdGhlIHN1cGVyIG1ldGhvZCBiZWNhdXNlIGl0IGlzIG5vdCBjYWxsZWQgZnJvbSB0aGUgY2xhc3MgaXRzZWxmICovXG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kYXRhU2VydmljZT8ucmVpbml0aWFsaXplUGFnaW5hdGlvbkNvbnRleHQodGhpcy5xdWVyeVJvd3MpO1xuICAgIH1cblxuICAgIHRoaXMuZGFvVGFibGUuc3FsVHlwZXNDaGFuZ2UubmV4dChzcWxUeXBlcyk7XG4gICAgdGhpcy5kYW9UYWJsZS5zZXREYXRhQXJyYXkoZGF0YSk7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25QYWdpbmF0ZWREYXRhTG9hZGVkLCBkYXRhKTtcbiAgICB9XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkRhdGFMb2FkZWQsIHRoaXMuZGFvVGFibGUuZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuU2V0U3RhdGljRGF0YShzdGF0aWNEYXRhKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmNhblNldFN0YXRpY0RhdGEoc3RhdGljRGF0YSkgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5kYW9UYWJsZSk7XG4gIH1cblxuICBzaG93RGlhbG9nRXJyb3IoZXJyb3I6IHN0cmluZywgZXJyb3JPcHRpb25hbD86IHN0cmluZykge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChlcnJvcikgJiYgIVV0aWwuaXNPYmplY3QoZXJyb3IpKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyb3JPcHRpb25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvamVjdENvbnRlbnRDaGFuZ2VkKCkge1xuICAgIHRoaXMuaW5pdFZpZXdQb3J0KHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpO1xuXG4gICAgaWYgKHRoaXMucHJldmlvdXNSZW5kZXJlckRhdGEgIT09IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpIHtcbiAgICAgIHRoaXMucHJldmlvdXNSZW5kZXJlckRhdGEgPSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhO1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkNvbnRlbnRDaGFuZ2UsIHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGlvbiAmJiB0aGlzLmRhdGFTb3VyY2U/LnJlbmRlcmVkRGF0YT8ubGVuZ3RoID4gMCAmJiB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZEl0ZW1EYXRhKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVmcmVzaEV4cGFuZGFibGVSb3dTdGF0ZSkge1xuICAgICAgdGhpcy5yZWZyZXNoRXhwYW5kYWJsZVJvd1N0YXRlID0gZmFsc2U7XG4gICAgICBjb25zdCBzZWxlY3Rpb25JdGVtcyA9IHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3M/LnNsaWNlKCkgfHwgW11cbiAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0/LmNsZWFyKCk7XG4gICAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzID0gc2VsZWN0aW9uSXRlbXM7XG4gICAgICB0aGlzLnJlc3RvcmVFeHBhbmRhYmxlUm93U3RhdGUoKTtcbiAgICB9XG5cbiAgfVxuXG4gIHJlc3RvcmVFeHBhbmRhYmxlUm93U3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFibGVSb3dFeHBhbmRhYmxlICYmIHRoaXMuc3RhdGU/LmV4cGFuZGFibGVSb3dzKSB7XG4gICAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzLmZvckVhY2goZXhwYW5kYWJsZVJvdyA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFJlbmRlcmVkVmFsdWUoKTs7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gZGF0YS5maW5kSW5kZXgoKHJvdykgPT4gdGhpcy5rZXlzQXJyYXkuZXZlcnkoa2V5ID0+IHJvd1trZXldID09PSBleHBhbmRhYmxlUm93LmtleXNba2V5XSkpO1xuICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IHJvd0luZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVJvd0V4cGFuZGFibGUoZGF0YVtyb3dJbmRleF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlc1ZhbHVlc1RvUXVlcnkoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHN1cGVyLmdldEF0dHJpYnV0ZXNWYWx1ZXNUb1F1ZXJ5KCk7XG4gICAgaWYgKHRoaXMuYXZvaWRRdWVyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IGNvbHVtbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgY29sID0gY29sdW1uc1tpXTtcbiAgICAgICAgaWYgKHRoaXMuYXZvaWRRdWVyeUNvbHVtbnMuaW5kZXhPZihjb2wpICE9PSAtMSkge1xuICAgICAgICAgIGNvbHVtbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgZ2V0UXVlcnlBcmd1bWVudHMoZmlsdGVyOiBvYmplY3QsIG92cnJBcmdzPzogT1F1ZXJ5RGF0YUFyZ3MpOiBPUXVlcnlQYXJhbXMge1xuICAgIGNvbnN0IHF1ZXJ5QXJndW1lbnRzID0gc3VwZXIuZ2V0UXVlcnlBcmd1bWVudHMoZmlsdGVyLCBvdnJyQXJncyk7XG4gICAgcXVlcnlBcmd1bWVudHMuc3FsVHlwZXMgPSB7XG4gICAgICAuLi50aGlzLmdldFNxbFR5cGVzRm9yRmlsdGVyKHF1ZXJ5QXJndW1lbnRzLmNvbHVtbnMpLFxuICAgICAgLi4ub3ZyckFyZ3MgPyBvdnJyQXJncy5zcWx0eXBlcyB8fCB7fSA6IHt9XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICBxdWVyeUFyZ3VtZW50cy5zb3J0ID0gdGhpcy5zb3J0Q29sQXJyYXk7XG4gICAgICBpZiAodGhpcy5wYWdpbmF0b3IuaXNTaG93aW5nQWxsUm93cyhvdnJyQXJncz8ub2Zmc2V0KSAmJiB0aGlzLnN0YXRlPy50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcikge1xuICAgICAgICBxdWVyeUFyZ3VtZW50cy5vdnJyQXJncy5sZW5ndGggPSB0aGlzLnN0YXRlLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcXVlcnlBcmd1bWVudHM7XG4gIH1cblxuICBnZXRTcWxUeXBlc0ZvckZpbHRlcihmaWx0ZXIpOiBvYmplY3Qge1xuICAgIGNvbnN0IGFsbFNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlcygpO1xuICAgIGNvbnN0IHNxbFR5cGVzID0ge307XG4gICAgaWYgKCFVdGlsLmlzT2JqZWN0RW1wdHkoZmlsdGVyKSkge1xuICAgICAgT2JqZWN0LmtleXMoYWxsU3FsVHlwZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5pbmRleE9mKGtleSkgIT09IC0xICYmIGFsbFNxbFR5cGVzW2tleV0gIT09IFNRTFR5cGVzLk9USEVSKSB7XG4gICAgICAgICAgc3FsVHlwZXNba2V5XSA9IGFsbFNxbFR5cGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3FsVHlwZXM7XG4gIH1cblxuICBvbkV4cG9ydEJ1dHRvbkNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uRXhwb3J0QnV0dG9uQ2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlQ29sdW1uc1Zpc2liaWxpdHlDbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkNoYW5nZUNvbHVtbnNWaXNpYmlsaXR5Q2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uTWF0VGFibGVDb250ZW50Q2hhbmdlZCgpIHtcbiAgICAvL1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIG5hdmlnYXRpb24gdG8gbmV3IGl0ZW0gaW5zZXJ0aW9uXG4gICAqL1xuICBhZGQoKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9JTlNFUlQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmluc2VydERldGFpbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgc2VsZWN0ZWQgcm93c1xuICAgKiBAcGFyYW0gW2NsZWFyU2VsZWN0ZWRJdGVtc11cbiAgICovXG4gIHJlbW92ZShjbGVhclNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNoZWNrRW5hYmxlZEFjdGlvblBlcm1pc3Npb24oUGVybWlzc2lvbnNVdGlscy5BQ1RJT05fREVMRVRFKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbmZpcm0oJ0NPTkZJUk0nLCAnTUVTU0FHRVMuQ09ORklSTV9ERUxFVEUnKS50aGVuKHJlcyA9PiB7XG4gICAgICBpZiAocmVzID09PSB0cnVlKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFTZXJ2aWNlICYmICh0aGlzLmRlbGV0ZU1ldGhvZCBpbiB0aGlzLmRhdGFTZXJ2aWNlKSAmJiB0aGlzLmVudGl0eSAmJiAodGhpcy5rZXlzQXJyYXkubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gU2VydmljZVV0aWxzLmdldEFycmF5UHJvcGVydGllcyhzZWxlY3RlZEl0ZW1zLCB0aGlzLmtleXNBcnJheSk7XG4gICAgICAgICAgY29uc3Qgc3FsVHlwZXNBcmcgPSB0aGlzLmdldFNxbFR5cGVzT2ZLZXlzKCk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS5zZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICAgIHRoaXMuZGFvVGFibGUucmVtb3ZlUXVlcnkoZmlsdGVycywgc3FsVHlwZXNBcmcpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmV4dDogKHYpID0+IHtcbiAgICAgICAgICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uUm93RGVsZXRlZCwgc2VsZWN0ZWRJdGVtcyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RpYWxvZ0Vycm9yKGUsICdNRVNTQUdFUy5FUlJPUl9ERUxFVEUnKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmluZyB0aGF0IHRoZSBkZWxldGVkIGl0ZW1zIHdpbGwgbm90IGxvbmdlciBiZSBwYXJ0IG9mIHRoZSBzZWxlY3Rpb25Nb2RlbFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc2VsZWN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLmNsb3NlRGV0YWlscyhmaWx0ZXJzLCB7IGV4aXRXaXRob3V0Q29uZmlybWF0aW9uOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZUxvY2FsSXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjbGVhclNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaHMgdGFibGUgY29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGFuZCBzZWxlY3QgYWxsIGNoZWNrYm94XG4gICAqL1xuICBzaG93QW5kU2VsZWN0QWxsQ2hlY2tib3goKSB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0QWxsQ2hlY2tib3gpIHtcbiAgICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICB9XG4gIH1cblxuICByZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGNsZWFyU2VsZWN0ZWRJdGVtczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBwYWdlIGluZGV4XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMDtcbiAgICAgIHRoaXMucmVsb2FkRGF0YShjbGVhclNlbGVjdGVkSXRlbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWRzIGRhdGFcbiAgICovXG4gIHJlbG9hZERhdGEoY2xlYXJTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLnJlbG9hZERhdGFXaXRoQ2xlYXJFeHBhbmRhYmxlUm93cyhjbGVhclNlbGVjdGVkSXRlbXMsIGNsZWFyU2VsZWN0ZWRJdGVtcylcbiAgfVxuXG4gIHJlbG9hZERhdGFXaXRoQ2xlYXJFeHBhbmRhYmxlUm93cyhjbGVhclNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSB0cnVlLCBjbGVhckV4cGFuZGFibGVJdGVtczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9SRUZSRVNIKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkge1xuICAgICAgaWYgKGNsZWFyRXhwYW5kYWJsZUl0ZW1zKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0/LmNsZWFyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLnJlZnJlc2hTZWxlY3Rpb24oKTtcblxuICAgIGlmIChjbGVhclNlbGVjdGVkSXRlbXMpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1F1ZXJ5ID0gdHJ1ZTtcbiAgICBsZXQgcXVlcnlBcmdzOiBPUXVlcnlEYXRhQXJncztcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgcXVlcnlBcmdzID0ge1xuICAgICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cyxcbiAgICAgICAgbGVuZ3RoOiB0aGlzLnF1ZXJ5Um93c1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5zdG9wRWRpdGlvbihmYWxzZSk7XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogT0NvbHVtbiwgcm93SW5kZXg6IG51bWJlciwgY2VsbFJlZjogRWxlbWVudFJlZiwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNsaWNrU3ViamVjdC5uZXh0KHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KTtcbiAgfVxuXG4gIGRvSGFuZGxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogc3RyaW5nLCByb3dJbmRleDogbnVtYmVyLCAkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSAmJiB0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub2VuYWJsZWQgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoKHRoaXMuZGV0YWlsTW9kZSA9PT0gQ29kZXMuREVUQUlMX01PREVfQ0xJQ0spKSB7XG5cbiAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmlzTmF2aWdhdGluZykgcmV0dXJuO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc05hdmlnYXRpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgICAgIHRoaXMuc2F2ZURhdGFOYXZpZ2F0aW9uSW5Mb2NhbFN0b3JhZ2UoKTtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICAgIHRoaXMudmlld0RldGFpbChyb3cpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpICYmICgkZXZlbnQuY3RybEtleSB8fCAkZXZlbnQubWV0YUtleSkpIHtcbiAgICAgIC8vIFRPRE86IHRlc3QgJGV2ZW50Lm1ldGFLZXkgb24gTUFDXG4gICAgICB0aGlzLnNlbGVjdGVkUm93KHJvdyk7XG4gICAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKSAmJiAkZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24ocm93KTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xuICAgICAgaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChyb3cpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAxICYmIHRoaXMuZWRpdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbkFuZEVkaXRpbmcoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICAgIHRoaXMub25DbGljay5lbWl0KHsgcm93OiByb3csIHJvd0luZGV4OiByb3dJbmRleCwgbW91c2VFdmVudDogJGV2ZW50LCBjb2x1bW5OYW1lOiBjb2x1bW4sIGNlbGw6IHJvd1tjb2x1bW5dIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKGl0ZW06IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuaW5kZXhPZih0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZFswXSk7XG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5pbmRleE9mKGl0ZW0pO1xuICAgICAgY29uc3QgaW5kZXhGcm9tID0gTWF0aC5taW4oZmlyc3QsIGxhc3QpO1xuICAgICAgY29uc3QgaW5kZXhUbyA9IE1hdGgubWF4KGZpcnN0LCBsYXN0KTtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuc2xpY2UoaW5kZXhGcm9tLCBpbmRleFRvICsgMSkuZm9yRWFjaChlID0+IHRoaXMuc2VsZWN0ZWRSb3coZSkpO1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkNsaWNrLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCkge1xuICAgIHN1cGVyLnNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCk7XG4gICAgdGhpcy5zdG9yZVBhZ2luYXRpb25TdGF0ZSA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVEb3VibGVDbGljayhyb3c6IGFueSwgY29sdW1uOiBPQ29sdW1uLCByb3dJbmRleDogbnVtYmVyLCBjZWxsUmVmOiBFbGVtZW50UmVmLCBldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuZGJsY2xpY2tTdWJqZWN0Lm5leHQoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pO1xuICB9XG5cbiAgZ2V0IGVkaXRpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29tZShpdGVtID0+IGl0ZW0uZWRpdGluZyk7XG4gIH1cblxuICBoYW5kbGVET01DbGljayhldmVudCkge1xuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRpdGlvbkVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5Q29udGFpbmVyID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjZGstb3ZlcmxheS1jb250YWluZXInKVswXTtcbiAgICBpZiAob3ZlcmxheUNvbnRhaW5lciAmJiBvdmVybGF5Q29udGFpbmVyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuby10YWJsZS1jb250YWluZXInKTtcbiAgICBjb25zdCB0YWJsZUNvbnRlbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm8tdGFibGUtY29udGFpbmVyIHRhYmxlLm1hdC10YWJsZScpO1xuICAgIGlmICh0YWJsZUNvbnRhaW5lciAmJiB0YWJsZUNvbnRlbnQgJiYgdGFibGVDb250YWluZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhdGFibGVDb250ZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnksIGNlbGxSZWY6IGFueSkge1xuICAgIGlmIChjZWxsUmVmICYmIGNvbHVtbi5lZGl0aW5nICYmIHRoaXMuZWRpdGluZ0NlbGwgPT09IGNlbGxSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uUGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IHRoaXMuZ2V0T0NvbHVtblBlcm1pc3Npb25zKGNvbHVtbi5hdHRyKTtcbiAgICBpZiAoY29sdW1uUGVybWlzc2lvbnMuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHtjb2x1bW4uYXR0cn0gZWRpdGlvbiBub3QgYWxsb3dlZCBkdWUgdG8gcGVybWlzc2lvbnNgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uQW5kRWRpdGluZygpO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICB0aGlzLmVkaXRpbmdDZWxsID0gY2VsbFJlZjtcbiAgICBjb25zdCByb3dEYXRhID0ge307XG4gICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICByb3dEYXRhW2tleV0gPSByb3dba2V5XTtcbiAgICB9KTtcbiAgICByb3dEYXRhW2NvbHVtbi5hdHRyXSA9IHJvd1tjb2x1bW4uYXR0cl07XG4gICAgdGhpcy5lZGl0aW5nUm93ID0gcm93O1xuICAgIGNvbHVtbi5lZGl0aW5nID0gdHJ1ZTtcbiAgICBjb2x1bW4uZWRpdG9yLnN0YXJ0RWRpdGlvbihyb3dEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZUNlbGxEYXRhKGNvbHVtbjogT0NvbHVtbiwgZGF0YTogYW55LCBzYXZlQ2hhbmdlczogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX1VQREFURSkpIHtcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBPYnNlcnZhYmxlKGlubmVyT2JzZXJ2ZXIgPT4ge1xuICAgICAgICBpbm5lck9ic2VydmVyLmVycm9yKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGNvbHVtbi5lZGl0aW5nID0gZmFsc2U7XG4gICAgaWYgKHNhdmVDaGFuZ2VzICYmIHRoaXMuZWRpdGluZ1JvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZWRpdGluZ1JvdywgZGF0YSk7XG4gICAgfVxuICAgIHRoaXMuc3RvcEVkaXRpb24oKTtcbiAgICBpZiAoc2F2ZUNoYW5nZXMgJiYgY29sdW1uLmVkaXRvci51cGRhdGVSZWNvcmRPbkVkaXQpIHtcbiAgICAgIGNvbnN0IHRvVXBkYXRlID0ge307XG4gICAgICB0b1VwZGF0ZVtjb2x1bW4uYXR0cl0gPSBkYXRhW2NvbHVtbi5hdHRyXTtcbiAgICAgIGNvbnN0IGt2ID0gdGhpcy5leHRyYWN0S2V5c0Zyb21SZWNvcmQoZGF0YSk7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVSZWNvcmQoa3YsIHRvVXBkYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRLZXlzVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gZGF0YS5tYXAoKHJvdykgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICB0aGlzLmtleXNBcnJheS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKHJvd1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IHJvd1trZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2hvd3NTZWxlY3RzKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vblNob3dzU2VsZWN0cygpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemVDaGVja2JveENvbHVtbigpIHtcbiAgICAvLyBJbml0aWFsaXppbmcgcm93IHNlbGVjdGlvbiBsaXN0ZW5lclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gJiYgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLnN1YnNjcmliZSgoc2VsZWN0aW9uRGF0YTogU2VsZWN0aW9uQ2hhbmdlPGFueT4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyAmJiBzZWxlY3Rpb25EYXRhKSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEuYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblJvd1NlbGVjdGVkLCBzZWxlY3Rpb25EYXRhLmFkZGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEucmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uUm93RGVzZWxlY3RlZCwgc2VsZWN0aW9uRGF0YS5yZW1vdmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkNvbHVtblN0YXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0aW9uQ29sdW1uU3RhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zICYmIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcbiAgICAgICYmIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMF0gIT09IENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zICYmICF0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXG4gICAgICAmJiB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdID09PSBDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTdGF0ZUV4cGFuZGVkQ29sdW1uKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8ucmVuZGVyZWREYXRhID8gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5maWx0ZXIoeCA9PiAhdGhpcy5pc0Rpc2FibGVDaGVja2JveCh4KSAmJiB0aGlzLmlzUm93U2VsZWN0ZWQoeCkpLmxlbmd0aCA6IDA7XG4gIH1cblxuICBwdWJsaWMgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZT8ucmVuZGVyZWREYXRhPy5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgcHVibGljIGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZT8ucmVuZGVyZWREYXRhPy5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVJvd3MgPiAwICYmIG51bVNlbGVjdGVkICE9PSBudW1Sb3dzO1xuICB9XG5cbiAgcHVibGljIG1hc3RlclRvZ2dsZShldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpOiB2b2lkIHtcbiAgICBldmVudC5jaGVja2VkID8gdGhpcy5zZWxlY3RBbGwoKSA6IHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNldFNlbGVjdGVkKHJvdykpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdGlvbkNoZWNrYm94VG9nZ2xlKGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVTaW5nbGUoKSkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBldmVudC5jaGVja2VkID8gdGhpcy5zZWxlY3RlZFJvdyhyb3cpIDogdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3Qocm93KTtcbiAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdGVkUm93KHJvdzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZXRTZWxlY3RlZChyb3cpO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24gPSBbXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWQoaXRlbTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlQ2hlY2tib3goaXRlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChpdGVtKSkge1xuICAgICAgLyoqVGhlIHNlbGVjdGVkIGl0ZW0gaXMgY2xlYXJlZCBpZiB0aGUgaXRlbSBjaGFuZ2VzIHZhbHVlKi9cbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKGl0ZW0pO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoaXRlbSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBzZXRTZWxlY3RlZEJ5S2V5cyhrZXlWYWx1ZXM6IEFycmF5PGFueT4pIHtcbiAgICBjb25zdCByb3dzVG9TZWxlY3QgPSB0aGlzLmdldERhdGFBcnJheSgpLmZpbHRlcihyb3cgPT4ge1xuICAgICAgcmV0dXJuIGtleVZhbHVlcy5maW5kSW5kZXgoa2V5VmFsdWUgPT4gcm93W3RoaXMua2V5c10gPT09IGtleVZhbHVlKSA+IC0xO1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5yb3dzVG9TZWxlY3QpO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWRCeU11bHRpcGxlS2V5cyhrZXlWYWx1ZXM6IEFycmF5PE9iamVjdD4pIHtcbiAgICBjb25zdCByb3dzVG9TZWxlY3QgPSB0aGlzLmdldERhdGFBcnJheSgpLmZpbHRlcihyb3cgPT4ge1xuICAgICAgcmV0dXJuIGtleVZhbHVlcy5maW5kSW5kZXgoa2V5VmFsdWUgPT5cbiAgICAgICAgT2JqZWN0LmtleXMoa2V5VmFsdWUpLmV2ZXJ5KGtleSA9PiBrZXlWYWx1ZVtrZXldID09PSByb3dba2V5XSlcbiAgICAgICkgPiAtMTtcbiAgICB9KTtcbiAgICByb3dzVG9TZWxlY3QuZXZlcnkocm93VG9TZWxlY3QgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvd1RvU2VsZWN0KSk7XG4gIH1cblxuICBzZXRTZWxlY3RlZEJ5Um93SWRzKHJvd0lkczogQXJyYXk8bnVtYmVyPikge1xuICAgIHJvd0lkcy5mb3JFYWNoKHJvd0lkID0+IHRoaXMuc2VsZWN0ZWRSb3codGhpcy5nZXREYXRhQXJyYXkoKVtyb3dJZF0pKTtcbiAgfVxuXG4gIGdldCBzaG93RGVsZXRlQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUJ1dHRvbjtcbiAgfVxuXG4gIGdldFRyYWNrQnlGdW5jdGlvbigpOiAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgcmV0dXJuIChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpID0+IHtcblxuICAgICAgbGV0IGl0ZW1JZDogc3RyaW5nID0gJyc7XG5cbiAgICAgIGlmICh0aGlzLmlzR3JvdXAoaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1JZCArPSBpdGVtLmNvbHVtbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGtleXNMZW5naHQgPSBzZWxmLmtleXNBcnJheS5sZW5ndGg7XG4gICAgICAgIHNlbGYua2V5c0FycmF5LmZvckVhY2goKGtleTogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGlkeCA8IChrZXlzTGVuZ2h0IC0gMSkgPyAnOycgOiAnJztcbiAgICAgICAgICBpdGVtSWQgKz0gaXRlbVtrZXldICsgc3VmZml4O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzQXN5bmNBbmRWaXNpYmxlQ29scyA9IHRoaXMuYXN5bmNMb2FkQ29sdW1ucy5zb21lKGMgPT4gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5pbmNsdWRlcyhjKSk7XG4gICAgICBpZiAoc2VsZi5hc3luY0xvYWRDb2x1bW5zLmxlbmd0aCAmJiBoYXNBc3luY0FuZFZpc2libGVDb2xzICYmICFzZWxmLmZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHNlbGYucXVlcnlSb3dBc3luY0RhdGEoaW5kZXgsIGl0ZW0pO1xuICAgICAgICBpZiAoc2VsZi5wYWdpbmF0b3IgJiYgaW5kZXggPT09IChzZWxmLnBhZ2luYXRvci5wYWdlU2l6ZSAtIDEpKSB7XG4gICAgICAgICAgc2VsZi5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1JZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpdGVtSWQ7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHF1ZXJ5Um93QXN5bmNEYXRhKHJvd0luZGV4OiBudW1iZXIsIHJvd0RhdGE6IGFueSkge1xuICAgIGNvbnN0IGt2ID0gU2VydmljZVV0aWxzLmdldE9iamVjdFByb3BlcnRpZXMocm93RGF0YSwgdGhpcy5rZXlzQXJyYXkpO1xuICAgIC8vIFJlcGVhdGluZyBjaGVja2luZyBvZiB2aXNpYmxlIGNvbHVtblxuICAgIGNvbnN0IGF2ID0gdGhpcy5hc3luY0xvYWRDb2x1bW5zLmZpbHRlcihjID0+IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuaW5kZXhPZihjKSAhPT0gLTEpO1xuICAgIGlmIChhdi5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFNraXBwaW5nIHF1ZXJ5IGlmIHRoZXJlIGFyZSBub3QgdmlzaWJsZSBhc3luY3JvbiBjb2x1bW5zXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtblF1ZXJ5QXJncyA9IFtrdiwgYXYsIHRoaXMuZW50aXR5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kTmFtZSA9IHRoaXMucGFnZWFibGUgPyB0aGlzLnBhZ2luYXRlZFF1ZXJ5TWV0aG9kIDogdGhpcy5xdWVyeU1ldGhvZDtcbiAgICBpZiAodGhpcy5kYXRhU2VydmljZSAmJiAocXVlcnlNZXRob2ROYW1lIGluIHRoaXMuZGF0YVNlcnZpY2UpICYmIHRoaXMuZW50aXR5KSB7XG4gICAgICBpZiAodGhpcy5hc3luY0xvYWRTdWJzY3JpcHRpb25zW3Jvd0luZGV4XSkge1xuICAgICAgICB0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbcm93SW5kZXhdLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbcm93SW5kZXhdID0gdGhpcy5kYXRhU2VydmljZVtxdWVyeU1ldGhvZE5hbWVdKC4uLmNvbHVtblF1ZXJ5QXJncylcbiAgICAgICAgLnN1YnNjcmliZSgocmVzOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkocmVzLmRhdGEpICYmIHJlcy5kYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICBkYXRhID0gcmVzLmRhdGFbMF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFV0aWwuaXNPYmplY3QocmVzLmRhdGEpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSByZXMuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGFvVGFibGUuc2V0QXN5bmNocm9ub3VzQ29sdW1uKGRhdGEsIHJvd0RhdGEpO1xuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgZGF0YS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q3VycmVudERhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHZhbHVlc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q3VycmVudEFsbERhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHJlbmRlcmVkIHZhbHVlc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsUmVuZGVyZWRWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRBbGxSZW5kZXJlckRhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSByZW5kZXJlciBkYXRhLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0UmVuZGVyZWRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldEN1cnJlbnRSZW5kZXJlckRhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgc3FsIHR5cGVzIGZyb20gZGF0YSBzb3VyY2UgYW5kIHRhYmxlIGNvbHVtbnNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFNxbFR5cGVzKCkge1xuICAgIGNvbnN0IGFsbFNxbFR5cGVzID0gVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU291cmNlLnNxbFR5cGVzKSA/IHRoaXMuZGF0YVNvdXJjZS5zcWxUeXBlcyA6IHt9O1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKChjb2w6IE9Db2x1bW4pID0+IHtcbiAgICAgIGlmIChjb2wuc3FsVHlwZSkge1xuICAgICAgICBhbGxTcWxUeXBlc1tjb2wuYXR0cl0gPSBjb2wuc3FsVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWxsU3FsVHlwZXM7XG4gIH1cblxuICBzZXRPVGFibGVDb2x1bW5zRmlsdGVyKHRhYmxlQ29sdW1uc0ZpbHRlcjogT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkge1xuICAgIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCA9IHRhYmxlQ29sdW1uc0ZpbHRlcjtcbiAgfVxuXG4gIGdldCBmaWx0ZXJDb2x1bW5zKCk6IE9GaWx0ZXJDb2x1bW5bXSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZmlsdGVyQ29sdW1ucyA9PT0gdGhpcy5vcmlnaW5hbEZpbHRlckNvbHVtbnNcbiAgICAgICYmIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxGaWx0ZXJDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IG9yaWdpbmFsRmlsdGVyQ29sdW1ucygpOiBBcnJheTxPRmlsdGVyQ29sdW1uPiB7XG4gICAgbGV0IHNvcnRDb2x1bW5zRmlsdGVyID0gW107XG4gICAgaWYgKHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgc29ydENvbHVtbnNGaWx0ZXIgPSB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1uc0FycmF5O1xuICAgIH1cbiAgICByZXR1cm4gc29ydENvbHVtbnNGaWx0ZXI7XG4gIH1cblxuICBnZXQgb3JpZ2luYWxHcm91cGVkQ29sdW1uc0FycmF5KCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiBVdGlsLnBhcnNlQXJyYXkodGhpcy5ncm91cGVkQ29sdW1ucywgdHJ1ZSk7XG4gIH1cblxuICBnZXRTdG9yZWRDb2x1bW5zRmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdG9yZWRGaWx0ZXJzO1xuICB9XG5cbiAgZ2V0U3RvcmVkR3JvdXBlZENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc3RvcmVkQ29uZmlndXJhdGlvbnM7XG4gIH1cblxuICBvbkZpbHRlckJ5Q29sdW1uQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25GaWx0ZXJCeUNvbHVtbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvblN0b3JlRmlsdGVyQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25TdG9yZUZpbHRlckNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkxvYWRGaWx0ZXJDbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkxvYWRGaWx0ZXJDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGVhckZpbHRlckNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uQ2xlYXJGaWx0ZXJDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBmaWx0ZXJzKGNvbHVtbiBmaWx0ZXIsIHF1aWNrZmlsdGVyIGFuZCBmaWx0ZXIgYnVpbGRlcikgYW5kIHJlbG9hZCBkYXRhXG4gICAqIEBwYXJhbSBbdHJpZ2dlckRhdGFzb3VyY2VVcGRhdGVdXG4gICAqL1xuICBjbGVhckZpbHRlcnModHJpZ2dlckRhdGFzb3VyY2VVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuY2xlYXJDb2x1bW5GaWx0ZXJzKHRyaWdnZXJEYXRhc291cmNlVXBkYXRlKTtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51ICYmIHRoaXMub1RhYmxlTWVudS5jb2x1bW5GaWx0ZXJPcHRpb24pIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5jb2x1bW5GaWx0ZXJPcHRpb24uc2V0QWN0aXZlKHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlKTtcbiAgICB9XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICBpZiAodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5zZXRWYWx1ZSh2b2lkIDApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbHRlckJ1aWxkZXIpIHtcbiAgICAgIHRoaXMuZmlsdGVyQnVpbGRlci5jbGVhckZpbHRlcigpO1xuICAgICAgdGhpcy5maWx0ZXJCdWlsZGVyLnRyaWdnZXJSZWxvYWQoKTtcbiAgICB9XG5cbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVyKGF0dHI6IHN0cmluZywgdHJpZ2dlckRhdGFzb3VyY2VVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nU2VydmljZS5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5jbGVhckNvbHVtbkZpbHRlcihhdHRyLCB0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZSk7XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICB9XG5cbiAgZmlsdGVyQnlDb2x1bW4oY29sdW1uVmFsdWVGaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcikge1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuYWRkQ29sdW1uRmlsdGVyKGNvbHVtblZhbHVlRmlsdGVyKTtcbiAgICB0aGlzLm9uRmlsdGVyQnlDb2x1bW5DaGFuZ2UuZW1pdCgpO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVycyh0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZTogYm9vbGVhbiA9IHRydWUsIGNvbHVtbnNBdHRyPzogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuY2xlYXJDb2x1bW5GaWx0ZXJzKHRyaWdnZXJEYXRhc291cmNlVXBkYXRlLCBjb2x1bW5zQXR0cik7XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICB9XG5cbiAgaXNDb2x1bW5GaWx0ZXJhYmxlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpID8gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50LmlzQ29sdW1uRmlsdGVyYWJsZShjb2x1bW4uYXR0cikgOiB0aGlzLmlzU2VhcmNoZWFibGVDb2x1bW4oY29sdW1uKTtcbiAgfVxuXG4gIGlzU2VhcmNoZWFibGVDb2x1bW4oY29sdW1uOiBPQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoZWFibGVDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5hdHRyKTtcbiAgfVxuICBpc0NvbHVtbkZpbHRlckFjdGl2ZShjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbHVtbkZpbHRlcnNBY3RpdmUgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU291cmNlLmdldENvbHVtblZhbHVlRmlsdGVyQnlBdHRyKGNvbHVtbi5hdHRyKSk7XG4gIH1cblxuICBvcGVuQ29sdW1uRmlsdGVyRGlhbG9nKGNvbHVtbjogT0NvbHVtbiwgZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YToge1xuICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgdGFibGU6IHRoaXNcbiAgICAgIH0sXG4gICAgICBtaW5XaWR0aDogJzM4MHB4JyxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIHBhbmVsQ2xhc3M6IFsnby1kaWFsb2ctY2xhc3MnLCAnby10YWJsZS1kaWFsb2cnXVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBzd2l0Y2ggKHJlc3VsdCkge1xuICAgICAgICBjYXNlIFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQuQUNDRVBUOlxuICAgICAgICAgIGNvbnN0IGNvbHVtblZhbHVlRmlsdGVyID0gZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmdldENvbHVtblZhbHVlc0ZpbHRlcigpO1xuICAgICAgICAgIHRoaXMuZmlsdGVyQnlDb2x1bW4oY29sdW1uVmFsdWVGaWx0ZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQuQ0xFQVI6XG4gICAgICAgICAgY29uc3QgY29sID0gZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbHVtbjtcbiAgICAgICAgICB0aGlzLmNsZWFyQ29sdW1uRmlsdGVyKGNvbC5hdHRyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2Uub25Tb3J0RmlsdGVyVmFsdWVzQ2hhbmdlLnN1YnNjcmliZShzb3J0ZWRGaWx0ZXJhYmxlQ29sdW1uID0+IHtcbiAgICAgIC8vIGd1YXJkYXIgZW4gbG9jYWxzdG9yYWdlIGVsIGNhbWJpb1xuICAgICAgdGhpcy5zdG9yZUZpbHRlckNvbHVtbnMoc29ydGVkRmlsdGVyYWJsZUNvbHVtbik7XG4gICAgfSk7XG4gIH1cblxuICBzdG9yZUZpbHRlckNvbHVtbnMoc29ydENvbHVtbkZpbHRlcjogT0ZpbHRlckNvbHVtbikge1xuICAgIGlmICh0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMpIHtcbiAgICAgIC8vIGlmIGV4aXN0cyBpbiBzdGF0ZSB0aGVuIHVwZGF0ZWQgc29ydCB2YWx1ZVxuICAgICAgY29uc3QgZmlsdGVyQ29sdW1uID0gdGhpcy5maWx0ZXJDb2x1bW5zLmZpbmQoeCA9PiB4LmF0dHIgPT09IHNvcnRDb2x1bW5GaWx0ZXIuYXR0cik7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQoZmlsdGVyQ29sdW1uKSkge1xuICAgICAgICBmaWx0ZXJDb2x1bW4uc29ydCA9IHNvcnRDb2x1bW5GaWx0ZXIuc29ydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVsc2UgZXhpc3RzIGluIHN0YXRlIHRoZW4gYWRkZWQgZmlsdGVyIGNvbHVtblxuICAgICAgICB0aGlzLmZpbHRlckNvbHVtbnMucHVzaChzb3J0Q29sdW1uRmlsdGVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zID0gdGhpcy5maWx0ZXJDb2x1bW5zO1xuICB9XG5cbiAgZ2V0U3RhcnRWaWV3RmlsdGVyQ29sdW1uKGNvbHVtbjogT0NvbHVtbik6ICdtb250aCcgfCAneWVhcicgfCAnbXVsdGkteWVhcicgfCAnJyB7XG4gICAgbGV0IHN0YXJ0VmlldztcbiAgICAvLyBhdCBmaXJzdCwgZ2V0IHN0YXRlIGluIGxvY2Fsc3RvcmFnZVxuICAgIGlmICh0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMpIHtcbiAgICAgIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucy5mb3JFYWNoKChlbGVtZW50OiBPRmlsdGVyQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LmF0dHIgPT09IGNvbHVtbi5hdHRyKSB7XG4gICAgICAgICAgc3RhcnRWaWV3ID0gZWxlbWVudC5zdGFydFZpZXc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc3RhcnRWaWV3KSAmJiB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHN0YXJ0VmlldyA9IHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudC5nZXRTdGFydFZpZXdWYWx1ZU9mRmlsdGVyQ29sdW1uKGNvbHVtbi5hdHRyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhcnRWaWV3O1xuICB9XG5cbiAgZ2V0U29ydEZpbHRlckNvbHVtbihjb2x1bW46IE9Db2x1bW4pOiAnYXNjJyB8ICdkZXNjJyB8ICcnIHtcbiAgICBsZXQgc29ydENvbHVtbjtcbiAgICAvLyBhdCBmaXJzdCwgZ2V0IHN0YXRlIGluIGxvY2Fsc3RvcmFnZVxuICAgIGlmICh0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGZpbHRlckNvbCA9IHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucy5maW5kKChlbGVtZW50OiBPRmlsdGVyQ29sdW1uKSA9PiBlbGVtZW50LmF0dHIgPT09IGNvbHVtbi5hdHRyKTtcbiAgICAgIGlmIChmaWx0ZXJDb2wpIHtcbiAgICAgICAgc29ydENvbHVtbiA9IGZpbHRlckNvbC5zb3J0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIG5vdCB2YWx1ZSBpbiBsb2NhbHN0b3JhZ2UsIGdldCBzb3J0IHZhbHVlIGluIG8tdGFibGUtY29sdW1uLWZpbHRlci1jb2x1bW4gY29tcG9uZW50XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzb3J0Q29sdW1uKSAmJiB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHNvcnRDb2x1bW4gPSB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuZ2V0U29ydFZhbHVlT2ZGaWx0ZXJDb2x1bW4oY29sdW1uLmF0dHIpO1xuICAgIH1cblxuICAgIC8vIGlmIGVpdGhlciB2YWx1ZSBpbiBvLXRhYmxlLWNvbHVtbi1maWx0ZXItY29sdW1uIG9yIGxvY2Fsc3RvcmFnZSwgZ2V0IHNvcnQgdmFsdWUgaW4gc29ydENvbEFycmF5XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzb3J0Q29sdW1uKSAmJiB0aGlzLnNvcnRDb2xBcnJheS5maW5kKHggPT4geC5jb2x1bW5OYW1lID09PSBjb2x1bW4uYXR0cikpIHtcbiAgICAgIHNvcnRDb2x1bW4gPSB0aGlzLmlzQ29sdW1uU29ydEFjdGl2ZShjb2x1bW4pID8gJ2FzYycgOiAnZGVzYyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRDb2x1bW47XG4gIH1cblxuICBnZXQgZGlzYWJsZVRhYmxlTWVudUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wZXJtaXNzaW9ucyAmJiB0aGlzLnBlcm1pc3Npb25zLm1lbnUgJiYgdGhpcy5wZXJtaXNzaW9ucy5tZW51LmVuYWJsZWQgPT09IGZhbHNlKTtcbiAgfVxuXG4gIGdldCBzaG93VGFibGVNZW51QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25IaWRkZW4gPSAhISh0aGlzLnBlcm1pc3Npb25zICYmIHRoaXMucGVybWlzc2lvbnMubWVudSAmJiB0aGlzLnBlcm1pc3Npb25zLm1lbnUudmlzaWJsZSA9PT0gZmFsc2UpO1xuICAgIGlmIChwZXJtaXNzaW9uSGlkZGVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRpY09wdCA9IHRoaXMuc2VsZWN0QWxsQ2hlY2tib3ggfHwgdGhpcy5leHBvcnRCdXR0b24gfHwgdGhpcy5zaG93Q29uZmlndXJhdGlvbk9wdGlvbiB8fCB0aGlzLmNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uIHx8ICh0aGlzLnNob3dGaWx0ZXJPcHRpb24gJiYgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpO1xuICAgIHJldHVybiBzdGF0aWNPcHQgfHwgdGhpcy50YWJsZU9wdGlvbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHNldE9UYWJsZUluc2VydGFibGVSb3codGFibGVJbnNlcnRhYmxlUm93OiBPVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50KSB7XG4gICAgY29uc3QgaW5zZXJ0UGVybTogT1Blcm1pc3Npb25zID0gdGhpcy5nZXRBY3Rpb25QZXJtaXNzaW9ucyhQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9JTlNFUlQpO1xuICAgIGlmIChpbnNlcnRQZXJtLnZpc2libGUpIHtcbiAgICAgIHRhYmxlSW5zZXJ0YWJsZVJvdy5lbmFibGVkID0gaW5zZXJ0UGVybS5lbmFibGVkO1xuICAgICAgdGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50ID0gdGFibGVJbnNlcnRhYmxlUm93O1xuICAgICAgdGhpcy5zaG93Rmlyc3RJbnNlcnRhYmxlUm93ID0gdGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzRmlyc3RSb3coKTtcbiAgICAgIHRoaXMuc2hvd0xhc3RJbnNlcnRhYmxlUm93ID0gIXRoaXMuc2hvd0ZpcnN0SW5zZXJ0YWJsZVJvdztcbiAgICAgIHRoaXMub1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pbml0aWFsaXplRWRpdG9ycygpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uQW5kRWRpdGluZyhjbGVhclNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoY2xlYXJTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKG9Db2x1bW4gPT4gb0NvbHVtbi5lZGl0aW5nKVxuICAgICAgLmZvckVhY2gob0NvbHVtbiA9PiB7XG4gICAgICAgIG9Db2x1bW4uZWRpdGluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tTZWxlY3RlZEl0ZW1EYXRhKCkge1xuICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyA9IGZhbHNlO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLnNlbGVjdGlvbikgJiYgdGhpcy5zdGF0ZS5zZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24uZm9yRWFjaChzZWxlY3RlZEl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1LZXlzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgLy8gZmluZGluZyBzZWxlY3RlZCBpdGVtIGRhdGEgaW4gdGhlIHRhYmxlIHJlbmRlcmVkIGRhdGFcbiAgICAgICAgY29uc3QgZm91bmRJdGVtID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5maW5kKGRhdGEgPT5cbiAgICAgICAgICBzZWxlY3RlZEl0ZW1LZXlzLmV2ZXJ5KGtleSA9PiBkYXRhW2tleV0gPT09IHNlbGVjdGVkSXRlbVtrZXldKVxuICAgICAgICApO1xuICAgICAgICBpZiAoZm91bmRJdGVtKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZChmb3VuZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyU2VsZWN0aW9uRXZlbnRzID0gdHJ1ZTtcbiAgfVxuXG4gIHVzZURldGFpbEJ1dHRvbihjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1uLnR5cGUgPT09ICdlZGl0QnV0dG9uSW5Sb3cnIHx8IGNvbHVtbi50eXBlID09PSAnZGV0YWlsQnV0dG9uSW5Sb3cnO1xuICB9XG5cbiAgb25EZXRhaWxCdXR0b25DbGljayhjb2x1bW46IE9Db2x1bW4sIHJvdzogYW55LCBldmVudDogYW55KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgICBjYXNlICdlZGl0QnV0dG9uSW5Sb3cnOlxuICAgICAgICB0aGlzLmVkaXREZXRhaWwocm93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZXRhaWxCdXR0b25JblJvdyc6XG4gICAgICAgIHRoaXMudmlld0RldGFpbChyb3cpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBnZXREZXRhaWxCdXR0b25JY29uKGNvbHVtbjogT0NvbHVtbikge1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgICBjYXNlICdlZGl0QnV0dG9uSW5Sb3cnOlxuICAgICAgICByZXN1bHQgPSB0aGlzLmVkaXRCdXR0b25JblJvd0ljb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGV0YWlsQnV0dG9uSW5Sb3cnOlxuICAgICAgICByZXN1bHQgPSB0aGlzLmRldGFpbEJ1dHRvbkluUm93SWNvbjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB1c2VQbGFpblJlbmRlcihjb2x1bW46IE9Db2x1bW4sIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnVzZURldGFpbEJ1dHRvbihjb2x1bW4pICYmICFjb2x1bW4ucmVuZGVyZXIgJiYgKCFjb2x1bW4uZWRpdG9yIHx8ICghY29sdW1uLmVkaXRpbmcgfHwgIXRoaXMuaXNSb3dTZWxlY3RlZChyb3cpKSk7XG4gIH1cblxuICB1c2VDZWxsUmVuZGVyZXIoY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2x1bW4ucmVuZGVyZXIgJiYgKCFjb2x1bW4uZWRpdGluZyB8fCBjb2x1bW4uZWRpdGluZyAmJiAhdGhpcy5pc1Jvd1NlbGVjdGVkKHJvdykpO1xuICB9XG5cbiAgdXNlQ2VsbEVkaXRvcihjb2x1bW46IE9Db2x1bW4sIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyBBZGQgY29sdW1uLmVkaXRvciBpbnN0YW5jZW9mIE9UYWJsZUNlbGxFZGl0b3JCb29sZWFuQ29tcG9uZW50IHRvIGNvbmRpdGlvblxuICAgIGlmIChjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0b3IuYXV0b0NvbW1pdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uLmVkaXRvciAmJiBjb2x1bW4uZWRpdGluZyAmJiB0aGlzLmlzUm93U2VsZWN0ZWQocm93KTtcbiAgfVxuXG4gIGlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IENvZGVzLlNFTEVDVElPTl9NT0RFX01VTFRJUExFO1xuICB9XG5cbiAgaXNTZWxlY3Rpb25Nb2RlU2luZ2xlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IENvZGVzLlNFTEVDVElPTl9NT0RFX1NJTkdMRTtcbiAgfVxuXG4gIGlzU2VsZWN0aW9uTW9kZU5vbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gQ29kZXMuU0VMRUNUSU9OX01PREVfTk9ORTtcbiAgfVxuXG4gIG9uQ2hhbmdlUGFnZShldnQ6IFBhZ2VFdmVudCkge1xuICAgIGlmICghdGhpcy5sb2FkaW5nU2VydmljZS5oYW5kbGVQcm90ZWN0ZWQoZXZ0IGFzIGFueSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YVNlcnZpY2U/LnNldFBhZ2luYXRpb25Db250ZXh0KHsgcGFnZU51bWJlcjogZXZ0LnBhZ2VJbmRleCwgcGFnZVNpemU6IGV2dC5wYWdlU2l6ZSB9KTtcbiAgICBpZiAoIXRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldnQucGFnZUluZGV4O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGdvaW5nQmFjayA9IGV2dC5wYWdlSW5kZXggPCB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldnQucGFnZUluZGV4O1xuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3IuaXNTaG93aW5nQWxsUm93cyhldnQucGFnZVNpemUpID8gdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciA6IGV2dC5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IG9sZFF1ZXJ5Um93cyA9IHRoaXMucXVlcnlSb3dzO1xuICAgIGNvbnN0IGNoYW5naW5nUGFnZVNpemUgPSAob2xkUXVlcnlSb3dzICE9PSBwYWdlU2l6ZSk7XG4gICAgdGhpcy5xdWVyeVJvd3MgPSBwYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuXG4gICAgbGV0IG5ld1N0YXJ0UmVjb3JkOiBudW1iZXI7XG4gICAgbGV0IHF1ZXJ5TGVuZ3RoOiBudW1iZXI7XG5cbiAgICBpZiAoZ29pbmdCYWNrIHx8IGNoYW5naW5nUGFnZVNpemUpIHtcbiAgICAgIG5ld1N0YXJ0UmVjb3JkID0gKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cyk7XG4gICAgICBxdWVyeUxlbmd0aCA9IHRoaXMucXVlcnlSb3dzO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTdGFydFJlY29yZCA9IE1hdGgubWF4KHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQsICh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5xdWVyeVJvd3MpKTtcbiAgICAgIGNvbnN0IG5ld0VuZFJlY29yZCA9IE1hdGgubWluKG5ld1N0YXJ0UmVjb3JkICsgdGhpcy5xdWVyeVJvd3MsIHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIpO1xuICAgICAgcXVlcnlMZW5ndGggPSB0aGlzLmRpc2FibGVQYWdlU2l6ZUNhbGN1bGF0aW9uID8gdGhpcy5xdWVyeVJvd3MgOiBNYXRoLm1pbih0aGlzLnF1ZXJ5Um93cywgbmV3RW5kUmVjb3JkIC0gbmV3U3RhcnRSZWNvcmQpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5QXJnczogT1F1ZXJ5RGF0YUFyZ3MgPSB7XG4gICAgICBvZmZzZXQ6IG5ld1N0YXJ0UmVjb3JkLFxuICAgICAgbGVuZ3RoOiBxdWVyeUxlbmd0aFxuICAgIH07XG5cbiAgICB0aGlzLmZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgZ2V0T0NvbHVtbihhdHRyOiBzdHJpbmcpOiBPQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5fb1RhYmxlT3B0aW9ucyA/IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09PSBhdHRyKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGluc2VydFJlY29yZChyZWNvcmREYXRhOiBhbnksIHNxbFR5cGVzPzogb2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgaWYgKHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc2VydCBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgYmVjYXVzZSB0aGUgdGFibGUgaXMgcmVhZC1vbmx5LmApXG4gICAgfVxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX0lOU0VSVCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc3FsVHlwZXMpKSB7XG4gICAgICBjb25zdCBhbGxTcWxUeXBlcyA9IHRoaXMuZ2V0U3FsVHlwZXMoKTtcbiAgICAgIHNxbFR5cGVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhyZWNvcmREYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhb1RhYmxlLmluc2VydFF1ZXJ5KHJlY29yZERhdGEsIHNxbFR5cGVzKTtcbiAgfVxuXG4gIHVwZGF0ZVJlY29yZChmaWx0ZXI6IGFueSwgdXBkYXRlRGF0YTogYW55LCBzcWxUeXBlcz86IG9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVcGRhdGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIHRhYmxlIGlzIHJlYWQtb25seS5gKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX1VQREFURSkpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLmRhdGFTb3VyY2UuZGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IHNxbFR5cGVzQXJnID0gc3FsVHlwZXMgfHwge307XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzcWxUeXBlcykpIHtcbiAgICAgIGNvbnN0IGFsbFNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlcygpO1xuICAgICAgT2JqZWN0LmtleXMoZmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzQXJnW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgICBPYmplY3Qua2V5cyh1cGRhdGVEYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzQXJnW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhb1RhYmxlLnVwZGF0ZVF1ZXJ5KGZpbHRlciwgdXBkYXRlRGF0YSwgc3FsVHlwZXNBcmcpO1xuICB9XG5cblxuICAvKipcbiAgICogR2V0cyBkYXRhIHRhYmxlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXREYXRhQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGFvVGFibGUuZGF0YTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgZGF0YSB0YWJsZSB3aGVuIGlzIHN0YXRpYyAoT05MWSBJTiBUSElTIENBU0UpXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBzZXREYXRhQXJyYXkoZGF0YTogQXJyYXk8YW55Pikge1xuICAgIGlmICh0aGlzLmRhb1RhYmxlKSB7XG4gICAgICAvLyByZW1vdGUgcGFnaW5hdGlvbiBoYXMgbm8gc2Vuc2Ugd2hlbiB1c2luZyBzdGF0aWMtZGF0YVxuICAgICAgdGhpcy5wYWdlYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0aWNEYXRhID0gZGF0YTtcbiAgICAgIHRoaXMuZGFvVGFibGUudXNpbmdTdGF0aWNEYXRhID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGFvVGFibGUuc2V0RGF0YUFycmF5KHRoaXMuc3RhdGljRGF0YSk7XG4gICAgICB0aGlzLm9uRGF0YUxvYWRlZC5lbWl0KHRoaXMuZGFvVGFibGUuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlbGV0ZUxvY2FsSXRlbXMoKSB7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gdGhpcy5nZXREYXRhQXJyYXkoKTtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKChzZWxlY3RlZEl0ZW06IGFueSkgPT4ge1xuICAgICAgZm9yIChsZXQgaiA9IGRhdGFBcnJheS5sZW5ndGggLSAxOyBqID49IDA7IC0taikge1xuICAgICAgICBpZiAoVXRpbC5lcXVhbHMoc2VsZWN0ZWRJdGVtLCBkYXRhQXJyYXlbal0pKSB7XG4gICAgICAgICAgZGF0YUFycmF5LnNwbGljZShqLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnNldERhdGFBcnJheShkYXRhQXJyYXkpO1xuICB9XG5cbiAgaXNDb2x1bW5Tb3J0QWN0aXZlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zb3J0Q29sQXJyYXkuZmluZChzb3J0QyA9PiBzb3J0Qy5jb2x1bW5OYW1lID09PSBjb2x1bW4uYXR0cik7XG4gICAgcmV0dXJuIGZvdW5kICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0NvbHVtbkRlc2NTb3J0QWN0aXZlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zb3J0Q29sQXJyYXkuZmluZChzb3J0QyA9PiBzb3J0Qy5jb2x1bW5OYW1lID09PSBjb2x1bW4uYXR0ciAmJiAhc29ydEMuYXNjZW5kZW50KTtcbiAgICByZXR1cm4gZm91bmQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhc1RhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0VtcHR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIVV0aWwuaXNEZWZpbmVkKHZhbHVlKSB8fCAoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpICYmICF2YWx1ZSk7XG4gIH1cblxuICBzZXRGaWx0ZXJzQ29uZmlndXJhdGlvbihzdG9yYWdlOiBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzID0gdGhpcy5zdGF0ZSkge1xuICAgIC8qXG4gICAgICBDaGVja2luZyB0aGUgb3JpZ2luYWwgZmlsdGVyQ2FzZVNlbnNpdGl2ZSB3aXRoIHRoZSBmaWx0ZXJDYXNlU2Vuc2l0aXZlIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpbiBsb2NhbCBzdG9yYWdlXG4gICAgICBpZiBmaWx0ZXJDYXNlU2Vuc2l0aXZlIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpcyBlcXVhbHMgdG8gb3JpZ2luYWwgZmlsdGVyQ2FzZVNlbnNpdGl2ZSBpbnB1dFxuICAgICAgZmlsdGVyQ2FzZVNlbnNpdGl2ZSB3aWxsIGJlIHRoZSB2YWx1ZSBpbiBsb2NhbCBzdG9yYWdlXG4gICAgKi9cbiAgICBpZiAoc3RvcmFnZS5pbml0aWFsQ29uZmlndXJhdGlvbi5maWx0ZXJDYXNlU2Vuc2l0aXZlICE9PSB0aGlzLmZpbHRlckNhc2VTZW5zaXRpdmUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IHRoaXMuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXJDYXNlU2Vuc2l0aXZlID0gc3RvcmFnZS5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyLWNhc2Utc2Vuc2l0aXZlJykgPyBzdG9yYWdlWydmaWx0ZXItY2FzZS1zZW5zaXRpdmUnXSA6IHRoaXMuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmFnZS5pbml0aWFsQ29uZmlndXJhdGlvbi5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQgIT09IHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KSB7XG4gICAgICB0aGlzLmlzQ29sdW1uRmlsdGVyc0FjdGl2ZSA9IHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb25mRmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0ID0gc3RvcmFnZS5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyLWNvbHVtbi1hY3RpdmUnKSA/IHN0b3JhZ2VbJ2ZpbHRlci1jb2x1bW4tYWN0aXZlJ10gOiB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcbiAgICAgIHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gY29uZkZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCB8fCB0aGlzLnN0YXRlLmNvbHVtblZhbHVlRmlsdGVycy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzdG9yYWdlLmNvbHVtblZhbHVlRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5pbml0aWFsaXplQ29sdW1uc0ZpbHRlcnModGhpcy5zdGF0ZS5jb2x1bW5WYWx1ZUZpbHRlcnMpO1xuICAgICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5zZXRWYWx1ZShzdG9yYWdlWydmaWx0ZXInXSk7XG4gICAgICAoc3RvcmFnZVsnb0NvbHVtbnMnXSB8fCBbXSkuZm9yRWFjaCgob0NvbERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBvQ29sID0gdGhpcy5nZXRPQ29sdW1uKG9Db2xEYXRhLmF0dHIpO1xuICAgICAgICBpZiAob0NvbCAmJiBvQ29sRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VhcmNoaW5nJykpIHtcbiAgICAgICAgICBvQ29sLnNlYXJjaGluZyA9IG9Db2xEYXRhLnNlYXJjaGluZztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyQnVpbGRlciAmJiBVdGlsLmlzRGVmaW5lZChzdG9yYWdlLmZpbHRlckJ1aWxkZXJWYWx1ZXMpKSB7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIuc2V0RmlsdGVyVmFsdWVzKHN0b3JhZ2UuZmlsdGVyQnVpbGRlclZhbHVlcyk7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIudHJpZ2dlclJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RvcmVDb25maWd1cmF0aW9uQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25TdG9yZUNvbmZpZ3VyYXRpb25DbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25BcHBseUNvbmZpZ3VyYXRpb25DbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkFwcGx5Q29uZmlndXJhdGlvbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURlZmF1bHRDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtcygpO1xuICAgIHRoaXMucGFyc2VWaXNpYmxlQ29sdW1ucyh0cnVlKTtcbiAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tT3JpZ2luYWxEZWZpbml0aW9uKCk7XG4gICAgdGhpcy5yZWluaXRpYWxpemF0ZVF1aWNrRmlsdGVyQ29sdW1ucygpO1xuICAgIHRoaXMucmVzZXRRdWVyeVJvd3MoKTtcbiAgICBjb25zdCBpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc29ydENvbHVtbnMpO1xuICAgIHRoaXMucmVpbml0aWFsaXplU29ydENvbHVtbnMoaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXkpO1xuICAgIHRoaXMub25SZWluaXRpYWxpemUuZW1pdChudWxsKTtcbiAgICB0aGlzLmNsZWFyRmlsdGVycyhmYWxzZSk7XG4gICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gIH1cbiAgcmVzZXRRdWVyeVJvd3MoKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24ucXVlcnlSb3dzKSkge1xuICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cztcbiAgICB9XG4gIH1cbiAgYXBwbHlDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdG9yZWRDb25maWd1cmF0aW9uID0gdGhpcy5zdGF0ZS5nZXRTdG9yZWRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb25OYW1lKTtcbiAgICBpZiAoc3RvcmVkQ29uZmlndXJhdGlvbikge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHN0b3JlZENvbmZpZ3VyYXRpb25bJ3N0b3JlZC1wcm9wZXJ0aWVzJ10gfHwgW107XG5cbiAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICAgICAgICBjYXNlICdzb3J0LWNvbHVtbnMnOlxuICAgICAgICAgICAgdGhpcy5yZWluaXRpYWxpemVTb3J0Q29sdW1ucygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnb0NvbHVtbnMtZGlzcGxheSc6XG4gICAgICAgICAgICB0aGlzLnBhcnNlVmlzaWJsZUNvbHVtbnMoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdxdWljay1maWx0ZXInOlxuICAgICAgICAgIGNhc2UgJ2NvbHVtbnMtZmlsdGVyJzpcbiAgICAgICAgICBjYXNlICdmaWx0ZXItYnVpbGRlcic6XG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcnNDb25maWd1cmF0aW9uKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdncm91cGVkLWNvbHVtbnMnOlxuICAgICAgICAgICAgdGhpcy5wYXJzZUdyb3VwZWRDb2x1bW5zKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwYWdlJzpcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnN0YXRlLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLnF1ZXJ5Um93cztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFRpdGxlQWxpZ25DbGFzcyhvQ29sOiBPQ29sdW1uKSB7XG5cbiAgICBjb25zdCBoYXNUaXRsZUFsaWduID0gVXRpbC5pc0RlZmluZWQob0NvbC5kZWZpbml0aW9uKSAmJiBVdGlsLmlzRGVmaW5lZChvQ29sLmRlZmluaXRpb24udGl0bGVBbGlnbik7XG4gICAgY29uc3QgYXV0b0FsaWduID0gKHRoaXMuYXV0b0FsaWduVGl0bGVzICYmICFoYXNUaXRsZUFsaWduKSB8fCAoaGFzVGl0bGVBbGlnbiAmJiBvQ29sLmRlZmluaXRpb24udGl0bGVBbGlnbiA9PT0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0FVVE8pO1xuICAgIGlmICghYXV0b0FsaWduKSB7XG4gICAgICByZXR1cm4gb0NvbC5nZXRUaXRsZUFsaWduQ2xhc3MoKTtcbiAgICB9XG5cbiAgICBsZXQgYWxpZ24gPSB0aGlzLmdldENlbGxBbGlnbkNsYXNzKG9Db2wpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChhbGlnbikgJiYgYWxpZ24ubGVuZ3RoID4gMCkge1xuICAgICAgYWxpZ24gPSBhbGlnbi5zdWJzdHJpbmcoMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAob0NvbC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIGNhc2UgJ2FjdGlvbic6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgIGFsaWduID0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0NFTlRFUjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY3VycmVuY3knOlxuICAgICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgY2FzZSAncmVhbCc6XG4gICAgICAgIGNhc2UgJ3BlcmNlbnRhZ2UnOlxuICAgICAgICAgIGFsaWduID0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0VORDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2VydmljZSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYWxpZ24gPSBDb2Rlcy5DT0xVTU5fVElUTEVfQUxJR05fU1RBUlQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGlnbjtcblxuICB9XG5cbiAgcHVibGljIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbjogT0NvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5kZWZpbml0aW9uKSAmJiBVdGlsLmlzRGVmaW5lZChjb2x1bW4uZGVmaW5pdGlvbi5jb250ZW50QWxpZ24pID8gJ28tJyArIGNvbHVtbi5kZWZpbml0aW9uLmNvbnRlbnRBbGlnbiA6ICcnO1xuICB9XG5cblxuICBwdWJsaWMgZ2V0R3JvdXBIZWFkZXJDZWxsQWxpZ25DbGFzcyhjb2x1bW46IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjbGFzc05hbWVBcnJheSA9IFtdO1xuICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uLnN1YnN0cignZ3JvdXBIZWFkZXItJy5sZW5ndGgpKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQob0NvbCkpIHtcbiAgICAgIGNsYXNzTmFtZUFycmF5LnB1c2godGhpcy5nZXRDZWxsQWxpZ25DbGFzcyhvQ29sKSk7XG4gICAgICBjbGFzc05hbWVBcnJheS5wdXNoKG9Db2wuY2xhc3NOYW1lID8gb0NvbC5jbGFzc05hbWUgOiAnJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVBcnJheTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGREZWZhdWx0Um93QnV0dG9ucygpIHtcbiAgICAvLyBjaGVjayBwZXJtaXNzaW9uc1xuICAgIGlmICh0aGlzLmVkaXRCdXR0b25JblJvdykge1xuICAgICAgdGhpcy5hZGRCdXR0b25JblJvdygnZWRpdEJ1dHRvbkluUm93Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRldGFpbEJ1dHRvbkluUm93KSB7XG4gICAgICB0aGlzLmFkZEJ1dHRvbkluUm93KCdkZXRhaWxCdXR0b25JblJvdycpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRCdXR0b25JblJvdyhuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb2xEZWY6IE9Db2x1bW4gPSB0aGlzLmNyZWF0ZU9Db2x1bW4obmFtZSwgdGhpcyk7XG4gICAgY29sRGVmLnR5cGUgPSBuYW1lO1xuICAgIGNvbERlZi52aXNpYmxlID0gdHJ1ZTtcbiAgICBjb2xEZWYuc2VhcmNoYWJsZSA9IGZhbHNlO1xuICAgIGNvbERlZi5vcmRlcmFibGUgPSBmYWxzZTtcbiAgICBjb2xEZWYucmVzaXphYmxlID0gZmFsc2U7XG4gICAgY29sRGVmLmdyb3VwYWJsZSA9IGZhbHNlO1xuICAgIGNvbERlZi50aXRsZSA9IHVuZGVmaW5lZDtcbiAgICBjb2xEZWYud2lkdGggPSAnNDhweCc7XG4gICAgdGhpcy5wdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmKTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLnB1c2gobmFtZSk7XG4gIH1cblxuICBnZXQgaGVhZGVySGVpZ2h0KCkge1xuICAgIGxldCBoZWlnaHQgPSAwO1xuICAgIGlmICh0aGlzLnRhYmxlSGVhZGVyRWw/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGhlaWdodCArPSB0aGlzLnRhYmxlSGVhZGVyRWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYmxlVG9vbGJhckVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBoZWlnaHQgKz0gdGhpcy50YWJsZVRvb2xiYXJFbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIGhlaWdodDtcbiAgfVxuXG4gIGdldCB0b29sQmFySGVpZ2h0KCkge1xuICAgIGxldCBoZWlnaHQgPSAwO1xuXG4gICAgaWYgKHRoaXMudGFibGVUb29sYmFyRWw/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGhlaWdodCArPSB0aGlzLnRhYmxlVG9vbGJhckVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgaXNEZXRhaWxNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRldGFpbE1vZGUgIT09IENvZGVzLkRFVEFJTF9NT0RFX05PTkU7XG4gIH1cblxuICBjb3B5QWxsKCkge1xuICAgIFV0aWwuY29weVRvQ2xpcGJvYXJkKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0UmVuZGVyZWRWYWx1ZSgpKSk7XG4gIH1cblxuICBjb3B5U2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVuZGVyZWREYXRhKHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpKTtcbiAgICBVdGlsLmNvcHlUb0NsaXBib2FyZChKU09OLnN0cmluZ2lmeShzZWxlY3RlZEl0ZW1zKSk7XG4gIH1cblxuICBkZXN0cm95QWN0aXZlZFRvb2x0aXBzKCkge1xuICAgIHRoaXMudG9vbHRpcC5mb3JFYWNoKHRwID0+IHtcbiAgICAgIGlmICh0cC5fb3ZlcmxheVJlZikge1xuICAgICAgICB0cC5fb3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBuYXZpZ2F0aW9uIHRvIGl0ZW0gZGV0YWlsLCByZWNlaXZpbmcgaXRlbSBkYXRhXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm5zIGRldGFpbFxuICAgKi9cbiAgdmlld0RldGFpbChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSAmJiB0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbignZGV0YWlsJykgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3lBY3RpdmVkVG9vbHRpcHMoKTtcbiAgICBzdXBlci52aWV3RGV0YWlsKGl0ZW0pO1xuICB9XG5cblxuICAvKipcbiAgICogVHJpZ2dlcnMgbmF2aWdhdGlvbiB0byBpdGVtIGVkaXRpb24sIHJlY2VpdmluZyBpdGVtIGRhdGFcbiAgICogQHBhcmFtIGl0ZW1cbiAgICogQHJldHVybnMgZGV0YWlsXG4gICAqL1xuICBlZGl0RGV0YWlsKGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5ICYmIHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKCdlZGl0JykgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5lZGl0RGV0YWlsKGl0ZW0pO1xuICB9XG5cbiAgZ2V0T0NvbHVtbkZyb21UaCh0aDogYW55KTogT0NvbHVtbiB7XG4gICAgbGV0IHJlc3VsdDogT0NvbHVtbjtcbiAgICBjb25zdCBjbGFzc0xpc3Q6IGFueVtdID0gQXJyYXkuZnJvbSgodGggYXMgRWxlbWVudCkuY2xhc3NMaXN0IHx8IFtdKTtcbiAgICBjb25zdCBjb2x1bW5DbGFzcyA9IGNsYXNzTGlzdC5maW5kKChjbGFzc05hbWU6IHN0cmluZykgPT4gKGNsYXNzTmFtZS5zdGFydHNXaXRoKCdtYXQtY29sdW1uLScpKSk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbkNsYXNzKSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5nZXRPQ29sdW1uKGNvbHVtbkNsYXNzLnN1YnN0cignbWF0LWNvbHVtbi0nLmxlbmd0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0T0NvbHVtbkZyb21Hcm91cEhlYWRlckNvbHVtbihhdHRyOiBzdHJpbmcpOiBPQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPQ29sdW1uKGF0dHIuc3Vic3RyKCdncm91cEhlYWRlci0nLmxlbmd0aCkpO1xuICB9XG5cbiAgZ2V0VGhXaWR0aEZyb21PQ29sdW1uKG9Db2x1bW46IE9Db2x1bW4pOiBhbnkge1xuICAgIGxldCB3aWR0aENvbHVtbjogbnVtYmVyO1xuICAgIGNvbnN0IHRoQXJyYXkgPSB0aGlzLnRhYmxlSGVhZGVyRWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoQXJyYXkubGVuZ3RoICYmICFVdGlsLmlzRGVmaW5lZCh3aWR0aENvbHVtbik7IGkrKykge1xuICAgICAgY29uc3QgdGggPSB0aEFycmF5W2ldO1xuICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdGguY2xhc3NMaXN0O1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGFzc0xpc3QubGVuZ3RoICYmICFVdGlsLmlzRGVmaW5lZCh3aWR0aENvbHVtbik7IGorKykge1xuICAgICAgICBpZiAoY2xhc3NMaXN0W2pdID09PSAnbWF0LWNvbHVtbi0nICsgb0NvbHVtbi5hdHRyKSB7XG4gICAgICAgICAgd2lkdGhDb2x1bW4gPSB0aC5jbGllbnRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2lkdGhDb2x1bW47XG4gIH1cblxuICBnZXRDb2x1bW5JbnNlcnRhYmxlKG5hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lICsgdGhpcy5nZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKCk7XG4gIH1cblxuICBpc1Jvd1NlbGVjdGVkKHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSAmJiB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sdW1uV2lkdGhGcm9tU3RhdGUoY29sRGVmOiBPQ29sdW1uKTogc3RyaW5nIHtcbiAgICAvLzEuIEJ5IGRlZmF1bHQsIHNldCB3aWR0aCBkZWZpbml0aW9uXG4gICAgbGV0IGNvbHVtbldpZHRoID0gY29sRGVmLmRlZmluaXRpb24gJiYgY29sRGVmLmRlZmluaXRpb24ud2lkdGggPyBjb2xEZWYuZGVmaW5pdGlvbi53aWR0aCA6IHZvaWQgMDtcbiAgICBjb25zdCBzdG9yZWREYXRhID0gdGhpcy5zdGF0ZS5nZXRDb2x1bW5EaXNwbGF5KGNvbERlZik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHN0b3JlZERhdGEpICYmIFV0aWwuaXNEZWZpbmVkKHN0b3JlZERhdGEud2lkdGgpKSB7XG4gICAgICAvLzIuIFNldCB3aWR0aCBpZiB0aGUgd2lkdGggaXMgc3RvcmVkXG4gICAgICBjb2x1bW5XaWR0aCA9IHN0b3JlZERhdGEud2lkdGg7XG4gICAgICAvLyBjaGVjayB0aGF0IHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucyBzYXZlZCBpbiB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBpbiB0aGUgbG9jYWwgc3RvcmFnZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgIGlmICh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmNvbHVtbnNEaXNwbGF5KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxTdG9yZWREYXRhID0gdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5nZXRDb2x1bW5EaXNwbGF5KGNvbERlZik7XG4gICAgICAgIC8vIElmIG9yaWdpbmFsIHdpZHRoIGNoYW5nZWQgdGhlbiB0aGUgd2lkdGggaXMgcmVzZXRlZCB3aXRoIHRoaXMgdmFsdWVcbiAgICAgICAgaWYgKGluaXRpYWxTdG9yZWREYXRhICYmIGluaXRpYWxTdG9yZWREYXRhLndpZHRoICYmIGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGgpIHtcbiAgICAgICAgICBpZiAoaW5pdGlhbFN0b3JlZERhdGEud2lkdGggIT09IGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoID0gY29sRGVmLmRlZmluaXRpb24ub3JpZ2luYWxXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICB9XG5cbiAgcmVmcmVzaENvbHVtbnNXaWR0aEZyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCh4ID0+IHtcbiAgICAgIHgud2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRoRnJvbVN0YXRlKHgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaENvbHVtbnNXaWR0aEZyb21PcmlnaW5hbERlZmluaXRpb24oKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgICBjLndpZHRoID0gYy5ET01XaWR0aCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbikgJiYgVXRpbC5pc0RlZmluZWQoYy5kZWZpbml0aW9uLndpZHRoKSkge1xuICAgICAgICAgIGMud2lkdGggPSBjLmRlZmluaXRpb24ud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgYy5zZXRSZW5kZXJXaWR0aCh0aGlzLmhvcml6b250YWxTY3JvbGwsIHRoaXMuZ2V0Q2xpZW50V2lkdGhDb2x1bW4oYykpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT0NvbHVtbihhdHRyPzogc3RyaW5nLCB0YWJsZT86IE9UYWJsZUNvbXBvbmVudCwgY29sdW1uPzogT1RhYmxlQ29sdW1uQ29tcG9uZW50ICYgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCk6IE9Db2x1bW4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE9Db2x1bW4oKTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgaW5zdGFuY2UuYXR0ciA9IGF0dHI7XG4gICAgfVxuICAgIGlmICh0YWJsZSkge1xuICAgICAgaW5zdGFuY2Uuc2V0RGVmYXVsdFByb3BlcnRpZXMoe1xuICAgICAgICBvcmRlcmFibGU6IHRoaXMub3JkZXJhYmxlLFxuICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlLFxuICAgICAgICBncm91cGFibGU6IHRoaXMuZ3JvdXBhYmxlLFxuICAgICAgICBwYWdlYWJsZTogdGhpcy5wYWdlYWJsZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIGluc3RhbmNlLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT1RhYmxlQnV0dG9ucyhhcmc6IE9UYWJsZUJ1dHRvbnMpIHtcbiAgICB0aGlzLm9UYWJsZUJ1dHRvbnMgPSBhcmc7XG4gICAgaWYgKHRoaXMub1RhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9UYWJsZUJ1dHRvbnMucmVnaXN0ZXJCdXR0b25zKHRoaXMudGFibGVCdXR0b25zLnRvQXJyYXkoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENsaWVudFdpZHRoQ29sdW1uKGNvbDogT0NvbHVtbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGNvbC5ET01XaWR0aCB8fCB0aGlzLmdldFRoV2lkdGhGcm9tT0NvbHVtbihjb2wpO1xuICB9XG5cbiAgcHVibGljIGdldE1pbldpZHRoQ29sdW1uKGNvbDogT0NvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFV0aWwuZXh0cmFjdFBpeGVsc1ZhbHVlKGNvbC5taW5XaWR0aCwgQ29kZXMuREVGQVVMVF9DT0xVTU5fTUlOX1dJRFRIKSArICdweCc7XG4gIH1cblxuICBzaG93RXhwYW5kYWJsZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZW5hYmxlIHZpcnR1YWwgc2Nyb2xsXG4gICAqL1xuICBnZXQgZW5hYmxlZFZpcnR1YWxTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlydHVhbFNjcm9sbCAmJiAhdGhpcy5zaG93RXhwYW5kYWJsZVJvdygpICYmIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5sZW5ndGggPT09IDA7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBncm91cGVkIGNvbHVtbnNcbiAgICovXG4gIHBhcnNlR3JvdXBlZENvbHVtbnMoKSB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuc3RhdGUuZ3JvdXBlZENvbHVtbnMgfHwgdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXk7XG4gICAgaWYgKHRoaXMuc3RhdGUuZ3JvdXBlZENvbHVtbnMgJiYgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5ncm91cGVkQ29sdW1ucykge1xuICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZ3JvdXBlZENvbHVtbnNcbiAgICAgICAgLmZpbHRlcih4ID0+ICF0aGlzLm9yaWdpbmFsR3JvdXBlZENvbHVtbnNBcnJheS5pbmNsdWRlcyh4KSk7XG5cbiAgICAgIGlmIChkaWZmZXJlbmNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0R3JvdXBDb2x1bW5zKHJlc3VsdCk7XG4gIH1cbiAgcGFyc2VHcm91cGVkQ29sdW1uVHlwZXMoKSB7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMgPSB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5UeXBlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcm91cHMgYnkgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIGdyb3VwQnlDb2x1bW4oY29sdW1uOiBPQ29sdW1uLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uLmF0dHIsIHRydWUpO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyb3VwZWRDb2x1bW5UeXBlcyhjb2x1bW4uYXR0ciwgdHJ1ZSwgdHlwZSk7XG4gICAgfVxuICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVHcm91cGVkQ29sdW1ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZ3JvdXAgYnkgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIHVuR3JvdXBCeUNvbHVtbihjb2x1bW46IE9Db2x1bW4pIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW4uYXR0ciwgZmFsc2UpO1xuICAgIHRoaXMudXBkYXRlR3JvdXBlZENvbHVtblR5cGVzKGNvbHVtbi5hdHRyLCBmYWxzZSk7XG4gICAgdGhpcy5kYXRhU291cmNlLnVwZGF0ZUdyb3VwZWRDb2x1bW5zKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5ncm91cCBieSBhbGwgY29sdW1uc1xuICAgKi9cbiAgdW5Hcm91cEJ5QWxsQ29sdW1ucygpIHtcbiAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyhbXSk7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMgPSBbXTtcbiAgfVxuXG4gIHNldEdyb3VwQ29sdW1ucyh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLmdyb3VwZWRDb2x1bW5zQXJyYXkgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGFTb3VyY2UudXBkYXRlR3JvdXBlZENvbHVtbnMoKTtcbiAgfVxuICBzZXRHcm91cGVkQ29sdW1uVHlwZXModmFsdWU6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSkge1xuICAgIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzID0gdmFsdWU7XG4gIH1cbiAgY2hlY2tHcm91cEJ5Q29sdW1uKGZpZWxkOiBzdHJpbmcsIGFkZDogYm9vbGVhbikge1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cGVkQ29sdW1uc0FycmF5KSB7XG4gICAgICBpZiAoY29sdW1uID09PSBmaWVsZCkge1xuICAgICAgICBmb3VuZCA9IHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5pbmRleE9mKGNvbHVtbiwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3VuZCAhPSBudWxsICYmIGZvdW5kID49IDApIHtcbiAgICAgIGlmICghYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5wdXNoKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW0gaXMgZ3JvdXBcbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm5zIHRydWUgaWYgZ3JvdXBcbiAgICovXG4gIGlzR3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIE9UYWJsZUdyb3VwZWRSb3c7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW0gaXMgbm90IGdyb3VwXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vdCBncm91cFxuICAgKi9cbiAgaXNOb3RHcm91cChpbmRleCwgaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKGl0ZW0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KTtcbiAgfVxuXG4gIGdldExhc3RHcm91cHMoKSB7XG4gICAgLy8gR2V0IGxhc3QgZ3JvdXBzXG4gICAgY29uc3Qgc2NvcmVzID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YTtcbiAgICBjb25zdCBtYXhMZXZlbCA9IHNjb3Jlcy5yZWR1Y2UoKGFjYywgY3VycikgPT4gY3Vyci5sZXZlbCA+IGFjYyA/IGN1cnIubGV2ZWwgOiBhY2MsIDApO1xuICAgIGNvbnN0IG1heExldmVsUmVuZGVyZWREYXRhID0gc2NvcmVzLnJlZHVjZSgociwgbykgPT4gby5sZXZlbCA9PT0gbWF4TGV2ZWwgPyBbLi4uciwgb10gOiByLCBbXSk7XG4gICAgcmV0dXJuIG1heExldmVsUmVuZGVyZWREYXRhLmxlbmd0aDtcbiAgfVxuXG4gIGdyb3VwSGVhZGVyQ2xpY2socm93OiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnRvZ2dsZUdyb3VwQnlDb2x1bW4ocm93KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnN0YW5jZU9mT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudChyZW5kZXJlcjogT0Jhc2VUYWJsZUNlbGxSZW5kZXJlcikge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChyZW5kZXJlcikgJiYgKHJlbmRlcmVyIGFzIGFueSkub25EYXRhTG9hZGVkICYmIChyZW5kZXJlciBhcyBhbnkpLnF1ZXJ5QWxsRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbHVtbiBkYXRhIGJ5IGF0dHJcbiAgICogQHBhcmFtIGF0dHJcbiAgICogQHBhcmFtIHJvd1xuICAgKiBAcmV0dXJucyBjb2x1bW4gZGF0YSBieSBhdHRyXG4gICAqL1xuICBnZXRDb2x1bW5EYXRhQnlBdHRyKGF0dHIsIHJvdzogYW55KTogYW55IHtcbiAgICBsZXQgb3BlcmF0aW9uID0gbnVsbDtcbiAgICBpZiAodGhpcy5ncm91cGVkQ29sdW1uVHlwZXMubGVuZ3RoICE9IDAgJiYgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uYXR0ciA9PSBhdHRyKSAhPSAtMSkge1xuICAgICAgb3BlcmF0aW9uID0gdGhpcy5ncm91cGVkQ29sdW1uVHlwZXNbdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uYXR0ciA9PSBhdHRyKV0udHlwZTtcbiAgICB9XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihhdHRyKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICByZXR1cm4gcm93W2F0dHJdO1xuICAgIH1cbiAgICBjb25zdCB1c2VSZW5kZXJlciA9IG9Db2wucmVuZGVyZXIgJiYgb0NvbC5yZW5kZXJlci5nZXRDZWxsRGF0YTtcbiAgICBpZiAob3BlcmF0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KHJvd1tvQ29sLmF0dHJdKTtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldEN1cnJlbnRMYW5nKCk7XG4gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgICBjYXNlIFwiWUVBUlwiOiByZXR1cm4gZGF0ZS55ZWFyKCk7XG4gICAgICAgIGNhc2UgXCJNT05USFwiOiByZXR1cm4gbW9tZW50KCkubG9jYWxlKGxhbmd1YWdlKS5tb250aChkYXRlLm1vbnRoKCkpLmZvcm1hdChcIk1NTU1cIik7XG4gICAgICAgIGNhc2UgXCJZRUFSX01PTlRIXCI6IHJldHVybiBtb21lbnQoKS5sb2NhbGUobGFuZ3VhZ2UpLm1vbnRoKGRhdGUubW9udGgoKSkueWVhcihkYXRlLnllYXIoKSkuZm9ybWF0KFwiTU1NTSwgWVlZWVwiKTtcbiAgICAgICAgY2FzZSBcIllFQVJfTU9OVEhfREFZXCI6IHJldHVybiB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXBkYXRlR3JvdXBlZENvbHVtblR5cGVzKGF0dHI6IHN0cmluZywgYWRkOiBib29sZWFuLCBvcGVyYXRpb24/OiBzdHJpbmcpIHtcbiAgICBsZXQgZ3JvdXBlZENvbHVtbnM6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSA9IFtdO1xuICAgIGxldCBpbmRleCA9IHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmF0dHIgPT0gYXR0cik7XG4gICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwZWRDb2x1bW5UeXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMucHVzaCh7IFwiYXR0clwiOiBhdHRyLCBcInR5cGVcIjogb3BlcmF0aW9uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5UeXBlcyA9IGdyb3VwZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lR3JvdXBIZWFkZXIocm93OiBPVGFibGVHcm91cGVkUm93KTogc3RyaW5nIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gICAgaWYgKHJvdy5sZXZlbCA8PSAxMCkge1xuICAgICAgY2xhc3NOYW1lID0gJ28tdGFibGUtZ3JvdXAtcm93IG8tdGFibGUtZ3JvdXAtcm93LWxldmVsLScgKyByb3cubGV2ZWw7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBwcml2YXRlIHN0b3BFZGl0aW9uKGNsZWFyU2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgIGNsZWFyU2VsZWN0aW9uID0gY2xlYXJTZWxlY3Rpb24gPyBjbGVhclNlbGVjdGlvbiA6IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ0NlbGwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0aW5nUm93ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25BbmRFZGl0aW5nKGNsZWFyU2VsZWN0aW9uKTtcbiAgfVxuXG4gIHN0b3JlRmlsdGVySW5TdGF0ZShhcmc6IE9GaWx0ZXJEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2Uuc3RvcmVGaWx0ZXIoYXJnKTtcbiAgfVxuXG4gIHJlaW5pdGlhbGl6YXRlUXVpY2tGaWx0ZXJDb2x1bW5zKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1xuICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnNlYXJjaGFibGUgJiYgY29sdW1uLnZpc2libGUpXG4gICAgICAuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLnNlYXJjaGluZyA9IHRydWUpXG4gIH1cblxuICByZWluaXRpYWxpemVTb3J0Q29sdW1ucyhzb3J0Q29sdW1ucz86IFNRTE9yZGVyW10pIHtcbiAgICB0aGlzLnRhYmxlSGVhZGVycyA9IFtdO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzb3J0Q29sdW1ucykpIHtcbiAgICAgIHRoaXMuc29ydENvbEFycmF5ID0gc29ydENvbHVtbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyc2VTb3J0Q29sdW1ucygpO1xuICAgIH1cbiAgICB0aGlzLnNvcnQuc2V0U29ydENvbHVtbnModGhpcy5zb3J0Q29sQXJyYXkpO1xuICAgIHRoaXMucmVmcmVzaFNvcnRIZWFkZXJzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaFNvcnRIZWFkZXJzKCkge1xuICAgIHRoaXMudGFibGVIZWFkZXJzLmZpbHRlcihoZWFkZXIgPT4gVXRpbC5pc0RlZmluZWQoaGVhZGVyLm1hdFNvcnRIZWFkZXIpKS5mb3JFYWNoKGhlYWRlciA9PiBoZWFkZXIubWF0U29ydEhlYWRlci5yZWZyZXNoKCkpO1xuICB9XG5cbiAgZ2V0UXVpY2tGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSA/XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnZhbHVlIDpcbiAgICAgICcnO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5Q2VsbFJlbmRlcmVycygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHF1aWNrRmlsdGVyVmFsdWUgPSB0aGlzLmdldFF1aWNrRmlsdGVyVmFsdWUoKTtcblxuICAgIGlmICgoVXRpbC5pc0RlZmluZWQocXVpY2tGaWx0ZXJWYWx1ZSkgJiYgcXVpY2tGaWx0ZXJWYWx1ZS5sZW5ndGggPiAwKSB8fCB0aGlzLnNvcnRDb2xBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnNcbiAgICAgICAgLmZpbHRlcihvQ29sID0+IG9Db2wuc2VhcmNoaW5nICYmIHRoaXMuaXNJbnN0YW5jZU9mT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudChvQ29sLnJlbmRlcmVyKSlcbiAgICAgICAgLm1hcChvQ29sID0+IChvQ29sLnJlbmRlcmVyIGFzIGFueSkucXVlcnlBbGxEYXRhKCkpO1xuXG4gICAgICByZXR1cm4gcXVlcmllcy5sZW5ndGggPiAwID8gY29tYmluZUxhdGVzdChxdWVyaWVzKSA6IG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobnVsbCk7XG4gIH1cblxuICB0YWJsZVF1aWNrRmlsdGVyQ2hhbmdlZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMucXVlcnlDZWxsUmVuZGVyZXJzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5xdWlja0ZpbHRlciA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG9uTWF0U29ydENoYW5nZVxuICBwdWJsaWMgZmlsdGVyRGF0YSh2YWx1ZT86IHN0cmluZywgbG9hZE1vcmU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgLy9cbiAgfVxuXG4gIHNldE9UYWJsZUNvbHVtbnNHcm91cGluZyh2YWx1ZTogT1RhYmxlQ29sdW1uc0dyb3VwaW5nKSB7XG4gICAgdGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldENvbHVtbkdyb3VwaW5nQ29tcG9uZW50KGNvbHVtbkF0dHI6IHN0cmluZyk6IE9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbHVtbkNvbXBvbmVudCB7XG4gICAgbGV0IHJlc3VsdDogT1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29sdW1uQ29tcG9uZW50O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudCkpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LmdldENvbHVtbkdyb3VwaW5nKGNvbHVtbkF0dHIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXNlQ29sdW1uR3JvdXBpbmdBZ2dyZWdhdGUoY29sdW1uQXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW5BdHRyKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNxbFR5cGUgPSB0aGlzLmdldFNxbFR5cGVzKClbY29sdW1uQXR0cl07XG4gICAgY29uc3QgaGFzRGVmYXVsdEFnZ3JlZ2F0ZSA9IFNRTFR5cGVzLmlzTnVtZXJpY1NRTFR5cGUoc3FsVHlwZSlcbiAgICAgICYmICghVXRpbC5pc0RlZmluZWQob0NvbC5yZW5kZXJlcikgfHwgT1RhYmxlQ29tcG9uZW50LkFWQUlMQUJMRV9HUk9VUElOR19DT0xVTU5TX1JFTkRFUkVSUy5pbmNsdWRlcyhvQ29sLnR5cGUpKTtcblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gaGFzRGVmYXVsdEFnZ3JlZ2F0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LnVzZUNvbHVtbkFnZ3JlZ2F0ZShjb2x1bW5BdHRyLCBoYXNEZWZhdWx0QWdncmVnYXRlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1ZpZXdwb3J0U2l6ZSgpIHtcbiAgICAvLyBJdHMgYSB0ZW1wb3JhcmlseSBmaXhlZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTAxMTdcbiAgICAvLyBTb2x2ZSB0aGUgaXNzdWUgd2hlbiBzd2l0Y2hpbmcgdGFicyB3aGVuIHRoZSB2aXJ0dWFsIHNjcm9sbGluZyBjb21wb25lbnQgaXMgdXNlZFxuICAgIC8vIGluIGEgbWF0IC0gdGFiIGNvbXBvbmVudCBhbmQgdmlydHVhbCBzY3JvbGwgd29yayBhYm5vcm1hbGx5XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNob3cgZXhwYW5kYWJsZSBpY29uIG9yIG5vdCBpZiBoYXMgZGF0YSBvciBub3RcbiAgc2hvd0V4cGFuZGFibGVJY29uKHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uKSAmJiB0aGlzLnNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pID8gVXRpbC53cmFwSW50b09ic2VydmFibGUodGhpcy5zaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbihyb3csIHJvd0luZGV4KSkgOiBvZih0cnVlKTtcbiAgfVxuXG4gIGdldENvbHVtbnNOb3RJbmNsdWRlZCgpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGNvbHNOb3RJbmNsdWRlZCA9IFtdO1xuICAgIGNvbHNOb3RJbmNsdWRlZCA9IHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IHZvaWQgMCAhPT0gYy5yZW5kZXJlciAmJiAoYy50eXBlID09PSAnaW1hZ2UnIHx8IGMudHlwZSA9PT0gJ2FjdGlvbicpKS5tYXAoYyA9PiBjLmF0dHIpO1xuICAgIGNvbHNOb3RJbmNsdWRlZC5wdXNoKENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgY29sc05vdEluY2x1ZGVkLnB1c2goQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgcmV0dXJuIGNvbHNOb3RJbmNsdWRlZDtcbiAgfVxuXG4gIGdldENvbHVtbk5hbWVzKGNvbHVtbnM6IHN0cmluZ1tdKTogeyBbY29sdW1uSWQ6IHN0cmluZ106IHN0cmluZzsgfSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5OYW1lcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IG9Db2x1bW4gPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChvYyA9PiBvYy5hdHRyID09PSBjKTtcbiAgICAgIHRhYmxlQ29sdW1uTmFtZXNbY10gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KG9Db2x1bW4udGl0bGUgPyBvQ29sdW1uLnRpdGxlIDogb0NvbHVtbi5hdHRyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFibGVDb2x1bW5OYW1lcztcbiAgfVxuXG4gIHJlc2V0Q29sdW1uc1dpZHRoKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbikpIHtcbiAgICAgICAgYy53aWR0aCA9IFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbi53aWR0aCkgPyBjLmRlZmluaXRpb24ud2lkdGggOiBjLmRlZmluaXRpb24ub3JpZ2luYWxXaWR0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYy53aWR0aCA9IFwiYXV0b1wiO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0RPTVdpZHRoKCk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW5zRE9NV2lkdGgoKSB7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XG4gICAgICBjLkRPTVdpZHRoID0gdGhpcy5nZXRUaFdpZHRoRnJvbU9Db2x1bW4oYyk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVDaGVja2JveChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgZGlzYWJsZSA9IGZhbHNlO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbih7IC4uLml0ZW0gfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXNhYmxlO1xuXG4gIH1cblxuICBnZXRTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgZ2V0U25hY2tTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLnNuYWNrQmFyU2VydmljZTtcbiAgfVxuXG5cbiAgZ2V0RmlsdGVyQ29sdW1uQnlBdHRyKGF0dHI6IHN0cmluZyk6IE9GaWx0ZXJDb2x1bW4ge1xuICAgIC8vIElmIHRoZSBjb2x1bW5zIGZpbHRlciBjb21wb25lbnQgZXhpc3RzLCB1c2UgaXRzIGNvbHVtbiBkZWZpbml0aW9uc1xuICAgIGlmICh0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQ/LmNvbHVtbnNBcnJheT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50Py5jb2x1bW5zQXJyYXkuZmluZChmaWx0ZXJDb2x1bW4gPT4gZmlsdGVyQ29sdW1uLmF0dHIgPT09IGF0dHIpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGNvbHVtbnMgZmlsdGVyIGNvbXBvbmVudCwgZmFsbCBiYWNrIHRvIHRoZSB0YWJsZeKAmXMgdmlzaWJsZSBjb2x1bW5zXG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbiA9IHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zPy5maW5kKGNvbCA9PiBjb2wuYXR0ciA9PT0gYXR0ciAmJiBjb2wudmlzaWJsZSk7XG4gICAgaWYgKHZpc2libGVDb2x1bW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF0dHI6IHZpc2libGVDb2x1bW4uYXR0cixcbiAgICAgICAgdGl0bGU6IHZpc2libGVDb2x1bW4udGl0bGUsXG4gICAgICAgIGZpbHRlclZhbHVlc0luRGF0YTogJ2N1cnJlbnQtcGFnZScsXG4gICAgICAgIHNvcnQ6ICcnLFxuICAgICAgICBzdGFydFZpZXc6ICcnXG5cbiAgICAgIH0gYXMgT0ZpbHRlckNvbHVtbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtblRpdGxlcyhjb2x1bW5zOiB7IGF0dHI6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF0VGFibGUgfHwgIXRoaXMub1RhYmxlT3B0aW9ucz8uY29sdW1ucykgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlcyB0aGUgdGl0bGVzIG9mIGV4aXN0aW5nIGNvbHVtbnNcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLm9UYWJsZU9wdGlvbnMuY29sdW1ucykge1xuICAgICAgY29uc3QgdXBkYXRlZCA9IGNvbHVtbnMuZmluZChjID0+IGMuYXR0ciA9PT0gY29sLmF0dHIpO1xuICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgY29sLnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh1cGRhdGVkLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5tYXRUYWJsZT8ucmVtb3ZlSGVhZGVyUm93RGVmKG51bGwpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJvLXRhYmxlLWNvbnRhaW5lclwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0cmV0Y2hcIiBbc3R5bGUuZGlzcGxheV09XCJpc1Zpc2libGUoKT8gJycgOiAnbm9uZSdcIlxuICBbY2xhc3MuYmxvY2stZXZlbnRzXT1cImxvYWRpbmdTZXJ2aWNlLmlzUHJvY2Vzc2luZyQgfCBhc3luY1wiPlxuICA8by1kYXRhLXRvb2xiYXIgI3RhYmxlVG9vbGJhciAqbmdJZj1cImhhc0NvbnRyb2xzKClcIiBbdGl0bGVdPVwidGl0bGVcIiBbc2hvdy10aXRsZV09XCJzaG93VGl0bGVcIiBjbGFzcz1cIm8tdGFibGUtdG9vbGJhclwiPlxuICAgIDxuZy1jb250YWluZXIgby1kYXRhLXRvb2xiYXItcHJvamVjdGlvbi1zdGFydD5cbiAgICAgIDxvLXRhYmxlLWJ1dHRvbnMgI3RhYmxlQnV0dG9ucyBbaW5zZXJ0LWJ1dHRvbl09XCJpbnNlcnRCdXR0b25cIiBbcmVmcmVzaC1idXR0b25dPVwicmVmcmVzaEJ1dHRvblwiIFtkZWxldGUtYnV0dG9uXT1cInNob3dEZWxldGVCdXR0b25cIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby10YWJsZS1idXR0b25cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L28tdGFibGUtYnV0dG9ucz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbby10YWJsZS10b29sYmFyXVtwb3NpdGlvbj1zdGFydF1cIiBuZ1Byb2plY3RBcz1cIltvLWRhdGEtdG9vbGJhci1jdXN0b20tcHJvamVjdGlvbi1zdGFydF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdGFibGUtdG9vbGJhcl1bcG9zaXRpb249ZW5kXVwiIG5nUHJvamVjdEFzPVwiW28tZGF0YS10b29sYmFyLWN1c3RvbS1wcm9qZWN0aW9uLWVuZF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdGFibGUtdG9vbGJhcl1cIiBuZ1Byb2plY3RBcz1cIltvLWRhdGEtdG9vbGJhci1jdXN0b20tcHJvamVjdGlvbi1zdGFydF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRhaW5lciBvLWRhdGEtdG9vbGJhci1wcm9qZWN0aW9uLWVuZD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWlja2ZpbHRlckNvbnRlbnRDaGlsZDsgZWxzZSBkZWZhdWx0UXVpY2tGaWx0ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby10YWJsZS1xdWlja2ZpbHRlclwiPjwvbmctY29udGVudD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UXVpY2tGaWx0ZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWlja0ZpbHRlclwiPlxuICAgICAgICAgIDxvLXRhYmxlLXF1aWNrZmlsdGVyIChvbkNoYW5nZSk9XCJ0YWJsZVF1aWNrRmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9vLXRhYmxlLXF1aWNrZmlsdGVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cInNob3dUYWJsZU1lbnVCdXR0b25cIiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJvLXRhYmxlLW1lbnUtYnV0dG9uXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInRhYmxlTWVudS5tYXRNZW51XCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOm1vcmVfdmVydFwiPjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxvLXRhYmxlLW1lbnUgI3RhYmxlTWVudSBbc2VsZWN0LWFsbC1jaGVja2JveF09XCJzZWxlY3RBbGxDaGVja2JveFwiIFtleHBvcnQtYnV0dG9uXT1cImV4cG9ydEJ1dHRvblwiXG4gICAgICAgIFtjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uXT1cImNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uXCIgW3Nob3ctY29uZmlndXJhdGlvbi1vcHRpb25dPVwic2hvd0NvbmZpZ3VyYXRpb25PcHRpb25cIlxuICAgICAgICBbc2hvdy1maWx0ZXItb3B0aW9uXT1cInNob3dGaWx0ZXJPcHRpb25cIiBbc2hvdy1yZXBvcnQtb24tZGVtYW5kLW9wdGlvbl09XCJzaG93UmVwb3J0T25EZW1hbmRPcHRpb25cIlxuICAgICAgICBbc2hvdy1jaGFydHMtb24tZGVtYW5kLW9wdGlvbl09XCJzaG93Q2hhcnRzT25EZW1hbmRPcHRpb25cIiBbc2hvdy1yZXNldC13aWR0aC1vcHRpb25dPVwic2hvd1Jlc2V0V2lkdGhPcHRpb25cIiBbc2hvdy1ncm91cC1ieS1vcHRpb25dPVwiZ3JvdXBhYmxlXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm8tdGFibGUtb3B0aW9uXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9vLXRhYmxlLW1lbnU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvby1kYXRhLXRvb2xiYXI+XG5cbiAgPGRpdiAjdGFibGVCb2R5IGNsYXNzPVwiby10YWJsZS1ib2R5IG8tc2Nyb2xsXCIgW2NsYXNzLmhvcml6b250YWwtc2Nyb2xsXT1cImhvcml6b250YWxTY3JvbGxcIiBbY2xhc3Muc2Nyb2xsZWRdPVwiaG9yaXpvbnRhbFNjcm9sbGVkXCJcbiAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBzcGlubmVyQ29udGFpbmVyID8gJ2hpZGRlbicgOiAndmlzaWJsZSd9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlbmFibGVkVmlydHVhbFNjcm9sbDsgZWxzZSB0YWJsZVdpdGhWaXJ0dWFsU2Nyb2xsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiby10YWJsZS1vdmVyZmxvdyBvLXNjcm9sbFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3RhYmxlV2l0aFZpcnR1YWxTY3JvbGw+XG4gICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICN2aXJ0dWFsU2Nyb2xsVmlld1BvcnQgZnhGbGV4PlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbiAgPCEtLVRBQkxFIFBBR0lOQVRPUi0tPlxuICA8bWF0LXBhZ2luYXRvciAqbmdJZj1cInBhZ2luYXRvclwiICNtYXRwYWdpbmF0b3IgW2xlbmd0aF09XCJkYXRhU291cmNlPy5yZXN1bHRzTGVuZ3RoXCIgW3BhZ2VJbmRleF09XCJwYWdpbmF0b3IucGFnZUluZGV4XCIgW3BhZ2VTaXplXT1cInF1ZXJ5Um93c1wiXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0b3IucGFnZVNpemVPcHRpb25zXCIgKHBhZ2UpPVwib25DaGFuZ2VQYWdlKCRldmVudClcIiBbc2hvd0ZpcnN0TGFzdEJ1dHRvbnNdPVwicGFnaW5hdG9yLnNob3dGaXJzdExhc3RCdXR0b25zXCJcbiAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBzcGlubmVyQ29udGFpbmVyID8gJ2hpZGRlbicgOiAndmlzaWJsZSd9XCI+XG4gIDwvbWF0LXBhZ2luYXRvcj5cblxuICA8IS0tTE9BRElORy0tPlxuICA8ZGl2ICNzcGlubmVyQ29udGFpbmVyICpuZ0lmPVwic2hvd0xvYWRpbmcgfCBhc3luY1wiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBbbmdTdHlsZV09XCJ7J3RvcC5weCc6IHRvb2xCYXJIZWlnaHR9XCJcbiAgICBjbGFzcz1cInNwaW5uZXItY29udGFpbmVyXCIgW2NsYXNzLnNwaW5uZXItY29udGFpbmVyLXNjcm9sbGFibGVdPVwibG9hZGluZ1Njcm9sbCB8IGFzeW5jXCI+XG4gICAgPG8tdGFibGUtc2tlbGV0b24+PC9vLXRhYmxlLXNrZWxldG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIERpc2FibGUgYmxvY2tlciAtLT5cbiAgPGRpdiAqbmdJZj1cIiFlbmFibGVkXCIgY2xhc3M9XCJvLXRhYmxlLWRpc2FibGVkLWJsb2NrZXJcIj48L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RhYmxlPlxuICA8dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbY2xhc3MuYXV0b2FkanVzdGVkXT1cImF1dG9BZGp1c3RcIiBbdHJhY2tCeV09XCJnZXRUcmFja0J5RnVuY3Rpb24oKVwiIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBvTWF0U29ydFxuICAgIFtvTWF0U29ydENvbHVtbnNdPVwic29ydENvbEFycmF5XCIgW25nQ2xhc3NdPVwicm93SGVpZ2h0T2JzZXJ2YWJsZSB8IGFzeW5jXCIgKGNka09ic2VydmVDb250ZW50KT1cInByb2plY3RDb250ZW50Q2hhbmdlZCgpXCJcbiAgICBvVGFibGVFeHBhbmRlZEZvb3RlciBbb1RhYmxlRXhwYW5kZWRGb290ZXJDb2xzcGFuXT1cInZpc2libGVDb2xBcnJheS5sZW5ndGhcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwic2hvd0V4cGFuZGFibGVSb3coKVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJvbnRpbWl6ZS13ZWIgdGFibGVcIj5cblxuICAgIDwhLS1DaGVja2JveCBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm5hbWVcIiAqbmdJZj1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQ7IGVsc2UgY3VzdG9tSGVhZGVyU2VsZWN0QWxsVGVtcGxhdGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiICpuZ0lmPVwiaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKVwiPlxuICAgICAgICAgICAgPG8tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGwgW2NvbHVtbl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtblwiPjwvby10YWJsZS1oZWFkZXItc2VsZWN0LWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggbmFtZT1cImlkW11cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZUNoZWNrYm94KHJvdylcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3Rpb25DaGVja2JveFRvZ2dsZSgkZXZlbnQsIHJvdylcIiBbY2hlY2tlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21IZWFkZXJTZWxlY3RBbGxUZW1wbGF0ZT5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiIGNsYXNzPVwibWF0LWhlYWRlci1zZWxlY3QtYWxsLXdpdGgtdGl0bGUgby1jZW50ZXJcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi53aWR0aFwiIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4ob1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4pXCJcbiAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm1heFdpZHRoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxvLXRhYmxlLWhlYWRlci1zZWxlY3QtYWxsIFtjb2x1bW5dPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW5cIj48L28tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm8tY2VudGVyXCIgW3N0eWxlLndpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKG9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWF4V2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJpZFtdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVDaGVja2JveChyb3cpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0aW9uQ2hlY2tib3hUb2dnbGUoJGV2ZW50LCByb3cpXCIgW2NoZWNrZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG5cbiAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS1FeHBhbmRhYmxlIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwib1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uLm5hbWVcIiAqbmdJZj1cImlzQ29sdW1uRXhwYW5kYWJsZSgpXCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICB7eyBvVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udGl0bGUgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGRhdGFJbmRleFwiPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzaG93RXhwYW5kYWJsZUljb24ocm93LCByb3dJbmRleCkgfCBhc3luY1wiIChjbGljayk9XCJ0b2dnbGVSb3dFeHBhbmRhYmxlKHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24pPVwidG9nZ2xlUm93RXhwYW5kYWJsZShyb3csICRldmVudClcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFeHBhbmRlZChyb3cpXCI+e3sgdGFibGVSb3dFeHBhbmRhYmxlLmljb25Db2xsYXBzZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFeHBhbmRlZChyb3cpXCI+e3sgdGFibGVSb3dFeHBhbmRhYmxlLmljb25FeHBhbmQgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEdlbmVyaWMgY29sdW1uIGRlZmluaXRpb24gLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIG9UYWJsZU9wdGlvbnMuY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIj5cbiAgICAgIDwhLS1EZWZpbmUgaGVhZGVyLWNlbGwtLT5cblxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbbmdDbGFzc109XCJnZXRUaXRsZUFsaWduQ2xhc3MoY29sdW1uKVwiIFtjbGFzcy5yZXNpemFibGVdPVwicmVzaXphYmxlXCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICA8by10YWJsZS1oZWFkZXIgW2NvbHVtbl09XCJjb2x1bW5cIj48L28tdGFibGUtaGVhZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGg+XG5cblxuICAgICAgPCEtLURlZmluZSBtYXQtY2VsbC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWJsZS5tdWx0aVRlbXBsYXRlRGF0YVJvd3M7IGVsc2UgY2VsbFRlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzXCI+XG4gICAgICAgIDx0ZCAjY2VsbCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7bGV0IHJvd0luZGV4ID0gaW5kZXggXCIgW25nQ2xhc3NdPVwiW2NvbHVtbi5jbGFzc05hbWUsIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbildXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2socm93LCBjb2x1bW4sIHJvd0luZGV4LCBjZWxsLCAkZXZlbnQpXCIgKGRibGNsaWNrKT1cImhhbmRsZURvdWJsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiXG4gICAgICAgICAgW2NsYXNzLmVtcHR5LWNlbGxdPVwiaXNFbXB0eShyb3dbY29sdW1uLm5hbWVdKVwiIFttYXRUb29sdGlwRGlzYWJsZWRdPVwiIWNvbHVtbi5oYXNUb29sdGlwKClcIiBbbWF0VG9vbHRpcF09XCJjb2x1bW4uZ2V0VG9vbHRpcChyb3cpXCJcbiAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI3NTBcIiBtYXRUb29sdGlwQ2xhc3M9XCJvLXRhYmxlLWNlbGwtdG9vbHRpcFwiXG4gICAgICAgICAgW2NsYXNzLm8tbWF0LWNlbGwtbXVsdGlsaW5lXT1cIihjb2x1bW4uaXNNdWx0aWxpbmUgfCBhc3luYylcIiBbb0NvbnRleHRNZW51XT1cInRhYmxlQ29udGV4dE1lbnVcIlxuICAgICAgICAgIFtvQ29udGV4dE1lbnVEYXRhXT1cInsgY2VsbE5hbWU6Y29sdW1uLm5hbWUsIHJvd1ZhbHVlOnJvdywgcm93SW5kZXg6cm93SW5kZXh9XCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJnZXRNaW5XaWR0aENvbHVtbihjb2x1bW4pXCIgW3N0eWxlLm1heC13aWR0aF09XCJjb2x1bW4ubWF4V2lkdGhcIlxuICAgICAgICAgIFtjbGFzcy5vLXRhYmxlLWVkaXRpbmctY2VsbF09XCJpc1Jvd1NlbGVjdGVkKHJvdykgJiYgY29sdW1uLmVkaXRpbmdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VsbFJlbmRlcmVyO2NvbnRleHQ6e2NvbHVtbjpjb2x1bW4scm93OnJvd31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsVGVtcGxhdGVNdWx0aVRlbXBsYXRlRGF0YVJvd3M+XG4gICAgICAgIDx0ZCAjY2VsbCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7bGV0IHJvd0luZGV4ID0gZGF0YUluZGV4IFwiIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiIChkYmxjbGljayk9XCJoYW5kbGVEb3VibGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIlxuICAgICAgICAgIFtjbGFzcy5lbXB0eS1jZWxsXT1cImlzRW1wdHkocm93W2NvbHVtbi5uYW1lXSlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFjb2x1bW4uaGFzVG9vbHRpcCgpXCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLmdldFRvb2x0aXAocm93KVwiXG4gICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNzUwXCIgbWF0VG9vbHRpcENsYXNzPVwiby10YWJsZS1jZWxsLXRvb2x0aXBcIlxuICAgICAgICAgIFtjbGFzcy5vLW1hdC1jZWxsLW11bHRpbGluZV09XCIoY29sdW1uLmlzTXVsdGlsaW5lIHwgYXN5bmMpXCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgICBbb0NvbnRleHRNZW51RGF0YV09XCJ7IGNlbGxOYW1lOmNvbHVtbi5uYW1lLCByb3dWYWx1ZTpyb3csIHJvd0luZGV4OnJvd0luZGV4fVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCJcbiAgICAgICAgICBbY2xhc3Muby10YWJsZS1lZGl0aW5nLWNlbGxdPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxSZW5kZXJlcjtjb250ZXh0Ontjb2x1bW46Y29sdW1uLHJvdzpyb3d9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8IS0tRGVmaW5lIG1hdC1mb290ZXItY2VsbC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUb3RhbHMgfCBhc3luY1wiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIFtuZ0NsYXNzXT1cImNvbHVtbi5jbGFzc05hbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIiAqbmdJZj1cImNvbHVtbi5hZ2dyZWdhdGUgJiYgY29sdW1uLmFnZ3JlZ2F0ZS50aXRsZVwiPlxuICAgICAgICAgICAge3sgY29sdW1uLmFnZ3JlZ2F0ZS50aXRsZSB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5yZW5kZXJlciB8fCBjb2x1bW4uYWdncmVnYXRlPy5vcGVyYXRvciA9PT0gJ2NvdW50JzsgZWxzZSByZW5kZXJlclRlbXBsYXRlXCI+XG4gICAgICAgICAgICB7eyBkYXRhU291cmNlLmdldEFnZ3JlZ2F0ZURhdGEoY29sdW1uKSB9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVuZGVyZXJUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvbHVtbi5yZW5kZXJlciAmJiBjb2x1bW4uYWdncmVnYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLnJlbmRlcmVyLnRlbXBsYXRlcmVmXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjZWxsdmFsdWU6IGRhdGFTb3VyY2UuZ2V0QWdncmVnYXRlRGF0YShjb2x1bW4pfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZGV0YWlsIHJvdyBpcyBtYWRlIHVwIG9mIHRoaXMgb25lIGNvbHVtbiB0aGF0IHNwYW5zIGFjcm9zcyBhbGwgY29sdW1ucyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRXhwYW5kZWRSb3dcIj5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwYW5kZWREZXRhaWxcIj5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztsZXQgcm93SW5kZXg9IGRhdGFJbmRleFwiIFthdHRyLmNvbHNwYW5dPVwib1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXgpXCIgW0BkZXRhaWxFeHBhbmRdPVwiZ2V0U3RhdGVFeHBhbmQocm93KVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tRk9PVEVSLUlOU0VSVEFCTEUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0xhc3RJbnNlcnRhYmxlUm93ICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5uYW1lICsgZ2V0U3VmZml4Q29sdW1uSW5zZXJ0YWJsZSgpXCIgKm5nSWY9XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXCI+XG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBvVGFibGVPcHRpb25zLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lKyBnZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKClcIj5cblxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmICFvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnVzZUNlbGxFZGl0b3IoY29sdW1uKVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5zZXJ0YWJsZS1mb3JtLWZpZWxkIG8tdGFibGUtY2VsbC1lZGl0b3ItdGV4dCBvLXRhYmxlLWNlbGwtZWRpdG9yXCIgW2hpZGVSZXF1aXJlZE1hcmtlcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRQbGFjZWhvbGRlcihjb2x1bW4pXCIgW2lkXT1cImNvbHVtbi5hdHRyXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRDb250cm9sKGNvbHVtbilcIiBbcmVxdWlyZWRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtblJlcXVpcmVkKGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqb01hdEVycm9yPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5IYXNFcnJvcihjb2x1bW4sICdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5SRVFVSVJFRCcgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5FZGl0b3JzW2NvbHVtbi5hdHRyXS50ZW1wbGF0ZXJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHJvd3ZhbHVlOiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnJvd0RhdGEgfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpcnN0SW5zZXJ0YWJsZVJvdyAmJiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiZ2V0Q29sdW1uSW5zZXJ0YWJsZShvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5uYW1lKVwiICpuZ0lmPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZVwiPlxuICAgICAgICA8dGQgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygb1RhYmxlT3B0aW9ucy5jb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJnZXRDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbi5uYW1lKVwiPlxuXG4gICAgICAgIDx0ZCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW25nQ2xhc3NdPVwiW2NvbHVtbi5jbGFzc05hbWUsIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbildXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgIW9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnNlcnRhYmxlLWZvcm0tZmllbGRcIiBbaGlkZVJlcXVpcmVkTWFya2VyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmdldFBsYWNlaG9sZGVyKGNvbHVtbilcIiBbaWRdPVwiY29sdW1uLmF0dHJcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmdldENvbnRyb2woY29sdW1uKVwiIFtyZXF1aXJlZF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uUmVxdWlyZWQoY29sdW1uKVwiPlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmNvbHVtbkhhc0Vycm9yKGNvbHVtbiwgJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICB7eyAnRk9STV9WQUxJREFUSU9OLlJFUVVJUkVEJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC51c2VDZWxsRWRpdG9yKGNvbHVtbilcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmNvbHVtbkVkaXRvcnNbY29sdW1uLmF0dHJdLnRlbXBsYXRlcmVmXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcm93dmFsdWU6IG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQucm93RGF0YSB9XCI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRGVmaW5pdGlvbiBjb2x1bW4gZ3JvdXAgaGVhZGVyIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBncm91cGluZ0hlYWRlcnNSb3dzOyBsZXQgaSA9IGluZGV4XCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW5cIj5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBncm91cFwiIGNsYXNzPVwiZ3JvdXBpbmctcm93XCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgW29Db250ZXh0TWVudURhdGFdPVwieyBjZWxsTmFtZTpjb2x1bW4sIHJvd1ZhbHVlOmdyb3VwLCByb3dJbmRleDppfVwiIFtuZ0NsYXNzXT1cImdldEdyb3VwSGVhZGVyQ2VsbEFsaWduQ2xhc3MoY29sdW1uKVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaT09PTBcIiBjbGFzcz1cImdyb3VwaW5nLXRpdGxlLXdyYXBwZXJcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6IDIwKihncm91cC5sZXZlbC0xKSsncHgnfVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj57eyBncm91cC5leHBhbmRlZCA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCcgfX08L21hdC1pY29uPlxuICAgICAgICAgIHt7IGdyb3VwLnRpdGxlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBpbmctYWdncmVnYXRlXCIgKm5nSWY9XCJncm91cC5oYXNBY3RpdmVBZ2dyZWdhdGUodmlzaWJsZUNvbEFycmF5W2ldKVwiPlxuICAgICAgICAgIHt7IGdyb3VwLmdldENvbHVtbkFjdGl2ZUFnZ3JlZ2F0ZVRpdGxlKHZpc2libGVDb2xBcnJheVtpXSkgfCBvVHJhbnNsYXRlIH19IDpcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oY29sdW1uKS5yZW5kZXJlclwiPlxuICAgICAgICAgICAge3sgZ3JvdXAuZ2V0Q29sdW1uQWdncmVnYXRlVmFsdWUodmlzaWJsZUNvbEFycmF5W2ldKX19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oY29sdW1uKS5yZW5kZXJlclwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0T0NvbHVtbkZyb21Hcm91cEhlYWRlckNvbHVtbihjb2x1bW4pLnJlbmRlcmVyPy50ZW1wbGF0ZXJlZjsgY29udGV4dDp7IGNlbGx2YWx1ZTogIGdyb3VwLmdldENvbHVtbkFnZ3JlZ2F0ZVZhbHVlKHZpc2libGVDb2xBcnJheVtpXSkgfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwb3NpdGlvblwiPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPiB7e3Jvd319IDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgI3RhYmxlSGVhZGVyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyBzdGlja3k6IGZpeGVkSGVhZGVyXCI+PC90cj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGUubXVsdGlUZW1wbGF0ZURhdGFSb3dzOyBlbHNlIHJvd1RlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzXCI+XG4gICAgICA8dHIgbWF0LXJvdyBvVGFibGVSb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IG9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnM7IHdoZW46aXNOb3RHcm91cDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCIgW25nQ2xhc3NdPVwicm93IHwgb1RhYmxlUm93Q2xhc3M6IHJvd0luZGV4OiByb3dDbGFzc1wiPlxuICAgICAgPC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3Jvd1RlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxuICAgICAgPHRyIG1hdC1yb3cgb1RhYmxlUm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyB3aGVuOmlzTm90R3JvdXA7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIiBbbmdDbGFzc109XCJyb3cgfCBvVGFibGVSb3dDbGFzczogcm93SW5kZXg6IHJvd0NsYXNzXCI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFJvdyBHcm91cCBoZWFkZXIgLS0+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGdyb3VwaW5nSGVhZGVyc1Jvd3M7IHdoZW46aXNHcm91cFwiIChjbGljayk9XCJncm91cEhlYWRlckNsaWNrKHJvdylcIlxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3NOYW1lR3JvdXBIZWFkZXIocm93KVwiPlxuICAgIDwvdHI+XG5cbiAgICA8IS0tIEV4cGFuZGVkIGRldGFpbCByb3ctLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRXhwYW5kZWRSb3dcIj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2V4cGFuZGVkRGV0YWlsJ11cIiBjbGFzcz1cIm8tdGFibGUtcm93LWV4cGFuZGVkXCI+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TGFzdEluc2VydGFibGVSb3dcIj5cbiAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwib1RhYmxlT3B0aW9ucy5jb2x1bW5zSW5zZXJ0YWJsZXM7IHN0aWNreTogdHJ1ZVwiXG4gICAgICAgIChrZXl1cCk9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmhhbmRsZUtleWJvYXJkRXZlbnQoJGV2ZW50KVwiIGNsYXNzPVwiby10YWJsZS1pbnNlcnRhYmxlXCI+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpcnN0SW5zZXJ0YWJsZVJvd1wiPlxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLmNvbHVtbnNJbnNlcnRhYmxlczsgc3RpY2t5OiB0cnVlXCJcbiAgICAgICAgKGtleXVwKT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaGFuZGxlS2V5Ym9hcmRFdmVudCgkZXZlbnQpXCIgY2xhc3M9XCJvLXRhYmxlLWluc2VydGFibGVcIj4gPC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1RvdGFscyB8IGFzeW5jXCI+XG4gICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cIm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnM7IHN0aWNreTogdHJ1ZVwiIGNsYXNzPVwiby10YWJsZS1hZ2dyZWdhdGVcIj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdGFibGU+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGV4dE1lbnVDb250ZW50Q2hpbGQgJiYgY29udGV4dE1lbnVcIj5cbiAgPG8tdGFibGUtY29udGV4dC1tZW51IFtpbnNlcnRdPVwiaW5zZXJ0QnV0dG9uXCIgW2VkaXRdPVwiZWRpdGlvbk1vZGUgIT09IEVESVRfTU9ERV9OT05FXCIgW3ZpZXctZGV0YWlsXT1cImRldGFpbE1vZGUgIT09IERFVEFJTF9NT0RFX05PTkVcIlxuICAgIFtyZWZyZXNoXT1cInJlZnJlc2hCdXR0b25cIiBbZGVsZXRlXT1cImRlbGV0ZUJ1dHRvblwiIFtmaWx0ZXJdPVwic2hvd0ZpbHRlck9wdGlvblwiIFtncm91cC1ieS1yb3ddPVwiZ3JvdXBhYmxlXCI+XG4gIDwvby10YWJsZS1jb250ZXh0LW1lbnU+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNjZWxsUmVuZGVyZXIgbGV0LXJvdz1cInJvd1wiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cblxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRydWVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImNvbHVtbi5yZW5kZXJlciAhPSBudWxsICYmICghY29sdW1uLmVkaXRpbmcgfHwgY29sdW1uLmVkaXRpbmcgJiYgIWlzUm93U2VsZWN0ZWQocm93KSlcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uLnJlbmRlcmVyPy50ZW1wbGF0ZXJlZjsgY29udGV4dDp7IGNlbGx2YWx1ZTogcm93W2NvbHVtbi5uYW1lXSwgcm93dmFsdWU6cm93IH1cIj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5lZGl0b3I/LnRlbXBsYXRlcmVmOyBjb250ZXh0OnsgY2VsbHZhbHVlOiByb3dbY29sdW1uLm5hbWVdLCByb3d2YWx1ZTpyb3cgfVwiPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImNvbHVtbi50eXBlID09PSAnZWRpdEJ1dHRvbkluUm93JyB8fCBjb2x1bW4udHlwZSA9PT0gJ2RldGFpbEJ1dHRvbkluUm93J1wiPlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgY2xhc3M9XCJvLWFjdGlvbi1jZWxsLXJlbmRlcmVyXCIgKGNsaWNrKT1cIm9uRGV0YWlsQnV0dG9uQ2xpY2soY29sdW1uLCByb3csICRldmVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24+e3sgZ2V0RGV0YWlsQnV0dG9uSWNvbihjb2x1bW4pIH19PC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD57eyByb3dbY29sdW1uLm5hbWVdIH19PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19