@messaia/cdk 17.1.5 → 18.0.0-rc02

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 (242) hide show
  1. package/esm2022/lib/base/base.module.mjs +8 -8
  2. package/esm2022/lib/base/components/base.component.mjs +4 -4
  3. package/esm2022/lib/base/components/dynamic-table-config-dialog.comnponent.mjs +3 -3
  4. package/esm2022/lib/base/components/generic-form-base.component.mjs +4 -4
  5. package/esm2022/lib/base/components/generic-form.component.mjs +3 -3
  6. package/esm2022/lib/base/components/generic-list.component.mjs +4 -4
  7. package/esm2022/lib/base/components/generic-reactive-form.component.mjs +4 -4
  8. package/esm2022/lib/base/constants/common.mjs +2 -2
  9. package/esm2022/lib/base/helpers/auth-helper.mjs +1 -1
  10. package/esm2022/lib/base/interceptors/base.interceptor.mjs +4 -4
  11. package/esm2022/lib/base/interceptors/caching-interceptor.mjs +4 -4
  12. package/esm2022/lib/base/interceptors/loading.interceptor.mjs +4 -4
  13. package/esm2022/lib/base/services/file.service.mjs +3 -3
  14. package/esm2022/lib/base/services/loading-screen.service.mjs +3 -3
  15. package/esm2022/lib/base/services/print.service.mjs +3 -3
  16. package/esm2022/lib/chips/chips.module.mjs +4 -4
  17. package/esm2022/lib/chips/components/chips.component.mjs +4 -4
  18. package/esm2022/lib/chips/directives/autocomplete-option.directive.mjs +3 -3
  19. package/esm2022/lib/chips/directives/chip.directive.mjs +3 -3
  20. package/esm2022/lib/common/behaviors/control-value-accesor.mixin.mjs +1 -1
  21. package/esm2022/lib/common/behaviors/disabled.mixin.mjs +1 -1
  22. package/esm2022/lib/common/common.module.mjs +4 -4
  23. package/esm2022/lib/common/directives/delayed-hover.directive.mjs +4 -4
  24. package/esm2022/lib/common/directives/disable-control.directive.mjs +4 -4
  25. package/esm2022/lib/common/functions/utils.mjs +4 -4
  26. package/esm2022/lib/common/helpers/app-storage.mjs +4 -4
  27. package/esm2022/lib/common/helpers/dynamic-builder.mjs +4 -4
  28. package/esm2022/lib/common/helpers/dynamic-component-compiler.mjs +3 -3
  29. package/esm2022/lib/common/models/app-setting.mjs +3 -3
  30. package/esm2022/lib/common/pipes/data-source.pipe.mjs +3 -3
  31. package/esm2022/lib/common/pipes/enum.pipe.mjs +3 -3
  32. package/esm2022/lib/common/pipes/file-size.pipe.mjs +4 -4
  33. package/esm2022/lib/common/pipes/filter.pipe.mjs +4 -4
  34. package/esm2022/lib/common/pipes/first-letter.mjs +3 -3
  35. package/esm2022/lib/common/pipes/form-array.pipe.mjs +3 -3
  36. package/esm2022/lib/common/pipes/form-control.pipe.mjs +3 -3
  37. package/esm2022/lib/common/pipes/form-group.pipe.mjs +3 -3
  38. package/esm2022/lib/common/pipes/func.pipe.mjs +3 -3
  39. package/esm2022/lib/common/pipes/join.pipe.mjs +4 -4
  40. package/esm2022/lib/common/pipes/keys.mjs +4 -4
  41. package/esm2022/lib/common/pipes/month-name.pipe.mjs +3 -3
  42. package/esm2022/lib/common/pipes/nested-property.mjs +3 -3
  43. package/esm2022/lib/common/pipes/only-number.mjs +4 -4
  44. package/esm2022/lib/common/pipes/order.pipe.mjs +4 -4
  45. package/esm2022/lib/common/pipes/placeholder.pipe.mjs +4 -4
  46. package/esm2022/lib/common/pipes/property-join.pipe.mjs +4 -4
  47. package/esm2022/lib/common/pipes/safe-html.pipe.mjs +3 -3
  48. package/esm2022/lib/common/pipes/split.pipe.mjs +3 -3
  49. package/esm2022/lib/common/pipes/time.pipe.mjs +4 -4
  50. package/esm2022/lib/common/pipes/titlecase.pipe.mjs +3 -3
  51. package/esm2022/lib/common/pipes/truncate.pipe.mjs +3 -3
  52. package/esm2022/lib/common/pipes/values.mjs +3 -3
  53. package/esm2022/lib/common/services/base.service.mjs +3 -3
  54. package/esm2022/lib/common/services/enum.service.mjs +4 -4
  55. package/esm2022/lib/common/services/event-queue.service.mjs +3 -3
  56. package/esm2022/lib/dialogs/alert-dialog/alert-dialog.component.mjs +3 -3
  57. package/esm2022/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +3 -3
  58. package/esm2022/lib/dialogs/dialog.component.mjs +13 -13
  59. package/esm2022/lib/dialogs/dialogs.module.mjs +4 -4
  60. package/esm2022/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +3 -3
  61. package/esm2022/lib/dialogs/services/dialog.service.mjs +4 -4
  62. package/esm2022/lib/file/file-input.component.mjs +4 -4
  63. package/esm2022/lib/file/file.module.mjs +4 -4
  64. package/esm2022/lib/form-validators/algorithm/luhn-algorithm.mjs +1 -1
  65. package/esm2022/lib/form-validators/core/default-container.mjs +10 -10
  66. package/esm2022/lib/form-validators/directives/base-directive.mjs +4 -4
  67. package/esm2022/lib/form-validators/directives/control-host.directive.mjs +4 -4
  68. package/esm2022/lib/form-validators/directives/html-control-template.directive.mjs +3 -3
  69. package/esm2022/lib/form-validators/directives/rx-form.directive.mjs +4 -4
  70. package/esm2022/lib/form-validators/directives/template-validations/async-validation.directive.mjs +3 -3
  71. package/esm2022/lib/form-validators/directives/template-validations/base-validator.directive.mjs +4 -4
  72. package/esm2022/lib/form-validators/directives/template-validations/control-expression-process.mjs +4 -4
  73. package/esm2022/lib/form-validators/directives/template-validations/file-control.directive.mjs +4 -4
  74. package/esm2022/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +4 -4
  75. package/esm2022/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +4 -4
  76. package/esm2022/lib/form-validators/domain/disable-provider.mjs +1 -1
  77. package/esm2022/lib/form-validators/domain/element-processor/decimal.provider.mjs +4 -4
  78. package/esm2022/lib/form-validators/domain/element-processor/mask.provider.mjs +1 -1
  79. package/esm2022/lib/form-validators/domain/form-data.mjs +1 -1
  80. package/esm2022/lib/form-validators/models/form-builder-configuration.mjs +1 -1
  81. package/esm2022/lib/form-validators/reactive-form-validators/allOf.validator.mjs +1 -1
  82. package/esm2022/lib/form-validators/reactive-form-validators/and.validator.mjs +1 -1
  83. package/esm2022/lib/form-validators/reactive-form-validators/async/base.async.validator.mjs +1 -1
  84. package/esm2022/lib/form-validators/reactive-form-validators/choice.validator.mjs +1 -1
  85. package/esm2022/lib/form-validators/reactive-form-validators/compare.validator.mjs +1 -1
  86. package/esm2022/lib/form-validators/reactive-form-validators/compose.validator.mjs +1 -1
  87. package/esm2022/lib/form-validators/reactive-form-validators/conditional-change.validator.mjs +1 -1
  88. package/esm2022/lib/form-validators/reactive-form-validators/contains.validator.mjs +1 -1
  89. package/esm2022/lib/form-validators/reactive-form-validators/credit-card.validator.mjs +1 -1
  90. package/esm2022/lib/form-validators/reactive-form-validators/cusip.validator.mjs +1 -1
  91. package/esm2022/lib/form-validators/reactive-form-validators/custom.validator.mjs +1 -1
  92. package/esm2022/lib/form-validators/reactive-form-validators/different.validator.mjs +1 -1
  93. package/esm2022/lib/form-validators/reactive-form-validators/endsWith.validator.mjs +1 -1
  94. package/esm2022/lib/form-validators/reactive-form-validators/even.validator.mjs +1 -1
  95. package/esm2022/lib/form-validators/reactive-form-validators/extension.validator.mjs +1 -1
  96. package/esm2022/lib/form-validators/reactive-form-validators/factor.validator.mjs +1 -1
  97. package/esm2022/lib/form-validators/reactive-form-validators/file.validator.mjs +1 -1
  98. package/esm2022/lib/form-validators/reactive-form-validators/fileSize.validator.mjs +1 -1
  99. package/esm2022/lib/form-validators/reactive-form-validators/grid.validator.mjs +1 -1
  100. package/esm2022/lib/form-validators/reactive-form-validators/iban.validator.mjs +1 -1
  101. package/esm2022/lib/form-validators/reactive-form-validators/image.validator.mjs +1 -1
  102. package/esm2022/lib/form-validators/reactive-form-validators/ip.validator.mjs +1 -1
  103. package/esm2022/lib/form-validators/reactive-form-validators/json.validator.mjs +1 -1
  104. package/esm2022/lib/form-validators/reactive-form-validators/latLong.validator.mjs +1 -1
  105. package/esm2022/lib/form-validators/reactive-form-validators/leapYear.validator.mjs +1 -1
  106. package/esm2022/lib/form-validators/reactive-form-validators/lowercase.validator.mjs +1 -1
  107. package/esm2022/lib/form-validators/reactive-form-validators/mask.validator.mjs +1 -1
  108. package/esm2022/lib/form-validators/reactive-form-validators/maxLength.validator.mjs +1 -1
  109. package/esm2022/lib/form-validators/reactive-form-validators/maxNumber.validator.mjs +1 -1
  110. package/esm2022/lib/form-validators/reactive-form-validators/minLength.validator.mjs +1 -1
  111. package/esm2022/lib/form-validators/reactive-form-validators/minNumber.validator.mjs +1 -1
  112. package/esm2022/lib/form-validators/reactive-form-validators/noneOf.validator.mjs +1 -1
  113. package/esm2022/lib/form-validators/reactive-form-validators/not.validator.mjs +1 -1
  114. package/esm2022/lib/form-validators/reactive-form-validators/notEmpty.validator.mjs +1 -1
  115. package/esm2022/lib/form-validators/reactive-form-validators/numeric.validator.mjs +1 -1
  116. package/esm2022/lib/form-validators/reactive-form-validators/odd.validator.mjs +1 -1
  117. package/esm2022/lib/form-validators/reactive-form-validators/oneOf.validator.mjs +1 -1
  118. package/esm2022/lib/form-validators/reactive-form-validators/or.validator.mjs +1 -1
  119. package/esm2022/lib/form-validators/reactive-form-validators/password.validator.mjs +1 -1
  120. package/esm2022/lib/form-validators/reactive-form-validators/pattern.validator.mjs +1 -1
  121. package/esm2022/lib/form-validators/reactive-form-validators/port.validator.mjs +1 -1
  122. package/esm2022/lib/form-validators/reactive-form-validators/primeNumber.validator.mjs +1 -1
  123. package/esm2022/lib/form-validators/reactive-form-validators/range.validator.mjs +1 -1
  124. package/esm2022/lib/form-validators/reactive-form-validators/required.validator.mjs +1 -1
  125. package/esm2022/lib/form-validators/reactive-form-validators/requiredTrue.validator.mjs +1 -1
  126. package/esm2022/lib/form-validators/reactive-form-validators/rule.validator.mjs +1 -1
  127. package/esm2022/lib/form-validators/reactive-form-validators/startsWith.validator.mjs +1 -1
  128. package/esm2022/lib/form-validators/reactive-form-validators/time.validator.mjs +1 -1
  129. package/esm2022/lib/form-validators/reactive-form-validators/unique.validator.mjs +1 -1
  130. package/esm2022/lib/form-validators/reactive-form-validators/uppercase.validator.mjs +1 -1
  131. package/esm2022/lib/form-validators/reactive-form-validators/url.validator.mjs +1 -1
  132. package/esm2022/lib/form-validators/services/base-form-builder.mjs +1 -1
  133. package/esm2022/lib/form-validators/services/entity.service.mjs +1 -1
  134. package/esm2022/lib/form-validators/services/form-control.mjs +1 -1
  135. package/esm2022/lib/form-validators/services/reactive-form.module.mjs +8 -8
  136. package/esm2022/lib/form-validators/services/rx-form-array.mjs +1 -1
  137. package/esm2022/lib/form-validators/services/rx-form-builder.mjs +4 -4
  138. package/esm2022/lib/form-validators/services/rx-form-group.mjs +1 -1
  139. package/esm2022/lib/form-validators/services/typed-form-builder.mjs +3 -3
  140. package/esm2022/lib/form-validators/util/app-util.mjs +1 -1
  141. package/esm2022/lib/form-validators/util/check-length.mjs +1 -1
  142. package/esm2022/lib/form-validators/util/config-provider.mjs +1 -1
  143. package/esm2022/lib/form-validators/util/date-checker.function.mjs +1 -1
  144. package/esm2022/lib/form-validators/util/date-provider.mjs +1 -1
  145. package/esm2022/lib/form-validators/util/form-provider.mjs +1 -1
  146. package/esm2022/lib/form-validators/util/instance-provider.function.mjs +1 -1
  147. package/esm2022/lib/form-validators/util/ip-checker.mjs +1 -1
  148. package/esm2022/lib/form-validators/util/linq.mjs +1 -1
  149. package/esm2022/lib/form-validators/util/object-maker.mjs +1 -1
  150. package/esm2022/lib/form-validators/util/reactive-form-config.mjs +1 -1
  151. package/esm2022/lib/form-validators/util/regex-validator.mjs +1 -1
  152. package/esm2022/lib/form-validators/util/relational-checker.function.mjs +1 -1
  153. package/esm2022/lib/form-validators/util/reset-form.mjs +1 -1
  154. package/esm2022/lib/form-validators/util/sanitizers.mjs +1 -1
  155. package/esm2022/lib/form-validators/util/time-checker.function.mjs +1 -1
  156. package/esm2022/lib/form-validators/util/validator-value-checker.mjs +1 -1
  157. package/esm2022/lib/form-validators/validators-extension/base-validator.function.mjs +1 -1
  158. package/esm2022/lib/form-validators/validators-function/alpha-validation.function.mjs +1 -1
  159. package/esm2022/lib/form-validators/validators-function/regex-validation.function.mjs +1 -1
  160. package/esm2022/lib/forms/components/datepicker/datepicker-header.component.mjs +3 -3
  161. package/esm2022/lib/forms/components/generic-form/generic-form.component.mjs +16 -16
  162. package/esm2022/lib/forms/directives/mat-form-field-editor.directive.mjs +4 -4
  163. package/esm2022/lib/forms/directives/mat-form-field-readonly.directive.mjs +4 -4
  164. package/esm2022/lib/forms/directives/nested-property-ng-model.directive.mjs +4 -4
  165. package/esm2022/lib/forms/directives/vd-generic-form-custom-field.directive.mjs +3 -3
  166. package/esm2022/lib/forms/forms.module.mjs +4 -4
  167. package/esm2022/lib/forms/functions/decorators.mjs +1 -1
  168. package/esm2022/lib/forms/functions/functions.mjs +1 -1
  169. package/esm2022/lib/forms/helpers/abstract-mat-form-field.mjs +4 -4
  170. package/esm2022/lib/forms/helpers/abstract-select-form-field.component.mjs +4 -4
  171. package/esm2022/lib/forms/helpers/value-accessor-base.mjs +3 -3
  172. package/esm2022/lib/forms/pipes/group-filter.pipe.mjs +4 -4
  173. package/esm2022/lib/forms/validators/empty-string-reset.directive.mjs +4 -4
  174. package/esm2022/lib/forms/validators/equal-validator.directive.mjs +4 -4
  175. package/esm2022/lib/forms/validators/native-element-injector.directive.mjs +4 -4
  176. package/esm2022/lib/forms/validators/unique-validator-directive.mjs +4 -4
  177. package/esm2022/lib/http/http.module.mjs +7 -11
  178. package/esm2022/lib/http/services/generic.service.mjs +1 -1
  179. package/esm2022/lib/layout/dynamic-menu/dynamic-menu.component.mjs +3 -3
  180. package/esm2022/lib/layout/layout-card-over/layout-card-over.component.mjs +3 -3
  181. package/esm2022/lib/layout/layout-compact/layout-compact.component.mjs +4 -4
  182. package/esm2022/lib/layout/layout-footer/layout-footer.component.mjs +4 -4
  183. package/esm2022/lib/layout/layout-manage-list/layout-manage-list.component.mjs +4 -4
  184. package/esm2022/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +9 -9
  185. package/esm2022/lib/layout/layout-nav/layout-nav.component.mjs +5 -5
  186. package/esm2022/lib/layout/layout-nav-list/layout-nav-list.component.mjs +4 -4
  187. package/esm2022/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +9 -9
  188. package/esm2022/lib/layout/layout-toggle.class.mjs +4 -4
  189. package/esm2022/lib/layout/layout.component.mjs +4 -4
  190. package/esm2022/lib/layout/layout.directives.mjs +9 -9
  191. package/esm2022/lib/layout/layout.module.mjs +4 -4
  192. package/esm2022/lib/layout/list-toolbar/list-toolbar.component.mjs +3 -3
  193. package/esm2022/lib/layout/navigation-drawer/navigation-drawer.component.mjs +10 -10
  194. package/esm2022/lib/list/components/list.component.mjs +3 -3
  195. package/esm2022/lib/list/directives/vd-list-option.directive.mjs +3 -3
  196. package/esm2022/lib/list/list.module.mjs +4 -4
  197. package/esm2022/lib/media/directives/media-toggle.directive.mjs +4 -4
  198. package/esm2022/lib/media/media.module.mjs +4 -4
  199. package/esm2022/lib/media/services/media.service.mjs +4 -4
  200. package/esm2022/lib/menu/components/menu.component.mjs +4 -4
  201. package/esm2022/lib/menu/menu.module.mjs +4 -4
  202. package/esm2022/lib/menu/resolvers/menu-form-includes.resolve.mjs +4 -4
  203. package/esm2022/lib/menu/resolvers/menu-item-form-includes.resolve.mjs +4 -4
  204. package/esm2022/lib/menu/resolvers/menu-list-projection.resolve.mjs +4 -4
  205. package/esm2022/lib/menu/resolvers/menu-settings.resolve.mjs +3 -3
  206. package/esm2022/lib/menu/services/menu-items.service.mjs +3 -3
  207. package/esm2022/lib/menu/services/menu.resolve.mjs +7 -7
  208. package/esm2022/lib/menu/services/menu.service.mjs +3 -3
  209. package/esm2022/lib/search/search.module.mjs +4 -4
  210. package/esm2022/lib/select/components/select.component.mjs +4 -4
  211. package/esm2022/lib/select/directives/vd-select-option.directive.mjs +3 -3
  212. package/esm2022/lib/select/directives/vd-select-trigger.directive.mjs +3 -3
  213. package/esm2022/lib/select/select.module.mjs +4 -4
  214. package/esm2022/lib/table/components/dynamic-table/dynamic-table.component.mjs +4 -4
  215. package/esm2022/lib/table/components/filter-clear.component.mjs +4 -4
  216. package/esm2022/lib/table/components/filter-date.component.mjs +4 -4
  217. package/esm2022/lib/table/components/filter-input.component.mjs +4 -4
  218. package/esm2022/lib/table/components/filter-select.component.mjs +7 -7
  219. package/esm2022/lib/table/directives/data-source-filter.directive.mjs +4 -4
  220. package/esm2022/lib/table/directives/vd-table-field.directive.mjs +3 -3
  221. package/esm2022/lib/table/functions/decorators.mjs +1 -1
  222. package/esm2022/lib/table/functions/functions.mjs +1 -1
  223. package/esm2022/lib/table/paginator-intl.mjs +4 -4
  224. package/esm2022/lib/table/table.data-source.mjs +1 -1
  225. package/esm2022/lib/table/table.module.mjs +4 -4
  226. package/esm2022/lib/table/table.static-data-source.mjs +1 -1
  227. package/fesm2022/messaia-cdk.mjs +486 -490
  228. package/fesm2022/messaia-cdk.mjs.map +1 -1
  229. package/lib/common/styles/_theme-functions.scss +0 -23
  230. package/lib/common/styles/colors/_colors-dark.scss +1350 -345
  231. package/lib/common/styles/colors/_colors-light.scss +3157 -829
  232. package/lib/common/styles/core/_button.scss +35 -29
  233. package/lib/common/styles/{_common-theme.scss → m2/_common-theme.scss} +6 -6
  234. package/lib/common/styles/m2/_theme-functions.scss +21 -0
  235. package/lib/common/styles/m3/_common-theme.scss +47 -0
  236. package/lib/common/styles/m3/_theme-functions.scss +21 -0
  237. package/lib/common/styles/platform.scss +1 -1
  238. package/lib/common/theming/_all-theme.scss +1 -1
  239. package/lib/common/theming/_m2-all-theme.scss +27 -0
  240. package/lib/http/http.module.d.ts +1 -2
  241. package/lib/layout/{_layout-theme.scss → _m2-layout-theme.scss} +11 -10
  242. package/package.json +3 -3
@@ -1019,10 +1019,10 @@ export class RxFormBuilder extends BaseFormBuilder {
1019
1019
  }
1020
1020
  });
1021
1021
  }
1022
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: RxFormBuilder, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
1023
- /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: RxFormBuilder });
1022
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: RxFormBuilder, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
1023
+ /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: RxFormBuilder });
1024
1024
  }
1025
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: RxFormBuilder, decorators: [{
1025
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: RxFormBuilder, decorators: [{
1026
1026
  type: Injectable
1027
1027
  }] });
1028
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvZm9ybS12YWxpZGF0b3JzL3NlcnZpY2VzL3J4LWZvcm0tYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBNEMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkksT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZKLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBT3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFD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RCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUU7WUFDMUMsbUJBQW1CO1lBQ25CLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUM7WUFDN0UsbUJBQW1CO1lBQ25CLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNQLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ1YsZ0NBQWdDO2dCQUNoQyxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7b0JBQ2YseUNBQXlDO29CQUN6QyxJQUFJLFVBQVUsRUFBRTt3QkFDWixVQUFVLENBQUMsR0FBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQ3pDO29CQUNELHdEQUF3RDtvQkFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDckQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzVDO2lCQUNKO2dCQUNELDBCQUEwQjtnQkFDMUIsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNqQixDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQzswSEFwcENRLGFBQWE7OEhBQWIsYUFBYTs7MkZBQWIsYUFBYTtrQkFEekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2xPcHRpb25zLCBBc3luY1ZhbGlkYXRvckZuLCBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuaW1wb3J0IHsgQVJSQVlfUFJPUEVSVFksIEJPT0xFQU4sIEZVTkNUSU9OX1NUUklORywgTU9ERUwsIE5VTUJFUiwgT0JKRUNUX1BST1BFUlRZLCBPQkpFQ1RfU1RSSU5HLCBQUk9QRVJUWSwgUlhfV0VCX1ZBTElEQVRPUiwgU1RSSU5HIH0gZnJvbSBcIi4uL2NvbnN0XCI7XHJcbmltcG9ydCB7IEFQUF9WQUxJREFUT1JTIH0gZnJvbSAnLi4vY29uc3QvYXBwLXZhbGlkYXRvcnMuY29uc3QnO1xyXG5pbXBvcnQgeyBBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiLi4vY29yZS9hbm5vdGF0aW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRDb250YWluZXIgfSBmcm9tICcuLi9jb3JlL2RlZmF1bHQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xyXG5pbXBvcnQgeyBEZWNvcmF0b3JDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9kZWNvcmF0b3ItY29uZmlndXJhdGlvblwiO1xyXG5pbXBvcnQgeyBJbnN0YW5jZUNvbnRhaW5lciB9IGZyb20gXCIuLi9tb2RlbHMvaW5zdGFuY2UtY29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElBYnN0cmFjdENvbnRyb2wgfSBmcm9tIFwiLi4vbW9kZWxzL2ludGVyZmFjZS9pLWFic3RyYWN0LWNvbnRyb2xcIjtcclxuaW1wb3J0IHsgQXBwRm9ybUdyb3VwIH0gZnJvbSAnLi4vbW9kZWxzL2ludGVyZmFjZS9pLWZvcm0tZ3JvdXAnO1xyXG5pbXBvcnQgeyBQcm9wVmFsaWRhdGlvbkNvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvcHJvcC12YWxpZGF0aW9uLWNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eUluZm8gfSBmcm9tIFwiLi4vbW9kZWxzL3Byb3BlcnR5LWluZm9cIjtcclxuaW1wb3J0IHsgYW5kVmFsaWRhdG9yIH0gZnJvbSAnLi4vcmVhY3RpdmUtZm9ybS12YWxpZGF0b3JzL2FuZC52YWxpZGF0b3InO1xyXG5pbXBvcnQgeyBjb25kaXRpb25hbENoYW5nZVZhbGlkYXRvciB9IGZyb20gXCIuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvY29uZGl0aW9uYWwtY2hhbmdlLnZhbGlkYXRvclwiO1xyXG5pbXBvcnQgeyBub3RWYWxpZGF0b3IgfSBmcm9tICcuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvbm90LnZhbGlkYXRvcic7XHJcbmltcG9ydCB7IG9yVmFsaWRhdG9yIH0gZnJvbSAnLi4vcmVhY3RpdmUtZm9ybS12YWxpZGF0b3JzL29yLnZhbGlkYXRvcic7XHJcbmltcG9ydCB7IFR5cGUgfSBmcm9tIFwiLi4vdXRpbFwiO1xyXG5pbXBvcnQgeyBMaW5xIH0gZnJvbSAnLi4vdXRpbC9saW5xJztcclxuaW1wb3J0IHsgUmVhY3RpdmVGb3JtQ29uZmlnIH0gZnJvbSAnLi4vdXRpbC9yZWFjdGl2ZS1mb3JtLWNvbmZpZyc7XHJcbmltcG9ydCB7IFJlZ2V4VmFsaWRhdG9yIH0gZnJvbSBcIi4uL3V0aWwvcmVnZXgtdmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7IEJhc2VGb3JtQnVpbGRlciB9IGZyb20gJy4vYmFzZS1mb3JtLWJ1aWxkZXInO1xyXG5pbXBvcnQgeyBSeEZvcm1Db250cm9sIH0gZnJvbSAnLi9mb3JtLWNvbnRyb2wnO1xyXG5pbXBvcnQgeyBSeEZvcm1BcnJheSB9IGZyb20gJy4vcngtZm9ybS1hcnJheSc7XHJcbmltcG9ydCB7IFJ4Rm9ybUdyb3VwIH0gZnJvbSAnLi9yeC1mb3JtLWdyb3VwJztcclxuXHJcbmNvbnN0IExPR0lDQUxfVkFMSURBVE9SUzogeyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9ID0geyBhbmQ6IGFuZFZhbGlkYXRvciwgb3I6IG9yVmFsaWRhdG9yLCBub3Q6IG5vdFZhbGlkYXRvciB9XHJcbmNvbnN0IEFTWU5DOiBzdHJpbmcgPSBcImFzeW5jXCJcclxuY29uc3QgRU5USVRZX09CSkVDVDogc3RyaW5nID0gXCJlbnRpdHlPYmplY3RcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFJ4Rm9ybUJ1aWxkZXIgZXh0ZW5kcyBCYXNlRm9ybUJ1aWxkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBBcnJheSB0byBzdG9yZSBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbmRpdGlvbmFsT2JqZWN0UHJvcHM6IGFueVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBPYmplY3QgdG8gc3RvcmUgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBpbnN0YW5jZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZTogYW55ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBBcnJheSB0byBzdG9yZSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gY29uZGl0aW9uYWwgb2JqZWN0IHByb3BlcnRpZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBidWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHM6IGFueVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBPYmplY3QgdG8gc3RvcmUgZm9ybSBncm91cCBwcm9wZXJ0aWVzIG90aGVyIHZhbGlkYXRvcnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3I6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IE9iamVjdCB0byBzdG9yZSBjdXJyZW50IGZvcm0gZ3JvdXAgcHJvcGVydGllcyBvdGhlciB2YWxpZGF0b3JzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBmaWVsZDogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgZm9ybSBpcyBuZXN0ZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBmaWVsZDogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgZm9ybSBncm91cCBpcyBjYWxsZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc0dyb3VwQ2FsbGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBmb3JtIGlzIG5lc3RlZCBiaW5kaW5nXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaXNOZXN0ZWRCaW5kaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIG1ldGhvZDogR2V0cyB0aGUgaW5zdGFuY2UgY29udGFpbmVyIGJhc2VkIG9uIHRoZSBpbnN0YW5jZSBmdW5jdGlvbiBhbmQgZW50aXR5IG9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlRnVuYyBUaGUgZnVuY3Rpb24gdG8gcHJvdmlkZSBhbiBpbnN0YW5jZSBmcm9tLlxyXG4gICAgICogQHBhcmFtIGVudGl0eU9iamVjdCBUaGUgZW50aXR5IG9iamVjdCB0byB1c2UuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEluc3RhbmNlQ29udGFpbmVyKGluc3RhbmNlRnVuYzogYW55LCBlbnRpdHlPYmplY3Q6IGFueSk6IEluc3RhbmNlQ29udGFpbmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YWNlUHJvdmlkZXIoaW5zdGFuY2VGdW5jLCBlbnRpdHlPYmplY3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBtZXRob2Q6IEV4dHJhY3RzIGV4cHJlc3Npb25zIGZyb20gdGhlIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uIGZvciBkeW5hbWljIHZhbGlkYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGJ1aWxkZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyBleHRyYWN0ZWQgZXhwcmVzc2lvbnMgb3IgbnVsbC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBleHRyYWN0RXhwcmVzc2lvbnMoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gfCBudWxsIHtcclxuICAgICAgICAvKiBcclxuICAgICAgICAgKiBFeHRyYWN0cyBleHByZXNzaW9ucyBmcm9tIHRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBmb3IgZHluYW1pYyB2YWxpZGF0aW9uLlxyXG4gICAgICAgICAqIElmIGR5bmFtaWMgdmFsaWRhdGlvbiBpcyBjb25maWd1cmVkIGluIHRoZSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIHByb3BlcnR5IGFuZCBkZWNvcmF0b3IuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBkZWNvcmF0b3IgaW4gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uW3Byb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrcyBpZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZXhpc3RzIGZvciB0aGUgY3VycmVudCBkZWNvcmF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbiBhcyBhbnkpW3Byb3BlcnR5XVtkZWNvcmF0b3JdLmNvbmRpdGlvbmFsRXhwcmVzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IGNvbHVtbnMgZnJvbSB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sdW1ucyA9IExpbnEuZXhwcmVzc2lvbkNvbHVtbnMoKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbiBhcyBhbnkpW3Byb3BlcnR5XVtkZWNvcmF0b3JdLmNvbmRpdGlvbmFsRXhwcmVzc2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgY2hhbmdlIHZhbGlkYXRpb24gYmFzZWQgb24gdGhlIGV4dHJhY3RlZCBjb2x1bW4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnRhaW5lci5hZGRDaGFuZ2VWYWxpZGF0aW9uKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UsIHByb3BlcnR5LCBjb2x1bW5zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEFkZHMgYXN5bmMgdmFsaWRhdGlvbiB0byB0aGUgcHJvcGVydHkgYmFzZWQgb24gcHJvdmlkZWQgdmFsaWRhdG9ycyBhbmQgY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBpbmZvcm1hdGlvbi5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eVZhbGlkYXRvcnMgVGhlIGFycmF5IG9mIGRlY29yYXRvciBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHByb3BWYWxpZGF0aW9uQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSB2YWxpZGF0aW9uLlxyXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXN5bmMgdmFsaWRhdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGRBc3luY1ZhbGlkYXRpb24ocHJvcGVydHk6IFByb3BlcnR5SW5mbywgcHJvcGVydHlWYWxpZGF0b3JzOiBEZWNvcmF0b3JDb25maWd1cmF0aW9uW10sIHByb3BWYWxpZGF0aW9uQ29uZmlnOiBQcm9wVmFsaWRhdGlvbkNvbmZpZykge1xyXG4gICAgICAgIC8qIENvbGxlY3RzIGFzeW5jIHZhbGlkYXRvcnMgZnJvbSBwcm9wZXJ0eSB2YWxpZGF0b3JzIGFuZCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBsZXQgYXN5bmNWYWxpZGF0b3JzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHByb3BlcnR5IHZhbGlkYXRvcnMgKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcGVydHlWYWxpZGF0b3Igb2YgcHJvcGVydHlWYWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmFsaWRhdG9yIGlzIGFzeW5jICovXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0b3IuaXNBc3luYykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIFB1c2ggZWFjaCBhc3luYyB2YWxpZGF0b3IgaW50byB0aGUgYXN5bmNWYWxpZGF0b3JzIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0b3IuY29uZmlnLmZvckVhY2goKHQ6IGFueSkgPT4geyBhc3luY1ZhbGlkYXRvcnMucHVzaCh0KSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb3BWYWxpZGF0aW9uQ29uZmlnICYmIChwcm9wVmFsaWRhdGlvbkNvbmZpZyBhcyBhbnkpW0FTWU5DXSkge1xyXG4gICAgICAgICAgICAvKiBBZGQgYXN5bmMgdmFsaWRhdG9ycyBmcm9tIHByb3BWYWxpZGF0aW9uQ29uZmlnICovXHJcbiAgICAgICAgICAgIChwcm9wVmFsaWRhdGlvbkNvbmZpZyBhcyBhbnkpW0FTWU5DXS5mb3JFYWNoKCh0OiBhbnkpID0+IHsgYXN5bmNWYWxpZGF0b3JzLnB1c2godCkgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhc3luY1ZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQWRkcyBmb3JtIGNvbnRyb2wgdmFsaWRhdG9ycyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWxpZGF0b3JzIGFuZCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlWYWxpZGF0b3JzIFRoZSBhcnJheSBvZiBkZWNvcmF0b3IgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSBwcm9wVmFsaWRhdGlvbkNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgdmFsaWRhdGlvbi5cclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IG9iamVjdC5cclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGZvcm0gY29udHJvbCB2YWxpZGF0b3JzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkZEZvcm1Db250cm9sKHByb3BlcnR5OiBQcm9wZXJ0eUluZm8sIHByb3BlcnR5VmFsaWRhdG9yczogRGVjb3JhdG9yQ29uZmlndXJhdGlvbltdLCBwcm9wVmFsaWRhdGlvbkNvbmZpZzogUHJvcFZhbGlkYXRpb25Db25maWcsIGluc3RhbmNlOiBJbnN0YW5jZUNvbnRhaW5lciwgZW50aXR5OiBhbnkpIHtcclxuICAgICAgICBsZXQgdmFsaWRhdG9ycyA9IFtdO1xyXG4gICAgICAgIGxldCBjb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbmFsIHZhbGlkYXRpb24gcHJvcHMgYXJlIGRlZmluZWQgZWl0aGVyIGluIGluc3RhbmNlIG9yIGNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlICovXHJcbiAgICAgICAgaWYgKChpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyAmJiBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXSkgfHwgKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgJiYgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXSkpIHtcclxuICAgICAgICAgICAgLyogQ29sbGVjdHMgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzIGZyb20gaW5zdGFuY2UgYW5kIGNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlIGFuZCBhZGRzIGNvbmRpdGlvbmFsIGNoYW5nZSB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgbGV0IHByb3BzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgYXJlIGRlZmluZWQgaW4gaW5zdGFuY2UgZm9yIHRoZSBwcm9wZXJ0eSAqL1xyXG4gICAgICAgICAgICBpZiAoKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHkubmFtZV0uZm9yRWFjaCh0ID0+IHByb3BzLnB1c2godCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiBjb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcmUgZGVmaW5lZCBpbiBjb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzICYmIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHkubmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHkubmFtZV0uZm9yRWFjaCgodDogYW55KSA9PiBwcm9wcy5wdXNoKHQpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQWRkIGNvbmRpdGlvbmFsIGNoYW5nZSB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKGNvbmRpdGlvbmFsQ2hhbmdlVmFsaWRhdG9yKHByb3BzKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVjayBpZiBjb25kaXRpb25hbE9iamVjdFByb3BzIG9yIGJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyBhcmUgZGVmaW5lZCAqL1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMubGVuZ3RoID4gMCB8fCB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9wQ29uZGl0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgY29uZGl0aW9uYWxPYmplY3RQcm9wcyBpcyBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb25kaXRpb25hbE9iamVjdFByb3BzIGZvciBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IG5hbWUgKi9cclxuICAgICAgICAgICAgICAgIHByb3BDb25kaXRpb25zID0gdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcih0ID0+IHQucHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIGJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyBpcyBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgLyogRmlsdGVyIGJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyBmb3IgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgY3VycmVudCBwcm9wZXJ0eSBuYW1lICovXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcy5maWx0ZXIodCA9PiB0LnByb3BOYW1lID09IHByb3BlcnR5Lm5hbWUpLmZvckVhY2godCA9PiBwcm9wQ29uZGl0aW9ucy5wdXNoKHQpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHJvcENvbmRpdGlvbnMuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIEFkZCByZWZlcmVuY2UgcHJvcGVydHkgbmFtZSB0byBjb2x1bW5zIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICBpZiAodC5yZWZlcmVuY2VQcm9wTmFtZSAmJiBjb2x1bW5zLmluZGV4T2YodC5yZWZlcmVuY2VQcm9wTmFtZSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2godC5yZWZlcmVuY2VQcm9wTmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLyogQWRkIGNvbmRpdGlvbmFsIGNoYW5nZSB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKGNvbmRpdGlvbmFsQ2hhbmdlVmFsaWRhdG9yKGNvbHVtbnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHByb3BlcnR5IHZhbGlkYXRvcnMgKi9cclxuICAgICAgICBmb3IgKGxldCBwcm9wZXJ0eVZhbGlkYXRvciBvZiBwcm9wZXJ0eVZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbGlkYXRvci5pc0FzeW5jKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQWRkIHJ1bGUgdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMucnVsZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEFQUF9WQUxJREFUT1JTW3Byb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlXShwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcsIGVudGl0eSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLyogQWRkIGxvZ2ljYWwgdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMuYW5kOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGVzLm9yOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGVzLm5vdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKExPR0lDQUxfVkFMSURBVE9SU1twcm9wZXJ0eVZhbGlkYXRvci5hbm5vdGF0aW9uVHlwZV0ocHJvcGVydHlWYWxpZGF0b3IuY29uZmlnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBBZGQgY3VzdG9tIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChBUFBfVkFMSURBVE9SU1twcm9wZXJ0eVZhbGlkYXRvci5hbm5vdGF0aW9uVHlwZV0ocHJvcGVydHlWYWxpZGF0b3IuY29uZmlnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZnJvbSBwcm9wVmFsaWRhdGlvbkNvbmZpZyAqL1xyXG4gICAgICAgIGlmIChwcm9wVmFsaWRhdGlvbkNvbmZpZykge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxWYWxpZGF0aW9uKHZhbGlkYXRvcnMsIHByb3BWYWxpZGF0aW9uQ29uZmlnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmcm9tIGN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXS5mb3JFYWNoKCh0OiBhbnkpID0+IHsgdmFsaWRhdG9ycy5wdXNoKHQpOyB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEFkZHMgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHRvIHRoZSB2YWxpZGF0aW9ucyBhcnJheSBiYXNlZCBvbiBwcm9wVmFsaWRhdGlvbkNvbmZpZy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRpb25zIEFuIGFycmF5IG9mIGV4aXN0aW5nIHZhbGlkYXRpb25zLlxyXG4gICAgICogQHBhcmFtIHByb3BWYWxpZGF0aW9uQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSB2YWxpZGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkZGl0aW9uYWxWYWxpZGF0aW9uKHZhbGlkYXRpb25zOiBhbnlbXSwgcHJvcFZhbGlkYXRpb25Db25maWc6IFByb3BWYWxpZGF0aW9uQ29uZmlnIHwgYW55KSB7XHJcbiAgICAgICAgZm9yICh2YXIgY29sIGluIEFubm90YXRpb25UeXBlcykge1xyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgY3VycmVudCBhbm5vdGF0aW9uIHR5cGUgZXhpc3RzIGFuZCBpdCdzIG5vdCBhIGN1c3RvbSB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgaWYgKHByb3BWYWxpZGF0aW9uQ29uZmlnW0Fubm90YXRpb25UeXBlc1tjb2xdXSAmJiBjb2wgIT0gXCJjdXN0b21cIikge1xyXG4gICAgICAgICAgICAgICAgLyogQWRkIHZhbGlkYXRvciBmcm9tIEFQUF9WQUxJREFUT1JTICovXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKEFQUF9WQUxJREFUT1JTW0Fubm90YXRpb25UeXBlc1tjb2xdXShwcm9wVmFsaWRhdGlvbkNvbmZpZ1tBbm5vdGF0aW9uVHlwZXNbY29sXV0pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgYW5ub3RhdGlvbiB0eXBlIGlzIGN1c3RvbSBhbmQgdGhlIGN1c3RvbSB2YWxpZGF0b3IgZXhpc3RzIGluIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICAgICAgZWxzZSBpZiAoY29sID09IEFubm90YXRpb25UeXBlcy5jdXN0b20gJiYgcHJvcFZhbGlkYXRpb25Db25maWdbQW5ub3RhdGlvblR5cGVzW2NvbF1dKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBBZGQgY3VzdG9tIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbnMucHVzaChwcm9wVmFsaWRhdGlvbkNvbmZpZ1tjb2xdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgZW50aXR5IHR5cGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9iamVjdCBhbmQgcHJvcGVydHkgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBmb3Igd2hpY2ggdGhlIGVudGl0eSB0eXBlIGlzIHJldHJpZXZlZC5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGJ1aWxkZXIuXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSBpc1NhbWVPYmplY3RDb25zdHJ1Y3RvciBJbmRpY2F0ZXMgaWYgdGhlIGVudGl0eSB0eXBlIGlzIHRoZSBzYW1lIGFzIHRoZSBvYmplY3QncyBjb25zdHJ1Y3Rvci5cclxuICAgICAqIEByZXR1cm5zIFRoZSBlbnRpdHkgdHlwZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRFbnRpdHk8VD4ob2JqZWN0OiBULCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb246IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIGlzU2FtZU9iamVjdENvbnN0cnVjdG9yOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgZW50aXR5IHR5cGUgaXMgZGVmaW5lZCBpbiB0aGUgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5nZW5lcmljRW50aXRpZXMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmdlbmVyaWNFbnRpdGllc1twcm9wZXJ0eU5hbWVdKSB7XHJcbiAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZW50aXR5IHR5cGUgZnJvbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gaWYgYXZhaWxhYmxlICovXHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZ2VuZXJpY0VudGl0aWVzW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBSZXR1cm4gdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yIGlmIGlzU2FtZU9iamVjdENvbnN0cnVjdG9yIGlzIHRydWUgKi9cclxuICAgICAgICByZXR1cm4gaXNTYW1lT2JqZWN0Q29uc3RydWN0b3IgPyBvYmplY3QhLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgb2JqZWN0IHByb3BlcnR5IGluc3RhbmNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBvYmplY3QgYW5kIHByb3BlcnR5IGluZm9ybWF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGJ1aWxkZXIuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgY29uc3RydWN0b3Igb2YgdGhlIG9iamVjdCBwcm9wZXJ0eSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYmplY3RQcm9wZXJ0eUluc3RhbmNlKG9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgcHJvcGVydHlJbmZvOiBQcm9wZXJ0eUluZm8sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHByb3BlcnR5IHR5cGUgaXMgT0JKRUNUX1BST1BFUlRZIGFuZCB0aGUgcHJvcGVydHkgZXhpc3RzIGluIHRoZSBvYmplY3QgKi9cclxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnByb3BlcnR5VHlwZSA9PSBPQkpFQ1RfUFJPUEVSVFkgJiYgb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXSkge1xyXG4gICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBvYmplY3QgcHJvcGVydHkgaWYgaXQgZXhpc3RzICovXHJcbiAgICAgICAgICAgIHJldHVybiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHByb3BlcnR5IHR5cGUgaXMgQVJSQVlfUFJPUEVSVFkgYW5kIHRoZSBwcm9wZXJ0eSBleGlzdHMgYW5kIGNvbnRhaW5zIGl0ZW1zIGluIHRoZSBvYmplY3QgKi9cclxuICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eUluZm8ucHJvcGVydHlUeXBlID09IEFSUkFZX1BST1BFUlRZICYmIG9iamVjdFtwcm9wZXJ0eUluZm8ubmFtZV0gJiYgb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8qIFJldHVybiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5IHByb3BlcnR5IGlmIGl0IGV4aXN0cyAqL1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXVswXS5jb25zdHJ1Y3RvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHVybiB0aGUgZW50aXR5IHR5cGUgYmFzZWQgb24gdGhlIG9iamVjdCBhbmQgcHJvcGVydHkgaW5mb3JtYXRpb24gKi9cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbnRpdHkob2JqZWN0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIHByb3BlcnR5SW5mby5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBmb3IgYWRkaXRpb25hbCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25zIGZvciBvYmplY3QgcHJvcGVydGllcyBpbiB0aGUgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2VDb250YWluZXIgVGhlIGNvbnRhaW5lciBmb3IgdGhlIGluc3RhbmNlLlxyXG4gICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGNoZWNrIGZvciBhZGRpdGlvbmFsIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZm9ybSBidWlsZGVyLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNoZWNrT2JqZWN0UHJvcEFkZGl0aW9uYWxWYWxpZGF0aW9uPFQ+KGluc3RhbmNlQ29udGFpbmVyOiBJbnN0YW5jZUNvbnRhaW5lciwgb2JqZWN0OiBULCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb246IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIC8qIEZpbHRlciBwcm9wZXJ0aWVzIG9mIHR5cGUgT0JKRUNUX1BST1BFUlRZIG9yIEFSUkFZX1BST1BFUlRZICovXHJcbiAgICAgICAgdmFyIHByb3BzID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydGllcz8uZmlsdGVyKHQgPT4gdC5wcm9wZXJ0eVR5cGUgPT0gT0JKRUNUX1BST1BFUlRZIHx8IHQucHJvcGVydHlUeXBlID09IEFSUkFZX1BST1BFUlRZKTtcclxuXHJcbiAgICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBmaWx0ZXJlZCBwcm9wZXJ0aWVzICovXHJcbiAgICAgICAgcHJvcHM/LmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICAgIGxldCBlbnRpdHkgPSB0LmVudGl0eTtcclxuXHJcbiAgICAgICAgICAgIC8qIElmIGVudGl0eSB0eXBlIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBwcm9wZXJ0eSwgcmV0cmlldmUgaXQgZnJvbSB0aGUgb2JqZWN0ICovXHJcbiAgICAgICAgICAgIGlmICghdC5lbnRpdHkpXHJcbiAgICAgICAgICAgICAgICBlbnRpdHkgPSB0aGlzLmdldE9iamVjdFByb3BlcnR5SW5zdGFuY2Uob2JqZWN0ISwgdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRpdHkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMuZ2V0SW5zdGFuY2VDb250YWluZXIoZW50aXR5LCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBpbnN0YW5jZSBleGlzdHMgYW5kIGhhcyBjb25kaXRpb25hbCB2YWxpZGF0aW9uIHByb3BlcnRpZXMgKi9cclxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnRpZXM/LmZpbHRlcih0ID0+IHQubmFtZSA9PSBrZXkpWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzIGluIGluc3RhbmNlIGNvbnRhaW5lciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIGNvbmRpdGlvbmFsIHZhbGlkYXRpb24gcHJvcGVydGllcyAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNba2V5XS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnByb3BlcnR5VHlwZSAhPSBBUlJBWV9QUk9QRVJUWSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgYXMgYW55KVtrZXldLnB1c2goW3QubmFtZSwgeF0uam9pbignLicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgYXMgYW55KVtrZXldLnB1c2goW3QubmFtZSwgeF0uam9pbignW10nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdHMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgbW9kZWwsIGVudGl0eU9iamVjdCwgYW5kIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0byBiZSB1c2VkIGZvciBvYmplY3QgY29uc3RydWN0aW9uLlxyXG4gICAgICogQHBhcmFtIGVudGl0eU9iamVjdCBUaGUgZW50aXR5IG9iamVjdCB0byBiZSB1c2VkLlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIG1vZGVsLCBlbnRpdHlPYmplY3QsIGFuZCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0T2JqZWN0KG1vZGVsOiBhbnkgfCB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBlbnRpdHlPYmplY3Q/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24/OiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcclxuICAgICAgICAvKiBJbml0aWFsaXplcyBhbiBlbXB0eSBvYmplY3QgdG8gc3RvcmUgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gKi9cclxuICAgICAgICBsZXQganNvbjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAgICAgICAvKiBDaGVja3MgaWYgdGhlIG1vZGVsIGlzIGEgZnVuY3Rpb24gKi9cclxuICAgICAgICBpZiAodHlwZW9mIG1vZGVsID09IEZVTkNUSU9OX1NUUklORykge1xyXG4gICAgICAgICAgICBqc29uLm1vZGVsID0gbW9kZWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVja3MgaWYgdGhlIG1vZGVsIGlzIGEgZnVuY3Rpb24gYW5kIGVudGl0eU9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBpZiAodHlwZW9mIG1vZGVsID09IEZVTkNUSU9OX1NUUklORyAmJiAoZW50aXR5T2JqZWN0IGluc3RhbmNlb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSkge1xyXG4gICAgICAgICAgICAvKiBDcmVhdGVzIHRoZSBlbnRpdHkgb2JqZWN0IHVzaW5nIGNyZWF0ZUNsYXNzT2JqZWN0IG1ldGhvZCAqL1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IHRoaXMuY3JlYXRlQ2xhc3NPYmplY3QoanNvbi5tb2RlbCwgZW50aXR5T2JqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiBlbnRpdHlPYmplY3QgZXhpc3RzIGFuZCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdCAmJiAhKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikpIHtcclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3QgPSBlbnRpdHlPYmplY3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVja3MgaWYgZW50aXR5T2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBhbmQgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGlzIG5vdCBwcm92aWRlZCAqL1xyXG4gICAgICAgIGlmIChlbnRpdHlPYmplY3QgaW5zdGFuY2VvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gJiYgIWZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgICAgICBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiA9IGVudGl0eU9iamVjdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyogQ2hlY2tzIGlmIGVudGl0eU9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGFuZCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gaXMgcHJvdmlkZWQgKi9cclxuICAgICAgICBlbHNlIGlmICghKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIC8qIFNldHMgdGhlIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBpbiB0aGUgSlNPTiAqL1xyXG4gICAgICAgICAgICBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjtcclxuICAgICAgICAgICAgLyogQ3JlYXRlcyB0aGUgZW50aXR5IG9iamVjdCB1c2luZyBjcmVhdGVDbGFzc09iamVjdCBtZXRob2QgKi9cclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3QgPSB0aGlzLmNyZWF0ZUNsYXNzT2JqZWN0KGpzb24ubW9kZWwsIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBqc29uLmVudGl0eU9iamVjdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBJZiBlbnRpdHlPYmplY3QgZG9lcyBub3QgZXhpc3QgKi9cclxuICAgICAgICBpZiAoIWVudGl0eU9iamVjdCkge1xyXG4gICAgICAgICAgICAvKiBDaGVja3MgaWYgdGhlIG1vZGVsIGlzIGFuIG9iamVjdCAqL1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsID09IE9CSkVDVF9TVFJJTkcpIHtcclxuICAgICAgICAgICAgICAgIC8qIFN0b3JlcyB0aGUgY29uc3RydWN0b3Igb2YgdGhlIG1vZGVsICovXHJcbiAgICAgICAgICAgICAgICBqc29uLm1vZGVsID0gbW9kZWwuY29uc3RydWN0b3I7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIENyZWF0ZXMgdGhlIGVudGl0eSBvYmplY3QgdXNpbmcgY3JlYXRlQ2xhc3NPYmplY3QgbWV0aG9kICovXHJcbiAgICAgICAgICAgIGpzb24uZW50aXR5T2JqZWN0ID0gdGhpcy5jcmVhdGVDbGFzc09iamVjdChqc29uLm1vZGVsLCBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgbW9kZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKiBJZiBlbnRpdHlPYmplY3QgZXhpc3RzIGFuZCBpcyBhbiBpbnN0YW5jZSBvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gYW5kIG1vZGVsIGlzIGFuIG9iamVjdCAqL1xyXG4gICAgICAgIGVsc2UgaWYgKG1vZGVsICYmIChlbnRpdHlPYmplY3QgaW5zdGFuY2VvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pICYmICh0eXBlb2YgbW9kZWwgPT0gT0JKRUNUX1NUUklORykpIHtcclxuICAgICAgICAgICAgLyogU3RvcmVzIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbW9kZWwgKi9cclxuICAgICAgICAgICAganNvbltNT0RFTF0gPSBtb2RlbC5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAgLyogQ3JlYXRlcyB0aGUgZW50aXR5IG9iamVjdCB1c2luZyBjcmVhdGVDbGFzc09iamVjdCBtZXRob2QgKi9cclxuICAgICAgICAgICAganNvbltFTlRJVFlfT0JKRUNUXSA9IHRoaXMuY3JlYXRlQ2xhc3NPYmplY3QoanNvbi5tb2RlbCwganNvbi5mb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIG1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHVybnMgdGhlIGNvbnN0cnVjdGVkIEpTT04gb2JqZWN0ICovXHJcbiAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgZm9ybSBjb250cm9sIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgdmFsaWRhdG9ycy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhlIGZvcm0gY29udHJvbC5cclxuICAgICAqIEBwYXJhbSB2YWxpZGF0b3JzIEFuIGFycmF5IG9mIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMuXHJcbiAgICAgKiBAcGFyYW0gYXN5bmNWYWxpZGF0b3JzIEFuIGFycmF5IG9mIGFzeW5jaHJvbm91cyB2YWxpZGF0b3JzLlxyXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgSUFic3RyYWN0Q29udHJvbC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnRyb2wodmFsdWU/OiBhbnksIHZhbGlkYXRvcnM/OiBWYWxpZGF0b3JGbltdLCBhc3luY1ZhbGlkYXRvcnM/OiBBc3luY1ZhbGlkYXRvckZuW10pOiBJQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJ4Rm9ybUNvbnRyb2wodmFsdWUsIHsgdmFsaWRhdG9yczogdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzOiBhc3luY1ZhbGlkYXRvcnMgfSwge30sIHt9LCAnJywgW10pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGZvcm0gYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhbmQgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB2YWx1ZXMgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBpbml0aWFsaXplIHRoZSBmb3JtIGFycmF5LlxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgdmFsaWRhdG9ycy5cclxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIEZvcm1BcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5KHZhbHVlczogW3sgW2tleTogc3RyaW5nXTogYW55IH1dLCB2YWxpZGF0b3JDb25maWc/OiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAvKiBDcmVhdGVzIGEgRm9ybUdyb3VwIGluc3RhbmNlIHdpdGggYSBzaW5nbGUgY29udHJvbCBuYW1lZCBcInRlbXBcIiBhbmQgYXNzaWducyBpdCB0byBmb3JtQXJyYXkgKi9cclxuICAgICAgICBsZXQgZm9ybUFycmF5ID0gdGhpcy5ncm91cCh7IHRlbXA6IHZhbHVlcyB9LCB2YWxpZGF0b3JDb25maWcpLmdldChcInRlbXBcIikgYXMgRm9ybUFycmF5O1xyXG5cclxuICAgICAgICAvKiBJbnN0YW50aWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEZvcm1CdWlsZGVyICovXHJcbiAgICAgICAgdmFyIGZvcm1CdWlsZGVyID0gbmV3IEZvcm1CdWlsZGVyKCk7XHJcblxyXG4gICAgICAgIC8qIENyZWF0ZXMgYSBGb3JtQXJyYXkgaW5zdGFuY2UgdXNpbmcgdGhlIGNvbnRyb2xzIG9mIHRoZSBGb3JtR3JvdXAgKi9cclxuICAgICAgICByZXR1cm4gZm9ybUJ1aWxkZXIuYXJyYXkoZm9ybUFycmF5LmNvbnRyb2xzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBmb3JtIGdyb3VwIHdpdGggdGhlIHNwZWNpZmllZCBncm91cCBvYmplY3QgYW5kIHZhbGlkYXRvciBjb25maWd1cmF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBPYmplY3QgQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ3JvdXAuXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciB2YWxpZGF0b3JzLlxyXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgRm9ybUdyb3VwLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JvdXAoZ3JvdXBPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIHZhbGlkYXRvckNvbmZpZz86IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IEZvcm1Hcm91cCB7XHJcbiAgICAgICAgLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBtb2RlbCAqL1xyXG4gICAgICAgIGxldCBtb2RlbEluc3RhbmNlID0gc3VwZXIuY3JlYXRlSW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgLyogSW5pdGlhbGl6ZSBhbiBlbXB0eSBvYmplY3QgZm9yIHRoZSBlbnRpdHkgKi9cclxuICAgICAgICBsZXQgZW50aXR5T2JqZWN0ID0ge307XHJcblxyXG4gICAgICAgIC8qIEluaXRpYWxpemUgYW4gZW1wdHkgb2JqZWN0IGZvciBmb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHt9O1xyXG5cclxuICAgICAgICAvKiBTZXQgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciB0byBmb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcjtcclxuXHJcbiAgICAgICAgLyogQ3JlYXRlIHRoZSB2YWxpZGF0b3IgZm9ybSBncm91cCAqL1xyXG4gICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yRm9ybUdyb3VwKGdyb3VwT2JqZWN0LCBlbnRpdHlPYmplY3QsIG1vZGVsSW5zdGFuY2UsIHZhbGlkYXRvckNvbmZpZyEpO1xyXG5cclxuICAgICAgICAvKiBTZXQgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciBiYWNrIHRvIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yO1xyXG5cclxuICAgICAgICAvKiBGbGFnIHRoYXQgYSBncm91cCBpcyBiZWluZyBjYWxsZWQgKi9cclxuICAgICAgICB0aGlzLmlzR3JvdXBDYWxsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKiBDcmVhdGUgdGhlIGZvcm0gZ3JvdXAgKi9cclxuICAgICAgICBsZXQgZm9ybUdyb3VwID0gdGhpcy5mb3JtR3JvdXAobW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3RvciwgZW50aXR5T2JqZWN0LCB2YWxpZGF0b3JDb25maWcpO1xyXG5cclxuICAgICAgICAvKiBSZXNldCBpc0dyb3VwQ2FsbGVkIGZsYWcgKi9cclxuICAgICAgICB0aGlzLmlzR3JvdXBDYWxsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyogUmVzZXQgZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yICovXHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB7fTtcclxuXHJcbiAgICAgICAgLyogUmVzZXQgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yO1xyXG5cclxuICAgICAgICAvKiBSZXNldCBmb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHt9O1xyXG5cclxuICAgICAgICAvKiBSZXR1cm4gdGhlIGNyZWF0ZWQgZm9ybSBncm91cCAqL1xyXG4gICAgICAgIHJldHVybiBmb3JtR3JvdXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSBhbGwgcHJvcGVydHkgdmFsaWRhdG9ycyBzcGVjaWZpZWQgaW4gdGhlIHZhbGlkYXRvciBjb25maWd1cmF0aW9uIHRvIGEgZ2l2ZW4gcHJvcGVydHkuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gd2hpY2ggdmFsaWRhdG9ycyBhcmUgYXBwbGllZC5cclxuICAgICAqIEBwYXJhbSB2YWxpZGF0b3JDb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHZhbGlkYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gbW9kZWxJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1vZGVsLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFwcGx5QWxsUHJvcFZhbGlkYXRvcihwcm9wTmFtZTogc3RyaW5nLCB2YWxpZGF0b3JDb25maWc6IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgbW9kZWxJbnN0YW5jZTogYW55KSB7XHJcbiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHZhbGlkYXRvciBjb25maWd1cmF0aW9uIGFuZCBhcHBseUFsbFByb3BzIGFycmF5IGV4aXN0ICovXHJcbiAgICAgICAgaWYgKHZhbGlkYXRvckNvbmZpZyAmJiB2YWxpZGF0b3JDb25maWcuYXBwbHlBbGxQcm9wcykge1xyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgZXhjbHVkZVByb3BzIGFycmF5IGV4aXN0cyBhbmQgaWYgdGhlIHByb3BOYW1lIGlzIG5vdCBpbiB0aGUgZXhjbHVkZVByb3BzIGFycmF5ICovXHJcbiAgICAgICAgICAgIGlmICghKHZhbGlkYXRvckNvbmZpZy5leGNsdWRlUHJvcHMgJiYgdmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcy5sZW5ndGggPiAwICYmIHZhbGlkYXRvckNvbmZpZy5leGNsdWRlUHJvcHMuaW5kZXhPZihwcm9wTmFtZSkgPT0gLTEpKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggZWFjaCBpdGVtIGluIHRoZSBhcHBseUFsbFByb3BzIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JDb25maWcuYXBwbHlBbGxQcm9wcy5mb3JFYWNoKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uIGlzIGFuIFJ4V2ViIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0Lm5hbWUgPT0gUlhfV0VCX1ZBTElEQVRPUikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBBcHBseSBSeFdlYiB2YWxpZGF0b3IgdG8gdGhlIHByb3BOYW1lIHdpdGggdGhlIG1vZGVsSW5zdGFuY2UgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdChwcm9wTmFtZSwgbW9kZWxJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgaGFzIGFuIGVudHJ5IGZvciB0aGUgcHJvcE5hbWUgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBub3QsIGNyZWF0ZSBhbiBlbXB0eSBhcnJheSBmb3IgdGhlIHByb3BOYW1lICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFB1c2ggdGhlIGN1c3RvbSB2YWxpZGF0b3IgdG8gdGhlIGN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BOYW1lXS5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIENoZWNrcyBpZiBkeW5hbWljIHZhbGlkYXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8gYSBwcm9wZXJ0eS5cclxuICAgICAgKiBcclxuICAgICAgKiBAcGFyYW0gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrLlxyXG4gICAgICAqIEBwYXJhbSB2YWxpZGF0b3JDb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHZhbGlkYXRpb24uXHJcbiAgICAgICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBkeW5hbWljIHZhbGlkYXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHByb3BlcnR5LlxyXG4gICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkeW5hbWljVmFsaWRhdGlvblByb3BDaGVjayhwcm9wTmFtZTogc3RyaW5nLCB2YWxpZGF0b3JDb25maWc6IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIHJldHVybiAodmFsaWRhdG9yQ29uZmlnID09IHVuZGVmaW5lZCkgPyB0cnVlIDogKCF2YWxpZGF0b3JDb25maWcuZHluYW1pY1ZhbGlkYXRpb25Db25maWd1cmF0aW9uUHJvcGVydHlOYW1lKSA/IHRydWUgOiB2YWxpZGF0b3JDb25maWcuZHluYW1pY1ZhbGlkYXRpb25Db25maWd1cmF0aW9uUHJvcGVydHlOYW1lID09IHByb3BOYW1lID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxyXG4gICAgICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmFsdWUgaXMgbm90IGFuIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc05vdE9iamVjdCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT0gT0JKRUNUX1NUUklORztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSB2YWxpZGF0b3IgZm9ybSBncm91cCBiYXNlZCBvbiB0aGUgZ3JvdXBPYmplY3QgYW5kIGFwcGxpZXMgdmFsaWRhdGlvbiBydWxlcy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGdyb3VwT2JqZWN0IFRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyB0byBjcmVhdGUgdGhlIGZvcm0gZ3JvdXAuXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IHRvIHN0b3JlIHRoZSBmb3JtIGdyb3VwLlxyXG4gICAgICogQHBhcmFtIG1vZGVsSW5zdGFuY2UgVGhlIG1vZGVsIGluc3RhbmNlIHVzZWQgZm9yIGluaXRpYWxpemF0aW9uLlxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgdmFsaWRhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVWYWxpZGF0b3JGb3JtR3JvdXAoZ3JvdXBPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGVudGl0eU9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgbW9kZWxJbnN0YW5jZTogYW55LCB2YWxpZGF0b3JDb25maWc6IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIC8qIEl0ZXJhdGVzIG92ZXIgZWFjaCBwcm9wZXJ0eSBpbiB0aGUgZ3JvdXBPYmplY3QgdG8gY3JlYXRlIGZvcm0gY29udHJvbHMgYW5kIGFwcGx5IHZhbGlkYXRvcnMuICovXHJcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZ3JvdXBPYmplY3QpIHtcclxuICAgICAgICAgICAgdmFyIHByb3AgPSBncm91cE9iamVjdFtwcm9wTmFtZV07XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgaXMgYW4gYXJyYXkgYW5kIG5lZWRzIHZhbGlkYXRpb24gKi9cclxuICAgICAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBBcnJheSAmJiBwcm9wLmxlbmd0aCA+IDAgJiYgdGhpcy5pc05vdE9iamVjdChwcm9wWzBdKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BWYWxpZGF0b3JzID0gKHByb3AubGVuZ3RoID4gMSAmJiBwcm9wWzFdIGluc3RhbmNlb2YgQXJyYXkpID8gcHJvcFsxXSA6IChwcm9wLmxlbmd0aCA9PSAyKSA/IFtwcm9wWzFdXSA6IFtdO1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BlcnR5QWRkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiBJdGVyYXRlIG92ZXIgZWFjaCB2YWxpZGF0b3IgZm9yIHRoZSBjdXJyZW50IHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BWYWxpZGF0b3JzW2ldLm5hbWUgPT0gUlhfV0VCX1ZBTElEQVRPUikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wVmFsaWRhdG9yc1tpXShwcm9wTmFtZSwgbW9kZWxJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5QWRkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBvdGhlciB2YWxpZGF0b3JzIHRvIHRoZSBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BOYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdLnB1c2gocHJvcFZhbGlkYXRvcnNbaV0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmIG5vIHByb3BlcnR5IHZhbGlkYXRvciBhZGRlZCwgaW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5QWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgUFJPUEVSVFksIHVuZGVmaW5lZCwgdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT0gT0JKRUNUX1NUUklORyA/IG1vZGVsSW5zdGFuY2UgOiB7IGNvbnN0cnVjdG9yOiBtb2RlbEluc3RhbmNlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIEFwcGx5IGFsbCBwcm9wZXJ0eSB2YWxpZGF0b3JzICovXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5QWxsUHJvcFZhbGlkYXRvcihwcm9wTmFtZSwgdmFsaWRhdG9yQ29uZmlnLCBtb2RlbEluc3RhbmNlKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3AgPT09IG51bGwgfHwgcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBwcm9wID09IFNUUklORyB8fCB0eXBlb2YgcHJvcCA9PSBOVU1CRVIgfHwgdHlwZW9mIHByb3AgPT0gQk9PTEVBTiB8fCBwcm9wIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgb2JqZWN0IGlmIGl0J3MgYSBzaW1wbGUgdHlwZSAqL1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdENvbnRhaW5lci5pbml0UHJvcGVydHlPYmplY3QocHJvcE5hbWUsIFBST1BFUlRZLCB1bmRlZmluZWQsIHR5cGVvZiBtb2RlbEluc3RhbmNlID09IE9CSkVDVF9TVFJJTkcgPyBtb2RlbEluc3RhbmNlIDogeyBjb25zdHJ1Y3RvcjogbW9kZWxJbnN0YW5jZSB9KTtcclxuICAgICAgICAgICAgICAgIC8qIEFwcGx5IGFsbCBwcm9wZXJ0eSB2YWxpZGF0b3JzICovXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5QWxsUHJvcFZhbGlkYXRvcihwcm9wTmFtZSwgdmFsaWRhdG9yQ29uZmlnLCBtb2RlbEluc3RhbmNlKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgYSBGb3JtQXJyYXksIGFzc2lnbiBpdCBkaXJlY3RseSAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBwcm9wO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBJZiBpdCdzIGFuIGFycmF5IG9mIG9iamVjdHMsIGNyZWF0ZSBmb3JtIGNvbnRyb2xzIHJlY3Vyc2l2ZWx5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BNb2RlbEluc3RhbmNlID0gc3VwZXIuY3JlYXRlSW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsSW5zdGFuY2UgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IgPSBtb2RlbEluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgYXMgYW4gYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgQVJSQVlfUFJPUEVSVFksIHByb3BNb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yLCBtb2RlbEluc3RhbmNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBhbiBlbXB0eSBhcnJheSBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJvdyBvZiBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBvYmplY3QgZm9yIGVhY2ggZWxlbWVudCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgak9iamVjdCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBQdXNoIHRoZSBuZXcgb2JqZWN0IGludG8gdGhlIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0ucHVzaChqT2JqZWN0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWN1cnNpdmVseSBjcmVhdGUgdmFsaWRhdG9yIGZvcm0gZ3JvdXBzIGZvciBlYWNoIG9iamVjdCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckZvcm1Hcm91cChyb3csIGpPYmplY3QsIHByb3BNb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yLCB2YWxpZGF0b3JDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvcCA9PSBPQkpFQ1RfU1RSSU5HICYmICEocHJvcCBpbnN0YW5jZW9mIEZvcm1Db250cm9sIHx8IHByb3AgaW5zdGFuY2VvZiBSeEZvcm1Db250cm9sKSkge1xyXG4gICAgICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBmb3JtR3JvdXAgYmFzZWQgb24gdGhlIHR5cGUgb2YgJ3Byb3AnICovXHJcbiAgICAgICAgICAgICAgICBsZXQgZm9ybUdyb3VwOiBhbnkgPSAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkgPyBwcm9wLmNvbnRyb2xzWzBdIDogcHJvcDtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiBJZiAncHJvcCcgaXMgYSBGb3JtR3JvdXAgb3IgUnhGb3JtR3JvdXAgYW5kIGRvZXMgbm90IGhhdmUgYSBtb2RlbCwgY3JlYXRlIGEgZm9ybSBncm91cCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmb3JtR3JvdXAubW9kZWwgJiYgKHByb3AgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cCA9IHRoaXMuZ3JvdXAoZm9ybUdyb3VwLmNvbnRyb2xzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBJZiAncHJvcCcgaXMgYSBGb3JtR3JvdXAgb3IgUnhGb3JtR3JvdXAsIGluaXRpYWxpemUgdGhlIHByb3BlcnR5IGFzIGFuIG9iamVjdCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnRhaW5lci5pbml0UHJvcGVydHlPYmplY3QocHJvcE5hbWUsIE9CSkVDVF9QUk9QRVJUWSwgZm9ybUdyb3VwLm1vZGVsLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBhIEZvcm1BcnJheSwgaW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgYXMgYW4gYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcDtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgQVJSQVlfUFJPUEVSVFksIGZvcm1Hcm91cC5tb2RlbCwgbW9kZWxJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvKiBJZiAncHJvcCcgaXMgbmVpdGhlciBhIEZvcm1Hcm91cC9SeEZvcm1Hcm91cCBub3IgYSBGb3JtQXJyYXkgKi9cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGR5bmFtaWMgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZHluYW1pY1ZhbGlkYXRpb25Qcm9wQ2hlY2socHJvcE5hbWUsIHZhbGlkYXRvckNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBwcm9wZXJ0eSBmb3IgZHluYW1pYyB2YWxpZGF0aW9uICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BOYW1lXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgdG8gdGhlIGN1cnJlbnQgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZvciB0aGUgcHJvcGVydHkgbW9kZWwgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BNb2RlbEluc3RhbmNlID0gc3VwZXIuY3JlYXRlSW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHByb3BlcnR5IG9iamVjdCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0uY29uc3RydWN0b3IgPSBwcm9wTW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnRhaW5lci5pbml0UHJvcGVydHlPYmplY3QocHJvcE5hbWUsIE9CSkVDVF9QUk9QRVJUWSwgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5jb25zdHJ1Y3RvciwgbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3RvciA9PSBGdW5jdGlvbiA/IHsgY29uc3RydWN0b3I6IG1vZGVsSW5zdGFuY2UgfSA6IG1vZGVsSW5zdGFuY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9wZXJ0eSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyA9IHRoaXMuZ2V0VmFsaWRhdG9yQ29uZmlnKHZhbGlkYXRvckNvbmZpZywgZ3JvdXBPYmplY3QsIHByb3BOYW1lICsgXCIuXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjdXJzaXZlbHkgY3JlYXRlIHRoZSB2YWxpZGF0b3IgZm9ybSBncm91cCBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yRm9ybUdyb3VwKGdyb3VwT2JqZWN0W3Byb3BOYW1lXSwgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSwgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5jb25zdHJ1Y3Rvciwgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBwcm9wZXJ0eSB3aXRob3V0IGR5bmFtaWMgdmFsaWRhdGlvbiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gZ3JvdXBPYmplY3RbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQXNzaWduIHByb3BlcnR5IHZhbHVlIGlmIGl0J3Mgb2Ygc2ltcGxlIHR5cGUgKi9cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09IFNUUklORyB8fCB0eXBlb2YgcHJvcCA9PSBOVU1CRVIgfHwgdHlwZW9mIHByb3AgPT0gQk9PTEVBTiB8fCBwcm9wIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3BcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQXNzaWduIHByb3BlcnR5IHZhbHVlIGlmIGl0J3MgYW4gYXJyYXkgb3Igb2JqZWN0ICovXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKChwcm9wICYmIHByb3AubGVuZ3RoID4gMCAmJiB0aGlzLmlzTm90T2JqZWN0KHByb3BbMF0pICYmICEocHJvcCBpbnN0YW5jZW9mIEZvcm1Db250cm9sIHx8IHByb3AgaW5zdGFuY2VvZiBSeEZvcm1Db250cm9sKSAmJiAhKHByb3AgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSkge1xyXG4gICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3BbMF1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQXNzaWduIHByb3BlcnR5IHZhbHVlIGlmIGl0J3MgYSBGb3JtQXJyYXkgKi9cclxuICAgICAgICAgICAgZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3BcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQXNzaWduIHByb3BlcnR5IHZhbHVlIGlmIGl0J3MgYSBGb3JtQ29udHJvbCAqL1xyXG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBwcm9wXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgUFJPUEVSVFksIHVuZGVmaW5lZCwgbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3RvciA/IG1vZGVsSW5zdGFuY2UgOiB7IGNvbnN0cnVjdG9yOiBtb2RlbEluc3RhbmNlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB2YWxpZGF0b3IgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBlbnRpdHkgb2JqZWN0IGFuZCByb290IHByb3BlcnR5IG5hbWUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB2YWxpZGF0b3JDb25maWcgVGhlIHZhbGlkYXRvciBjb25maWd1cmF0aW9uIHRvIHByb2Nlc3MuXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IGZvciB3aGljaCB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gaXMgYXBwbGllZC5cclxuICAgICAqIEBwYXJhbSByb290UHJvcGVydHlOYW1lIFRoZSByb290IHByb3BlcnR5IG5hbWUgdG8gY29uc2lkZXIuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXlQcm9wZXJ0eU5hbWUgT3B0aW9uYWwuIFRoZSBhcnJheSBwcm9wZXJ0eSBuYW1lIHRvIGNvbnNpZGVyLlxyXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb2Nlc3NlZCB2YWxpZGF0b3IgY29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JDb25maWcodmFsaWRhdG9yQ29uZmlnOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGVudGl0eU9iamVjdDogYW55LCByb290UHJvcGVydHlOYW1lOiBzdHJpbmcsIGFycmF5UHJvcGVydHlOYW1lPzogc3RyaW5nKTogYW55IHtcclxuICAgICAgICBsZXQgZXhjbHVkZVByb3BzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGxldCBpbmNsdWRlUHJvcHM6IGFueVtdID0gW107XHJcbiAgICAgICAgbGV0IGlnbm9yZVVuZGVmaW5lZFByb3BzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmFsaWRhdG9yQ29uZmlnIGV4aXN0cyAqL1xyXG4gICAgICAgIGlmICghdmFsaWRhdG9yQ29uZmlnKSByZXR1cm4ge307XHJcblxyXG4gICAgICAgIC8qIFJldHJpZXZlIHZhbGlkYXRpb24gcHJvcGVydGllcyBhbmQgYWJzdHJhY3QgY29udHJvbCBvcHRpb25zICovXHJcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblByb3BzID0gdGhpcy5nZXRPYmplY3RGb3JQcm9wZXJ0eSh2YWxpZGF0b3JDb25maWcuZHluYW1pY1ZhbGlkYXRpb24hLCByb290UHJvcGVydHlOYW1lLCBhcnJheVByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgY29uc3QgYWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHRoaXMuZ2V0T2JqZWN0Rm9yUHJvcGVydHkodmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnMhLCByb290UHJvcGVydHlOYW1lLCBhcnJheVByb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgICAgIC8qIFBvcHVsYXRlIGV4Y2x1ZGVQcm9wcywgaW5jbHVkZVByb3BzLCBhbmQgaWdub3JlVW5kZWZpbmVkUHJvcHMgYXJyYXlzICovXHJcbiAgICAgICAgaWYgKHZhbGlkYXRvckNvbmZpZy5leGNsdWRlUHJvcHMpIHtcclxuICAgICAgICAgICAgZXhjbHVkZVByb3BzID0gdGhpcy5nZXRQcm9wcyh2YWxpZGF0b3JDb25maWcuZXhjbHVkZVByb3BzLCByb290UHJvcGVydHlOYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWxpZGF0b3JDb25maWcuaW5jbHVkZVByb3BzKSB7XHJcbiAgICAgICAgICAgIGluY2x1ZGVQcm9wcyA9IHRoaXMuZ2V0UHJvcHModmFsaWRhdG9yQ29uZmlnLmluY2x1ZGVQcm9wcywgcm9vdFByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnLmlnbm9yZVVuZGVmaW5lZFByb3BzKSB7XHJcbiAgICAgICAgICAgIGlnbm9yZVVuZGVmaW5lZFByb3BzID0gdGhpcy5nZXRQcm9wcyh2YWxpZGF0b3JDb25maWcuaWdub3JlVW5kZWZpbmVkUHJvcHMsIHJvb3RQcm9wZXJ0eU5hbWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQXBwZW5kIGdsb2JhbCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgaWYgbm90IGZvdW5kICovXHJcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhhYnN0cmFjdENvbnRyb2xPcHRpb25zKS5sZW5ndGggJiYgcm9vdFByb3BlcnR5TmFtZS5lbmRzV2l0aCgnLicpICYmIHZhbGlkYXRvckNvbmZpZy5hYnN0cmFjdENvbnRyb2xPcHRpb25zICYmIHZhbGlkYXRvckNvbmZpZy5hYnN0cmFjdENvbnRyb2xPcHRpb25zW3Jvb3RQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIHJvb3RQcm9wZXJ0eU5hbWUubGVuZ3RoIC0gMSldKSB7XHJcbiAgICAgICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnNbJ2dsb2JhbCddID0gdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbcm9vdFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgcm9vdFByb3BlcnR5TmFtZS5sZW5ndGggLSAxKV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBSZXRyaWV2ZSBkeW5hbWljIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNWYWxpZGF0aW9uID0gKHZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWUgJiYgZW50aXR5T2JqZWN0W3ZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWVdKSA/IGVudGl0eU9iamVjdFt2YWxpZGF0b3JDb25maWcuZHluYW1pY1ZhbGlkYXRpb25Db25maWd1cmF0aW9uUHJvcGVydHlOYW1lXSA6IHZhbGlkYXRpb25Qcm9wcztcclxuXHJcbiAgICAgICAgLyogUmV0dXJuIHByb2Nlc3NlZCB2YWxpZGF0b3IgY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlnbm9yZVVuZGVmaW5lZFByb3BzOiBpZ25vcmVVbmRlZmluZWRQcm9wcyxcclxuICAgICAgICAgICAgaW5jbHVkZVByb3BzOiBpbmNsdWRlUHJvcHMsXHJcbiAgICAgICAgICAgIGR5bmFtaWNWYWxpZGF0aW9uOiBkeW5hbWljVmFsaWRhdGlvbixcclxuICAgICAgICAgICAgZXhjbHVkZVByb3BzOiBleGNsdWRlUHJvcHMsXHJcbiAgICAgICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnM6IGFic3RyYWN0Q29udHJvbE9wdGlvbnNcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcm9vdCBwcm9wZXJ0eSBuYW1lIGFuZCBhcnJheSBwcm9wZXJ0eSBuYW1lIChpZiBwcm92aWRlZCkuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSByb290T2JqZWN0IFRoZSByb290IG9iamVjdCB0byBzZWFyY2ggZm9yIHByb3BlcnRpZXMuXHJcbiAgICAgKiBAcGFyYW0gcm9vdFByb3BlcnR5TmFtZSBUaGUgcm9vdCBwcm9wZXJ0eSBuYW1lIHRvIG1hdGNoIGFnYWluc3QuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXlQcm9wZXJ0eU5hbWUgT3B0aW9uYWwuIFRoZSBhcnJheSBwcm9wZXJ0eSBuYW1lIHRvIG1hdGNoIGFnYWluc3QuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGFuZCBhcnJheSBwcm9wZXJ0eSBuYW1lIChpZiBwcm92aWRlZCkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0T2JqZWN0Rm9yUHJvcGVydHk8VD4ocm9vdE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBUIH0sIHJvb3RQcm9wZXJ0eU5hbWU6IHN0cmluZywgYXJyYXlQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IFQgfSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IFQgfSA9IHt9O1xyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJvb3Qgb2JqZWN0ICovXHJcbiAgICAgICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gcm9vdE9iamVjdCkge1xyXG4gICAgICAgICAgICAvKiBTa2lwIHByb3BlcnRpZXMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIHJvb3RQcm9wZXJ0eU5hbWUgb3IgYXJyYXlQcm9wZXJ0eU5hbWUgKi9cclxuICAgICAgICAgICAgaWYgKCFwcm9wTmFtZS5zdGFydHNXaXRoKHJvb3RQcm9wZXJ0eU5hbWUpICYmICghYXJyYXlQcm9wZXJ0eU5hbWUgfHwgIXByb3BOYW1lLnN0YXJ0c1dpdGgoYXJyYXlQcm9wZXJ0eU5hbWUpKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIEV4dHJhY3QgdGhlIHNwbGl0IHByb3BlcnR5IG5hbWUgKi9cclxuICAgICAgICAgICAgbGV0IHNwbGl0UHJvcCA9IHByb3BOYW1lLnNwbGl0KFwiLlwiLCAyKVsxXTtcclxuXHJcbiAgICAgICAgICAgIC8qIElmIHNwbGl0UHJvcCBpcyB1bmRlZmluZWQsIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgIGlmICghc3BsaXRQcm9wKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQWRkIHRoZSBwcm9wZXJ0eSB0byB0aGUgcmVzdWx0IG9iamVjdCAqL1xyXG4gICAgICAgICAgICByZXN1bHRbc3BsaXRQcm9wXSA9IHJvb3RPYmplY3RbcHJvcE5hbWVdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnRpZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCByb290IHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgb2YgcHJvcGVydGllcy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIGFycmF5IG9mIHByb3BlcnRpZXMgdG8gc2VhcmNoLlxyXG4gICAgICogQHBhcmFtIHJvb3RQcm9wZXJ0eU5hbWUgVGhlIHJvb3QgcHJvcGVydHkgbmFtZSB0byBtYXRjaCBhZ2FpbnN0LlxyXG4gICAgICogQHBhcmFtIGlzSWdub3JlUHJvcCBPcHRpb25hbC4gSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcm9vdCBwcm9wZXJ0eSBpdHNlbGYgYXMgYSBwcm9wZXJ0eS5cclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgbWF0Y2hpbmcgdGhlIHJvb3QgcHJvcGVydHkgbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9wcyhwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgcm9vdFByb3BlcnR5TmFtZTogc3RyaW5nLCBpc0lnbm9yZVByb3A6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCBwcm9wczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzICovXHJcbiAgICAgICAgZm9yIChsZXQgcHJvcCBvZiBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBjb250YWlucyB0aGUgcm9vdFByb3BlcnR5TmFtZSAqL1xyXG4gICAgICAgICAgICBpZiAocHJvcC5pbmRleE9mKHJvb3RQcm9wZXJ0eU5hbWUpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3BsaXRQcm9wcyA9IHByb3Auc3BsaXQoXCIuXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBoYXMgdHdvIHBhcnRzLCBhZGQgdGhlIHNlY29uZCBwYXJ0IHRvIHRoZSBwcm9wcyBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0UHJvcHMubGVuZ3RoID09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHNwbGl0UHJvcHNbMV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBoYXMgbW9yZSB0aGFuIHR3byBwYXJ0cywgam9pbiB0aGUgcGFydHMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBhbmQgYWRkIHRvIHRoZSBwcm9wcyBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3BsaXRQcm9wcy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BsaXRQcm9wcy5zcGxpY2UoMCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaChzcGxpdFByb3BzLmpvaW4oXCIuXCIpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBJZiBpc0lnbm9yZVByb3AgaXMgdHJ1ZSBhbmQgdGhlIHJvb3QgcHJvcGVydHkgaXRzZWxmIGlzIHByZXNlbnQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXksIGFkZCAnOnNlbGY6JyB0byB0aGUgcHJvcHMgYXJyYXkgKi9cclxuICAgICAgICBpZiAoaXNJZ25vcmVQcm9wICYmIHByb3BlcnRpZXMuZmlsdGVyKHggPT4geCA9PSByb290UHJvcGVydHlOYW1lLnJlcGxhY2UoJy4nLCAnJykpLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHByb3BzLnB1c2goJzpzZWxmOicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb3BzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGZvcm0gZ3JvdXAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsLCBlbnRpdHkgb2JqZWN0LCBhbmQgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgb3IgdHlwZSBkZWZpbml0aW9uIHRvIGNyZWF0ZSB0aGUgZm9ybSBncm91cCBmcm9tLlxyXG4gICAgICogQHBhcmFtIGVudGl0eU9iamVjdCBPcHRpb25hbC4gVGhlIGVudGl0eSBvYmplY3QgZm9yIHdoaWNoIHRoZSBmb3JtIGdyb3VwIGlzIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIE9wdGlvbmFsLiBUaGUgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gdG8gY3VzdG9taXplIHRoZSBmb3JtIGdyb3VwIGNyZWF0aW9uLlxyXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgUnhGb3JtR3JvdXAsIEZvcm1Hcm91cCwgb3IgQXBwRm9ybUdyb3VwPFQ+LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZm9ybUdyb3VwPFQ+KG1vZGVsOiBUeXBlPFQ+IHwgeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZW50aXR5T2JqZWN0PzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uPzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTogUnhGb3JtR3JvdXAgfCBGb3JtR3JvdXAgfCBBcHBGb3JtR3JvdXA8VD4ge1xyXG4gICAgICAgIC8qIFJldHJpZXZlcyBuZWNlc3NhcnkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBtb2RlbCwgZW50aXR5IG9iamVjdCwgYW5kIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uIHRvIGNyZWF0ZSBhIGZvcm0gZ3JvdXAgKi9cclxuICAgICAgICBsZXQganNvbiA9IHRoaXMuZ2V0T2JqZWN0KG1vZGVsLCBlbnRpdHlPYmplY3QsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgbW9kZWwgPSBqc29uLm1vZGVsO1xyXG4gICAgICAgIGVudGl0eU9iamVjdCA9IGpzb24uZW50aXR5T2JqZWN0O1xyXG5cclxuICAgICAgICAvKiBcclxuICAgICAgICAgKiBJZiB0aGUgZW50aXR5IG9iamVjdCdzIGNvbnN0cnVjdG9yIGRpZmZlcnMgZnJvbSB0aGUgbW9kZWwncyBjb25zdHJ1Y3RvciBhbmQgZm9ybUdyb3VwIGlzIG5vdCBwcmV2aW91c2x5IGNhbGxlZCxcclxuICAgICAgICAgKiB1cGRhdGUgdGhlIGVudGl0eSBvYmplY3QgdG8gbWF0Y2ggdGhlIG1vZGVsLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChlbnRpdHlPYmplY3QhLmNvbnN0cnVjdG9yICE9IG1vZGVsICYmICF0aGlzLmlzR3JvdXBDYWxsZWQpIHtcclxuICAgICAgICAgICAgZW50aXR5T2JqZWN0ID0ganNvbi5lbnRpdHlPYmplY3QgPSB0aGlzLnVwZGF0ZU9iamVjdChtb2RlbCwganNvbi5lbnRpdHlPYmplY3QsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uID0ganNvbi5mb3JtQnVpbGRlckNvbmZpZ3VyYXRpb247XHJcblxyXG4gICAgICAgIC8qIEV4dHJhY3QgZXhwcmVzc2lvbnMgZnJvbSB0aGUgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gaWYgcHJvdmlkZWQuICovXHJcbiAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RFeHByZXNzaW9ucyhmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogR2V0IHRoZSBjb250YWluZXIgZm9yIGluc3RhbmNlcyBiYXNlZCBvbiB0aGUgbW9kZWwgYW5kIGVudGl0eSBvYmplY3QuICovXHJcbiAgICAgICAgbGV0IGluc3RhbmNlQ29udGFpbmVyOiBJbnN0YW5jZUNvbnRhaW5lciA9IHRoaXMuZ2V0SW5zdGFuY2VDb250YWluZXIobW9kZWwsIGVudGl0eU9iamVjdCk7XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGFuZCBhcHBseSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xyXG4gICAgICAgIHRoaXMuY2hlY2tPYmplY3RQcm9wQWRkaXRpb25hbFZhbGlkYXRpb24oaW5zdGFuY2VDb250YWluZXIsIGVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISk7XHJcblxyXG4gICAgICAgIC8qIEluaXRpYWxpemUgdmFyaWFibGVzIGZvciBmb3JtIGdyb3VwIGNyZWF0aW9uLiAqL1xyXG4gICAgICAgIGxldCBmb3JtR3JvdXBPYmplY3QgPSB7fTtcclxuICAgICAgICBsZXQgZXh0ZW5kZWRQcm9wZXJ0aWVzID0ge307XHJcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxWYWxpZGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBQcm9wVmFsaWRhdGlvbkNvbmZpZyB9ID0ge307XHJcblxyXG4gICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIGluc3RhbmNlIGNvbnRhaW5lci4gKi9cclxuICAgICAgICBpbnN0YW5jZUNvbnRhaW5lci5wcm9wZXJ0aWVzPy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzSW5jbHVkZVByb3AgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBpbmNsdWRlZCBiYXNlZCBvbiBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi4gKi9cclxuICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBleGNsdWRlZCBiYXNlZCBvbiBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi4gKi9cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZXhjbHVkZVByb3BzICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5leGNsdWRlUHJvcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzSW5jbHVkZVByb3AgPSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZXhjbHVkZVByb3BzLmluZGV4T2YocHJvcGVydHkubmFtZSkgPT0gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgZHluYW1pYyB2YWxpZGF0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi4gKi9cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVmFsaWRhdGlvbnMgPSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb247XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBpbmNsdWRlZCBiYXNlZCBvbiBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi4gKi9cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaW5jbHVkZVByb3BzICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pbmNsdWRlUHJvcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzSW5jbHVkZVByb3AgPSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaW5jbHVkZVByb3BzLmluZGV4T2YocHJvcGVydHkubmFtZSkgIT0gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdW5kZWZpbmVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGlnbm9yZWQgYmFzZWQgb24gZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24uICovXHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmlnbm9yZVVuZGVmaW5lZFByb3BzICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pZ25vcmVVbmRlZmluZWRQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9ICEoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PSBQUk9QRVJUWSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAhUmVnZXhWYWxpZGF0b3IuaXNOb3RCbGFuayhqc29uLmVudGl0eU9iamVjdFtwcm9wZXJ0eS5uYW1lXSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmlnbm9yZVVuZGVmaW5lZFByb3BzLmluZGV4T2YocHJvcGVydHkubmFtZSkgIT09IC0xIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMuaW5kZXhPZihcIjpzZWxmOlwiKSAhPT0gLTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pZ25vcmUpIHtcclxuICAgICAgICAgICAgICAgIGlzSW5jbHVkZVByb3AgPSAhcHJvcGVydHkuaWdub3JlLmNhbGwoanNvbi5lbnRpdHlPYmplY3QsIGpzb24uZW50aXR5T2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBpbmNsdWRlZCwgY3JlYXRlIGZvcm0gY29udHJvbHMsIGZvcm0gZ3JvdXBzLCBvciBmb3JtIGFycmF5cyBiYXNlZCBvbiBpdHMgdHlwZS4gKi9cclxuICAgICAgICAgICAgaWYgKGlzSW5jbHVkZVByb3ApIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHkucHJvcGVydHlUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBQUk9QRVJUWTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBhbHJlYWR5IGEgZm9ybSBjb250cm9sLCBjcmVhdGUgb25lIHdpdGggYXBwcm9wcmlhdGUgdmFsaWRhdG9ycyBhbmQgb3B0aW9ucyAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gaW5zdGFuY2VvZiBGb3JtQ29udHJvbCB8fCAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gaW5zdGFuY2VvZiBSeEZvcm1Db250cm9sKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0cmFjdCBwcm9wZXJ0eSB2YWxpZGF0b3JzIGJhc2VkIG9uIGFubm90YXRpb25zLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnR5VmFsaWRhdG9ycyA9IGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnR5QW5ub3RhdGlvbnMuZmlsdGVyKHQgPT4gdC5wcm9wZXJ0eU5hbWUgPT0gcHJvcGVydHkubmFtZSAmJiB0LmlzVmFsaWRhdG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IHVwZGF0ZU9uIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gYW5ub3RhdGlvbnMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlT24gPSBpbnN0YW5jZUNvbnRhaW5lci5wcm9wZXJ0eUFubm90YXRpb25zLmZpbHRlcih0ID0+IHQucHJvcGVydHlOYW1lID09IHByb3BlcnR5Lm5hbWUgJiYgIXQuaXNWYWxpZGF0b3IgJiYgdC5hbm5vdGF0aW9uVHlwZSA9PT0gXCJ1cGRhdGVPblwiKVswXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW5pdGl6ZSB0aGUgcHJvcGVydHkgdmFsdWUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2FuaXRpemVWYWx1ZSA9IHN1cGVyLnNhbml0aXplVmFsdWUoaW5zdGFuY2VDb250YWluZXIsIHByb3BlcnR5Lm5hbWUsIHN1cGVyLmdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eSwgKGVudGl0eU9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hKSwganNvbi5lbnRpdHlPYmplY3QsIE9iamVjdC5hc3NpZ24oe30sIGpzb24uZW50aXR5T2JqZWN0KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHVuZGVmaW5lZCBhbmQgdGhlcmUgaXMgYSBzYW5pdGl6ZWQgdmFsdWUsIGFzc2lnbiBpdC4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPT09IHVuZGVmaW5lZCAmJiBzYW5pdGl6ZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudGl0eU9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gc2FuaXRpemVWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgZm9ybSBjb250cm9sIHZhbGlkYXRvcnMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsaWRhdG9ycyA9IHRoaXMuYWRkRm9ybUNvbnRyb2wocHJvcGVydHksIHByb3BlcnR5VmFsaWRhdG9ycywgYWRkaXRpb25hbFZhbGlkYXRpb25zW3Byb3BlcnR5Lm5hbWVdLCBpbnN0YW5jZUNvbnRhaW5lciwgZW50aXR5T2JqZWN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgYWJzdHJhY3QgY29udHJvbCBvcHRpb25zIGluY2x1ZGluZyB2YWxpZGF0b3JzIGFuZCBhc3luYyB2YWxpZGF0b3JzLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFic3RyYWN0Q29udHJvbE9wdGlvbnM6IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB7IHZhbGlkYXRvcnM6IHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9yczogdGhpcy5hZGRBc3luY1ZhbGlkYXRpb24ocHJvcGVydHksIHByb3BlcnR5VmFsaWRhdG9ycywgYWRkaXRpb25hbFZhbGlkYXRpb25zW3Byb3BlcnR5Lm5hbWVdKSB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHJpZXZlIGFkZGl0aW9uYWwgYWJzdHJhY3QgY29udHJvbCBvcHRpb25zIGJhc2VkIG9uIHByb3BlcnR5IG5hbWUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdENvbnRyb2xPcHRpb25zID0gdGhpcy5nZXRBYnN0cmFjdENvbnRyb2xPcHRpb25zKHByb3BlcnR5Lm5hbWUsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEsIGFic3RyYWN0Q29udHJvbE9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc2lnbiB1cGRhdGVPbiBjb25maWd1cmF0aW9uIGlmIGF2YWlsYWJsZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVPbiAmJiAhYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnMudXBkYXRlT24gPSB1cGRhdGVPbi5jb25maWcucnVuT247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IGZvcm0gY29udHJvbCBpbnN0YW5jZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IG5ldyBSeEZvcm1Db250cm9sKHNhbml0aXplVmFsdWUsIGFic3RyYWN0Q29udHJvbE9wdGlvbnMsIGpzb24uZW50aXR5T2JqZWN0LCBPYmplY3QuYXNzaWduKHt9LCBqc29uLmVudGl0eU9iamVjdCksIHByb3BlcnR5Lm5hbWUsIGluc3RhbmNlQ29udGFpbmVyLnNhbml0aXplcnMhW3Byb3BlcnR5Lm5hbWVdKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTmVzdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgYWxyZWFkeSBhIGZvcm0gY29udHJvbCwgdXNlIGl0cyBkZWZhdWx0IHZhbHVlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gc3VwZXIuZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5LCAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIHRoZSBwcm9wZXJ0eSBhcyBleHRlbmRlZCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXh0ZW5kZWRQcm9wZXJ0aWVzIGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgT0JKRUNUX1BST1BFUlRZOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0VmFsdWUgPSAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgYW4gb2JqZWN0IGFuZCBub3QgYSBmb3JtIGdyb3VwLCByZWN1cnNpdmVseSBjcmVhdGUgYSBmb3JtIGdyb3VwIGZvciBpdCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0VmFsdWUgJiYgb2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgIShvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIFJ4Rm9ybUdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIG5lc3RlZCBiaW5kaW5nLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZEJpbmRpbmcgPSB0aGlzLmlzTmVzdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29uZGl0aW9uYWwgb2JqZWN0IHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcHJvcGVydHkgbmFtZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUNvbnRhaW5lciAmJiBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbE9iamVjdFByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzID0gaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29uZGl0aW9uYWwgb2JqZWN0IHByb3BlcnRpZXMgZm9yIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCBwcm9wZXJ0eSBuYW1lLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgJiYgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbE9iamVjdFByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKCh0OiBhbnkpID0+IHQub2JqZWN0UHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBjdXJyZW50IGZvcm0gZ3JvdXAgb3RoZXIgdmFsaWRhdG9yIGlmIGF2YWlsYWJsZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9idGFpbiB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBuZXN0ZWQgb2JqZWN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdFZhbGlkYXRpb25Db25maWcgPSB0aGlzLmdldFZhbGlkYXRvckNvbmZpZyhmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCBvYmplY3RWYWx1ZSwgYCR7cHJvcGVydHkubmFtZX0uYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2J0YWluIHRoZSBlbnRpdHkgdG8gdXNlIGZvciB0aGUgbmVzdGVkIG9iamVjdC4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnRpdHkgPSBwcm9wZXJ0eS5lbnRpdHlQcm92aWRlciA/IHByb3BlcnR5LmVudGl0eVByb3ZpZGVyLmNhbGwoZW50aXR5T2JqZWN0KSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYSBmb3JtIGdyb3VwIGZvciB0aGUgbmVzdGVkIG9iamVjdC4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IHRoaXMuZm9ybUdyb3VwKGVudGl0eSB8fCBwcm9wZXJ0eS5lbnRpdHkgfHwgdGhpcy5nZXRFbnRpdHkob2JqZWN0VmFsdWUsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEsIHByb3BlcnR5Lm5hbWUsIHRydWUpLCBvYmplY3RWYWx1ZSwgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgZmxhZ3MgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBuZXN0ZWQgYmluZGluZy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNOZXN0ZWRCaW5kaW5nID0gdGhpcy5pc05lc3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgYWxyZWFkeSBhIGZvcm0gZ3JvdXAsIHVzZSBpdCBhcyBpcyAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIFJ4Rm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBvYmplY3RWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBUlJBWV9QUk9QRVJUWTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5T2JqZWN0VmFsdWUgPSAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgYW4gYXJyYXkgYW5kIG5vdCBhIGZvcm0gYXJyYXksIHJlY3Vyc2l2ZWx5IGNyZWF0ZSBhIGZvcm0gYXJyYXkgZm9yIGl0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheU9iamVjdFZhbHVlICYmIGFycmF5T2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiAhKGFycmF5T2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgZmxhZ3MgdG8gaW5kaWNhdGUgbmVzdGVkIGJpbmRpbmcuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTmVzdGVkQmluZGluZyA9IHRoaXMuaXNOZXN0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgYW4gYXJyYXkgdG8gaG9sZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBzdWItb2JqZWN0IGluIHRoZSBhcnJheS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtQXJyYXlHcm91cCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnRpdHkgPSBwcm9wZXJ0eS5lbnRpdHlQcm92aWRlciA/IHByb3BlcnR5LmVudGl0eVByb3ZpZGVyLmNhbGwoZW50aXR5T2JqZWN0KSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBzdWItb2JqZWN0IGluIHRoZSBhcnJheS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN1Yk9iamVjdCBvZiBhcnJheU9iamVjdFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHByb3BlcnR5IG5hbWUgYW5kIGFycmF5IGluZGV4LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUNvbnRhaW5lciAmJiBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbE9iamVjdFByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKCh0OiBhbnkpID0+IHQub2JqZWN0UHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSAmJiB0LmFycmF5SW5kZXggPT0gaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSAmJiB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKCh0OiBhbnkpID0+IHQub2JqZWN0UHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSAmJiB0LmFycmF5SW5kZXggPT0gaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBjdXJyZW50IGZvcm0gZ3JvdXAgb3RoZXIgdmFsaWRhdG9yIGlmIGF2YWlsYWJsZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYnRhaW4gdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgc3ViLW9iamVjdC4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RWYWxpZGF0aW9uQ29uZmlnID0gdGhpcy5nZXRWYWxpZGF0b3JDb25maWcoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgc3ViT2JqZWN0LCBgJHtwcm9wZXJ0eS5uYW1lfS5gLCBgJHtwcm9wZXJ0eS5uYW1lfVske2luZGV4fV0uYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBhIGZvcm0gZ3JvdXAgZm9yIHRoZSBzdWItb2JqZWN0IGFuZCBhZGQgaXQgdG8gdGhlIGZvcm1BcnJheUdyb3VwIGFycmF5LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1BcnJheUdyb3VwLnB1c2godGhpcy5mb3JtR3JvdXAoZW50aXR5IHx8IHByb3BlcnR5LmVudGl0eSB8fCB0aGlzLmdldEVudGl0eShzdWJPYmplY3QsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEsIHByb3BlcnR5Lm5hbWUsIHRydWUpLCBzdWJPYmplY3QsIG9iamVjdFZhbGlkYXRpb25Db25maWcpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHRoZSBpbmRleC4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllcyBhbmQgYnVpbGRlciBjb25maWd1cmF0aW9uIGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2J0YWluIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBmb3IgdGhlIHByb3BlcnR5LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB0aGlzLmdldEFic3RyYWN0Q29udHJvbE9wdGlvbnMocHJvcGVydHkubmFtZSwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwge30pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBSeEZvcm1BcnJheSB1c2luZyB0aGUgYXJyYXlPYmplY3RWYWx1ZSBhbmQgdGhlIGZvcm1BcnJheUdyb3VwLCBhbG9uZyB3aXRoIHRoZSBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBuZXcgUnhGb3JtQXJyYXkoYXJyYXlPYmplY3RWYWx1ZSwgZm9ybUFycmF5R3JvdXAsIGFic3RyYWN0Q29udHJvbE9wdGlvbnMsIG51bGwsIHByb3BlcnR5LmFycmF5Q29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBhdXRvSW5zdGFuY2VQdXNoIGlzIGVuYWJsZWQsIG92ZXJyaWRlIHRoZSBwdXNoIGFuZCBzcGxpY2UgbWV0aG9kcyBvZiB0aGUgYXJyYXlPYmplY3RWYWx1ZSB0byBtYW5hZ2UgZm9ybSBncm91cHMgZHluYW1pY2FsbHkuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhY3RpdmVGb3JtQ29uZmlnLmF1dG9JbnN0YW5jZVB1c2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheU9iamVjdFZhbHVlLnB1c2ggPSAoaW5zdGFuY2U6IGFueVtdKTogbnVtYmVyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybUdyb3VwKGluc3RhbmNlLmNvbnN0cnVjdG9yLCBpbnN0YW5jZSwgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0ucHVzaChmb3JtR3JvdXAsIHsgaXNBZGRlZEluc3RhbmNlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheU9iamVjdFZhbHVlLnNwbGljZSA9IChzdGFydCwgZGVsZXRlQ291bnQpOiBhbnlbXSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmQgPSAoc3RhcnQgKyBkZWxldGVDb3VudCEpIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0ucmVtb3ZlQXQoaSwgeyBpc1JlbW92ZWRJbnN0YW5jZTogdHJ1ZSB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBmbGFncyB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIG5lc3RlZCBiaW5kaW5nLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZEJpbmRpbmcgPSB0aGlzLmlzTmVzdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGEgZm9ybSBhcnJheSwgdXNlIGl0IGFzIGlzICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFycmF5T2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IGFycmF5T2JqZWN0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIHNwZWNpZmllcyBjcmVhdGluZyBhIGJsYW5rIGZvcm0gYXJyYXksIGNyZWF0ZSBvbmUgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkuYXJyYXlDb25maWcgJiYgcHJvcGVydHkuYXJyYXlDb25maWcuY3JlYXRlQmxhbmspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IG5ldyBSeEZvcm1BcnJheShbXSwgW10sIG51bGwsIG51bGwsIHByb3BlcnR5LmFycmF5Q29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLyogSWYgbm8gbmVzdGVkIGZvcm0gZ3JvdXBzIG9yIGFycmF5cyBhcmUgY3JlYXRlZCwgcmVzZXQgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBpbnN0YW5jZSBhbmQgcmVsYXRlZCBwcm9wZXJ0aWVzLiAqL1xyXG4gICAgICAgIGlmICghdGhpcy5pc05lc3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlID0ge307XHJcbiAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBTZXQgYWJzdHJhY3QgY29udHJvbCBvcHRpb25zIGZvciB0aGUgZm9ybSBncm91cCBiYXNlZCBvbiBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi4gKi9cclxuICAgICAgICBsZXQgYWJzdHJhY3RDb250cm9sT3B0aW9uczogQWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdmFsaWRhdG9yczogW10sXHJcbiAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9yczogW10sXHJcbiAgICAgICAgICAgIHVwZGF0ZU9uOiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbJ2dsb2JhbCddXHJcbiAgICAgICAgICAgICAgICA/IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5hYnN0cmFjdENvbnRyb2xPcHRpb25zWydnbG9iYWwnXVxyXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKiBPYnRhaW4gYWJzdHJhY3QgY29udHJvbCBvcHRpb25zIGZvciB0aGUgZ2xvYmFsIHByb3BlcnR5LiAqL1xyXG4gICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB0aGlzLmdldEFic3RyYWN0Q29udHJvbE9wdGlvbnMoXCJnbG9iYWxcIiwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgYWJzdHJhY3RDb250cm9sT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIC8qIENyZWF0ZSBhIG5ldyBSeEZvcm1Hcm91cCB1c2luZyB0aGUgbW9kZWwsIGVudGl0eSBvYmplY3QsIGZvcm1Hcm91cE9iamVjdCwgYW5kIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucy4gKi9cclxuICAgICAgICBsZXQgZm9ybUdyb3VwID0gbmV3IFJ4Rm9ybUdyb3VwKGpzb24ubW9kZWwsIGpzb24uZW50aXR5T2JqZWN0LCBmb3JtR3JvdXBPYmplY3QsIGFic3RyYWN0Q29udHJvbE9wdGlvbnMpO1xyXG5cclxuICAgICAgICAvKiBJZiBleHBlcmltZW50YWwgbW9kZSBpcyBlbmFibGVkLCBhc3NpZ24gdGhlIGZvcm0gZ3JvdXAgdG8gdGhlIGVudGl0eSBvYmplY3QgYW5kIG92ZXJyaWRlIHByb3BlcnRpZXMgaWYgbmVlZGVkLiAqL1xyXG4gICAgICAgIGlmIChkZWZhdWx0Q29udGFpbmVyLmlzRXhwZXJpbWVudGFsKSB7XHJcbiAgICAgICAgICAgIGpzb24uZW50aXR5T2JqZWN0W1wiZm9ybUdyb3VwXCJdID0gZm9ybUdyb3VwO1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlUHJvcGVydGllcyhmb3JtR3JvdXAsIGpzb24uZW50aXR5T2JqZWN0LCBleHRlbmRlZFByb3BlcnRpZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogSWYgbm90IGluIG5lc3RlZCBiaW5kaW5nIG1vZGUgYW5kIGZvcm1Hcm91cCBpcyBub3QgcHJldmlvdXNseSBjYWxsZWQsIHJlZnJlc2ggZGlzYWJsZSBzdGF0dXMgb2YgdGhlIGZvcm0gZ3JvdXAuICovXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTmVzdGVkQmluZGluZyAmJiAhdGhpcy5pc0dyb3VwQ2FsbGVkKSB7XHJcbiAgICAgICAgICAgIGZvcm1Hcm91cC5yZWZyZXNoRGlzYWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1Hcm91cDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRlcyBwcm9wZXJ0aWVzIGluIHRoZSBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBlbnRpdHkgb2JqZWN0IGFuZCBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIGZvcm1Hcm91cCBUaGUgUnhGb3JtR3JvdXAgaW5zdGFuY2UgdG8gb3ZlcnJpZGUgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyB0byBvdmVycmlkZS5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlIGFzIGtleXMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb3ZlcnJpZGVQcm9wZXJ0aWVzKGZvcm1Hcm91cDogUnhGb3JtR3JvdXAsIGVudGl0eU9iamVjdDogYW55LCBwcm9wZXJ0aWVzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSkge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2godCA9PiB0aGlzLm92ZXJyaWRlUHJvcChlbnRpdHlPYmplY3QsIHQsIGZvcm1Hcm91cCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gY29udHJvbCBuYW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29udHJvbC5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gVGhlIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBjb250YWluaW5nIHRoZSBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0gYWJzdHJhY3RDb250cm9sT3B0aW9ucyBUaGUgZXhpc3RpbmcgQWJzdHJhY3RDb250cm9sT3B0aW9ucy5cclxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIEFic3RyYWN0Q29udHJvbE9wdGlvbnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhuYW1lOiBzdHJpbmcsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBhYnN0cmFjdENvbnRyb2xPcHRpb25zOiBBYnN0cmFjdENvbnRyb2xPcHRpb25zKSB7XHJcbiAgICAgICAgLyogVXBkYXRlIHVwZGF0ZU9uIG9wdGlvbiBpZiBkZWZpbmVkIGluIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbbmFtZV0pIHtcclxuICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbiA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5hYnN0cmFjdENvbnRyb2xPcHRpb25zW25hbWVdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQ2hlY2sgaWYgY29udHJvbE9wdGlvbnMgYXJlIGRlZmluZWQgaW4gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgY29uc3QgY29udHJvbE9wdGlvbnMgPSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gPyBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYmFzZUFic3RyYWN0Q29udHJvbE9wdGlvbnMgOiBudWxsO1xyXG4gICAgICAgIGlmIChjb250cm9sT3B0aW9ucyAmJiBjb250cm9sT3B0aW9uc1tuYW1lXSkge1xyXG4gICAgICAgICAgICAvKiBVcGRhdGUgdXBkYXRlT24gb3B0aW9uIGZyb20gY29udHJvbE9wdGlvbnMgaWYgZGVmaW5lZCAqL1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbE9wdGlvbnNbbmFtZV0udXBkYXRlT24pIHtcclxuICAgICAgICAgICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnMudXBkYXRlT24gPSBjb250cm9sT3B0aW9uc1tuYW1lXS51cGRhdGVPbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQWRkIHZhbGlkYXRvcnMgZnJvbSBjb250cm9sT3B0aW9ucyBpZiBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VmFsaWRhdG9yRm5bXT5jb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh2YWxpZGF0b3IgPT4gKDxWYWxpZGF0b3JGbltdPmFic3RyYWN0Q29udHJvbE9wdGlvbnMudmFsaWRhdG9ycykucHVzaCh2YWxpZGF0b3IpKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAoPFZhbGlkYXRvckZuW10+YWJzdHJhY3RDb250cm9sT3B0aW9ucy52YWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucHVzaCg8VmFsaWRhdG9yRm4+Y29udHJvbE9wdGlvbnNbbmFtZV0udmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIEFkZCBhc3luYyB2YWxpZGF0b3JzIGZyb20gY29udHJvbE9wdGlvbnMgaWYgZGVmaW5lZCAqL1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbE9wdGlvbnNbbmFtZV0uYXN5bmNWYWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250cm9sT3B0aW9uc1tuYW1lXS5hc3luY1ZhbGlkYXRvcnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxWYWxpZGF0b3JGbltdPmNvbnRyb2xPcHRpb25zW25hbWVdLmFzeW5jVmFsaWRhdG9ycylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2godmFsaWRhdG9yID0+ICg8VmFsaWRhdG9yRm5bXT5hYnN0cmFjdENvbnRyb2xPcHRpb25zLmFzeW5jVmFsaWRhdG9ycykucHVzaCh2YWxpZGF0b3IpKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAoPFZhbGlkYXRvckZuW10+YWJzdHJhY3RDb250cm9sT3B0aW9ucy5hc3luY1ZhbGlkYXRvcnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wdXNoKDxWYWxpZGF0b3JGbj5jb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFic3RyYWN0Q29udHJvbE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdmVycmlkZXMgYSBwcm9wZXJ0eSBvbiB0aGUgZW50aXR5IG9iamVjdCB3aXRoIGN1c3RvbSBnZXR0ZXJzIGFuZCBzZXR0ZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IHdob3NlIHByb3BlcnR5IG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4uXHJcbiAgICAgKiBAcGFyYW0gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIG92ZXJyaWRkZW4uXHJcbiAgICAgKiBAcGFyYW0gZm9ybUdyb3VwIFRoZSBSeEZvcm1Hcm91cCBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb3ZlcnJpZGVQcm9wKGVudGl0eU9iamVjdDogYW55LCBwcm9wTmFtZTogc3RyaW5nLCBmb3JtR3JvdXA6IFJ4Rm9ybUdyb3VwKSB7XHJcbiAgICAgICAgLyogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGFuZCBjdXJyZW50IHZhbHVlICovXHJcbiAgICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5nZXRQcm90b3R5cGVPZihlbnRpdHlPYmplY3QpLCBwcm9wTmFtZSk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gZW50aXR5T2JqZWN0W3Byb3BOYW1lXTtcclxuICAgICAgICBsZXQgb2xkVmFsdWU6IGFueSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCBjdXN0b20gZ2V0dGVycyBhbmQgc2V0dGVycyAqL1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbnRpdHlPYmplY3QsIHByb3BOYW1lLCB7XHJcbiAgICAgICAgICAgIC8qIEN1c3RvbSBnZXR0ZXIgKi9cclxuICAgICAgICAgICAgZ2V0OiAoKSA9PiB7IHJldHVybiBkZXNjcmlwdG9yID8gZGVzY3JpcHRvci5nZXQhLmNhbGwoZW50aXR5T2JqZWN0KSA6IHZhbHVlIH0sXHJcbiAgICAgICAgICAgIC8qIEN1c3RvbSBzZXR0ZXIgKi9cclxuICAgICAgICAgICAgc2V0OiAodikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2O1xyXG4gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdmFsdWUgaGFzIGNoYW5nZWQgKi9cclxuICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSB2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQ2FsbCB0aGUgb3JpZ2luYWwgc2V0dGVyIGlmIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnNldCEuY2FsbChlbnRpdHlPYmplY3QsIHYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbCBpbiB0aGUgZm9ybSBncm91cCAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9ybUdyb3VwLmNoYW5naW5nICYmIGZvcm1Hcm91cC5jb250cm9sc1twcm9wTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BOYW1lXS5zZXRWYWx1ZSh2KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIG9sZCB2YWx1ZSAqL1xyXG4gICAgICAgICAgICAgICAgb2xkVmFsdWUgPSB2O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19
1028
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvZm9ybS12YWxpZGF0b3JzL3NlcnZpY2VzL3J4LWZvcm0tYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBNEMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkksT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZKLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBT3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFD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QUFDO29CQUM3QyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsMEJBQTBCO2dCQUMxQixRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDOzBIQXBwQ1EsYUFBYTs4SEFBYixhQUFhOzsyRkFBYixhQUFhO2tCQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbE9wdGlvbnMsIEFzeW5jVmFsaWRhdG9yRm4sIEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5pbXBvcnQgeyBBUlJBWV9QUk9QRVJUWSwgQk9PTEVBTiwgRlVOQ1RJT05fU1RSSU5HLCBNT0RFTCwgTlVNQkVSLCBPQkpFQ1RfUFJPUEVSVFksIE9CSkVDVF9TVFJJTkcsIFBST1BFUlRZLCBSWF9XRUJfVkFMSURBVE9SLCBTVFJJTkcgfSBmcm9tIFwiLi4vY29uc3RcIjtcclxuaW1wb3J0IHsgQVBQX1ZBTElEQVRPUlMgfSBmcm9tICcuLi9jb25zdC9hcHAtdmFsaWRhdG9ycy5jb25zdCc7XHJcbmltcG9ydCB7IEFubm90YXRpb25UeXBlcyB9IGZyb20gXCIuLi9jb3JlL2Fubm90YXRpb24tdHlwZXNcIjtcclxuaW1wb3J0IHsgZGVmYXVsdENvbnRhaW5lciB9IGZyb20gJy4uL2NvcmUvZGVmYXVsdC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzXCI7XHJcbmltcG9ydCB7IERlY29yYXRvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL2RlY29yYXRvci1jb25maWd1cmF0aW9uXCI7XHJcbmltcG9ydCB7IEluc3RhbmNlQ29udGFpbmVyIH0gZnJvbSBcIi4uL21vZGVscy9pbnN0YW5jZS1jb250YWluZXJcIjtcclxuaW1wb3J0IHsgSUFic3RyYWN0Q29udHJvbCB9IGZyb20gXCIuLi9tb2RlbHMvaW50ZXJmYWNlL2ktYWJzdHJhY3QtY29udHJvbFwiO1xyXG5pbXBvcnQgeyBBcHBGb3JtR3JvdXAgfSBmcm9tICcuLi9tb2RlbHMvaW50ZXJmYWNlL2ktZm9ybS1ncm91cCc7XHJcbmltcG9ydCB7IFByb3BWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9wcm9wLXZhbGlkYXRpb24tY29uZmlnXCI7XHJcbmltcG9ydCB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCIuLi9tb2RlbHMvcHJvcGVydHktaW5mb1wiO1xyXG5pbXBvcnQgeyBhbmRWYWxpZGF0b3IgfSBmcm9tICcuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvYW5kLnZhbGlkYXRvcic7XHJcbmltcG9ydCB7IGNvbmRpdGlvbmFsQ2hhbmdlVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9jb25kaXRpb25hbC1jaGFuZ2UudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7IG5vdFZhbGlkYXRvciB9IGZyb20gJy4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9ub3QudmFsaWRhdG9yJztcclxuaW1wb3J0IHsgb3JWYWxpZGF0b3IgfSBmcm9tICcuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvb3IudmFsaWRhdG9yJztcclxuaW1wb3J0IHsgVHlwZSB9IGZyb20gXCIuLi91dGlsXCI7XHJcbmltcG9ydCB7IExpbnEgfSBmcm9tICcuLi91dGlsL2xpbnEnO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1Db25maWcgfSBmcm9tICcuLi91dGlsL3JlYWN0aXZlLWZvcm0tY29uZmlnJztcclxuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tIFwiLi4vdXRpbC9yZWdleC12YWxpZGF0b3JcIjtcclxuaW1wb3J0IHsgQmFzZUZvcm1CdWlsZGVyIH0gZnJvbSAnLi9iYXNlLWZvcm0tYnVpbGRlcic7XHJcbmltcG9ydCB7IFJ4Rm9ybUNvbnRyb2wgfSBmcm9tICcuL2Zvcm0tY29udHJvbCc7XHJcbmltcG9ydCB7IFJ4Rm9ybUFycmF5IH0gZnJvbSAnLi9yeC1mb3JtLWFycmF5JztcclxuaW1wb3J0IHsgUnhGb3JtR3JvdXAgfSBmcm9tICcuL3J4LWZvcm0tZ3JvdXAnO1xyXG5cclxuY29uc3QgTE9HSUNBTF9WQUxJREFUT1JTOiB7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB7IGFuZDogYW5kVmFsaWRhdG9yLCBvcjogb3JWYWxpZGF0b3IsIG5vdDogbm90VmFsaWRhdG9yIH1cclxuY29uc3QgQVNZTkM6IHN0cmluZyA9IFwiYXN5bmNcIlxyXG5jb25zdCBFTlRJVFlfT0JKRUNUOiBzdHJpbmcgPSBcImVudGl0eU9iamVjdFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUnhGb3JtQnVpbGRlciBleHRlbmRzIEJhc2VGb3JtQnVpbGRlciB7XHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEFycmF5IHRvIHN0b3JlIGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uZGl0aW9uYWxPYmplY3RQcm9wczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IE9iamVjdCB0byBzdG9yZSBjb25kaXRpb25hbCB2YWxpZGF0aW9uIGluc3RhbmNlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlOiBhbnkgPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEFycmF5IHRvIHN0b3JlIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IE9iamVjdCB0byBzdG9yZSBmb3JtIGdyb3VwIHByb3BlcnRpZXMgb3RoZXIgdmFsaWRhdG9yc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBmaWVsZDogT2JqZWN0IHRvIHN0b3JlIGN1cnJlbnQgZm9ybSBncm91cCBwcm9wZXJ0aWVzIG90aGVyIHZhbGlkYXRvcnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBmb3JtIGlzIG5lc3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzTmVzdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBmb3JtIGdyb3VwIGlzIGNhbGxlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzR3JvdXBDYWxsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGZvcm0gaXMgbmVzdGVkIGJpbmRpbmdcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc05lc3RlZEJpbmRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kOiBHZXRzIHRoZSBpbnN0YW5jZSBjb250YWluZXIgYmFzZWQgb24gdGhlIGluc3RhbmNlIGZ1bmN0aW9uIGFuZCBlbnRpdHkgb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2VGdW5jIFRoZSBmdW5jdGlvbiB0byBwcm92aWRlIGFuIGluc3RhbmNlIGZyb20uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IHRvIHVzZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSBwcm92aWRlZCBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0SW5zdGFuY2VDb250YWluZXIoaW5zdGFuY2VGdW5jOiBhbnksIGVudGl0eU9iamVjdDogYW55KTogSW5zdGFuY2VDb250YWluZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhY2VQcm92aWRlcihpbnN0YW5jZUZ1bmMsIGVudGl0eU9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIG1ldGhvZDogRXh0cmFjdHMgZXhwcmVzc2lvbnMgZnJvbSB0aGUgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gZm9yIGR5bmFtaWMgdmFsaWRhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGV4dHJhY3RlZCBleHByZXNzaW9ucyBvciBudWxsLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV4dHJhY3RFeHByZXNzaW9ucyhmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb246IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSB8IG51bGwge1xyXG4gICAgICAgIC8qIFxyXG4gICAgICAgICAqIEV4dHJhY3RzIGV4cHJlc3Npb25zIGZyb20gdGhlIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uIGZvciBkeW5hbWljIHZhbGlkYXRpb24uXHJcbiAgICAgICAgICogSWYgZHluYW1pYyB2YWxpZGF0aW9uIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggcHJvcGVydHkgYW5kIGRlY29yYXRvci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGRlY29yYXRvciBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb25bcHJvcGVydHldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2tzIGlmIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBleGlzdHMgZm9yIHRoZSBjdXJyZW50IGRlY29yYXRvciAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uIGFzIGFueSlbcHJvcGVydHldW2RlY29yYXRvcl0uY29uZGl0aW9uYWxFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgY29sdW1ucyBmcm9tIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW5zID0gTGlucS5leHByZXNzaW9uQ29sdW1ucygoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uIGFzIGFueSlbcHJvcGVydHldW2RlY29yYXRvcl0uY29uZGl0aW9uYWxFeHByZXNzaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBjaGFuZ2UgdmFsaWRhdGlvbiBiYXNlZCBvbiB0aGUgZXh0cmFjdGVkIGNvbHVtbiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmFkZENoYW5nZVZhbGlkYXRpb24odGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSwgcHJvcGVydHksIGNvbHVtbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQWRkcyBhc3luYyB2YWxpZGF0aW9uIHRvIHRoZSBwcm9wZXJ0eSBiYXNlZCBvbiBwcm92aWRlZCB2YWxpZGF0b3JzIGFuZCBjb25maWd1cmF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGluZm9ybWF0aW9uLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5VmFsaWRhdG9ycyBUaGUgYXJyYXkgb2YgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0gcHJvcFZhbGlkYXRpb25Db25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHZhbGlkYXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3JzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkZEFzeW5jVmFsaWRhdGlvbihwcm9wZXJ0eTogUHJvcGVydHlJbmZvLCBwcm9wZXJ0eVZhbGlkYXRvcnM6IERlY29yYXRvckNvbmZpZ3VyYXRpb25bXSwgcHJvcFZhbGlkYXRpb25Db25maWc6IFByb3BWYWxpZGF0aW9uQ29uZmlnKSB7XHJcbiAgICAgICAgLyogQ29sbGVjdHMgYXN5bmMgdmFsaWRhdG9ycyBmcm9tIHByb3BlcnR5IHZhbGlkYXRvcnMgYW5kIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGxldCBhc3luY1ZhbGlkYXRvcnM6IGFueVtdID0gW107XHJcbiAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggcHJvcGVydHkgdmFsaWRhdG9ycyAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wZXJ0eVZhbGlkYXRvciBvZiBwcm9wZXJ0eVZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3IgaXMgYXN5bmMgKi9cclxuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRvci5pc0FzeW5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogUHVzaCBlYWNoIGFzeW5jIHZhbGlkYXRvciBpbnRvIHRoZSBhc3luY1ZhbGlkYXRvcnMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcuZm9yRWFjaCgodDogYW55KSA9PiB7IGFzeW5jVmFsaWRhdG9ycy5wdXNoKHQpIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvcFZhbGlkYXRpb25Db25maWcgJiYgKHByb3BWYWxpZGF0aW9uQ29uZmlnIGFzIGFueSlbQVNZTkNdKSB7XHJcbiAgICAgICAgICAgIC8qIEFkZCBhc3luYyB2YWxpZGF0b3JzIGZyb20gcHJvcFZhbGlkYXRpb25Db25maWcgKi9cclxuICAgICAgICAgICAgKHByb3BWYWxpZGF0aW9uQ29uZmlnIGFzIGFueSlbQVNZTkNdLmZvckVhY2goKHQ6IGFueSkgPT4geyBhc3luY1ZhbGlkYXRvcnMucHVzaCh0KSB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFzeW5jVmFsaWRhdG9ycztcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBZGRzIGZvcm0gY29udHJvbCB2YWxpZGF0b3JzIGJhc2VkIG9uIHByb3BlcnR5IHZhbGlkYXRvcnMgYW5kIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBpbmZvcm1hdGlvbi5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eVZhbGlkYXRvcnMgVGhlIGFycmF5IG9mIGRlY29yYXRvciBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHByb3BWYWxpZGF0aW9uQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSB2YWxpZGF0aW9uLlxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlIFRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgb2JqZWN0LlxyXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZm9ybSBjb250cm9sIHZhbGlkYXRvcnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWRkRm9ybUNvbnRyb2wocHJvcGVydHk6IFByb3BlcnR5SW5mbywgcHJvcGVydHlWYWxpZGF0b3JzOiBEZWNvcmF0b3JDb25maWd1cmF0aW9uW10sIHByb3BWYWxpZGF0aW9uQ29uZmlnOiBQcm9wVmFsaWRhdGlvbkNvbmZpZywgaW5zdGFuY2U6IEluc3RhbmNlQ29udGFpbmVyLCBlbnRpdHk6IGFueSkge1xyXG4gICAgICAgIGxldCB2YWxpZGF0b3JzID0gW107XHJcbiAgICAgICAgbGV0IGNvbHVtbnM6IGFueVtdID0gW107XHJcbiAgICAgICAgLyogQ2hlY2sgaWYgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBwcm9wcyBhcmUgZGVmaW5lZCBlaXRoZXIgaW4gaW5zdGFuY2Ugb3IgY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgKi9cclxuICAgICAgICBpZiAoKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKSB8fCAodGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyAmJiB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAvKiBDb2xsZWN0cyBjb25kaXRpb25hbCB2YWxpZGF0aW9uIHByb3BlcnRpZXMgZnJvbSBpbnN0YW5jZSBhbmQgY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgYW5kIGFkZHMgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBsZXQgcHJvcHM6IGFueVtdID0gW107XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiBjb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcmUgZGVmaW5lZCBpbiBpbnN0YW5jZSBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgIGlmICgoaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgJiYgaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHkubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXS5mb3JFYWNoKHQgPT4gcHJvcHMucHVzaCh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzIGFyZSBkZWZpbmVkIGluIGNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgJiYgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXS5mb3JFYWNoKCh0OiBhbnkpID0+IHByb3BzLnB1c2godCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goY29uZGl0aW9uYWxDaGFuZ2VWYWxpZGF0b3IocHJvcHMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgb3IgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGFyZSBkZWZpbmVkICovXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5sZW5ndGggPiAwIHx8IHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb3BDb25kaXRpb25zID0gW107XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiBjb25kaXRpb25hbE9iamVjdFByb3BzIGlzIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgZm9yIHByb3BlcnRpZXMgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgcHJvcGVydHkgbmFtZSAqL1xyXG4gICAgICAgICAgICAgICAgcHJvcENvbmRpdGlvbnMgPSB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKHQgPT4gdC5wcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGlzIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGZvciBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IG5hbWUgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcih0ID0+IHQucHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSkuZm9yRWFjaCh0ID0+IHByb3BDb25kaXRpb25zLnB1c2godCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwcm9wQ29uZGl0aW9ucy5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgLyogQWRkIHJlZmVyZW5jZSBwcm9wZXJ0eSBuYW1lIHRvIGNvbHVtbnMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgIGlmICh0LnJlZmVyZW5jZVByb3BOYW1lICYmIGNvbHVtbnMuaW5kZXhPZih0LnJlZmVyZW5jZVByb3BOYW1lKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaCh0LnJlZmVyZW5jZVByb3BOYW1lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goY29uZGl0aW9uYWxDaGFuZ2VWYWxpZGF0b3IoY29sdW1ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggcHJvcGVydHkgdmFsaWRhdG9ycyAqL1xyXG4gICAgICAgIGZvciAobGV0IHByb3BlcnR5VmFsaWRhdG9yIG9mIHByb3BlcnR5VmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdG9yLmlzQXN5bmMpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHlWYWxpZGF0b3IuYW5ub3RhdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcnVsZSB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlcy5ydWxlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goQVBQX1ZBTElEQVRPUlNbcHJvcGVydHlWYWxpZGF0b3IuYW5ub3RhdGlvblR5cGVdKHByb3BlcnR5VmFsaWRhdG9yLmNvbmZpZywgZW50aXR5KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBBZGQgbG9naWNhbCB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlcy5hbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMub3I6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMubm90OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goTE9HSUNBTF9WQUxJREFUT1JTW3Byb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlXShwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qIEFkZCBjdXN0b20gdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEFQUF9WQUxJREFUT1JTW3Byb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlXShwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmcm9tIHByb3BWYWxpZGF0aW9uQ29uZmlnICovXHJcbiAgICAgICAgaWYgKHByb3BWYWxpZGF0aW9uQ29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkaXRpb25hbFZhbGlkYXRpb24odmFsaWRhdG9ycywgcHJvcFZhbGlkYXRpb25Db25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZyb20gY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdLmZvckVhY2goKHQ6IGFueSkgPT4geyB2YWxpZGF0b3JzLnB1c2godCk7IH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQWRkcyBhZGRpdGlvbmFsIHZhbGlkYXRpb24gdG8gdGhlIHZhbGlkYXRpb25zIGFycmF5IGJhc2VkIG9uIHByb3BWYWxpZGF0aW9uQ29uZmlnLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbnMgQW4gYXJyYXkgb2YgZXhpc3RpbmcgdmFsaWRhdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0gcHJvcFZhbGlkYXRpb25Db25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHZhbGlkYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWRkaXRpb25hbFZhbGlkYXRpb24odmFsaWRhdGlvbnM6IGFueVtdLCBwcm9wVmFsaWRhdGlvbkNvbmZpZzogUHJvcFZhbGlkYXRpb25Db25maWcgfCBhbnkpIHtcclxuICAgICAgICBmb3IgKHZhciBjb2wgaW4gQW5ub3RhdGlvblR5cGVzKSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IGFubm90YXRpb24gdHlwZSBleGlzdHMgYW5kIGl0J3Mgbm90IGEgY3VzdG9tIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBpZiAocHJvcFZhbGlkYXRpb25Db25maWdbQW5ub3RhdGlvblR5cGVzW2NvbF1dICYmIGNvbCAhPSBcImN1c3RvbVwiKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBBZGQgdmFsaWRhdG9yIGZyb20gQVBQX1ZBTElEQVRPUlMgKi9cclxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25zLnB1c2goQVBQX1ZBTElEQVRPUlNbQW5ub3RhdGlvblR5cGVzW2NvbF1dKHByb3BWYWxpZGF0aW9uQ29uZmlnW0Fubm90YXRpb25UeXBlc1tjb2xdXSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBhbm5vdGF0aW9uIHR5cGUgaXMgY3VzdG9tIGFuZCB0aGUgY3VzdG9tIHZhbGlkYXRvciBleGlzdHMgaW4gdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgICAgICBlbHNlIGlmIChjb2wgPT0gQW5ub3RhdGlvblR5cGVzLmN1c3RvbSAmJiBwcm9wVmFsaWRhdGlvbkNvbmZpZ1tBbm5vdGF0aW9uVHlwZXNbY29sXV0pIHtcclxuICAgICAgICAgICAgICAgIC8qIEFkZCBjdXN0b20gdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKHByb3BWYWxpZGF0aW9uQ29uZmlnW2NvbF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBlbnRpdHkgdHlwZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgb2JqZWN0IGFuZCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGZvciB3aGljaCB0aGUgZW50aXR5IHR5cGUgaXMgcmV0cmlldmVkLlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIGlzU2FtZU9iamVjdENvbnN0cnVjdG9yIEluZGljYXRlcyBpZiB0aGUgZW50aXR5IHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yLlxyXG4gICAgICogQHJldHVybnMgVGhlIGVudGl0eSB0eXBlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEVudGl0eTxUPihvYmplY3Q6IFQsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXNTYW1lT2JqZWN0Q29uc3RydWN0b3I6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSBlbnRpdHkgdHlwZSBpcyBkZWZpbmVkIGluIHRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmdlbmVyaWNFbnRpdGllcyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZ2VuZXJpY0VudGl0aWVzW3Byb3BlcnR5TmFtZV0pIHtcclxuICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBlbnRpdHkgdHlwZSBmcm9tIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUgKi9cclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5nZW5lcmljRW50aXRpZXNbcHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHVybiB0aGUgb2JqZWN0J3MgY29uc3RydWN0b3IgaWYgaXNTYW1lT2JqZWN0Q29uc3RydWN0b3IgaXMgdHJ1ZSAqL1xyXG4gICAgICAgIHJldHVybiBpc1NhbWVPYmplY3RDb25zdHJ1Y3RvciA/IG9iamVjdCEuY29uc3RydWN0b3IgOiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBvYmplY3QgcHJvcGVydHkgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9iamVjdCBhbmQgcHJvcGVydHkgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUluZm8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEByZXR1cm5zIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgb2JqZWN0IHByb3BlcnR5IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldE9iamVjdFByb3BlcnR5SW5zdGFuY2Uob2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBwcm9wZXJ0eUluZm86IFByb3BlcnR5SW5mbywgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgdHlwZSBpcyBPQkpFQ1RfUFJPUEVSVFkgYW5kIHRoZSBwcm9wZXJ0eSBleGlzdHMgaW4gdGhlIG9iamVjdCAqL1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8ucHJvcGVydHlUeXBlID09IE9CSkVDVF9QUk9QRVJUWSAmJiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdKSB7XHJcbiAgICAgICAgICAgIC8qIFJldHVybiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIG9iamVjdCBwcm9wZXJ0eSBpZiBpdCBleGlzdHMgKi9cclxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdFtwcm9wZXJ0eUluZm8ubmFtZV0uY29uc3RydWN0b3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgdHlwZSBpcyBBUlJBWV9QUk9QRVJUWSBhbmQgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgY29udGFpbnMgaXRlbXMgaW4gdGhlIG9iamVjdCAqL1xyXG4gICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SW5mby5wcm9wZXJ0eVR5cGUgPT0gQVJSQVlfUFJPUEVSVFkgJiYgb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXSAmJiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgcHJvcGVydHkgaWYgaXQgZXhpc3RzICovXHJcbiAgICAgICAgICAgIHJldHVybiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdWzBdLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogUmV0dXJuIHRoZSBlbnRpdHkgdHlwZSBiYXNlZCBvbiB0aGUgb2JqZWN0IGFuZCBwcm9wZXJ0eSBpbmZvcm1hdGlvbiAqL1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEVudGl0eShvYmplY3QsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgcHJvcGVydHlJbmZvLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGZvciBhZGRpdGlvbmFsIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbnMgZm9yIG9iamVjdCBwcm9wZXJ0aWVzIGluIHRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZUNvbnRhaW5lciBUaGUgY29udGFpbmVyIGZvciB0aGUgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9ucy5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGJ1aWxkZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2hlY2tPYmplY3RQcm9wQWRkaXRpb25hbFZhbGlkYXRpb248VD4oaW5zdGFuY2VDb250YWluZXI6IEluc3RhbmNlQ29udGFpbmVyLCBvYmplY3Q6IFQsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgLyogRmlsdGVyIHByb3BlcnRpZXMgb2YgdHlwZSBPQkpFQ1RfUFJPUEVSVFkgb3IgQVJSQVlfUFJPUEVSVFkgKi9cclxuICAgICAgICB2YXIgcHJvcHMgPSBpbnN0YW5jZUNvbnRhaW5lci5wcm9wZXJ0aWVzPy5maWx0ZXIodCA9PiB0LnByb3BlcnR5VHlwZSA9PSBPQkpFQ1RfUFJPUEVSVFkgfHwgdC5wcm9wZXJ0eVR5cGUgPT0gQVJSQVlfUFJPUEVSVFkpO1xyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGZpbHRlcmVkIHByb3BlcnRpZXMgKi9cclxuICAgICAgICBwcm9wcz8uZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IGVudGl0eSA9IHQuZW50aXR5O1xyXG5cclxuICAgICAgICAgICAgLyogSWYgZW50aXR5IHR5cGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHByb3BlcnR5LCByZXRyaWV2ZSBpdCBmcm9tIHRoZSBvYmplY3QgKi9cclxuICAgICAgICAgICAgaWYgKCF0LmVudGl0eSlcclxuICAgICAgICAgICAgICAgIGVudGl0eSA9IHRoaXMuZ2V0T2JqZWN0UHJvcGVydHlJbnN0YW5jZShvYmplY3QhLCB0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZUNvbnRhaW5lcihlbnRpdHksIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGluc3RhbmNlIGV4aXN0cyBhbmQgaGFzIGNvbmRpdGlvbmFsIHZhbGlkYXRpb24gcHJvcGVydGllcyAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydGllcz8uZmlsdGVyKHQgPT4gdC5uYW1lID09IGtleSlbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBjb25kaXRpb25hbCB2YWxpZGF0aW9uIHByb3BlcnRpZXMgaW4gaW5zdGFuY2UgY29udGFpbmVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzID0ge307XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW2tleV0gPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucHJvcGVydHlUeXBlICE9IEFSUkFZX1BST1BFUlRZKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcyBhbnkpW2tleV0ucHVzaChbdC5uYW1lLCB4XS5qb2luKCcuJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcyBhbnkpW2tleV0ucHVzaChbdC5uYW1lLCB4XS5qb2luKCdbXScpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgY29udGFpbmluZyBtb2RlbCwgZW50aXR5T2JqZWN0LCBhbmQgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIGJlIHVzZWQgZm9yIG9iamVjdCBjb25zdHJ1Y3Rpb24uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IHRvIGJlIHVzZWQuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZm9ybSBidWlsZGVyLlxyXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgbW9kZWwsIGVudGl0eU9iamVjdCwgYW5kIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYmplY3QobW9kZWw6IGFueSB8IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGVudGl0eU9iamVjdD86IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbj86IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgICAgIC8qIEluaXRpYWxpemVzIGFuIGVtcHR5IG9iamVjdCB0byBzdG9yZSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiAqL1xyXG4gICAgICAgIGxldCBqc29uOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYSBmdW5jdGlvbiAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gRlVOQ1RJT05fU1RSSU5HKSB7XHJcbiAgICAgICAgICAgIGpzb24ubW9kZWwgPSBtb2RlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYSBmdW5jdGlvbiBhbmQgZW50aXR5T2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gRlVOQ1RJT05fU1RSSU5HICYmIChlbnRpdHlPYmplY3QgaW5zdGFuY2VvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pKSB7XHJcbiAgICAgICAgICAgIC8qIENyZWF0ZXMgdGhlIGVudGl0eSBvYmplY3QgdXNpbmcgY3JlYXRlQ2xhc3NPYmplY3QgbWV0aG9kICovXHJcbiAgICAgICAgICAgIGpzb24uZW50aXR5T2JqZWN0ID0gdGhpcy5jcmVhdGVDbGFzc09iamVjdChqc29uLm1vZGVsLCBlbnRpdHlPYmplY3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQ2hlY2tzIGlmIGVudGl0eU9iamVjdCBleGlzdHMgYW5kIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBpZiAoZW50aXR5T2JqZWN0ICYmICEoZW50aXR5T2JqZWN0IGluc3RhbmNlb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSkge1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IGVudGl0eU9iamVjdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiBlbnRpdHlPYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGFuZCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gaXMgbm90IHByb3ZpZGVkICovXHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiAhZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uID0gZW50aXR5T2JqZWN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKiBDaGVja3MgaWYgZW50aXR5T2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gYW5kIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBpcyBwcm92aWRlZCAqL1xyXG4gICAgICAgIGVsc2UgaWYgKCEoZW50aXR5T2JqZWN0IGluc3RhbmNlb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAgICAgLyogU2V0cyB0aGUgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGluIHRoZSBKU09OICovXHJcbiAgICAgICAgICAgIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uID0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uO1xyXG4gICAgICAgICAgICAvKiBDcmVhdGVzIHRoZSBlbnRpdHkgb2JqZWN0IHVzaW5nIGNyZWF0ZUNsYXNzT2JqZWN0IG1ldGhvZCAqL1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IHRoaXMuY3JlYXRlQ2xhc3NPYmplY3QoanNvbi5tb2RlbCwganNvbi5mb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGpzb24uZW50aXR5T2JqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIElmIGVudGl0eU9iamVjdCBkb2VzIG5vdCBleGlzdCAqL1xyXG4gICAgICAgIGlmICghZW50aXR5T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gT0JKRUNUX1NUUklORykge1xyXG4gICAgICAgICAgICAgICAgLyogU3RvcmVzIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbW9kZWwgKi9cclxuICAgICAgICAgICAgICAgIGpzb24ubW9kZWwgPSBtb2RlbC5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQ3JlYXRlcyB0aGUgZW50aXR5IG9iamVjdCB1c2luZyBjcmVhdGVDbGFzc09iamVjdCBtZXRob2QgKi9cclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3QgPSB0aGlzLmNyZWF0ZUNsYXNzT2JqZWN0KGpzb24ubW9kZWwsIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBtb2RlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIElmIGVudGl0eU9iamVjdCBleGlzdHMgYW5kIGlzIGFuIGluc3RhbmNlIG9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBhbmQgbW9kZWwgaXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgZWxzZSBpZiAobW9kZWwgJiYgKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikgJiYgKHR5cGVvZiBtb2RlbCA9PSBPQkpFQ1RfU1RSSU5HKSkge1xyXG4gICAgICAgICAgICAvKiBTdG9yZXMgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBtb2RlbCAqL1xyXG4gICAgICAgICAgICBqc29uW01PREVMXSA9IG1vZGVsLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAvKiBDcmVhdGVzIHRoZSBlbnRpdHkgb2JqZWN0IHVzaW5nIGNyZWF0ZUNsYXNzT2JqZWN0IG1ldGhvZCAqL1xyXG4gICAgICAgICAgICBqc29uW0VOVElUWV9PQkpFQ1RdID0gdGhpcy5jcmVhdGVDbGFzc09iamVjdChqc29uLm1vZGVsLCBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgbW9kZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogUmV0dXJucyB0aGUgY29uc3RydWN0ZWQgSlNPTiBvYmplY3QgKi9cclxuICAgICAgICByZXR1cm4ganNvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBmb3JtIGNvbnRyb2wgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCB2YWxpZGF0b3JzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgZm9ybSBjb250cm9sLlxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvcnMgQW4gYXJyYXkgb2Ygc3luY2hyb25vdXMgdmFsaWRhdG9ycy5cclxuICAgICAqIEBwYXJhbSBhc3luY1ZhbGlkYXRvcnMgQW4gYXJyYXkgb2YgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBJQWJzdHJhY3RDb250cm9sLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29udHJvbCh2YWx1ZT86IGFueSwgdmFsaWRhdG9ycz86IFZhbGlkYXRvckZuW10sIGFzeW5jVmFsaWRhdG9ycz86IEFzeW5jVmFsaWRhdG9yRm5bXSk6IElBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiBuZXcgUnhGb3JtQ29udHJvbCh2YWx1ZSwgeyB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzLCBhc3luY1ZhbGlkYXRvcnM6IGFzeW5jVmFsaWRhdG9ycyB9LCB7fSwge30sICcnLCBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgZm9ybSBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFuZCB2YWxpZGF0b3IgY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHZhbHVlcyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIGluaXRpYWxpemUgdGhlIGZvcm0gYXJyYXkuXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciB2YWxpZGF0b3JzLlxyXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgRm9ybUFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXJyYXkodmFsdWVzOiBbeyBba2V5OiBzdHJpbmddOiBhbnkgfV0sIHZhbGlkYXRvckNvbmZpZz86IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIC8qIENyZWF0ZXMgYSBGb3JtR3JvdXAgaW5zdGFuY2Ugd2l0aCBhIHNpbmdsZSBjb250cm9sIG5hbWVkIFwidGVtcFwiIGFuZCBhc3NpZ25zIGl0IHRvIGZvcm1BcnJheSAqL1xyXG4gICAgICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmdyb3VwKHsgdGVtcDogdmFsdWVzIH0sIHZhbGlkYXRvckNvbmZpZykuZ2V0KFwidGVtcFwiKSBhcyBGb3JtQXJyYXk7XHJcblxyXG4gICAgICAgIC8qIEluc3RhbnRpYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRm9ybUJ1aWxkZXIgKi9cclxuICAgICAgICB2YXIgZm9ybUJ1aWxkZXIgPSBuZXcgRm9ybUJ1aWxkZXIoKTtcclxuXHJcbiAgICAgICAgLyogQ3JlYXRlcyBhIEZvcm1BcnJheSBpbnN0YW5jZSB1c2luZyB0aGUgY29udHJvbHMgb2YgdGhlIEZvcm1Hcm91cCAqL1xyXG4gICAgICAgIHJldHVybiBmb3JtQnVpbGRlci5hcnJheShmb3JtQXJyYXkuY29udHJvbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGZvcm0gZ3JvdXAgd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwIG9iamVjdCBhbmQgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBncm91cE9iamVjdCBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncm91cC5cclxuICAgICAqIEBwYXJhbSB2YWxpZGF0b3JDb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHZhbGlkYXRvcnMuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBGb3JtR3JvdXAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBncm91cChncm91cE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgdmFsaWRhdG9yQ29uZmlnPzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTogRm9ybUdyb3VwIHtcclxuICAgICAgICAvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIG1vZGVsICovXHJcbiAgICAgICAgbGV0IG1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAvKiBJbml0aWFsaXplIGFuIGVtcHR5IG9iamVjdCBmb3IgdGhlIGVudGl0eSAqL1xyXG4gICAgICAgIGxldCBlbnRpdHlPYmplY3QgPSB7fTtcclxuXHJcbiAgICAgICAgLyogSW5pdGlhbGl6ZSBhbiBlbXB0eSBvYmplY3QgZm9yIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0ge307XHJcblxyXG4gICAgICAgIC8qIFNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yIHRvIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yO1xyXG5cclxuICAgICAgICAvKiBDcmVhdGUgdGhlIHZhbGlkYXRvciBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JGb3JtR3JvdXAoZ3JvdXBPYmplY3QsIGVudGl0eU9iamVjdCwgbW9kZWxJbnN0YW5jZSwgdmFsaWRhdG9yQ29uZmlnISk7XHJcblxyXG4gICAgICAgIC8qIFNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yIGJhY2sgdG8gZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3I7XHJcblxyXG4gICAgICAgIC8qIEZsYWcgdGhhdCBhIGdyb3VwIGlzIGJlaW5nIGNhbGxlZCAqL1xyXG4gICAgICAgIHRoaXMuaXNHcm91cENhbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qIENyZWF0ZSB0aGUgZm9ybSBncm91cCAqL1xyXG4gICAgICAgIGxldCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1Hcm91cChtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yLCBlbnRpdHlPYmplY3QsIHZhbGlkYXRvckNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qIFJlc2V0IGlzR3JvdXBDYWxsZWQgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuaXNHcm91cENhbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKiBSZXNldCBmb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHt9O1xyXG5cclxuICAgICAgICAvKiBSZXNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3I7XHJcblxyXG4gICAgICAgIC8qIFJlc2V0IGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0ge307XHJcblxyXG4gICAgICAgIC8qIFJldHVybiB0aGUgY3JlYXRlZCBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgcmV0dXJuIGZvcm1Hcm91cDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGFsbCBwcm9wZXJ0eSB2YWxpZGF0b3JzIHNwZWNpZmllZCBpbiB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gdG8gYSBnaXZlbiBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWVkLlxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgdmFsaWRhdGlvbi5cclxuICAgICAqIEBwYXJhbSBtb2RlbEluc3RhbmNlIFRoZSBpbnN0YW5jZSBvZiB0aGUgbW9kZWwuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lOiBzdHJpbmcsIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBtb2RlbEluc3RhbmNlOiBhbnkpIHtcclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gYW5kIGFwcGx5QWxsUHJvcHMgYXJyYXkgZXhpc3QgKi9cclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnICYmIHZhbGlkYXRvckNvbmZpZy5hcHBseUFsbFByb3BzKSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBleGNsdWRlUHJvcHMgYXJyYXkgZXhpc3RzIGFuZCBpZiB0aGUgcHJvcE5hbWUgaXMgbm90IGluIHRoZSBleGNsdWRlUHJvcHMgYXJyYXkgKi9cclxuICAgICAgICAgICAgaWYgKCEodmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcyAmJiB2YWxpZGF0b3JDb25maWcuZXhjbHVkZVByb3BzLmxlbmd0aCA+IDAgJiYgdmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcy5pbmRleE9mKHByb3BOYW1lKSA9PSAtMSkpIHtcclxuICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGl0ZW0gaW4gdGhlIGFwcGx5QWxsUHJvcHMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvckNvbmZpZy5hcHBseUFsbFByb3BzLmZvckVhY2goKHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24gaXMgYW4gUnhXZWIgdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQubmFtZSA9PSBSWF9XRUJfVkFMSURBVE9SKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IFJ4V2ViIHZhbGlkYXRvciB0byB0aGUgcHJvcE5hbWUgd2l0aCB0aGUgbW9kZWxJbnN0YW5jZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0KHByb3BOYW1lLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciBoYXMgYW4gZW50cnkgZm9yIHRoZSBwcm9wTmFtZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgY3JlYXRlIGFuIGVtcHR5IGFycmF5IGZvciB0aGUgcHJvcE5hbWUgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogUHVzaCB0aGUgY3VzdG9tIHZhbGlkYXRvciB0byB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdLnB1c2godCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQ2hlY2tzIGlmIGR5bmFtaWMgdmFsaWRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byBhIHByb3BlcnR5LlxyXG4gICAgICAqIFxyXG4gICAgICAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2suXHJcbiAgICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgdmFsaWRhdGlvbi5cclxuICAgICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGR5bmFtaWMgdmFsaWRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgcHJvcGVydHkuXHJcbiAgICAgICovXHJcbiAgICBwcml2YXRlIGR5bmFtaWNWYWxpZGF0aW9uUHJvcENoZWNrKHByb3BOYW1lOiBzdHJpbmcsIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuICh2YWxpZGF0b3JDb25maWcgPT0gdW5kZWZpbmVkKSA/IHRydWUgOiAoIXZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWUpID8gdHJ1ZSA6IHZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWUgPT0gcHJvcE5hbWUgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXHJcbiAgICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzTm90T2JqZWN0KHZhbHVlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPSBPQkpFQ1RfU1RSSU5HO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHZhbGlkYXRvciBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBncm91cE9iamVjdCBhbmQgYXBwbGllcyB2YWxpZGF0aW9uIHJ1bGVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBPYmplY3QgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSB0aGUgZm9ybSBncm91cC5cclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3QgdG8gc3RvcmUgdGhlIGZvcm0gZ3JvdXAuXHJcbiAgICAgKiBAcGFyYW0gbW9kZWxJbnN0YW5jZSBUaGUgbW9kZWwgaW5zdGFuY2UgdXNlZCBmb3IgaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSB2YWxpZGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVZhbGlkYXRvckZvcm1Hcm91cChncm91cE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZW50aXR5T2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBtb2RlbEluc3RhbmNlOiBhbnksIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgLyogSXRlcmF0ZXMgb3ZlciBlYWNoIHByb3BlcnR5IGluIHRoZSBncm91cE9iamVjdCB0byBjcmVhdGUgZm9ybSBjb250cm9scyBhbmQgYXBwbHkgdmFsaWRhdG9ycy4gKi9cclxuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBncm91cE9iamVjdCkge1xyXG4gICAgICAgICAgICB2YXIgcHJvcCA9IGdyb3VwT2JqZWN0W3Byb3BOYW1lXTtcclxuXHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBhcnJheSBhbmQgbmVlZHMgdmFsaWRhdGlvbiAqL1xyXG4gICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEFycmF5ICYmIHByb3AubGVuZ3RoID4gMCAmJiB0aGlzLmlzTm90T2JqZWN0KHByb3BbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcFZhbGlkYXRvcnMgPSAocHJvcC5sZW5ndGggPiAxICYmIHByb3BbMV0gaW5zdGFuY2VvZiBBcnJheSkgPyBwcm9wWzFdIDogKHByb3AubGVuZ3RoID09IDIpID8gW3Byb3BbMV1dIDogW107XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlBZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgb3ZlciBlYWNoIHZhbGlkYXRvciBmb3IgdGhlIGN1cnJlbnQgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFZhbGlkYXRvcnNbaV0ubmFtZSA9PSBSWF9XRUJfVkFMSURBVE9SKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BWYWxpZGF0b3JzW2ldKHByb3BOYW1lLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlBZGRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIG90aGVyIHZhbGlkYXRvcnMgdG8gdGhlIGN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0ucHVzaChwcm9wVmFsaWRhdG9yc1tpXSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgbm8gcHJvcGVydHkgdmFsaWRhdG9yIGFkZGVkLCBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvYmplY3QgKi9cclxuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHlBZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBQUk9QRVJUWSwgdW5kZWZpbmVkLCB0eXBlb2YgbW9kZWxJbnN0YW5jZSA9PSBPQkpFQ1RfU1RSSU5HID8gbW9kZWxJbnN0YW5jZSA6IHsgY29uc3RydWN0b3I6IG1vZGVsSW5zdGFuY2UgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogQXBwbHkgYWxsIHByb3BlcnR5IHZhbGlkYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lLCB2YWxpZGF0b3JDb25maWcsIG1vZGVsSW5zdGFuY2UpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCA9PT0gbnVsbCB8fCBwcm9wID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHByb3AgPT0gU1RSSU5HIHx8IHR5cGVvZiBwcm9wID09IE5VTUJFUiB8fCB0eXBlb2YgcHJvcCA9PSBCT09MRUFOIHx8IHByb3AgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvYmplY3QgaWYgaXQncyBhIHNpbXBsZSB0eXBlICovXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgUFJPUEVSVFksIHVuZGVmaW5lZCwgdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT0gT0JKRUNUX1NUUklORyA/IG1vZGVsSW5zdGFuY2UgOiB7IGNvbnN0cnVjdG9yOiBtb2RlbEluc3RhbmNlIH0pO1xyXG4gICAgICAgICAgICAgICAgLyogQXBwbHkgYWxsIHByb3BlcnR5IHZhbGlkYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lLCB2YWxpZGF0b3JDb25maWcsIG1vZGVsSW5zdGFuY2UpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhIEZvcm1BcnJheSwgYXNzaWduIGl0IGRpcmVjdGx5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYW4gYXJyYXkgb2Ygb2JqZWN0cywgY3JlYXRlIGZvcm0gY29udHJvbHMgcmVjdXJzaXZlbHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcE1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWxJbnN0YW5jZSA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3RvciA9IG1vZGVsSW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBhcyBhbiBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBBUlJBWV9QUk9QRVJUWSwgcHJvcE1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IsIG1vZGVsSW5zdGFuY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGFuIGVtcHR5IGFycmF5IGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcm93IG9mIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG9iamVjdCBmb3IgZWFjaCBlbGVtZW50ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqT2JqZWN0ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFB1c2ggdGhlIG5ldyBvYmplY3QgaW50byB0aGUgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5wdXNoKGpPYmplY3QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY3Vyc2l2ZWx5IGNyZWF0ZSB2YWxpZGF0b3IgZm9ybSBncm91cHMgZm9yIGVhY2ggb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yRm9ybUdyb3VwKHJvdywgak9iamVjdCwgcHJvcE1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IsIHZhbGlkYXRvckNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wID09IE9CSkVDVF9TVFJJTkcgJiYgIShwcm9wIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGZvcm1Hcm91cCBiYXNlZCBvbiB0aGUgdHlwZSBvZiAncHJvcCcgKi9cclxuICAgICAgICAgICAgICAgIGxldCBmb3JtR3JvdXA6IGFueSA9IChwcm9wIGluc3RhbmNlb2YgRm9ybUFycmF5KSA/IHByb3AuY29udHJvbHNbMF0gOiBwcm9wO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBhIEZvcm1Hcm91cCBvciBSeEZvcm1Hcm91cCBhbmQgZG9lcyBub3QgaGF2ZSBhIG1vZGVsLCBjcmVhdGUgYSBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1Hcm91cC5tb2RlbCAmJiAocHJvcCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwID0gdGhpcy5ncm91cChmb3JtR3JvdXAuY29udHJvbHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBhIEZvcm1Hcm91cCBvciBSeEZvcm1Hcm91cCwgaW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgYXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcDtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgT0JKRUNUX1BST1BFUlRZLCBmb3JtR3JvdXAubW9kZWwsIG1vZGVsSW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLyogSWYgJ3Byb3AnIGlzIGEgRm9ybUFycmF5LCBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBhcyBhbiBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBwcm9wO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBBUlJBWV9QUk9QRVJUWSwgZm9ybUdyb3VwLm1vZGVsLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBuZWl0aGVyIGEgRm9ybUdyb3VwL1J4Rm9ybUdyb3VwIG5vciBhIEZvcm1BcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgZHluYW1pYyB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5keW5hbWljVmFsaWRhdGlvblByb3BDaGVjayhwcm9wTmFtZSwgdmFsaWRhdG9yQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHByb3BlcnR5IGZvciBkeW5hbWljIHZhbGlkYXRpb24gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciB0byB0aGUgY3VycmVudCBwcm9wZXJ0eSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZm9yIHRoZSBwcm9wZXJ0eSBtb2RlbCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcE1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5jb25zdHJ1Y3RvciA9IHByb3BNb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgT0JKRUNUX1BST1BFUlRZLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLmNvbnN0cnVjdG9yLCBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09IEZ1bmN0aW9uID8geyBjb25zdHJ1Y3RvcjogbW9kZWxJbnN0YW5jZSB9IDogbW9kZWxJbnN0YW5jZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnID0gdGhpcy5nZXRWYWxpZGF0b3JDb25maWcodmFsaWRhdG9yQ29uZmlnLCBncm91cE9iamVjdCwgcHJvcE5hbWUgKyBcIi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWN1cnNpdmVseSBjcmVhdGUgdGhlIHZhbGlkYXRvciBmb3JtIGdyb3VwIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JGb3JtR3JvdXAoZ3JvdXBPYmplY3RbcHJvcE5hbWVdLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLmNvbnN0cnVjdG9yLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHByb3BlcnR5IHdpdGhvdXQgZHluYW1pYyB2YWxpZGF0aW9uICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBncm91cE9iamVjdFtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBvZiBzaW1wbGUgdHlwZSAqL1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT0gU1RSSU5HIHx8IHR5cGVvZiBwcm9wID09IE5VTUJFUiB8fCB0eXBlb2YgcHJvcCA9PSBCT09MRUFOIHx8IHByb3AgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhbiBhcnJheSBvciBvYmplY3QgKi9cclxuICAgICAgICAgICAgZWxzZSBpZiAoKHByb3AgJiYgcHJvcC5sZW5ndGggPiAwICYmIHRoaXMuaXNOb3RPYmplY3QocHJvcFswXSkgJiYgIShwcm9wIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpICYmICEocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFswXVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhIEZvcm1BcnJheSAqL1xyXG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhIEZvcm1Db250cm9sICovXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3BcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBQUk9QRVJUWSwgdW5kZWZpbmVkLCBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID8gbW9kZWxJbnN0YW5jZSA6IHsgY29uc3RydWN0b3I6IG1vZGVsSW5zdGFuY2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRvciBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGVudGl0eSBvYmplY3QgYW5kIHJvb3QgcHJvcGVydHkgbmFtZS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gdG8gcHJvY2Vzcy5cclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3QgZm9yIHdoaWNoIHRoZSB2YWxpZGF0b3IgY29uZmlndXJhdGlvbiBpcyBhcHBsaWVkLlxyXG4gICAgICogQHBhcmFtIHJvb3RQcm9wZXJ0eU5hbWUgVGhlIHJvb3QgcHJvcGVydHkgbmFtZSB0byBjb25zaWRlci5cclxuICAgICAqIEBwYXJhbSBhcnJheVByb3BlcnR5TmFtZSBPcHRpb25hbC4gVGhlIGFycmF5IHByb3BlcnR5IG5hbWUgdG8gY29uc2lkZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIHZhbGlkYXRvciBjb25maWd1cmF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JDb25maWc6IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgZW50aXR5T2JqZWN0OiBhbnksIHJvb3RQcm9wZXJ0eU5hbWU6IHN0cmluZywgYXJyYXlQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGxldCBleGNsdWRlUHJvcHM6IGFueVtdID0gW107XHJcbiAgICAgICAgbGV0IGluY2x1ZGVQcm9wczogYW55W10gPSBbXTtcclxuICAgICAgICBsZXQgaWdub3JlVW5kZWZpbmVkUHJvcHM6IGFueVtdID0gW107XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3JDb25maWcgZXhpc3RzICovXHJcbiAgICAgICAgaWYgKCF2YWxpZGF0b3JDb25maWcpIHJldHVybiB7fTtcclxuXHJcbiAgICAgICAgLyogUmV0cmlldmUgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzIGFuZCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgKi9cclxuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUHJvcHMgPSB0aGlzLmdldE9iamVjdEZvclByb3BlcnR5KHZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbiEsIHJvb3RQcm9wZXJ0eU5hbWUsIGFycmF5UHJvcGVydHlOYW1lKTtcclxuICAgICAgICBjb25zdCBhYnN0cmFjdENvbnRyb2xPcHRpb25zID0gdGhpcy5nZXRPYmplY3RGb3JQcm9wZXJ0eSh2YWxpZGF0b3JDb25maWcuYWJzdHJhY3RDb250cm9sT3B0aW9ucyEsIHJvb3RQcm9wZXJ0eU5hbWUsIGFycmF5UHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICAgICAgLyogUG9wdWxhdGUgZXhjbHVkZVByb3BzLCBpbmNsdWRlUHJvcHMsIGFuZCBpZ25vcmVVbmRlZmluZWRQcm9wcyBhcnJheXMgKi9cclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcykge1xyXG4gICAgICAgICAgICBleGNsdWRlUHJvcHMgPSB0aGlzLmdldFByb3BzKHZhbGlkYXRvckNvbmZpZy5leGNsdWRlUHJvcHMsIHJvb3RQcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbGlkYXRvckNvbmZpZy5pbmNsdWRlUHJvcHMpIHtcclxuICAgICAgICAgICAgaW5jbHVkZVByb3BzID0gdGhpcy5nZXRQcm9wcyh2YWxpZGF0b3JDb25maWcuaW5jbHVkZVByb3BzLCByb290UHJvcGVydHlOYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWxpZGF0b3JDb25maWcuaWdub3JlVW5kZWZpbmVkUHJvcHMpIHtcclxuICAgICAgICAgICAgaWdub3JlVW5kZWZpbmVkUHJvcHMgPSB0aGlzLmdldFByb3BzKHZhbGlkYXRvckNvbmZpZy5pZ25vcmVVbmRlZmluZWRQcm9wcywgcm9vdFByb3BlcnR5TmFtZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBBcHBlbmQgZ2xvYmFsIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBpZiBub3QgZm91bmQgKi9cclxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGFic3RyYWN0Q29udHJvbE9wdGlvbnMpLmxlbmd0aCAmJiByb290UHJvcGVydHlOYW1lLmVuZHNXaXRoKCcuJykgJiYgdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnMgJiYgdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbcm9vdFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgcm9vdFByb3BlcnR5TmFtZS5sZW5ndGggLSAxKV0pIHtcclxuICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9uc1snZ2xvYmFsJ10gPSB2YWxpZGF0b3JDb25maWcuYWJzdHJhY3RDb250cm9sT3B0aW9uc1tyb290UHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCByb290UHJvcGVydHlOYW1lLmxlbmd0aCAtIDEpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHJpZXZlIGR5bmFtaWMgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgY29uc3QgZHluYW1pY1ZhbGlkYXRpb24gPSAodmFsaWRhdG9yQ29uZmlnLmR5bmFtaWNWYWxpZGF0aW9uQ29uZmlndXJhdGlvblByb3BlcnR5TmFtZSAmJiBlbnRpdHlPYmplY3RbdmFsaWRhdG9yQ29uZmlnLmR5bmFtaWNWYWxpZGF0aW9uQ29uZmlndXJhdGlvblByb3BlcnR5TmFtZV0pID8gZW50aXR5T2JqZWN0W3ZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWVdIDogdmFsaWRhdGlvblByb3BzO1xyXG5cclxuICAgICAgICAvKiBSZXR1cm4gcHJvY2Vzc2VkIHZhbGlkYXRvciBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWdub3JlVW5kZWZpbmVkUHJvcHM6IGlnbm9yZVVuZGVmaW5lZFByb3BzLFxyXG4gICAgICAgICAgICBpbmNsdWRlUHJvcHM6IGluY2x1ZGVQcm9wcyxcclxuICAgICAgICAgICAgZHluYW1pY1ZhbGlkYXRpb246IGR5bmFtaWNWYWxpZGF0aW9uLFxyXG4gICAgICAgICAgICBleGNsdWRlUHJvcHM6IGV4Y2x1ZGVQcm9wcyxcclxuICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9uczogYWJzdHJhY3RDb250cm9sT3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgb2JqZWN0IHByb3BlcnRpZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCByb290IHByb3BlcnR5IG5hbWUgYW5kIGFycmF5IHByb3BlcnR5IG5hbWUgKGlmIHByb3ZpZGVkKS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHJvb3RPYmplY3QgVGhlIHJvb3Qgb2JqZWN0IHRvIHNlYXJjaCBmb3IgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSByb290UHJvcGVydHlOYW1lIFRoZSByb290IHByb3BlcnR5IG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSBhcnJheVByb3BlcnR5TmFtZSBPcHRpb25hbC4gVGhlIGFycmF5IHByb3BlcnR5IG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cclxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSByb290IHByb3BlcnR5IG5hbWUgYW5kIGFycmF5IHByb3BlcnR5IG5hbWUgKGlmIHByb3ZpZGVkKS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYmplY3RGb3JQcm9wZXJ0eTxUPihyb290T2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IFQgfSwgcm9vdFByb3BlcnR5TmFtZTogc3RyaW5nLCBhcnJheVByb3BlcnR5TmFtZT86IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogVCB9IHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogVCB9ID0ge307XHJcblxyXG4gICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcm9vdCBvYmplY3QgKi9cclxuICAgICAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiByb290T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIC8qIFNraXAgcHJvcGVydGllcyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgcm9vdFByb3BlcnR5TmFtZSBvciBhcnJheVByb3BlcnR5TmFtZSAqL1xyXG4gICAgICAgICAgICBpZiAoIXByb3BOYW1lLnN0YXJ0c1dpdGgocm9vdFByb3BlcnR5TmFtZSkgJiYgKCFhcnJheVByb3BlcnR5TmFtZSB8fCAhcHJvcE5hbWUuc3RhcnRzV2l0aChhcnJheVByb3BlcnR5TmFtZSkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogRXh0cmFjdCB0aGUgc3BsaXQgcHJvcGVydHkgbmFtZSAqL1xyXG4gICAgICAgICAgICBsZXQgc3BsaXRQcm9wID0gcHJvcE5hbWUuc3BsaXQoXCIuXCIsIDIpWzFdO1xyXG5cclxuICAgICAgICAgICAgLyogSWYgc3BsaXRQcm9wIGlzIHVuZGVmaW5lZCwgY29udGludWUgdG8gdGhlIG5leHQgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKCFzcGxpdFByb3ApIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSByZXN1bHQgb2JqZWN0ICovXHJcbiAgICAgICAgICAgIHJlc3VsdFtzcGxpdFByb3BdID0gcm9vdE9iamVjdFtwcm9wTmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHJvb3QgcHJvcGVydHkgbmFtZSBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBwcm9wZXJ0aWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgYXJyYXkgb2YgcHJvcGVydGllcyB0byBzZWFyY2guXHJcbiAgICAgKiBAcGFyYW0gcm9vdFByb3BlcnR5TmFtZSBUaGUgcm9vdCBwcm9wZXJ0eSBuYW1lIHRvIG1hdGNoIGFnYWluc3QuXHJcbiAgICAgKiBAcGFyYW0gaXNJZ25vcmVQcm9wIE9wdGlvbmFsLiBJbmRpY2F0ZXMgd2hldGhlciB0byBpbmNsdWRlIHRoZSByb290IHByb3BlcnR5IGl0c2VsZiBhcyBhIHByb3BlcnR5LlxyXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFByb3BzKHByb3BlcnRpZXM6IHN0cmluZ1tdLCByb290UHJvcGVydHlOYW1lOiBzdHJpbmcsIGlzSWdub3JlUHJvcDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IHByb3BzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgKi9cclxuICAgICAgICBmb3IgKGxldCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHByb3BlcnR5IGNvbnRhaW5zIHRoZSByb290UHJvcGVydHlOYW1lICovXHJcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2Yocm9vdFByb3BlcnR5TmFtZSkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGxpdFByb3BzID0gcHJvcC5zcGxpdChcIi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGhhcyB0d28gcGFydHMsIGFkZCB0aGUgc2Vjb25kIHBhcnQgdG8gdGhlIHByb3BzIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoc3BsaXRQcm9wcy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3BsaXRQcm9wc1sxXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGhhcyBtb3JlIHRoYW4gdHdvIHBhcnRzLCBqb2luIHRoZSBwYXJ0cyBhZnRlciB0aGUgZmlyc3Qgb25lIGFuZCBhZGQgdG8gdGhlIHByb3BzIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzcGxpdFByb3BzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzcGxpdFByb3BzLnNwbGljZSgwLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHNwbGl0UHJvcHMuam9pbihcIi5cIikpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIElmIGlzSWdub3JlUHJvcCBpcyB0cnVlIGFuZCB0aGUgcm9vdCBwcm9wZXJ0eSBpdHNlbGYgaXMgcHJlc2VudCBpbiB0aGUgcHJvcGVydGllcyBhcnJheSwgYWRkICc6c2VsZjonIHRvIHRoZSBwcm9wcyBhcnJheSAqL1xyXG4gICAgICAgIGlmIChpc0lnbm9yZVByb3AgJiYgcHJvcGVydGllcy5maWx0ZXIoeCA9PiB4ID09IHJvb3RQcm9wZXJ0eU5hbWUucmVwbGFjZSgnLicsICcnKSkubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgcHJvcHMucHVzaCgnOnNlbGY6Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgZm9ybSBncm91cCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbW9kZWwsIGVudGl0eSBvYmplY3QsIGFuZCBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBvciB0eXBlIGRlZmluaXRpb24gdG8gY3JlYXRlIHRoZSBmb3JtIGdyb3VwIGZyb20uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IE9wdGlvbmFsLiBUaGUgZW50aXR5IG9iamVjdCBmb3Igd2hpY2ggdGhlIGZvcm0gZ3JvdXAgaXMgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gT3B0aW9uYWwuIFRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiB0byBjdXN0b21pemUgdGhlIGZvcm0gZ3JvdXAgY3JlYXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBSeEZvcm1Hcm91cCwgRm9ybUdyb3VwLCBvciBBcHBGb3JtR3JvdXA8VD4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmb3JtR3JvdXA8VD4obW9kZWw6IFR5cGU8VD4gfCB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBlbnRpdHlPYmplY3Q/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24/OiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pOiBSeEZvcm1Hcm91cCB8IEZvcm1Hcm91cCB8IEFwcEZvcm1Hcm91cDxUPiB7XHJcbiAgICAgICAgLyogUmV0cmlldmVzIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIHByb3ZpZGVkIG1vZGVsLCBlbnRpdHkgb2JqZWN0LCBhbmQgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gdG8gY3JlYXRlIGEgZm9ybSBncm91cCAqL1xyXG4gICAgICAgIGxldCBqc29uID0gdGhpcy5nZXRPYmplY3QobW9kZWwsIGVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTtcclxuICAgICAgICBtb2RlbCA9IGpzb24ubW9kZWw7XHJcbiAgICAgICAgZW50aXR5T2JqZWN0ID0ganNvbi5lbnRpdHlPYmplY3Q7XHJcblxyXG4gICAgICAgIC8qIFxyXG4gICAgICAgICAqIElmIHRoZSBlbnRpdHkgb2JqZWN0J3MgY29uc3RydWN0b3IgZGlmZmVycyBmcm9tIHRoZSBtb2RlbCdzIGNvbnN0cnVjdG9yIGFuZCBmb3JtR3JvdXAgaXMgbm90IHByZXZpb3VzbHkgY2FsbGVkLFxyXG4gICAgICAgICAqIHVwZGF0ZSB0aGUgZW50aXR5IG9iamVjdCB0byBtYXRjaCB0aGUgbW9kZWwuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdCEuY29uc3RydWN0b3IgIT0gbW9kZWwgJiYgIXRoaXMuaXNHcm91cENhbGxlZCkge1xyXG4gICAgICAgICAgICBlbnRpdHlPYmplY3QgPSBqc29uLmVudGl0eU9iamVjdCA9IHRoaXMudXBkYXRlT2JqZWN0KG1vZGVsLCBqc29uLmVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gPSBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjtcclxuXHJcbiAgICAgICAgLyogRXh0cmFjdCBleHByZXNzaW9ucyBmcm9tIHRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBpZiBwcm92aWRlZC4gKi9cclxuICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdEV4cHJlc3Npb25zKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBHZXQgdGhlIGNvbnRhaW5lciBmb3IgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBtb2RlbCBhbmQgZW50aXR5IG9iamVjdC4gKi9cclxuICAgICAgICBsZXQgaW5zdGFuY2VDb250YWluZXI6IEluc3RhbmNlQ29udGFpbmVyID0gdGhpcy5nZXRJbnN0YW5jZUNvbnRhaW5lcihtb2RlbCwgZW50aXR5T2JqZWN0KTtcclxuXHJcbiAgICAgICAgLyogQ2hlY2sgYW5kIGFwcGx5IGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3Igb2JqZWN0IHByb3BlcnRpZXMuICovXHJcbiAgICAgICAgdGhpcy5jaGVja09iamVjdFByb3BBZGRpdGlvbmFsVmFsaWRhdGlvbihpbnN0YW5jZUNvbnRhaW5lciwgZW50aXR5T2JqZWN0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hKTtcclxuXHJcbiAgICAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIGZvcm0gZ3JvdXAgY3JlYXRpb24uICovXHJcbiAgICAgICAgbGV0IGZvcm1Hcm91cE9iamVjdCA9IHt9O1xyXG4gICAgICAgIGxldCBleHRlbmRlZFByb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICB2YXIgYWRkaXRpb25hbFZhbGlkYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IFByb3BWYWxpZGF0aW9uQ29uZmlnIH0gPSB7fTtcclxuXHJcbiAgICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgaW5zdGFuY2UgY29udGFpbmVyLiAqL1xyXG4gICAgICAgIGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnRpZXM/LmZvckVhY2gocHJvcGVydHkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXNJbmNsdWRlUHJvcCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGV4Y2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5leGNsdWRlUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmV4Y2x1ZGVQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5leGNsdWRlUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSA9PSAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBkeW5hbWljIHZhbGlkYXRpb24gaXMgcHJvdmlkZWQgaW4gdGhlIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxWYWxpZGF0aW9ucyA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pbmNsdWRlUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmluY2x1ZGVQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pbmNsdWRlUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSAhPSAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB1bmRlZmluZWQgcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi4gKi9cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmlnbm9yZVVuZGVmaW5lZFByb3BzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0luY2x1ZGVQcm9wID0gIShcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkucHJvcGVydHlUeXBlID09IFBST1BFUlRZICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFSZWdleFZhbGlkYXRvci5pc05vdEJsYW5rKGpzb24uZW50aXR5T2JqZWN0W3Byb3BlcnR5Lm5hbWVdKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSAhPT0gLTEgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pZ25vcmVVbmRlZmluZWRQcm9wcy5pbmRleE9mKFwiOnNlbGY6XCIpICE9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmlnbm9yZSkge1xyXG4gICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9ICFwcm9wZXJ0eS5pZ25vcmUuY2FsbChqc29uLmVudGl0eU9iamVjdCwganNvbi5lbnRpdHlPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkLCBjcmVhdGUgZm9ybSBjb250cm9scywgZm9ybSBncm91cHMsIG9yIGZvcm0gYXJyYXlzIGJhc2VkIG9uIGl0cyB0eXBlLiAqL1xyXG4gICAgICAgICAgICBpZiAoaXNJbmNsdWRlUHJvcCkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBST1BFUlRZOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGFscmVhZHkgYSBmb3JtIGNvbnRyb2wsIGNyZWF0ZSBvbmUgd2l0aCBhcHByb3ByaWF0ZSB2YWxpZGF0b3JzIGFuZCBvcHRpb25zICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSBpbnN0YW5jZW9mIEZvcm1Db250cm9sIHx8IChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IHByb3BlcnR5IHZhbGlkYXRvcnMgYmFzZWQgb24gYW5ub3RhdGlvbnMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlWYWxpZGF0b3JzID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydHlBbm5vdGF0aW9ucy5maWx0ZXIodCA9PiB0LnByb3BlcnR5TmFtZSA9PSBwcm9wZXJ0eS5uYW1lICYmIHQuaXNWYWxpZGF0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgdXBkYXRlT24gY29uZmlndXJhdGlvbiBiYXNlZCBvbiBhbm5vdGF0aW9ucy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVPbiA9IGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnR5QW5ub3RhdGlvbnMuZmlsdGVyKHQgPT4gdC5wcm9wZXJ0eU5hbWUgPT0gcHJvcGVydHkubmFtZSAmJiAhdC5pc1ZhbGlkYXRvciAmJiB0LmFubm90YXRpb25UeXBlID09PSBcInVwZGF0ZU9uXCIpWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbml0aXplIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzYW5pdGl6ZVZhbHVlID0gc3VwZXIuc2FuaXRpemVWYWx1ZShpbnN0YW5jZUNvbnRhaW5lciwgcHJvcGVydHkubmFtZSwgc3VwZXIuZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5LCAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEpLCBqc29uLmVudGl0eU9iamVjdCwgT2JqZWN0LmFzc2lnbih7fSwganNvbi5lbnRpdHlPYmplY3QpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZCB0aGVyZSBpcyBhIHNhbml0aXplZCB2YWx1ZSwgYXNzaWduIGl0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9PT0gdW5kZWZpbmVkICYmIHNhbml0aXplVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBzYW5pdGl6ZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBmb3JtIGNvbnRyb2wgdmFsaWRhdG9ycy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID0gdGhpcy5hZGRGb3JtQ29udHJvbChwcm9wZXJ0eSwgcHJvcGVydHlWYWxpZGF0b3JzLCBhZGRpdGlvbmFsVmFsaWRhdGlvbnNbcHJvcGVydHkubmFtZV0sIGluc3RhbmNlQ29udGFpbmVyLCBlbnRpdHlPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmluZSBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgaW5jbHVkaW5nIHZhbGlkYXRvcnMgYW5kIGFzeW5jIHZhbGlkYXRvcnMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWJzdHJhY3RDb250cm9sT3B0aW9uczogQWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHsgdmFsaWRhdG9yczogdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzOiB0aGlzLmFkZEFzeW5jVmFsaWRhdGlvbihwcm9wZXJ0eSwgcHJvcGVydHlWYWxpZGF0b3JzLCBhZGRpdGlvbmFsVmFsaWRhdGlvbnNbcHJvcGVydHkubmFtZV0pIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0cmlldmUgYWRkaXRpb25hbCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgYmFzZWQgb24gcHJvcGVydHkgbmFtZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB0aGlzLmdldEFic3RyYWN0Q29udHJvbE9wdGlvbnMocHJvcGVydHkubmFtZSwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgYWJzdHJhY3RDb250cm9sT3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzaWduIHVwZGF0ZU9uIGNvbmZpZ3VyYXRpb24gaWYgYXZhaWxhYmxlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZU9uICYmICFhYnN0cmFjdENvbnRyb2xPcHRpb25zLnVwZGF0ZU9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbiA9IHVwZGF0ZU9uLmNvbmZpZy5ydW5PbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYSBuZXcgZm9ybSBjb250cm9sIGluc3RhbmNlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gbmV3IFJ4Rm9ybUNvbnRyb2woc2FuaXRpemVWYWx1ZSwgYWJzdHJhY3RDb250cm9sT3B0aW9ucywganNvbi5lbnRpdHlPYmplY3QsIE9iamVjdC5hc3NpZ24oe30sIGpzb24uZW50aXR5T2JqZWN0KSwgcHJvcGVydHkubmFtZSwgaW5zdGFuY2VDb250YWluZXIuc2FuaXRpemVycyFbcHJvcGVydHkubmFtZV0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNOZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGEgZm9ybSBjb250cm9sLCB1c2UgaXRzIGRlZmF1bHQgdmFsdWUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBzdXBlci5nZXREZWZhdWx0VmFsdWUocHJvcGVydHksIChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhlIHByb3BlcnR5IGFzIGV4dGVuZGVkICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChleHRlbmRlZFByb3BlcnRpZXMgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUFJPUEVSVFk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWx1ZSA9IChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgYW5kIG5vdCBhIGZvcm0gZ3JvdXAsIHJlY3Vyc2l2ZWx5IGNyZWF0ZSBhIGZvcm0gZ3JvdXAgZm9yIGl0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RWYWx1ZSAmJiBvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKG9iamVjdFZhbHVlIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8IG9iamVjdFZhbHVlIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgZmxhZ3MgdG8gaW5kaWNhdGUgbmVzdGVkIGJpbmRpbmcuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTmVzdGVkQmluZGluZyA9IHRoaXMuaXNOZXN0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgY3VycmVudCBwcm9wZXJ0eSBuYW1lLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlQ29udGFpbmVyICYmIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcigodDogYW55KSA9PiB0Lm9iamVjdFByb3BOYW1lID09IHByb3BlcnR5Lm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllcyBmb3IgYnVpbGRlciBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHByb3BlcnR5IG5hbWUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSAmJiB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGN1cnJlbnQgZm9ybSBncm91cCBvdGhlciB2YWxpZGF0b3IgaWYgYXZhaWxhYmxlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2J0YWluIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIG5lc3RlZCBvYmplY3QuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyA9IHRoaXMuZ2V0VmFsaWRhdG9yQ29uZmlnKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEsIG9iamVjdFZhbHVlLCBgJHtwcm9wZXJ0eS5uYW1lfS5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYnRhaW4gdGhlIGVudGl0eSB0byB1c2UgZm9yIHRoZSBuZXN0ZWQgb2JqZWN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudGl0eSA9IHByb3BlcnR5LmVudGl0eVByb3ZpZGVyID8gcHJvcGVydHkuZW50aXR5UHJvdmlkZXIuY2FsbChlbnRpdHlPYmplY3QpIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBhIGZvcm0gZ3JvdXAgZm9yIHRoZSBuZXN0ZWQgb2JqZWN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gdGhpcy5mb3JtR3JvdXAoZW50aXR5IHx8IHByb3BlcnR5LmVudGl0eSB8fCB0aGlzLmdldEVudGl0eShvYmplY3RWYWx1ZSwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgcHJvcGVydHkubmFtZSwgdHJ1ZSksIG9iamVjdFZhbHVlLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBmbGFncyB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIG5lc3RlZCBiaW5kaW5nLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZEJpbmRpbmcgPSB0aGlzLmlzTmVzdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGEgZm9ybSBncm91cCwgdXNlIGl0IGFzIGlzICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdFZhbHVlIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8IG9iamVjdFZhbHVlIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IG9iamVjdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFSUkFZX1BST1BFUlRZOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyYXlPYmplY3RWYWx1ZSA9IChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbiBhcnJheSBhbmQgbm90IGEgZm9ybSBhcnJheSwgcmVjdXJzaXZlbHkgY3JlYXRlIGEgZm9ybSBhcnJheSBmb3IgaXQgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5T2JqZWN0VmFsdWUgJiYgYXJyYXlPYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmICEoYXJyYXlPYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBmbGFncyB0byBpbmRpY2F0ZSBuZXN0ZWQgYmluZGluZy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNOZXN0ZWRCaW5kaW5nID0gdGhpcy5pc05lc3RlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBhbiBhcnJheSB0byBob2xkIGZvcm0gZ3JvdXBzIGZvciBlYWNoIHN1Yi1vYmplY3QgaW4gdGhlIGFycmF5LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm1BcnJheUdyb3VwID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudGl0eSA9IHByb3BlcnR5LmVudGl0eVByb3ZpZGVyID8gcHJvcGVydHkuZW50aXR5UHJvdmlkZXIuY2FsbChlbnRpdHlPYmplY3QpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdFZhbGlkYXRpb25Db25maWcgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgb3ZlciBlYWNoIHN1Yi1vYmplY3QgaW4gdGhlIGFycmF5LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViT2JqZWN0IG9mIGFycmF5T2JqZWN0VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29uZGl0aW9uYWwgb2JqZWN0IHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcHJvcGVydHkgbmFtZSBhbmQgYXJyYXkgaW5kZXguICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlQ29udGFpbmVyICYmIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzID0gaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lICYmIHQuYXJyYXlJbmRleCA9PSBpbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlICYmIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lICYmIHQuYXJyYXlJbmRleCA9PSBpbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGN1cnJlbnQgZm9ybSBncm91cCBvdGhlciB2YWxpZGF0b3IgaWYgYXZhaWxhYmxlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9idGFpbiB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdWItb2JqZWN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFZhbGlkYXRpb25Db25maWcgPSB0aGlzLmdldFZhbGlkYXRvckNvbmZpZyhmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCBzdWJPYmplY3QsIGAke3Byb3BlcnR5Lm5hbWV9LmAsIGAke3Byb3BlcnR5Lm5hbWV9WyR7aW5kZXh9XS5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgZm9ybSBncm91cCBmb3IgdGhlIHN1Yi1vYmplY3QgYW5kIGFkZCBpdCB0byB0aGUgZm9ybUFycmF5R3JvdXAgYXJyYXkuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUFycmF5R3JvdXAucHVzaCh0aGlzLmZvcm1Hcm91cChlbnRpdHkgfHwgcHJvcGVydHkuZW50aXR5IHx8IHRoaXMuZ2V0RW50aXR5KHN1Yk9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgcHJvcGVydHkubmFtZSwgdHJ1ZSksIHN1Yk9iamVjdCwgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZykpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIGluZGV4LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzIGFuZCBidWlsZGVyIGNvbmZpZ3VyYXRpb24gY29uZGl0aW9uYWwgb2JqZWN0IHByb3BlcnRpZXMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYnRhaW4gYWJzdHJhY3QgY29udHJvbCBvcHRpb25zIGZvciB0aGUgcHJvcGVydHkuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHRoaXMuZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhwcm9wZXJ0eS5uYW1lLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCB7fSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IFJ4Rm9ybUFycmF5IHVzaW5nIHRoZSBhcnJheU9iamVjdFZhbHVlIGFuZCB0aGUgZm9ybUFycmF5R3JvdXAsIGFsb25nIHdpdGggdGhlIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IG5ldyBSeEZvcm1BcnJheShhcnJheU9iamVjdFZhbHVlLCBmb3JtQXJyYXlHcm91cCwgYWJzdHJhY3RDb250cm9sT3B0aW9ucywgbnVsbCwgcHJvcGVydHkuYXJyYXlDb25maWcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGF1dG9JbnN0YW5jZVB1c2ggaXMgZW5hYmxlZCwgb3ZlcnJpZGUgdGhlIHB1c2ggYW5kIHNwbGljZSBtZXRob2RzIG9mIHRoZSBhcnJheU9iamVjdFZhbHVlIHRvIG1hbmFnZSBmb3JtIGdyb3VwcyBkeW5hbWljYWxseS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFjdGl2ZUZvcm1Db25maWcuYXV0b0luc3RhbmNlUHVzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5T2JqZWN0VmFsdWUucHVzaCA9IChpbnN0YW5jZTogYW55W10pOiBudW1iZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybUdyb3VwID0gdGhpcy5mb3JtR3JvdXAoaW5zdGFuY2UuY29uc3RydWN0b3IsIGluc3RhbmNlLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnISk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXS5wdXNoKGZvcm1Hcm91cCwgeyBpc0FkZGVkSW5zdGFuY2U6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5T2JqZWN0VmFsdWUuc3BsaWNlID0gKHN0YXJ0LCBkZWxldGVDb3VudCk6IGFueVtdID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZCA9IChzdGFydCArIGRlbGV0ZUNvdW50ISkgLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXS5yZW1vdmVBdChpLCB7IGlzUmVtb3ZlZEluc3RhbmNlOiB0cnVlIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGZsYWdzIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgbmVzdGVkIGJpbmRpbmcuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTmVzdGVkQmluZGluZyA9IHRoaXMuaXNOZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgYSBmb3JtIGFycmF5LCB1c2UgaXQgYXMgaXMgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJyYXlPYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gYXJyYXlPYmplY3RWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIGNyZWF0aW5nIGEgYmxhbmsgZm9ybSBhcnJheSwgY3JlYXRlIG9uZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eS5hcnJheUNvbmZpZyAmJiBwcm9wZXJ0eS5hcnJheUNvbmZpZy5jcmVhdGVCbGFuaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gbmV3IFJ4Rm9ybUFycmF5KFtdLCBbXSwgbnVsbCwgbnVsbCwgcHJvcGVydHkuYXJyYXlDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvKiBJZiBubyBuZXN0ZWQgZm9ybSBncm91cHMgb3IgYXJyYXlzIGFyZSBjcmVhdGVkLCByZXNldCBjb25kaXRpb25hbCB2YWxpZGF0aW9uIGluc3RhbmNlIGFuZCByZWxhdGVkIHByb3BlcnRpZXMuICovXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTmVzdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFNldCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgZm9yIHRoZSBmb3JtIGdyb3VwIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgIGxldCBhYnN0cmFjdENvbnRyb2xPcHRpb25zOiBBYnN0cmFjdENvbnRyb2xPcHRpb25zID0ge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzOiBbXSxcclxuICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzOiBbXSxcclxuICAgICAgICAgICAgdXBkYXRlT246IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9ucyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9uc1snZ2xvYmFsJ11cclxuICAgICAgICAgICAgICAgID8gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbJ2dsb2JhbCddXHJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qIE9idGFpbiBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgZm9yIHRoZSBnbG9iYWwgcHJvcGVydHkuICovXHJcbiAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHRoaXMuZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhcImdsb2JhbFwiLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCBhYnN0cmFjdENvbnRyb2xPcHRpb25zKTtcclxuXHJcbiAgICAgICAgLyogQ3JlYXRlIGEgbmV3IFJ4Rm9ybUdyb3VwIHVzaW5nIHRoZSBtb2RlbCwgZW50aXR5IG9iamVjdCwgZm9ybUdyb3VwT2JqZWN0LCBhbmQgYWJzdHJhY3QgY29udHJvbCBvcHRpb25zLiAqL1xyXG4gICAgICAgIGxldCBmb3JtR3JvdXAgPSBuZXcgUnhGb3JtR3JvdXAoanNvbi5tb2RlbCwganNvbi5lbnRpdHlPYmplY3QsIGZvcm1Hcm91cE9iamVjdCwgYWJzdHJhY3RDb250cm9sT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIC8qIElmIGV4cGVyaW1lbnRhbCBtb2RlIGlzIGVuYWJsZWQsIGFzc2lnbiB0aGUgZm9ybSBncm91cCB0byB0aGUgZW50aXR5IG9iamVjdCBhbmQgb3ZlcnJpZGUgcHJvcGVydGllcyBpZiBuZWVkZWQuICovXHJcbiAgICAgICAgaWYgKGRlZmF1bHRDb250YWluZXIuaXNFeHBlcmltZW50YWwpIHtcclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3RbXCJmb3JtR3JvdXBcIl0gPSBmb3JtR3JvdXA7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVQcm9wZXJ0aWVzKGZvcm1Hcm91cCwganNvbi5lbnRpdHlPYmplY3QsIGV4dGVuZGVkUHJvcGVydGllcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBJZiBub3QgaW4gbmVzdGVkIGJpbmRpbmcgbW9kZSBhbmQgZm9ybUdyb3VwIGlzIG5vdCBwcmV2aW91c2x5IGNhbGxlZCwgcmVmcmVzaCBkaXNhYmxlIHN0YXR1cyBvZiB0aGUgZm9ybSBncm91cC4gKi9cclxuICAgICAgICBpZiAoIXRoaXMuaXNOZXN0ZWRCaW5kaW5nICYmICF0aGlzLmlzR3JvdXBDYWxsZWQpIHtcclxuICAgICAgICAgICAgZm9ybUdyb3VwLnJlZnJlc2hEaXNhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcnJpZGVzIHByb3BlcnRpZXMgaW4gdGhlIGZvcm0gZ3JvdXAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGVudGl0eSBvYmplY3QgYW5kIHByb3BlcnRpZXMuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUdyb3VwIFRoZSBSeEZvcm1Hcm91cCBpbnN0YW5jZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIGVudGl0eU9iamVjdCBUaGUgZW50aXR5IG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgdG8gb3ZlcnJpZGUgYXMga2V5cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvdmVycmlkZVByb3BlcnRpZXMoZm9ybUdyb3VwOiBSeEZvcm1Hcm91cCwgZW50aXR5T2JqZWN0OiBhbnksIHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCh0ID0+IHRoaXMub3ZlcnJpZGVQcm9wKGVudGl0eU9iamVjdCwgdCwgZm9ybUdyb3VwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBmb3IgYSBnaXZlbiBjb250cm9sIG5hbWUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb250cm9sLlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGNvbnRhaW5pbmcgdGhlIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucy5cclxuICAgICAqIEBwYXJhbSBhYnN0cmFjdENvbnRyb2xPcHRpb25zIFRoZSBleGlzdGluZyBBYnN0cmFjdENvbnRyb2xPcHRpb25zLlxyXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgQWJzdHJhY3RDb250cm9sT3B0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBYnN0cmFjdENvbnRyb2xPcHRpb25zKG5hbWU6IHN0cmluZywgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGFic3RyYWN0Q29udHJvbE9wdGlvbnM6IEFic3RyYWN0Q29udHJvbE9wdGlvbnMpIHtcclxuICAgICAgICAvKiBVcGRhdGUgdXBkYXRlT24gb3B0aW9uIGlmIGRlZmluZWQgaW4gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9ucyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9uc1tuYW1lXSkge1xyXG4gICAgICAgICAgICBhYnN0cmFjdENvbnRyb2xPcHRpb25zLnVwZGF0ZU9uID0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbbmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVjayBpZiBjb250cm9sT3B0aW9ucyBhcmUgZGVmaW5lZCBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBjb25zdCBjb250cm9sT3B0aW9ucyA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiA/IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5iYXNlQWJzdHJhY3RDb250cm9sT3B0aW9ucyA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xPcHRpb25zICYmIGNvbnRyb2xPcHRpb25zW25hbWVdKSB7XHJcbiAgICAgICAgICAgIC8qIFVwZGF0ZSB1cGRhdGVPbiBvcHRpb24gZnJvbSBjb250cm9sT3B0aW9ucyBpZiBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS51cGRhdGVPbikge1xyXG4gICAgICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbiA9IGNvbnRyb2xPcHRpb25zW25hbWVdLnVwZGF0ZU9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgdmFsaWRhdG9ycyBmcm9tIGNvbnRyb2xPcHRpb25zIGlmIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxWYWxpZGF0b3JGbltdPmNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKHZhbGlkYXRvciA9PiAoPFZhbGlkYXRvckZuW10+YWJzdHJhY3RDb250cm9sT3B0aW9ucy52YWxpZGF0b3JzKS5wdXNoKHZhbGlkYXRvcikpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VmFsaWRhdG9yRm5bXT5hYnN0cmFjdENvbnRyb2xPcHRpb25zLnZhbGlkYXRvcnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wdXNoKDxWYWxpZGF0b3JGbj5jb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQWRkIGFzeW5jIHZhbGlkYXRvcnMgZnJvbSBjb250cm9sT3B0aW9ucyBpZiBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS5hc3luY1ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xPcHRpb25zW25hbWVdLmFzeW5jVmFsaWRhdG9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICAoPFZhbGlkYXRvckZuW10+Y29udHJvbE9wdGlvbnNbbmFtZV0uYXN5bmNWYWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh2YWxpZGF0b3IgPT4gKDxWYWxpZGF0b3JGbltdPmFic3RyYWN0Q29udHJvbE9wdGlvbnMuYXN5bmNWYWxpZGF0b3JzKS5wdXNoKHZhbGlkYXRvcikpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VmFsaWRhdG9yRm5bXT5hYnN0cmFjdENvbnRyb2xPcHRpb25zLmFzeW5jVmFsaWRhdG9ycylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnB1c2goPFZhbGlkYXRvckZuPmNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWJzdHJhY3RDb250cm9sT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRlcyBhIHByb3BlcnR5IG9uIHRoZSBlbnRpdHkgb2JqZWN0IHdpdGggY3VzdG9tIGdldHRlcnMgYW5kIHNldHRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbi5cclxuICAgICAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgb3ZlcnJpZGRlbi5cclxuICAgICAqIEBwYXJhbSBmb3JtR3JvdXAgVGhlIFJ4Rm9ybUdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvdmVycmlkZVByb3AoZW50aXR5T2JqZWN0OiBhbnksIHByb3BOYW1lOiBzdHJpbmcsIGZvcm1Hcm91cDogUnhGb3JtR3JvdXApIHtcclxuICAgICAgICAvKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgYW5kIGN1cnJlbnQgdmFsdWUgKi9cclxuICAgICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKGVudGl0eU9iamVjdCksIHByb3BOYW1lKTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBlbnRpdHlPYmplY3RbcHJvcE5hbWVdO1xyXG4gICAgICAgIGxldCBvbGRWYWx1ZTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyogRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIGN1c3RvbSBnZXR0ZXJzIGFuZCBzZXR0ZXJzICovXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVudGl0eU9iamVjdCwgcHJvcE5hbWUsIHtcclxuICAgICAgICAgICAgLyogQ3VzdG9tIGdldHRlciAqL1xyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IHsgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLmdldCEuY2FsbChlbnRpdHlPYmplY3QpIDogdmFsdWUgfSxcclxuICAgICAgICAgICAgLyogQ3VzdG9tIHNldHRlciAqL1xyXG4gICAgICAgICAgICBzZXQ6ICh2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHY7XHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB2YWx1ZSBoYXMgY2hhbmdlZCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IHYpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBDYWxsIHRoZSBvcmlnaW5hbCBzZXR0ZXIgaWYgZGVmaW5lZCAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0IS5jYWxsKGVudGl0eU9iamVjdCwgdik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBjb250cm9sIGluIHRoZSBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtR3JvdXAuY2hhbmdpbmcgJiYgZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuY29udHJvbHNbcHJvcE5hbWVdLnNldFZhbHVlKHYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgb2xkIHZhbHVlICovXHJcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9IHY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=