@hmcts/ccd-case-ui-toolkit 6.13.10-c → 6.13.10-case-file-view-display-document-upload-date

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 (188) hide show
  1. package/bundles/hmcts-ccd-case-ui-toolkit.umd.js +549 -392
  2. package/bundles/hmcts-ccd-case-ui-toolkit.umd.js.map +1 -1
  3. package/bundles/hmcts-ccd-case-ui-toolkit.umd.min.js +1 -1
  4. package/bundles/hmcts-ccd-case-ui-toolkit.umd.min.js.map +1 -1
  5. package/esm2015/lib/app.config.js +1 -1
  6. package/esm2015/lib/components/form/date-input/date-input.component.js +8 -8
  7. package/esm2015/lib/components/header/header-bar/header-bar.component.js +2 -3
  8. package/esm2015/lib/shared/commons/case-edit-data/case-edit-data.module.js +1 -1
  9. package/esm2015/lib/shared/commons/case-edit-data/case-edit-validation.model.js +1 -1
  10. package/esm2015/lib/shared/components/activity/activity.component.js +5 -5
  11. package/esm2015/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.js +2 -2
  12. package/esm2015/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.js +2 -2
  13. package/esm2015/lib/shared/components/case-editor/case-editor.module.js +1 -1
  14. package/esm2015/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.js +3 -3
  15. package/esm2015/lib/shared/components/case-editor/services/cases.service.js +8 -16
  16. package/esm2015/lib/shared/components/case-editor/services/page-validation.service.js +2 -2
  17. package/esm2015/lib/shared/components/case-editor/services/wizard-page-field-to-case-field.mapper.js +2 -2
  18. package/esm2015/lib/shared/components/case-editor/services/work-allocation.service.js +1 -1
  19. package/esm2015/lib/shared/components/case-viewer/case-challenged-access-request/case-challenged-access-request.component.js +5 -5
  20. package/esm2015/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.js +1 -1
  21. package/esm2015/lib/shared/components/case-viewer/case-specific-access-request/case-specific-access-request.component.js +4 -4
  22. package/esm2015/lib/shared/components/case-viewer/case-viewer.component.js +5 -5
  23. package/esm2015/lib/shared/components/case-viewer/printer/pipes/print-url.pipe.js +3 -3
  24. package/esm2015/lib/shared/components/case-viewer/services/case.resolver.js +2 -2
  25. package/esm2015/lib/shared/components/event-start/event-guard/event-start.guard.js +2 -2
  26. package/esm2015/lib/shared/components/palette/address/address-option.model.js +4 -7
  27. package/esm2015/lib/shared/components/palette/address/write-address-field.component.js +4 -4
  28. package/esm2015/lib/shared/components/palette/base-field/field-read.component.js +2 -2
  29. package/esm2015/lib/shared/components/palette/base-field/field-write.component.js +2 -2
  30. package/esm2015/lib/shared/components/palette/case-file-view/case-file-view-field.component.js +12 -5
  31. package/esm2015/lib/shared/components/palette/case-file-view/components/case-file-view-folder/case-file-view-folder.component.js +24 -15
  32. package/esm2015/lib/shared/components/palette/case-file-view/index.js +1 -2
  33. package/esm2015/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.js +1 -1
  34. package/esm2015/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.js +2 -2
  35. package/esm2015/lib/shared/components/palette/case-flag/enums/index.js +1 -1
  36. package/esm2015/lib/shared/components/palette/collection/collection-create-checker.service.js +5 -5
  37. package/esm2015/lib/shared/components/palette/collection/write-collection-field.component.js +17 -6
  38. package/esm2015/lib/shared/components/palette/complex/read-complex-field-collection-table.component.js +3 -3
  39. package/esm2015/lib/shared/components/palette/dynamic-multi-select-list/index.js +3 -0
  40. package/esm2015/lib/shared/components/palette/dynamic-multi-select-list/read-dynamic-multi-select-list-field.component.js +47 -0
  41. package/esm2015/lib/shared/components/palette/dynamic-multi-select-list/write-dynamic-multi-select-list-field.component.js +153 -0
  42. package/esm2015/lib/shared/components/palette/dynamic-radio-list/write-dynamic-radio-list-field.component.js +5 -6
  43. package/esm2015/lib/shared/components/palette/index.js +2 -1
  44. package/esm2015/lib/shared/components/palette/linked-cases/components/link-cases/link-cases.component.js +1 -1
  45. package/esm2015/lib/shared/components/palette/linked-cases/components/linked-cases-table/linked-cases-from-table.component.js +2 -2
  46. package/esm2015/lib/shared/components/palette/linked-cases/components/linked-cases-table/linked-cases-to-table.component.js +1 -1
  47. package/esm2015/lib/shared/components/palette/linked-cases/domain/linked-cases.model.js +1 -1
  48. package/esm2015/lib/shared/components/palette/linked-cases/read-linked-cases-field.component.js +2 -2
  49. package/esm2015/lib/shared/components/palette/linked-cases/services/linked-cases.service.js +2 -3
  50. package/esm2015/lib/shared/components/palette/linked-cases/write-linked-cases-field.component.js +3 -4
  51. package/esm2015/lib/shared/components/palette/order-summary/fee.model.js +1 -1
  52. package/esm2015/lib/shared/components/palette/order-summary/order-summary.model.js +1 -1
  53. package/esm2015/lib/shared/components/palette/palette.module.js +30 -7
  54. package/esm2015/lib/shared/components/palette/palette.service.js +5 -3
  55. package/esm2015/lib/shared/components/palette/text-area/write-text-area-field.component.js +2 -2
  56. package/esm2015/lib/shared/components/palette/utils/date.pipe.js +4 -4
  57. package/esm2015/lib/shared/components/search-filters/search-filters.component.js +2 -2
  58. package/esm2015/lib/shared/components/workbasket-filters/workbasket-filters.component.js +3 -3
  59. package/esm2015/lib/shared/directives/conditional-show/domain/conditional-show.model.js +3 -3
  60. package/esm2015/lib/shared/directives/conditional-show/services/condition-parser.service.js +3 -7
  61. package/esm2015/lib/shared/domain/case-file-view/case-file-view-document.model.js +1 -1
  62. package/esm2015/lib/shared/domain/case-file-view/document-tree-node/document-tree-node.model.js +1 -1
  63. package/esm2015/lib/shared/domain/case-view/case-view.model.js +1 -1
  64. package/esm2015/lib/shared/domain/case-view/role-assignment-response.model.js +1 -1
  65. package/esm2015/lib/shared/domain/case-view/role-request.model.js +1 -1
  66. package/esm2015/lib/shared/domain/definition/case-field.model.js +6 -3
  67. package/esm2015/lib/shared/domain/definition/field-type-enum.model.js +1 -1
  68. package/esm2015/lib/shared/domain/organisation/organisation-converter.js +8 -8
  69. package/esm2015/lib/shared/domain/user/user-info.model.js +1 -1
  70. package/esm2015/lib/shared/fixture/case-field-builder.js +13 -13
  71. package/esm2015/lib/shared/fixture/shared.test.fixture.js +27 -27
  72. package/esm2015/lib/shared/pipes/complex/{cdd-page-fields.pipe.js → ccd-page-fields.pipe.js} +3 -3
  73. package/esm2015/lib/shared/pipes/complex/index.js +2 -2
  74. package/esm2015/lib/shared/services/activity/activity.polling.service.js +2 -2
  75. package/esm2015/lib/shared/services/activity/activity.service.js +9 -18
  76. package/esm2015/lib/shared/services/addresses/address-parser.js +5 -5
  77. package/esm2015/lib/shared/services/case-fields/format-translator.service.js +2 -2
  78. package/esm2015/lib/shared/services/case-flag/case-flag-refdata.service.js +2 -2
  79. package/esm2015/lib/shared/services/common-data-service/common-data-service.js +2 -2
  80. package/esm2015/lib/shared/services/definitions/definitions.service.js +3 -8
  81. package/esm2015/lib/shared/services/fields/fields.purger.js +15 -15
  82. package/esm2015/lib/shared/services/fields/fields.utils.js +4 -4
  83. package/esm2015/lib/shared/services/form/field-type-sanitiser.js +16 -1
  84. package/esm2015/lib/shared/services/form/form-value.service.js +1 -2
  85. package/esm2015/lib/shared/services/loading/loading.service.js +2 -7
  86. package/esm2015/lib/shared/services/search/search.service.js +5 -10
  87. package/esm2015/lib/shared/services/search-result/sorting/search-result-view-item-comparator-factory.js +5 -5
  88. package/esm2015/lib/shared/services/window/window.service.js +1 -1
  89. package/fesm2015/hmcts-ccd-case-ui-toolkit.js +507 -362
  90. package/fesm2015/hmcts-ccd-case-ui-toolkit.js.map +1 -1
  91. package/lib/app.config.d.ts.map +1 -1
  92. package/lib/components/header/header-bar/header-bar.component.d.ts.map +1 -1
  93. package/lib/shared/commons/case-edit-data/case-edit-data.module.d.ts.map +1 -1
  94. package/lib/shared/commons/case-edit-data/case-edit-validation.model.d.ts.map +1 -1
  95. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
  96. package/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.d.ts +2 -2
  97. package/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.d.ts.map +1 -1
  98. package/lib/shared/components/case-editor/services/cases.service.d.ts.map +1 -1
  99. package/lib/shared/components/case-editor/services/wizard-page-field-to-case-field.mapper.d.ts.map +1 -1
  100. package/lib/shared/components/case-editor/services/work-allocation.service.d.ts.map +1 -1
  101. package/lib/shared/components/case-viewer/case-challenged-access-request/case-challenged-access-request.component.d.ts.map +1 -1
  102. package/lib/shared/components/case-viewer/case-viewer.component.d.ts.map +1 -1
  103. package/lib/shared/components/case-viewer/printer/pipes/print-url.pipe.d.ts.map +1 -1
  104. package/lib/shared/components/case-viewer/services/case.resolver.d.ts.map +1 -1
  105. package/lib/shared/components/event-start/event-guard/event-start.guard.d.ts +1 -1
  106. package/lib/shared/components/event-start/event-guard/event-start.guard.d.ts.map +1 -1
  107. package/lib/shared/components/palette/address/address-option.model.d.ts.map +1 -1
  108. package/lib/shared/components/palette/address/write-address-field.component.d.ts.map +1 -1
  109. package/lib/shared/components/palette/case-file-view/case-file-view-field.component.d.ts +5 -2
  110. package/lib/shared/components/palette/case-file-view/case-file-view-field.component.d.ts.map +1 -1
  111. package/lib/shared/components/palette/case-file-view/components/case-file-view-folder/case-file-view-folder.component.d.ts.map +1 -1
  112. package/lib/shared/components/palette/case-file-view/index.d.ts +0 -1
  113. package/lib/shared/components/palette/case-file-view/index.d.ts.map +1 -1
  114. package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts.map +1 -1
  115. package/lib/shared/components/palette/case-flag/enums/index.d.ts.map +1 -1
  116. package/lib/shared/components/palette/collection/collection-create-checker.service.d.ts.map +1 -1
  117. package/lib/shared/components/palette/collection/write-collection-field.component.d.ts +1 -0
  118. package/lib/shared/components/palette/collection/write-collection-field.component.d.ts.map +1 -1
  119. package/lib/shared/components/palette/complex/read-complex-field-collection-table.component.d.ts +1 -1
  120. package/lib/shared/components/palette/complex/read-complex-field-collection-table.component.d.ts.map +1 -1
  121. package/lib/shared/components/palette/dynamic-multi-select-list/index.d.ts +3 -0
  122. package/lib/shared/components/palette/dynamic-multi-select-list/index.d.ts.map +1 -0
  123. package/lib/shared/components/palette/dynamic-multi-select-list/read-dynamic-multi-select-list-field.component.d.ts +9 -0
  124. package/lib/shared/components/palette/dynamic-multi-select-list/read-dynamic-multi-select-list-field.component.d.ts.map +1 -0
  125. package/lib/shared/components/palette/dynamic-multi-select-list/write-dynamic-multi-select-list-field.component.d.ts +17 -0
  126. package/lib/shared/components/palette/dynamic-multi-select-list/write-dynamic-multi-select-list-field.component.d.ts.map +1 -0
  127. package/lib/shared/components/palette/dynamic-radio-list/write-dynamic-radio-list-field.component.d.ts +1 -1
  128. package/lib/shared/components/palette/dynamic-radio-list/write-dynamic-radio-list-field.component.d.ts.map +1 -1
  129. package/lib/shared/components/palette/index.d.ts +1 -0
  130. package/lib/shared/components/palette/index.d.ts.map +1 -1
  131. package/lib/shared/components/palette/linked-cases/components/linked-cases-table/linked-cases-from-table.component.d.ts +4 -4
  132. package/lib/shared/components/palette/linked-cases/components/linked-cases-table/linked-cases-from-table.component.d.ts.map +1 -1
  133. package/lib/shared/components/palette/linked-cases/domain/linked-cases.model.d.ts.map +1 -1
  134. package/lib/shared/components/palette/linked-cases/read-linked-cases-field.component.d.ts.map +1 -1
  135. package/lib/shared/components/palette/linked-cases/services/linked-cases.service.d.ts.map +1 -1
  136. package/lib/shared/components/palette/linked-cases/write-linked-cases-field.component.d.ts.map +1 -1
  137. package/lib/shared/components/palette/order-summary/fee.model.d.ts.map +1 -1
  138. package/lib/shared/components/palette/order-summary/order-summary.model.d.ts.map +1 -1
  139. package/lib/shared/components/palette/palette.module.d.ts +60 -59
  140. package/lib/shared/components/palette/palette.module.d.ts.map +1 -1
  141. package/lib/shared/components/palette/palette.service.d.ts.map +1 -1
  142. package/lib/shared/components/palette/text-area/write-text-area-field.component.d.ts.map +1 -1
  143. package/lib/shared/components/palette/utils/date.pipe.d.ts.map +1 -1
  144. package/lib/shared/components/workbasket-filters/workbasket-filters.component.d.ts.map +1 -1
  145. package/lib/shared/directives/conditional-show/domain/conditional-show.model.d.ts.map +1 -1
  146. package/lib/shared/directives/conditional-show/services/condition-parser.service.d.ts.map +1 -1
  147. package/lib/shared/domain/case-file-view/case-file-view-document.model.d.ts +1 -1
  148. package/lib/shared/domain/case-file-view/case-file-view-document.model.d.ts.map +1 -1
  149. package/lib/shared/domain/case-file-view/document-tree-node/document-tree-node.model.d.ts +1 -0
  150. package/lib/shared/domain/case-file-view/document-tree-node/document-tree-node.model.d.ts.map +1 -1
  151. package/lib/shared/domain/case-view/case-view.model.d.ts.map +1 -1
  152. package/lib/shared/domain/case-view/role-assignment-response.model.d.ts +1 -2
  153. package/lib/shared/domain/case-view/role-assignment-response.model.d.ts.map +1 -1
  154. package/lib/shared/domain/case-view/role-request.model.d.ts.map +1 -1
  155. package/lib/shared/domain/definition/case-field.model.d.ts.map +1 -1
  156. package/lib/shared/domain/definition/field-type-enum.model.d.ts +1 -1
  157. package/lib/shared/domain/definition/field-type-enum.model.d.ts.map +1 -1
  158. package/lib/shared/domain/organisation/organisation-converter.d.ts.map +1 -1
  159. package/lib/shared/domain/user/user-info.model.d.ts.map +1 -1
  160. package/lib/shared/fixture/case-field-builder.d.ts +6 -6
  161. package/lib/shared/fixture/case-field-builder.d.ts.map +1 -1
  162. package/lib/shared/fixture/shared.test.fixture.d.ts +6 -6
  163. package/lib/shared/fixture/shared.test.fixture.d.ts.map +1 -1
  164. package/lib/shared/pipes/complex/{cdd-page-fields.pipe.d.ts → ccd-page-fields.pipe.d.ts} +1 -1
  165. package/lib/shared/pipes/complex/ccd-page-fields.pipe.d.ts.map +1 -0
  166. package/lib/shared/pipes/complex/index.d.ts +1 -1
  167. package/lib/shared/pipes/pipes.module.d.ts +1 -1
  168. package/lib/shared/services/activity/activity.polling.service.d.ts.map +1 -1
  169. package/lib/shared/services/activity/activity.service.d.ts.map +1 -1
  170. package/lib/shared/services/addresses/address-parser.d.ts.map +1 -1
  171. package/lib/shared/services/common-data-service/common-data-service.d.ts.map +1 -1
  172. package/lib/shared/services/definitions/definitions.service.d.ts.map +1 -1
  173. package/lib/shared/services/fields/fields.purger.d.ts.map +1 -1
  174. package/lib/shared/services/fields/fields.utils.d.ts +0 -1
  175. package/lib/shared/services/fields/fields.utils.d.ts.map +1 -1
  176. package/lib/shared/services/form/field-type-sanitiser.d.ts +2 -0
  177. package/lib/shared/services/form/field-type-sanitiser.d.ts.map +1 -1
  178. package/lib/shared/services/loading/loading.service.d.ts +1 -4
  179. package/lib/shared/services/loading/loading.service.d.ts.map +1 -1
  180. package/lib/shared/services/search/search.service.d.ts +0 -2
  181. package/lib/shared/services/search/search.service.d.ts.map +1 -1
  182. package/lib/shared/services/search-result/sorting/search-result-view-item-comparator-factory.d.ts.map +1 -1
  183. package/lib/shared/services/window/window.service.d.ts.map +1 -1
  184. package/package.json +2 -2
  185. package/esm2015/lib/shared/components/palette/case-file-view/case-file-view-field-read.component.js +0 -72
  186. package/lib/shared/components/palette/case-file-view/case-file-view-field-read.component.d.ts +0 -11
  187. package/lib/shared/components/palette/case-file-view/case-file-view-field-read.component.d.ts.map +0 -1
  188. package/lib/shared/pipes/complex/cdd-page-fields.pipe.d.ts.map +0 -1
@@ -22,9 +22,9 @@ export class FieldsUtils {
22
22
  });
23
23
  return valueMap;
24
24
  }
25
- static getType(elem) {
26
- return Object.prototype.toString.call(elem).slice(8, -1);
27
- }
25
+ // public static getType(elem: any): string {
26
+ // return Object.prototype.toString.call(elem).slice(8, -1);
27
+ // }
28
28
  static isObject(elem) {
29
29
  return typeof elem === 'object' && elem !== null;
30
30
  }
@@ -555,4 +555,4 @@ FieldsUtils.ɵprov = i0.ɵɵdefineInjectable({ token: FieldsUtils, factory: Fiel
555
555
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FieldsUtils, [{
556
556
  type: Injectable
557
557
  }], null, null); })();
558
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9maWVsZHMvZmllbGRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDaEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBb0IsU0FBUyxFQUF5RSxNQUFNLGNBQWMsQ0FBQztBQUNsSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFFbkYsV0FBVztBQUVYLE1BQU0sT0FBTyxXQUFXO0lBWWYsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQVE7UUFDdkMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLE9BQU8scUJBQXFCLENBQUMsSUFBSSxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBdUI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FB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QUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0NBQ2hGLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FDQUNqRDtnQ0FDSCxDQUFDLENBQUMsQ0FBQzs2QkFDSjs0QkFDRCxNQUFNO3lCQUNQO3FCQUNGO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxNQUFNO1NBQ1A7S0FDRjtBQUNILENBQUMsQ0FBQztzRUFwT1MsV0FBVzttREFBWCxXQUFXLFdBQVgsV0FBVzt1RkFBWCxXQUFXO2NBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBwbGFpblRvQ2xhc3NGcm9tRXhpc3QgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBXaXphcmRQYWdlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jYXNlLWVkaXRvci9kb21haW4nO1xuaW1wb3J0IHsgQWJzdHJhY3RGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvYmFzZS1maWVsZC9hYnN0cmFjdC1mb3JtLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGbGFnRGV0YWlsLCBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL2Nhc2UtZmxhZy9kb21haW4vY2FzZS1mbGFnLm1vZGVsJztcbmltcG9ydCB7IENhc2VGbGFnU3RhdHVzIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL2Nhc2UtZmxhZy9lbnVtcy9jYXNlLWZsYWctc3RhdHVzLmVudW0nO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvdXRpbHMnO1xuaW1wb3J0IHsgQ2FzZUV2ZW50VHJpZ2dlciwgQ2FzZUZpZWxkLCBDYXNlVGFiLCBDYXNlVmlldywgRmllbGRUeXBlLCBGaWVsZFR5cGVFbnVtLCBGaXhlZExpc3RJdGVtLCBQcmVkaWNhdGUgfSBmcm9tICcuLi8uLi9kb21haW4nO1xuaW1wb3J0IHsgRm9ybWF0VHJhbnNsYXRvclNlcnZpY2UgfSBmcm9tICcuLi9jYXNlLWZpZWxkcy9mb3JtYXQtdHJhbnNsYXRvci5zZXJ2aWNlJztcblxuLy8gQGR5bmFtaWNcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGaWVsZHNVdGlscyB7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCA9ICdjYXNlRmxhZ3MnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSA9IG5ldyBDdXJyZW5jeVBpcGUoJ2VuLUdCJyk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRhdGVQaXBlOiBEYXRlUGlwZSA9IG5ldyBEYXRlUGlwZShuZXcgRm9ybWF0VHJhbnNsYXRvclNlcnZpY2UoKSk7XG4gIC8vIEVVSS00MjQ0LiAzIGRhc2hlcyBpbnN0ZWFkIG9mIDEgdG8gbWFrZSB0aGlzIGxlc3MgbGlrZWx5IHRvIGNsYXNoIHdpdGggYSByZWFsIGZpZWxkLlxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExBQkVMX1NVRkZJWCA9ICctLS1MQUJFTCc7XG4gIC8vIEhhbmRsaW5nIG9mIER5bmFtaWMgTGlzdHMgaW4gQ29tcGxleCBUeXBlc1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTExFQ1RJT04gPSAnQ29sbGVjdGlvbic7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfQ09NUExFWCA9ICdDb21wbGV4JztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9EWU5BTUlDX0xJU1RfVFlQRTogRmllbGRUeXBlRW51bVtdID0gWydEeW5hbWljTGlzdCcsICdEeW5hbWljUmFkaW9MaXN0J107XG5cbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VG9DYXNlRmllbGQob2JqOiBhbnkpOiBDYXNlRmllbGQge1xuICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENhc2VGaWVsZCkpIHtcbiAgICAgIHJldHVybiBwbGFpblRvQ2xhc3NGcm9tRXhpc3QobmV3IENhc2VGaWVsZCgpLCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1ZhbHVlc01hcChjYXNlRmllbGRzOiBDYXNlRmllbGRbXSk6IGFueSB7XG4gICAgY29uc3QgdmFsdWVNYXAgPSB7fTtcbiAgICBjYXNlRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgdmFsdWVNYXBbZmllbGQuaWRdID0gRmllbGRzVXRpbHMucHJlcGFyZVZhbHVlKGZpZWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVNYXA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFR5cGUoZWxlbTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsZW0pLnNsaWNlKDgsIC0xKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNPYmplY3QoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbGVtID09PSAnb2JqZWN0JyAmJiBlbGVtICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc05vbkVtcHR5T2JqZWN0KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT2JqZWN0KGVsZW0pICYmIE9iamVjdC5rZXlzKGVsZW0pLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheShlbGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlbGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXJlQ29sbGVjdGlvblZhbHVlc1NpbXBsZUZpZWxkcyhmaWVsZFZhbHVlOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc09iamVjdChmaWVsZFZhbHVlWzBdWyd2YWx1ZSddKSAmJiAhQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlWzBdWyd2YWx1ZSddKSAmJiBmaWVsZFZhbHVlWzBdWyd2YWx1ZSddICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbk9mU2ltcGxlVHlwZXMoZmllbGRWYWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb2xsZWN0aW9uKGZpZWxkVmFsdWUpICYmIHRoaXMuYXJlQ29sbGVjdGlvblZhbHVlc1NpbXBsZUZpZWxkcyhmaWVsZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNNdWx0aVNlbGVjdFZhbHVlKGZvcm06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTm9uRW1wdHlBcnJheShmb3JtKSAmJiAhdGhpcy5pc0NvbGxlY3Rpb25XaXRoVmFsdWUoZm9ybSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTm9uRW1wdHlBcnJheShwYWdlRm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFnZUZvcm1GaWVsZHMpICYmIHBhZ2VGb3JtRmllbGRzWzBdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbihwYWdlRm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNOb25FbXB0eUFycmF5KHBhZ2VGb3JtRmllbGRzKSAmJiB0aGlzLmlzQ29sbGVjdGlvbldpdGhWYWx1ZShwYWdlRm9ybUZpZWxkcyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbldpdGhWYWx1ZShwYWdlRm9ybUZpZWxkczogYW55W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGFnZUZvcm1GaWVsZHNbMF1bJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2xvbmVPYmplY3Qob2JqOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuICB9XG5cbiAgLy8gdGVtcG9yYXJ5IGZ1bmN0aW9uIHVudGlsIHRoaXMgY2FuIGJlIG1vdmVkIHRvIENhc2VWaWV3IGNsYXNzIChSRE0tMjY4MSlcbiAgcHVibGljIHN0YXRpYyBnZXRDYXNlRmllbGRzKGNhc2VWaWV3OiBDYXNlVmlldyk6IENhc2VGaWVsZFtdIHtcbiAgICBjb25zdCBjYXNlRGF0YUZpZWxkczogQ2FzZUZpZWxkW10gPSBjYXNlVmlldy50YWJzLnJlZHVjZSgoYWNjOiBDYXNlRmllbGRbXSwgdGFiOiBDYXNlVGFiKSA9PiB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdCh0YWIuZmllbGRzKTtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBtZXRhZGF0YUZpZWxkczogQ2FzZUZpZWxkW10gPSBjYXNlVmlldy5tZXRhZGF0YUZpZWxkcztcbiAgICByZXR1cm4gbWV0YWRhdGFGaWVsZHMuY29uY2F0KGNhc2VEYXRhRmllbGRzLmZpbHRlcigoY2FzZUZpZWxkOiBDYXNlRmllbGQpID0+IHtcbiAgICAgIHJldHVybiBtZXRhZGF0YUZpZWxkcy5maW5kSW5kZXgobWV0YWRhdGFGaWVsZCA9PiBtZXRhZGF0YUZpZWxkLmlkID09PSBjYXNlRmllbGQuaWQpIDwgMDtcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFkZENhc2VGaWVsZEFuZENvbXBvbmVudFJlZmVyZW5jZXMgKGM6IEFic3RyYWN0Q29udHJvbCwgY2Y6IENhc2VGaWVsZCwgY29tcDogQWJzdHJhY3RGb3JtRmllbGRDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjWydjYXNlRmllbGQnXSA9IGNmO1xuICAgIGNbJ2NvbXBvbmVudCddID0gY29tcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmUgY2hlY2sgb2YgYW4gYXJyYXkgb3Igb2JqZWN0IGFuZCBpdHMgZGVzY2VuZGFudHMgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbnkgbm9uLWVtcHR5IHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdCBUaGUgYXJyYXkgb3Igb2JqZWN0IHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXkgb3Igb2JqZWN0IChvciBhIGRlc2NlbmRhbnQpIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBub24tZW1wdHkgdmFsdWU7IGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zTm9uRW1wdHlWYWx1ZXMob2JqZWN0OiBvYmplY3QpOiBib29sZWFuIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLm1hcChrZXkgPT4gb2JqZWN0W2tleV0pO1xuICAgIGNvbnN0IG9iamVjdFJlZnMgPSBbXTtcbiAgICAvLyBBbHNvIHRlc3QgZm9yIG51bWVyaWMgdmFsdWVzLCBhbmQgbGVuZ3RoID4gMCBmb3Igbm9uLW51bWVyaWMgdmFsdWVzIGJlY2F1c2UgdGhpcyBjb3ZlcnMgYm90aCBzdHJpbmdzIGFuZCBhcnJheXMuXG4gICAgLy8gTm90ZTogRGVsaWJlcmF0ZSB1c2Ugb2Ygbm9uLWVxdWFsaXR5ICghPSkgb3BlcmF0b3IgZm9yIG51bGwgY2hlY2ssIHRvIGhhbmRsZSBib3RoIG51bGwgYW5kIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB0cmlwbGUtZXF1YWxzXG4gICAgY29uc3QgaGFzTm9uTnVsbFByaW1pdGl2ZSA9IHZhbHVlcy5zb21lKHggPT4gKHggIT0gbnVsbCAmJlxuICAgICAgKCh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB8fCBBcnJheS5pc0FycmF5KHgpXG4gICAgICAgID8gIW9iamVjdFJlZnMucHVzaCh4KVxuICAgICAgICA6IHR5cGVvZiB4ID09PSAnbnVtYmVyJyB8fCB4Lmxlbmd0aCA+IDApXG4gICAgKSk7XG4gICAgcmV0dXJuICFoYXNOb25OdWxsUHJpbWl0aXZlID8gb2JqZWN0UmVmcy5zb21lKHkgPT4gdGhpcy5jb250YWluc05vbkVtcHR5VmFsdWVzKHkpKSA6IGhhc05vbk51bGxQcmltaXRpdmU7XG4gIH1cblxuICAvKipcbiAgICogaGFuZGxlTmVzdGVkRHluYW1pY0xpc3RzKClcbiAgICogUmVhc3NpZ25zIGxpc3RfaXRlbSBhbmQgdmFsdWUgZGF0YSB0byBEeW5hbWljTGlzdCBjaGlsZHJlblxuICAgKiBkb3duIHRoZSB0cmVlLiBTZXJ2ZXIgcmVzcG9uc2UgcmV0dXJucyBkYXRhIG9ubHkgaW5cbiAgICogdGhlIGB2YWx1ZWAgb2JqZWN0IG9mIHBhcmVudCBjb21wbGV4IHR5cGVcbiAgICpcbiAgICogRVVJLTI1MzAgRHluYW1pYyBMaXN0cyBmb3IgRWxlbWVudHMgaW4gYSBDb21wbGV4IFR5cGVcbiAgICpcbiAgICogQHBhcmFtIGpzb25Cb2R5IC0geyBjYXNlX2ZpZWxkczogWyBDYXNlRmllbGQsIENhc2VGaWVsZCBdIH1cbiAgICovXG4gICBwdWJsaWMgc3RhdGljIGhhbmRsZU5lc3RlZER5bmFtaWNMaXN0cyhqc29uQm9keTogeyBjYXNlX2ZpZWxkczogQ2FzZUZpZWxkW10gfSk6IGFueSB7XG5cbiAgICBpZiAoanNvbkJvZHkuY2FzZV9maWVsZHMpIHtcbiAgICAgIGpzb25Cb2R5LmNhc2VfZmllbGRzLmZvckVhY2goY2FzZUZpZWxkID0+IHtcbiAgICAgICAgaWYgKGNhc2VGaWVsZC5maWVsZF90eXBlKSB7XG4gICAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oY2FzZUZpZWxkLCBjYXNlRmllbGQuZmllbGRfdHlwZSwgY2FzZUZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb25Cb2R5O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcHJlcGFyZVZhbHVlKGZpZWxkOiBDYXNlRmllbGQpOiBhbnkge1xuICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgcmV0dXJuIGZpZWxkLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZmllbGQuaXNDb21wbGV4KCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlTWFwID0ge307XG4gICAgICBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmZvckVhY2goY29tcGxleEZpZWxkID0+IHtcbiAgICAgICAgdmFsdWVNYXBbY29tcGxleEZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLnByZXBhcmVWYWx1ZShjb21wbGV4RmllbGQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWVNYXA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NRVJHRV9GVU5DVElPTiA9IGZ1bmN0aW9uIG1lcmdlRnVuY3Rpb24oZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXJlc3VsdC5oYXNPd25Qcm9wZXJ0eShmaWVsZC5pZCkpIHtcbiAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBmaWVsZC52YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTEFCRUxfTUVSR0VfRlVOQ1RJT04gPSBmdW5jdGlvbiBtZXJnZUZ1bmN0aW9uKGZpZWxkOiBDYXNlRmllbGQsIHJlc3VsdDogb2JqZWN0KTogdm9pZCB7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IHt9XG4gICAgfVxuICAgIGlmICghcmVzdWx0Lmhhc093blByb3BlcnR5KGZpZWxkLmlkKSkge1xuICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IGZpZWxkLnZhbHVlO1xuICAgIH1cblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogc3dpdGNoLWRlZmF1bHRcbiAgICBzd2l0Y2ggKGZpZWxkLmZpZWxkX3R5cGUudHlwZSkge1xuICAgICAgY2FzZSAnRml4ZWRMaXN0JzpcbiAgICAgIGNhc2UgJ0ZpeGVkUmFkaW9MaXN0Jzoge1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0Rml4ZWRMaXN0TGFiZWxCeUNvZGVPckVtcHR5KGZpZWxkLCByZXN1bHRbZmllbGQuaWRdIHx8IGZpZWxkLnZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdNdWx0aVNlbGVjdExpc3QnOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSByZXN1bHRbZmllbGQuaWRdIHx8IFtdO1xuICAgICAgICByZXN1bHRbZmllbGQuaWQgKyBGaWVsZHNVdGlscy5MQUJFTF9TVUZGSVhdID0gW107XG4gICAgICAgIGZpZWxkVmFsdWUuZm9yRWFjaCgoY29kZTogYW55LCBpZHg6IGFueSkgPT4ge1xuICAgICAgICAgIHJlc3VsdFtmaWVsZC5pZCArIEZpZWxkc1V0aWxzLkxBQkVMX1NVRkZJWF1baWR4XSA9IEZpZWxkc1V0aWxzLmdldEZpeGVkTGlzdExhYmVsQnlDb2RlT3JFbXB0eShmaWVsZCwgY29kZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0xhYmVsJzoge1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0TGFiZWwoZmllbGQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ01vbmV5R0JQJzoge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gKHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0TW9uZXlHQlAoZmllbGRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRGF0ZSc6IHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IChyZXN1bHRbZmllbGQuaWRdIHx8IGZpZWxkLnZhbHVlKTtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLmdldERhdGUoZmllbGRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQ29tcGxleCc6IHtcbiAgICAgICAgaWYgKHJlc3VsdFtmaWVsZC5pZF0gJiYgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaCgoZjogQ2FzZUZpZWxkKSA9PiB7XG4gICAgICAgICAgICBpZiAoWydDb2xsZWN0aW9uJywgJ0NvbXBsZXgnLCAnTXVsdGlTZWxlY3RMaXN0J10uaW5kZXhPZihmLmZpZWxkX3R5cGUudHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTihmLCByZXN1bHRbZmllbGQuaWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gKHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICBpZiAoZWxlbWVudHMpIHtcbiAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdNb25leUdCUCc6IHtcbiAgICAgICAgICAgICAgICBlbGVtLnZhbHVlID0gRmllbGRzVXRpbHMuZ2V0TW9uZXlHQlAoZWxlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnRGF0ZSc6IHtcbiAgICAgICAgICAgICAgICBlbGVtLnZhbHVlID0gRmllbGRzVXRpbHMuZ2V0RGF0ZShlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdDb21wbGV4Jzoge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaCgoZjogQ2FzZUZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChbJ0NvbGxlY3Rpb24nLCAnQ29tcGxleCcsICdNdWx0aVNlbGVjdExpc3QnXS5pbmRleE9mKGYuZmllbGRfdHlwZS50eXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgRmllbGRzVXRpbHMuTEFCRUxfTUVSR0VfRlVOQ1RJT04oZiwgZWxlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRm9ybWF0cyBhIGBNb25leUdCUGAgdmFsdWUgdG8gaW5jbHVkZSBjdXJyZW5jeSB1bml0cy5cbiAgICogQHBhcmFtIGZpZWxkVmFsdWUgVGhlIEN1cnJlbmN5UGlwZSBleHBlY3RzIGFuIGBhbnlgIHBhcmFtZXRlciBzbyB0aGlzIG11c3QgYWxzbyBiZSBgYW55YCxcbiAgICogYnV0IGl0IHNob3VsZCBiZSBcIm51bWJlci1saWtlXCIgKGUuZy4sICcxMjM0JylcbiAgICogQHJldHVybnMgQSBmb3JtYXR0ZWQgc3RyaW5nIChlLmcuLCDCozEyLjM0KVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TW9uZXlHQlAoZmllbGRWYWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmllbGRWYWx1ZSA/IEZpZWxkc1V0aWxzLmN1cnJlbmN5UGlwZS50cmFuc2Zvcm0oZmllbGRWYWx1ZSAvIDEwMCwgJ0dCUCcsICdzeW1ib2wnKSA6IGZpZWxkVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRMYWJlbChmaWVsZFZhbHVlOiBDYXNlRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZFZhbHVlID8gZmllbGRWYWx1ZS5sYWJlbCA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RGF0ZShmaWVsZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAvLyBGb3JtYXQgc3BlY2lmaWVkIGhlcmUgd2Fzbid0IHByZXZpb3VzbHkgd29ya2luZyBhbmQgbG90cyBvZiB0ZXN0cyBkZXBlbmQgb24gaXQgbm90IHdvcmtpbmdcbiAgICAgIC8vIE5vdyB0aGF0IGZvcm1hdHMgd29yayBjb3JyZWN0bHkgbWFueSB0ZXN0IHdvdWxkIGJyZWFrIC0gYW5kIHRoaXMgY291bGQgYWZmZWN0IHNlcnZpY2VzIHdoaWNoIG1heSBkZXBlbmQgb25cbiAgICAgIC8vIHRoZSBvcmdpbmFsIGJlaGF2aW91ciBvZiByZXR1cm5pbmcgZGF0ZXMgaW4gXCJkIE1NTSB5eXl5XCJcbiAgICAgIC8vIE5vdGUgLSByZXBsYWNlZCAnZCcgd2l0aCAnRCcgYXMgZGF0ZXBpcGUgdXNpbmcgbW9tZW50IHRvIGF2b2lkIHRpbWV6b25lIGRpc2NyZXBhbmNpZXNcbiAgICAgIHJldHVybiBGaWVsZHNVdGlscy5kYXRlUGlwZS50cmFuc2Zvcm0oZmllbGRWYWx1ZSwgbnVsbCwgJ0QgTU1NIHl5eXknKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0Rm9ySW52YWxpZEZpZWxkKCdEYXRlJywgZmllbGRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rml4ZWRMaXN0TGFiZWxCeUNvZGVPckVtcHR5KGZpZWxkOiBDYXNlRmllbGQsIGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVsZXZhbnRJdGVtOiBGaXhlZExpc3RJdGVtID0gY29kZSA/IGZpZWxkLmZpZWxkX3R5cGUuZml4ZWRfbGlzdF9pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5jb2RlID09PSBjb2RlKSA6IG51bGw7XG4gICAgcmV0dXJuIHJlbGV2YW50SXRlbSA/IHJlbGV2YW50SXRlbS5sYWJlbCA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdGV4dEZvckludmFsaWRGaWVsZCh0eXBlOiBzdHJpbmcsIGludmFsaWRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHsgSW52YWxpZCAke3R5cGV9OiAke2ludmFsaWRWYWx1ZX0gfWA7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzZXREeW5hbWljTGlzdERlZmluaXRpb24oY2FzZUZpZWxkOiBDYXNlRmllbGQsIGNhc2VGaWVsZFR5cGU6IEZpZWxkVHlwZSwgcm9vdENhc2VGaWVsZDogQ2FzZUZpZWxkKSB7XG4gICAgaWYgKGNhc2VGaWVsZFR5cGUudHlwZSA9PT0gRmllbGRzVXRpbHMuU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfQ09NUExFWCkge1xuXG4gICAgICBjYXNlRmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGlzRHluYW1pY0ZpZWxkID0gRmllbGRzVXRpbHMuU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfRFlOQU1JQ19MSVNUX1RZUEUuaW5kZXhPZihmaWVsZC5maWVsZF90eXBlLnR5cGUpICE9PSAtMTtcblxuICAgICAgICAgIGlmIChpc0R5bmFtaWNGaWVsZCkge1xuICAgICAgICAgICAgY29uc3QgZHluYW1pY0xpc3RWYWx1ZSA9IHRoaXMuZ2V0RHluYW1pY0xpc3RWYWx1ZShyb290Q2FzZUZpZWxkLnZhbHVlLCBmaWVsZC5pZCk7XG4gICAgICAgICAgICBpZiAoZHluYW1pY0xpc3RWYWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCBsaXN0X2l0ZW1zID0gZHluYW1pY0xpc3RWYWx1ZVswXS5saXN0X2l0ZW1zO1xuICAgICAgICAgICAgICBjb25zdCBjb21wbGV4VmFsdWUgPSBkeW5hbWljTGlzdFZhbHVlLm1hcChkYXRhID0+IGRhdGEudmFsdWUpO1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBsaXN0X2l0ZW1zLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb21wbGV4VmFsdWUubGVuZ3RoID4gMCA/IGNvbXBsZXhWYWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBmaWVsZC5mb3JtYXR0ZWRfdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgLi4uZmllbGQuZm9ybWF0dGVkX3ZhbHVlLFxuICAgICAgICAgICAgICAgIC4uLnZhbHVlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHluYW1pY0xpc3REZWZpbml0aW9uKGZpZWxkLCBmaWVsZC5maWVsZF90eXBlLCByb290Q2FzZUZpZWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGNhc2VGaWVsZFR5cGUudHlwZSA9PT0gRmllbGRzVXRpbHMuU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfQ09MTEVDVElPTikge1xuICAgICAgaWYgKGNhc2VGaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlKSB7XG4gICAgICAgIHRoaXMuc2V0RHluYW1pY0xpc3REZWZpbml0aW9uKGNhc2VGaWVsZCwgY2FzZUZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUsIHJvb3RDYXNlRmllbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldER5bmFtaWNMaXN0VmFsdWUoanNvbkJsb2NrOiBhbnksIGtleTogc3RyaW5nKSB7XG5cbiAgICBjb25zdCBkYXRhID0ganNvbkJsb2NrID8gdGhpcy5nZXROZXN0ZWRGaWVsZFZhbHVlcyhqc29uQmxvY2ssIGtleSwgW10pIDogW107XG5cbiAgICByZXR1cm4gZGF0YS5sZW5ndGggPiAwID8gZGF0YSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXROZXN0ZWRGaWVsZFZhbHVlcyhqc29uRGF0YTogYW55LCBrZXk6IHN0cmluZywgb3V0cHV0OiBhbnlbXSA9IFtdKSB7XG4gICAgaWYgKGpzb25EYXRhICYmIGpzb25EYXRhW2tleV0pIHtcbiAgICAgIG91dHB1dC5wdXNoKGpzb25EYXRhW2tleV0pO1xuICAgIH0gZWxzZSAge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50S2V5IGluIGpzb25EYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbkRhdGEgPT09ICdvYmplY3QnICYmIGpzb25EYXRhLmhhc093blByb3BlcnR5KGVsZW1lbnRLZXkpKSB7XG4gICAgICAgICAgdGhpcy5nZXROZXN0ZWRGaWVsZFZhbHVlcyhqc29uRGF0YVtlbGVtZW50S2V5XSwga2V5LCBvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRmxhZ3NDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoIWNhc2VGaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzRmxhZ3NGaWVsZFR5cGUoY2FzZUZpZWxkLmZpZWxkX3R5cGUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ZsYWdMYXVuY2hlckNhc2VGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FzZUZpZWxkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdGbGFnTGF1bmNoZXInO1xuICB9XG5cblx0cHVibGljIHN0YXRpYyBpc0NvbXBvbmVudExhdW5jaGVyQ2FzZUZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXNlRmllbGQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBvbmVudExhdW5jaGVyJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnc0ZpZWxkVHlwZShmaWVsZFR5cGU6IEZpZWxkVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZHVtbXkgZmllbGQgdHlwZSBJRCBvZiBcIkNhc2VGbGFnXCIgZm9yIHRlc3RpbmcgYW5kIHRoZSByZWFsIGZpZWxkIHR5cGVcbiAgICAvLyBJRCBvZiBcIkZsYWdzXCJcbiAgICByZXR1cm4gKGZpZWxkVHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgKGZpZWxkVHlwZS5pZCA9PT0gJ0Nhc2VGbGFnJyB8fCBmaWVsZFR5cGUuaWQgPT09ICdGbGFncycpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGZsYWdzIGRhdGEgZnJvbSBhIGBDYXNlRmllbGRgIGluc3RhbmNlLCByZWN1cnNpbmcgYW5kIGl0ZXJhdGluZyB0aHJvdWdoIHN1Yi1maWVsZHMgb2YgYSBDb21wbGV4IGZpZWxkIG9yXG4gICAqIGVhY2ggZmllbGQgaW4gYSBDb2xsZWN0aW9uIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZmxhZ3MgQW4gYXJyYXkgZm9yIGFjY3VtdWxhdGluZyBleHRyYWN0ZWQgZmxhZ3MgZGF0YSBhbmQgZGVyaXZlZCBgRm9ybUdyb3VwYCBwYXRoc1xuICAgKiBAcGFyYW0gY2FzZUZpZWxkIEEgYENhc2VGaWVsZGAgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBmbGFncyBkYXRhXG4gICAqIEBwYXJhbSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCBBIChkb3QtZGVsaW1pdGVkKSBzdHJpbmcgZm9yIGNvbmNhdGVuYXRpbmcgdGhlIG5hbWUgb2YgZWFjaCBjb250cm9sIHRoYXQgZm9ybXMgdGhlIHBhdGhcbiAgICogdG8gdGhlIGBGb3JtR3JvdXBgIGZvciB0aGUgYEZsYWdzYCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdG9wTGV2ZWxDYXNlRmllbGQgVGhlIHRvcC1sZXZlbCBgQ2FzZUZpZWxkYCB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSBwcm9wZXJ0eS4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIF9vbmx5XG4gICAqIHRvcC1sZXZlbF8gYENhc2VGaWVsZGBzIGNvbnRhaW4gYWN0dWFsIHZhbHVlcyBhbmQgYSByZWZlcmVuY2UgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCB0byBzdWNoIGEgZmllbGRcbiAgICogQHBhcmFtIGN1cnJlbnRWYWx1ZSBUaGUgY3VycmVudCB2YWx1ZSBvYmplY3Qgb2YgYSBgQ2FzZUZpZWxkYCB0aGF0IGlzIGEgc3ViLWZpZWxkIG9mIGEgbm9uIHJvb3QtbGV2ZWwgQ29tcGxleCBmaWVsZC5cbiAgICogUmVxdWlyZWQgZm9yIG1hcHBpbmcgdGhlIGBDYXNlRmllbGRgIHZhbHVlIHRvIGEgYEZsYWdzYCBvYmplY3QgaWYgaXQgaXMgYSBcIkZsYWdzXCIgYENhc2VGaWVsZGAuIChGb3IgQ29tcGxleCB0eXBlcyxcbiAgICogb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueSBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsXG4gICAqIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhgLCBlYWNoIGluc3RhbmNlIGNvbXByaXNpbmcgYSBgRmxhZ3NgIG9iamVjdCBkZXJpdmVkIGZyb20gYSBgQ2FzZUZpZWxkYFxuICAgKiBvZiB0eXBlIFwiRmxhZ3NcIiwgYW5kIHRoZSBkb3QtZGVsaW1pdGVkIHBhdGggc3RyaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIGBGb3JtR3JvdXBgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKGZsYWdzOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoW10sIGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcsIHRvcExldmVsQ2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhbXSB7XG4gICAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgRmxhZ3MgQ2FzZUZpZWxkICh0aGVzZSBhcmUgaW1wbGVtZW50ZWQgYXMgQ29tcGxleCB0eXBlcyksIGl0IGNhbiBiZSBtYXBwZWQgdG8gYSBGbGFnc1xuICAgICAgICAgIC8vIG9iamVjdCBpbW1lZGlhdGVseVxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBGbGFncyBDYXNlRmllbGQgaGFzIGEgdmFsdWUsIGl0IGlzIGEgcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkOyBpZiBpdCBkb2VzIG5vdCwgaXQgaXMgYSBGbGFnc1xuICAgICAgICAgICAgLy8gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGFub3RoZXIgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWUgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGluc3RlYWQuIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgXCJjYXNlRmxhZ3NcIiBGbGFncyBDYXNlRmllbGQsIHdoaWNoIHdpbGwgaGF2ZSBhbiBlbXB0eSBvYmplY3QgdmFsdWVcbiAgICAgICAgICAgIC8vIGluaXRpYWxseSwgYmVjYXVzZSBubyBwYXJ0eSBuYW1lIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY2FzZUZpZWxkLnZhbHVlKSB8fFxuICAgICAgICAgICAgICBjYXNlRmllbGQuaWQgPT09IHRoaXMuY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCkge1xuICAgICAgICAgICAgICBmbGFncy5wdXNoKHRoaXMubWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSBgLiR7Y2FzZUZpZWxkLmlkfWA7XG4gICAgICAgICAgICAgIGZsYWdzLnB1c2godGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChcbiAgICAgICAgICAgICAgICBjYXNlRmllbGQuaWQsIGN1cnJlbnRWYWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGZsYWdzID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGZsYWdzT2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgdG9wTGV2ZWxDYXNlRmllbGQsIHZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEZvciBhIENvbGxlY3Rpb24gZmllbGQsIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBhcyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIENhc2VGaWVsZCdzIHZhbHVlIHByb3BlcnR5XG4gICAgICAgIC8vIGFzIGFuIGFycmF5LCB1bmxlc3MgdGhlIGNvbGxlY3Rpb24gaXMgYSBzdWItZmllbGQgb2YgYSBDb21wbGV4IHR5cGUgLSBzdWItZmllbGRzIG5ldmVyIGNvbnRhaW4gdmFsdWVzXG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIEZsYWdzIENhc2VGaWVsZHMsIHRoZXNlIGNhbiBiZSBtYXBwZWQgdG8gRmxhZ3Mgb2JqZWN0cyBpbW1lZGlhdGVseVxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzRmllbGRUeXBlKGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ29sbGVjdGlvbiBDYXNlRmllbGQgaGFzIGEgdmFsdWUgKGFuIGFycmF5KSwgaXQgaXMgYSByb290LWxldmVsIENvbGxlY3Rpb24gZmllbGQ7IGlmIGl0IGRvZXMgbm90LFxuICAgICAgICAgICAgLy8gaXQgaXMgYSBDb2xsZWN0aW9uIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlXG4gICAgICAgICAgICAvLyAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCBwYXRoRnJhZ21lbnQgPSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSAnLmluZGV4LnZhbHVlJztcbiAgICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgY2FzZUZpZWxkLnZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEF0IGVhY2ggaXRlcmF0aW9uLCByZXBsYWNlIHRoZSBcImluZGV4XCIgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGluZGV4XG4gICAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgPSBwYXRoRnJhZ21lbnQucmVwbGFjZSgnaW5kZXgnLCBpbmRleC50b1N0cmluZygxMCkpO1xuICAgICAgICAgICAgICAgIGZsYWdzLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGl0ZW0uaWQsIGl0ZW0udmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCBjYXNlRmllbGQpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFtdKS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MucHVzaChcbiAgICAgICAgICAgICAgICAgIHRoaXMubWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoaXRlbS5pZCwgaXRlbS52YWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcmVkdWN0aW9uIG92ZXIgZWFjaCBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyAoc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgYWJvdmUgZm9yIG5vbi1GbGFnc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGhGcmFnbWVudCA9IHBhdGhUb0ZsYWdzRm9ybUdyb3VwICs9ICcuaW5kZXgudmFsdWUnO1xuICAgICAgICAgICAgICBjYXNlRmllbGQudmFsdWUuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQXQgZWFjaCBpdGVyYXRpb24sIHJlcGxhY2UgdGhlIFwiaW5kZXhcIiBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgaW5kZXhcbiAgICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MgPSBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKFxuICAgICAgICAgICAgICAgICAgICBmbGFnc09mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkLCBpdGVtLnZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgICAgfSwgZmxhZ3MpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBmaWVsZCB0eXBlc1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsYWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZC5pZCwgY2FzZUZpZWxkLnZhbHVlLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgY2FzZUZpZWxkKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGlkOiBzdHJpbmcsIHZhbHVlOiBvYmplY3QsXG4gICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXA6IHN0cmluZywgY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZsYWdzOiB7XG4gICAgICAgICAgZmxhZ3NDYXNlRmllbGRJZDogaWQsXG4gICAgICAgICAgcGFydHlOYW1lOiB2YWx1ZSA/IHZhbHVlWydwYXJ0eU5hbWUnXSA6IG51bGwsXG4gICAgICAgICAgcm9sZU9uQ2FzZTogdmFsdWUgPyB2YWx1ZVsncm9sZU9uQ2FzZSddIDogbnVsbCxcbiAgICAgICAgICBkZXRhaWxzOiB2YWx1ZSAmJiB2YWx1ZVsnZGV0YWlscyddICYmIHZhbHVlWydkZXRhaWxzJ10ubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyAodmFsdWVbJ2RldGFpbHMnXSBhcyBhbnlbXSkubWFwKGRldGFpbCA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAuLi5PYmplY3Qua2V5cyhkZXRhaWwudmFsdWUpLm1hcChrID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgaWQgcHJvcGVydHkgc2V0IGJlbG93IHdpbGwgYmUgbnVsbCBmb3IgYSBuZXcgY2FzZSBmbGFnLCBhbmQgYSB1bmlxdWUgaWQgcmV0dXJuZWQgZnJvbSBDQ0Qgd2hlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGZsYWdcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGspIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIGRhdGUtdGltZSBmaWVsZHNcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lTW9kaWZpZWQnOlxuICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZVRpbWVDcmVhdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtba106IGRldGFpbC52YWx1ZVtrXSA/IG5ldyBEYXRlKGRldGFpbC52YWx1ZVtrXSkgOiBudWxsLCBpZDogZGV0YWlsLmlkfTtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgYSBcInllcy9ub1wiIGZpZWxkXG4gICAgICAgICAgICAgICAgICBjYXNlICdoZWFyaW5nUmVsZXZhbnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV0YWlsLnZhbHVlW2tdLnRvVXBwZXJDYXNlKCkgPT09ICdZRVMnID8ge1trXTogdHJ1ZSwgaWQ6IGRldGFpbC5pZH0gOiB7W2tdOiBmYWxzZSwgaWQ6IGRldGFpbC5pZH07XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1trXTogZGV0YWlsLnZhbHVlW2tdLCBpZDogZGV0YWlsLmlkfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pIGFzIEZsYWdEZXRhaWxbXVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLFxuICAgICAgICBjYXNlRmllbGRcbiAgICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgYWN0aXZlIGZsYWdzIGluIGEgYENhc2VGaWVsZGAgaW5zdGFuY2UsIHJlY3Vyc2luZyBhbmQgaXRlcmF0aW5nIHRocm91Z2ggc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggZmllbGQgb3IgZWFjaFxuICAgKiBmaWVsZCBpbiBhIENvbGxlY3Rpb24gZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBhY3RpdmVDb3VudCBBbiBhY2N1bXVsYXRpb24gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmxhZ3NcbiAgICogQHBhcmFtIGNhc2VGaWVsZCBBIGBDYXNlRmllbGRgIGluc3RhbmNlIGZvciB3aGljaCB0byBjb3VudCB0aGUgYWN0aXZlIGZsYWdzXG4gICAqIEBwYXJhbSBjdXJyZW50VmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2JqZWN0IG9mIGEgYENhc2VGaWVsZGAgdGhhdCBpcyBhIHN1Yi1maWVsZCBvZiBhIG5vbiByb290LWxldmVsIENvbXBsZXggZmllbGQuXG4gICAqIChGb3IgQ29tcGxleCB0eXBlcywgb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueVxuICAgKiBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgVGhlIGNvdW50IG9mIGFjdGl2ZSBmbGFnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb3VudEFjdGl2ZUZsYWdzSW5DYXNlRmllbGQoYWN0aXZlQ291bnQ6IG51bWJlciwgY2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IG51bWJlciB7XG4gICAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NDYXNlRmllbGQoY2FzZUZpZWxkKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEZsYWdzIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSwgaXQgaXMgYSByb290LWxldmVsIENvbXBsZXggZmllbGQ7IGlmIGl0IGRvZXMgbm90LCBpdCBpcyBhIEZsYWdzXG4gICAgICAgICAgICAvLyBDYXNlRmllbGQgdGhhdCBpcyBhIHN1Yi1maWVsZCB3aXRoaW4gYW5vdGhlciBDb21wbGV4IGZpZWxkLCBzbyB1c2UgdGhlIGN1cnJlbnRWYWx1ZSB2YWx1ZSAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KHZhbHVlKSAmJiB2YWx1ZS5kZXRhaWxzKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gdmFsdWUuZGV0YWlscy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoYWN0aXZlRmxhZ3NDb3VudE9mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50QWN0aXZlRmxhZ3NJbkNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCxcbiAgICAgICAgICAgICAgICAgIHN1YkZpZWxkLFxuICAgICAgICAgICAgICAgICAgdmFsdWVbc3ViRmllbGQuaWRdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSwgYWN0aXZlQ291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRm9yIGEgQ29sbGVjdGlvbiBmaWVsZCwgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGFzIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgQ2FzZUZpZWxkJ3MgdmFsdWUgcHJvcGVydHlcbiAgICAgICAgLy8gYXMgYW4gYXJyYXksIHVubGVzcyB0aGUgY29sbGVjdGlvbiBpcyBhIHN1Yi1maWVsZCBvZiBhIENvbXBsZXggdHlwZSAtIHN1Yi1maWVsZHMgbmV2ZXIgY29udGFpbiB2YWx1ZXNcbiAgICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NGaWVsZFR5cGUoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDb2xsZWN0aW9uIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSAoYW4gYXJyYXkpLCBpdCBpcyBhIHJvb3QtbGV2ZWwgQ29sbGVjdGlvbiBmaWVsZDsgaWYgaXQgZG9lcyBub3QsXG4gICAgICAgICAgICAvLyBpdCBpcyBhIENvbGxlY3Rpb24gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGEgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWVcbiAgICAgICAgICAgIC8vIChpZiBhbnkpIGluc3RlYWRcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlWydkZXRhaWxzJ10pIHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gaXRlbS52YWx1ZVsnZGV0YWlscyddLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcmVkdWN0aW9uIG92ZXIgZWFjaCBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyAoc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgYWJvdmUgZm9yIG5vbi1GbGFnc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgIGNhc2VGaWVsZC52YWx1ZS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0pID0+IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRBY3RpdmVGbGFnc0luQ2FzZUZpZWxkKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQsIGl0ZW0udmFsdWVbc3ViRmllbGQuaWRdKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIGZpZWxkIHR5cGVzXG4gICAgICB9XG4gICAgICByZXR1cm4gYWN0aXZlQ291bnQ7XG4gIH1cblxuICBwdWJsaWMgYnVpbGRDYW5TaG93UHJlZGljYXRlKGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlciwgZm9ybTogYW55KTogUHJlZGljYXRlPFdpemFyZFBhZ2U+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLmdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlciwgZm9ybSk7XG4gICAgcmV0dXJuIChwYWdlOiBXaXphcmRQYWdlKTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gcGFnZS5wYXJzZWRTaG93Q29uZGl0aW9uLm1hdGNoKGN1cnJlbnRTdGF0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50RXZlbnRTdGF0ZShldmVudFRyaWdnZXI6IHsgY2FzZV9maWVsZHM6IENhc2VGaWVsZFtdIH0sIGZvcm06IEZvcm1Hcm91cCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhldmVudFRyaWdnZXIuY2FzZV9maWVsZHMsIGZvcm0uY29udHJvbHNbJ2RhdGEnXS52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgY2xvbmVDYXNlRmllbGQob2JqOiBhbnkpOiBDYXNlRmllbGQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBDYXNlRmllbGQoKSwgb2JqKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZUNhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1lcmdlRmllbGRzKGNhc2VGaWVsZHMsIGZvcm1GaWVsZHMsIEZpZWxkc1V0aWxzLkRFRkFVTFRfTUVSR0VfRlVOQ1RJT04pO1xuICB9XG5cbiAgcHVibGljIG1lcmdlTGFiZWxDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0KTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUZpZWxkcyhjYXNlRmllbGRzLCBmb3JtRmllbGRzLCBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTik7XG4gIH1cblxuICBwdWJsaWMgY29udHJvbEl0ZXJhdG9yKFxuICAgIGFDb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gICAgZm9ybUFycmF5Rm46IChhcnJheTogRm9ybUFycmF5KSA9PiB2b2lkLFxuICAgIGZvcm1Hcm91cEZuOiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4gdm9pZCxcbiAgICBjb250cm9sRm46IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBpZiAoYUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHsgLy8gV2UncmUgaW4gYSBjb2xsZWN0aW9uXG4gICAgICBmb3JtQXJyYXlGbihhQ29udHJvbCk7XG4gICAgfSBlbHNlIGlmIChhQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgeyAvLyBXZSdyZSBpbiBhIGNvbXBsZXggdHlwZS5cbiAgICAgIGZvcm1Hcm91cEZuKGFDb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGFDb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHsgLy8gRm9ybUNvbnRyb2xcbiAgICAgIGNvbnRyb2xGbihhQ29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0LCBtZXJnZUZ1bmN0aW9uOiAoZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpID0+IHZvaWQpOiBvYmplY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogb2JqZWN0ID0gRmllbGRzVXRpbHMuY2xvbmVPYmplY3QoZm9ybUZpZWxkcyk7XG4gICAgY2FzZUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oZmllbGQsIHJlc3VsdCk7XG4gICAgICBpZiAoZmllbGQuZmllbGRfdHlwZSAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gdGhpcy5tZXJnZUZpZWxkcyhmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCByZXN1bHRbZmllbGQuaWRdLCBtZXJnZUZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
558
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9maWVsZHMvZmllbGRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDaEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBb0IsU0FBUyxFQUF5RSxNQUFNLGNBQWMsQ0FBQztBQUNsSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFFbkYsV0FBVztBQUVYLE1BQU0sT0FBTyxXQUFXO0lBV2YsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQVE7UUFDdkMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLE9BQU8scUJBQXFCLENBQUMsSUFBSSxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBdUI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FB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LEtBQUssQ0FBQyxDQUFDO3FDQUNqRDtnQ0FDSCxDQUFDLENBQUMsQ0FBQzs2QkFDSjs0QkFDRCxNQUFNO3lCQUNQO3FCQUNGO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxNQUFNO1NBQ1A7S0FDRjtBQUNILENBQUMsQ0FBQztzRUFsT1MsV0FBVzttREFBWCxXQUFXLFdBQVgsV0FBVzt1RkFBWCxXQUFXO2NBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBwbGFpblRvQ2xhc3NGcm9tRXhpc3QgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBXaXphcmRQYWdlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jYXNlLWVkaXRvci9kb21haW4nO1xuaW1wb3J0IHsgQWJzdHJhY3RGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvYmFzZS1maWVsZC9hYnN0cmFjdC1mb3JtLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGbGFnRGV0YWlsLCBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL2Nhc2UtZmxhZy9kb21haW4vY2FzZS1mbGFnLm1vZGVsJztcbmltcG9ydCB7IENhc2VGbGFnU3RhdHVzIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL2Nhc2UtZmxhZy9lbnVtcy9jYXNlLWZsYWctc3RhdHVzLmVudW0nO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvdXRpbHMnO1xuaW1wb3J0IHsgQ2FzZUV2ZW50VHJpZ2dlciwgQ2FzZUZpZWxkLCBDYXNlVGFiLCBDYXNlVmlldywgRmllbGRUeXBlLCBGaWVsZFR5cGVFbnVtLCBGaXhlZExpc3RJdGVtLCBQcmVkaWNhdGUgfSBmcm9tICcuLi8uLi9kb21haW4nO1xuaW1wb3J0IHsgRm9ybWF0VHJhbnNsYXRvclNlcnZpY2UgfSBmcm9tICcuLi9jYXNlLWZpZWxkcy9mb3JtYXQtdHJhbnNsYXRvci5zZXJ2aWNlJztcblxuLy8gQGR5bmFtaWNcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGaWVsZHNVdGlscyB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGNhc2VMZXZlbENhc2VGbGFnc0ZpZWxkSWQgPSAnY2FzZUZsYWdzJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGUgPSBuZXcgQ3VycmVuY3lQaXBlKCdlbi1HQicpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBkYXRlUGlwZTogRGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUobmV3IEZvcm1hdFRyYW5zbGF0b3JTZXJ2aWNlKCkpO1xuICAvLyBFVUktNDI0NC4gMyBkYXNoZXMgaW5zdGVhZCBvZiAxIHRvIG1ha2UgdGhpcyBsZXNzIGxpa2VseSB0byBjbGFzaCB3aXRoIGEgcmVhbCBmaWVsZC5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMQUJFTF9TVUZGSVggPSAnLS0tTEFCRUwnO1xuICAvLyBIYW5kbGluZyBvZiBEeW5hbWljIExpc3RzIGluIENvbXBsZXggVHlwZXNcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT0xMRUNUSU9OID0gJ0NvbGxlY3Rpb24nO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTVBMRVggPSAnQ29tcGxleCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfRFlOQU1JQ19MSVNUX1RZUEU6IEZpZWxkVHlwZUVudW1bXSA9IFsnRHluYW1pY0xpc3QnLCAnRHluYW1pY1JhZGlvTGlzdCddO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFRvQ2FzZUZpZWxkKG9iajogYW55KTogQ2FzZUZpZWxkIHtcbiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDYXNlRmllbGQpKSB7XG4gICAgICByZXR1cm4gcGxhaW5Ub0NsYXNzRnJvbUV4aXN0KG5ldyBDYXNlRmllbGQoKSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9WYWx1ZXNNYXAoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10pOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlTWFwID0ge307XG4gICAgY2FzZUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIHZhbHVlTWFwW2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLnByZXBhcmVWYWx1ZShmaWVsZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlTWFwO1xuICB9XG5cbiAgLy8gcHVibGljIHN0YXRpYyBnZXRUeXBlKGVsZW06IGFueSk6IHN0cmluZyB7XG4gIC8vICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbGVtKS5zbGljZSg4LCAtMSk7XG4gIC8vIH1cblxuICBwdWJsaWMgc3RhdGljIGlzT2JqZWN0KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgZWxlbSA9PT0gJ29iamVjdCcgJiYgZWxlbSAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOb25FbXB0eU9iamVjdChlbGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09iamVjdChlbGVtKSAmJiBPYmplY3Qua2V5cyhlbGVtKS5sZW5ndGggIT09IDA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXkoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZWxlbSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFyZUNvbGxlY3Rpb25WYWx1ZXNTaW1wbGVGaWVsZHMoZmllbGRWYWx1ZTogYW55W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNPYmplY3QoZmllbGRWYWx1ZVswXVsndmFsdWUnXSkgJiYgIUFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZVswXVsndmFsdWUnXSkgJiYgZmllbGRWYWx1ZVswXVsndmFsdWUnXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb25PZlNpbXBsZVR5cGVzKGZpZWxkVmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQ29sbGVjdGlvbihmaWVsZFZhbHVlKSAmJiB0aGlzLmFyZUNvbGxlY3Rpb25WYWx1ZXNTaW1wbGVGaWVsZHMoZmllbGRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTXVsdGlTZWxlY3RWYWx1ZShmb3JtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc05vbkVtcHR5QXJyYXkoZm9ybSkgJiYgIXRoaXMuaXNDb2xsZWN0aW9uV2l0aFZhbHVlKGZvcm0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc05vbkVtcHR5QXJyYXkocGFnZUZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhZ2VGb3JtRmllbGRzKSAmJiBwYWdlRm9ybUZpZWxkc1swXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb24ocGFnZUZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTm9uRW1wdHlBcnJheShwYWdlRm9ybUZpZWxkcykgJiYgdGhpcy5pc0NvbGxlY3Rpb25XaXRoVmFsdWUocGFnZUZvcm1GaWVsZHMpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb25XaXRoVmFsdWUocGFnZUZvcm1GaWVsZHM6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhZ2VGb3JtRmllbGRzWzBdWyd2YWx1ZSddICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNsb25lT2JqZWN0KG9iajogYW55KTogYW55IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgfVxuXG4gIC8vIHRlbXBvcmFyeSBmdW5jdGlvbiB1bnRpbCB0aGlzIGNhbiBiZSBtb3ZlZCB0byBDYXNlVmlldyBjbGFzcyAoUkRNLTI2ODEpXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q2FzZUZpZWxkcyhjYXNlVmlldzogQ2FzZVZpZXcpOiBDYXNlRmllbGRbXSB7XG4gICAgY29uc3QgY2FzZURhdGFGaWVsZHM6IENhc2VGaWVsZFtdID0gY2FzZVZpZXcudGFicy5yZWR1Y2UoKGFjYzogQ2FzZUZpZWxkW10sIHRhYjogQ2FzZVRhYikgPT4ge1xuICAgICAgcmV0dXJuIGFjYy5jb25jYXQodGFiLmZpZWxkcyk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgbWV0YWRhdGFGaWVsZHM6IENhc2VGaWVsZFtdID0gY2FzZVZpZXcubWV0YWRhdGFGaWVsZHM7XG4gICAgcmV0dXJuIG1ldGFkYXRhRmllbGRzLmNvbmNhdChjYXNlRGF0YUZpZWxkcy5maWx0ZXIoKGNhc2VGaWVsZDogQ2FzZUZpZWxkKSA9PiB7XG4gICAgICByZXR1cm4gbWV0YWRhdGFGaWVsZHMuZmluZEluZGV4KG1ldGFkYXRhRmllbGQgPT4gbWV0YWRhdGFGaWVsZC5pZCA9PT0gY2FzZUZpZWxkLmlkKSA8IDA7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhZGRDYXNlRmllbGRBbmRDb21wb25lbnRSZWZlcmVuY2VzIChjOiBBYnN0cmFjdENvbnRyb2wsIGNmOiBDYXNlRmllbGQsIGNvbXA6IEFic3RyYWN0Rm9ybUZpZWxkQ29tcG9uZW50KTogdm9pZCB7XG4gICAgY1snY2FzZUZpZWxkJ10gPSBjZjtcbiAgICBjWydjb21wb25lbnQnXSA9IGNvbXA7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlIGNoZWNrIG9mIGFuIGFycmF5IG9yIG9iamVjdCBhbmQgaXRzIGRlc2NlbmRhbnRzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYW55IG5vbi1lbXB0eSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBvYmplY3QgVGhlIGFycmF5IG9yIG9iamVjdCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5IG9yIG9iamVjdCAob3IgYSBkZXNjZW5kYW50KSBjb250YWlucyBhdCBsZWFzdCBvbmUgbm9uLWVtcHR5IHZhbHVlOyBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb250YWluc05vbkVtcHR5VmFsdWVzKG9iamVjdDogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMob2JqZWN0KS5tYXAoa2V5ID0+IG9iamVjdFtrZXldKTtcbiAgICBjb25zdCBvYmplY3RSZWZzID0gW107XG4gICAgLy8gQWxzbyB0ZXN0IGZvciBudW1lcmljIHZhbHVlcywgYW5kIGxlbmd0aCA+IDAgZm9yIG5vbi1udW1lcmljIHZhbHVlcyBiZWNhdXNlIHRoaXMgY292ZXJzIGJvdGggc3RyaW5ncyBhbmQgYXJyYXlzLlxuICAgIC8vIE5vdGU6IERlbGliZXJhdGUgdXNlIG9mIG5vbi1lcXVhbGl0eSAoIT0pIG9wZXJhdG9yIGZvciBudWxsIGNoZWNrLCB0byBoYW5kbGUgYm90aCBudWxsIGFuZCB1bmRlZmluZWQgdmFsdWVzLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHJpcGxlLWVxdWFsc1xuICAgIGNvbnN0IGhhc05vbk51bGxQcmltaXRpdmUgPSB2YWx1ZXMuc29tZSh4ID0+ICh4ICE9IG51bGwgJiZcbiAgICAgICgodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHguY29uc3RydWN0b3IgPT09IE9iamVjdCkgfHwgQXJyYXkuaXNBcnJheSh4KVxuICAgICAgICA/ICFvYmplY3RSZWZzLnB1c2goeClcbiAgICAgICAgOiB0eXBlb2YgeCA9PT0gJ251bWJlcicgfHwgeC5sZW5ndGggPiAwKVxuICAgICkpO1xuICAgIHJldHVybiAhaGFzTm9uTnVsbFByaW1pdGl2ZSA/IG9iamVjdFJlZnMuc29tZSh5ID0+IHRoaXMuY29udGFpbnNOb25FbXB0eVZhbHVlcyh5KSkgOiBoYXNOb25OdWxsUHJpbWl0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIGhhbmRsZU5lc3RlZER5bmFtaWNMaXN0cygpXG4gICAqIFJlYXNzaWducyBsaXN0X2l0ZW0gYW5kIHZhbHVlIGRhdGEgdG8gRHluYW1pY0xpc3QgY2hpbGRyZW5cbiAgICogZG93biB0aGUgdHJlZS4gU2VydmVyIHJlc3BvbnNlIHJldHVybnMgZGF0YSBvbmx5IGluXG4gICAqIHRoZSBgdmFsdWVgIG9iamVjdCBvZiBwYXJlbnQgY29tcGxleCB0eXBlXG4gICAqXG4gICAqIEVVSS0yNTMwIER5bmFtaWMgTGlzdHMgZm9yIEVsZW1lbnRzIGluIGEgQ29tcGxleCBUeXBlXG4gICAqXG4gICAqIEBwYXJhbSBqc29uQm9keSAtIHsgY2FzZV9maWVsZHM6IFsgQ2FzZUZpZWxkLCBDYXNlRmllbGQgXSB9XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhhbmRsZU5lc3RlZER5bmFtaWNMaXN0cyhqc29uQm9keTogeyBjYXNlX2ZpZWxkczogQ2FzZUZpZWxkW10gfSk6IGFueSB7XG4gICAgaWYgKGpzb25Cb2R5LmNhc2VfZmllbGRzKSB7XG4gICAgICBqc29uQm9keS5jYXNlX2ZpZWxkcy5mb3JFYWNoKGNhc2VGaWVsZCA9PiB7XG4gICAgICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZSkge1xuICAgICAgICAgIHRoaXMuc2V0RHluYW1pY0xpc3REZWZpbml0aW9uKGNhc2VGaWVsZCwgY2FzZUZpZWxkLmZpZWxkX3R5cGUsIGNhc2VGaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBqc29uQm9keTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHByZXBhcmVWYWx1ZShmaWVsZDogQ2FzZUZpZWxkKTogYW55IHtcbiAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgIHJldHVybiBmaWVsZC52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLmlzQ29tcGxleCgpKSB7XG4gICAgICBjb25zdCB2YWx1ZU1hcCA9IHt9O1xuICAgICAgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKGNvbXBsZXhGaWVsZCA9PiB7XG4gICAgICAgIHZhbHVlTWFwW2NvbXBsZXhGaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5wcmVwYXJlVmFsdWUoY29tcGxleEZpZWxkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlTWFwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTUVSR0VfRlVOQ1RJT04gPSBmdW5jdGlvbiBtZXJnZUZ1bmN0aW9uKGZpZWxkOiBDYXNlRmllbGQsIHJlc3VsdDogb2JqZWN0KTogdm9pZCB7XG4gICAgaWYgKCFyZXN1bHQuaGFzT3duUHJvcGVydHkoZmllbGQuaWQpKSB7XG4gICAgICByZXN1bHRbZmllbGQuaWRdID0gZmllbGQudmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IExBQkVMX01FUkdFX0ZVTkNUSU9OID0gZnVuY3Rpb24gbWVyZ2VGdW5jdGlvbihmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCk6IHZvaWQge1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXN1bHQgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuaGFzT3duUHJvcGVydHkoZmllbGQuaWQpKSB7XG4gICAgICByZXN1bHRbZmllbGQuaWRdID0gZmllbGQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBzd2l0Y2gtZGVmYXVsdFxuICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdGaXhlZExpc3QnOlxuICAgICAgY2FzZSAnRml4ZWRSYWRpb0xpc3QnOiB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQsIHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ011bHRpU2VsZWN0TGlzdCc6IHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHJlc3VsdFtmaWVsZC5pZF0gfHwgW107XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZCArIEZpZWxkc1V0aWxzLkxBQkVMX1NVRkZJWF0gPSBbXTtcbiAgICAgICAgZmllbGRWYWx1ZS5mb3JFYWNoKChjb2RlOiBhbnksIGlkeDogYW55KSA9PiB7XG4gICAgICAgICAgcmVzdWx0W2ZpZWxkLmlkICsgRmllbGRzVXRpbHMuTEFCRUxfU1VGRklYXVtpZHhdID0gRmllbGRzVXRpbHMuZ2V0Rml4ZWRMaXN0TGFiZWxCeUNvZGVPckVtcHR5KGZpZWxkLCBjb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTGFiZWwnOiB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRMYWJlbChmaWVsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTW9uZXlHQlAnOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRNb25leUdCUChmaWVsZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdEYXRlJzoge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gKHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0RGF0ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdDb21wbGV4Jzoge1xuICAgICAgICBpZiAocmVzdWx0W2ZpZWxkLmlkXSAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKChmOiBDYXNlRmllbGQpID0+IHtcbiAgICAgICAgICAgIGlmIChbJ0NvbGxlY3Rpb24nLCAnQ29tcGxleCcsICdNdWx0aVNlbGVjdExpc3QnXS5pbmRleE9mKGYuZmllbGRfdHlwZS50eXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKGYsIHJlc3VsdFtmaWVsZC5pZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQ29sbGVjdGlvbic6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIGlmIChlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ01vbmV5R0JQJzoge1xuICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSBGaWVsZHNVdGlscy5nZXRNb25leUdCUChlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdEYXRlJzoge1xuICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSBGaWVsZHNVdGlscy5nZXREYXRlKGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0NvbXBsZXgnOiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKChmOiBDYXNlRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFsnQ29sbGVjdGlvbicsICdDb21wbGV4JywgJ011bHRpU2VsZWN0TGlzdCddLmluZGV4T2YoZi5maWVsZF90eXBlLnR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTihmLCBlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgYE1vbmV5R0JQYCB2YWx1ZSB0byBpbmNsdWRlIGN1cnJlbmN5IHVuaXRzLlxuICAgKiBAcGFyYW0gZmllbGRWYWx1ZSBUaGUgQ3VycmVuY3lQaXBlIGV4cGVjdHMgYW4gYGFueWAgcGFyYW1ldGVyIHNvIHRoaXMgbXVzdCBhbHNvIGJlIGBhbnlgLFxuICAgKiBidXQgaXQgc2hvdWxkIGJlIFwibnVtYmVyLWxpa2VcIiAoZS5nLiwgJzEyMzQnKVxuICAgKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBzdHJpbmcgKGUuZy4sIMKjMTIuMzQpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRNb25leUdCUChmaWVsZFZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZFZhbHVlID8gRmllbGRzVXRpbHMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShmaWVsZFZhbHVlIC8gMTAwLCAnR0JQJywgJ3N5bWJvbCcpIDogZmllbGRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExhYmVsKGZpZWxkVmFsdWU6IENhc2VGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWUgPyBmaWVsZFZhbHVlLmxhYmVsIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXREYXRlKGZpZWxkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZvcm1hdCBzcGVjaWZpZWQgaGVyZSB3YXNuJ3QgcHJldmlvdXNseSB3b3JraW5nIGFuZCBsb3RzIG9mIHRlc3RzIGRlcGVuZCBvbiBpdCBub3Qgd29ya2luZ1xuICAgICAgLy8gTm93IHRoYXQgZm9ybWF0cyB3b3JrIGNvcnJlY3RseSBtYW55IHRlc3Qgd291bGQgYnJlYWsgLSBhbmQgdGhpcyBjb3VsZCBhZmZlY3Qgc2VydmljZXMgd2hpY2ggbWF5IGRlcGVuZCBvblxuICAgICAgLy8gdGhlIG9yZ2luYWwgYmVoYXZpb3VyIG9mIHJldHVybmluZyBkYXRlcyBpbiBcImQgTU1NIHl5eXlcIlxuICAgICAgLy8gTm90ZSAtIHJlcGxhY2VkICdkJyB3aXRoICdEJyBhcyBkYXRlcGlwZSB1c2luZyBtb21lbnQgdG8gYXZvaWQgdGltZXpvbmUgZGlzY3JlcGFuY2llc1xuICAgICAgcmV0dXJuIEZpZWxkc1V0aWxzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZFZhbHVlLCBudWxsLCAnRCBNTU0geXl5eScpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHRGb3JJbnZhbGlkRmllbGQoJ0RhdGUnLCBmaWVsZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQ6IENhc2VGaWVsZCwgY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWxldmFudEl0ZW06IEZpeGVkTGlzdEl0ZW0gPSBjb2RlID8gZmllbGQuZmllbGRfdHlwZS5maXhlZF9saXN0X2l0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmNvZGUgPT09IGNvZGUpIDogbnVsbDtcbiAgICByZXR1cm4gcmVsZXZhbnRJdGVtID8gcmVsZXZhbnRJdGVtLmxhYmVsIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB0ZXh0Rm9ySW52YWxpZEZpZWxkKHR5cGU6IHN0cmluZywgaW52YWxpZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgeyBJbnZhbGlkICR7dHlwZX06ICR7aW52YWxpZFZhbHVlfSB9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQ6IENhc2VGaWVsZCwgY2FzZUZpZWxkVHlwZTogRmllbGRUeXBlLCByb290Q2FzZUZpZWxkOiBDYXNlRmllbGQpIHtcbiAgICBpZiAoY2FzZUZpZWxkVHlwZS50eXBlID09PSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT01QTEVYKSB7XG5cbiAgICAgIGNhc2VGaWVsZFR5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaXNEeW5hbWljRmllbGQgPSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9EWU5BTUlDX0xJU1RfVFlQRS5pbmRleE9mKGZpZWxkLmZpZWxkX3R5cGUudHlwZSkgIT09IC0xO1xuXG4gICAgICAgICAgaWYgKGlzRHluYW1pY0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljTGlzdFZhbHVlID0gdGhpcy5nZXREeW5hbWljTGlzdFZhbHVlKHJvb3RDYXNlRmllbGQudmFsdWUsIGZpZWxkLmlkKTtcbiAgICAgICAgICAgIGlmIChkeW5hbWljTGlzdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxpc3RfaXRlbXMgPSBkeW5hbWljTGlzdFZhbHVlWzBdLmxpc3RfaXRlbXM7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhWYWx1ZSA9IGR5bmFtaWNMaXN0VmFsdWUubWFwKGRhdGEgPT4gZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0ge1xuICAgICAgICAgICAgICAgIGxpc3RfaXRlbXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBsZXhWYWx1ZS5sZW5ndGggPiAwID8gY29tcGxleFZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0ge1xuICAgICAgICAgICAgICAgIC4uLnZhbHVlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZpZWxkLmZvcm1hdHRlZF92YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZC5mb3JtYXR0ZWRfdmFsdWUsXG4gICAgICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oZmllbGQsIGZpZWxkLmZpZWxkX3R5cGUsIHJvb3RDYXNlRmllbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FzZUZpZWxkVHlwZS50eXBlID09PSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT0xMRUNUSU9OKSB7XG4gICAgICBpZiAoY2FzZUZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpIHtcbiAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oY2FzZUZpZWxkLCBjYXNlRmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSwgcm9vdENhc2VGaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RHluYW1pY0xpc3RWYWx1ZShqc29uQmxvY2s6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0ganNvbkJsb2NrID8gdGhpcy5nZXROZXN0ZWRGaWVsZFZhbHVlcyhqc29uQmxvY2ssIGtleSwgW10pIDogW107XG5cbiAgICByZXR1cm4gZGF0YS5sZW5ndGggPiAwID8gZGF0YSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXROZXN0ZWRGaWVsZFZhbHVlcyhqc29uRGF0YTogYW55LCBrZXk6IHN0cmluZywgb3V0cHV0OiBhbnlbXSA9IFtdKSB7XG4gICAgaWYgKGpzb25EYXRhICYmIGpzb25EYXRhW2tleV0pIHtcbiAgICAgIG91dHB1dC5wdXNoKGpzb25EYXRhW2tleV0pO1xuICAgIH0gZWxzZSAge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50S2V5IGluIGpzb25EYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbkRhdGEgPT09ICdvYmplY3QnICYmIGpzb25EYXRhLmhhc093blByb3BlcnR5KGVsZW1lbnRLZXkpKSB7XG4gICAgICAgICAgdGhpcy5nZXROZXN0ZWRGaWVsZFZhbHVlcyhqc29uRGF0YVtlbGVtZW50S2V5XSwga2V5LCBvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRmxhZ3NDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoIWNhc2VGaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzRmxhZ3NGaWVsZFR5cGUoY2FzZUZpZWxkLmZpZWxkX3R5cGUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ZsYWdMYXVuY2hlckNhc2VGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FzZUZpZWxkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdGbGFnTGF1bmNoZXInO1xuICB9XG5cblx0cHVibGljIHN0YXRpYyBpc0NvbXBvbmVudExhdW5jaGVyQ2FzZUZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXNlRmllbGQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBvbmVudExhdW5jaGVyJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnc0ZpZWxkVHlwZShmaWVsZFR5cGU6IEZpZWxkVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZHVtbXkgZmllbGQgdHlwZSBJRCBvZiBcIkNhc2VGbGFnXCIgZm9yIHRlc3RpbmcgYW5kIHRoZSByZWFsIGZpZWxkIHR5cGVcbiAgICAvLyBJRCBvZiBcIkZsYWdzXCJcbiAgICByZXR1cm4gKGZpZWxkVHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgKGZpZWxkVHlwZS5pZCA9PT0gJ0Nhc2VGbGFnJyB8fCBmaWVsZFR5cGUuaWQgPT09ICdGbGFncycpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGZsYWdzIGRhdGEgZnJvbSBhIGBDYXNlRmllbGRgIGluc3RhbmNlLCByZWN1cnNpbmcgYW5kIGl0ZXJhdGluZyB0aHJvdWdoIHN1Yi1maWVsZHMgb2YgYSBDb21wbGV4IGZpZWxkIG9yXG4gICAqIGVhY2ggZmllbGQgaW4gYSBDb2xsZWN0aW9uIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZmxhZ3MgQW4gYXJyYXkgZm9yIGFjY3VtdWxhdGluZyBleHRyYWN0ZWQgZmxhZ3MgZGF0YSBhbmQgZGVyaXZlZCBgRm9ybUdyb3VwYCBwYXRoc1xuICAgKiBAcGFyYW0gY2FzZUZpZWxkIEEgYENhc2VGaWVsZGAgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBmbGFncyBkYXRhXG4gICAqIEBwYXJhbSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCBBIChkb3QtZGVsaW1pdGVkKSBzdHJpbmcgZm9yIGNvbmNhdGVuYXRpbmcgdGhlIG5hbWUgb2YgZWFjaCBjb250cm9sIHRoYXQgZm9ybXMgdGhlIHBhdGhcbiAgICogdG8gdGhlIGBGb3JtR3JvdXBgIGZvciB0aGUgYEZsYWdzYCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdG9wTGV2ZWxDYXNlRmllbGQgVGhlIHRvcC1sZXZlbCBgQ2FzZUZpZWxkYCB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSBwcm9wZXJ0eS4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIF9vbmx5XG4gICAqIHRvcC1sZXZlbF8gYENhc2VGaWVsZGBzIGNvbnRhaW4gYWN0dWFsIHZhbHVlcyBhbmQgYSByZWZlcmVuY2UgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCB0byBzdWNoIGEgZmllbGRcbiAgICogQHBhcmFtIGN1cnJlbnRWYWx1ZSBUaGUgY3VycmVudCB2YWx1ZSBvYmplY3Qgb2YgYSBgQ2FzZUZpZWxkYCB0aGF0IGlzIGEgc3ViLWZpZWxkIG9mIGEgbm9uIHJvb3QtbGV2ZWwgQ29tcGxleCBmaWVsZC5cbiAgICogUmVxdWlyZWQgZm9yIG1hcHBpbmcgdGhlIGBDYXNlRmllbGRgIHZhbHVlIHRvIGEgYEZsYWdzYCBvYmplY3QgaWYgaXQgaXMgYSBcIkZsYWdzXCIgYENhc2VGaWVsZGAuIChGb3IgQ29tcGxleCB0eXBlcyxcbiAgICogb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueSBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsXG4gICAqIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhgLCBlYWNoIGluc3RhbmNlIGNvbXByaXNpbmcgYSBgRmxhZ3NgIG9iamVjdCBkZXJpdmVkIGZyb20gYSBgQ2FzZUZpZWxkYFxuICAgKiBvZiB0eXBlIFwiRmxhZ3NcIiwgYW5kIHRoZSBkb3QtZGVsaW1pdGVkIHBhdGggc3RyaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIGBGb3JtR3JvdXBgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKGZsYWdzOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoW10sIGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcsIHRvcExldmVsQ2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhbXSB7XG4gICAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgRmxhZ3MgQ2FzZUZpZWxkICh0aGVzZSBhcmUgaW1wbGVtZW50ZWQgYXMgQ29tcGxleCB0eXBlcyksIGl0IGNhbiBiZSBtYXBwZWQgdG8gYSBGbGFnc1xuICAgICAgICAgIC8vIG9iamVjdCBpbW1lZGlhdGVseVxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBGbGFncyBDYXNlRmllbGQgaGFzIGEgdmFsdWUsIGl0IGlzIGEgcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkOyBpZiBpdCBkb2VzIG5vdCwgaXQgaXMgYSBGbGFnc1xuICAgICAgICAgICAgLy8gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGFub3RoZXIgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWUgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGluc3RlYWQuIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgXCJjYXNlRmxhZ3NcIiBGbGFncyBDYXNlRmllbGQsIHdoaWNoIHdpbGwgaGF2ZSBhbiBlbXB0eSBvYmplY3QgdmFsdWVcbiAgICAgICAgICAgIC8vIGluaXRpYWxseSwgYmVjYXVzZSBubyBwYXJ0eSBuYW1lIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY2FzZUZpZWxkLnZhbHVlKSB8fFxuICAgICAgICAgICAgICBjYXNlRmllbGQuaWQgPT09IHRoaXMuY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCkge1xuICAgICAgICAgICAgICBmbGFncy5wdXNoKHRoaXMubWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSBgLiR7Y2FzZUZpZWxkLmlkfWA7XG4gICAgICAgICAgICAgIGZsYWdzLnB1c2godGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChcbiAgICAgICAgICAgICAgICBjYXNlRmllbGQuaWQsIGN1cnJlbnRWYWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGZsYWdzID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGZsYWdzT2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgdG9wTGV2ZWxDYXNlRmllbGQsIHZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEZvciBhIENvbGxlY3Rpb24gZmllbGQsIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBhcyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIENhc2VGaWVsZCdzIHZhbHVlIHByb3BlcnR5XG4gICAgICAgIC8vIGFzIGFuIGFycmF5LCB1bmxlc3MgdGhlIGNvbGxlY3Rpb24gaXMgYSBzdWItZmllbGQgb2YgYSBDb21wbGV4IHR5cGUgLSBzdWItZmllbGRzIG5ldmVyIGNvbnRhaW4gdmFsdWVzXG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIEZsYWdzIENhc2VGaWVsZHMsIHRoZXNlIGNhbiBiZSBtYXBwZWQgdG8gRmxhZ3Mgb2JqZWN0cyBpbW1lZGlhdGVseVxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzRmllbGRUeXBlKGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ29sbGVjdGlvbiBDYXNlRmllbGQgaGFzIGEgdmFsdWUgKGFuIGFycmF5KSwgaXQgaXMgYSByb290LWxldmVsIENvbGxlY3Rpb24gZmllbGQ7IGlmIGl0IGRvZXMgbm90LFxuICAgICAgICAgICAgLy8gaXQgaXMgYSBDb2xsZWN0aW9uIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlXG4gICAgICAgICAgICAvLyAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCBwYXRoRnJhZ21lbnQgPSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSAnLmluZGV4LnZhbHVlJztcbiAgICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgY2FzZUZpZWxkLnZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEF0IGVhY2ggaXRlcmF0aW9uLCByZXBsYWNlIHRoZSBcImluZGV4XCIgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGluZGV4XG4gICAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgPSBwYXRoRnJhZ21lbnQucmVwbGFjZSgnaW5kZXgnLCBpbmRleC50b1N0cmluZygxMCkpO1xuICAgICAgICAgICAgICAgIGZsYWdzLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGl0ZW0uaWQsIGl0ZW0udmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCBjYXNlRmllbGQpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFtdKS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MucHVzaChcbiAgICAgICAgICAgICAgICAgIHRoaXMubWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoaXRlbS5pZCwgaXRlbS52YWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcmVkdWN0aW9uIG92ZXIgZWFjaCBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyAoc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgYWJvdmUgZm9yIG5vbi1GbGFnc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGhGcmFnbWVudCA9IHBhdGhUb0ZsYWdzRm9ybUdyb3VwICs9ICcuaW5kZXgudmFsdWUnO1xuICAgICAgICAgICAgICBjYXNlRmllbGQudmFsdWUuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQXQgZWFjaCBpdGVyYXRpb24sIHJlcGxhY2UgdGhlIFwiaW5kZXhcIiBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgaW5kZXhcbiAgICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MgPSBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKFxuICAgICAgICAgICAgICAgICAgICBmbGFnc09mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkLCBpdGVtLnZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgICAgfSwgZmxhZ3MpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBmaWVsZCB0eXBlc1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsYWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZC5pZCwgY2FzZUZpZWxkLnZhbHVlLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgY2FzZUZpZWxkKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGlkOiBzdHJpbmcsIHZhbHVlOiBvYmplY3QsXG4gICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXA6IHN0cmluZywgY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZsYWdzOiB7XG4gICAgICAgICAgZmxhZ3NDYXNlRmllbGRJZDogaWQsXG4gICAgICAgICAgcGFydHlOYW1lOiB2YWx1ZSA/IHZhbHVlWydwYXJ0eU5hbWUnXSA6IG51bGwsXG4gICAgICAgICAgcm9sZU9uQ2FzZTogdmFsdWUgPyB2YWx1ZVsncm9sZU9uQ2FzZSddIDogbnVsbCxcbiAgICAgICAgICBkZXRhaWxzOiB2YWx1ZSAmJiB2YWx1ZVsnZGV0YWlscyddICYmIHZhbHVlWydkZXRhaWxzJ10ubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyAodmFsdWVbJ2RldGFpbHMnXSBhcyBhbnlbXSkubWFwKGRldGFpbCA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAuLi5PYmplY3Qua2V5cyhkZXRhaWwudmFsdWUpLm1hcChrID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgaWQgcHJvcGVydHkgc2V0IGJlbG93IHdpbGwgYmUgbnVsbCBmb3IgYSBuZXcgY2FzZSBmbGFnLCBhbmQgYSB1bmlxdWUgaWQgcmV0dXJuZWQgZnJvbSBDQ0Qgd2hlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGZsYWdcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGspIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIGRhdGUtdGltZSBmaWVsZHNcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lTW9kaWZpZWQnOlxuICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZVRpbWVDcmVhdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtba106IGRldGFpbC52YWx1ZVtrXSA/IG5ldyBEYXRlKGRldGFpbC52YWx1ZVtrXSkgOiBudWxsLCBpZDogZGV0YWlsLmlkfTtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgYSBcInllcy9ub1wiIGZpZWxkXG4gICAgICAgICAgICAgICAgICBjYXNlICdoZWFyaW5nUmVsZXZhbnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV0YWlsLnZhbHVlW2tdLnRvVXBwZXJDYXNlKCkgPT09ICdZRVMnID8ge1trXTogdHJ1ZSwgaWQ6IGRldGFpbC5pZH0gOiB7W2tdOiBmYWxzZSwgaWQ6IGRldGFpbC5pZH07XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1trXTogZGV0YWlsLnZhbHVlW2tdLCBpZDogZGV0YWlsLmlkfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pIGFzIEZsYWdEZXRhaWxbXVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLFxuICAgICAgICBjYXNlRmllbGRcbiAgICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgYWN0aXZlIGZsYWdzIGluIGEgYENhc2VGaWVsZGAgaW5zdGFuY2UsIHJlY3Vyc2luZyBhbmQgaXRlcmF0aW5nIHRocm91Z2ggc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggZmllbGQgb3IgZWFjaFxuICAgKiBmaWVsZCBpbiBhIENvbGxlY3Rpb24gZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBhY3RpdmVDb3VudCBBbiBhY2N1bXVsYXRpb24gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmxhZ3NcbiAgICogQHBhcmFtIGNhc2VGaWVsZCBBIGBDYXNlRmllbGRgIGluc3RhbmNlIGZvciB3aGljaCB0byBjb3VudCB0aGUgYWN0aXZlIGZsYWdzXG4gICAqIEBwYXJhbSBjdXJyZW50VmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2JqZWN0IG9mIGEgYENhc2VGaWVsZGAgdGhhdCBpcyBhIHN1Yi1maWVsZCBvZiBhIG5vbiByb290LWxldmVsIENvbXBsZXggZmllbGQuXG4gICAqIChGb3IgQ29tcGxleCB0eXBlcywgb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueVxuICAgKiBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgVGhlIGNvdW50IG9mIGFjdGl2ZSBmbGFnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb3VudEFjdGl2ZUZsYWdzSW5DYXNlRmllbGQoYWN0aXZlQ291bnQ6IG51bWJlciwgY2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IG51bWJlciB7XG4gICAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NDYXNlRmllbGQoY2FzZUZpZWxkKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEZsYWdzIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSwgaXQgaXMgYSByb290LWxldmVsIENvbXBsZXggZmllbGQ7IGlmIGl0IGRvZXMgbm90LCBpdCBpcyBhIEZsYWdzXG4gICAgICAgICAgICAvLyBDYXNlRmllbGQgdGhhdCBpcyBhIHN1Yi1maWVsZCB3aXRoaW4gYW5vdGhlciBDb21wbGV4IGZpZWxkLCBzbyB1c2UgdGhlIGN1cnJlbnRWYWx1ZSB2YWx1ZSAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KHZhbHVlKSAmJiB2YWx1ZS5kZXRhaWxzKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gdmFsdWUuZGV0YWlscy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoYWN0aXZlRmxhZ3NDb3VudE9mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50QWN0aXZlRmxhZ3NJbkNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCxcbiAgICAgICAgICAgICAgICAgIHN1YkZpZWxkLFxuICAgICAgICAgICAgICAgICAgdmFsdWVbc3ViRmllbGQuaWRdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSwgYWN0aXZlQ291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRm9yIGEgQ29sbGVjdGlvbiBmaWVsZCwgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGFzIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgQ2FzZUZpZWxkJ3MgdmFsdWUgcHJvcGVydHlcbiAgICAgICAgLy8gYXMgYW4gYXJyYXksIHVubGVzcyB0aGUgY29sbGVjdGlvbiBpcyBhIHN1Yi1maWVsZCBvZiBhIENvbXBsZXggdHlwZSAtIHN1Yi1maWVsZHMgbmV2ZXIgY29udGFpbiB2YWx1ZXNcbiAgICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NGaWVsZFR5cGUoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDb2xsZWN0aW9uIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSAoYW4gYXJyYXkpLCBpdCBpcyBhIHJvb3QtbGV2ZWwgQ29sbGVjdGlvbiBmaWVsZDsgaWYgaXQgZG9lcyBub3QsXG4gICAgICAgICAgICAvLyBpdCBpcyBhIENvbGxlY3Rpb24gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGEgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWVcbiAgICAgICAgICAgIC8vIChpZiBhbnkpIGluc3RlYWRcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlWydkZXRhaWxzJ10pIHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gaXRlbS52YWx1ZVsnZGV0YWlscyddLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcmVkdWN0aW9uIG92ZXIgZWFjaCBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyAoc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgYWJvdmUgZm9yIG5vbi1GbGFnc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgIGNhc2VGaWVsZC52YWx1ZS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0pID0+IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRBY3RpdmVGbGFnc0luQ2FzZUZpZWxkKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQsIGl0ZW0udmFsdWVbc3ViRmllbGQuaWRdKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIGZpZWxkIHR5cGVzXG4gICAgICB9XG4gICAgICByZXR1cm4gYWN0aXZlQ291bnQ7XG4gIH1cblxuICBwdWJsaWMgYnVpbGRDYW5TaG93UHJlZGljYXRlKGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlciwgZm9ybTogYW55KTogUHJlZGljYXRlPFdpemFyZFBhZ2U+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLmdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlciwgZm9ybSk7XG4gICAgcmV0dXJuIChwYWdlOiBXaXphcmRQYWdlKTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gcGFnZS5wYXJzZWRTaG93Q29uZGl0aW9uLm1hdGNoKGN1cnJlbnRTdGF0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50RXZlbnRTdGF0ZShldmVudFRyaWdnZXI6IHsgY2FzZV9maWVsZHM6IENhc2VGaWVsZFtdIH0sIGZvcm06IEZvcm1Hcm91cCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhldmVudFRyaWdnZXIuY2FzZV9maWVsZHMsIGZvcm0uY29udHJvbHNbJ2RhdGEnXS52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgY2xvbmVDYXNlRmllbGQob2JqOiBhbnkpOiBDYXNlRmllbGQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBDYXNlRmllbGQoKSwgb2JqKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZUNhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1lcmdlRmllbGRzKGNhc2VGaWVsZHMsIGZvcm1GaWVsZHMsIEZpZWxkc1V0aWxzLkRFRkFVTFRfTUVSR0VfRlVOQ1RJT04pO1xuICB9XG5cbiAgcHVibGljIG1lcmdlTGFiZWxDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0KTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUZpZWxkcyhjYXNlRmllbGRzLCBmb3JtRmllbGRzLCBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTik7XG4gIH1cblxuICBwdWJsaWMgY29udHJvbEl0ZXJhdG9yKFxuICAgIGFDb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gICAgZm9ybUFycmF5Rm46IChhcnJheTogRm9ybUFycmF5KSA9PiB2b2lkLFxuICAgIGZvcm1Hcm91cEZuOiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4gdm9pZCxcbiAgICBjb250cm9sRm46IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBpZiAoYUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHsgLy8gV2UncmUgaW4gYSBjb2xsZWN0aW9uXG4gICAgICBmb3JtQXJyYXlGbihhQ29udHJvbCk7XG4gICAgfSBlbHNlIGlmIChhQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgeyAvLyBXZSdyZSBpbiBhIGNvbXBsZXggdHlwZS5cbiAgICAgIGZvcm1Hcm91cEZuKGFDb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGFDb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHsgLy8gRm9ybUNvbnRyb2xcbiAgICAgIGNvbnRyb2xGbihhQ29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0LCBtZXJnZUZ1bmN0aW9uOiAoZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpID0+IHZvaWQpOiBvYmplY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogb2JqZWN0ID0gRmllbGRzVXRpbHMuY2xvbmVPYmplY3QoZm9ybUZpZWxkcyk7XG4gICAgY2FzZUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oZmllbGQsIHJlc3VsdCk7XG4gICAgICBpZiAoZmllbGQuZmllbGRfdHlwZSAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gdGhpcy5tZXJnZUZpZWxkcyhmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCByZXN1bHRbZmllbGQuaWRdLCBtZXJnZUZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
@@ -21,6 +21,9 @@ export class FieldTypeSanitiser {
21
21
  }
22
22
  caseFields.forEach(caseField => {
23
23
  switch (caseField.field_type.type) {
24
+ case FieldTypeSanitiser.FIELD_TYPE_DYNAMIC_MULTISELECT_LIST:
25
+ this.convertArrayToDynamicListOutput(caseField, data);
26
+ break;
24
27
  case FieldTypeSanitiser.FIELD_TYPE_DYNAMIC_RADIO_LIST:
25
28
  case FieldTypeSanitiser.FIELD_TYPE_DYNAMIC_LIST:
26
29
  this.convertStringToDynamicListOutput(caseField, data);
@@ -38,6 +41,17 @@ export class FieldTypeSanitiser {
38
41
  }
39
42
  });
40
43
  }
44
+ convertArrayToDynamicListOutput(field, data) {
45
+ const values = data[field.id];
46
+ if (Array.isArray(values)) {
47
+ const listItems = this.getListItems(field);
48
+ const matches = listItems.filter(item => values.map(v => v.code).indexOf(item.code) !== -1);
49
+ data[field.id] = {
50
+ value: matches,
51
+ list_items: listItems
52
+ };
53
+ }
54
+ }
41
55
  convertStringToDynamicListOutput(field, data) {
42
56
  const stringValue = data[field.id];
43
57
  if (typeof stringValue === 'string') {
@@ -67,9 +81,10 @@ FieldTypeSanitiser.FIELD_TYPE_COMPLEX = 'Complex';
67
81
  FieldTypeSanitiser.FIELD_TYPE_COLLECTION = 'Collection';
68
82
  FieldTypeSanitiser.FIELD_TYPE_DYNAMIC_LIST = 'DynamicList';
69
83
  FieldTypeSanitiser.FIELD_TYPE_DYNAMIC_RADIO_LIST = 'DynamicRadioList';
84
+ FieldTypeSanitiser.FIELD_TYPE_DYNAMIC_MULTISELECT_LIST = 'DynamicMultiSelectList';
70
85
  FieldTypeSanitiser.ɵfac = function FieldTypeSanitiser_Factory(t) { return new (t || FieldTypeSanitiser)(); };
71
86
  FieldTypeSanitiser.ɵprov = i0.ɵɵdefineInjectable({ token: FieldTypeSanitiser, factory: FieldTypeSanitiser.ɵfac });
72
87
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FieldTypeSanitiser, [{
73
88
  type: Injectable
74
89
  }], null, null); })();
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtdHlwZS1zYW5pdGlzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2QtY2FzZS11aS10b29sa2l0L3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2Zvcm0vZmllbGQtdHlwZS1zYW5pdGlzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLGtCQUFrQjtJQU03Qjs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssYUFBYSxDQUFDLFVBQXVCLEVBQUUsSUFBUztRQUN0RCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3hCLE9BQU87U0FDUjtRQUNELFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFFN0IsUUFBUSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtnQkFDakMsS0FBSyxrQkFBa0IsQ0FBQyw2QkFBNkIsQ0FBQztnQkFDdEQsS0FBSyxrQkFBa0IsQ0FBQyx1QkFBdUI7b0JBQzdDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3ZELE1BQU07Z0JBRVIsS0FBSyxrQkFBa0IsQ0FBQyxrQkFBa0I7b0JBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM1RSxNQUFNO2dCQUVSLEtBQUssa0JBQWtCLENBQUMscUJBQXFCO29CQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO3dCQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQWdCLEVBQUUsRUFBRTs0QkFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25HLENBQUMsQ0FBQyxDQUFDO3FCQUNKO29CQUNELE1BQU07YUFDVDtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdDQUFnQyxDQUFDLEtBQWdCLEVBQUUsSUFBUztRQUNsRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFO1lBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUM7WUFDdEUsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUc7b0JBQ2YsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ2pCLFVBQVUsRUFBRSxTQUFTO2lCQUN0QixDQUFDO2FBQ0g7U0FDRjtJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsS0FBZ0I7UUFDbkMsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUN6QjtZQUNELElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRTtnQkFDN0QsT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQzthQUN6QztTQUNGO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOztBQXZFc0IscUNBQWtCLEdBQWtCLFNBQVMsQ0FBQztBQUM5Qyx3Q0FBcUIsR0FBa0IsWUFBWSxDQUFDO0FBQ3BELDBDQUF1QixHQUFrQixhQUFhLENBQUM7QUFDdkQsZ0RBQTZCLEdBQWtCLGtCQUFrQixDQUFDO29GQUo5RSxrQkFBa0I7MERBQWxCLGtCQUFrQixXQUFsQixrQkFBa0I7dUZBQWxCLGtCQUFrQjtjQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FzZUZpZWxkIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vY2FzZS1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vZmllbGQtdHlwZS1lbnVtLm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpZWxkVHlwZVNhbml0aXNlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRklFTERfVFlQRV9DT01QTEVYOiBGaWVsZFR5cGVFbnVtID0gJ0NvbXBsZXgnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZJRUxEX1RZUEVfQ09MTEVDVElPTjogRmllbGRUeXBlRW51bSA9ICdDb2xsZWN0aW9uJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGSUVMRF9UWVBFX0RZTkFNSUNfTElTVDogRmllbGRUeXBlRW51bSA9ICdEeW5hbWljTGlzdCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRklFTERfVFlQRV9EWU5BTUlDX1JBRElPX0xJU1Q6IEZpZWxkVHlwZUVudW0gPSAnRHluYW1pY1JhZGlvTGlzdCc7XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGZpbmRzIGR5bmFtaWNsaXN0cyBpbiBhIGZvcm0gYW5kIHJlcGxhY2VzIHRoZWlyIHN0cmluZ1xuICAgKiB2YWx1ZXMsIHdpdGggYSBKU09OIG9iamVjdCwgYXMgYmVsb3c6XG4gICAqIEZyb206ICd4eXonXG4gICAqIFRvICA6IHtcbiAgICogICB2YWx1ZTogeyBjb2RlOid4eXonLCBsYWJlbDonWFlaJyB9LFxuICAgKiAgIGxpc3RfaXRlbXM6IFtcbiAgICogICAgIHsgY29kZToneHl6JywgbGFiZWw6J1hZWid9LFxuICAgKiAgICAgeyBjb2RlOidhYmMnLCBsYWJlbDonQUJDJ31cbiAgICogICBdXG4gICAqIH1cbiAgICogQHBhcmFtIGNhc2VGaWVsZHMgVGhlIENhc2VGaWVsZHMgdG8gYXNzZXNzLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBpbiB0aGUgZm9ybS5cbiAgICovXG4gICBwdWJsaWMgc2FuaXRpc2VMaXN0cyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZGF0YTogYW55KSB7XG4gICAgaWYgKCFkYXRhIHx8ICFjYXNlRmllbGRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhc2VGaWVsZHMuZm9yRWFjaChjYXNlRmllbGQgPT4ge1xuXG4gICAgICBzd2l0Y2ggKGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBGaWVsZFR5cGVTYW5pdGlzZXIuRklFTERfVFlQRV9EWU5BTUlDX1JBRElPX0xJU1Q6XG4gICAgICAgIGNhc2UgRmllbGRUeXBlU2FuaXRpc2VyLkZJRUxEX1RZUEVfRFlOQU1JQ19MSVNUOlxuICAgICAgICAgIHRoaXMuY29udmVydFN0cmluZ1RvRHluYW1pY0xpc3RPdXRwdXQoY2FzZUZpZWxkLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEZpZWxkVHlwZVNhbml0aXNlci5GSUVMRF9UWVBFX0NPTVBMRVg6XG4gICAgICAgICAgdGhpcy5zYW5pdGlzZUxpc3RzKGNhc2VGaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCBkYXRhW2Nhc2VGaWVsZC5pZF0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRmllbGRUeXBlU2FuaXRpc2VyLkZJRUxEX1RZUEVfQ09MTEVDVElPTjpcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2Nhc2VGaWVsZC5pZF0pKSB7XG4gICAgICAgICAgICBkYXRhW2Nhc2VGaWVsZC5pZF0uZm9yRWFjaCgoZm9ybUVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNhbml0aXNlTGlzdHMoY2FzZUZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCBmb3JtRWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFN0cmluZ1RvRHluYW1pY0xpc3RPdXRwdXQoZmllbGQ6IENhc2VGaWVsZCwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBkYXRhW2ZpZWxkLmlkXTtcbiAgICBpZiAodHlwZW9mIHN0cmluZ1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbGlzdEl0ZW1zID0gdGhpcy5nZXRMaXN0SXRlbXMoZmllbGQpO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGxpc3RJdGVtcy5maWx0ZXIodmFsdWUgPT4gdmFsdWUuY29kZSA9PT0gc3RyaW5nVmFsdWUpO1xuICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRhdGFbZmllbGQuaWRdID0ge1xuICAgICAgICAgIHZhbHVlOiBtYXRjaGVzWzBdLFxuICAgICAgICAgIGxpc3RfaXRlbXM6IGxpc3RJdGVtc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGlzdEl0ZW1zKGZpZWxkOiBDYXNlRmllbGQpOiBhbnlbXSB7XG4gICAgaWYgKGZpZWxkKSB7XG4gICAgICBpZiAoZmllbGQubGlzdF9pdGVtcykge1xuICAgICAgICByZXR1cm4gZmllbGQubGlzdF9pdGVtcztcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5mb3JtYXR0ZWRfdmFsdWUgJiYgZmllbGQuZm9ybWF0dGVkX3ZhbHVlLmxpc3RfaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZvcm1hdHRlZF92YWx1ZS5saXN0X2l0ZW1zO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxufVxuIl19
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtdHlwZS1zYW5pdGlzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2QtY2FzZS11aS10b29sa2l0L3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2Zvcm0vZmllbGQtdHlwZS1zYW5pdGlzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLGtCQUFrQjtJQU03Qjs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssYUFBYSxDQUFDLFVBQXVCLEVBQUUsSUFBUztRQUN0RCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3hCLE9BQU87U0FDUjtRQUNELFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0IsUUFBUSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtnQkFDakMsS0FBSyxrQkFBa0IsQ0FBQyxtQ0FBbUM7b0JBQ3pELElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3RELE1BQU07Z0JBQ1IsS0FBSyxrQkFBa0IsQ0FBQyw2QkFBNkIsQ0FBQztnQkFDdEQsS0FBSyxrQkFBa0IsQ0FBQyx1QkFBdUI7b0JBQzdDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3ZELE1BQU07Z0JBRVIsS0FBSyxrQkFBa0IsQ0FBQyxrQkFBa0I7b0JBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM1RSxNQUFNO2dCQUVSLEtBQUssa0JBQWtCLENBQUMscUJBQXFCO29CQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO3dCQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQWdCLEVBQUUsRUFBRTs0QkFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25HLENBQUMsQ0FBQyxDQUFDO3FCQUNKO29CQUNELE1BQU07YUFDVDtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLCtCQUErQixDQUFDLEtBQWdCLEVBQUUsSUFBUztRQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1RixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHO2dCQUNmLEtBQUssRUFBRSxPQUFPO2dCQUNkLFVBQVUsRUFBRSxTQUFTO2FBQ3RCLENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxLQUFnQixFQUFFLElBQVM7UUFDbEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRTtZQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1lBQ3RFLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHO29CQUNmLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNqQixVQUFVLEVBQUUsU0FBUztpQkFDdEIsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQWdCO1FBQ25DLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO2dCQUNwQixPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUM7YUFDekI7WUFDRCxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzdELE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7YUFDekM7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7QUF2RnNCLHFDQUFrQixHQUFrQixTQUFTLENBQUM7QUFDOUMsd0NBQXFCLEdBQWtCLFlBQVksQ0FBQztBQUNwRCwwQ0FBdUIsR0FBa0IsYUFBYSxDQUFDO0FBQ3ZELGdEQUE2QixHQUFrQixrQkFBa0IsQ0FBQztBQUNsRSxzREFBbUMsR0FBa0Isd0JBQXdCLENBQUM7b0ZBTDFGLGtCQUFrQjswREFBbEIsa0JBQWtCLFdBQWxCLGtCQUFrQjt1RkFBbEIsa0JBQWtCO2NBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYXNlRmllbGQgfSBmcm9tICcuLi8uLi9kb21haW4vZGVmaW5pdGlvbi9jYXNlLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IEZpZWxkVHlwZUVudW0gfSBmcm9tICcuLi8uLi9kb21haW4vZGVmaW5pdGlvbi9maWVsZC10eXBlLWVudW0ubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmllbGRUeXBlU2FuaXRpc2VyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGSUVMRF9UWVBFX0NPTVBMRVg6IEZpZWxkVHlwZUVudW0gPSAnQ29tcGxleCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRklFTERfVFlQRV9DT0xMRUNUSU9OOiBGaWVsZFR5cGVFbnVtID0gJ0NvbGxlY3Rpb24nO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZJRUxEX1RZUEVfRFlOQU1JQ19MSVNUOiBGaWVsZFR5cGVFbnVtID0gJ0R5bmFtaWNMaXN0JztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGSUVMRF9UWVBFX0RZTkFNSUNfUkFESU9fTElTVDogRmllbGRUeXBlRW51bSA9ICdEeW5hbWljUmFkaW9MaXN0JztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGSUVMRF9UWVBFX0RZTkFNSUNfTVVMVElTRUxFQ1RfTElTVDogRmllbGRUeXBlRW51bSA9ICdEeW5hbWljTXVsdGlTZWxlY3RMaXN0JztcbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGZpbmRzIGR5bmFtaWNsaXN0cyBpbiBhIGZvcm0gYW5kIHJlcGxhY2VzIHRoZWlyIHN0cmluZ1xuICAgKiB2YWx1ZXMsIHdpdGggYSBKU09OIG9iamVjdCwgYXMgYmVsb3c6XG4gICAqIEZyb206ICd4eXonXG4gICAqIFRvICA6IHtcbiAgICogICB2YWx1ZTogeyBjb2RlOid4eXonLCBsYWJlbDonWFlaJyB9LFxuICAgKiAgIGxpc3RfaXRlbXM6IFtcbiAgICogICAgIHsgY29kZToneHl6JywgbGFiZWw6J1hZWid9LFxuICAgKiAgICAgeyBjb2RlOidhYmMnLCBsYWJlbDonQUJDJ31cbiAgICogICBdXG4gICAqIH1cbiAgICogQHBhcmFtIGNhc2VGaWVsZHMgVGhlIENhc2VGaWVsZHMgdG8gYXNzZXNzLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBpbiB0aGUgZm9ybS5cbiAgICovXG4gICBwdWJsaWMgc2FuaXRpc2VMaXN0cyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZGF0YTogYW55KSB7XG4gICAgaWYgKCFkYXRhIHx8ICFjYXNlRmllbGRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhc2VGaWVsZHMuZm9yRWFjaChjYXNlRmllbGQgPT4ge1xuICAgICAgc3dpdGNoIChjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgIGNhc2UgRmllbGRUeXBlU2FuaXRpc2VyLkZJRUxEX1RZUEVfRFlOQU1JQ19NVUxUSVNFTEVDVF9MSVNUOlxuICAgICAgICAgIHRoaXMuY29udmVydEFycmF5VG9EeW5hbWljTGlzdE91dHB1dChjYXNlRmllbGQsIGRhdGEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpZWxkVHlwZVNhbml0aXNlci5GSUVMRF9UWVBFX0RZTkFNSUNfUkFESU9fTElTVDpcbiAgICAgICAgY2FzZSBGaWVsZFR5cGVTYW5pdGlzZXIuRklFTERfVFlQRV9EWU5BTUlDX0xJU1Q6XG4gICAgICAgICAgdGhpcy5jb252ZXJ0U3RyaW5nVG9EeW5hbWljTGlzdE91dHB1dChjYXNlRmllbGQsIGRhdGEpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRmllbGRUeXBlU2FuaXRpc2VyLkZJRUxEX1RZUEVfQ09NUExFWDpcbiAgICAgICAgICB0aGlzLnNhbml0aXNlTGlzdHMoY2FzZUZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIGRhdGFbY2FzZUZpZWxkLmlkXSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBGaWVsZFR5cGVTYW5pdGlzZXIuRklFTERfVFlQRV9DT0xMRUNUSU9OOlxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFbY2FzZUZpZWxkLmlkXSkpIHtcbiAgICAgICAgICAgIGRhdGFbY2FzZUZpZWxkLmlkXS5mb3JFYWNoKChmb3JtRWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpc2VMaXN0cyhjYXNlRmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIGZvcm1FbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QXJyYXlUb0R5bmFtaWNMaXN0T3V0cHV0KGZpZWxkOiBDYXNlRmllbGQsIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlcyA9IGRhdGFbZmllbGQuaWRdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgY29uc3QgbGlzdEl0ZW1zID0gdGhpcy5nZXRMaXN0SXRlbXMoZmllbGQpO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGxpc3RJdGVtcy5maWx0ZXIoaXRlbSA9PiB2YWx1ZXMubWFwKHYgPT4gdi5jb2RlKS5pbmRleE9mKGl0ZW0uY29kZSkgIT09IC0xKTtcblxuICAgICAgZGF0YVtmaWVsZC5pZF0gPSB7XG4gICAgICAgIHZhbHVlOiBtYXRjaGVzLFxuICAgICAgICBsaXN0X2l0ZW1zOiBsaXN0SXRlbXNcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U3RyaW5nVG9EeW5hbWljTGlzdE91dHB1dChmaWVsZDogQ2FzZUZpZWxkLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IGRhdGFbZmllbGQuaWRdO1xuICAgIGlmICh0eXBlb2Ygc3RyaW5nVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBsaXN0SXRlbXMgPSB0aGlzLmdldExpc3RJdGVtcyhmaWVsZCk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gbGlzdEl0ZW1zLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZS5jb2RlID09PSBzdHJpbmdWYWx1ZSk7XG4gICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGF0YVtmaWVsZC5pZF0gPSB7XG4gICAgICAgICAgdmFsdWU6IG1hdGNoZXNbMF0sXG4gICAgICAgICAgbGlzdF9pdGVtczogbGlzdEl0ZW1zXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMaXN0SXRlbXMoZmllbGQ6IENhc2VGaWVsZCk6IGFueVtdIHtcbiAgICBpZiAoZmllbGQpIHtcbiAgICAgIGlmIChmaWVsZC5saXN0X2l0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5saXN0X2l0ZW1zO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLmZvcm1hdHRlZF92YWx1ZSAmJiBmaWVsZC5mb3JtYXR0ZWRfdmFsdWUubGlzdF9pdGVtcykge1xuICAgICAgICByZXR1cm4gZmllbGQuZm9ybWF0dGVkX3ZhbHVlLmxpc3RfaXRlbXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG59XG4iXX0=