angular-slickgrid 4.2.6 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/{index.d.ts → angular-slickgrid.d.ts} +0 -0
  2. package/app/modules/angular-slickgrid/components/angular-slickgrid.component.d.ts +1 -1
  3. package/esm2020/app/modules/angular-slickgrid/components/angular-slickgrid.component.mjs +6 -7
  4. package/esm2020/app/modules/angular-slickgrid/modules/angular-slickgrid.module.mjs +10 -7
  5. package/esm2020/app/modules/angular-slickgrid/services/angularUtil.service.mjs +4 -4
  6. package/esm2020/app/modules/angular-slickgrid/services/bsDropdown.service.mjs +4 -4
  7. package/esm2020/app/modules/angular-slickgrid/services/container.service.mjs +4 -4
  8. package/esm2020/app/modules/angular-slickgrid/services/translater.service.mjs +4 -4
  9. package/fesm2015/angular-slickgrid.mjs +26 -24
  10. package/fesm2015/angular-slickgrid.mjs.map +1 -1
  11. package/fesm2020/angular-slickgrid.mjs +26 -24
  12. package/fesm2020/angular-slickgrid.mjs.map +1 -1
  13. package/package.json +17 -17
  14. package/test/cypress/node_modules/@cypress/request/README.md +0 -1038
  15. package/test/cypress/node_modules/@cypress/xvfb/README.md +0 -48
  16. package/test/cypress/node_modules/@cypress/xvfb/node_modules/debug/README.md +0 -437
  17. package/test/cypress/node_modules/@types/node/README.md +0 -16
  18. package/test/cypress/node_modules/@types/sinonjs__fake-timers/README.md +0 -16
  19. package/test/cypress/node_modules/@types/sizzle/README.md +0 -16
  20. package/test/cypress/node_modules/@types/yauzl/README.md +0 -16
  21. package/test/cypress/node_modules/@types/yauzl/node_modules/@types/node/README.md +0 -16
  22. package/test/cypress/node_modules/aggregate-error/README.md +0 -61
  23. package/test/cypress/node_modules/ansi-colors/README.md +0 -315
  24. package/test/cypress/node_modules/ansi-escapes/README.md +0 -245
  25. package/test/cypress/node_modules/ansi-regex/README.md +0 -78
  26. package/test/cypress/node_modules/ansi-styles/README.md +0 -152
  27. package/test/cypress/node_modules/arch/README.md +0 -71
  28. package/test/cypress/node_modules/asn1/README.md +0 -50
  29. package/test/cypress/node_modules/assert-plus/README.md +0 -162
  30. package/test/cypress/node_modules/astral-regex/README.md +0 -46
  31. package/test/cypress/node_modules/async/README.md +0 -60
  32. package/test/cypress/node_modules/asynckit/README.md +0 -233
  33. package/test/cypress/node_modules/at-least-node/README.md +0 -25
  34. package/test/cypress/node_modules/aws-sign2/README.md +0 -4
  35. package/test/cypress/node_modules/aws4/README.md +0 -183
  36. package/test/cypress/node_modules/balanced-match/README.md +0 -91
  37. package/test/cypress/node_modules/base64-js/README.md +0 -34
  38. package/test/cypress/node_modules/bcrypt-pbkdf/README.md +0 -45
  39. package/test/cypress/node_modules/blob-util/README.md +0 -623
  40. package/test/cypress/node_modules/bluebird/README.md +0 -57
  41. package/test/cypress/node_modules/brace-expansion/README.md +0 -129
  42. package/test/cypress/node_modules/buffer/README.md +0 -410
  43. package/test/cypress/node_modules/buffer-crc32/README.md +0 -47
  44. package/test/cypress/node_modules/cachedir/README.md +0 -27
  45. package/test/cypress/node_modules/caseless/README.md +0 -45
  46. package/test/cypress/node_modules/chalk/README.md +0 -293
  47. package/test/cypress/node_modules/chalk/node_modules/supports-color/README.md +0 -76
  48. package/test/cypress/node_modules/check-more-types/README.md +0 -952
  49. package/test/cypress/node_modules/ci-info/README.md +0 -114
  50. package/test/cypress/node_modules/clean-stack/README.md +0 -76
  51. package/test/cypress/node_modules/cli-cursor/README.md +0 -55
  52. package/test/cypress/node_modules/cli-table3/README.md +0 -218
  53. package/test/cypress/node_modules/cli-truncate/README.md +0 -139
  54. package/test/cypress/node_modules/color-convert/README.md +0 -68
  55. package/test/cypress/node_modules/color-name/README.md +0 -11
  56. package/test/cypress/node_modules/colorette/README.md +0 -102
  57. package/test/cypress/node_modules/colors/README.md +0 -221
  58. package/test/cypress/node_modules/combined-stream/README.md +0 -138
  59. package/test/cypress/node_modules/commander/README.md +0 -737
  60. package/test/cypress/node_modules/common-tags/README.md +0 -687
  61. package/test/cypress/node_modules/core-util-is/README.md +0 -3
  62. package/test/cypress/node_modules/cross-spawn/README.md +0 -96
  63. package/test/cypress/node_modules/cypress/README.md +0 -25
  64. package/test/cypress/node_modules/cypress/mount-utils/README.md +0 -14
  65. package/test/cypress/node_modules/cypress/react/README.md +0 -414
  66. package/test/cypress/node_modules/cypress/vue/README.md +0 -678
  67. package/test/cypress/node_modules/cypress/vue2/README.md +0 -693
  68. package/test/cypress/node_modules/dashdash/README.md +0 -574
  69. package/test/cypress/node_modules/dayjs/README.md +0 -128
  70. package/test/cypress/node_modules/debug/README.md +0 -455
  71. package/test/cypress/node_modules/delayed-stream/README.md +0 -141
  72. package/test/cypress/node_modules/ecc-jsbn/README.md +0 -8
  73. package/test/cypress/node_modules/emoji-regex/README.md +0 -73
  74. package/test/cypress/node_modules/end-of-stream/README.md +0 -54
  75. package/test/cypress/node_modules/enquirer/README.md +0 -1752
  76. package/test/cypress/node_modules/escape-string-regexp/README.md +0 -27
  77. package/test/cypress/node_modules/eventemitter2/README.md +0 -809
  78. package/test/cypress/node_modules/execa/README.md +0 -656
  79. package/test/cypress/node_modules/executable/README.md +0 -64
  80. package/test/cypress/node_modules/extend/README.md +0 -81
  81. package/test/cypress/node_modules/extract-zip/README.md +0 -57
  82. package/test/cypress/node_modules/extract-zip/node_modules/debug/README.md +0 -455
  83. package/test/cypress/node_modules/extsprintf/README.md +0 -46
  84. package/test/cypress/node_modules/fd-slicer/README.md +0 -199
  85. package/test/cypress/node_modules/figures/README.md +0 -139
  86. package/test/cypress/node_modules/forever-agent/README.md +0 -4
  87. package/test/cypress/node_modules/form-data/README.md +0 -234
  88. package/test/cypress/node_modules/fs-extra/README.md +0 -264
  89. package/test/cypress/node_modules/fs.realpath/README.md +0 -33
  90. package/test/cypress/node_modules/get-stream/README.md +0 -124
  91. package/test/cypress/node_modules/getos/README.md +0 -79
  92. package/test/cypress/node_modules/getpass/README.md +0 -32
  93. package/test/cypress/node_modules/glob/README.md +0 -375
  94. package/test/cypress/node_modules/global-dirs/README.md +0 -72
  95. package/test/cypress/node_modules/graceful-fs/README.md +0 -133
  96. package/test/cypress/node_modules/has-flag/README.md +0 -89
  97. package/test/cypress/node_modules/http-signature/README.md +0 -80
  98. package/test/cypress/node_modules/human-signals/README.md +0 -155
  99. package/test/cypress/node_modules/ieee754/README.md +0 -51
  100. package/test/cypress/node_modules/indent-string/README.md +0 -70
  101. package/test/cypress/node_modules/inflight/README.md +0 -37
  102. package/test/cypress/node_modules/inherits/README.md +0 -42
  103. package/test/cypress/node_modules/ini/README.md +0 -102
  104. package/test/cypress/node_modules/is-ci/README.md +0 -50
  105. package/test/cypress/node_modules/is-fullwidth-code-point/README.md +0 -39
  106. package/test/cypress/node_modules/is-installed-globally/README.md +0 -31
  107. package/test/cypress/node_modules/is-path-inside/README.md +0 -63
  108. package/test/cypress/node_modules/is-stream/README.md +0 -57
  109. package/test/cypress/node_modules/is-typedarray/README.md +0 -16
  110. package/test/cypress/node_modules/isexe/README.md +0 -51
  111. package/test/cypress/node_modules/isstream/README.md +0 -66
  112. package/test/cypress/node_modules/jsbn/README.md +0 -175
  113. package/test/cypress/node_modules/json-schema/README.md +0 -3
  114. package/test/cypress/node_modules/json-stringify-safe/README.md +0 -52
  115. package/test/cypress/node_modules/jsonfile/README.md +0 -205
  116. package/test/cypress/node_modules/jsonfile/node_modules/universalify/README.md +0 -76
  117. package/test/cypress/node_modules/jsprim/README.md +0 -287
  118. package/test/cypress/node_modules/lazy-ass/README.md +0 -269
  119. package/test/cypress/node_modules/listr2/README.md +0 -17
  120. package/test/cypress/node_modules/lodash/README.md +0 -39
  121. package/test/cypress/node_modules/lodash.once/README.md +0 -18
  122. package/test/cypress/node_modules/log-symbols/README.md +0 -51
  123. package/test/cypress/node_modules/log-update/README.md +0 -97
  124. package/test/cypress/node_modules/log-update/node_modules/slice-ansi/README.md +0 -66
  125. package/test/cypress/node_modules/log-update/node_modules/wrap-ansi/README.md +0 -97
  126. package/test/cypress/node_modules/lru-cache/README.md +0 -166
  127. package/test/cypress/node_modules/merge-stream/README.md +0 -78
  128. package/test/cypress/node_modules/mime-db/README.md +0 -102
  129. package/test/cypress/node_modules/mime-types/README.md +0 -123
  130. package/test/cypress/node_modules/mimic-fn/README.md +0 -69
  131. package/test/cypress/node_modules/minimatch/README.md +0 -209
  132. package/test/cypress/node_modules/ms/README.md +0 -60
  133. package/test/cypress/node_modules/npm-run-path/README.md +0 -115
  134. package/test/cypress/node_modules/once/README.md +0 -79
  135. package/test/cypress/node_modules/onetime/README.md +0 -94
  136. package/test/cypress/node_modules/ospath/README.md +0 -53
  137. package/test/cypress/node_modules/p-map/README.md +0 -89
  138. package/test/cypress/node_modules/path-is-absolute/README.md +0 -59
  139. package/test/cypress/node_modules/path-key/README.md +0 -61
  140. package/test/cypress/node_modules/pend/README.md +0 -41
  141. package/test/cypress/node_modules/performance-now/README.md +0 -30
  142. package/test/cypress/node_modules/pify/README.md +0 -119
  143. package/test/cypress/node_modules/pretty-bytes/README.md +0 -131
  144. package/test/cypress/node_modules/proxy-from-env/README.md +0 -131
  145. package/test/cypress/node_modules/psl/README.md +0 -215
  146. package/test/cypress/node_modules/pump/README.md +0 -65
  147. package/test/cypress/node_modules/punycode/README.md +0 -122
  148. package/test/cypress/node_modules/qs/README.md +0 -475
  149. package/test/cypress/node_modules/request-progress/README.md +0 -78
  150. package/test/cypress/node_modules/restore-cursor/README.md +0 -26
  151. package/test/cypress/node_modules/rimraf/README.md +0 -101
  152. package/test/cypress/node_modules/rxjs/README.md +0 -147
  153. package/test/cypress/node_modules/rxjs/_esm2015/README.md +0 -147
  154. package/test/cypress/node_modules/rxjs/_esm5/README.md +0 -147
  155. package/test/cypress/node_modules/rxjs/src/README.md +0 -147
  156. package/test/cypress/node_modules/safe-buffer/README.md +0 -584
  157. package/test/cypress/node_modules/safer-buffer/README.md +0 -156
  158. package/test/cypress/node_modules/semver/README.md +0 -566
  159. package/test/cypress/node_modules/shebang-command/README.md +0 -34
  160. package/test/cypress/node_modules/shebang-regex/README.md +0 -33
  161. package/test/cypress/node_modules/signal-exit/README.md +0 -39
  162. package/test/cypress/node_modules/slice-ansi/README.md +0 -72
  163. package/test/cypress/node_modules/sshpk/README.md +0 -804
  164. package/test/cypress/node_modules/string-width/README.md +0 -50
  165. package/test/cypress/node_modules/strip-ansi/README.md +0 -46
  166. package/test/cypress/node_modules/strip-final-newline/README.md +0 -30
  167. package/test/cypress/node_modules/supports-color/README.md +0 -77
  168. package/test/cypress/node_modules/throttleit/README.md +0 -32
  169. package/test/cypress/node_modules/tmp/README.md +0 -365
  170. package/test/cypress/node_modules/tough-cookie/README.md +0 -527
  171. package/test/cypress/node_modules/tslib/README.md +0 -142
  172. package/test/cypress/node_modules/tunnel-agent/README.md +0 -4
  173. package/test/cypress/node_modules/tweetnacl/README.md +0 -459
  174. package/test/cypress/node_modules/type-fest/README.md +0 -760
  175. package/test/cypress/node_modules/universalify/README.md +0 -76
  176. package/test/cypress/node_modules/untildify/README.md +0 -30
  177. package/test/cypress/node_modules/uuid/README.md +0 -505
  178. package/test/cypress/node_modules/verror/README.md +0 -528
  179. package/test/cypress/node_modules/verror/node_modules/extsprintf/README.md +0 -46
  180. package/test/cypress/node_modules/which/README.md +0 -54
  181. package/test/cypress/node_modules/wrap-ansi/README.md +0 -91
  182. package/test/cypress/node_modules/wrappy/README.md +0 -36
  183. package/test/cypress/node_modules/yallist/README.md +0 -204
  184. package/test/cypress/node_modules/yauzl/README.md +0 -658
@@ -1111,9 +1111,8 @@ export class AngularSlickgridComponent {
1111
1111
  column.editor.collection = newCollection;
1112
1112
  column.editor.disabled = false;
1113
1113
  // find the new column reference pointer & re-assign the new editor to the internalColumnEditor
1114
- const columns = this.slickGrid.getColumns();
1115
- if (Array.isArray(columns)) {
1116
- const columnRef = columns.find((col) => col.id === column.id);
1114
+ if (Array.isArray(this.columnDefinitions)) {
1115
+ const columnRef = this.columnDefinitions.find((col) => col.id === column.id);
1117
1116
  if (columnRef) {
1118
1117
  columnRef.internalColumnEditor = column.editor;
1119
1118
  }
@@ -1127,14 +1126,14 @@ export class AngularSlickgridComponent {
1127
1126
  }
1128
1127
  }
1129
1128
  }
1130
- AngularSlickgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AngularSlickgridComponent, deps: [{ token: i1.AngularUtilService }, { token: i0.ApplicationRef }, { token: i0.ChangeDetectorRef }, { token: i2.ContainerService }, { token: i0.ElementRef }, { token: i3.TranslateService, optional: true }, { token: i4.TranslaterService, optional: true }, { token: 'config' }, { token: 'externalService' }], target: i0.ɵɵFactoryTarget.Component });
1131
- AngularSlickgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: AngularSlickgridComponent, selector: "angular-slickgrid", inputs: { customDataView: "customDataView", gridId: "gridId", gridOptions: "gridOptions", paginationOptions: "paginationOptions", columnDefinitions: "columnDefinitions", dataset: "dataset", datasetHierarchical: "datasetHierarchical" }, providers: [
1129
+ AngularSlickgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AngularSlickgridComponent, deps: [{ token: i1.AngularUtilService }, { token: i0.ApplicationRef }, { token: i0.ChangeDetectorRef }, { token: i2.ContainerService }, { token: i0.ElementRef }, { token: i3.TranslateService, optional: true }, { token: i4.TranslaterService, optional: true }, { token: 'config' }, { token: 'externalService' }], target: i0.ɵɵFactoryTarget.Component });
1130
+ AngularSlickgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: AngularSlickgridComponent, selector: "angular-slickgrid", inputs: { customDataView: "customDataView", gridId: "gridId", gridOptions: "gridOptions", paginationOptions: "paginationOptions", columnDefinitions: "columnDefinitions", dataset: "dataset", datasetHierarchical: "datasetHierarchical" }, providers: [
1132
1131
  // make everything transient (non-singleton)
1133
1132
  AngularUtilService,
1134
1133
  ApplicationRef,
1135
1134
  TranslaterService,
1136
1135
  ], ngImport: i0, template: "<div id=\"slickGridContainer-{{gridId}}\" class=\"gridPane\">\r\n <div attr.id='{{gridId}}' class=\"slickgrid-container\" style=\"width: 100%\">\r\n </div>\r\n</div>" });
1137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AngularSlickgridComponent, decorators: [{
1136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AngularSlickgridComponent, decorators: [{
1138
1137
  type: Component,
1139
1138
  args: [{ selector: 'angular-slickgrid', providers: [
1140
1139
  // make everything transient (non-singleton)
@@ -1167,4 +1166,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
1167
1166
  }], datasetHierarchical: [{
1168
1167
  type: Input
1169
1168
  }] } });
1170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLGlHQUFpRztBQUNqRyxPQUFPLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTywrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8saUNBQWlDLENBQUM7QUFDekMsT0FBTyxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sMEJBQTBCLENBQUM7QUFFbEMsNkJBQTZCO0FBQzdCLE9BQU8sRUFBaUIsY0FBYyxFQUFxQixTQUFTLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBYSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFFN0ksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEVBU0wsYUFBYTtBQVliLFdBQVc7QUFDWCxxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixjQUFjLEVBRWQsYUFBYSxFQUNiLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIsV0FBVyxFQUNYLGVBQWU7QUFFZixZQUFZO0FBQ1os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QVMsRUFBRTtnQkFDYixTQUFTLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLE1BQXNCLENBQUM7YUFDaEU7U0FDRjtRQUVELHlHQUF5RztRQUN6RyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBdUMsQ0FBQztRQUMxRixJQUFJLGFBQWEsRUFBRSxPQUFPLElBQUksYUFBYSxFQUFFLGdCQUFnQixFQUFFO1lBQzdELGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMvQztJQUNILENBQUM7O3NIQWx4Q1UseUJBQXlCLDhRQWtMMUIsUUFBUSxhQUNSLGlCQUFpQjswR0FuTGhCLHlCQUF5Qix3UkFQekI7UUFDVCw0Q0FBNEM7UUFDNUMsa0JBQWtCO1FBQ2xCLGNBQWM7UUFDZCxpQkFBaUI7S0FDbEIsMEJDNUZILHlLQUdNOzJGRDJGTyx5QkFBeUI7a0JBVnJDLFNBQVM7K0JBQ0UsbUJBQW1CLGFBRWxCO3dCQUNULDRDQUE0Qzt3QkFDNUMsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGlCQUFpQjtxQkFDbEI7OzBCQWtMRSxRQUFROzswQkFDUixRQUFROzswQkFDUixNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsaUJBQWlCOzRDQTVIbEIsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBZUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQWVGLE9BQU87c0JBRFYsS0FBSztnQkEwQkYsbUJBQW1CO3NCQUR0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IDNyZCBwYXJ0eSB2ZW5kb3IgbGlic1xyXG4vLyBvbmx5IGltcG9ydCB0aGUgbmVjZXNzYXJ5IGNvcmUgbGliLCBlYWNoIHdpbGwgYmUgaW1wb3J0ZWQgb24gZGVtYW5kIHdoZW4gZW5hYmxlZCAodmlhIHJlcXVpcmUpXHJcbmltcG9ydCAnanF1ZXJ5LXVpL3VpL3dpZGdldHMvZHJhZ2dhYmxlJztcclxuaW1wb3J0ICdqcXVlcnktdWkvdWkvd2lkZ2V0cy9kcm9wcGFibGUnO1xyXG5pbXBvcnQgJ2pxdWVyeS11aS91aS93aWRnZXRzL3NvcnRhYmxlJztcclxuaW1wb3J0ICdzbGlja2dyaWQvbGliL2pxdWVyeS5ldmVudC5kcmFnLTIuMy4wJztcclxuaW1wb3J0ICdzbGlja2dyaWQvbGliL2pxdWVyeS5tb3VzZXdoZWVsJztcclxuaW1wb3J0ICdzbGlja2dyaWQvc2xpY2suY29yZSc7XHJcbmltcG9ydCAnc2xpY2tncmlkL3NsaWNrLmdyaWQnO1xyXG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5kYXRhdmlldyc7XHJcblxyXG4vLyAuLi50aGVuIGV2ZXJ5dGhpbmcgZWxzZS4uLlxyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBBcHBsaWNhdGlvblJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIC8vIGludGVyZmFjZXMvdHlwZXNcclxuICBBdXRvQ29tcGxldGVFZGl0b3IsXHJcbiAgQmFja2VuZFNlcnZpY2VBcGksXHJcbiAgQmFja2VuZFNlcnZpY2VPcHRpb24sXHJcbiAgQ29sdW1uLFxyXG4gIENvbHVtbkVkaXRvcixcclxuICBEYXRhVmlld09wdGlvbixcclxuICBFdmVudFN1YnNjcmlwdGlvbixcclxuICBFeHRlbnNpb25OYW1lLFxyXG4gIEV4dGVybmFsUmVzb3VyY2UsXHJcbiAgTG9jYWxlLFxyXG4gIE1ldHJpY3MsXHJcbiAgUGFnaW5hdGlvbixcclxuICBTZWxlY3RFZGl0b3IsXHJcbiAgU2VydmljZVBhZ2luYXRpb24sXHJcbiAgU2xpY2tEYXRhVmlldyxcclxuICBTbGlja0V2ZW50SGFuZGxlcixcclxuICBTbGlja0dyaWQsXHJcbiAgU2xpY2tOYW1lc3BhY2UsXHJcblxyXG4gIC8vIHNlcnZpY2VzXHJcbiAgQmFja2VuZFV0aWxpdHlTZXJ2aWNlLFxyXG4gIENvbGxlY3Rpb25TZXJ2aWNlLFxyXG4gIEV2ZW50TmFtaW5nU3R5bGUsXHJcbiAgRXh0ZW5zaW9uU2VydmljZSxcclxuICBFeHRlbnNpb25VdGlsaXR5LFxyXG4gIEZpbHRlckZhY3RvcnksXHJcbiAgRmlsdGVyU2VydmljZSxcclxuICBHcmlkRXZlbnRTZXJ2aWNlLFxyXG4gIEdyaWRTZXJ2aWNlLFxyXG4gIEdyaWRTdGF0ZVNlcnZpY2UsXHJcbiAgR3JvdXBpbmdBbmRDb2xzcGFuU2VydmljZSxcclxuICBQYWdpbmF0aW9uU2VydmljZSxcclxuICBSZXNpemVyU2VydmljZSxcclxuICBSeEpzRmFjYWRlLFxyXG4gIFNoYXJlZFNlcnZpY2UsXHJcbiAgU2xpY2tncmlkQ29uZmlnLFxyXG4gIFNsaWNrR3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlcixcclxuICBTb3J0U2VydmljZSxcclxuICBUcmVlRGF0YVNlcnZpY2UsXHJcblxyXG4gIC8vIHV0aWxpdGllc1xyXG4gIGF1dG9BZGRFZGl0b3JGb3JtYXR0ZXJUb0NvbHVtbnNXaXRoRWRpdG9yLFxyXG4gIGVtcHR5RWxlbWVudCxcclxuICBHcmlkU3RhdGVUeXBlLFxyXG4gIHVuc3Vic2NyaWJlQWxsLFxyXG59IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2NvbW1vbic7XHJcbmltcG9ydCB7IEV2ZW50UHViU3ViU2VydmljZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2V2ZW50LXB1Yi1zdWInO1xyXG5pbXBvcnQgeyBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2VtcHR5LXdhcm5pbmctY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2xpY2tGb290ZXJDb21wb25lbnQgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9jdXN0b20tZm9vdGVyLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3BhZ2luYXRpb24tY29tcG9uZW50JztcclxuaW1wb3J0IHsgUnhKc1Jlc291cmNlIH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvcnhqcy1vYnNlcnZhYmxlJztcclxuaW1wb3J0IHsgZGVxdWFsIH0gZnJvbSAnZGVxdWFsL2xpdGUnO1xyXG5cclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQW5ndWxhckdyaWRJbnN0YW5jZSwgRXh0ZXJuYWxUZXN0aW5nRGVwZW5kZW5jaWVzLCBHcmlkT3B0aW9uLCB9IGZyb20gJy4vLi4vbW9kZWxzL2luZGV4JztcclxuaW1wb3J0IHsgR2xvYmFsR3JpZE9wdGlvbnMgfSBmcm9tICcuLy4uL2dsb2JhbC1ncmlkLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zbGF0ZXIuc2VydmljZSc7XHJcblxyXG4vLyBTZXJ2aWNlc1xyXG5pbXBvcnQgeyBBbmd1bGFyVXRpbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hbmd1bGFyVXRpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2xpY2tSb3dEZXRhaWxWaWV3IH0gZnJvbSAnLi4vZXh0ZW5zaW9ucy9zbGlja1Jvd0RldGFpbFZpZXcnO1xyXG5pbXBvcnQgeyBDb250YWluZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29udGFpbmVyLnNlcnZpY2UnO1xyXG5cclxuLy8gdXNpbmcgZXh0ZXJuYWwgbm9uLXR5cGVkIGpzIGxpYnJhcmllc1xyXG5kZWNsYXJlIGNvbnN0IFNsaWNrOiBTbGlja05hbWVzcGFjZTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYW5ndWxhci1zbGlja2dyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmd1bGFyLXNsaWNrZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICAvLyBtYWtlIGV2ZXJ5dGhpbmcgdHJhbnNpZW50IChub24tc2luZ2xldG9uKVxyXG4gICAgQW5ndWxhclV0aWxTZXJ2aWNlLFxyXG4gICAgQXBwbGljYXRpb25SZWYsXHJcbiAgICBUcmFuc2xhdGVyU2VydmljZSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyU2xpY2tncmlkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIF9kYXRhc2V0PzogYW55W10gfCBudWxsO1xyXG4gIHByaXZhdGUgX2NvbHVtbkRlZmluaXRpb25zITogQ29sdW1uW107XHJcbiAgcHJpdmF0ZSBfY3VycmVudERhdGFzZXRMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgX2V2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIgPSBuZXcgU2xpY2suRXZlbnRIYW5kbGVyKCk7XHJcbiAgcHJpdmF0ZSBfZXZlbnRQdWJTdWJTZXJ2aWNlITogRXZlbnRQdWJTdWJTZXJ2aWNlO1xyXG4gIHByaXZhdGUgX2FuZ3VsYXJHcmlkSW5zdGFuY2VzOiBBbmd1bGFyR3JpZEluc3RhbmNlIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNHcmlkSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0RhdGFzZXRJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0xvY2FsR3JpZCA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfcGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfcmVnaXN0ZXJlZFJlc291cmNlczogRXh0ZXJuYWxSZXNvdXJjZVtdID0gW107XHJcbiAgZGF0YVZpZXchOiBTbGlja0RhdGFWaWV3O1xyXG4gIHNsaWNrR3JpZCE6IFNsaWNrR3JpZDtcclxuICBncm91cGluZ0RlZmluaXRpb246IGFueSA9IHt9O1xyXG4gIGdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI/OiBTbGlja0dyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI7XHJcbiAgYmFja2VuZFNlcnZpY2VBcGk/OiBCYWNrZW5kU2VydmljZUFwaTtcclxuICBsb2NhbGVzITogTG9jYWxlO1xyXG4gIG1ldHJpY3M/OiBNZXRyaWNzO1xyXG4gIHNob3dQYWdpbmF0aW9uID0gZmFsc2U7XHJcbiAgc2VydmljZUxpc3Q6IGFueVtdID0gW107XHJcbiAgdG90YWxJdGVtcyA9IDA7XHJcbiAgcGFnaW5hdGlvbkRhdGE/OiB7XHJcbiAgICBncmlkT3B0aW9uczogR3JpZE9wdGlvbjtcclxuICAgIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZTtcclxuICB9O1xyXG4gIHN1YnNjcmlwdGlvbnM6IEV2ZW50U3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgLy8gY29tcG9uZW50cyAvIHBsdWdpbnNcclxuICBzbGlja0VtcHR5V2FybmluZz86IFNsaWNrRW1wdHlXYXJuaW5nQ29tcG9uZW50O1xyXG4gIHNsaWNrRm9vdGVyPzogU2xpY2tGb290ZXJDb21wb25lbnQ7XHJcbiAgc2xpY2tQYWdpbmF0aW9uPzogU2xpY2tQYWdpbmF0aW9uQ29tcG9uZW50O1xyXG4gIHNsaWNrUm93RGV0YWlsVmlldz86IFNsaWNrUm93RGV0YWlsVmlldztcclxuXHJcbiAgLy8gc2VydmljZXNcclxuICBiYWNrZW5kVXRpbGl0eVNlcnZpY2UhOiBCYWNrZW5kVXRpbGl0eVNlcnZpY2U7XHJcbiAgY29sbGVjdGlvblNlcnZpY2U6IENvbGxlY3Rpb25TZXJ2aWNlO1xyXG4gIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2U7XHJcbiAgZXh0ZW5zaW9uVXRpbGl0eTogRXh0ZW5zaW9uVXRpbGl0eTtcclxuICBmaWx0ZXJGYWN0b3J5ITogRmlsdGVyRmFjdG9yeTtcclxuICBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlO1xyXG4gIGdyaWRFdmVudFNlcnZpY2U6IEdyaWRFdmVudFNlcnZpY2U7XHJcbiAgZ3JpZFNlcnZpY2U6IEdyaWRTZXJ2aWNlO1xyXG4gIGdyaWRTdGF0ZVNlcnZpY2U6IEdyaWRTdGF0ZVNlcnZpY2U7XHJcbiAgZ3JvdXBpbmdTZXJ2aWNlOiBHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlO1xyXG4gIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZTtcclxuICByZXNpemVyU2VydmljZSE6IFJlc2l6ZXJTZXJ2aWNlO1xyXG4gIHJ4anM/OiBSeEpzRmFjYWRlO1xyXG4gIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2U7XHJcbiAgc29ydFNlcnZpY2U6IFNvcnRTZXJ2aWNlO1xyXG4gIHRyZWVEYXRhU2VydmljZTogVHJlZURhdGFTZXJ2aWNlO1xyXG5cclxuICBASW5wdXQoKSBjdXN0b21EYXRhVmlldzogYW55O1xyXG4gIEBJbnB1dCgpIGdyaWRJZDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgZ3JpZE9wdGlvbnMhOiBHcmlkT3B0aW9uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBwYWdpbmF0aW9uT3B0aW9ucygpOiBQYWdpbmF0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucztcclxuICB9XHJcbiAgc2V0IHBhZ2luYXRpb25PcHRpb25zKG5ld1BhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAobmV3UGFnaW5hdGlvbk9wdGlvbnMgJiYgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgPSB7IC4uLnRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbiwgLi4udGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMsIC4uLm5ld1BhZ2luYXRpb25PcHRpb25zIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IG5ld1BhZ2luYXRpb25PcHRpb25zO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uID0gdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgPz8gdGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVUb3RhbEl0ZW1zKHRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbj8udG90YWxJdGVtcyA/PyAwLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNvbHVtbkRlZmluaXRpb25zKGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSBjb2x1bW5EZWZpbml0aW9ucztcclxuICAgIGlmICh0aGlzLl9pc0dyaWRJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUNvbHVtbkRlZmluaXRpb25zTGlzdChjb2x1bW5EZWZpbml0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBpZiAoY29sdW1uRGVmaW5pdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNvcHlDb2x1bW5XaWR0aHNSZWZlcmVuY2UoY29sdW1uRGVmaW5pdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgY29sdW1uRGVmaW5pdGlvbnMoKTogQ29sdW1uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgZGF0YXNldCgpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gKHRoaXMuY3VzdG9tRGF0YVZpZXcgPyB0aGlzLnNsaWNrR3JpZD8uZ2V0RGF0YT8uKCkgOiB0aGlzLmRhdGFWaWV3Py5nZXRJdGVtcz8uKCkpIHx8IFtdO1xyXG4gIH1cclxuICBzZXQgZGF0YXNldChuZXdEYXRhc2V0OiBhbnlbXSkge1xyXG4gICAgY29uc3QgcHJldkRhdGFzZXRMbiA9IHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoO1xyXG4gICAgY29uc3QgaXNEYXRhc2V0RXF1YWwgPSBkZXF1YWwobmV3RGF0YXNldCwgdGhpcy5fZGF0YXNldCB8fCBbXSk7XHJcbiAgICBsZXQgZGF0YSA9IG5ld0RhdGFzZXQ7XHJcblxyXG4gICAgLy8gd2hlbiBUcmVlIERhdGEgaXMgZW5hYmxlZCBhbmQgd2UgZG9uJ3QgeWV0IGhhdmUgdGhlIGhpZXJhcmNoaWNhbCBkYXRhc2V0IGZpbGxlZCwgd2UgY2FuIGZvcmNlIGEgY29udmVydCtzb3J0IG9mIHRoZSBhcnJheVxyXG4gICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVRyZWVEYXRhICYmIEFycmF5LmlzQXJyYXkobmV3RGF0YXNldCkgJiYgKG5ld0RhdGFzZXQubGVuZ3RoID4gMCB8fCBuZXdEYXRhc2V0Lmxlbmd0aCAhPT0gcHJldkRhdGFzZXRMbiB8fCAhaXNEYXRhc2V0RXF1YWwpKSB7XHJcbiAgICAgIHRoaXMuX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgIGRhdGEgPSB0aGlzLnNvcnRUcmVlRGF0YXNldChuZXdEYXRhc2V0LCAhaXNEYXRhc2V0RXF1YWwpOyAvLyBpZiBkYXRhc2V0IGNoYW5nZWQsIHRoZW4gZm9yY2UgYSByZWZyZXNoIGFueXdheVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZGF0YXNldCA9IGRhdGE7XHJcbiAgICB0aGlzLnJlZnJlc2hHcmlkRGF0YShkYXRhIHx8IFtdKTtcclxuICAgIHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoID0gKG5ld0RhdGFzZXQgfHwgW10pLmxlbmd0aDtcclxuXHJcbiAgICAvLyBleHBhbmQvYXV0b2ZpdCBjb2x1bW5zIG9uIGZpcnN0IHBhZ2UgbG9hZFxyXG4gICAgLy8gd2UgY2FuIGFzc3VtZSB0aGF0IGlmIHRoZSBwcmV2RGF0YXNldCB3YXMgZW1wdHkgdGhlbiB3ZSBhcmUgb24gZmlyc3QgbG9hZFxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgcHJldkRhdGFzZXRMbiA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNsaWNrR3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGRhdGFzZXRIaWVyYXJjaGljYWwoKTogYW55W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0O1xyXG4gIH1cclxuICBzZXQgZGF0YXNldEhpZXJhcmNoaWNhbChuZXdIaWVyYXJjaGljYWxEYXRhc2V0OiBhbnlbXSB8IHVuZGVmaW5lZCkge1xyXG4gICAgY29uc3QgaXNEYXRhc2V0RXF1YWwgPSBkZXF1YWwobmV3SGllcmFyY2hpY2FsRGF0YXNldCwgdGhpcy5zaGFyZWRTZXJ2aWNlPy5oaWVyYXJjaGljYWxEYXRhc2V0ID8/IFtdKTtcclxuICAgIGNvbnN0IHByZXZGbGF0RGF0YXNldExuID0gdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGg7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IG5ld0hpZXJhcmNoaWNhbERhdGFzZXQ7XHJcblxyXG4gICAgaWYgKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQgJiYgdGhpcy5jb2x1bW5EZWZpbml0aW9ucyAmJiB0aGlzLmZpbHRlclNlcnZpY2U/LmNsZWFyRmlsdGVycykge1xyXG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UuY2xlYXJGaWx0ZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0IGlzIHNldCBhZnRlcndhcmQsIHdlIGNhbiByZXNldCB0aGUgZmxhdCBkYXRhc2V0IGFuZCBjYWxsIGEgdHJlZSBkYXRhIHNvcnQgdGhhdCB3aWxsIG92ZXJ3cml0ZSB0aGUgZmxhdCBkYXRhc2V0XHJcbiAgICBpZiAobmV3SGllcmFyY2hpY2FsRGF0YXNldCAmJiB0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLnNvcnRTZXJ2aWNlPy5wcm9jZXNzVHJlZURhdGFJbml0aWFsU29ydCkge1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LnNldEl0ZW1zKFtdLCB0aGlzLmdyaWRPcHRpb25zLmRhdGFzZXRJZFByb3BlcnR5TmFtZSA/PyAnaWQnKTtcclxuICAgICAgdGhpcy5zb3J0U2VydmljZS5wcm9jZXNzVHJlZURhdGFJbml0aWFsU29ydCgpO1xyXG5cclxuICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIHJlc2V0L3JlZnJlc2ggdGhlIFRyZWUgRGF0YSBmaWx0ZXJzIGJlY2F1c2UgaWYgd2UgaW5zZXJ0ZWQgbmV3IGl0ZW0ocykgdGhlbiBpdCBtaWdodCBub3Qgc2hvdyB1cCB3aXRob3V0IGRvaW5nIHRoaXMgcmVmcmVzaFxyXG4gICAgICAvLyBob3dldmVyIHdlIG5lZWQgMSBjcHUgY3ljbGUgYmVmb3JlIGhhdmluZyB0aGUgRGF0YVZpZXcgcmVmcmVzaGVkLCBzbyB3ZSBuZWVkIHRvIHdyYXAgdGhpcyBjaGVjayBpbiBhIHNldFRpbWVvdXRcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmxhdERhdGFzZXRMbiA9IHRoaXMuZGF0YVZpZXcuZ2V0SXRlbUNvdW50KCk7XHJcbiAgICAgICAgaWYgKGZsYXREYXRhc2V0TG4gPiAwICYmIChmbGF0RGF0YXNldExuICE9PSBwcmV2RmxhdERhdGFzZXRMbiB8fCAhaXNEYXRhc2V0RXF1YWwpKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVmcmVzaFRyZWVEYXRhRmlsdGVycygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBlbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYge1xyXG4gICAgcmV0dXJuIHRoaXMuZWxtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGV2ZW50SGFuZGxlcigpOiBTbGlja0V2ZW50SGFuZGxlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRIYW5kbGVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyaWRDb250YWluZXJFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkQ29udGFpbmVySWQgfHwgJyd9YCk7XHJcbiAgfVxyXG5cclxuICAvKiogR0VUVEVSIHRvIGtub3cgaWYgZGF0YXNldCB3YXMgaW5pdGlhbGl6ZWQgb3Igbm90ICovXHJcbiAgZ2V0IGlzRGF0YXNldEluaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkO1xyXG4gIH1cclxuICAvKiogU0VUVEVSIHRvIGNoYW5nZSBpZiBkYXRhc2V0IHdhcyBpbml0aWFsaXplZCBvciBub3QgKHN0cmluZ2x5IHVzZWQgZm9yIHVuaXQgdGVzdGluZyBwdXJwb3NlcykgKi9cclxuICBzZXQgaXNEYXRhc2V0SW5pdGlhbGl6ZWQoaXNJbml0aWFsaXplZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSBpc0luaXRpYWxpemVkO1xyXG4gIH1cclxuICBzZXQgaXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQoaXNJbml0aWFsaXplZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSBpc0luaXRpYWxpemVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZ2lzdGVyZWRSZXNvdXJjZXMoKTogRXh0ZXJuYWxSZXNvdXJjZVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFuZ3VsYXJVdGlsU2VydmljZTogQW5ndWxhclV0aWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lclNlcnZpY2U6IENvbnRhaW5lclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsbTogRWxlbWVudFJlZixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVyU2VydmljZTogVHJhbnNsYXRlclNlcnZpY2UsXHJcbiAgICBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIGZvclJvb3RDb25maWc6IEdyaWRPcHRpb24sXHJcbiAgICBASW5qZWN0KCdleHRlcm5hbFNlcnZpY2UnKSBleHRlcm5hbFNlcnZpY2VzOiBFeHRlcm5hbFRlc3RpbmdEZXBlbmRlbmNpZXNcclxuICApIHtcclxuICAgIGNvbnN0IHNsaWNrZ3JpZENvbmZpZyA9IG5ldyBTbGlja2dyaWRDb25maWcoKTtcclxuXHJcbiAgICAvLyBpbml0aWFsaXplIGFuZCBhc3NpZ24gYWxsIFNlcnZpY2UgRGVwZW5kZW5jaWVzXHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ldmVudFB1YlN1YlNlcnZpY2UgPz8gbmV3IEV2ZW50UHViU3ViU2VydmljZSh0aGlzLmVsbS5uYXRpdmVFbGVtZW50KTtcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5ldmVudE5hbWluZ1N0eWxlID0gRXZlbnROYW1pbmdTdHlsZS5jYW1lbENhc2U7XHJcblxyXG4gICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UgPz8gbmV3IEJhY2tlbmRVdGlsaXR5U2VydmljZSgpO1xyXG4gICAgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZ3JpZEV2ZW50U2VydmljZSA/PyBuZXcgR3JpZEV2ZW50U2VydmljZSgpO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uc2hhcmVkU2VydmljZSA/PyBuZXcgU2hhcmVkU2VydmljZSgpO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmNvbGxlY3Rpb25TZXJ2aWNlID8/IG5ldyBDb2xsZWN0aW9uU2VydmljZSh0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcclxuICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSA9IGV4dGVybmFsU2VydmljZXM/LmV4dGVuc2lvblV0aWxpdHkgPz8gbmV3IEV4dGVuc2lvblV0aWxpdHkodGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBuZXcgRmlsdGVyRmFjdG9yeShzbGlja2dyaWRDb25maWcsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UsIHRoaXMuY29sbGVjdGlvblNlcnZpY2UpO1xyXG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZmlsdGVyU2VydmljZSA/PyBuZXcgRmlsdGVyU2VydmljZSh0aGlzLmZpbHRlckZhY3RvcnkgYXMgYW55LCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xyXG4gICAgdGhpcy5yZXNpemVyU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnJlc2l6ZXJTZXJ2aWNlID8/IG5ldyBSZXNpemVyU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UpO1xyXG4gICAgdGhpcy5zb3J0U2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnNvcnRTZXJ2aWNlID8/IG5ldyBTb3J0U2VydmljZSh0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xyXG4gICAgdGhpcy50cmVlRGF0YVNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy50cmVlRGF0YVNlcnZpY2UgPz8gbmV3IFRyZWVEYXRhU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5zb3J0U2VydmljZSk7XHJcbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8ucGFnaW5hdGlvblNlcnZpY2UgPz8gbmV3IFBhZ2luYXRpb25TZXJ2aWNlKHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXh0ZW5zaW9uU2VydmljZSA/PyBuZXcgRXh0ZW5zaW9uU2VydmljZShcclxuICAgICAgdGhpcy5leHRlbnNpb25VdGlsaXR5LFxyXG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UsXHJcbiAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSxcclxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLFxyXG4gICAgICB0aGlzLnNvcnRTZXJ2aWNlLFxyXG4gICAgICB0aGlzLnRyZWVEYXRhU2VydmljZSxcclxuICAgICAgdGhpcy50cmFuc2xhdGVyU2VydmljZSxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZ3JpZFN0YXRlU2VydmljZSA/PyBuZXcgR3JpZFN0YXRlU2VydmljZSh0aGlzLmV4dGVuc2lvblNlcnZpY2UsIHRoaXMuZmlsdGVyU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UsIHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcclxuICAgIHRoaXMuZ3JpZFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncmlkU2VydmljZSA/PyBuZXcgR3JpZFNlcnZpY2UodGhpcy5ncmlkU3RhdGVTZXJ2aWNlLCB0aGlzLmZpbHRlclNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5wYWdpbmF0aW9uU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgICB0aGlzLmdyb3VwaW5nU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/Lmdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UgPz8gbmV3IEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UodGhpcy5leHRlbnNpb25VdGlsaXR5LCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuc2VydmljZUxpc3QgPSBbXHJcbiAgICAgIHRoaXMuY29udGFpbmVyU2VydmljZSxcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLFxyXG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZSxcclxuICAgICAgdGhpcy5ncmlkU2VydmljZSxcclxuICAgICAgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLFxyXG4gICAgICB0aGlzLmdyb3VwaW5nU2VydmljZSxcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSxcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZSxcclxuICAgICAgdGhpcy5zb3J0U2VydmljZSxcclxuICAgICAgdGhpcy50cmVlRGF0YVNlcnZpY2UsXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIHJlZ2lzdGVyIGFsbCBTZXJ2aWNlIGluc3RhbmNlcyBpbiB0aGUgY29udGFpbmVyXHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXh0ZW5zaW9uVXRpbGl0eScsIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRmlsdGVyU2VydmljZScsIHRoaXMuZmlsdGVyU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnQ29sbGVjdGlvblNlcnZpY2UnLCB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdFeHRlbnNpb25TZXJ2aWNlJywgdGhpcy5leHRlbnNpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkRXZlbnRTZXJ2aWNlJywgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkU2VydmljZScsIHRoaXMuZ3JpZFNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0dyaWRTdGF0ZVNlcnZpY2UnLCB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0dyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UnLCB0aGlzLmdyb3VwaW5nU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUGFnaW5hdGlvblNlcnZpY2UnLCB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdSZXNpemVyU2VydmljZScsIHRoaXMucmVzaXplclNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1NoYXJlZFNlcnZpY2UnLCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1NvcnRTZXJ2aWNlJywgdGhpcy5zb3J0U2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXZlbnRQdWJTdWJTZXJ2aWNlJywgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdQdWJTdWJTZXJ2aWNlJywgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdUcmFuc2xhdGVyU2VydmljZScsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1RyZWVEYXRhU2VydmljZScsIHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucyB8fCAhdGhpcy5jb2x1bW5EZWZpbml0aW9ucykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGA8YW5ndWxhci1zbGlja2dyaWQ+YCByZXF1aXJlcyBbZ3JpZE9wdGlvbnNdIGFuZCBbY29sdW1uRGVmaW5pdGlvbnNdLCBpdCBzZWVtcyB0aGF0IHlvdSBtaWdodCBoYXZlIGZvcmdvdCB0byBwcm92aWRlIHRoZW0gc2luY2UgYXQgbGVhc3Qgb2YgdGhlbSBpcyB1bmRlZmluZWQuJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmluaXRpYWxpemF0aW9uKHRoaXMuX2V2ZW50SGFuZGxlcik7XHJcbiAgICB0aGlzLl9pc0dyaWRJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgLy8gcmVjaGVjayB0aGUgZW1wdHkgd2FybmluZyBtZXNzYWdlIGFmdGVyIGdyaWQgaXMgc2hvd24gc28gdGhhdCBpdCB3b3JrcyBpbiBldmVyeSB1c2UgY2FzZVxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVFbXB0eURhdGFXYXJuaW5nTWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YXNldCkpIHtcclxuICAgICAgY29uc3QgZmluYWxUb3RhbENvdW50ID0gdGhpcy5kYXRhc2V0Lmxlbmd0aDtcclxuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZERlc3Ryb3knLCB0aGlzLnNsaWNrR3JpZCk7XHJcbiAgICB0aGlzLmRlc3Ryb3koKTtcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkFmdGVyR3JpZERlc3Ryb3llZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveShzaG91bGRFbXB0eURvbUVsZW1lbnRDb250YWluZXIgPSBmYWxzZSkge1xyXG4gICAgLy8gZGlzcG9zZSBvZiBhbGwgU2VydmljZXNcclxuICAgIHRoaXMuc2VydmljZUxpc3QuZm9yRWFjaCgoc2VydmljZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChzZXJ2aWNlICYmIHNlcnZpY2UuZGlzcG9zZSkge1xyXG4gICAgICAgIHNlcnZpY2UuZGlzcG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VydmljZUxpc3QgPSBbXTtcclxuXHJcbiAgICAvLyBkaXNwb3NlIGFsbCByZWdpc3RlcmVkIGV4dGVybmFsIHJlc291cmNlc1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcclxuICAgICAgd2hpbGUgKHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wb3AoKTtcclxuICAgICAgICBpZiAocmVzb3VyY2U/LmRpc3Bvc2UpIHtcclxuICAgICAgICAgIHJlc291cmNlLmRpc3Bvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRpc3Bvc2UgdGhlIENvbXBvbmVudHNcclxuICAgIHRoaXMuc2xpY2tFbXB0eVdhcm5pbmc/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuc2xpY2tGb290ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuc2xpY2tQYWdpbmF0aW9uPy5kaXNwb3NlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2V2ZW50SGFuZGxlcj8udW5zdWJzY3JpYmVBbGwpIHtcclxuICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnVuc3Vic2NyaWJlQWxsKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2U/LnVuc3Vic2NyaWJlQWxsKCk7XHJcbiAgICBpZiAodGhpcy5kYXRhVmlldykge1xyXG4gICAgICBpZiAodGhpcy5kYXRhVmlldz8uc2V0SXRlbXMpIHtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEl0ZW1zKFtdKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kYXRhVmlldy5kZXN0cm95KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhVmlldy5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNsaWNrR3JpZD8uZGVzdHJveSkge1xyXG4gICAgICB0aGlzLnNsaWNrR3JpZC5kZXN0cm95KHNob3VsZEVtcHR5RG9tRWxlbWVudENvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYmFja2VuZFNlcnZpY2VBcGkpIHtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoaXMuYmFja2VuZFNlcnZpY2VBcGkpKSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuYmFja2VuZFNlcnZpY2VBcGlbcHJvcCBhcyBrZXlvZiBCYWNrZW5kU2VydmljZUFwaV07XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5iYWNrZW5kU2VydmljZUFwaSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbHVtbkRlZmluaXRpb25zKSkge1xyXG4gICAgICAodGhpcy5jb2x1bW5EZWZpbml0aW9ucyBhcyBhbnkpW3Byb3BdID0gbnVsbDtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLnNoYXJlZFNlcnZpY2UpKSB7XHJcbiAgICAgICh0aGlzLnNoYXJlZFNlcnZpY2UgYXMgYW55KVtwcm9wXSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2UgY291bGQgb3B0aW9uYWxseSBhbHNvIGVtcHR5IHRoZSBjb250ZW50IG9mIHRoZSBncmlkIGNvbnRhaW5lciBET00gZWxlbWVudFxyXG4gICAgaWYgKHNob3VsZEVtcHR5RG9tRWxlbWVudENvbnRhaW5lcikge1xyXG4gICAgICB0aGlzLmVtcHR5R3JpZENvbnRhaW5lckVsbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsc28gdW5zdWJzY3JpYmUgYWxsIFJ4SlMgc3Vic2NyaXB0aW9uc1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gdW5zdWJzY3JpYmVBbGwodGhpcy5zdWJzY3JpcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLl9kYXRhc2V0ID0gbnVsbDtcclxuICAgIHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gW107XHJcbiAgICB0aGlzLl9hbmd1bGFyR3JpZEluc3RhbmNlcyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2xpY2tHcmlkID0gdW5kZWZpbmVkIGFzIGFueTtcclxuICB9XHJcblxyXG4gIGVtcHR5R3JpZENvbnRhaW5lckVsbSgpIHtcclxuICAgIGNvbnN0IGdyaWRDb250YWluZXJJZCA9IHRoaXMuZ3JpZE9wdGlvbnM/LmdyaWRDb250YWluZXJJZCA/PyAnZ3JpZDEnO1xyXG4gICAgY29uc3QgZ3JpZENvbnRhaW5lckVsbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2dyaWRDb250YWluZXJJZH1gKTtcclxuICAgIGVtcHR5RWxlbWVudChncmlkQ29udGFpbmVyRWxtKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBvdXIgaW50ZXJuYWwgUG9zdCBQcm9jZXNzIGNhbGxiYWNrLCBpdCB3aWxsIGV4ZWN1dGUgaW50ZXJuYWxseSBhZnRlciB3ZSBnZXQgYmFjayByZXN1bHQgZnJvbSB0aGUgUHJvY2VzcyBiYWNrZW5kIGNhbGxcclxuICAgKiBGb3Igbm93LCB0aGlzIGlzIEdyYXBoUUwgU2VydmljZSBPTkxZIGZlYXR1cmUgYW5kIGl0IHdpbGwgYmFzaWNhbGx5IHJlZnJlc2ggdGhlIERhdGFzZXQgJiBQYWdpbmF0aW9uIHdpdGhvdXQgaGF2aW5nIHRoZSB1c2VyIHRvIGNyZWF0ZSBoaXMgb3duIFBvc3RQcm9jZXNzIGV2ZXJ5IHRpbWVcclxuICAgKi9cclxuICBjcmVhdGVCYWNrZW5kQXBpSW50ZXJuYWxQb3N0UHJvY2Vzc0NhbGxiYWNrKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKSB7XHJcbiAgICBjb25zdCBiYWNrZW5kQXBpID0gZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGk7XHJcbiAgICBpZiAoYmFja2VuZEFwaSAmJiBiYWNrZW5kQXBpLnNlcnZpY2UpIHtcclxuICAgICAgY29uc3QgYmFja2VuZEFwaVNlcnZpY2UgPSBiYWNrZW5kQXBpLnNlcnZpY2U7XHJcblxyXG4gICAgICAvLyBpbnRlcm5hbFBvc3RQcm9jZXNzIG9ubHkgd29ya3MgKGZvciBub3cpIHdpdGggYSBHcmFwaFFMIFNlcnZpY2UsIHNvIG1ha2Ugc3VyZSBpdCBpcyBvZiB0aGF0IHR5cGVcclxuICAgICAgaWYgKHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGJhY2tlbmRBcGkuaW50ZXJuYWxQb3N0UHJvY2VzcyA9IChwcm9jZXNzUmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaVNlcnZpY2UgJiYgdHlwZW9mIGJhY2tlbmRBcGlTZXJ2aWNlLmdldERhdGFzZXROYW1lID09PSAnZnVuY3Rpb24nKSA/IGJhY2tlbmRBcGlTZXJ2aWNlLmdldERhdGFzZXROYW1lKCkgOiAnJztcclxuICAgICAgICAgIGlmIChwcm9jZXNzUmVzdWx0Py5kYXRhW2RhdGFzZXROYW1lXSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcHJvY2Vzc1Jlc3VsdC5kYXRhW2RhdGFzZXROYW1lXS5oYXNPd25Qcm9wZXJ0eSgnbm9kZXMnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubm9kZXMgOiAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b3RhbENvdW50ID0gcHJvY2Vzc1Jlc3VsdC5kYXRhW2RhdGFzZXROYW1lXS5oYXNPd25Qcm9wZXJ0eSgndG90YWxDb3VudCcpID8gKHByb2Nlc3NSZXN1bHQgYXMgYW55KS5kYXRhW2RhdGFzZXROYW1lXS50b3RhbENvdW50IDogKHByb2Nlc3NSZXN1bHQgYXMgYW55KS5kYXRhW2RhdGFzZXROYW1lXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKGRhdGEsIHRvdGFsQ291bnQgfHwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6YXRpb24oZXZlbnRIYW5kbGVyOiBTbGlja0V2ZW50SGFuZGxlcikge1xyXG4gICAgdGhpcy5ncmlkT3B0aW9ucy50cmFuc2xhdGVyID0gdGhpcy50cmFuc2xhdGVyU2VydmljZTtcclxuICAgIHRoaXMuX2V2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjtcclxuXHJcbiAgICAvLyB3aGVuIGRldGVjdGluZyBhIGZyb3plbiBncmlkLCB3ZSdsbCBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgbW91c2V3aGVlbCBzY3JvbGwgaGFuZGxlciBzbyB0aGF0IHdlIGNhbiBzY3JvbGwgZnJvbSBib3RoIGxlZnQvcmlnaHQgZnJvemVuIGNvbnRhaW5lcnNcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmICgodGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Sb3cgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdyaWRPcHRpb25zLmZyb3plblJvdyA+PSAwKSB8fCB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uID49IDApICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlTW91c2VXaGVlbFNjcm9sbEhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZU1vdXNlV2hlZWxTY3JvbGxIYW5kbGVyID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZXZlbnROYW1pbmdTdHlsZSA9IHRoaXMuZ3JpZE9wdGlvbnM/LmV2ZW50TmFtaW5nU3R5bGUgPz8gRXZlbnROYW1pbmdTdHlsZS5jYW1lbENhc2U7XHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25CZWZvcmVHcmlkQ3JlYXRlJywgdHJ1ZSk7XHJcblxyXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBkYXRhc2V0IGlzIGluaXRpYWxpemVkIChpZiBub3QgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciB0aGF0IGl0IGNhbm5vdCBnZXRMZW5ndGggb2YgbnVsbClcclxuICAgIHRoaXMuX2RhdGFzZXQgPSB0aGlzLl9kYXRhc2V0IHx8IFtdO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9ucyA9IHRoaXMubWVyZ2VHcmlkT3B0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID0gdGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbjtcclxuICAgIHRoaXMubG9jYWxlcyA9IHRoaXMuZ3JpZE9wdGlvbnM/LmxvY2FsZXMgPz8gQ29uc3RhbnRzLmxvY2FsZXM7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpID0gdGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGk7XHJcbiAgICB0aGlzLl9pc0xvY2FsR3JpZCA9ICF0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpOyAvLyBjb25zaWRlcmVkIGEgbG9jYWwgZ3JpZCBpZiBpdCBkb2Vzbid0IGhhdmUgYSBiYWNrZW5kIHNlcnZpY2Ugc2V0XHJcblxyXG4gICAgdGhpcy5jcmVhdGVCYWNrZW5kQXBpSW50ZXJuYWxQb3N0UHJvY2Vzc0NhbGxiYWNrKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cclxuICAgIGlmICghdGhpcy5jdXN0b21EYXRhVmlldykge1xyXG4gICAgICBjb25zdCBkYXRhdmlld0lubGluZUZpbHRlcnMgPSB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3ICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuaW5saW5lRmlsdGVycyB8fCBmYWxzZTtcclxuICAgICAgbGV0IGRhdGFWaWV3T3B0aW9uczogRGF0YVZpZXdPcHRpb24gPSB7IGlubGluZUZpbHRlcnM6IGRhdGF2aWV3SW5saW5lRmlsdGVycyB9O1xyXG5cclxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZHJhZ2dhYmxlR3JvdXBpbmcgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVHcm91cGluZykge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlciA9IG5ldyBTbGlja0dyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIoKTtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlciA9IHRoaXMuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlcjtcclxuICAgICAgICBkYXRhVmlld09wdGlvbnMgPSB7IC4uLmRhdGFWaWV3T3B0aW9ucywgZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlcjogdGhpcy5ncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyIH07XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBTbGljay5EYXRhLkRhdGFWaWV3KGRhdGFWaWV3T3B0aW9ucyk7XHJcbiAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkRhdGF2aWV3Q3JlYXRlZCcsIHRoaXMuZGF0YVZpZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBhbnkgcG9zc2libGUgU2VydmljZXMgdGhhdCB1c2VyIHdhbnQgdG8gcmVnaXN0ZXIgd2hpY2ggZG9uJ3QgcmVxdWlyZSBTbGlja0dyaWQgdG8gYmUgaW5zdGFudGlhdGVkXHJcbiAgICAvLyBSeEpTIFJlc291cmNlIGlzIGluIHRoaXMgbG90IGJlY2F1c2UgaXQgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgYW5kIGRvZXNuJ3QgcmVxdWlyZSBTbGlja0dyaWQgdG8gYmUgaW5pdGlhbGl6ZWRcclxuICAgIHRoaXMucHJlUmVnaXN0ZXJSZXNvdXJjZXMoKTtcclxuXHJcbiAgICAvLyBmb3IgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIsIHdlIHByb3ZpZGUgdGhlIHByb3BlcnR5IFwiZWRpdG9yXCIgYXMgYW4gQW5ndWxhci1TbGlja2dyaWQgZWRpdG9yIGNvbXBsZXggb2JqZWN0XHJcbiAgICAvLyBob3dldmVyIFwiZWRpdG9yXCIgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IFNsaWNrR3JpZCBmb3IgaXQncyBvd24gRWRpdG9yIEZhY3RvcnlcclxuICAgIC8vIHNvIGluIG91ciBsaWIgd2Ugd2lsbCBzd2FwIFwiZWRpdG9yXCIgYW5kIGNvcHkgaXQgaW50byBhIG5ldyBwcm9wZXJ0eSBjYWxsZWQgXCJpbnRlcm5hbENvbHVtbkVkaXRvclwiXHJcbiAgICAvLyB0aGVuIHRha2UgYmFjayBcImVkaXRvci5tb2RlbFwiIGFuZCBtYWtlIGl0IHRoZSBuZXcgXCJlZGl0b3JcIiBzbyB0aGF0IFNsaWNrR3JpZCBFZGl0b3IgRmFjdG9yeSBzdGlsbCB3b3Jrc1xyXG4gICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSB0aGlzLnN3YXBJbnRlcm5hbEVkaXRvclRvU2xpY2tHcmlkRmFjdG9yeUVkaXRvcih0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyk7XHJcblxyXG4gICAgLy8gaWYgdGhlIHVzZXIgd2FudHMgdG8gYXV0b21hdGljYWxseSBhZGQgYSBDdXN0b20gRWRpdG9yIEZvcm1hdHRlciwgd2UgbmVlZCB0byBjYWxsIHRoZSBhdXRvIGFkZCBmdW5jdGlvbiBhZ2FpblxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuYXV0b0FkZEN1c3RvbUVkaXRvckZvcm1hdHRlcikge1xyXG4gICAgICBhdXRvQWRkRWRpdG9yRm9ybWF0dGVyVG9Db2x1bW5zV2l0aEVkaXRvcih0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucy5hdXRvQWRkQ3VzdG9tRWRpdG9yRm9ybWF0dGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzYXZlIHJlZmVyZW5jZSBmb3IgYWxsIGNvbHVtbnMgYmVmb3JlIHRoZXkgb3B0aW9uYWxseSBiZWNvbWUgaGlkZGVuL3Zpc2libGVcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UudmlzaWJsZUNvbHVtbnMgPSB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucztcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5jcmVhdGVFeHRlbnNpb25zQmVmb3JlR3JpZENyZWF0aW9uKHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuXHJcbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBQaW5uaW5nL0Zyb3plbiBcInByZXNldHNcIiwgd2UgbmVlZCB0byBhcHBseSB0aGVtIGluIHRoZSBncmlkIG9wdGlvbnNcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnByZXNldHM/LnBpbm5pbmcpIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucyA9IHsgLi4udGhpcy5ncmlkT3B0aW9ucywgLi4udGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLnBpbm5pbmcgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBidWlsZCBTbGlja0dyaWQgR3JpZCwgYWxzbyB1c2VyIG1pZ2h0IG9wdGlvbmFsbHkgcGFzcyBhIGN1c3RvbSBkYXRhdmlldyAoZS5nLiByZW1vdGUgbW9kZWwpXHJcbiAgICB0aGlzLnNsaWNrR3JpZCA9IG5ldyBTbGljay5HcmlkKGAjJHt0aGlzLmdyaWRJZH1gLCB0aGlzLmN1c3RvbURhdGFWaWV3IHx8IHRoaXMuZGF0YVZpZXcsIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5kYXRhVmlldyA9IHRoaXMuZGF0YVZpZXc7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2xpY2tHcmlkID0gdGhpcy5zbGlja0dyaWQ7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ3JpZENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmVsbS5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50O1xyXG5cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5iaW5kRGlmZmVyZW50RXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5iaW5kRGlmZmVyZW50SG9va3ModGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuZGF0YVZpZXcpO1xyXG5cclxuICAgIC8vIHdoZW4gaXQncyBhIGZyb3plbiBncmlkLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGZyb3plbiBjb2x1bW4gaWQgZm9yIHJlZmVyZW5jZSBpZiB3ZSBldmVyIHNob3cvaGlkZSBjb2x1bW4gZnJvbSBDb2x1bW5QaWNrZXIvR3JpZE1lbnUgYWZ0ZXJ3YXJkXHJcbiAgICBjb25zdCBmcm96ZW5Db2x1bW5JbmRleCA9IHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uICE9PSB1bmRlZmluZWQgPyB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiA6IC0xO1xyXG4gICAgaWYgKGZyb3plbkNvbHVtbkluZGV4ID49IDAgJiYgZnJvemVuQ29sdW1uSW5kZXggPD0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5mcm96ZW5WaXNpYmxlQ29sdW1uSWQgPSB0aGlzLl9jb2x1bW5EZWZpbml0aW9uc1tmcm96ZW5Db2x1bW5JbmRleF0uaWQgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IGFueSBwb3NzaWJsZSBTZXJ2aWNlcyB0aGF0IHVzZXIgd2FudCB0byByZWdpc3RlclxyXG4gICAgdGhpcy5yZWdpc3RlclJlc291cmNlcygpO1xyXG5cclxuICAgIC8vIGluaXRpYWxpemUgdGhlIFNsaWNrR3JpZCBncmlkXHJcbiAgICB0aGlzLnNsaWNrR3JpZC5pbml0KCk7XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZWQgdGhlIHJlc2l6ZXIgc2VydmljZSBvbmx5IGFmdGVyIFNsaWNrR3JpZCBpcyBpbml0aWFsaXplZFxyXG4gICAgLy8gaWYgd2UgZG9uJ3Qgd2UgZW5kIHVwIGJpbmRpbmcgb3VyIHJlc2l6ZSB0byBhIGdyaWQgZWxlbWVudCB0aGF0IGRvZXNuJ3QgeWV0IGV4aXN0IGluIHRoZSBET00gYW5kIHRoZSByZXNpemVyIHNlcnZpY2Ugd2lsbCBmYWlsIHNpbGVudGx5IChiZWNhdXNlIGl0IGhhcyBhIHRyeS9jYXRjaCB0aGF0IHVuYmluZHMgdGhlIHJlc2l6ZSB3aXRob3V0IHRocm93aW5nIGJhY2spXHJcbiAgICBpZiAodGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLmluaXQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHVzZXIgY291bGQgc2hvdyBhIGN1c3RvbSBmb290ZXIgd2l0aCB0aGUgZGF0YSBtZXRyaWNzIChkYXRhc2V0IGxlbmd0aCBhbmQgbGFzdCB1cGRhdGVkIHRpbWVzdGFtcClcclxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnMuc2hvd0N1c3RvbUZvb3RlciAmJiB0aGlzLmdyaWRPcHRpb25zLmN1c3RvbUZvb3Rlck9wdGlvbnMgJiYgdGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyID0gbmV3IFNsaWNrRm9vdGVyQ29tcG9uZW50KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLmN1c3RvbUZvb3Rlck9wdGlvbnMsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICAgIHRoaXMuc2xpY2tGb290ZXIucmVuZGVyRm9vdGVyKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jdXN0b21EYXRhVmlldyAmJiB0aGlzLmRhdGFWaWV3KSB7XHJcbiAgICAgIC8vIGxvYWQgdGhlIGRhdGEgaW4gdGhlIERhdGFWaWV3ICh1bmxlc3MgaXQncyBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0LCBpZiBzbyBpdCB3aWxsIGJlIGxvYWRlZCBhZnRlciB0aGUgaW5pdGlhbCB0cmVlIHNvcnQpXHJcbiAgICAgIGNvbnN0IGluaXRpYWxEYXRhc2V0ID0gdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlVHJlZURhdGEgPyB0aGlzLnNvcnRUcmVlRGF0YXNldCh0aGlzLl9kYXRhc2V0KSA6IHRoaXMuX2RhdGFzZXQ7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhpbml0aWFsRGF0YXNldCB8fCBbXSwgdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUgPz8gJ2lkJyk7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuZW5kVXBkYXRlKCk7XHJcblxyXG4gICAgICAvLyBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgaXRlbXMgdGhhdCBhcmUgbm90IHZpc2libGUgKGR1ZSB0byBiZWluZyBmaWx0ZXJlZCBvdXQgb3IgYmVpbmcgb24gYSBkaWZmZXJlbnQgcGFnZSlcclxuICAgICAgLy8gdG8gc3RheSBzZWxlY3RlZCwgcGFzcyAnZmFsc2UnIHRvIHRoZSBzZWNvbmQgYXJnXHJcbiAgICAgIGlmICh0aGlzLnNsaWNrR3JpZD8uZ2V0U2VsZWN0aW9uTW9kZWwoKSAmJiB0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5oYXNPd25Qcm9wZXJ0eSgnc3luY0dyaWRTZWxlY3Rpb24nKSkge1xyXG4gICAgICAgIC8vIGlmIHdlIGFyZSB1c2luZyBhIEJhY2tlbmQgU2VydmljZSwgd2Ugd2lsbCBkbyBhbiBleHRyYSBmbGFnIGNoZWNrLCB0aGUgcmVhc29uIGlzIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBzb21lIHVuaW50ZW5kZWQgYmVoYXZpb3JzXHJcbiAgICAgICAgLy8gd2l0aCB0aGUgQmFja2VuZFNlcnZpY2VBcGkgYmVjYXVzZSB0ZWNobmljYWxseSB0aGUgZGF0YSBpbiB0aGUgcGFnZSBjaGFuZ2VzIHRoZSBEYXRhVmlldyBvbiBldmVyeSBwYWdlIGNoYW5nZS5cclxuICAgICAgICBsZXQgcHJlc2VydmVkUm93U2VsZWN0aW9uV2l0aEJhY2tlbmQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3Lmhhc093blByb3BlcnR5KCdzeW5jR3JpZFNlbGVjdGlvbldpdGhCYWNrZW5kU2VydmljZScpKSB7XHJcbiAgICAgICAgICBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb25XaXRoQmFja2VuZCA9IHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb25XaXRoQmFja2VuZFNlcnZpY2UgYXMgYm9vbGVhbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHN5bmNHcmlkU2VsZWN0aW9uID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5zeW5jR3JpZFNlbGVjdGlvbjtcclxuICAgICAgICBpZiAodHlwZW9mIHN5bmNHcmlkU2VsZWN0aW9uID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgIGxldCBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb24gPSBzeW5jR3JpZFNlbGVjdGlvbjtcclxuICAgICAgICAgIGlmICghdGhpcy5faXNMb2NhbEdyaWQpIHtcclxuICAgICAgICAgICAgLy8gd2hlbiB1c2luZyBCYWNrZW5kU2VydmljZUFwaSwgd2UnbGwgYmUgdXNpbmcgdGhlIFwic3luY0dyaWRTZWxlY3Rpb25XaXRoQmFja2VuZFNlcnZpY2VcIiBmbGFnIEJVVCBcInN5bmNHcmlkU2VsZWN0aW9uXCIgbXVzdCBhbHNvIGJlIHNldCB0byBUcnVlXHJcbiAgICAgICAgICAgIHByZXNlcnZlZFJvd1NlbGVjdGlvbiA9IHN5bmNHcmlkU2VsZWN0aW9uICYmIHByZXNlcnZlZFJvd1NlbGVjdGlvbldpdGhCYWNrZW5kO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5kYXRhVmlldy5zeW5jR3JpZFNlbGVjdGlvbih0aGlzLnNsaWNrR3JpZCwgcHJlc2VydmVkUm93U2VsZWN0aW9uKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzeW5jR3JpZFNlbGVjdGlvbiA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb24odGhpcy5zbGlja0dyaWQsIHN5bmNHcmlkU2VsZWN0aW9uLnByZXNlcnZlSGlkZGVuLCBzeW5jR3JpZFNlbGVjdGlvbi5wcmVzZXJ2ZUhpZGRlbk9uU2VsZWN0aW9uQ2hhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGFzZXRMbiA9IHRoaXMuZGF0YVZpZXcuZ2V0TGVuZ3RoKCkgfHwgdGhpcy5fZGF0YXNldCAmJiB0aGlzLl9kYXRhc2V0Lmxlbmd0aCB8fCAwO1xyXG4gICAgICBpZiAoZGF0YXNldExuID4gMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3RvciB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMubG9hZFJvd1NlbGVjdGlvblByZXNldFdoZW5FeGlzdHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcclxuICAgICAgICB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB1c2VyIG1pZ2h0IHdhbnQgdG8gaGlkZSB0aGUgaGVhZGVyIHJvdyBvbiBwYWdlIGxvYWQgYnV0IHN0aWxsIGhhdmUgYGVuYWJsZUZpbHRlcmluZzogdHJ1ZWBcclxuICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHdlIG5lZWQgdG8gaGlkZSB0aGUgaGVhZGVyUm93IE9OTFkgQUZURVIgYWxsIGZpbHRlcnMgZ290IGNyZWF0ZWQgJiBkYXRhVmlldyBleGlzdFxyXG4gICAgaWYgKHRoaXMuX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlclJvdyhmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRoaXMuX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1Ymxpc2ggJiBkaXNwYXRjaCBjZXJ0YWluIGV2ZW50c1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uR3JpZENyZWF0ZWQnLCB0aGlzLnNsaWNrR3JpZCk7XHJcblxyXG4gICAgLy8gYWZ0ZXIgdGhlIERhdGFWaWV3IGlzIGNyZWF0ZWQgJiB1cGRhdGVkIGV4ZWN1dGUgc29tZSBwcm9jZXNzZXNcclxuICAgIGlmICghdGhpcy5jdXN0b21EYXRhVmlldykge1xyXG4gICAgICB0aGlzLmV4ZWN1dGVBZnRlckRhdGF2aWV3Q3JlYXRlZCh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYmluZCByZXNpemUgT05MWSBhZnRlciB0aGUgZGF0YVZpZXcgaXMgcmVhZHlcclxuICAgIHRoaXMuYmluZFJlc2l6ZUhvb2sodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cclxuICAgIC8vIGJpbmQgdGhlIEJhY2tlbmQgU2VydmljZSBBUEkgY2FsbGJhY2sgZnVuY3Rpb25zIG9ubHkgYWZ0ZXIgdGhlIGdyaWQgaXMgaW5pdGlhbGl6ZWRcclxuICAgIC8vIGJlY2F1c2UgdGhlIHByZVByb2Nlc3MoKSBhbmQgb25Jbml0KCkgbWlnaHQgZ2V0IHRyaWdnZXJlZFxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpKSB7XHJcbiAgICAgIHRoaXMuYmluZEJhY2tlbmRDYWxsYmFja0Z1bmN0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsb2NhbCBncmlkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgdGhlIFBhZ2luYXRpb25cclxuICAgIC8vIGlmIHNvIHRoZW4gYWxzbyBjaGVjayBpZiB0aGVyZSdzIGFueSBwcmVzZXRzIGFuZCBmaW5hbGx5IGluaXRpYWxpemUgdGhlIFBhZ2luYXRpb25TZXJ2aWNlXHJcbiAgICAvLyBhIGxvY2FsIGdyaWQgd2l0aCBQYWdpbmF0aW9uIHByZXNldHMgd2lsbCBwb3RlbnRpYWxseSBoYXZlIGEgZGlmZmVyZW50IHRvdGFsIG9mIGl0ZW1zLCB3ZSdsbCBuZWVkIHRvIGdldCBpdCBmcm9tIHRoZSBEYXRhVmlldyBhbmQgdXBkYXRlIG91ciB0b3RhbFxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVBhZ2luYXRpb24gJiYgdGhpcy5faXNMb2NhbEdyaWQpIHtcclxuICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMubG9hZExvY2FsR3JpZFBhZ2luYXRpb24odGhpcy5kYXRhc2V0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9hbmd1bGFyR3JpZEluc3RhbmNlcyA9IHtcclxuICAgICAgLy8gU2xpY2sgR3JpZCAmIERhdGFWaWV3IG9iamVjdHNcclxuICAgICAgZGF0YVZpZXc6IHRoaXMuZGF0YVZpZXcsXHJcbiAgICAgIHNsaWNrR3JpZDogdGhpcy5zbGlja0dyaWQsXHJcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9uU2VydmljZT8uZXh0ZW5zaW9uTGlzdCxcclxuXHJcbiAgICAgIC8vIHB1YmxpYyBtZXRob2RzXHJcbiAgICAgIGRlc3Ryb3k6IHRoaXMuZGVzdHJveS5iaW5kKHRoaXMpLFxyXG5cclxuICAgICAgLy8gcmV0dXJuIGFsbCBhdmFpbGFibGUgU2VydmljZXMgKG5vbi1zaW5nbGV0b24pXHJcbiAgICAgIGJhY2tlbmRTZXJ2aWNlOiB0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaT8uc2VydmljZSxcclxuICAgICAgZmlsdGVyU2VydmljZTogdGhpcy5maWx0ZXJTZXJ2aWNlLFxyXG4gICAgICBncmlkRXZlbnRTZXJ2aWNlOiB0aGlzLmdyaWRFdmVudFNlcnZpY2UsXHJcbiAgICAgIGdyaWRTdGF0ZVNlcnZpY2U6IHRoaXMuZ3JpZFN0YXRlU2VydmljZSxcclxuICAgICAgZ3JpZFNlcnZpY2U6IHRoaXMuZ3JpZFNlcnZpY2UsXHJcbiAgICAgIGdyb3VwaW5nU2VydmljZTogdGhpcy5ncm91cGluZ1NlcnZpY2UsXHJcbiAgICAgIGV4dGVuc2lvblNlcnZpY2U6IHRoaXMuZXh0ZW5zaW9uU2VydmljZSxcclxuICAgICAgcGFnaW5hdGlvblNlcnZpY2U6IHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgICAgIHJlc2l6ZXJTZXJ2aWNlOiB0aGlzLnJlc2l6ZXJTZXJ2aWNlLFxyXG4gICAgICBzb3J0U2VydmljZTogdGhpcy5zb3J0U2VydmljZSxcclxuICAgICAgdHJlZURhdGFTZXJ2aWNlOiB0aGlzLnRyZWVEYXRhU2VydmljZSxcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbGwgaW5zdGFuY2VzIChTbGlja0dyaWQsIERhdGFWaWV3ICYgYWxsIFNlcnZpY2VzKVxyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQW5ndWxhckdyaWRDcmVhdGVkJywgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gYSBQYWdpbmF0aW9uIGNoYW5nZWQsIHdlIHdpbGwgdHJpZ2dlciBhIEdyaWQgU3RhdGUgY2hhbmdlZCB3aXRoIHRoZSBuZXcgcGFnaW5hdGlvbiBpbmZvXHJcbiAgICogQWxzbyBpZiB3ZSB1c2UgUm93IFNlbGVjdGlvbiBvciB0aGUgQ2hlY2tib3ggU2VsZWN0b3IsIHdlIG5lZWQgdG8gcmVzZXQgYW55IHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIHBhZ2luYXRpb25DaGFuZ2VkKHBhZ2luYXRpb246IFNlcnZpY2VQYWdpbmF0aW9uKSB7XHJcbiAgICBjb25zdCBpc1N5bmNHcmlkU2VsZWN0aW9uRW5hYmxlZCA9IHRoaXMuZ3JpZFN0YXRlU2VydmljZT8ubmVlZFRvUHJlc2VydmVSb3dTZWxlY3Rpb24oKSA/PyBmYWxzZTtcclxuICAgIGlmICghaXNTeW5jR3JpZFNlbGVjdGlvbkVuYWJsZWQgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3RvcikpIHtcclxuICAgICAgdGhpcy5zbGlja0dyaWQuc2V0U2VsZWN0ZWRSb3dzKFtdKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfSA9IHBhZ2luYXRpb247XHJcbiAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlKSB7XHJcbiAgICAgIGlmIChwYWdlU2l6ZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2VOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jdXJyZW50UGFnaW5hdGlvbiA9IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uR3JpZFN0YXRlQ2hhbmdlZCcsIHtcclxuICAgICAgY2hhbmdlOiB7IG5ld1ZhbHVlczogeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9LCB0eXBlOiBHcmlkU3RhdGVUeXBlLnBhZ2luYXRpb24gfSxcclxuICAgICAgZ3JpZFN0YXRlOiB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UuZ2V0Q3VycmVudEdyaWRTdGF0ZSgpXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIGRhdGFzZXQgY2hhbmdlcywgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBlbnRpcmUgZ3JpZCBVSSAmIHBvc3NpYmx5IHJlc2l6ZSBpdCBhcyB3ZWxsXHJcbiAgICogQHBhcmFtIGRhdGFzZXRcclxuICAgKi9cclxuICByZWZyZXNoR3JpZERhdGEoZGF0YXNldDogYW55W10sIHRvdGFsQ291bnQ/OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UgJiYgQXJyYXkuaXNBcnJheShkYXRhc2V0KSkge1xyXG4gICAgICBjb25zdCBmaW5hbFRvdGFsQ291bnQgPSB0b3RhbENvdW50IHx8IGRhdGFzZXQubGVuZ3RoO1xyXG4gICAgICB0aGlzLmRpc3BsYXlFbXB0eURhdGFXYXJuaW5nKGZpbmFsVG90YWxDb3VudCA8IDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFzZXQpICYmIHRoaXMuc2xpY2tHcmlkICYmIHRoaXMuZGF0YVZpZXc/LnNldEl0ZW1zKSB7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoZGF0YXNldCwgdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUgPz8gJ2lkJyk7XHJcbiAgICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiAhdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmVlRGF0YSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcucmVTb3J0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXRhc2V0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkUm93U2VsZWN0aW9uUHJlc2V0V2hlbkV4aXN0cygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXRhc2V0KSB7XHJcbiAgICAgICAgdGhpcy5zbGlja0dyaWQuaW52YWxpZGF0ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBkaXNwbGF5IHRoZSBQYWdpbmF0aW9uIGNvbXBvbmVudCBvbmx5IGFmdGVyIGNhbGxpbmcgdGhpcyByZWZyZXNoIGRhdGEgZmlyc3QsIHdlIGNhbGwgaXQgaGVyZSBzbyB0aGF0IGlmIHdlIHByZXNldCBwYWdpbmF0aW9uIHBhZ2UgbnVtYmVyIGl0IHdpbGwgYmUgc2hvd24gY29ycmVjdGx5XHJcbiAgICAgIHRoaXMuc2hvd1BhZ2luYXRpb24gPSAodGhpcy5ncmlkT3B0aW9ucyAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uIHx8ICh0aGlzLmdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkKSkpID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3BhZ2luYXRpb25PcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb24gJiYgdGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGkpIHtcclxuICAgICAgICBjb25zdCBwYWdpbmF0aW9uT3B0aW9ucyA9IHRoaXMuc2V0UGFnaW5hdGlvbk9wdGlvbnNXaGVuUHJlc2V0RGVmaW5lZCh0aGlzLmdyaWRPcHRpb25zLCB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyBhcyBQYWdpbmF0aW9uKTtcclxuICAgICAgICAvLyB3aGVuIHdlIGhhdmUgYSB0b3RhbENvdW50IHVzZSBpdCwgZWxzZSB3ZSdsbCB0YWtlIGl0IGZyb20gdGhlIHBhZ2luYXRpb24gb2JqZWN0XHJcbiAgICAgICAgLy8gb25seSB1cGRhdGUgdGhlIHRvdGFsIGl0ZW1zIGlmIGl0J3MgZGlmZmVyZW50IHRvIGF2b2lkIHJlZnJlc2hpbmcgdGhlIFVJXHJcbiAgICAgICAgY29uc3QgdG90YWxSZWNvcmRzID0gKHRvdGFsQ291bnQgIT09IHVuZGVmaW5lZCkgPyB0b3RhbENvdW50IDogKHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb24/LnRvdGFsSXRlbXMpO1xyXG4gICAgICAgIGlmICh0b3RhbFJlY29yZHMgIT09IHVuZGVmaW5lZCAmJiB0b3RhbFJlY29yZHMgIT09IHRoaXMudG90YWxJdGVtcykge1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gK3RvdGFsUmVjb3JkcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIFBhZ2luYXRpb24gU2VydmljZSB3aXRoIG5ldyBwYWdpbmF0aW9uIG9wdGlvbnMgKHdoaWNoIG1pZ2h0IGhhdmUgcHJlc2V0cylcclxuICAgICAgICBpZiAoIXRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVQYWdpbmF0aW9uU2VydmljZShwYWdpbmF0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcGFnaW5hdGlvbiBzZXJ2aWNlIHdpdGggdGhlIG5ldyB0b3RhbFxyXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVUb3RhbEl0ZW1zKHRoaXMudG90YWxJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZXNpemUgdGhlIGdyaWQgaW5zaWRlIGEgc2xpZ2h0IHRpbWVvdXQsIGluIGNhc2Ugb3RoZXIgRE9NIGVsZW1lbnQgY2hhbmdlZCBwcmlvciB0byB0aGUgcmVzaXplIChsaWtlIGEgZmlsdGVyL3BhZ2luYXRpb24gY2hhbmdlZClcclxuICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5ncmlkT3B0aW9ucy5hdXRvUmVzaXplICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1Jlc2l6ZS5kZWxheTtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUdyaWQoZGVsYXkgfHwgMTApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGVyZSdzIGFueSBQYWdpbmF0aW9uIFByZXNldHMgZGVmaW5lZCBpbiB0aGUgR3JpZCBPcHRpb25zLFxyXG4gICAqIGlmIHRoZXJlIGFyZSB0aGVuIGxvYWQgdGhlbSBpbiB0aGUgcGFnaW5hdGlvbk9wdGlvbnMgb2JqZWN0XHJcbiAgICovXHJcbiAgc2V0UGFnaW5hdGlvbk9wdGlvbnNXaGVuUHJlc2V0RGVmaW5lZChncmlkT3B0aW9uczogR3JpZE9wdGlvbiwgcGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24pOiBQYWdpbmF0aW9uIHtcclxuICAgIGlmIChncmlkT3B0aW9ucy5wcmVzZXRzPy5wYWdpbmF0aW9uICYmIHBhZ2luYXRpb25PcHRpb25zICYmICF0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCkge1xyXG4gICAgICBwYWdpbmF0aW9uT3B0aW9ucy5wYWdlU2l6ZSA9IGdyaWRPcHRpb25zLnByZXNldHMucGFnaW5hdGlvbi5wYWdlU2l6ZTtcclxuICAgICAgcGFnaW5hdGlvbk9wdGlvbnMucGFnZU51bWJlciA9IGdyaWRPcHRpb25zLnByZXNldHMucGFnaW5hdGlvbi5wYWdlTnVtYmVyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhZ2luYXRpb25PcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRHluYW1pY2FsbHkgY2hhbmdlIG9yIHVwZGF0ZSB0aGUgY29sdW1uIGRlZmluaXRpb25zIGxpc3QuXHJcbiAgICogV2Ugd2lsbCByZS1yZW5kZXIgdGhlIGdyaWQgc28gdGhhdCB0aGUgbmV3IGhlYWRlciBhbmQgZGF0YSBzaG93cyB1cCBjb3JyZWN0bHkuXHJcbiAgICogSWYgdXNpbmcgaTE4biwgd2UgYWxzbyBuZWVkIHRvIHRyaWdnZXIgYSByZS10cmFuc2xhdGUgb2YgdGhlIGNvbHVtbiBoZWFkZXJzXHJcbiAgICovXHJcbiAgdXBkYXRlQ29sdW1uRGVmaW5pdGlvbnNMaXN0KG5ld0NvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xyXG4gICAgLy8gbWFwL3N3YXAgdGhlIGludGVybmFsIGxpYnJhcnkgRWRpdG9yIHRvIHRoZSBTbGlja0dyaWQgRWRpdG9yIGZhY3RvcnlcclxuICAgIG5ld0NvbHVtbkRlZmluaXRpb25zID0gdGhpcy5zd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IobmV3Q29sdW1uRGVmaW5pdGlvbnMpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudHJhbnNsYXRlQ29sdW1uSGVhZGVycyhmYWxzZSwgbmV3Q29sdW1uRGVmaW5pdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnJlbmRlckNvbHVtbkhlYWRlcnMobmV3Q29sdW1uRGVmaW5pdGlvbnMsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5zbGlja0dyaWQuYXV0b3NpemVDb2x1bW5zKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCAmJiB0aGlzLnJlc2l6ZXJTZXJ2aWNlPy5yZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCkge1xyXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IHRoZSBmaWx0ZXIgcm93IGRpc3BsYXllZCBvbiBmaXJzdCByb3csIHdlIGNhbiBvcHRpb25hbGx5IHBhc3MgZmFsc2UgdG8gaGlkZSBpdC5cclxuICAgKiBAcGFyYW0gc2hvd2luZ1xyXG4gICAqL1xyXG4gIHNob3dIZWFkZXJSb3coc2hvd2luZyA9IHRydWUpIHtcclxuICAgIHRoaXMuc2xpY2tHcmlkLnNldEhlYWRlclJvd1Zpc2liaWxpdHkoc2hvd2luZywgZmFsc2UpO1xyXG4gICAgaWYgKHNob3dpbmcgPT09IHRydWUgJiYgdGhpcy5faXNHcmlkSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5zbGlja0dyaWQuc2V0Q29sdW1ucyh0aGlzLmNvbHVtbkRlZmluaXRpb25zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzaG93aW5nO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICAvLyBwcml2YXRlIGZ1bmN0aW9uc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKipcclxuICAgKiBMb29wIHRocm91Z2ggYWxsIGNvbHVtbiBkZWZpbml0aW9ucyBhbmQgY29weSB0aGUgb3JpZ2luYWwgb3B0aW9uYWwgYHdpZHRoYCBwcm9wZXJ0aWVzIG9wdGlvbmFsbHkgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXHJcbiAgICogV2Ugd2lsbCB1c2UgdGhpcyB3aGVuIGRvaW5nIGEgcmVzaXplIGJ5IGNlbGwgY29udGVudCwgaWYgdXNlciBwcm92aWRlZCBhIGB3aWR0aGAgaXQgd29uJ3Qgb3ZlcnJpZGUgaXQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb3B5Q29sdW1uV2lkdGhzUmVmZXJlbmNlKGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xyXG4gICAgY29sdW1uRGVmaW5pdGlvbnMuZm9yRWFjaChjb2wgPT4gY29sLm9yaWdpbmFsV2lkdGggPSBjb2wud2lkdGgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNwbGF5RW1wdHlEYXRhV2FybmluZyhzaG93V2FybmluZyA9IHRydWUpIHtcclxuICAgIHRoaXMuc2xpY2tFbXB0eVdhcm5pbmc/LnNob3dFbXB0eURhdGFNZXNzYWdlKHNob3dXYXJuaW5nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmluZERpZmZlcmVudEhvb2tzKGdyaWQ6IFNsaWNrR3JpZCwgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24sIGRhdGFWaWV3OiBTbGlja0RhdGFWaWV3KSB7XHJcbiAgICAvLyBvbiBsb2NhbGUgY2hhbmdlLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHRyYW5zbGF0ZSB0aGUgSGVhZGVycywgR3JpZE1lbnVcclxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZT8ub25MYW5nQ2hhbmdlKSB7XHJcbiAgICAgIC8vIHRyYW5zbGF0ZSBzb21lIG9mIHRoZW0gb24gZmlyc3QgbG9hZCwgdGhlbiBvbiBlYWNoIGxhbmd1YWdlIGNoYW5nZVxyXG4gICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUFsbEV4dGVuc2lvbnMoKTtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkhlYWRlclRpdGxlS2V5cygpO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gcHVibGlzaCBldmVudCBvZiB0aGUgc2FtZSBuYW1lIHRoYXQgU2xpY2tncmlkLVVuaXZlcnNhbCB1c2VzIG9uIGEgbGFuZ3VhZ2UgY2hhbmdlIGV2ZW50XHJcbiAgICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25MYW5ndWFnZUNoYW5nZScpO1xyXG5cclxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUFsbEV4dGVuc2lvbnMoKTtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVDb2x1bW5IZWFkZXJUaXRsZUtleXMoKTtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVDb2x1bW5Hcm91cEtleXMoKTtcclxuICAgICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmNyZWF0ZVByZUhlYWRlclBhbmVsICYmICFncmlkT3B0aW9ucy5lbmFibGVEcmFnZ2FibGVHcm91cGluZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXBpbmdTZXJ2aWNlLnRyYW5zbGF0ZUdyb3VwaW5nQW5kQ29sU3BhbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiB1c2VyIHNldCBhbiBvbkluaXQgQmFja2VuZCwgd2UnbGwgcnVuIGl0IHJpZ2h0IGF3YXkgKGFuZCBpZiBzbywgd2UgYWxzbyBuZWVkIHRvIHJ1biBwcmVQcm9jZXNzLCBpbnRlcm5hbFBvc3RQcm9jZXNzICYgcG9zdFByb2Nlc3MpXHJcbiAgICBpZiAoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkpIHtcclxuICAgICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG5cclxuICAgICAgaWYgKGJhY2tlbmRBcGk/LnNlcnZpY2U/LmluaXQpIHtcclxuICAgICAgICBiYWNrZW5kQXBpLnNlcnZpY2UuaW5pdChiYWNrZW5kQXBpLm9wdGlvbnMsIGdyaWRPcHRpb25zLnBhZ2luYXRpb24sIHRoaXMuc2xpY2tHcmlkLCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFWaWV3ICYmIGdyaWQpIHtcclxuICAgICAgY29uc3Qgc2xpY2tncmlkRXZlbnRQcmVmaXggPSB0aGlzLmdyaWRPcHRpb25zPy5kZWZhdWx0U2xpY2tncmlkRXZlbnRQcmVmaXggPz8gJyc7XHJcblxyXG4gICAgICAvLyBleHBvc2UgYWxsIFNsaWNrIEdyaWQgRXZlbnRzIHRocm91Z2ggZGlzcGF0Y2hcclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGdyaWQpIHtcclxuICAgICAgICBpZiAoZ3JpZC5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwcm9wLnN0YXJ0c1dpdGgoJ29uJykpIHtcclxuICAgICAgICAgIGNvbnN0IGdyaWRFdmVudE5hbWUgPSB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZ2V0RXZlbnROYW1lQnlOYW1pbmdDb252ZW50aW9uKHByb3AsIHNsaWNrZ3JpZEV2ZW50UHJlZml4KTtcclxuICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoKGdyaWQgYXMgYW55KVtwcm9wXSwgKGV2ZW50LCBhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZGlzcGF0Y2hDdXN0b21FdmVudChncmlkRXZlbnROYW1lLCB7IGV2ZW50RGF0YTogZXZlbnQsIGFyZ3MgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGV4cG9zZSBhbGwgU2xpY2sgRGF0YVZpZXcgRXZlbnRzIHRocm91Z2ggZGlzcGF0Y2hcclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGRhdGFWaWV3KSB7XHJcbiAgICAgICAgaWYgKGRhdGFWaWV3Lmhhc093blByb3BlcnR5KHByb3ApICYmIHByb3Auc3RhcnRzV2l0aCgnb24nKSkge1xyXG4gICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnN1YnNjcmliZSgoZGF0YVZpZXcgYXMgYW55KVtwcm9wXSwgKGV2ZW50LCBhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3RXZlbnROYW1lID0gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmdldEV2ZW50TmFtZUJ5TmFtaW5nQ29udmVudGlvbihwcm9wLCBzbGlja2dyaWRFdmVudFByZWZpeCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZGlzcGF0Y2hDdXN0b21FdmVudChkYXRhVmlld0V2ZW50TmFtZSwgeyBldmVudERhdGE6IGV2ZW50LCBhcmdzIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBvbiBjZWxsIGNsaWNrLCBtYWlubHkgdXNlZCB3aXRoIHRoZSBjb2x1bW5EZWYuYWN0aW9uIGNhbGxiYWNrXHJcbiAgICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZS5iaW5kT25DZWxsQ2hhbmdlKGdyaWQpO1xyXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UuYmluZE9uQ2xpY2soZ3JpZCk7XHJcblxyXG4gICAgICBpZiAoZGF0YVZpZXcgJiYgZ3JpZCkge1xyXG4gICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgc29ydGluZyAoYmFja2VuZCkgd2hlbiBhdmFpbGFibGUgb3IgZGVmYXVsdCBvblNvcnQgKGRhdGFWaWV3KVxyXG4gICAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVTb3J0aW5nKSB7XHJcbiAgICAgICAgICAvLyBiaW5kIGV4dGVybmFsIHNvcnRpbmcgKGJhY2tlbmQpIHVubGVzcyBzcGVjaWZpZWQgdG8gdXNlIHRoZSBsb2NhbCBvbmVcclxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiAhZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkudXNlTG9jYWxTb3J0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc29ydFNlcnZpY2UuYmluZEJhY2tlbmRPblNvcnQoZ3JpZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmJpbmRMb2NhbE9uU29ydChncmlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgZmlsdGVyIChiYWNrZW5kKSB3aGVuIGF2YWlsYWJsZSBvciBkZWZhdWx0IG9uRmlsdGVyIChkYXRhVmlldylcclxuICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UuaW5pdChncmlkKTtcclxuXHJcbiAgICAgICAgICAvLyBiaW5kIGV4dGVybmFsIGZpbHRlciAoYmFja2VuZCkgdW5sZXNzIHNwZWNpZmllZCB0byB1c2UgdGhlIGxvY2FsIG9uZVxyXG4gICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICFncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaS51c2VMb2NhbEZpbHRlcmluZykge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UuYmluZEJhY2tlbmRPbkZpbHRlcihncmlkKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5iaW5kTG9jYWxPbkZpbHRlcihncmlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGxvYWQgYW55IHByZXNldHMgaWYgYW55IChhZnRlciBkYXRhc2V0IGlzIGluaXRpYWxpemVkKVxyXG4gICAgICAgIHRoaXMubG9hZENvbHVtblByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcclxuXHJcbiAgICAgICAgLy8gV2hlbiBkYXRhIGNoYW5nZXMgaW4gdGhlIERhdGFWaWV3LCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIG1ldHJpY3MgYW5kL29yIGRpc3BsYXkgYSB3YXJuaW5nIGlmIHRoZSBkYXRhc2V0IGlzIGVtcHR5XHJcbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnN1YnNjcmliZShkYXRhVmlldy5vblJvd0NvdW50Q2hhbmdlZCwgKCkgPT4ge1xyXG4gICAgICAgICAgZ3JpZC5pbnZhbGlkYXRlKCk7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZU9uSXRlbUNvdW50Q2hhbmdlZChkYXRhVmlldy5nZXRGaWx0ZXJlZEl0ZW1Db3VudCgpIHx8IDAsIGRhdGFWaWV3LmdldEl0ZW1Db3VudCgpIHx8IDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoZGF0YVZpZXcub25TZXRJdGVtc0NhbGxlZCwgKF9lLCBhcmdzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZU9uSXRlbUNvdW50Q2hhbmdlZChkYXRhVmlldy5nZXRGaWx0ZXJlZEl0ZW1Db3VudCgpIHx8IDAsIGFyZ3MuaXRlbUNvdW50KTtcclxuXHJcbiAgICAgICAgICAvLyB3aGVuIHVzZXIgaGFzIHJlc2l6ZSBieSBjb250ZW50IGVuYWJsZWQsIHdlJ2xsIGZvcmNlIGEgZnVsbCB3aWR0aCBjYWxjdWxhdGlvbiBzaW5jZSB3ZSBjaGFuZ2Ugb3VyIGVudGlyZSBkYXRhc2V0XHJcbiAgICAgICAgICBpZiAoYXJncy5pdGVtQ291bnQgPiAwICYmICh0aGlzLmdyaWRPcHRpb25zLmF1dG9zaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRPbkZpcnN0TG9hZCB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCghdGhpcy5ncmlkT3B0aW9ucz8ucmVzaXplQnlDb250ZW50T25seU9uRmlyc3RMb2FkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zPy5lbmFibGVGaWx0ZXJpbmcgJiYgIWdyaWRPcHRpb25zLmVuYWJsZVJvd0RldGFpbFZpZXcpIHtcclxuICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoZGF0YVZpZXcub25Sb3dzQ2hhbmdlZCwgKF9lLCBhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGZpbHRlcmluZyBkYXRhIHdpdGggbG9jYWwgZGF0YXNldCB3aWxsIG5vdCBhbHdheXMgc2hvdyBjb3JyZWN0bHkgdW5sZXNzIHdlIGNhbGwgdGhpcyB1cGRhdGVSb3cvcmVuZGVyXHJcbiAgICAgICAgICAgIC8vIGFsc28gZG9uJ3QgdXNlIFwiaW52YWxpZGF0ZVJvd3NcIiBzaW5jZSBpdCBkZXN0cm95cyB0aGUgZW50aXJlIHJvdyBhbmQgYXMgYmFkIHVzZXIgZXhwZXJpZW5jZSB3aGVuIHVwZGF0aW5nIGEgcm93XHJcbiAgICAgICAgICAgIC8vIHNlZSBjb21taXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9naGlzY29kaW5nL2F1cmVsaWEtc2xpY2tncmlkL2NvbW1pdC84YzUwM2E0ZDQ1ZmJhMTFjYmQ4ZDhjYzQ2N2ZhZThkMTc3Y2M0ZjYwXHJcbiAgICAgICAgICAgIGlmIChhcmdzPy5yb3dzICYmIEFycmF5LmlzQXJyYXkoYXJncy5yb3dzKSkge1xyXG4gICAgICAgICAgICAgIGFyZ3Mucm93cy5mb3JFYWNoKChyb3c6IG51bWJlcikgPT4gZ3JpZC51cGRhdGVSb3cocm93KSk7XHJcbiAgICAgICAgICAgICAgZ3JpZC5yZW5kZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGlkIHRoZSB1c2VyIGFkZCBhIGNvbHNwYW4gY2FsbGJhY2s/IElmIHNvLCBob29rIGl0IGludG8gdGhlIERhdGFWaWV3IGdldEl0ZW1NZXRhZGF0YVxyXG4gICAgaWYgKGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjayAmJiBkYXRhVmlldyAmJiBkYXRhVmlldy5nZXRJdGVtICYmIGRhdGFWaWV3LmdldEl0ZW1NZXRhZGF0YSkge1xyXG4gICAgICBkYXRhVmlldy5nZXRJdGVtTWV0YWRhdGEgPSAocm93TnVtYmVyOiBudW1iZXIpID0+IHtcclxuICAgICAgICBsZXQgY2FsbGJhY2tSZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIGlmIChncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2sgJiYgZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrKSB7XHJcbiAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjayhkYXRhVmlldy5nZXRJdGVtKHJvd051bWJlcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FsbGJhY2tSZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmRCYWNrZW5kQ2FsbGJhY2tGdW5jdGlvbnMoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pIHtcclxuICAgIGNvbnN0IGJhY2tlbmRBcGkgPSBncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaTtcclxuICAgIGNvbnN0IGJhY2tlbmRBcGlTZXJ2aWNlID0gYmFja2VuZEFwaSAmJiBiYWNrZW5kQXBpLnNlcnZpY2U7XHJcbiAgICBjb25zdCBzZXJ2aWNlT3B0aW9uczogQmFja2VuZFNlcnZpY2VPcHRpb24gPSBiYWNrZW5kQXBpU2VydmljZT8ub3B0aW9ucyA/PyB7fTtcclxuICAgIGNvbnN0IGlzRXhlY3V0ZUNvbW1hbmRPbkluaXQgPSAoIXNlcnZpY2VPcHRpb25zKSA/IGZhbHNlIDogKChzZXJ2aWNlT3B0aW9ucyAmJiBzZXJ2aWNlT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnZXhlY3V0ZVByb2Nlc3NDb21tYW5kT25Jbml0JykpID8gc2VydmljZU9wdGlvbnNbJ2V4ZWN1dGVQcm9jZXNzQ29tbWFuZE9uSW5pdCddIDogdHJ1ZSk7XHJcblxyXG4gICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlKSB7XHJcbiAgICAgIC8vIHVwZGF0ZSBiYWNrZW5kIGZpbHRlcnMgKGlmIG5lZWQgYmUpIEJFRk9SRSB0aGUgcXVlcnkgcnVucyAodmlhIHRoZSBvbkluaXQgY29tbWFuZCBhIGZldyBsaW5lcyBiZWxvdylcclxuICAgICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgYW55IFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIGdyaWRcclxuICAgICAgaWYgKGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLnByZXNldHMpIHtcclxuICAgICAgICAvLyBGaWx0ZXJzIFwicHJlc2V0c1wiXHJcbiAgICAgICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMgJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMpICYmIGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzKGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNvcnRlcnMgXCJwcmVzZXRzXCJcclxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlU29ydGVycyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycykgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIC8vIHdoZW4gdXNpbmcgbXVsdGktY29sdW1uIHNvcnQsIHdlIGNhbiBoYXZlIG11bHRpcGxlIGJ1dCBvbiBzaW5nbGUgc29ydCB0aGVuIG9ubHkgZ3JhYiB0aGUgZmlyc3Qgc29ydCBwcm92aWRlZFxyXG4gICAgICAgICAgY29uc3Qgc29ydENvbHVtbnMgPSB0aGlzLmdyaWRPcHRpb25zLm11bHRpQ29sdW1uU29ydCA/IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycyA6IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycy5zbGljZSgwLCAxKTtcclxuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVNvcnRlcnModW5kZWZpbmVkLCBzb3J0Q29sdW1ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFBhZ2luYXRpb24gXCJwcmVzZXRzXCJcclxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlUGFnaW5hdGlvbiAmJiBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfSA9IGdyaWRPcHRpb25zLnByZXNldHMucGFnaW5hdGlvbjtcclxuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb24ocGFnZU51bWJlciwgcGFnZVNpemUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjb2x1bW5GaWx0ZXJzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldENvbHVtbkZpbHRlcnMoKTtcclxuICAgICAgICBpZiAoY29sdW1uRmlsdGVycyAmJiBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzKSB7XHJcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzKGNvbHVtbkZpbHRlcnMsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGV4ZWN1dGUgb25Jbml0IGNvbW1hbmQgd2hlbiBuZWNlc3NhcnlcclxuICAgICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaVNlcnZpY2UgJiYgKGJhY2tlbmRBcGkub25Jbml0IHx8IGlzRXhlY3V0ZUNvbW1hbmRPbkluaXQpKSB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSAodHlwZW9mIGJhY2tlbmRBcGlTZXJ2aWNlLmJ1aWxkUXVlcnkgPT09ICdmdW5jdGlvbicpID8gYmFja2VuZEFwaVNlcnZpY2UuYnVpbGRRdWVyeSgpIDogJyc7XHJcbiAgICAgICAgY29uc3QgcHJvY2VzcyA9IChpc0V4ZWN1dGVDb21tYW5kT25Jbml0KSA/IChiYWNrZW5kQXBpLnByb2Nlc3MgJiYgYmFja2VuZEFwaS5wcm9jZXNzKHF1ZXJ5KSB8fCBudWxsKSA6IChiYWNrZW5kQXBpLm9uSW5pdCAmJiBiYWNrZW5kQXBpLm9uSW5pdChxdWVyeSkgfHwgbnVsbCk7XHJcblxyXG4gICAgICAgIC8vIHdyYXAgdGhpcyBpbnNpZGUgYSBzZXRUaW1lb3V0IHRvIGF2b2lkIHRpbWluZyBpc3N1ZSBzaW5jZSB0aGUgZ3JpZE9wdGlvbnMgbmVlZHMgdG8gYmUgcmVhZHkgYmVmb3JlIHJ1bm5pbmcgdGhpcyBvbkluaXRcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGJhY2tlbmRVdGlsaXR5U2VydmljZSA9IHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlIGFzIEJhY2tlbmRVdGlsaXR5U2VydmljZTtcclxuXHJcbiAgICAgICAgICAvLyBrZWVwIHN0YXJ0IHRpbWUgJiBlbmQgdGltZXN0YW1wcyAmIHJldHVybiBpdCBhZnRlciBwcm9jZXNzIGV4ZWN1dGlvblxyXG4gICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcclxuXHJcbiAgICAgICAgICAvLyBydW4gYW55IHByZS1wcm9jZXNzLCBpZiBkZWZpbmVkLCBmb3IgZXhhbXBsZSBhIHNwaW5uZXJcclxuICAgICAgICAgIGlmIChiYWNrZW5kQXBpLnByZVByb2Nlc3MpIHtcclxuICAgICAgICAgICAgYmFja2VuZEFwaS5wcmVQcm9jZXNzKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gdGhlIHByb2Nlc3NlcyBjYW4gYmUgYSBQcm9taXNlIChsaWtlIEh0dHApXHJcbiAgICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbj8udG90YWxJdGVtcyA/PyAwO1xyXG4gICAgICAgICAgaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIHByb2Nlc3NcclxuICAgICAgICAgICAgICAudGhlbigocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2UuZXhlY3V0ZUJhY2tlbmRQcm9jZXNzZXNDYWxsYmFjayhzdGFydFRpbWUsIHByb2Nlc3NSZXN1bHQsIGJhY2tlbmRBcGksIHRvdGFsSXRlbXMpKVxyXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5vbkJhY2tlbmRFcnJvcihlcnJvciwgYmFja2VuZEFwaSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzICYmIHRoaXMucnhqcz8uaXNPYnNlcnZhYmxlKHByb2Nlc3MpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICAgIChwcm9jZXNzIGFzIE9ic2VydmFibGU8YW55Pikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChwcm9jZXNzUmVzdWx0OiBhbnkpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5leGVjdXRlQmFja2VuZFByb2Nlc3Nlc0NhbGxiYWNrKHN0YXJ0VGltZSwgcHJvY2Vzc1Jlc3VsdCwgYmFja2VuZEFwaSwgdG90YWxJdGVtcyksXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5vbkJhY2tlbmRFcnJvcihlcnJvciwgYmFja2VuZEFwaSlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmRSZXNpemVIb29rKGdyaWQ6IFNsaWNrR3JpZCwgb3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgaWYgKChvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5hdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWQpIHx8IChvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucyAmJiBvcHRpb25zLmVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbQW5ndWxhci1TbGlja2dyaWRdIFlvdSBjYW5ub3QgZW5hYmxlIGJvdGggYXV0b3NpemUvZml0IHZpZXdwb3J0ICYgcmVzaXplIGJ5IGNvbnRlbnQsIHlvdSBtdXN0IGNob29zZSB3aGljaCByZXNpemUgdGVjaG5pcXVlIHRvIHVzZS4gWW91IGNhbiBlbmFibGUgdGhlc2UgMiBvcHRpb25zIChcImF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWRcIiBhbmQgXCJlbmFibGVBdXRvU2l6ZUNvbHVtbnNcIikgT1IgdGhlc2Ugb3RoZXIgMiBvcHRpb25zIChcImF1dG9zaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRPbkZpcnN0TG9hZFwiIGFuZCBcImVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudFwiKS5gKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBleHBhbmQvYXV0b2ZpdCBjb2x1bW5zIG9uIGZpcnN0IHBhZ2UgbG9hZFxyXG4gICAgaWYgKGdyaWQgJiYgb3B0aW9ucy5hdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkICYmIG9wdGlvbnMuZW5hYmxlQXV0b1NpemVDb2x1bW5zKSB7XHJcbiAgICAgIGdyaWQuYXV0b3NpemVDb2x1bW5zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXV0by1yZXNpemUgZ3JpZCBvbiBicm93c2VyIHJlc2l6ZVxyXG4gICAgaWYgKG9wdGlvbnMuZ3JpZEhlaWdodCB8fCBvcHRpb25zLmdyaWRXaWR0aCkge1xyXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUdyaWQoMCwgeyBoZWlnaHQ6IG9wdGlvbnMuZ3JpZEhlaWdodCwgd2lkdGg6IG9wdGlvbnMuZ3JpZFdpZHRoIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKCk7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5lbmFibGVBdXRvUmVzaXplKSB7XHJcbiAgICAgIGlmIChncmlkICYmIG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucykge1xyXG4gICAgICAgIGdyaWQuYXV0b3NpemVDb2x1bW5zKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhlY3V0ZUFmdGVyRGF0YXZpZXdDcmVhdGVkKF9ncmlkOiBTbGlja0dyaWQsIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKSB7XHJcbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBTb3J0IFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIERPTVxyXG4gICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgaWYgKGdyaWRPcHRpb25zLnByZXNldHMgJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMpKSB7XHJcbiAgICAgICAgLy8gd2hlbiB1c2luZyBtdWx0aS1jb2x1bW4gc29ydCwgd2UgY2FuIGhhdmUgbXVsdGlwbGUgYnV0IG9uIHNpbmdsZSBzb3J0IHRoZW4gb25seSBncmFiIHRoZSBmaXJzdCBzb3J0IHByb3ZpZGVkXHJcbiAgICAgICAgY29uc3Qgc29ydENvbHVtbnMgPSB0aGlzLmdyaWRPcHRpb25zLm11bHRpQ29sdW1uU29ydCA/IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycyA6IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycy5zbGljZSgwLCAxKTtcclxuICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmxvYWRHcmlkU29ydGVycyhzb3J0Q29sdW1ucyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBXaGVuIGRhdGEgY2hhbmdlcyBpbiB0aGUgRGF0YVZpZXcsIHdlJ2xsIHJlZnJlc2ggdGhlIG1ldHJpY3MgYW5kL29yIGRpc3BsYXkgYSB3YXJuaW5nIGlmIHRoZSBkYXRhc2V0IGlzIGVtcHR5ICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoY3VycmVudFBhZ2VSb3dJdGVtQ291bnQ6IG51bWJlciwgdG90YWxJdGVtQ291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGggPSB0b3RhbEl0ZW1Db3VudDtcclxuICAgIHRoaXMubWV0cmljcyA9IHtcclxuICAgICAgc3RhcnRUaW1lOiBuZXcgRGF0ZSgpLFxyXG4gICAgICBlbmRUaW1lOiBuZXcgRGF0ZSgpLFxyXG4gICAgICBpdGVtQ291bnQ6IGN1cnJlbnRQYWdlUm93SXRlbUNvdW50LFxyXG4gICAgICB0b3RhbEl0ZW1Db3VudFxyXG4gICAgfTtcclxuICAgIC8vIGlmIGN1c3RvbSBmb290ZXIgaXMgZW5hYmxlZCwgdGhlbiB3ZSdsbCB1cGRhdGUgaXRzIG1ldHJpY3NcclxuICAgIGlmICh0aGlzLnNsaWNrRm9vdGVyKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tGb290ZXIubWV0cmljcyA9IHRoaXMubWV0cmljcztcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuIHVzaW5nIGxvY2FsIChpbi1tZW1vcnkpIGRhdGFzZXQsIHdlJ2xsIGRpc3BsYXkgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBmaWx0ZXJlZCBkYXRhIGlzIGVtcHR5XHJcbiAgICBpZiAodGhpcy5faXNMb2NhbEdyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UpIHtcclxuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhjdXJyZW50UGFnZVJvd0l0ZW1Db3VudCA9PT0gMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVQYWdpbmF0aW9uU2VydmljZShwYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbikge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uRGF0YSA9IHtcclxuICAgICAgICBncmlkT3B0aW9uczogdGhpcy5ncmlkT3B0aW9ucyxcclxuICAgICAgICBwYWdpbmF0aW9uU2VydmljZTogdGhpcy5wYWdpbmF0aW9uU2VydmljZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS50b3RhbEl0ZW1zID0gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmluaXQodGhpcy5zbGlja0dyaWQsIHBhZ2luYXRpb25PcHRpb25zLCB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKTtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnN1YnNjcmliZSgnb25QYWdpbmF0aW9uQ2hhbmdlZCcsIChwYWdpbmF0aW9uQ2hhbmdlczogU2VydmljZVBhZ2luYXRpb24pID0+IHtcclxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZWQocGFnaW5hdGlvbkNoYW5nZXMpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5zdWJzY3JpYmUoJ29uUGFnaW5hdGlvblZpc2liaWxpdHlDaGFuZ2VkJywgKHZpc2liaWxpdHk6IHsgdmlzaWJsZTogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gdmlzaWJpbGl0eT8udmlzaWJsZSA/PyBmYWxzZTtcclxuICAgICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZT8ucmVmcmVzaEJhY2tlbmREYXRhc2V0KHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKHRoaXMuc2hvd1BhZ2luYXRpb24pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIGFsc28gaW5pdGlhbGl6ZSAocmVuZGVyKSB0aGUgcGFnaW5hdGlvbiBjb21wb25lbnRcclxuICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XHJcbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIExvYWQgdGhlIEVkaXRvciBDb2xsZWN0aW9uIGFzeW5jaHJvbm91c2x5IGFuZCByZXBsYWNlIHRoZSBcImNvbGxlY3Rpb25cIiBwcm9wZXJ0eSB3aGVuIE9ic2VydmFibGUgcmVzb2x2ZXMgKi9cclxuICBwcml2YXRlIGxvYWRFZGl0b3JDb2xsZWN0aW9uQXN5bmMoY29sdW1uOiBDb2x1bW4pIHtcclxuICAgIGNvbnN0IGNvbGxlY3Rpb25Bc3luYyA9IGNvbHVtbiAmJiBjb2x1bW4uZWRpdG9yICYmIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuY29sbGVjdGlvbkFzeW5jO1xyXG4gICAgaWYgKGNvbGxlY3Rpb25Bc3luYyBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgY29sbGVjdGlvbkFzeW5jLnN1YnNjcmliZSgocmVzb2x2ZWRDb2xsZWN0aW9uKSA9PiB0aGlzLnVwZGF0ZUVkaXRvckNvbGxlY3Rpb24oY29sdW1uLCByZXNvbHZlZENvbGxlY3Rpb24pKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uQXN5bmMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgIC8vIHdhaXQgZm9yIHRoZSBcImNvbGxlY3Rpb25Bc3luY1wiLCBvbmNlIHJlc29sdmVkIHdlIHdpbGwgc2F2ZSBpdCBpbnRvIHRoZSBcImNvbGxlY3Rpb25cIlxyXG4gICAgICAvLyB0aGUgY29sbGVjdGlvbkFzeW5jIGNhbiBiZSBvZiAzIHR5cGVzIEh0dHBDbGllbnQsIEh0dHBGZXRjaCBvciBhIFByb21pc2VcclxuICAgICAgY29sbGVjdGlvbkFzeW5jLnRoZW4oKHJlc3BvbnNlOiBhbnkgfCBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVFZGl0b3JDb2xsZWN0aW9uKGNvbHVtbiwgcmVzcG9uc2UpOyAvLyBmcm9tIFByb21pc2VcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIExvYWQgYW55IHBvc3NpYmxlIENvbHVtbnMgR3JpZCBQcmVzZXRzICovXHJcbiAgcHJpdmF0ZSBsb2FkQ29sdW1uUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKSB7XHJcbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBDb2x1bW5zIFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIGdyaWRcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuY29sdW1ucykgJiYgdGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBncmlkQ29sdW1uczogQ29sdW1uW10gPSB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UuZ2V0QXNzb2NpYXRlZEdyaWRDb2x1bW5zKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuY29sdW1ucyk7XHJcbiAgICAgIGlmIChncmlkQ29sdW1ucyAmJiBBcnJheS5pc0FycmF5KGdyaWRDb2x1bW5zKSAmJiBncmlkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGNoZWNrYm94IHNlbGVjdG9yIGlzIGFsc28gdmlzaWJsZSBpZiBpdCBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xyXG4gICAgICAgICAgY29uc3QgY2hlY2tib3hDb2x1bW4gPSAoQXJyYXkuaXNBcnJheSh0aGlzLl9jb2x1bW5EZWZpbml0aW9ucykgJiYgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMubGVuZ3RoID4gMCkgPyB0aGlzLl9jb2x1bW5EZWZpbml0aW9uc1swXSA6IG51bGw7XHJcbiAgICAgICAgICBpZiAoY2hlY2tib3hDb2x1bW4gJiYgY2hlY2tib3hDb2x1bW4uaWQgPT09ICdfY2hlY2tib3hfc2VsZWN0b3InICYmIGdyaWRDb2x1bW5zWzBdLmlkICE9PSAnX2NoZWNrYm94X3NlbGVjdG9yJykge1xyXG4gICAgICAgICAgICBncmlkQ29sdW1ucy51bnNoaWZ0KGNoZWNrYm94Q29sdW1uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGtlZXAgY29weSB0aGUgb3JpZ2luYWwgb3B0aW9uYWwgYHdpZHRoYCBwcm9wZXJ0aWVzIG9wdGlvbmFsbHkgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXHJcbiAgICAgICAgLy8gV2Ugd2lsbCB1c2UgdGhpcyB3aGVuIGRvaW5nIGEgcmVzaXplIGJ5IGNlbGwgY29udGVudCwgaWYgdXNlciBwcm92aWRlZCBhIGB3aWR0aGAgaXQgd29uJ3Qgb3ZlcnJpZGUgaXQuXHJcbiAgICAgICAgZ3JpZENvbHVtbnMuZm9yRWFjaChjb2wgPT4gY29sLm9yaWdpbmFsV2lkdGggPSBjb2wud2lkdGgpO1xyXG5cclxuICAgICAgICAvLyBmaW5hbGx5IHNldCB0aGUgbmV3IHByZXNldHMgY29sdW1ucyAoaW5jbHVkaW5nIGNoZWNrYm94IHNlbGVjdG9yIGlmIG5lZWQgYmUpXHJcbiAgICAgICAgdGhpcy5zbGlja0dyaWQuc2V0Q29sdW1ucyhncmlkQ29sdW1ucyk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gZ3JpZENvbHVtbnM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMb2FkIGFueSBwb3NzaWJsZSBGaWx0ZXJzIEdyaWQgUHJlc2V0cyAqL1xyXG4gIHByaXZhdGUgbG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgRmlsdGVyIFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIERPTVxyXG4gICAgICAvLyBhbHNvIG5vdGUgdGhhdCBhIHByZXNldHMgb2YgVHJlZSBEYXRhIFRvZ2dsaW5nIHdpbGwgYWxzbyBjYWxsIHRoaXMgbWV0aG9kIGJlY2F1c2UgVHJlZSBEYXRhIHRvZ2dsaW5nIGRvZXMgd29yayB3aXRoIGRhdGEgZmlsdGVyaW5nXHJcbiAgICAgIC8vIChjb2xsYXBzaW5nIGEgcGFyZW50IHdpbGwgYmFzaWNhbGx5IHVzZSBGaWx0ZXIgZm9yIGhpZGRpbmcgKGFrYSBjb2xsYXBzaW5nKSBhd2F5IHRoZSBjaGlsZCB1bmRlcm5lYXQgaXQpXHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMgJiYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMpIHx8IEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy50cmVlRGF0YT8udG9nZ2xlZEl0ZW1zKSkpIHtcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucG9wdWxhdGVDb2x1bW5GaWx0ZXJTZWFyY2hUZXJtUHJlc2V0cyh0aGlzLmdyaWRPcHRpb25zLnByZXNldHM/LmZpbHRlcnMgfHwgW10pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBsb2NhbCBncmlkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgdGhlIFBhZ2luYXRpb25cclxuICAgKiBpZiBzbyB0aGVuIGFsc28gY2hlY2sgaWYgdGhlcmUncyBhbnkgcHJlc2V0cyBhbmQgZmluYWxseSBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uU2VydmljZVxyXG4gICAqIGEgbG9jYWwgZ3JpZCB3aXRoIFBhZ2luYXRpb24gcHJlc2V0cyB3aWxsIHBvdGVudGlhbGx5IGhhdmUgYSBkaWZmZXJlbnQgdG90YWwgb2YgaXRlbXMsIHdlJ2xsIG5lZWQgdG8gZ2V0IGl0IGZyb20gdGhlIERhdGFWaWV3IGFuZCB1cGRhdGUgb3VyIHRvdGFsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkTG9jYWxHcmlkUGFnaW5hdGlvbihkYXRhc2V0PzogYW55W10pIHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKSB7XHJcbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IEFycmF5LmlzQXJyYXkoZGF0YXNldCkgPyBkYXRhc2V0Lmxlbmd0aCA6IDA7XHJcbiAgICAgIGlmICh0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLmRhdGFWaWV3Py5nZXRQYWdpbmdJbmZvKSB7XHJcbiAgICAgICAgY29uc3Qgc2xpY2tQYWdpbmdJbmZvID0gdGhpcy5kYXRhVmlldy5nZXRQYWdpbmdJbmZvKCk7XHJcbiAgICAgICAgaWYgKHNsaWNrUGFnaW5nSW5mbz8uaGFzT3duUHJvcGVydHkoJ3RvdGFsUm93cycpICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zLnRvdGFsSXRlbXMgIT09IHNsaWNrUGFnaW5nSW5mby50b3RhbFJvd3MpIHtcclxuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHNsaWNrUGFnaW5nSW5mby50b3RhbFJvd3MgfHwgMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMudG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcztcclxuICAgICAgY29uc3QgcGFnaW5hdGlvbk9wdGlvbnMgPSB0aGlzLnNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQodGhpcy5ncmlkT3B0aW9ucywgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMpO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVQYWdpbmF0aW9uU2VydmljZShwYWdpbmF0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTG9hZCBhbnkgUm93IFNlbGVjdGlvbnMgaW50byB0aGUgRGF0YVZpZXcgdGhhdCB3ZXJlIHByZXNldHMgYnkgdGhlIHVzZXIgKi9cclxuICBwcml2YXRlIGxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCkge1xyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgUm93IFNlbGVjdGlvbnMgXCJwcmVzZXRzXCJcclxuICAgIGNvbnN0IHByZXNldHMgPSB0aGlzLmdyaWRPcHRpb25zPy5wcmVzZXRzO1xyXG4gICAgY29uc3QgZW5hYmxlUm93U2VsZWN0aW9uID0gdGhpcy5ncmlkT3B0aW9ucyAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKTtcclxuICAgIGlmIChlbmFibGVSb3dTZWxlY3Rpb24gJiYgdGhpcy5zbGlja0dyaWQ/LmdldFNlbGVjdGlvbk1vZGVsKCkgJiYgcHJlc2V0cz8ucm93U2VsZWN0aW9uICYmIChBcnJheS5pc0FycmF5KHByZXNldHMucm93U2VsZWN0aW9uLmdyaWRSb3dJbmRleGVzKSB8fCBBcnJheS5pc0FycmF5KHByZXNldHMucm93U2VsZWN0aW9uLmRhdGFDb250ZXh0SWRzKSkpIHtcclxuICAgICAgbGV0IGRhdGFDb250ZXh0SWRzID0gcHJlc2V0cy5yb3dTZWxlY3Rpb24uZGF0YUNvbnRleHRJZHM7XHJcbiAgICAgIGxldCBncmlkUm93SW5kZXhlcyA9IHByZXNldHMucm93U2VsZWN0aW9uLmdyaWRSb3dJbmRleGVzO1xyXG5cclxuICAgICAgLy8gbWFwcyB0aGUgSURzIHRvIHRoZSBHcmlkIFJvd3MgYW5kIHZpY2UgdmVyc2EsIHRoZSBcImRhdGFDb250ZXh0SWRzXCIgaGFzIHByZWNlZGVuY2Ugb3ZlciB0aGUgb3RoZXJcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUNvbnRleHRJZHMpICYmIGRhdGFDb250ZXh0SWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBncmlkUm93SW5kZXhlcyA9IHRoaXMuZGF0YVZpZXcubWFwSWRzVG9Sb3dzKGRhdGFDb250ZXh0SWRzKSB8fCBbXTtcclxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGdyaWRSb3dJbmRleGVzKSAmJiBncmlkUm93SW5kZXhlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZGF0YUNvbnRleHRJZHMgPSB0aGlzLmRhdGFWaWV3Lm1hcFJvd3NUb0lkcyhncmlkUm93SW5kZXhlcykgfHwgW107XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLnNlbGVjdGVkUm93RGF0YUNvbnRleHRJZHMgPSBkYXRhQ29udGV4dElkcztcclxuXHJcbiAgICAgIC8vIGNoYW5nZSB0aGUgc2VsZWN0ZWQgcm93cyBleGNlcHQgVU5MRVNTIGl0J3MgYSBMb2NhbCBHcmlkIHdpdGggUGFnaW5hdGlvblxyXG4gICAgICAvLyBsb2NhbCBQYWdpbmF0aW9uIHVzZXMgdGhlIERhdGFWaWV3IGFuZCB0aGF0IGFsc28gdHJpZ2dlciBhIGNoYW5nZS9yZWZyZXNoXHJcbiAgICAgIC8vIGFuZCB3ZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgMiBHcmlkIFN0YXRlIGNoYW5nZXMganVzdCAxXHJcbiAgICAgIGlmICgodGhpcy5faXNMb2NhbEdyaWQgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbikgfHwgIXRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgQXJyYXkuaXNBcnJheShncmlkUm93SW5kZXhlcykpIHtcclxuICAgICAgICAgICAgdGhpcy5zbGlja0dyaWQuc2V0U2VsZWN0ZWRSb3dzKGdyaWRSb3dJbmRleGVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZUdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKTogR3JpZE9wdGlvbiB7XHJcbiAgICBncmlkT3B0aW9ucy5ncmlkSWQgPSB0aGlzLmdyaWRJZDtcclxuICAgIGdyaWRPcHRpb25zLmdyaWRDb250YWluZXJJZCA9IGBzbGlja0dyaWRDb250YWluZXItJHt0aGlzLmdyaWRJZH1gO1xyXG5cclxuICAgIC8vIGlmIHdlIGhhdmUgYSBiYWNrZW5kU2VydmljZUFwaSBhbmQgdGhlIGVuYWJsZVBhZ2luYXRpb24gaXMgdW5kZWZpbmVkLCB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBkbyB3YW50IHRvIHNlZSBpdCwgZWxzZSBnZXQgdGhhdCBkZWZpbmVkIHZhbHVlXHJcbiAgICBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uID0gKChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uID09PSB1bmRlZmluZWQpID8gdHJ1ZSA6IGdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24pIHx8IGZhbHNlO1xyXG5cclxuICAgIC8vIHVzZSBqcXVlcnkgZXh0ZW5kIHRvIGRlZXAgbWVyZ2UgJiBjb3B5IHRvIGF2b2lkIGltbXV0YWJsZSBwcm9wZXJ0aWVzIGJlaW5nIGNoYW5nZWQgaW4gR2xvYmFsR3JpZE9wdGlvbnMgYWZ0ZXIgYSByb3V0ZSBjaGFuZ2VcclxuICAgIGNvbnN0IG9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgR2xvYmFsR3JpZE9wdGlvbnMsIHRoaXMuZm9yUm9vdENvbmZpZywgZ3JpZE9wdGlvbnMpIGFzIEdyaWRPcHRpb247XHJcblxyXG4gICAgLy8gdXNpbmcgalF1ZXJ5IGV4dGVuZCB0byBkbyBhIGRlZXAgY2xvbmUgaGFzIGFuIHVud2FudGVkIHNpZGUgb24gb2JqZWN0cyBhbmQgcGFnZVNpemVzIGJ1dCBFUzYgc3ByZWFkIGhhcyBvdGhlciB3b3JzdCBzaWRlIGVmZmVjdHNcclxuICAgIC8vIHNvIHdlIHdpbGwganVzdCBvdmVyd3JpdGUgdGhlIHBhZ2VTaXplcyB3aGVuIG5lZWRlZCwgdGhpcyBpcyB0aGUgb25seSBvbmUgY2F1c2luZyBpc3N1ZXMgc28gZmFyLlxyXG4gICAgLy8galF1ZXJ5IHdyb3RlIHRoaXMgb24gdGhlaXIgZG9jczo6IE9uIGEgZGVlcCBleHRlbmQsIE9iamVjdCBhbmQgQXJyYXkgYXJlIGV4dGVuZGVkLCBidXQgb2JqZWN0IHdyYXBwZXJzIG9uIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIFN0cmluZywgQm9vbGVhbiwgYW5kIE51bWJlciBhcmUgbm90LlxyXG4gICAgaWYgKG9wdGlvbnM/LnBhZ2luYXRpb24gJiYgKGdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gfHwgZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkpICYmICh0aGlzLmZvclJvb3RDb25maWcucGFnaW5hdGlvbiB8fCBncmlkT3B0aW9ucy5wYWdpbmF0aW9uKSkge1xyXG4gICAgICBvcHRpb25zLnBhZ2luYXRpb24ucGFnZVNpemUgPSBncmlkT3B0aW9ucy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSA/PyB0aGlzLmZvclJvb3RDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemUgPz8gR2xvYmFsR3JpZE9wdGlvbnMucGFnaW5hdGlvbiEucGFnZVNpemU7XHJcbiAgICAgIG9wdGlvbnMucGFnaW5hdGlvbi5wYWdlU2l6ZXMgPSBncmlkT3B0aW9ucy5wYWdpbmF0aW9uPy5wYWdlU2l6ZXMgPz8gdGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplcyA/PyBHbG9iYWxHcmlkT3B0aW9ucy5wYWdpbmF0aW9uIS5wYWdlU2l6ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWxzbyBtYWtlIHN1cmUgdG8gc2hvdyB0aGUgaGVhZGVyIHJvdyBpZiB1c2VyIGhhdmUgZW5hYmxlZCBmaWx0ZXJpbmdcclxuICAgIHRoaXMuX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gKG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9PT0gZmFsc2UpO1xyXG4gICAgaWYgKG9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nICYmICFvcHRpb25zLnNob3dIZWFkZXJSb3cpIHtcclxuICAgICAgb3B0aW9ucy5zaG93SGVhZGVyUm93ID0gb3B0aW9ucy5lbmFibGVGaWx0ZXJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB3ZSB1c2UgUGFnaW5hdGlvbiBvbiBMb2NhbCBHcmlkLCBpdCBkb2Vzbid0IHNlZW0gdG8gd29yayB3aXRob3V0IGVuYWJsZUZpbHRlcmluZ1xyXG4gICAgLy8gc28gd2UnbGwgZW5hYmxlIHRoZSBmaWx0ZXJpbmcgYnV0IHdlJ2xsIGtlZXAgdGhlIGhlYWRlciByb3cgaGlkZGVuXHJcbiAgICBpZiAob3B0aW9ucyAmJiAhb3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcgJiYgb3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgIG9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nID0gdHJ1ZTtcclxuICAgICAgb3B0aW9ucy5zaG93SGVhZGVyUm93ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3B0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKiBQcmUtUmVnaXN0ZXIgYW55IFJlc291cmNlIHRoYXQgZG9uJ3QgcmVxdWlyZSBTbGlja0dyaWQgdG8gYmUgaW5zdGFudGlhdGVkIChmb3IgZXhhbXBsZSBSeEpTIFJlc291cmNlICYgUm93RGV0YWlsKSAqL1xyXG4gIHByaXZhdGUgcHJlUmVnaXN0ZXJSZXNvdXJjZXMoKSB7XHJcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzID0gdGhpcy5ncmlkT3B0aW9ucy5yZWdpc3RlckV4dGVybmFsUmVzb3VyY2VzIHx8IFtdO1xyXG5cclxuICAgIC8vIEFuZ3VsYXItU2xpY2tncmlkIHJlcXVpcmVzIFJ4SlMsIHNvIHdlJ2xsIHJlZ2lzdGVyIGl0IGFzIHRoZSBmaXJzdCByZXNvdXJjZVxyXG4gICAgdGhpcy5yZWdpc3RlclJ4SnNSZXNvdXJjZShuZXcgUnhKc1Jlc291cmNlKCkgYXMgUnhKc0ZhY2FkZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93RGV0YWlsVmlldykge1xyXG4gICAgICB0aGlzLnNsaWNrUm93RGV0YWlsVmlldyA9IG5ldyBTbGlja1Jvd0RldGFpbFZpZXcodGhpcy5hbmd1bGFyVXRpbFNlcnZpY2UsIHRoaXMuYXBwUmVmLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQsIHRoaXMucnhqcyk7XHJcbiAgICAgIHRoaXMuc2xpY2tSb3dEZXRhaWxWaWV3LmNyZWF0ZSh0aGlzLmNvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMuc2xpY2tSb3dEZXRhaWxWaWV3KTtcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmFkZEV4dGVuc2lvblRvTGlzdChFeHRlbnNpb25OYW1lLnJvd0RldGFpbFZpZXcsIHsgbmFtZTogRXh0ZW5zaW9uTmFtZS5yb3dEZXRhaWxWaWV3LCBpbnN0YW5jZTogdGhpcy5zbGlja1Jvd0RldGFpbFZpZXcgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZ2lzdGVyUmVzb3VyY2VzKCkge1xyXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgd2UgY29uc2lkZXIgYWxsIHRoZSByZWdpc3RlcmVkIHNlcnZpY2VzIGFzIGV4dGVybmFsIHNlcnZpY2VzLCBhbnl0aGluZyBlbHNlIHJlZ2lzdGVyZWQgYWZ0ZXJ3YXJkIGFyZW4ndCBleHRlcm5hbFxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcclxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmV4dGVybmFsUmVnaXN0ZXJlZFJlc291cmNlcyA9IHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVzaCBhbGwgb3RoZXIgU2VydmljZXMgdGhhdCB3ZSB3YW50IHRvIGJlIHJlZ2lzdGVyZWRcclxuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLmdyaWRTZXJ2aWNlLCB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UpO1xyXG5cclxuICAgIC8vIHdoZW4gdXNpbmcgR3JvdXBpbmcvRHJhZ2dhYmxlR3JvdXBpbmcvQ29sc3BhbiByZWdpc3RlciBpdHMgU2VydmljZVxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuY3JlYXRlUHJlSGVhZGVyUGFuZWwgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlRHJhZ2dhYmxlR3JvdXBpbmcpIHtcclxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMuZ3JvdXBpbmdTZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuIHVzaW5nIFRyZWUgRGF0YSBWaWV3LCByZWdpc3RlciBpdHMgU2VydmljZVxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlVHJlZURhdGEpIHtcclxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuIHVzZXIgZW5hYmxlcyB0cmFuc2xhdGlvbiwgd2UgbmVlZCB0byB0cmFuc2xhdGUgSGVhZGVycyBvbiBmaXJzdCBwYXNzICYgc3Vic2VxdWVudGx5IGluIHRoZSBiaW5kRGlmZmVyZW50SG9va3NcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudHJhbnNsYXRlQ29sdW1uSGVhZGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsc28gaW5pdGlhbGl6ZSAocmVuZGVyKSB0aGUgZW1wdHkgd2FybmluZyBjb21wb25lbnRcclxuICAgIHRoaXMuc2xpY2tFbXB0eVdhcm5pbmcgPSBuZXcgU2xpY2tFbXB0eVdhcm5pbmdDb21wb25lbnQoKTtcclxuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnNsaWNrRW1wdHlXYXJuaW5nKTtcclxuXHJcbiAgICAvLyBiaW5kICYgaW5pdGlhbGl6ZSBhbGwgQ29tcG9uZW50cy9TZXJ2aWNlcyB0aGF0IHdlcmUgdGFnZ2VkIGFzIGVuYWJsZWRcclxuICAgIC8vIHJlZ2lzdGVyIGFsbCBzZXJ2aWNlcyBieSBleGVjdXRpbmcgdGhlaXIgaW5pdCBtZXRob2QgYW5kIHByb3ZpZGluZyB0aGVtIHdpdGggdGhlIEdyaWQgb2JqZWN0XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpIHtcclxuICAgICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgdHlwZW9mIHJlc291cmNlLmluaXQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIHJlc291cmNlLmluaXQodGhpcy5zbGlja0dyaWQsIHRoaXMuY29udGFpbmVyU2VydmljZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUmVnaXN0ZXIgdGhlIFJ4SlMgUmVzb3VyY2UgaW4gYWxsIG5lY2Vzc2FyeSBzZXJ2aWNlcyB3aGljaCB1c2VzICovXHJcbiAgcHJpdmF0ZSByZWdpc3RlclJ4SnNSZXNvdXJjZShyZXNvdXJjZTogUnhKc0ZhY2FkZSkge1xyXG4gICAgdGhpcy5yeGpzID0gcmVzb3VyY2U7XHJcbiAgICB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcclxuICAgIHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcclxuICAgIHRoaXMuZmlsdGVyU2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcclxuICAgIHRoaXMuc29ydFNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1J4SnNSZXNvdXJjZScsIHRoaXMucnhqcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW5kZXIgKG9yIGRpc3Bvc2UpIHRoZSBQYWdpbmF0aW9uIENvbXBvbmVudCwgdXNlciBjYW4gb3B0aW9uYWxseSBwcm92aWRlIEZhbHNlICh0byBub3Qgc2hvdyBpdCkgd2hpY2ggd2lsbCBpbiB0ZXJtIGRpc3Bvc2Ugb2YgdGhlIFBhZ2luYXRpb24sXHJcbiAgICogYWxzbyB3aGlsZSBkaXNwb3Npbmcgd2UgY2FuIGNob29zZSB0byBvbWl0IHRoZSBkaXNwb3NhYmxlIG9mIHRoZSBQYWdpbmF0aW9uIFNlcnZpY2UgKGlmIHdlIGFyZSBzaW1wbHkgdG9nZ2xpbmcgdGhlIFBhZ2luYXRpb24sIHdlIHdhbnQgdG8ga2VlcCB0aGUgU2VydmljZSBhbGl2ZSlcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3dQYWdpbmF0aW9uIC0gc2hvdyAobmV3IHJlbmRlcikgb3Igbm90IChkaXNwb3NlKSB0aGUgUGFnaW5hdGlvblxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hvdWxkRGlzcG9zZVBhZ2luYXRpb25TZXJ2aWNlIC0gd2hlbiBkaXNwb3NpbmcgdGhlIFBhZ2luYXRpb24sIGRvIHdlIGFsc28gd2FudCB0byBkaXNwb3NlIG9mIHRoZSBQYWdpbmF0aW9uIFNlcnZpY2U/IChkZWZhdWx0cyB0byBUcnVlKVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVuZGVyUGFnaW5hdGlvbihzaG93UGFnaW5hdGlvbiA9IHRydWUpIHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVQYWdpbmF0aW9uICYmICF0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCAmJiBzaG93UGFnaW5hdGlvbikge1xyXG4gICAgICB0aGlzLnNsaWNrUGFnaW5hdGlvbiA9IG5ldyBTbGlja1BhZ2luYXRpb25Db21wb25lbnQodGhpcy5wYWdpbmF0aW9uU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgICB0aGlzLnNsaWNrUGFnaW5hdGlvbi5yZW5kZXJQYWdpbmF0aW9uKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgICB0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKCFzaG93UGFnaW5hdGlvbikge1xyXG4gICAgICBpZiAodGhpcy5zbGlja1BhZ2luYXRpb24pIHtcclxuICAgICAgICB0aGlzLnNsaWNrUGFnaW5hdGlvbi5kaXNwb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRha2VzIGEgZmxhdCBkYXRhc2V0IHdpdGggcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcCwgc29ydCBpdCAodmlhIGl0cyB0cmVlIHN0cnVjdHVyZSkgYW5kIHJldHVybiB0aGUgc29ydGVkIGZsYXQgYXJyYXlcclxuICAgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGZsYXREYXRhc2V0SW5wdXQgLSBmbGF0IGRhdGFzZXQgaW5wdXRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZvcmNlR3JpZFJlZnJlc2ggLSBvcHRpb25hbGx5IGZvcmNlIGEgZnVsbCBncmlkIHJlZnJlc2hcclxuICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gc29ydCBmbGF0IHBhcmVudC9jaGlsZCBkYXRhc2V0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzb3J0VHJlZURhdGFzZXQ8VD4oZmxhdERhdGFzZXRJbnB1dDogVFtdLCBmb3JjZUdyaWRSZWZyZXNoID0gZmFsc2UpOiBUW10ge1xyXG4gICAgY29uc3QgcHJldkRhdGFzZXRMbiA9IHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoO1xyXG4gICAgbGV0IHNvcnRlZERhdGFzZXRSZXN1bHQ7XHJcbiAgICBsZXQgZmxhdERhdGFzZXRPdXRwdXQ6IGFueVtdID0gW107XHJcblxyXG4gICAgLy8gaWYgdGhlIGhpZXJhcmNoaWNhbCBkYXRhc2V0IHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIHRoZW4gbm8gbmVlZCB0byByZS1jb252ZXJ0IGl0LCB3ZSBjYW4gdXNlIGl0IGRpcmVjdGx5IGZyb20gdGhlIHNoYXJlZCBzZXJ2aWNlIHJlZlxyXG4gICAgaWYgKHRoaXMuX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkICYmIHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCkge1xyXG4gICAgICBzb3J0ZWREYXRhc2V0UmVzdWx0ID0gdGhpcy50cmVlRGF0YVNlcnZpY2Uuc29ydEhpZXJhcmNoaWNhbERhdGFzZXQodGhpcy5kYXRhc2V0SGllcmFyY2hpY2FsKTtcclxuICAgICAgZmxhdERhdGFzZXRPdXRwdXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmZsYXQ7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmxhdERhdGFzZXRJbnB1dCkgJiYgZmxhdERhdGFzZXRJbnB1dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy50cmVlRGF0YU9wdGlvbnM/LmluaXRpYWxTb3J0KSB7XHJcbiAgICAgICAgLy8gZWxzZSB3ZSBuZWVkIHRvIGZpcnN0IGNvbnZlcnQgdGhlIGZsYXQgZGF0YXNldCB0byBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0IGFuZCB0aGVuIHNvcnRcclxuICAgICAgICBzb3J0ZWREYXRhc2V0UmVzdWx0ID0gdGhpcy50cmVlRGF0YVNlcnZpY2UuY29udmVydEZsYXRQYXJlbnRDaGlsZFRvVHJlZURhdGFzZXRBbmRTb3J0KGZsYXREYXRhc2V0SW5wdXQsIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IHNvcnRlZERhdGFzZXRSZXN1bHQuaGllcmFyY2hpY2FsO1xyXG4gICAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5mbGF0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGVsc2Ugd2UgYXNzdW1lIHRoYXQgdGhlIHVzZXIgcHJvdmlkZWQgYW4gYXJyYXkgdGhhdCBpcyBhbHJlYWR5IHNvcnRlZCAodXNlcidzIHJlc3BvbnNhYmlsaXR5KVxyXG4gICAgICAgIC8vIGFuZCBzbyB3ZSBjYW4gc2ltcGx5IGNvbnZlcnQgdGhlIGFycmF5IHRvIGEgdHJlZSBzdHJ1Y3R1cmUgYW5kIHdlJ3JlIGRvbmUsIG5vIG5lZWQgdG8gc29ydFxyXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0ID0gdGhpcy50cmVlRGF0YVNlcnZpY2UuY29udmVydEZsYXRQYXJlbnRDaGlsZFRvVHJlZURhdGFzZXQoZmxhdERhdGFzZXRJbnB1dCwgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICAgICAgZmxhdERhdGFzZXRPdXRwdXQgPSBmbGF0RGF0YXNldElucHV0IHx8IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgd2UgYWRkL3JlbW92ZSBpdGVtKHMpIGZyb20gdGhlIGRhdGFzZXQsIHdlIG5lZWQgdG8gYWxzbyByZWZyZXNoIG91ciB0cmVlIGRhdGEgZmlsdGVyc1xyXG4gICAgaWYgKGZsYXREYXRhc2V0SW5wdXQubGVuZ3RoID4gMCAmJiAoZm9yY2VHcmlkUmVmcmVzaCB8fCBmbGF0RGF0YXNldElucHV0Lmxlbmd0aCAhPT0gcHJldkRhdGFzZXRMbikpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZnJlc2hUcmVlRGF0YUZpbHRlcnMoZmxhdERhdGFzZXRPdXRwdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmbGF0RGF0YXNldE91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciBjb252ZW5pZW5jZSB0byB0aGUgdXNlciwgd2UgcHJvdmlkZSB0aGUgcHJvcGVydHkgXCJlZGl0b3JcIiBhcyBhbiBBbmd1bGFyLVNsaWNrZ3JpZCBlZGl0b3IgY29tcGxleCBvYmplY3RcclxuICAgKiBob3dldmVyIFwiZWRpdG9yXCIgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IFNsaWNrR3JpZCBmb3IgaXQncyBvd24gRWRpdG9yIEZhY3RvcnlcclxuICAgKiBzbyBpbiBvdXIgbGliIHdlIHdpbGwgc3dhcCBcImVkaXRvclwiIGFuZCBjb3B5IGl0IGludG8gYSBuZXcgcHJvcGVydHkgY2FsbGVkIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIlxyXG4gICAqIHRoZW4gdGFrZSBiYWNrIFwiZWRpdG9yLm1vZGVsXCIgYW5kIG1ha2UgaXQgdGhlIG5ldyBcImVkaXRvclwiIHNvIHRoYXQgU2xpY2tHcmlkIEVkaXRvciBGYWN0b3J5IHN0aWxsIHdvcmtzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IoY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XHJcbiAgICBpZiAoY29sdW1uRGVmaW5pdGlvbnMuc29tZShjb2wgPT4gYCR7Y29sLmlkfWAuaW5jbHVkZXMoJy4nKSkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW0FuZ3VsYXItU2xpY2tncmlkXSBNYWtlIHN1cmUgdGhhdCBub25lIG9mIHlvdXIgQ29sdW1uIERlZmluaXRpb24gXCJpZFwiIHByb3BlcnR5IGluY2x1ZGVzIGEgZG90IGluIGl0cyBuYW1lIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgRWRpdG9ycy4gRm9yIGV4YW1wbGUgaWYgeW91ciBjb2x1bW4gZGVmaW5pdGlvbiBcImZpZWxkXCIgcHJvcGVydHkgaXMgXCJ1c2VyLmZpcnN0TmFtZVwiIHRoZW4gdXNlIFwiZmlyc3ROYW1lXCIgYXMgdGhlIGNvbHVtbiBcImlkXCIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbkRlZmluaXRpb25zLm1hcCgoY29sdW1uOiBDb2x1bW4gfCBhbnkpID0+IHtcclxuICAgICAgLy8gb24gZXZlcnkgRWRpdG9yIHRoYXQgaGF2ZSBhIFwiY29sbGVjdGlvbkFzeW5jXCIsIHJlc29sdmUgdGhlIGRhdGEgYW5kIGFzc2lnbiBpdCB0byB0aGUgXCJjb2xsZWN0aW9uXCIgcHJvcGVydHlcclxuICAgICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0b3IuY29sbGVjdGlvbkFzeW5jKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkRWRpdG9yQ29sbGVjdGlvbkFzeW5jKGNvbHVtbik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHsgLi4uY29sdW1uLCBlZGl0b3I6IGNvbHVtbi5lZGl0b3IgJiYgY29sdW1uLmVkaXRvci5tb2RlbCwgaW50ZXJuYWxDb2x1bW5FZGl0b3I6IHsgLi4uY29sdW1uLmVkaXRvciB9IH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCkge1xyXG4gICAgLy8gdHJhbnNsYXRlIGFsbCBjb2x1bW5zIChpbmNsdWRpbmcgaGlkZGVuIGNvbHVtbnMpXHJcbiAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHkudHJhbnNsYXRlSXRlbXModGhpcy5zaGFyZWRTZXJ2aWNlLmFsbENvbHVtbnMsICduYW1lS2V5JywgJ25hbWUnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCkge1xyXG4gICAgLy8gdHJhbnNsYXRlIGFsbCBjb2x1bW4gZ3JvdXBzIChpbmNsdWRpbmcgaGlkZGVuIGNvbHVtbnMpXHJcbiAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHkudHJhbnNsYXRlSXRlbXModGhpcy5zaGFyZWRTZXJ2aWNlLmFsbENvbHVtbnMsICdjb2x1bW5Hcm91cEtleScsICdjb2x1bW5Hcm91cCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBcImludGVybmFsQ29sdW1uRWRpdG9yLmNvbGxlY3Rpb25cIiBwcm9wZXJ0eS5cclxuICAgKiBTaW5jZSB0aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgYXN5bmMgY2FsbCByZXNvbHZlcywgdGhlIHBvaW50ZXIgd2lsbCBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIFwiY29sdW1uXCIgYXJndW1lbnQgcGFzc2VkLlxyXG4gICAqIE9uY2Ugd2UgZm91bmQgdGhlIG5ldyBwb2ludGVyLCB3ZSB3aWxsIHJlYXNzaWduIHRoZSBcImVkaXRvclwiIGFuZCBcImNvbGxlY3Rpb25cIiB0byB0aGUgXCJpbnRlcm5hbENvbHVtbkVkaXRvclwiIHNvIGl0IGhhcyBuZXdlc3QgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlRWRpdG9yQ29sbGVjdGlvbjxUID0gYW55Pihjb2x1bW46IENvbHVtbjxUPiwgbmV3Q29sbGVjdGlvbjogVFtdKSB7XHJcbiAgICAoY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3IpLmNvbGxlY3Rpb24gPSBuZXdDb2xsZWN0aW9uO1xyXG4gICAgKGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yKS5kaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGZpbmQgdGhlIG5ldyBjb2x1bW4gcmVmZXJlbmNlIHBvaW50ZXIgJiByZS1hc3NpZ24gdGhlIG5ldyBlZGl0b3IgdG8gdGhlIGludGVybmFsQ29sdW1uRWRpdG9yXHJcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5zbGlja0dyaWQuZ2V0Q29sdW1ucygpO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1ucykpIHtcclxuICAgICAgY29uc3QgY29sdW1uUmVmID0gY29sdW1ucy5maW5kKChjb2w6IENvbHVtbikgPT4gY29sLmlkID09PSBjb2x1bW4uaWQpO1xyXG4gICAgICBpZiAoY29sdW1uUmVmKSB7XHJcbiAgICAgICAgY29sdW1uUmVmLmludGVybmFsQ29sdW1uRWRpdG9yID0gY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgY3VycmVudCBFZGl0b3IsIHJlbW92ZSBpdCBmcm9tIHRoZSBET00gdGhlbiByZS1lbmFibGUgaXQgYW5kIHJlLXJlbmRlciBpdCB3aXRoIHRoZSBuZXcgY29sbGVjdGlvbi5cclxuICAgIGNvbnN0IGN1cnJlbnRFZGl0b3IgPSB0aGlzLnNsaWNrR3JpZC5nZXRDZWxsRWRpdG9yKCkgYXMgQXV0b0NvbXBsZXRlRWRpdG9yIHwgU2VsZWN0RWRpdG9yO1xyXG4gICAgaWYgKGN1cnJlbnRFZGl0b3I/LmRpc2FibGUgJiYgY3VycmVudEVkaXRvcj8ucmVuZGVyRG9tRWxlbWVudCkge1xyXG4gICAgICBjdXJyZW50RWRpdG9yLmRlc3Ryb3koKTtcclxuICAgICAgY3VycmVudEVkaXRvci5kaXNhYmxlKGZhbHNlKTtcclxuICAgICAgY3VycmVudEVkaXRvci5yZW5kZXJEb21FbGVtZW50KG5ld0NvbGxlY3Rpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwic2xpY2tHcmlkQ29udGFpbmVyLXt7Z3JpZElkfX1cIiBjbGFzcz1cImdyaWRQYW5lXCI+XHJcbiAgPGRpdiBhdHRyLmlkPSd7e2dyaWRJZH19JyBjbGFzcz1cInNsaWNrZ3JpZC1jb250YWluZXJcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
1169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLGlHQUFpRztBQUNqRyxPQUFPLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTywrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8saUNBQWlDLENBQUM7QUFDekMsT0FBTyxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sMEJBQTBCLENBQUM7QUFFbEMsNkJBQTZCO0FBQzdCLE9BQU8sRUFBaUIsY0FBYyxFQUFxQixTQUFTLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBYSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFFN0ksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEVBU0wsYUFBYTtBQVliLFdBQVc7QUFDWCxxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixjQUFjLEVBRWQsYUFBYSxFQUNiLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIsV0FBVyxFQUNYLGVBQWU7QUFFZixZQUFZO0FBQ1os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QUFHLE1BQU0sQ0FBQyxNQUFzQixDQUFDO2FBQ2hFO1NBQ0Y7UUFFRCx5R0FBeUc7UUFDekcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQXVDLENBQUM7UUFDMUYsSUFBSSxhQUFhLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRTtZQUM3RCxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixhQUFhLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDL0M7SUFDSCxDQUFDOzt1SEFqeENVLHlCQUF5Qiw4UUFrTDFCLFFBQVEsYUFDUixpQkFBaUI7MkdBbkxoQix5QkFBeUIsd1JBUHpCO1FBQ1QsNENBQTRDO1FBQzVDLGtCQUFrQjtRQUNsQixjQUFjO1FBQ2QsaUJBQWlCO0tBQ2xCLDBCQzVGSCx5S0FHTTs0RkQyRk8seUJBQXlCO2tCQVZyQyxTQUFTOytCQUNFLG1CQUFtQixhQUVsQjt3QkFDVCw0Q0FBNEM7d0JBQzVDLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxpQkFBaUI7cUJBQ2xCOzswQkFrTEUsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLGlCQUFpQjs0Q0E1SGxCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWVGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFlRixPQUFPO3NCQURWLEtBQUs7Z0JBMEJGLG1CQUFtQjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCAzcmQgcGFydHkgdmVuZG9yIGxpYnNcclxuLy8gb25seSBpbXBvcnQgdGhlIG5lY2Vzc2FyeSBjb3JlIGxpYiwgZWFjaCB3aWxsIGJlIGltcG9ydGVkIG9uIGRlbWFuZCB3aGVuIGVuYWJsZWQgKHZpYSByZXF1aXJlKVxyXG5pbXBvcnQgJ2pxdWVyeS11aS91aS93aWRnZXRzL2RyYWdnYWJsZSc7XHJcbmltcG9ydCAnanF1ZXJ5LXVpL3VpL3dpZGdldHMvZHJvcHBhYmxlJztcclxuaW1wb3J0ICdqcXVlcnktdWkvdWkvd2lkZ2V0cy9zb3J0YWJsZSc7XHJcbmltcG9ydCAnc2xpY2tncmlkL2xpYi9qcXVlcnkuZXZlbnQuZHJhZy0yLjMuMCc7XHJcbmltcG9ydCAnc2xpY2tncmlkL2xpYi9qcXVlcnkubW91c2V3aGVlbCc7XHJcbmltcG9ydCAnc2xpY2tncmlkL3NsaWNrLmNvcmUnO1xyXG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5ncmlkJztcclxuaW1wb3J0ICdzbGlja2dyaWQvc2xpY2suZGF0YXZpZXcnO1xyXG5cclxuLy8gLi4udGhlbiBldmVyeXRoaW5nIGVsc2UuLi5cclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQXBwbGljYXRpb25SZWYsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3B0aW9uYWwsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAvLyBpbnRlcmZhY2VzL3R5cGVzXHJcbiAgQXV0b0NvbXBsZXRlRWRpdG9yLFxyXG4gIEJhY2tlbmRTZXJ2aWNlQXBpLFxyXG4gIEJhY2tlbmRTZXJ2aWNlT3B0aW9uLFxyXG4gIENvbHVtbixcclxuICBDb2x1bW5FZGl0b3IsXHJcbiAgRGF0YVZpZXdPcHRpb24sXHJcbiAgRXZlbnRTdWJzY3JpcHRpb24sXHJcbiAgRXh0ZW5zaW9uTmFtZSxcclxuICBFeHRlcm5hbFJlc291cmNlLFxyXG4gIExvY2FsZSxcclxuICBNZXRyaWNzLFxyXG4gIFBhZ2luYXRpb24sXHJcbiAgU2VsZWN0RWRpdG9yLFxyXG4gIFNlcnZpY2VQYWdpbmF0aW9uLFxyXG4gIFNsaWNrRGF0YVZpZXcsXHJcbiAgU2xpY2tFdmVudEhhbmRsZXIsXHJcbiAgU2xpY2tHcmlkLFxyXG4gIFNsaWNrTmFtZXNwYWNlLFxyXG5cclxuICAvLyBzZXJ2aWNlc1xyXG4gIEJhY2tlbmRVdGlsaXR5U2VydmljZSxcclxuICBDb2xsZWN0aW9uU2VydmljZSxcclxuICBFdmVudE5hbWluZ1N0eWxlLFxyXG4gIEV4dGVuc2lvblNlcnZpY2UsXHJcbiAgRXh0ZW5zaW9uVXRpbGl0eSxcclxuICBGaWx0ZXJGYWN0b3J5LFxyXG4gIEZpbHRlclNlcnZpY2UsXHJcbiAgR3JpZEV2ZW50U2VydmljZSxcclxuICBHcmlkU2VydmljZSxcclxuICBHcmlkU3RhdGVTZXJ2aWNlLFxyXG4gIEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UsXHJcbiAgUGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgUmVzaXplclNlcnZpY2UsXHJcbiAgUnhKc0ZhY2FkZSxcclxuICBTaGFyZWRTZXJ2aWNlLFxyXG4gIFNsaWNrZ3JpZENvbmZpZyxcclxuICBTbGlja0dyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIsXHJcbiAgU29ydFNlcnZpY2UsXHJcbiAgVHJlZURhdGFTZXJ2aWNlLFxyXG5cclxuICAvLyB1dGlsaXRpZXNcclxuICBhdXRvQWRkRWRpdG9yRm9ybWF0dGVyVG9Db2x1bW5zV2l0aEVkaXRvcixcclxuICBlbXB0eUVsZW1lbnQsXHJcbiAgR3JpZFN0YXRlVHlwZSxcclxuICB1bnN1YnNjcmliZUFsbCxcclxufSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9jb21tb24nO1xyXG5pbXBvcnQgeyBFdmVudFB1YlN1YlNlcnZpY2UgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9ldmVudC1wdWItc3ViJztcclxuaW1wb3J0IHsgU2xpY2tFbXB0eVdhcm5pbmdDb21wb25lbnQgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9lbXB0eS13YXJuaW5nLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNsaWNrRm9vdGVyQ29tcG9uZW50IH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvY3VzdG9tLWZvb3Rlci1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTbGlja1BhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9wYWdpbmF0aW9uLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJ4SnNSZXNvdXJjZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3J4anMtb2JzZXJ2YWJsZSc7XHJcbmltcG9ydCB7IGRlcXVhbCB9IGZyb20gJ2RlcXVhbC9saXRlJztcclxuXHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IEFuZ3VsYXJHcmlkSW5zdGFuY2UsIEV4dGVybmFsVGVzdGluZ0RlcGVuZGVuY2llcywgR3JpZE9wdGlvbiwgfSBmcm9tICcuLy4uL21vZGVscy9pbmRleCc7XHJcbmltcG9ydCB7IEdsb2JhbEdyaWRPcHRpb25zIH0gZnJvbSAnLi8uLi9nbG9iYWwtZ3JpZC1vcHRpb25zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90cmFuc2xhdGVyLnNlcnZpY2UnO1xyXG5cclxuLy8gU2VydmljZXNcclxuaW1wb3J0IHsgQW5ndWxhclV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYW5ndWxhclV0aWwuc2VydmljZSc7XHJcbmltcG9ydCB7IFNsaWNrUm93RGV0YWlsVmlldyB9IGZyb20gJy4uL2V4dGVuc2lvbnMvc2xpY2tSb3dEZXRhaWxWaWV3JztcclxuaW1wb3J0IHsgQ29udGFpbmVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnRhaW5lci5zZXJ2aWNlJztcclxuXHJcbi8vIHVzaW5nIGV4dGVybmFsIG5vbi10eXBlZCBqcyBsaWJyYXJpZXNcclxuZGVjbGFyZSBjb25zdCBTbGljazogU2xpY2tOYW1lc3BhY2U7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FuZ3VsYXItc2xpY2tncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgLy8gbWFrZSBldmVyeXRoaW5nIHRyYW5zaWVudCAobm9uLXNpbmdsZXRvbilcclxuICAgIEFuZ3VsYXJVdGlsU2VydmljZSxcclxuICAgIEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgVHJhbnNsYXRlclNlcnZpY2UsXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclNsaWNrZ3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBfZGF0YXNldD86IGFueVtdIHwgbnVsbDtcclxuICBwcml2YXRlIF9jb2x1bW5EZWZpbml0aW9ucyE6IENvbHVtbltdO1xyXG4gIHByaXZhdGUgX2N1cnJlbnREYXRhc2V0TGVuZ3RoID0gMDtcclxuICBwcml2YXRlIF9ldmVudEhhbmRsZXI6IFNsaWNrRXZlbnRIYW5kbGVyID0gbmV3IFNsaWNrLkV2ZW50SGFuZGxlcigpO1xyXG4gIHByaXZhdGUgX2V2ZW50UHViU3ViU2VydmljZSE6IEV2ZW50UHViU3ViU2VydmljZTtcclxuICBwcml2YXRlIF9hbmd1bGFyR3JpZEluc3RhbmNlczogQW5ndWxhckdyaWRJbnN0YW5jZSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzR3JpZEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNMb2NhbEdyaWQgPSB0cnVlO1xyXG4gIHByaXZhdGUgX3BhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3JlZ2lzdGVyZWRSZXNvdXJjZXM6IEV4dGVybmFsUmVzb3VyY2VbXSA9IFtdO1xyXG4gIGRhdGFWaWV3ITogU2xpY2tEYXRhVmlldztcclxuICBzbGlja0dyaWQhOiBTbGlja0dyaWQ7XHJcbiAgZ3JvdXBpbmdEZWZpbml0aW9uOiBhbnkgPSB7fTtcclxuICBncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyPzogU2xpY2tHcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyO1xyXG4gIGJhY2tlbmRTZXJ2aWNlQXBpPzogQmFja2VuZFNlcnZpY2VBcGk7XHJcbiAgbG9jYWxlcyE6IExvY2FsZTtcclxuICBtZXRyaWNzPzogTWV0cmljcztcclxuICBzaG93UGFnaW5hdGlvbiA9IGZhbHNlO1xyXG4gIHNlcnZpY2VMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHRvdGFsSXRlbXMgPSAwO1xyXG4gIHBhZ2luYXRpb25EYXRhPzoge1xyXG4gICAgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb247XHJcbiAgICBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2U7XHJcbiAgfTtcclxuICBzdWJzY3JpcHRpb25zOiBFdmVudFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIC8vIGNvbXBvbmVudHMgLyBwbHVnaW5zXHJcbiAgc2xpY2tFbXB0eVdhcm5pbmc/OiBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudDtcclxuICBzbGlja0Zvb3Rlcj86IFNsaWNrRm9vdGVyQ29tcG9uZW50O1xyXG4gIHNsaWNrUGFnaW5hdGlvbj86IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudDtcclxuICBzbGlja1Jvd0RldGFpbFZpZXc/OiBTbGlja1Jvd0RldGFpbFZpZXc7XHJcblxyXG4gIC8vIHNlcnZpY2VzXHJcbiAgYmFja2VuZFV0aWxpdHlTZXJ2aWNlITogQmFja2VuZFV0aWxpdHlTZXJ2aWNlO1xyXG4gIGNvbGxlY3Rpb25TZXJ2aWNlOiBDb2xsZWN0aW9uU2VydmljZTtcclxuICBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlO1xyXG4gIGV4dGVuc2lvblV0aWxpdHk6IEV4dGVuc2lvblV0aWxpdHk7XHJcbiAgZmlsdGVyRmFjdG9yeSE6IEZpbHRlckZhY3Rvcnk7XHJcbiAgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZTtcclxuICBncmlkRXZlbnRTZXJ2aWNlOiBHcmlkRXZlbnRTZXJ2aWNlO1xyXG4gIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZTtcclxuICBncmlkU3RhdGVTZXJ2aWNlOiBHcmlkU3RhdGVTZXJ2aWNlO1xyXG4gIGdyb3VwaW5nU2VydmljZTogR3JvdXBpbmdBbmRDb2xzcGFuU2VydmljZTtcclxuICBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2U7XHJcbiAgcmVzaXplclNlcnZpY2UhOiBSZXNpemVyU2VydmljZTtcclxuICByeGpzPzogUnhKc0ZhY2FkZTtcclxuICBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlO1xyXG4gIHNvcnRTZXJ2aWNlOiBTb3J0U2VydmljZTtcclxuICB0cmVlRGF0YVNlcnZpY2U6IFRyZWVEYXRhU2VydmljZTtcclxuXHJcbiAgQElucHV0KCkgY3VzdG9tRGF0YVZpZXc6IGFueTtcclxuICBASW5wdXQoKSBncmlkSWQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGdyaWRPcHRpb25zITogR3JpZE9wdGlvbjtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgcGFnaW5hdGlvbk9wdGlvbnMoKTogUGFnaW5hdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnM7XHJcbiAgfVxyXG4gIHNldCBwYWdpbmF0aW9uT3B0aW9ucyhuZXdQYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbiB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKG5ld1BhZ2luYXRpb25PcHRpb25zICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKSB7XHJcbiAgICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID0geyAuLi50aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb24sIC4uLnRoaXMuX3BhZ2luYXRpb25PcHRpb25zLCAuLi5uZXdQYWdpbmF0aW9uT3B0aW9ucyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgPSBuZXdQYWdpbmF0aW9uT3B0aW9ucztcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbiA9IHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID8/IHRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbjtcclxuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlVG90YWxJdGVtcyh0aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb24/LnRvdGFsSXRlbXMgPz8gMCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb2x1bW5EZWZpbml0aW9ucyhjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgICBpZiAodGhpcy5faXNHcmlkSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVDb2x1bW5EZWZpbml0aW9uc0xpc3QoY29sdW1uRGVmaW5pdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbHVtbkRlZmluaXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5jb3B5Q29sdW1uV2lkdGhzUmVmZXJlbmNlKGNvbHVtbkRlZmluaXRpb25zKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IENvbHVtbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGRhdGFzZXQoKTogYW55W10ge1xyXG4gICAgcmV0dXJuICh0aGlzLmN1c3RvbURhdGFWaWV3ID8gdGhpcy5zbGlja0dyaWQ/LmdldERhdGE/LigpIDogdGhpcy5kYXRhVmlldz8uZ2V0SXRlbXM/LigpKSB8fCBbXTtcclxuICB9XHJcbiAgc2V0IGRhdGFzZXQobmV3RGF0YXNldDogYW55W10pIHtcclxuICAgIGNvbnN0IHByZXZEYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcclxuICAgIGNvbnN0IGlzRGF0YXNldEVxdWFsID0gZGVxdWFsKG5ld0RhdGFzZXQsIHRoaXMuX2RhdGFzZXQgfHwgW10pO1xyXG4gICAgbGV0IGRhdGEgPSBuZXdEYXRhc2V0O1xyXG5cclxuICAgIC8vIHdoZW4gVHJlZSBEYXRhIGlzIGVuYWJsZWQgYW5kIHdlIGRvbid0IHlldCBoYXZlIHRoZSBoaWVyYXJjaGljYWwgZGF0YXNldCBmaWxsZWQsIHdlIGNhbiBmb3JjZSBhIGNvbnZlcnQrc29ydCBvZiB0aGUgYXJyYXlcclxuICAgIGlmICh0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVUcmVlRGF0YSAmJiBBcnJheS5pc0FycmF5KG5ld0RhdGFzZXQpICYmIChuZXdEYXRhc2V0Lmxlbmd0aCA+IDAgfHwgbmV3RGF0YXNldC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4gfHwgIWlzRGF0YXNldEVxdWFsKSkge1xyXG4gICAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICBkYXRhID0gdGhpcy5zb3J0VHJlZURhdGFzZXQobmV3RGF0YXNldCwgIWlzRGF0YXNldEVxdWFsKTsgLy8gaWYgZGF0YXNldCBjaGFuZ2VkLCB0aGVuIGZvcmNlIGEgcmVmcmVzaCBhbnl3YXlcclxuICAgIH1cclxuICAgIHRoaXMuX2RhdGFzZXQgPSBkYXRhO1xyXG4gICAgdGhpcy5yZWZyZXNoR3JpZERhdGEoZGF0YSB8fCBbXSk7XHJcbiAgICB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aCA9IChuZXdEYXRhc2V0IHx8IFtdKS5sZW5ndGg7XHJcblxyXG4gICAgLy8gZXhwYW5kL2F1dG9maXQgY29sdW1ucyBvbiBmaXJzdCBwYWdlIGxvYWRcclxuICAgIC8vIHdlIGNhbiBhc3N1bWUgdGhhdCBpZiB0aGUgcHJldkRhdGFzZXQgd2FzIGVtcHR5IHRoZW4gd2UgYXJlIG9uIGZpcnN0IGxvYWRcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5hdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkICYmIHByZXZEYXRhc2V0TG4gPT09IDApIHtcclxuICAgICAgdGhpcy5zbGlja0dyaWQuYXV0b3NpemVDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBkYXRhc2V0SGllcmFyY2hpY2FsKCk6IGFueVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldDtcclxuICB9XHJcbiAgc2V0IGRhdGFzZXRIaWVyYXJjaGljYWwobmV3SGllcmFyY2hpY2FsRGF0YXNldDogYW55W10gfCB1bmRlZmluZWQpIHtcclxuICAgIGNvbnN0IGlzRGF0YXNldEVxdWFsID0gZGVxdWFsKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQsIHRoaXMuc2hhcmVkU2VydmljZT8uaGllcmFyY2hpY2FsRGF0YXNldCA/PyBbXSk7XHJcbiAgICBjb25zdCBwcmV2RmxhdERhdGFzZXRMbiA9IHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQgPSBuZXdIaWVyYXJjaGljYWxEYXRhc2V0O1xyXG5cclxuICAgIGlmIChuZXdIaWVyYXJjaGljYWxEYXRhc2V0ICYmIHRoaXMuY29sdW1uRGVmaW5pdGlvbnMgJiYgdGhpcy5maWx0ZXJTZXJ2aWNlPy5jbGVhckZpbHRlcnMpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmNsZWFyRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gYSBoaWVyYXJjaGljYWwgZGF0YXNldCBpcyBzZXQgYWZ0ZXJ3YXJkLCB3ZSBjYW4gcmVzZXQgdGhlIGZsYXQgZGF0YXNldCBhbmQgY2FsbCBhIHRyZWUgZGF0YSBzb3J0IHRoYXQgd2lsbCBvdmVyd3JpdGUgdGhlIGZsYXQgZGF0YXNldFxyXG4gICAgaWYgKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQgJiYgdGhpcy5zbGlja0dyaWQgJiYgdGhpcy5zb3J0U2VydmljZT8ucHJvY2Vzc1RyZWVEYXRhSW5pdGlhbFNvcnQpIHtcclxuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhbXSwgdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUgPz8gJ2lkJyk7XHJcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UucHJvY2Vzc1RyZWVEYXRhSW5pdGlhbFNvcnQoKTtcclxuXHJcbiAgICAgIC8vIHdlIGFsc28gbmVlZCB0byByZXNldC9yZWZyZXNoIHRoZSBUcmVlIERhdGEgZmlsdGVycyBiZWNhdXNlIGlmIHdlIGluc2VydGVkIG5ldyBpdGVtKHMpIHRoZW4gaXQgbWlnaHQgbm90IHNob3cgdXAgd2l0aG91dCBkb2luZyB0aGlzIHJlZnJlc2hcclxuICAgICAgLy8gaG93ZXZlciB3ZSBuZWVkIDEgY3B1IGN5Y2xlIGJlZm9yZSBoYXZpbmcgdGhlIERhdGFWaWV3IHJlZnJlc2hlZCwgc28gd2UgbmVlZCB0byB3cmFwIHRoaXMgY2hlY2sgaW4gYSBzZXRUaW1lb3V0XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZsYXREYXRhc2V0TG4gPSB0aGlzLmRhdGFWaWV3LmdldEl0ZW1Db3VudCgpO1xyXG4gICAgICAgIGlmIChmbGF0RGF0YXNldExuID4gMCAmJiAoZmxhdERhdGFzZXRMbiAhPT0gcHJldkZsYXREYXRhc2V0TG4gfHwgIWlzRGF0YXNldEVxdWFsKSkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZnJlc2hUcmVlRGF0YUZpbHRlcnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHtcclxuICAgIHJldHVybiB0aGlzLmVsbTtcclxuICB9XHJcblxyXG4gIGdldCBldmVudEhhbmRsZXIoKTogU2xpY2tFdmVudEhhbmRsZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50SGFuZGxlcjtcclxuICB9XHJcblxyXG4gIGdldCBncmlkQ29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZENvbnRhaW5lcklkIHx8ICcnfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdFVFRFUiB0byBrbm93IGlmIGRhdGFzZXQgd2FzIGluaXRpYWxpemVkIG9yIG5vdCAqL1xyXG4gIGdldCBpc0RhdGFzZXRJbml0aWFsaXplZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZDtcclxuICB9XHJcbiAgLyoqIFNFVFRFUiB0byBjaGFuZ2UgaWYgZGF0YXNldCB3YXMgaW5pdGlhbGl6ZWQgb3Igbm90IChzdHJpbmdseSB1c2VkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpICovXHJcbiAgc2V0IGlzRGF0YXNldEluaXRpYWxpemVkKGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkID0gaXNJbml0aWFsaXplZDtcclxuICB9XHJcbiAgc2V0IGlzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkKGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkID0gaXNJbml0aWFsaXplZDtcclxuICB9XHJcblxyXG4gIGdldCByZWdpc3RlcmVkUmVzb3VyY2VzKCk6IEV4dGVybmFsUmVzb3VyY2VbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbmd1bGFyVXRpbFNlcnZpY2U6IEFuZ3VsYXJVdGlsU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJTZXJ2aWNlOiBDb250YWluZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbG06IEVsZW1lbnRSZWYsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlclNlcnZpY2U6IFRyYW5zbGF0ZXJTZXJ2aWNlLFxyXG4gICAgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBmb3JSb290Q29uZmlnOiBHcmlkT3B0aW9uLFxyXG4gICAgQEluamVjdCgnZXh0ZXJuYWxTZXJ2aWNlJykgZXh0ZXJuYWxTZXJ2aWNlczogRXh0ZXJuYWxUZXN0aW5nRGVwZW5kZW5jaWVzXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzbGlja2dyaWRDb25maWcgPSBuZXcgU2xpY2tncmlkQ29uZmlnKCk7XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZSBhbmQgYXNzaWduIGFsbCBTZXJ2aWNlIERlcGVuZGVuY2llc1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXZlbnRQdWJTdWJTZXJ2aWNlID8/IG5ldyBFdmVudFB1YlN1YlNlcnZpY2UodGhpcy5lbG0ubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZXZlbnROYW1pbmdTdHlsZSA9IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xyXG5cclxuICAgIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uYmFja2VuZFV0aWxpdHlTZXJ2aWNlID8/IG5ldyBCYWNrZW5kVXRpbGl0eVNlcnZpY2UoKTtcclxuICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRFdmVudFNlcnZpY2UgPz8gbmV3IEdyaWRFdmVudFNlcnZpY2UoKTtcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnNoYXJlZFNlcnZpY2UgPz8gbmV3IFNoYXJlZFNlcnZpY2UoKTtcclxuICAgIHRoaXMuY29sbGVjdGlvblNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5jb2xsZWN0aW9uU2VydmljZSA/PyBuZXcgQ29sbGVjdGlvblNlcnZpY2UodGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHkgPSBleHRlcm5hbFNlcnZpY2VzPy5leHRlbnNpb25VdGlsaXR5ID8/IG5ldyBFeHRlbnNpb25VdGlsaXR5KHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gbmV3IEZpbHRlckZhY3Rvcnkoc2xpY2tncmlkQ29uZmlnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlLCB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuZmlsdGVyU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmZpbHRlclNlcnZpY2UgPz8gbmV3IEZpbHRlclNlcnZpY2UodGhpcy5maWx0ZXJGYWN0b3J5IGFzIGFueSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcclxuICAgIHRoaXMucmVzaXplclNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5yZXNpemVyU2VydmljZSA/PyBuZXcgUmVzaXplclNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuICAgIHRoaXMuc29ydFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5zb3J0U2VydmljZSA/PyBuZXcgU29ydFNlcnZpY2UodGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcclxuICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8udHJlZURhdGFTZXJ2aWNlID8/IG5ldyBUcmVlRGF0YVNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnBhZ2luYXRpb25TZXJ2aWNlID8/IG5ldyBQYWdpbmF0aW9uU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmV4dGVuc2lvblNlcnZpY2UgPz8gbmV3IEV4dGVuc2lvblNlcnZpY2UoXHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSxcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLFxyXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsXHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZSxcclxuICAgICAgdGhpcy5zb3J0U2VydmljZSxcclxuICAgICAgdGhpcy50cmVlRGF0YVNlcnZpY2UsXHJcbiAgICAgIHRoaXMudHJhbnNsYXRlclNlcnZpY2UsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRTdGF0ZVNlcnZpY2UgPz8gbmV3IEdyaWRTdGF0ZVNlcnZpY2UodGhpcy5leHRlbnNpb25TZXJ2aWNlLCB0aGlzLmZpbHRlclNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZ3JpZFNlcnZpY2UgPz8gbmV3IEdyaWRTZXJ2aWNlKHRoaXMuZ3JpZFN0YXRlU2VydmljZSwgdGhpcy5maWx0ZXJTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMucGFnaW5hdGlvblNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5zb3J0U2VydmljZSwgdGhpcy50cmVlRGF0YVNlcnZpY2UpO1xyXG4gICAgdGhpcy5ncm91cGluZ1NlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlID8/IG5ldyBHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlKHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuXHJcbiAgICB0aGlzLnNlcnZpY2VMaXN0ID0gW1xyXG4gICAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSxcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLFxyXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZSxcclxuICAgICAgdGhpcy5ncm91cGluZ1NlcnZpY2UsXHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UsXHJcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UsXHJcbiAgICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlLFxyXG4gICAgXTtcclxuXHJcbiAgICAvLyByZWdpc3RlciBhbGwgU2VydmljZSBpbnN0YW5jZXMgaW4gdGhlIGNvbnRhaW5lclxyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0V4dGVuc2lvblV0aWxpdHknLCB0aGlzLmV4dGVuc2lvblV0aWxpdHkpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0ZpbHRlclNlcnZpY2UnLCB0aGlzLmZpbHRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0NvbGxlY3Rpb25TZXJ2aWNlJywgdGhpcy5jb2xsZWN0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXh0ZW5zaW9uU2VydmljZScsIHRoaXMuZXh0ZW5zaW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZEV2ZW50U2VydmljZScsIHRoaXMuZ3JpZEV2ZW50U2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZFNlcnZpY2UnLCB0aGlzLmdyaWRTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkU3RhdGVTZXJ2aWNlJywgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlJywgdGhpcy5ncm91cGluZ1NlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1BhZ2luYXRpb25TZXJ2aWNlJywgdGhpcy5wYWdpbmF0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUmVzaXplclNlcnZpY2UnLCB0aGlzLnJlc2l6ZXJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTaGFyZWRTZXJ2aWNlJywgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTb3J0U2VydmljZScsIHRoaXMuc29ydFNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0V2ZW50UHViU3ViU2VydmljZScsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUHViU3ViU2VydmljZScsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnVHJhbnNsYXRlclNlcnZpY2UnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdUcmVlRGF0YVNlcnZpY2UnLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMgfHwgIXRoaXMuY29sdW1uRGVmaW5pdGlvbnMpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBgPGFuZ3VsYXItc2xpY2tncmlkPmAgcmVxdWlyZXMgW2dyaWRPcHRpb25zXSBhbmQgW2NvbHVtbkRlZmluaXRpb25zXSwgaXQgc2VlbXMgdGhhdCB5b3UgbWlnaHQgaGF2ZSBmb3Jnb3QgdG8gcHJvdmlkZSB0aGVtIHNpbmNlIGF0IGxlYXN0IG9mIHRoZW0gaXMgdW5kZWZpbmVkLicpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0aWFsaXphdGlvbih0aGlzLl9ldmVudEhhbmRsZXIpO1xyXG4gICAgdGhpcy5faXNHcmlkSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuICAgIC8vIHJlY2hlY2sgdGhlIGVtcHR5IHdhcm5pbmcgbWVzc2FnZSBhZnRlciBncmlkIGlzIHNob3duIHNvIHRoYXQgaXQgd29ya3MgaW4gZXZlcnkgdXNlIGNhc2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFzZXQpKSB7XHJcbiAgICAgIGNvbnN0IGZpbmFsVG90YWxDb3VudCA9IHRoaXMuZGF0YXNldC5sZW5ndGg7XHJcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoZmluYWxUb3RhbENvdW50IDwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkJlZm9yZUdyaWREZXN0cm95JywgdGhpcy5zbGlja0dyaWQpO1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25BZnRlckdyaWREZXN0cm95ZWQnLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyID0gZmFsc2UpIHtcclxuICAgIC8vIGRpc3Bvc2Ugb2YgYWxsIFNlcnZpY2VzXHJcbiAgICB0aGlzLnNlcnZpY2VMaXN0LmZvckVhY2goKHNlcnZpY2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoc2VydmljZSAmJiBzZXJ2aWNlLmRpc3Bvc2UpIHtcclxuICAgICAgICBzZXJ2aWNlLmRpc3Bvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlcnZpY2VMaXN0ID0gW107XHJcblxyXG4gICAgLy8gZGlzcG9zZSBhbGwgcmVnaXN0ZXJlZCBleHRlcm5hbCByZXNvdXJjZXNcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpKSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucG9wKCk7XHJcbiAgICAgICAgaWYgKHJlc291cmNlPy5kaXNwb3NlKSB7XHJcbiAgICAgICAgICByZXNvdXJjZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkaXNwb3NlIHRoZSBDb21wb25lbnRzXHJcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnNsaWNrRm9vdGVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnNsaWNrUGFnaW5hdGlvbj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLl9ldmVudEhhbmRsZXI/LnVuc3Vic2NyaWJlQWxsKSB7XHJcbiAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci51bnN1YnNjcmliZUFsbCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlPy51bnN1YnNjcmliZUFsbCgpO1xyXG4gICAgaWYgKHRoaXMuZGF0YVZpZXcpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YVZpZXc/LnNldEl0ZW1zKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhbXSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuZGVzdHJveSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcuZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbGlja0dyaWQ/LmRlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5zbGlja0dyaWQuZGVzdHJveShzaG91bGRFbXB0eURvbUVsZW1lbnRDb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKSkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpW3Byb3AgYXMga2V5b2YgQmFja2VuZFNlcnZpY2VBcGldO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2VBcGkgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXModGhpcy5jb2x1bW5EZWZpbml0aW9ucykpIHtcclxuICAgICAgKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMgYXMgYW55KVtwcm9wXSA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXModGhpcy5zaGFyZWRTZXJ2aWNlKSkge1xyXG4gICAgICAodGhpcy5zaGFyZWRTZXJ2aWNlIGFzIGFueSlbcHJvcF0gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdlIGNvdWxkIG9wdGlvbmFsbHkgYWxzbyBlbXB0eSB0aGUgY29udGVudCBvZiB0aGUgZ3JpZCBjb250YWluZXIgRE9NIGVsZW1lbnRcclxuICAgIGlmIChzaG91bGRFbXB0eURvbUVsZW1lbnRDb250YWluZXIpIHtcclxuICAgICAgdGhpcy5lbXB0eUdyaWRDb250YWluZXJFbG0oKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbHNvIHVuc3Vic2NyaWJlIGFsbCBSeEpTIHN1YnNjcmlwdGlvbnNcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHVuc3Vic2NyaWJlQWxsKHRoaXMuc3Vic2NyaXB0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5fZGF0YXNldCA9IG51bGw7XHJcbiAgICB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNsaWNrR3JpZCA9IHVuZGVmaW5lZCBhcyBhbnk7XHJcbiAgfVxyXG5cclxuICBlbXB0eUdyaWRDb250YWluZXJFbG0oKSB7XHJcbiAgICBjb25zdCBncmlkQ29udGFpbmVySWQgPSB0aGlzLmdyaWRPcHRpb25zPy5ncmlkQ29udGFpbmVySWQgPz8gJ2dyaWQxJztcclxuICAgIGNvbnN0IGdyaWRDb250YWluZXJFbG0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtncmlkQ29udGFpbmVySWR9YCk7XHJcbiAgICBlbXB0eUVsZW1lbnQoZ3JpZENvbnRhaW5lckVsbSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgb3VyIGludGVybmFsIFBvc3QgUHJvY2VzcyBjYWxsYmFjaywgaXQgd2lsbCBleGVjdXRlIGludGVybmFsbHkgYWZ0ZXIgd2UgZ2V0IGJhY2sgcmVzdWx0IGZyb20gdGhlIFByb2Nlc3MgYmFja2VuZCBjYWxsXHJcbiAgICogRm9yIG5vdywgdGhpcyBpcyBHcmFwaFFMIFNlcnZpY2UgT05MWSBmZWF0dXJlIGFuZCBpdCB3aWxsIGJhc2ljYWxseSByZWZyZXNoIHRoZSBEYXRhc2V0ICYgUGFnaW5hdGlvbiB3aXRob3V0IGhhdmluZyB0aGUgdXNlciB0byBjcmVhdGUgaGlzIG93biBQb3N0UHJvY2VzcyBldmVyeSB0aW1lXHJcbiAgICovXHJcbiAgY3JlYXRlQmFja2VuZEFwaUludGVybmFsUG9zdFByb2Nlc3NDYWxsYmFjayhncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaS5zZXJ2aWNlKSB7XHJcbiAgICAgIGNvbnN0IGJhY2tlbmRBcGlTZXJ2aWNlID0gYmFja2VuZEFwaS5zZXJ2aWNlO1xyXG5cclxuICAgICAgLy8gaW50ZXJuYWxQb3N0UHJvY2VzcyBvbmx5IHdvcmtzIChmb3Igbm93KSB3aXRoIGEgR3JhcGhRTCBTZXJ2aWNlLCBzbyBtYWtlIHN1cmUgaXQgaXMgb2YgdGhhdCB0eXBlXHJcbiAgICAgIGlmICh0eXBlb2YgYmFja2VuZEFwaVNlcnZpY2UuZ2V0RGF0YXNldE5hbWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBiYWNrZW5kQXBpLmludGVybmFsUG9zdFByb2Nlc3MgPSAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSgpIDogJyc7XHJcbiAgICAgICAgICBpZiAocHJvY2Vzc1Jlc3VsdD8uZGF0YVtkYXRhc2V0TmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ25vZGVzJykgPyAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdLm5vZGVzIDogKHByb2Nlc3NSZXN1bHQgYXMgYW55KS5kYXRhW2RhdGFzZXROYW1lXTtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ3RvdGFsQ291bnQnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0udG90YWxDb3VudCA6IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hHcmlkRGF0YShkYXRhLCB0b3RhbENvdW50IHx8IDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemF0aW9uKGV2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIpIHtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMudHJhbnNsYXRlciA9IHRoaXMudHJhbnNsYXRlclNlcnZpY2U7XHJcbiAgICB0aGlzLl9ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXI7XHJcblxyXG4gICAgLy8gd2hlbiBkZXRlY3RpbmcgYSBmcm96ZW4gZ3JpZCwgd2UnbGwgYXV0b21hdGljYWxseSBlbmFibGUgdGhlIG1vdXNld2hlZWwgc2Nyb2xsIGhhbmRsZXIgc28gdGhhdCB3ZSBjYW4gc2Nyb2xsIGZyb20gYm90aCBsZWZ0L3JpZ2h0IGZyb3plbiBjb250YWluZXJzXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiAoKHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuUm93ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Sb3cgPj0gMCkgfHwgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiA+PSAwKSAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZU1vdXNlV2hlZWxTY3JvbGxIYW5kbGVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVNb3VzZVdoZWVsU2Nyb2xsSGFuZGxlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmV2ZW50TmFtaW5nU3R5bGUgPSB0aGlzLmdyaWRPcHRpb25zPy5ldmVudE5hbWluZ1N0eWxlID8/IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZENyZWF0ZScsIHRydWUpO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YXNldCBpcyBpbml0aWFsaXplZCAoaWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpdCBjYW5ub3QgZ2V0TGVuZ3RoIG9mIG51bGwpXHJcbiAgICB0aGlzLl9kYXRhc2V0ID0gdGhpcy5fZGF0YXNldCB8fCBbXTtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB0aGlzLm1lcmdlR3JpZE9wdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb247XHJcbiAgICB0aGlzLmxvY2FsZXMgPSB0aGlzLmdyaWRPcHRpb25zPy5sb2NhbGVzID8/IENvbnN0YW50cy5sb2NhbGVzO1xyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZUFwaSA9IHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgdGhpcy5faXNMb2NhbEdyaWQgPSAhdGhpcy5iYWNrZW5kU2VydmljZUFwaTsgLy8gY29uc2lkZXJlZCBhIGxvY2FsIGdyaWQgaWYgaXQgZG9lc24ndCBoYXZlIGEgYmFja2VuZCBzZXJ2aWNlIHNldFxyXG5cclxuICAgIHRoaXMuY3JlYXRlQmFja2VuZEFwaUludGVybmFsUG9zdFByb2Nlc3NDYWxsYmFjayh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgY29uc3QgZGF0YXZpZXdJbmxpbmVGaWx0ZXJzID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LmlubGluZUZpbHRlcnMgfHwgZmFsc2U7XHJcbiAgICAgIGxldCBkYXRhVmlld09wdGlvbnM6IERhdGFWaWV3T3B0aW9uID0geyBpbmxpbmVGaWx0ZXJzOiBkYXRhdmlld0lubGluZUZpbHRlcnMgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmRyYWdnYWJsZUdyb3VwaW5nIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlR3JvdXBpbmcpIHtcclxuICAgICAgICB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSBuZXcgU2xpY2tHcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyKCk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI7XHJcbiAgICAgICAgZGF0YVZpZXdPcHRpb25zID0geyAuLi5kYXRhVmlld09wdGlvbnMsIGdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI6IHRoaXMuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlciB9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgU2xpY2suRGF0YS5EYXRhVmlldyhkYXRhVmlld09wdGlvbnMpO1xyXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25EYXRhdmlld0NyZWF0ZWQnLCB0aGlzLmRhdGFWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgYW55IHBvc3NpYmxlIFNlcnZpY2VzIHRoYXQgdXNlciB3YW50IHRvIHJlZ2lzdGVyIHdoaWNoIGRvbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluc3RhbnRpYXRlZFxyXG4gICAgLy8gUnhKUyBSZXNvdXJjZSBpcyBpbiB0aGlzIGxvdCBiZWNhdXNlIGl0IGhhcyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGFuZCBkb2Vzbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluaXRpYWxpemVkXHJcbiAgICB0aGlzLnByZVJlZ2lzdGVyUmVzb3VyY2VzKCk7XHJcblxyXG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIHRvIHRoZSB1c2VyLCB3ZSBwcm92aWRlIHRoZSBwcm9wZXJ0eSBcImVkaXRvclwiIGFzIGFuIEFuZ3VsYXItU2xpY2tncmlkIGVkaXRvciBjb21wbGV4IG9iamVjdFxyXG4gICAgLy8gaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XHJcbiAgICAvLyBzbyBpbiBvdXIgbGliIHdlIHdpbGwgc3dhcCBcImVkaXRvclwiIGFuZCBjb3B5IGl0IGludG8gYSBuZXcgcHJvcGVydHkgY2FsbGVkIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIlxyXG4gICAgLy8gdGhlbiB0YWtlIGJhY2sgXCJlZGl0b3IubW9kZWxcIiBhbmQgbWFrZSBpdCB0aGUgbmV3IFwiZWRpdG9yXCIgc28gdGhhdCBTbGlja0dyaWQgRWRpdG9yIEZhY3Rvcnkgc3RpbGwgd29ya3NcclxuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gdGhpcy5zd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpO1xyXG5cclxuICAgIC8vIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGF1dG9tYXRpY2FsbHkgYWRkIGEgQ3VzdG9tIEVkaXRvciBGb3JtYXR0ZXIsIHdlIG5lZWQgdG8gY2FsbCB0aGUgYXV0byBhZGQgZnVuY3Rpb24gYWdhaW5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmF1dG9BZGRDdXN0b21FZGl0b3JGb3JtYXR0ZXIpIHtcclxuICAgICAgYXV0b0FkZEVkaXRvckZvcm1hdHRlclRvQ29sdW1uc1dpdGhFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMsIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b0FkZEN1c3RvbUVkaXRvckZvcm1hdHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSByZWZlcmVuY2UgZm9yIGFsbCBjb2x1bW5zIGJlZm9yZSB0aGV5IG9wdGlvbmFsbHkgYmVjb21lIGhpZGRlbi92aXNpYmxlXHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucyA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuY3JlYXRlRXh0ZW5zaW9uc0JlZm9yZUdyaWRDcmVhdGlvbih0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcblxyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgUGlubmluZy9Gcm96ZW4gXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gYXBwbHkgdGhlbSBpbiB0aGUgZ3JpZCBvcHRpb25zXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy5waW5uaW5nKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB7IC4uLnRoaXMuZ3JpZE9wdGlvbnMsIC4uLnRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5waW5uaW5nIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYnVpbGQgU2xpY2tHcmlkIEdyaWQsIGFsc28gdXNlciBtaWdodCBvcHRpb25hbGx5IHBhc3MgYSBjdXN0b20gZGF0YXZpZXcgKGUuZy4gcmVtb3RlIG1vZGVsKVxyXG4gICAgdGhpcy5zbGlja0dyaWQgPSBuZXcgU2xpY2suR3JpZChgIyR7dGhpcy5ncmlkSWR9YCwgdGhpcy5jdXN0b21EYXRhVmlldyB8fCB0aGlzLmRhdGFWaWV3LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGF0YVZpZXcgPSB0aGlzLmRhdGFWaWV3O1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNsaWNrR3JpZCA9IHRoaXMuc2xpY2tHcmlkO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyaWRDb250YWluZXJFbGVtZW50ID0gdGhpcy5lbG0ubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcclxuXHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYmluZERpZmZlcmVudEV4dGVuc2lvbnMoKTtcclxuICAgIHRoaXMuYmluZERpZmZlcmVudEhvb2tzKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLCB0aGlzLmRhdGFWaWV3KTtcclxuXHJcbiAgICAvLyB3aGVuIGl0J3MgYSBmcm96ZW4gZ3JpZCwgd2UgbmVlZCB0byBrZWVwIHRoZSBmcm96ZW4gY29sdW1uIGlkIGZvciByZWZlcmVuY2UgaWYgd2UgZXZlciBzaG93L2hpZGUgY29sdW1uIGZyb20gQ29sdW1uUGlja2VyL0dyaWRNZW51IGFmdGVyd2FyZFxyXG4gICAgY29uc3QgZnJvemVuQ29sdW1uSW5kZXggPSB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiAhPT0gdW5kZWZpbmVkID8gdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gOiAtMTtcclxuICAgIGlmIChmcm96ZW5Db2x1bW5JbmRleCA+PSAwICYmIGZyb3plbkNvbHVtbkluZGV4IDw9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZnJvemVuVmlzaWJsZUNvbHVtbklkID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnNbZnJvemVuQ29sdW1uSW5kZXhdLmlkIHx8ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBhbnkgcG9zc2libGUgU2VydmljZXMgdGhhdCB1c2VyIHdhbnQgdG8gcmVnaXN0ZXJcclxuICAgIHRoaXMucmVnaXN0ZXJSZXNvdXJjZXMoKTtcclxuXHJcbiAgICAvLyBpbml0aWFsaXplIHRoZSBTbGlja0dyaWQgZ3JpZFxyXG4gICAgdGhpcy5zbGlja0dyaWQuaW5pdCgpO1xyXG5cclxuICAgIC8vIGluaXRpYWxpemVkIHRoZSByZXNpemVyIHNlcnZpY2Ugb25seSBhZnRlciBTbGlja0dyaWQgaXMgaW5pdGlhbGl6ZWRcclxuICAgIC8vIGlmIHdlIGRvbid0IHdlIGVuZCB1cCBiaW5kaW5nIG91ciByZXNpemUgdG8gYSBncmlkIGVsZW1lbnQgdGhhdCBkb2Vzbid0IHlldCBleGlzdCBpbiB0aGUgRE9NIGFuZCB0aGUgcmVzaXplciBzZXJ2aWNlIHdpbGwgZmFpbCBzaWxlbnRseSAoYmVjYXVzZSBpdCBoYXMgYSB0cnkvY2F0Y2ggdGhhdCB1bmJpbmRzIHRoZSByZXNpemUgd2l0aG91dCB0aHJvd2luZyBiYWNrKVxyXG4gICAgaWYgKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5pbml0KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRDb250YWluZXJFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB1c2VyIGNvdWxkIHNob3cgYSBjdXN0b20gZm9vdGVyIHdpdGggdGhlIGRhdGEgbWV0cmljcyAoZGF0YXNldCBsZW5ndGggYW5kIGxhc3QgdXBkYXRlZCB0aW1lc3RhbXApXHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLmdyaWRPcHRpb25zLnNob3dDdXN0b21Gb290ZXIgJiYgdGhpcy5ncmlkT3B0aW9ucy5jdXN0b21Gb290ZXJPcHRpb25zICYmIHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5zbGlja0Zvb3RlciA9IG5ldyBTbGlja0Zvb3RlckNvbXBvbmVudCh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucy5jdXN0b21Gb290ZXJPcHRpb25zLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyLnJlbmRlckZvb3Rlcih0aGlzLmdyaWRDb250YWluZXJFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldykge1xyXG4gICAgICAvLyBsb2FkIHRoZSBkYXRhIGluIHRoZSBEYXRhVmlldyAodW5sZXNzIGl0J3MgYSBoaWVyYXJjaGljYWwgZGF0YXNldCwgaWYgc28gaXQgd2lsbCBiZSBsb2FkZWQgYWZ0ZXIgdGhlIGluaXRpYWwgdHJlZSBzb3J0KVxyXG4gICAgICBjb25zdCBpbml0aWFsRGF0YXNldCA9IHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVRyZWVEYXRhID8gdGhpcy5zb3J0VHJlZURhdGFzZXQodGhpcy5fZGF0YXNldCkgOiB0aGlzLl9kYXRhc2V0O1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LmJlZ2luVXBkYXRlKCk7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoaW5pdGlhbERhdGFzZXQgfHwgW10sIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YXNldElkUHJvcGVydHlOYW1lID8/ICdpZCcpO1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LmVuZFVwZGF0ZSgpO1xyXG5cclxuICAgICAgLy8gaWYgeW91IGRvbid0IHdhbnQgdGhlIGl0ZW1zIHRoYXQgYXJlIG5vdCB2aXNpYmxlIChkdWUgdG8gYmVpbmcgZmlsdGVyZWQgb3V0IG9yIGJlaW5nIG9uIGEgZGlmZmVyZW50IHBhZ2UpXHJcbiAgICAgIC8vIHRvIHN0YXkgc2VsZWN0ZWQsIHBhc3MgJ2ZhbHNlJyB0byB0aGUgc2Vjb25kIGFyZ1xyXG4gICAgICBpZiAodGhpcy5zbGlja0dyaWQ/LmdldFNlbGVjdGlvbk1vZGVsKCkgJiYgdGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3ICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuaGFzT3duUHJvcGVydHkoJ3N5bmNHcmlkU2VsZWN0aW9uJykpIHtcclxuICAgICAgICAvLyBpZiB3ZSBhcmUgdXNpbmcgYSBCYWNrZW5kIFNlcnZpY2UsIHdlIHdpbGwgZG8gYW4gZXh0cmEgZmxhZyBjaGVjaywgdGhlIHJlYXNvbiBpcyBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgc29tZSB1bmludGVuZGVkIGJlaGF2aW9yc1xyXG4gICAgICAgIC8vIHdpdGggdGhlIEJhY2tlbmRTZXJ2aWNlQXBpIGJlY2F1c2UgdGVjaG5pY2FsbHkgdGhlIGRhdGEgaW4gdGhlIHBhZ2UgY2hhbmdlcyB0aGUgRGF0YVZpZXcgb24gZXZlcnkgcGFnZSBjaGFuZ2UuXHJcbiAgICAgICAgbGV0IHByZXNlcnZlZFJvd1NlbGVjdGlvbldpdGhCYWNrZW5kID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5oYXNPd25Qcm9wZXJ0eSgnc3luY0dyaWRTZWxlY3Rpb25XaXRoQmFja2VuZFNlcnZpY2UnKSkge1xyXG4gICAgICAgICAgcHJlc2VydmVkUm93U2VsZWN0aW9uV2l0aEJhY2tlbmQgPSB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlIGFzIGJvb2xlYW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzeW5jR3JpZFNlbGVjdGlvbiA9IHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb247XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzeW5jR3JpZFNlbGVjdGlvbiA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICBsZXQgcHJlc2VydmVkUm93U2VsZWN0aW9uID0gc3luY0dyaWRTZWxlY3Rpb247XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgICAgICAgIC8vIHdoZW4gdXNpbmcgQmFja2VuZFNlcnZpY2VBcGksIHdlJ2xsIGJlIHVzaW5nIHRoZSBcInN5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlXCIgZmxhZyBCVVQgXCJzeW5jR3JpZFNlbGVjdGlvblwiIG11c3QgYWxzbyBiZSBzZXQgdG8gVHJ1ZVxyXG4gICAgICAgICAgICBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb24gPSBzeW5jR3JpZFNlbGVjdGlvbiAmJiBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb25XaXRoQmFja2VuZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb24odGhpcy5zbGlja0dyaWQsIHByZXNlcnZlZFJvd1NlbGVjdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3luY0dyaWRTZWxlY3Rpb24gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uKHRoaXMuc2xpY2tHcmlkLCBzeW5jR3JpZFNlbGVjdGlvbi5wcmVzZXJ2ZUhpZGRlbiwgc3luY0dyaWRTZWxlY3Rpb24ucHJlc2VydmVIaWRkZW5PblNlbGVjdGlvbkNoYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXRhc2V0TG4gPSB0aGlzLmRhdGFWaWV3LmdldExlbmd0aCgpIHx8IHRoaXMuX2RhdGFzZXQgJiYgdGhpcy5fZGF0YXNldC5sZW5ndGggfHwgMDtcclxuICAgICAgaWYgKGRhdGFzZXRMbiA+IDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24pKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XHJcbiAgICAgICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXNlciBtaWdodCB3YW50IHRvIGhpZGUgdGhlIGhlYWRlciByb3cgb24gcGFnZSBsb2FkIGJ1dCBzdGlsbCBoYXZlIGBlbmFibGVGaWx0ZXJpbmc6IHRydWVgXHJcbiAgICAvLyBpZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBuZWVkIHRvIGhpZGUgdGhlIGhlYWRlclJvdyBPTkxZIEFGVEVSIGFsbCBmaWx0ZXJzIGdvdCBjcmVhdGVkICYgZGF0YVZpZXcgZXhpc3RcclxuICAgIGlmICh0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCkge1xyXG4gICAgICB0aGlzLnNob3dIZWFkZXJSb3coZmFsc2UpO1xyXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaXNoICYgZGlzcGF0Y2ggY2VydGFpbiBldmVudHNcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkdyaWRDcmVhdGVkJywgdGhpcy5zbGlja0dyaWQpO1xyXG5cclxuICAgIC8vIGFmdGVyIHRoZSBEYXRhVmlldyBpcyBjcmVhdGVkICYgdXBkYXRlZCBleGVjdXRlIHNvbWUgcHJvY2Vzc2VzXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgdGhpcy5leGVjdXRlQWZ0ZXJEYXRhdmlld0NyZWF0ZWQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGJpbmQgcmVzaXplIE9OTFkgYWZ0ZXIgdGhlIGRhdGFWaWV3IGlzIHJlYWR5XHJcbiAgICB0aGlzLmJpbmRSZXNpemVIb29rKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuXHJcbiAgICAvLyBiaW5kIHRoZSBCYWNrZW5kIFNlcnZpY2UgQVBJIGNhbGxiYWNrIGZ1bmN0aW9ucyBvbmx5IGFmdGVyIHRoZSBncmlkIGlzIGluaXRpYWxpemVkXHJcbiAgICAvLyBiZWNhdXNlIHRoZSBwcmVQcm9jZXNzKCkgYW5kIG9uSW5pdCgpIG1pZ2h0IGdldCB0cmlnZ2VyZWRcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICB0aGlzLmJpbmRCYWNrZW5kQ2FsbGJhY2tGdW5jdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9jYWwgZ3JpZCwgY2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IHRoZSBQYWdpbmF0aW9uXHJcbiAgICAvLyBpZiBzbyB0aGVuIGFsc28gY2hlY2sgaWYgdGhlcmUncyBhbnkgcHJlc2V0cyBhbmQgZmluYWxseSBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uU2VydmljZVxyXG4gICAgLy8gYSBsb2NhbCBncmlkIHdpdGggUGFnaW5hdGlvbiBwcmVzZXRzIHdpbGwgcG90ZW50aWFsbHkgaGF2ZSBhIGRpZmZlcmVudCB0b3RhbCBvZiBpdGVtcywgd2UnbGwgbmVlZCB0byBnZXQgaXQgZnJvbSB0aGUgRGF0YVZpZXcgYW5kIHVwZGF0ZSBvdXIgdG90YWxcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd1BhZ2luYXRpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLmxvYWRMb2NhbEdyaWRQYWdpbmF0aW9uKHRoaXMuZGF0YXNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMgPSB7XHJcbiAgICAgIC8vIFNsaWNrIEdyaWQgJiBEYXRhVmlldyBvYmplY3RzXHJcbiAgICAgIGRhdGFWaWV3OiB0aGlzLmRhdGFWaWV3LFxyXG4gICAgICBzbGlja0dyaWQ6IHRoaXMuc2xpY2tHcmlkLFxyXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvblNlcnZpY2U/LmV4dGVuc2lvbkxpc3QsXHJcblxyXG4gICAgICAvLyBwdWJsaWMgbWV0aG9kc1xyXG4gICAgICBkZXN0cm95OiB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKSxcclxuXHJcbiAgICAgIC8vIHJldHVybiBhbGwgYXZhaWxhYmxlIFNlcnZpY2VzIChub24tc2luZ2xldG9uKVxyXG4gICAgICBiYWNrZW5kU2VydmljZTogdGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGk/LnNlcnZpY2UsXHJcbiAgICAgIGZpbHRlclNlcnZpY2U6IHRoaXMuZmlsdGVyU2VydmljZSxcclxuICAgICAgZ3JpZEV2ZW50U2VydmljZTogdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLFxyXG4gICAgICBncmlkU3RhdGVTZXJ2aWNlOiB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UsXHJcbiAgICAgIGdyaWRTZXJ2aWNlOiB0aGlzLmdyaWRTZXJ2aWNlLFxyXG4gICAgICBncm91cGluZ1NlcnZpY2U6IHRoaXMuZ3JvdXBpbmdTZXJ2aWNlLFxyXG4gICAgICBleHRlbnNpb25TZXJ2aWNlOiB0aGlzLmV4dGVuc2lvblNlcnZpY2UsXHJcbiAgICAgIHBhZ2luYXRpb25TZXJ2aWNlOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLFxyXG4gICAgICByZXNpemVyU2VydmljZTogdGhpcy5yZXNpemVyU2VydmljZSxcclxuICAgICAgc29ydFNlcnZpY2U6IHRoaXMuc29ydFNlcnZpY2UsXHJcbiAgICAgIHRyZWVEYXRhU2VydmljZTogdGhpcy50cmVlRGF0YVNlcnZpY2UsXHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWxsIGluc3RhbmNlcyAoU2xpY2tHcmlkLCBEYXRhVmlldyAmIGFsbCBTZXJ2aWNlcylcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkFuZ3VsYXJHcmlkQ3JlYXRlZCcsIHRoaXMuX2FuZ3VsYXJHcmlkSW5zdGFuY2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIGEgUGFnaW5hdGlvbiBjaGFuZ2VkLCB3ZSB3aWxsIHRyaWdnZXIgYSBHcmlkIFN0YXRlIGNoYW5nZWQgd2l0aCB0aGUgbmV3IHBhZ2luYXRpb24gaW5mb1xyXG4gICAqIEFsc28gaWYgd2UgdXNlIFJvdyBTZWxlY3Rpb24gb3IgdGhlIENoZWNrYm94IFNlbGVjdG9yLCB3ZSBuZWVkIHRvIHJlc2V0IGFueSBzZWxlY3Rpb25cclxuICAgKi9cclxuICBwYWdpbmF0aW9uQ2hhbmdlZChwYWdpbmF0aW9uOiBTZXJ2aWNlUGFnaW5hdGlvbikge1xyXG4gICAgY29uc3QgaXNTeW5jR3JpZFNlbGVjdGlvbkVuYWJsZWQgPSB0aGlzLmdyaWRTdGF0ZVNlcnZpY2U/Lm5lZWRUb1ByZXNlcnZlUm93U2VsZWN0aW9uKCkgPz8gZmFsc2U7XHJcbiAgICBpZiAoIWlzU3luY0dyaWRTZWxlY3Rpb25FbmFibGVkICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IpKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhbXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH0gPSBwYWdpbmF0aW9uO1xyXG4gICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZSkge1xyXG4gICAgICBpZiAocGFnZVNpemUgIT09IHVuZGVmaW5lZCAmJiBwYWdlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY3VycmVudFBhZ2luYXRpb24gPSB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkdyaWRTdGF0ZUNoYW5nZWQnLCB7XHJcbiAgICAgIGNoYW5nZTogeyBuZXdWYWx1ZXM6IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfSwgdHlwZTogR3JpZFN0YXRlVHlwZS5wYWdpbmF0aW9uIH0sXHJcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLmdldEN1cnJlbnRHcmlkU3RhdGUoKVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBkYXRhc2V0IGNoYW5nZXMsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgZW50aXJlIGdyaWQgVUkgJiBwb3NzaWJseSByZXNpemUgaXQgYXMgd2VsbFxyXG4gICAqIEBwYXJhbSBkYXRhc2V0XHJcbiAgICovXHJcbiAgcmVmcmVzaEdyaWREYXRhKGRhdGFzZXQ6IGFueVtdLCB0b3RhbENvdW50PzogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUVtcHR5RGF0YVdhcm5pbmdNZXNzYWdlICYmIEFycmF5LmlzQXJyYXkoZGF0YXNldCkpIHtcclxuICAgICAgY29uc3QgZmluYWxUb3RhbENvdW50ID0gdG90YWxDb3VudCB8fCBkYXRhc2V0Lmxlbmd0aDtcclxuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhc2V0KSAmJiB0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmRhdGFWaWV3Py5zZXRJdGVtcykge1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LnNldEl0ZW1zKGRhdGFzZXQsIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YXNldElkUHJvcGVydHlOYW1lID8/ICdpZCcpO1xyXG4gICAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlVHJlZURhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3LnJlU29ydCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGF0YXNldC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFJvd1NlbGVjdGlvblByZXNldFdoZW5FeGlzdHMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGF0YXNldCkge1xyXG4gICAgICAgIHRoaXMuc2xpY2tHcmlkLmludmFsaWRhdGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZGlzcGxheSB0aGUgUGFnaW5hdGlvbiBjb21wb25lbnQgb25seSBhZnRlciBjYWxsaW5nIHRoaXMgcmVmcmVzaCBkYXRhIGZpcnN0LCB3ZSBjYWxsIGl0IGhlcmUgc28gdGhhdCBpZiB3ZSBwcmVzZXQgcGFnaW5hdGlvbiBwYWdlIG51bWJlciBpdCB3aWxsIGJlIHNob3duIGNvcnJlY3RseVxyXG4gICAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gKHRoaXMuZ3JpZE9wdGlvbnMgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiB8fCAodGhpcy5ncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gPT09IHVuZGVmaW5lZCkpKSA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpKSB7XHJcbiAgICAgICAgY29uc3QgcGFnaW5hdGlvbk9wdGlvbnMgPSB0aGlzLnNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQodGhpcy5ncmlkT3B0aW9ucywgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgYXMgUGFnaW5hdGlvbik7XHJcbiAgICAgICAgLy8gd2hlbiB3ZSBoYXZlIGEgdG90YWxDb3VudCB1c2UgaXQsIGVsc2Ugd2UnbGwgdGFrZSBpdCBmcm9tIHRoZSBwYWdpbmF0aW9uIG9iamVjdFxyXG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSB0b3RhbCBpdGVtcyBpZiBpdCdzIGRpZmZlcmVudCB0byBhdm9pZCByZWZyZXNoaW5nIHRoZSBVSVxyXG4gICAgICAgIGNvbnN0IHRvdGFsUmVjb3JkcyA9ICh0b3RhbENvdW50ICE9PSB1bmRlZmluZWQpID8gdG90YWxDb3VudCA6ICh0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uPy50b3RhbEl0ZW1zKTtcclxuICAgICAgICBpZiAodG90YWxSZWNvcmRzICE9PSB1bmRlZmluZWQgJiYgdG90YWxSZWNvcmRzICE9PSB0aGlzLnRvdGFsSXRlbXMpIHtcclxuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9ICt0b3RhbFJlY29yZHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uIFNlcnZpY2Ugd2l0aCBuZXcgcGFnaW5hdGlvbiBvcHRpb25zICh3aGljaCBtaWdodCBoYXZlIHByZXNldHMpXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBhZ2luYXRpb24gc2VydmljZSB3aXRoIHRoZSBuZXcgdG90YWxcclxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlVG90YWxJdGVtcyh0aGlzLnRvdGFsSXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVzaXplIHRoZSBncmlkIGluc2lkZSBhIHNsaWdodCB0aW1lb3V0LCBpbiBjYXNlIG90aGVyIERPTSBlbGVtZW50IGNoYW5nZWQgcHJpb3IgdG8gdGhlIHJlc2l6ZSAobGlrZSBhIGZpbHRlci9wYWdpbmF0aW9uIGNoYW5nZWQpXHJcbiAgICAgIGlmICh0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUF1dG9SZXNpemUpIHtcclxuICAgICAgICBjb25zdCBkZWxheSA9IHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1Jlc2l6ZSAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9SZXNpemUuZGVsYXk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKGRlbGF5IHx8IDEwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgdGhlcmUncyBhbnkgUGFnaW5hdGlvbiBQcmVzZXRzIGRlZmluZWQgaW4gdGhlIEdyaWQgT3B0aW9ucyxcclxuICAgKiBpZiB0aGVyZSBhcmUgdGhlbiBsb2FkIHRoZW0gaW4gdGhlIHBhZ2luYXRpb25PcHRpb25zIG9iamVjdFxyXG4gICAqL1xyXG4gIHNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24sIHBhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uKTogUGFnaW5hdGlvbiB7XHJcbiAgICBpZiAoZ3JpZE9wdGlvbnMucHJlc2V0cz8ucGFnaW5hdGlvbiAmJiBwYWdpbmF0aW9uT3B0aW9ucyAmJiAhdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgcGFnaW5hdGlvbk9wdGlvbnMucGFnZVNpemUgPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24ucGFnZVNpemU7XHJcbiAgICAgIHBhZ2luYXRpb25PcHRpb25zLnBhZ2VOdW1iZXIgPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24ucGFnZU51bWJlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBwYWdpbmF0aW9uT3B0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIER5bmFtaWNhbGx5IGNoYW5nZSBvciB1cGRhdGUgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBsaXN0LlxyXG4gICAqIFdlIHdpbGwgcmUtcmVuZGVyIHRoZSBncmlkIHNvIHRoYXQgdGhlIG5ldyBoZWFkZXIgYW5kIGRhdGEgc2hvd3MgdXAgY29ycmVjdGx5LlxyXG4gICAqIElmIHVzaW5nIGkxOG4sIHdlIGFsc28gbmVlZCB0byB0cmlnZ2VyIGEgcmUtdHJhbnNsYXRlIG9mIHRoZSBjb2x1bW4gaGVhZGVyc1xyXG4gICAqL1xyXG4gIHVwZGF0ZUNvbHVtbkRlZmluaXRpb25zTGlzdChuZXdDb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcclxuICAgIC8vIG1hcC9zd2FwIHRoZSBpbnRlcm5hbCBsaWJyYXJ5IEVkaXRvciB0byB0aGUgU2xpY2tHcmlkIEVkaXRvciBmYWN0b3J5XHJcbiAgICBuZXdDb2x1bW5EZWZpbml0aW9ucyA9IHRoaXMuc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKG5ld0NvbHVtbkRlZmluaXRpb25zKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoZmFsc2UsIG5ld0NvbHVtbkRlZmluaXRpb25zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5yZW5kZXJDb2x1bW5IZWFkZXJzKG5ld0NvbHVtbkRlZmluaXRpb25zLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlQXV0b1NpemVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmF1dG9zaXplQ29sdW1ucygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQgJiYgdGhpcy5yZXNpemVyU2VydmljZT8ucmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQpIHtcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyB0aGUgZmlsdGVyIHJvdyBkaXNwbGF5ZWQgb24gZmlyc3Qgcm93LCB3ZSBjYW4gb3B0aW9uYWxseSBwYXNzIGZhbHNlIHRvIGhpZGUgaXQuXHJcbiAgICogQHBhcmFtIHNob3dpbmdcclxuICAgKi9cclxuICBzaG93SGVhZGVyUm93KHNob3dpbmcgPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNsaWNrR3JpZC5zZXRIZWFkZXJSb3dWaXNpYmlsaXR5KHNob3dpbmcsIGZhbHNlKTtcclxuICAgIGlmIChzaG93aW5nID09PSB0cnVlICYmIHRoaXMuX2lzR3JpZEluaXRpYWxpemVkKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLnNldENvbHVtbnModGhpcy5jb2x1bW5EZWZpbml0aW9ucyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2hvd2luZztcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gcHJpdmF0ZSBmdW5jdGlvbnNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9vcCB0aHJvdWdoIGFsbCBjb2x1bW4gZGVmaW5pdGlvbnMgYW5kIGNvcHkgdGhlIG9yaWdpbmFsIG9wdGlvbmFsIGB3aWR0aGAgcHJvcGVydGllcyBvcHRpb25hbGx5IHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAqIFdlIHdpbGwgdXNlIHRoaXMgd2hlbiBkb2luZyBhIHJlc2l6ZSBieSBjZWxsIGNvbnRlbnQsIGlmIHVzZXIgcHJvdmlkZWQgYSBgd2lkdGhgIGl0IHdvbid0IG92ZXJyaWRlIGl0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29weUNvbHVtbldpZHRoc1JlZmVyZW5jZShjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbkRlZmluaXRpb25zLmZvckVhY2goY29sID0+IGNvbC5vcmlnaW5hbFdpZHRoID0gY29sLndpZHRoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoc2hvd1dhcm5pbmcgPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nPy5zaG93RW1wdHlEYXRhTWVzc2FnZShzaG93V2FybmluZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmREaWZmZXJlbnRIb29rcyhncmlkOiBTbGlja0dyaWQsIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uLCBkYXRhVmlldzogU2xpY2tEYXRhVmlldykge1xyXG4gICAgLy8gb24gbG9jYWxlIGNoYW5nZSwgd2UgaGF2ZSB0byBtYW51YWxseSB0cmFuc2xhdGUgdGhlIEhlYWRlcnMsIEdyaWRNZW51XHJcbiAgICBpZiAodGhpcy50cmFuc2xhdGU/Lm9uTGFuZ0NoYW5nZSkge1xyXG4gICAgICAvLyB0cmFuc2xhdGUgc29tZSBvZiB0aGVtIG9uIGZpcnN0IGxvYWQsIHRoZW4gb24gZWFjaCBsYW5ndWFnZSBjaGFuZ2VcclxuICAgICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVBbGxFeHRlbnNpb25zKCk7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGVDb2x1bW5IZWFkZXJUaXRsZUtleXMoKTtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIC8vIHB1Ymxpc2ggZXZlbnQgb2YgdGhlIHNhbWUgbmFtZSB0aGF0IFNsaWNrZ3JpZC1Vbml2ZXJzYWwgdXNlcyBvbiBhIGxhbmd1YWdlIGNoYW5nZSBldmVudFxyXG4gICAgICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uTGFuZ3VhZ2VDaGFuZ2UnKTtcclxuXHJcbiAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVBbGxFeHRlbnNpb25zKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XHJcbiAgICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5jcmVhdGVQcmVIZWFkZXJQYW5lbCAmJiAhZ3JpZE9wdGlvbnMuZW5hYmxlRHJhZ2dhYmxlR3JvdXBpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nU2VydmljZS50cmFuc2xhdGVHcm91cGluZ0FuZENvbFNwYW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgdXNlciBzZXQgYW4gb25Jbml0IEJhY2tlbmQsIHdlJ2xsIHJ1biBpdCByaWdodCBhd2F5IChhbmQgaWYgc28sIHdlIGFsc28gbmVlZCB0byBydW4gcHJlUHJvY2VzcywgaW50ZXJuYWxQb3N0UHJvY2VzcyAmIHBvc3RQcm9jZXNzKVxyXG4gICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpKSB7XHJcbiAgICAgIGNvbnN0IGJhY2tlbmRBcGkgPSBncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaTtcclxuXHJcbiAgICAgIGlmIChiYWNrZW5kQXBpPy5zZXJ2aWNlPy5pbml0KSB7XHJcbiAgICAgICAgYmFja2VuZEFwaS5zZXJ2aWNlLmluaXQoYmFja2VuZEFwaS5vcHRpb25zLCBncmlkT3B0aW9ucy5wYWdpbmF0aW9uLCB0aGlzLnNsaWNrR3JpZCwgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhVmlldyAmJiBncmlkKSB7XHJcbiAgICAgIGNvbnN0IHNsaWNrZ3JpZEV2ZW50UHJlZml4ID0gdGhpcy5ncmlkT3B0aW9ucz8uZGVmYXVsdFNsaWNrZ3JpZEV2ZW50UHJlZml4ID8/ICcnO1xyXG5cclxuICAgICAgLy8gZXhwb3NlIGFsbCBTbGljayBHcmlkIEV2ZW50cyB0aHJvdWdoIGRpc3BhdGNoXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBncmlkKSB7XHJcbiAgICAgICAgaWYgKGdyaWQuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcC5zdGFydHNXaXRoKCdvbicpKSB7XHJcbiAgICAgICAgICBjb25zdCBncmlkRXZlbnROYW1lID0gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmdldEV2ZW50TmFtZUJ5TmFtaW5nQ29udmVudGlvbihwcm9wLCBzbGlja2dyaWRFdmVudFByZWZpeCk7XHJcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKChncmlkIGFzIGFueSlbcHJvcF0sIChldmVudCwgYXJncykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZ3JpZEV2ZW50TmFtZSwgeyBldmVudERhdGE6IGV2ZW50LCBhcmdzIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleHBvc2UgYWxsIFNsaWNrIERhdGFWaWV3IEV2ZW50cyB0aHJvdWdoIGRpc3BhdGNoXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBkYXRhVmlldykge1xyXG4gICAgICAgIGlmIChkYXRhVmlldy5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwcm9wLnN0YXJ0c1dpdGgoJ29uJykpIHtcclxuICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoKGRhdGFWaWV3IGFzIGFueSlbcHJvcF0sIChldmVudCwgYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhVmlld0V2ZW50TmFtZSA9IHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5nZXRFdmVudE5hbWVCeU5hbWluZ0NvbnZlbnRpb24ocHJvcCwgc2xpY2tncmlkRXZlbnRQcmVmaXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZGF0YVZpZXdFdmVudE5hbWUsIHsgZXZlbnREYXRhOiBldmVudCwgYXJncyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gb24gY2VsbCBjbGljaywgbWFpbmx5IHVzZWQgd2l0aCB0aGUgY29sdW1uRGVmLmFjdGlvbiBjYWxsYmFja1xyXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UuYmluZE9uQ2VsbENoYW5nZShncmlkKTtcclxuICAgICAgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLmJpbmRPbkNsaWNrKGdyaWQpO1xyXG5cclxuICAgICAgaWYgKGRhdGFWaWV3ICYmIGdyaWQpIHtcclxuICAgICAgICAvLyBiaW5kIGV4dGVybmFsIHNvcnRpbmcgKGJhY2tlbmQpIHdoZW4gYXZhaWxhYmxlIG9yIGRlZmF1bHQgb25Tb3J0IChkYXRhVmlldylcclxuICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlU29ydGluZykge1xyXG4gICAgICAgICAgLy8gYmluZCBleHRlcm5hbCBzb3J0aW5nIChiYWNrZW5kKSB1bmxlc3Mgc3BlY2lmaWVkIHRvIHVzZSB0aGUgbG9jYWwgb25lXHJcbiAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgIWdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpLnVzZUxvY2FsU29ydGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmJpbmRCYWNrZW5kT25Tb3J0KGdyaWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0U2VydmljZS5iaW5kTG9jYWxPblNvcnQoZ3JpZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBiaW5kIGV4dGVybmFsIGZpbHRlciAoYmFja2VuZCkgd2hlbiBhdmFpbGFibGUgb3IgZGVmYXVsdCBvbkZpbHRlciAoZGF0YVZpZXcpXHJcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZUZpbHRlcmluZykge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmluaXQoZ3JpZCk7XHJcblxyXG4gICAgICAgICAgLy8gYmluZCBleHRlcm5hbCBmaWx0ZXIgKGJhY2tlbmQpIHVubGVzcyBzcGVjaWZpZWQgdG8gdXNlIHRoZSBsb2NhbCBvbmVcclxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiAhZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkudXNlTG9jYWxGaWx0ZXJpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmJpbmRCYWNrZW5kT25GaWx0ZXIoZ3JpZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UuYmluZExvY2FsT25GaWx0ZXIoZ3JpZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsb2FkIGFueSBwcmVzZXRzIGlmIGFueSAoYWZ0ZXIgZGF0YXNldCBpcyBpbml0aWFsaXplZClcclxuICAgICAgICB0aGlzLmxvYWRDb2x1bW5QcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xyXG4gICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XHJcblxyXG4gICAgICAgIC8vIFdoZW4gZGF0YSBjaGFuZ2VzIGluIHRoZSBEYXRhVmlldywgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBtZXRyaWNzIGFuZC9vciBkaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgZGF0YXNldCBpcyBlbXB0eVxyXG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoZGF0YVZpZXcub25Sb3dDb3VudENoYW5nZWQsICgpID0+IHtcclxuICAgICAgICAgIGdyaWQuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoZGF0YVZpZXcuZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSB8fCAwLCBkYXRhVmlldy5nZXRJdGVtQ291bnQoKSB8fCAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKGRhdGFWaWV3Lm9uU2V0SXRlbXNDYWxsZWQsIChfZSwgYXJncykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoZGF0YVZpZXcuZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSB8fCAwLCBhcmdzLml0ZW1Db3VudCk7XHJcblxyXG4gICAgICAgICAgLy8gd2hlbiB1c2VyIGhhcyByZXNpemUgYnkgY29udGVudCBlbmFibGVkLCB3ZSdsbCBmb3JjZSBhIGZ1bGwgd2lkdGggY2FsY3VsYXRpb24gc2luY2Ugd2UgY2hhbmdlIG91ciBlbnRpcmUgZGF0YXNldFxyXG4gICAgICAgICAgaWYgKGFyZ3MuaXRlbUNvdW50ID4gMCAmJiAodGhpcy5ncmlkT3B0aW9ucy5hdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWQgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQoIXRoaXMuZ3JpZE9wdGlvbnM/LnJlc2l6ZUJ5Q29udGVudE9ubHlPbkZpcnN0TG9hZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChncmlkT3B0aW9ucz8uZW5hYmxlRmlsdGVyaW5nICYmICFncmlkT3B0aW9ucy5lbmFibGVSb3dEZXRhaWxWaWV3KSB7XHJcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKGRhdGFWaWV3Lm9uUm93c0NoYW5nZWQsIChfZSwgYXJncykgPT4ge1xyXG4gICAgICAgICAgICAvLyBmaWx0ZXJpbmcgZGF0YSB3aXRoIGxvY2FsIGRhdGFzZXQgd2lsbCBub3QgYWx3YXlzIHNob3cgY29ycmVjdGx5IHVubGVzcyB3ZSBjYWxsIHRoaXMgdXBkYXRlUm93L3JlbmRlclxyXG4gICAgICAgICAgICAvLyBhbHNvIGRvbid0IHVzZSBcImludmFsaWRhdGVSb3dzXCIgc2luY2UgaXQgZGVzdHJveXMgdGhlIGVudGlyZSByb3cgYW5kIGFzIGJhZCB1c2VyIGV4cGVyaWVuY2Ugd2hlbiB1cGRhdGluZyBhIHJvd1xyXG4gICAgICAgICAgICAvLyBzZWUgY29tbWl0OiBodHRwczovL2dpdGh1Yi5jb20vZ2hpc2NvZGluZy9hdXJlbGlhLXNsaWNrZ3JpZC9jb21taXQvOGM1MDNhNGQ0NWZiYTExY2JkOGQ4Y2M0NjdmYWU4ZDE3N2NjNGY2MFxyXG4gICAgICAgICAgICBpZiAoYXJncz8ucm93cyAmJiBBcnJheS5pc0FycmF5KGFyZ3Mucm93cykpIHtcclxuICAgICAgICAgICAgICBhcmdzLnJvd3MuZm9yRWFjaCgocm93OiBudW1iZXIpID0+IGdyaWQudXBkYXRlUm93KHJvdykpO1xyXG4gICAgICAgICAgICAgIGdyaWQucmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGRpZCB0aGUgdXNlciBhZGQgYSBjb2xzcGFuIGNhbGxiYWNrPyBJZiBzbywgaG9vayBpdCBpbnRvIHRoZSBEYXRhVmlldyBnZXRJdGVtTWV0YWRhdGFcclxuICAgIGlmIChncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2sgJiYgZGF0YVZpZXcgJiYgZGF0YVZpZXcuZ2V0SXRlbSAmJiBkYXRhVmlldy5nZXRJdGVtTWV0YWRhdGEpIHtcclxuICAgICAgZGF0YVZpZXcuZ2V0SXRlbU1ldGFkYXRhID0gKHJvd051bWJlcjogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgbGV0IGNhbGxiYWNrUmVzdWx0ID0gbnVsbDtcclxuICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrICYmIGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjaykge1xyXG4gICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2soZGF0YVZpZXcuZ2V0SXRlbShyb3dOdW1iZXIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrUmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiaW5kQmFja2VuZENhbGxiYWNrRnVuY3Rpb25zKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKSB7XHJcbiAgICBjb25zdCBiYWNrZW5kQXBpID0gZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGk7XHJcbiAgICBjb25zdCBiYWNrZW5kQXBpU2VydmljZSA9IGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaS5zZXJ2aWNlO1xyXG4gICAgY29uc3Qgc2VydmljZU9wdGlvbnM6IEJhY2tlbmRTZXJ2aWNlT3B0aW9uID0gYmFja2VuZEFwaVNlcnZpY2U/Lm9wdGlvbnMgPz8ge307XHJcbiAgICBjb25zdCBpc0V4ZWN1dGVDb21tYW5kT25Jbml0ID0gKCFzZXJ2aWNlT3B0aW9ucykgPyBmYWxzZSA6ICgoc2VydmljZU9wdGlvbnMgJiYgc2VydmljZU9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2V4ZWN1dGVQcm9jZXNzQ29tbWFuZE9uSW5pdCcpKSA/IHNlcnZpY2VPcHRpb25zWydleGVjdXRlUHJvY2Vzc0NvbW1hbmRPbkluaXQnXSA6IHRydWUpO1xyXG5cclxuICAgIGlmIChiYWNrZW5kQXBpU2VydmljZSkge1xyXG4gICAgICAvLyB1cGRhdGUgYmFja2VuZCBmaWx0ZXJzIChpZiBuZWVkIGJlKSBCRUZPUkUgdGhlIHF1ZXJ5IHJ1bnMgKHZpYSB0aGUgb25Jbml0IGNvbW1hbmQgYSBmZXcgbGluZXMgYmVsb3cpXHJcbiAgICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIGFueSBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBncmlkXHJcbiAgICAgIGlmIChncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5wcmVzZXRzKSB7XHJcbiAgICAgICAgLy8gRmlsdGVycyBcInByZXNldHNcIlxyXG4gICAgICAgIGlmIChiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzICYmIEFycmF5LmlzQXJyYXkoZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzKSAmJiBncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyhncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTb3J0ZXJzIFwicHJlc2V0c1wiXHJcbiAgICAgICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVNvcnRlcnMgJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMpICYmIGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAvLyB3aGVuIHVzaW5nIG11bHRpLWNvbHVtbiBzb3J0LCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBidXQgb24gc2luZ2xlIHNvcnQgdGhlbiBvbmx5IGdyYWIgdGhlIGZpcnN0IHNvcnQgcHJvdmlkZWRcclxuICAgICAgICAgIGNvbnN0IHNvcnRDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5tdWx0aUNvbHVtblNvcnQgPyBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMgOiBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMuc2xpY2UoMCwgMSk7XHJcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVTb3J0ZXJzKHVuZGVmaW5lZCwgc29ydENvbHVtbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQYWdpbmF0aW9uIFwicHJlc2V0c1wiXHJcbiAgICAgICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb24gJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgICBjb25zdCB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH0gPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb247XHJcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVQYWdpbmF0aW9uKHBhZ2VOdW1iZXIsIHBhZ2VTaXplKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uRmlsdGVycyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXRDb2x1bW5GaWx0ZXJzKCk7XHJcbiAgICAgICAgaWYgKGNvbHVtbkZpbHRlcnMgJiYgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycykge1xyXG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyhjb2x1bW5GaWx0ZXJzLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleGVjdXRlIG9uSW5pdCBjb21tYW5kIHdoZW4gbmVjZXNzYXJ5XHJcbiAgICAgIGlmIChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIChiYWNrZW5kQXBpLm9uSW5pdCB8fCBpc0V4ZWN1dGVDb21tYW5kT25Jbml0KSkge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gKHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5idWlsZFF1ZXJ5ID09PSAnZnVuY3Rpb24nKSA/IGJhY2tlbmRBcGlTZXJ2aWNlLmJ1aWxkUXVlcnkoKSA6ICcnO1xyXG4gICAgICAgIGNvbnN0IHByb2Nlc3MgPSAoaXNFeGVjdXRlQ29tbWFuZE9uSW5pdCkgPyAoYmFja2VuZEFwaS5wcm9jZXNzICYmIGJhY2tlbmRBcGkucHJvY2VzcyhxdWVyeSkgfHwgbnVsbCkgOiAoYmFja2VuZEFwaS5vbkluaXQgJiYgYmFja2VuZEFwaS5vbkluaXQocXVlcnkpIHx8IG51bGwpO1xyXG5cclxuICAgICAgICAvLyB3cmFwIHRoaXMgaW5zaWRlIGEgc2V0VGltZW91dCB0byBhdm9pZCB0aW1pbmcgaXNzdWUgc2luY2UgdGhlIGdyaWRPcHRpb25zIG5lZWRzIHRvIGJlIHJlYWR5IGJlZm9yZSBydW5uaW5nIHRoaXMgb25Jbml0XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBiYWNrZW5kVXRpbGl0eVNlcnZpY2UgPSB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSBhcyBCYWNrZW5kVXRpbGl0eVNlcnZpY2U7XHJcblxyXG4gICAgICAgICAgLy8ga2VlcCBzdGFydCB0aW1lICYgZW5kIHRpbWVzdGFtcHMgJiByZXR1cm4gaXQgYWZ0ZXIgcHJvY2VzcyBleGVjdXRpb25cclxuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAgICAgLy8gcnVuIGFueSBwcmUtcHJvY2VzcywgaWYgZGVmaW5lZCwgZm9yIGV4YW1wbGUgYSBzcGlubmVyXHJcbiAgICAgICAgICBpZiAoYmFja2VuZEFwaS5wcmVQcm9jZXNzKSB7XHJcbiAgICAgICAgICAgIGJhY2tlbmRBcGkucHJlUHJvY2VzcygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoZSBwcm9jZXNzZXMgY2FuIGJlIGEgUHJvbWlzZSAobGlrZSBIdHRwKVxyXG4gICAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb24/LnRvdGFsSXRlbXMgPz8gMDtcclxuICAgICAgICAgIGlmIChwcm9jZXNzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICBwcm9jZXNzXHJcbiAgICAgICAgICAgICAgLnRoZW4oKHByb2Nlc3NSZXN1bHQ6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLmV4ZWN1dGVCYWNrZW5kUHJvY2Vzc2VzQ2FsbGJhY2soc3RhcnRUaW1lLCBwcm9jZXNzUmVzdWx0LCBiYWNrZW5kQXBpLCB0b3RhbEl0ZW1zKSlcclxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2Uub25CYWNrZW5kRXJyb3IoZXJyb3IsIGJhY2tlbmRBcGkpKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2VzcyAmJiB0aGlzLnJ4anM/LmlzT2JzZXJ2YWJsZShwcm9jZXNzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICAgICAgICAocHJvY2VzcyBhcyBPYnNlcnZhYmxlPGFueT4pLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2UuZXhlY3V0ZUJhY2tlbmRQcm9jZXNzZXNDYWxsYmFjayhzdGFydFRpbWUsIHByb2Nlc3NSZXN1bHQsIGJhY2tlbmRBcGksIHRvdGFsSXRlbXMpLFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2Uub25CYWNrZW5kRXJyb3IoZXJyb3IsIGJhY2tlbmRBcGkpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiaW5kUmVzaXplSG9vayhncmlkOiBTbGlja0dyaWQsIG9wdGlvbnM6IEdyaWRPcHRpb24pIHtcclxuICAgIGlmICgob3B0aW9ucy5hdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkICYmIG9wdGlvbnMuYXV0b3NpemVDb2x1bW5zQnlDZWxsQ29udGVudE9uRmlyc3RMb2FkKSB8fCAob3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMgJiYgb3B0aW9ucy5lbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0FuZ3VsYXItU2xpY2tncmlkXSBZb3UgY2Fubm90IGVuYWJsZSBib3RoIGF1dG9zaXplL2ZpdCB2aWV3cG9ydCAmIHJlc2l6ZSBieSBjb250ZW50LCB5b3UgbXVzdCBjaG9vc2Ugd2hpY2ggcmVzaXplIHRlY2huaXF1ZSB0byB1c2UuIFlvdSBjYW4gZW5hYmxlIHRoZXNlIDIgb3B0aW9ucyAoXCJhdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkXCIgYW5kIFwiZW5hYmxlQXV0b1NpemVDb2x1bW5zXCIpIE9SIHRoZXNlIG90aGVyIDIgb3B0aW9ucyAoXCJhdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWRcIiBhbmQgXCJlbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRcIikuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXhwYW5kL2F1dG9maXQgY29sdW1ucyBvbiBmaXJzdCBwYWdlIGxvYWRcclxuICAgIGlmIChncmlkICYmIG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucykge1xyXG4gICAgICBncmlkLmF1dG9zaXplQ29sdW1ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGF1dG8tcmVzaXplIGdyaWQgb24gYnJvd3NlciByZXNpemVcclxuICAgIGlmIChvcHRpb25zLmdyaWRIZWlnaHQgfHwgb3B0aW9ucy5ncmlkV2lkdGgpIHtcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKDAsIHsgaGVpZ2h0OiBvcHRpb25zLmdyaWRIZWlnaHQsIHdpZHRoOiBvcHRpb25zLmdyaWRXaWR0aCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZSkge1xyXG4gICAgICBpZiAoZ3JpZCAmJiBvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcclxuICAgICAgICBncmlkLmF1dG9zaXplQ29sdW1ucygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4ZWN1dGVBZnRlckRhdGF2aWV3Q3JlYXRlZChfZ3JpZDogU2xpY2tHcmlkLCBncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgU29ydCBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBET01cclxuICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVTb3J0aW5nKSB7XHJcbiAgICAgIGlmIChncmlkT3B0aW9ucy5wcmVzZXRzICYmIEFycmF5LmlzQXJyYXkoZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzKSkge1xyXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbXVsdGktY29sdW1uIHNvcnQsIHdlIGNhbiBoYXZlIG11bHRpcGxlIGJ1dCBvbiBzaW5nbGUgc29ydCB0aGVuIG9ubHkgZ3JhYiB0aGUgZmlyc3Qgc29ydCBwcm92aWRlZFxyXG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5tdWx0aUNvbHVtblNvcnQgPyBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMgOiBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMuc2xpY2UoMCwgMSk7XHJcbiAgICAgICAgdGhpcy5zb3J0U2VydmljZS5sb2FkR3JpZFNvcnRlcnMoc29ydENvbHVtbnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogV2hlbiBkYXRhIGNoYW5nZXMgaW4gdGhlIERhdGFWaWV3LCB3ZSdsbCByZWZyZXNoIHRoZSBtZXRyaWNzIGFuZC9vciBkaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgZGF0YXNldCBpcyBlbXB0eSAqL1xyXG4gIHByaXZhdGUgaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKGN1cnJlbnRQYWdlUm93SXRlbUNvdW50OiBudW1iZXIsIHRvdGFsSXRlbUNvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoID0gdG90YWxJdGVtQ291bnQ7XHJcbiAgICB0aGlzLm1ldHJpY3MgPSB7XHJcbiAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKSxcclxuICAgICAgZW5kVGltZTogbmV3IERhdGUoKSxcclxuICAgICAgaXRlbUNvdW50OiBjdXJyZW50UGFnZVJvd0l0ZW1Db3VudCxcclxuICAgICAgdG90YWxJdGVtQ291bnRcclxuICAgIH07XHJcbiAgICAvLyBpZiBjdXN0b20gZm9vdGVyIGlzIGVuYWJsZWQsIHRoZW4gd2UnbGwgdXBkYXRlIGl0cyBtZXRyaWNzXHJcbiAgICBpZiAodGhpcy5zbGlja0Zvb3Rlcikge1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyLm1ldHJpY3MgPSB0aGlzLm1ldHJpY3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB1c2luZyBsb2NhbCAoaW4tbWVtb3J5KSBkYXRhc2V0LCB3ZSdsbCBkaXNwbGF5IGEgd2FybmluZyBtZXNzYWdlIHdoZW4gZmlsdGVyZWQgZGF0YSBpcyBlbXB0eVxyXG4gICAgaWYgKHRoaXMuX2lzTG9jYWxHcmlkICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZUVtcHR5RGF0YVdhcm5pbmdNZXNzYWdlKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoY3VycmVudFBhZ2VSb3dJdGVtQ291bnQgPT09IDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24pIHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEgPSB7XHJcbiAgICAgICAgZ3JpZE9wdGlvbnM6IHRoaXMuZ3JpZE9wdGlvbnMsXHJcbiAgICAgICAgcGFnaW5hdGlvblNlcnZpY2U6IHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcztcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5pbml0KHRoaXMuc2xpY2tHcmlkLCBwYWdpbmF0aW9uT3B0aW9ucywgdGhpcy5iYWNrZW5kU2VydmljZUFwaSk7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5zdWJzY3JpYmUoJ29uUGFnaW5hdGlvbkNoYW5nZWQnLCAocGFnaW5hdGlvbkNoYW5nZXM6IFNlcnZpY2VQYWdpbmF0aW9uKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25DaGFuZ2VkKHBhZ2luYXRpb25DaGFuZ2VzKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2Uuc3Vic2NyaWJlKCdvblBhZ2luYXRpb25WaXNpYmlsaXR5Q2hhbmdlZCcsICh2aXNpYmlsaXR5OiB7IHZpc2libGU6IGJvb2xlYW4gfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9IHZpc2liaWxpdHk/LnZpc2libGUgPz8gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGkpIHtcclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2U/LnJlZnJlc2hCYWNrZW5kRGF0YXNldCh0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbih0aGlzLnNob3dQYWdpbmF0aW9uKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIHBhZ2luYXRpb24gY29tcG9uZW50XHJcbiAgICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbigpO1xyXG4gICAgICB0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKiBMb2FkIHRoZSBFZGl0b3IgQ29sbGVjdGlvbiBhc3luY2hyb25vdXNseSBhbmQgcmVwbGFjZSB0aGUgXCJjb2xsZWN0aW9uXCIgcHJvcGVydHkgd2hlbiBPYnNlcnZhYmxlIHJlc29sdmVzICovXHJcbiAgcHJpdmF0ZSBsb2FkRWRpdG9yQ29sbGVjdGlvbkFzeW5jKGNvbHVtbjogQ29sdW1uKSB7XHJcbiAgICBjb25zdCBjb2xsZWN0aW9uQXN5bmMgPSBjb2x1bW4gJiYgY29sdW1uLmVkaXRvciAmJiAoY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3IpLmNvbGxlY3Rpb25Bc3luYztcclxuICAgIGlmIChjb2xsZWN0aW9uQXN5bmMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIGNvbGxlY3Rpb25Bc3luYy5zdWJzY3JpYmUoKHJlc29sdmVkQ29sbGVjdGlvbikgPT4gdGhpcy51cGRhdGVFZGl0b3JDb2xsZWN0aW9uKGNvbHVtbiwgcmVzb2x2ZWRDb2xsZWN0aW9uKSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbkFzeW5jIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAvLyB3YWl0IGZvciB0aGUgXCJjb2xsZWN0aW9uQXN5bmNcIiwgb25jZSByZXNvbHZlZCB3ZSB3aWxsIHNhdmUgaXQgaW50byB0aGUgXCJjb2xsZWN0aW9uXCJcclxuICAgICAgLy8gdGhlIGNvbGxlY3Rpb25Bc3luYyBjYW4gYmUgb2YgMyB0eXBlcyBIdHRwQ2xpZW50LCBIdHRwRmV0Y2ggb3IgYSBQcm9taXNlXHJcbiAgICAgIGNvbGxlY3Rpb25Bc3luYy50aGVuKChyZXNwb25zZTogYW55IHwgYW55W10pID0+IHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlRWRpdG9yQ29sbGVjdGlvbihjb2x1bW4sIHJlc3BvbnNlKTsgLy8gZnJvbSBQcm9taXNlXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMb2FkIGFueSBwb3NzaWJsZSBDb2x1bW5zIEdyaWQgUHJlc2V0cyAqL1xyXG4gIHByaXZhdGUgbG9hZENvbHVtblByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCkge1xyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgQ29sdW1ucyBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBncmlkXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzICYmIEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMpICYmIHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZ3JpZENvbHVtbnM6IENvbHVtbltdID0gdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLmdldEFzc29jaWF0ZWRHcmlkQ29sdW1ucyh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMpO1xyXG4gICAgICBpZiAoZ3JpZENvbHVtbnMgJiYgQXJyYXkuaXNBcnJheShncmlkQ29sdW1ucykgJiYgZ3JpZENvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjaGVja2JveCBzZWxlY3RvciBpcyBhbHNvIHZpc2libGUgaWYgaXQgaXMgZW5hYmxlZFxyXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IpIHtcclxuICAgICAgICAgIGNvbnN0IGNoZWNrYm94Q29sdW1uID0gKEFycmF5LmlzQXJyYXkodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpICYmIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLmxlbmd0aCA+IDApID8gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnNbMF0gOiBudWxsO1xyXG4gICAgICAgICAgaWYgKGNoZWNrYm94Q29sdW1uICYmIGNoZWNrYm94Q29sdW1uLmlkID09PSAnX2NoZWNrYm94X3NlbGVjdG9yJyAmJiBncmlkQ29sdW1uc1swXS5pZCAhPT0gJ19jaGVja2JveF9zZWxlY3RvcicpIHtcclxuICAgICAgICAgICAgZ3JpZENvbHVtbnMudW5zaGlmdChjaGVja2JveENvbHVtbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBrZWVwIGNvcHkgdGhlIG9yaWdpbmFsIG9wdGlvbmFsIGB3aWR0aGAgcHJvcGVydGllcyBvcHRpb25hbGx5IHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAgICAgIC8vIFdlIHdpbGwgdXNlIHRoaXMgd2hlbiBkb2luZyBhIHJlc2l6ZSBieSBjZWxsIGNvbnRlbnQsIGlmIHVzZXIgcHJvdmlkZWQgYSBgd2lkdGhgIGl0IHdvbid0IG92ZXJyaWRlIGl0LlxyXG4gICAgICAgIGdyaWRDb2x1bW5zLmZvckVhY2goY29sID0+IGNvbC5vcmlnaW5hbFdpZHRoID0gY29sLndpZHRoKTtcclxuXHJcbiAgICAgICAgLy8gZmluYWxseSBzZXQgdGhlIG5ldyBwcmVzZXRzIGNvbHVtbnMgKGluY2x1ZGluZyBjaGVja2JveCBzZWxlY3RvciBpZiBuZWVkIGJlKVxyXG4gICAgICAgIHRoaXMuc2xpY2tHcmlkLnNldENvbHVtbnMoZ3JpZENvbHVtbnMpO1xyXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS52aXNpYmxlQ29sdW1ucyA9IGdyaWRDb2x1bW5zO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTG9hZCBhbnkgcG9zc2libGUgRmlsdGVycyBHcmlkIFByZXNldHMgKi9cclxuICBwcml2YXRlIGxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpIHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmICF0aGlzLmN1c3RvbURhdGFWaWV3KSB7XHJcbiAgICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIEZpbHRlciBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBET01cclxuICAgICAgLy8gYWxzbyBub3RlIHRoYXQgYSBwcmVzZXRzIG9mIFRyZWUgRGF0YSBUb2dnbGluZyB3aWxsIGFsc28gY2FsbCB0aGlzIG1ldGhvZCBiZWNhdXNlIFRyZWUgRGF0YSB0b2dnbGluZyBkb2VzIHdvcmsgd2l0aCBkYXRhIGZpbHRlcmluZ1xyXG4gICAgICAvLyAoY29sbGFwc2luZyBhIHBhcmVudCB3aWxsIGJhc2ljYWxseSB1c2UgRmlsdGVyIGZvciBoaWRkaW5nIChha2EgY29sbGFwc2luZykgYXdheSB0aGUgY2hpbGQgdW5kZXJuZWF0IGl0KVxyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzICYmIChBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzKSB8fCBBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cz8udHJlZURhdGE/LnRvZ2dsZWRJdGVtcykpKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnBvcHVsYXRlQ29sdW1uRmlsdGVyU2VhcmNoVGVybVByZXNldHModGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy5maWx0ZXJzIHx8IFtdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogbG9jYWwgZ3JpZCwgY2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IHRoZSBQYWdpbmF0aW9uXHJcbiAgICogaWYgc28gdGhlbiBhbHNvIGNoZWNrIGlmIHRoZXJlJ3MgYW55IHByZXNldHMgYW5kIGZpbmFsbHkgaW5pdGlhbGl6ZSB0aGUgUGFnaW5hdGlvblNlcnZpY2VcclxuICAgKiBhIGxvY2FsIGdyaWQgd2l0aCBQYWdpbmF0aW9uIHByZXNldHMgd2lsbCBwb3RlbnRpYWxseSBoYXZlIGEgZGlmZmVyZW50IHRvdGFsIG9mIGl0ZW1zLCB3ZSdsbCBuZWVkIHRvIGdldCBpdCBmcm9tIHRoZSBEYXRhVmlldyBhbmQgdXBkYXRlIG91ciB0b3RhbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZExvY2FsR3JpZFBhZ2luYXRpb24oZGF0YXNldD86IGFueVtdKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucykge1xyXG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSBBcnJheS5pc0FycmF5KGRhdGFzZXQpID8gZGF0YXNldC5sZW5ndGggOiAwO1xyXG4gICAgICBpZiAodGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgJiYgdGhpcy5kYXRhVmlldz8uZ2V0UGFnaW5nSW5mbykge1xyXG4gICAgICAgIGNvbnN0IHNsaWNrUGFnaW5nSW5mbyA9IHRoaXMuZGF0YVZpZXcuZ2V0UGFnaW5nSW5mbygpO1xyXG4gICAgICAgIGlmIChzbGlja1BhZ2luZ0luZm8/Lmhhc093blByb3BlcnR5KCd0b3RhbFJvd3MnKSAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucy50b3RhbEl0ZW1zICE9PSBzbGlja1BhZ2luZ0luZm8udG90YWxSb3dzKSB7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBzbGlja1BhZ2luZ0luZm8udG90YWxSb3dzIHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zLnRvdGFsSXRlbXMgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgIGNvbnN0IHBhZ2luYXRpb25PcHRpb25zID0gdGhpcy5zZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIExvYWQgYW55IFJvdyBTZWxlY3Rpb25zIGludG8gdGhlIERhdGFWaWV3IHRoYXQgd2VyZSBwcmVzZXRzIGJ5IHRoZSB1c2VyICovXHJcbiAgcHJpdmF0ZSBsb2FkUm93U2VsZWN0aW9uUHJlc2V0V2hlbkV4aXN0cygpIHtcclxuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIFJvdyBTZWxlY3Rpb25zIFwicHJlc2V0c1wiXHJcbiAgICBjb25zdCBwcmVzZXRzID0gdGhpcy5ncmlkT3B0aW9ucz8ucHJlc2V0cztcclxuICAgIGNvbnN0IGVuYWJsZVJvd1NlbGVjdGlvbiA9IHRoaXMuZ3JpZE9wdGlvbnMgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3RvciB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbik7XHJcbiAgICBpZiAoZW5hYmxlUm93U2VsZWN0aW9uICYmIHRoaXMuc2xpY2tHcmlkPy5nZXRTZWxlY3Rpb25Nb2RlbCgpICYmIHByZXNldHM/LnJvd1NlbGVjdGlvbiAmJiAoQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5ncmlkUm93SW5kZXhlcykgfHwgQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5kYXRhQ29udGV4dElkcykpKSB7XHJcbiAgICAgIGxldCBkYXRhQ29udGV4dElkcyA9IHByZXNldHMucm93U2VsZWN0aW9uLmRhdGFDb250ZXh0SWRzO1xyXG4gICAgICBsZXQgZ3JpZFJvd0luZGV4ZXMgPSBwcmVzZXRzLnJvd1NlbGVjdGlvbi5ncmlkUm93SW5kZXhlcztcclxuXHJcbiAgICAgIC8vIG1hcHMgdGhlIElEcyB0byB0aGUgR3JpZCBSb3dzIGFuZCB2aWNlIHZlcnNhLCB0aGUgXCJkYXRhQ29udGV4dElkc1wiIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG90aGVyXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFDb250ZXh0SWRzKSAmJiBkYXRhQ29udGV4dElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZ3JpZFJvd0luZGV4ZXMgPSB0aGlzLmRhdGFWaWV3Lm1hcElkc1RvUm93cyhkYXRhQ29udGV4dElkcykgfHwgW107XHJcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShncmlkUm93SW5kZXhlcykgJiYgZ3JpZFJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGRhdGFDb250ZXh0SWRzID0gdGhpcy5kYXRhVmlldy5tYXBSb3dzVG9JZHMoZ3JpZFJvd0luZGV4ZXMpIHx8IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZS5zZWxlY3RlZFJvd0RhdGFDb250ZXh0SWRzID0gZGF0YUNvbnRleHRJZHM7XHJcblxyXG4gICAgICAvLyBjaGFuZ2UgdGhlIHNlbGVjdGVkIHJvd3MgZXhjZXB0IFVOTEVTUyBpdCdzIGEgTG9jYWwgR3JpZCB3aXRoIFBhZ2luYXRpb25cclxuICAgICAgLy8gbG9jYWwgUGFnaW5hdGlvbiB1c2VzIHRoZSBEYXRhVmlldyBhbmQgdGhhdCBhbHNvIHRyaWdnZXIgYSBjaGFuZ2UvcmVmcmVzaFxyXG4gICAgICAvLyBhbmQgd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIDIgR3JpZCBTdGF0ZSBjaGFuZ2VzIGp1c3QgMVxyXG4gICAgICBpZiAoKHRoaXMuX2lzTG9jYWxHcmlkICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24pIHx8ICF0aGlzLl9pc0xvY2FsR3JpZCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIEFycmF5LmlzQXJyYXkoZ3JpZFJvd0luZGV4ZXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhncmlkUm93SW5kZXhlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVyZ2VHcmlkT3B0aW9ucyhncmlkT3B0aW9uczogR3JpZE9wdGlvbik6IEdyaWRPcHRpb24ge1xyXG4gICAgZ3JpZE9wdGlvbnMuZ3JpZElkID0gdGhpcy5ncmlkSWQ7XHJcbiAgICBncmlkT3B0aW9ucy5ncmlkQ29udGFpbmVySWQgPSBgc2xpY2tHcmlkQ29udGFpbmVyLSR7dGhpcy5ncmlkSWR9YDtcclxuXHJcbiAgICAvLyBpZiB3ZSBoYXZlIGEgYmFja2VuZFNlcnZpY2VBcGkgYW5kIHRoZSBlbmFibGVQYWdpbmF0aW9uIGlzIHVuZGVmaW5lZCwgd2UnbGwgYXNzdW1lIHRoYXQgd2UgZG8gd2FudCB0byBzZWUgaXQsIGVsc2UgZ2V0IHRoYXQgZGVmaW5lZCB2YWx1ZVxyXG4gICAgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9ICgoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uKSB8fCBmYWxzZTtcclxuXHJcbiAgICAvLyB1c2UganF1ZXJ5IGV4dGVuZCB0byBkZWVwIG1lcmdlICYgY29weSB0byBhdm9pZCBpbW11dGFibGUgcHJvcGVydGllcyBiZWluZyBjaGFuZ2VkIGluIEdsb2JhbEdyaWRPcHRpb25zIGFmdGVyIGEgcm91dGUgY2hhbmdlXHJcbiAgICBjb25zdCBvcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIEdsb2JhbEdyaWRPcHRpb25zLCB0aGlzLmZvclJvb3RDb25maWcsIGdyaWRPcHRpb25zKSBhcyBHcmlkT3B0aW9uO1xyXG5cclxuICAgIC8vIHVzaW5nIGpRdWVyeSBleHRlbmQgdG8gZG8gYSBkZWVwIGNsb25lIGhhcyBhbiB1bndhbnRlZCBzaWRlIG9uIG9iamVjdHMgYW5kIHBhZ2VTaXplcyBidXQgRVM2IHNwcmVhZCBoYXMgb3RoZXIgd29yc3Qgc2lkZSBlZmZlY3RzXHJcbiAgICAvLyBzbyB3ZSB3aWxsIGp1c3Qgb3ZlcndyaXRlIHRoZSBwYWdlU2l6ZXMgd2hlbiBuZWVkZWQsIHRoaXMgaXMgdGhlIG9ubHkgb25lIGNhdXNpbmcgaXNzdWVzIHNvIGZhci5cclxuICAgIC8vIGpRdWVyeSB3cm90ZSB0aGlzIG9uIHRoZWlyIGRvY3M6OiBPbiBhIGRlZXAgZXh0ZW5kLCBPYmplY3QgYW5kIEFycmF5IGFyZSBleHRlbmRlZCwgYnV0IG9iamVjdCB3cmFwcGVycyBvbiBwcmltaXRpdmUgdHlwZXMgc3VjaCBhcyBTdHJpbmcsIEJvb2xlYW4sIGFuZCBOdW1iZXIgYXJlIG5vdC5cclxuICAgIGlmIChvcHRpb25zPy5wYWdpbmF0aW9uICYmIChncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uIHx8IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpKSAmJiAodGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24gfHwgZ3JpZE9wdGlvbnMucGFnaW5hdGlvbikpIHtcclxuICAgICAgb3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gZ3JpZE9wdGlvbnMucGFnaW5hdGlvbj8ucGFnZVNpemUgPz8gdGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplID8/IEdsb2JhbEdyaWRPcHRpb25zLnBhZ2luYXRpb24hLnBhZ2VTaXplO1xyXG4gICAgICBvcHRpb25zLnBhZ2luYXRpb24ucGFnZVNpemVzID0gZ3JpZE9wdGlvbnMucGFnaW5hdGlvbj8ucGFnZVNpemVzID8/IHRoaXMuZm9yUm9vdENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZXMgPz8gR2xvYmFsR3JpZE9wdGlvbnMucGFnaW5hdGlvbiEucGFnZVNpemVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsc28gbWFrZSBzdXJlIHRvIHNob3cgdGhlIGhlYWRlciByb3cgaWYgdXNlciBoYXZlIGVuYWJsZWQgZmlsdGVyaW5nXHJcbiAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IChvcHRpb25zLnNob3dIZWFkZXJSb3cgPT09IGZhbHNlKTtcclxuICAgIGlmIChvcHRpb25zLmVuYWJsZUZpbHRlcmluZyAmJiAhb3B0aW9ucy5zaG93SGVhZGVyUm93KSB7XHJcbiAgICAgIG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9IG9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gd2UgdXNlIFBhZ2luYXRpb24gb24gTG9jYWwgR3JpZCwgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgd2l0aG91dCBlbmFibGVGaWx0ZXJpbmdcclxuICAgIC8vIHNvIHdlJ2xsIGVuYWJsZSB0aGUgZmlsdGVyaW5nIGJ1dCB3ZSdsbCBrZWVwIHRoZSBoZWFkZXIgcm93IGhpZGRlblxyXG4gICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nICYmIG9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLl9pc0xvY2FsR3JpZCkge1xyXG4gICAgICBvcHRpb25zLmVuYWJsZUZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgIG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKiogUHJlLVJlZ2lzdGVyIGFueSBSZXNvdXJjZSB0aGF0IGRvbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluc3RhbnRpYXRlZCAoZm9yIGV4YW1wbGUgUnhKUyBSZXNvdXJjZSAmIFJvd0RldGFpbCkgKi9cclxuICBwcml2YXRlIHByZVJlZ2lzdGVyUmVzb3VyY2VzKCkge1xyXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyA9IHRoaXMuZ3JpZE9wdGlvbnMucmVnaXN0ZXJFeHRlcm5hbFJlc291cmNlcyB8fCBbXTtcclxuXHJcbiAgICAvLyBBbmd1bGFyLVNsaWNrZ3JpZCByZXF1aXJlcyBSeEpTLCBzbyB3ZSdsbCByZWdpc3RlciBpdCBhcyB0aGUgZmlyc3QgcmVzb3VyY2VcclxuICAgIHRoaXMucmVnaXN0ZXJSeEpzUmVzb3VyY2UobmV3IFJ4SnNSZXNvdXJjZSgpIGFzIFJ4SnNGYWNhZGUpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd0RldGFpbFZpZXcpIHtcclxuICAgICAgdGhpcy5zbGlja1Jvd0RldGFpbFZpZXcgPSBuZXcgU2xpY2tSb3dEZXRhaWxWaWV3KHRoaXMuYW5ndWxhclV0aWxTZXJ2aWNlLCB0aGlzLmFwcFJlZiwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLmVsbS5uYXRpdmVFbGVtZW50LCB0aGlzLnJ4anMpO1xyXG4gICAgICB0aGlzLnNsaWNrUm93RGV0YWlsVmlldy5jcmVhdGUodGhpcy5jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnNsaWNrUm93RGV0YWlsVmlldyk7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRFeHRlbnNpb25Ub0xpc3QoRXh0ZW5zaW9uTmFtZS5yb3dEZXRhaWxWaWV3LCB7IG5hbWU6IEV4dGVuc2lvbk5hbWUucm93RGV0YWlsVmlldywgaW5zdGFuY2U6IHRoaXMuc2xpY2tSb3dEZXRhaWxWaWV3IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWdpc3RlclJlc291cmNlcygpIHtcclxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIHdlIGNvbnNpZGVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBzZXJ2aWNlcyBhcyBleHRlcm5hbCBzZXJ2aWNlcywgYW55dGhpbmcgZWxzZSByZWdpc3RlcmVkIGFmdGVyd2FyZCBhcmVuJ3QgZXh0ZXJuYWxcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpKSB7XHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5leHRlcm5hbFJlZ2lzdGVyZWRSZXNvdXJjZXMgPSB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1c2ggYWxsIG90aGVyIFNlcnZpY2VzIHRoYXQgd2Ugd2FudCB0byBiZSByZWdpc3RlcmVkXHJcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5ncmlkU2VydmljZSwgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlKTtcclxuXHJcbiAgICAvLyB3aGVuIHVzaW5nIEdyb3VwaW5nL0RyYWdnYWJsZUdyb3VwaW5nL0NvbHNwYW4gcmVnaXN0ZXIgaXRzIFNlcnZpY2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNyZWF0ZVByZUhlYWRlclBhbmVsICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZURyYWdnYWJsZUdyb3VwaW5nKSB7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLmdyb3VwaW5nU2VydmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB1c2luZyBUcmVlIERhdGEgVmlldywgcmVnaXN0ZXIgaXRzIFNlcnZpY2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyZWVEYXRhKSB7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB1c2VyIGVuYWJsZXMgdHJhbnNsYXRpb24sIHdlIG5lZWQgdG8gdHJhbnNsYXRlIEhlYWRlcnMgb24gZmlyc3QgcGFzcyAmIHN1YnNlcXVlbnRseSBpbiB0aGUgYmluZERpZmZlcmVudEhvb2tzXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIGVtcHR5IHdhcm5pbmcgY29tcG9uZW50XHJcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nID0gbmV3IFNsaWNrRW1wdHlXYXJuaW5nQ29tcG9uZW50KCk7XHJcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5zbGlja0VtcHR5V2FybmluZyk7XHJcblxyXG4gICAgLy8gYmluZCAmIGluaXRpYWxpemUgYWxsIENvbXBvbmVudHMvU2VydmljZXMgdGhhdCB3ZXJlIHRhZ2dlZCBhcyBlbmFibGVkXHJcbiAgICAvLyByZWdpc3RlciBhbGwgc2VydmljZXMgYnkgZXhlY3V0aW5nIHRoZWlyIGluaXQgbWV0aG9kIGFuZCBwcm92aWRpbmcgdGhlbSB3aXRoIHRoZSBHcmlkIG9iamVjdFxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcclxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIHR5cGVvZiByZXNvdXJjZS5pbml0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICByZXNvdXJjZS5pbml0KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmNvbnRhaW5lclNlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlZ2lzdGVyIHRoZSBSeEpTIFJlc291cmNlIGluIGFsbCBuZWNlc3Nhcnkgc2VydmljZXMgd2hpY2ggdXNlcyAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJSeEpzUmVzb3VyY2UocmVzb3VyY2U6IFJ4SnNGYWNhZGUpIHtcclxuICAgIHRoaXMucnhqcyA9IHJlc291cmNlO1xyXG4gICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLnNvcnRTZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdSeEpzUmVzb3VyY2UnLCB0aGlzLnJ4anMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVyIChvciBkaXNwb3NlKSB0aGUgUGFnaW5hdGlvbiBDb21wb25lbnQsIHVzZXIgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBGYWxzZSAodG8gbm90IHNob3cgaXQpIHdoaWNoIHdpbGwgaW4gdGVybSBkaXNwb3NlIG9mIHRoZSBQYWdpbmF0aW9uLFxyXG4gICAqIGFsc28gd2hpbGUgZGlzcG9zaW5nIHdlIGNhbiBjaG9vc2UgdG8gb21pdCB0aGUgZGlzcG9zYWJsZSBvZiB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlIChpZiB3ZSBhcmUgc2ltcGx5IHRvZ2dsaW5nIHRoZSBQYWdpbmF0aW9uLCB3ZSB3YW50IHRvIGtlZXAgdGhlIFNlcnZpY2UgYWxpdmUpXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBzaG93UGFnaW5hdGlvbiAtIHNob3cgKG5ldyByZW5kZXIpIG9yIG5vdCAoZGlzcG9zZSkgdGhlIFBhZ2luYXRpb25cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3VsZERpc3Bvc2VQYWdpbmF0aW9uU2VydmljZSAtIHdoZW4gZGlzcG9zaW5nIHRoZSBQYWdpbmF0aW9uLCBkbyB3ZSBhbHNvIHdhbnQgdG8gZGlzcG9zZSBvZiB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlPyAoZGVmYXVsdHMgdG8gVHJ1ZSlcclxuICAgKi9cclxuICBwcml2YXRlIHJlbmRlclBhZ2luYXRpb24oc2hvd1BhZ2luYXRpb24gPSB0cnVlKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlUGFnaW5hdGlvbiAmJiAhdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgJiYgc2hvd1BhZ2luYXRpb24pIHtcclxuICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24gPSBuZXcgU2xpY2tQYWdpbmF0aW9uQ29tcG9uZW50KHRoaXMucGFnaW5hdGlvblNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcclxuICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24ucmVuZGVyUGFnaW5hdGlvbih0aGlzLmdyaWRDb250YWluZXJFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcclxuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICghc2hvd1BhZ2luYXRpb24pIHtcclxuICAgICAgaWYgKHRoaXMuc2xpY2tQYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24uZGlzcG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYWtlcyBhIGZsYXQgZGF0YXNldCB3aXRoIHBhcmVudC9jaGlsZCByZWxhdGlvbnNoaXAsIHNvcnQgaXQgKHZpYSBpdHMgdHJlZSBzdHJ1Y3R1cmUpIGFuZCByZXR1cm4gdGhlIHNvcnRlZCBmbGF0IGFycmF5XHJcbiAgICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBmbGF0RGF0YXNldElucHV0IC0gZmxhdCBkYXRhc2V0IGlucHV0XHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUdyaWRSZWZyZXNoIC0gb3B0aW9uYWxseSBmb3JjZSBhIGZ1bGwgZ3JpZCByZWZyZXNoXHJcbiAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IHNvcnQgZmxhdCBwYXJlbnQvY2hpbGQgZGF0YXNldFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFRyZWVEYXRhc2V0PFQ+KGZsYXREYXRhc2V0SW5wdXQ6IFRbXSwgZm9yY2VHcmlkUmVmcmVzaCA9IGZhbHNlKTogVFtdIHtcclxuICAgIGNvbnN0IHByZXZEYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcclxuICAgIGxldCBzb3J0ZWREYXRhc2V0UmVzdWx0O1xyXG4gICAgbGV0IGZsYXREYXRhc2V0T3V0cHV0OiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoaWVyYXJjaGljYWwgZGF0YXNldCB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCB0aGVuIG5vIG5lZWQgdG8gcmUtY29udmVydCBpdCwgd2UgY2FuIHVzZSBpdCBkaXJlY3RseSBmcm9tIHRoZSBzaGFyZWQgc2VydmljZSByZWZcclxuICAgIGlmICh0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCAmJiB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwpIHtcclxuICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLnNvcnRIaWVyYXJjaGljYWxEYXRhc2V0KHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCk7XHJcbiAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5mbGF0O1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZsYXREYXRhc2V0SW5wdXQpICYmIGZsYXREYXRhc2V0SW5wdXQubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8udHJlZURhdGFPcHRpb25zPy5pbml0aWFsU29ydCkge1xyXG4gICAgICAgIC8vIGVsc2Ugd2UgbmVlZCB0byBmaXJzdCBjb252ZXJ0IHRoZSBmbGF0IGRhdGFzZXQgdG8gYSBoaWVyYXJjaGljYWwgZGF0YXNldCBhbmQgdGhlbiBzb3J0XHJcbiAgICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0QW5kU29ydChmbGF0RGF0YXNldElucHV0LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmhpZXJhcmNoaWNhbDtcclxuICAgICAgICBmbGF0RGF0YXNldE91dHB1dCA9IHNvcnRlZERhdGFzZXRSZXN1bHQuZmxhdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBlbHNlIHdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIHByb3ZpZGVkIGFuIGFycmF5IHRoYXQgaXMgYWxyZWFkeSBzb3J0ZWQgKHVzZXIncyByZXNwb25zYWJpbGl0eSlcclxuICAgICAgICAvLyBhbmQgc28gd2UgY2FuIHNpbXBseSBjb252ZXJ0IHRoZSBhcnJheSB0byBhIHRyZWUgc3RydWN0dXJlIGFuZCB3ZSdyZSBkb25lLCBubyBuZWVkIHRvIHNvcnRcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0KGZsYXREYXRhc2V0SW5wdXQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gZmxhdERhdGFzZXRJbnB1dCB8fCBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHdlIGFkZC9yZW1vdmUgaXRlbShzKSBmcm9tIHRoZSBkYXRhc2V0LCB3ZSBuZWVkIHRvIGFsc28gcmVmcmVzaCBvdXIgdHJlZSBkYXRhIGZpbHRlcnNcclxuICAgIGlmIChmbGF0RGF0YXNldElucHV0Lmxlbmd0aCA+IDAgJiYgKGZvcmNlR3JpZFJlZnJlc2ggfHwgZmxhdERhdGFzZXRJbnB1dC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4pKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWZyZXNoVHJlZURhdGFGaWx0ZXJzKGZsYXREYXRhc2V0T3V0cHV0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmxhdERhdGFzZXRPdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3IgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIsIHdlIHByb3ZpZGUgdGhlIHByb3BlcnR5IFwiZWRpdG9yXCIgYXMgYW4gQW5ndWxhci1TbGlja2dyaWQgZWRpdG9yIGNvbXBsZXggb2JqZWN0XHJcbiAgICogaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XHJcbiAgICogc28gaW4gb3VyIGxpYiB3ZSB3aWxsIHN3YXAgXCJlZGl0b3JcIiBhbmQgY29weSBpdCBpbnRvIGEgbmV3IHByb3BlcnR5IGNhbGxlZCBcImludGVybmFsQ29sdW1uRWRpdG9yXCJcclxuICAgKiB0aGVuIHRha2UgYmFjayBcImVkaXRvci5tb2RlbFwiIGFuZCBtYWtlIGl0IHRoZSBuZXcgXCJlZGl0b3JcIiBzbyB0aGF0IFNsaWNrR3JpZCBFZGl0b3IgRmFjdG9yeSBzdGlsbCB3b3Jrc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xyXG4gICAgaWYgKGNvbHVtbkRlZmluaXRpb25zLnNvbWUoY29sID0+IGAke2NvbC5pZH1gLmluY2x1ZGVzKCcuJykpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tBbmd1bGFyLVNsaWNrZ3JpZF0gTWFrZSBzdXJlIHRoYXQgbm9uZSBvZiB5b3VyIENvbHVtbiBEZWZpbml0aW9uIFwiaWRcIiBwcm9wZXJ0eSBpbmNsdWRlcyBhIGRvdCBpbiBpdHMgbmFtZSBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZSBzb21lIHByb2JsZW1zIHdpdGggdGhlIEVkaXRvcnMuIEZvciBleGFtcGxlIGlmIHlvdXIgY29sdW1uIGRlZmluaXRpb24gXCJmaWVsZFwiIHByb3BlcnR5IGlzIFwidXNlci5maXJzdE5hbWVcIiB0aGVuIHVzZSBcImZpcnN0TmFtZVwiIGFzIHRoZSBjb2x1bW4gXCJpZFwiLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW5EZWZpbml0aW9ucy5tYXAoKGNvbHVtbjogQ29sdW1uIHwgYW55KSA9PiB7XHJcbiAgICAgIC8vIG9uIGV2ZXJ5IEVkaXRvciB0aGF0IGhhdmUgYSBcImNvbGxlY3Rpb25Bc3luY1wiLCByZXNvbHZlIHRoZSBkYXRhIGFuZCBhc3NpZ24gaXQgdG8gdGhlIFwiY29sbGVjdGlvblwiIHByb3BlcnR5XHJcbiAgICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmVkaXRvciAmJiBjb2x1bW4uZWRpdG9yLmNvbGxlY3Rpb25Bc3luYykge1xyXG4gICAgICAgIHRoaXMubG9hZEVkaXRvckNvbGxlY3Rpb25Bc3luYyhjb2x1bW4pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IC4uLmNvbHVtbiwgZWRpdG9yOiBjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0b3IubW9kZWwsIGludGVybmFsQ29sdW1uRWRpdG9yOiB7IC4uLmNvbHVtbi5lZGl0b3IgfSB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYW5zbGF0ZUNvbHVtbkhlYWRlclRpdGxlS2V5cygpIHtcclxuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1ucyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxyXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5LnRyYW5zbGF0ZUl0ZW1zKHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zLCAnbmFtZUtleScsICduYW1lJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpIHtcclxuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1uIGdyb3VwcyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxyXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5LnRyYW5zbGF0ZUl0ZW1zKHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zLCAnY29sdW1uR3JvdXBLZXknLCAnY29sdW1uR3JvdXAnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgXCJpbnRlcm5hbENvbHVtbkVkaXRvci5jb2xsZWN0aW9uXCIgcHJvcGVydHkuXHJcbiAgICogU2luY2UgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzeW5jIGNhbGwgcmVzb2x2ZXMsIHRoZSBwb2ludGVyIHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBcImNvbHVtblwiIGFyZ3VtZW50IHBhc3NlZC5cclxuICAgKiBPbmNlIHdlIGZvdW5kIHRoZSBuZXcgcG9pbnRlciwgd2Ugd2lsbCByZWFzc2lnbiB0aGUgXCJlZGl0b3JcIiBhbmQgXCJjb2xsZWN0aW9uXCIgdG8gdGhlIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIiBzbyBpdCBoYXMgbmV3ZXN0IGNvbGxlY3Rpb25cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUVkaXRvckNvbGxlY3Rpb248VCA9IGFueT4oY29sdW1uOiBDb2x1bW48VD4sIG5ld0NvbGxlY3Rpb246IFRbXSkge1xyXG4gICAgKGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yKS5jb2xsZWN0aW9uID0gbmV3Q29sbGVjdGlvbjtcclxuICAgIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBmaW5kIHRoZSBuZXcgY29sdW1uIHJlZmVyZW5jZSBwb2ludGVyICYgcmUtYXNzaWduIHRoZSBuZXcgZWRpdG9yIHRvIHRoZSBpbnRlcm5hbENvbHVtbkVkaXRvclxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jb2x1bW5EZWZpbml0aW9ucykpIHtcclxuICAgICAgY29uc3QgY29sdW1uUmVmID0gdGhpcy5jb2x1bW5EZWZpbml0aW9ucy5maW5kKChjb2w6IENvbHVtbikgPT4gY29sLmlkID09PSBjb2x1bW4uaWQpO1xyXG4gICAgICBpZiAoY29sdW1uUmVmKSB7XHJcbiAgICAgICAgY29sdW1uUmVmLmludGVybmFsQ29sdW1uRWRpdG9yID0gY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgY3VycmVudCBFZGl0b3IsIHJlbW92ZSBpdCBmcm9tIHRoZSBET00gdGhlbiByZS1lbmFibGUgaXQgYW5kIHJlLXJlbmRlciBpdCB3aXRoIHRoZSBuZXcgY29sbGVjdGlvbi5cclxuICAgIGNvbnN0IGN1cnJlbnRFZGl0b3IgPSB0aGlzLnNsaWNrR3JpZC5nZXRDZWxsRWRpdG9yKCkgYXMgQXV0b0NvbXBsZXRlRWRpdG9yIHwgU2VsZWN0RWRpdG9yO1xyXG4gICAgaWYgKGN1cnJlbnRFZGl0b3I/LmRpc2FibGUgJiYgY3VycmVudEVkaXRvcj8ucmVuZGVyRG9tRWxlbWVudCkge1xyXG4gICAgICBjdXJyZW50RWRpdG9yLmRlc3Ryb3koKTtcclxuICAgICAgY3VycmVudEVkaXRvci5kaXNhYmxlKGZhbHNlKTtcclxuICAgICAgY3VycmVudEVkaXRvci5yZW5kZXJEb21FbGVtZW50KG5ld0NvbGxlY3Rpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwic2xpY2tHcmlkQ29udGFpbmVyLXt7Z3JpZElkfX1cIiBjbGFzcz1cImdyaWRQYW5lXCI+XHJcbiAgPGRpdiBhdHRyLmlkPSd7e2dyaWRJZH19JyBjbGFzcz1cInNsaWNrZ3JpZC1jb250YWluZXJcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==