@jax-data-science/sci-image-visualizer 0.3.3 → 0.5.0

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 (98) hide show
  1. package/README.md +268 -4
  2. package/esm2022/index.mjs +21 -1
  3. package/esm2022/lib/contracts/display-types.mjs +20 -2
  4. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +66 -0
  6. package/esm2022/lib/contracts/plot-type.mjs +41 -1
  7. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -0
  8. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +45 -0
  9. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  10. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +10 -19
  11. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +71 -7
  12. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +1 -1
  13. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +96 -0
  14. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +1934 -55
  15. package/esm2022/lib/implementations/napari-js/napari-zoom.mjs +18 -0
  16. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +73 -8
  17. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +8 -1
  18. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +3 -4
  19. package/esm2022/lib/implementations/osd/osd-zoom.mjs +20 -0
  20. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +555 -0
  21. package/esm2022/lib/implementations/plotly/plotly.service.mjs +13 -7
  22. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +304 -0
  23. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +179 -0
  24. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +329 -0
  25. package/esm2022/lib/routing-visualizer.service.mjs +228 -12
  26. package/esm2022/lib/spatial/embedding-compute.mjs +142 -0
  27. package/esm2022/lib/spatial/gene-search.mjs +77 -0
  28. package/esm2022/lib/spatial/spatial-density.mjs +224 -0
  29. package/esm2022/lib/spatial/spatial-encoding.mjs +232 -0
  30. package/esm2022/lib/spatial/spatial-expression.mjs +257 -0
  31. package/esm2022/lib/spatial/spatial-framing.mjs +60 -0
  32. package/esm2022/lib/spatial/spatial-heatmap.mjs +185 -0
  33. package/esm2022/lib/spatial/spatial-hover.mjs +79 -0
  34. package/esm2022/lib/spatial/spatial-sections.mjs +96 -0
  35. package/esm2022/lib/spatial/spatial-selection.mjs +264 -0
  36. package/esm2022/lib/spatial/spatial-volume-image.mjs +163 -0
  37. package/esm2022/lib/spatial/tsne-worker.mjs +10 -0
  38. package/esm2022/lib/spatial/world-grid.mjs +77 -0
  39. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +1278 -0
  40. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +621 -0
  41. package/esm2022/lib/store/spatial-selection.service.mjs +47 -0
  42. package/esm2022/lib/store/visualizer-store.service.mjs +23 -1
  43. package/esm2022/lib/toolbar/toolbar.component.mjs +61 -21
  44. package/esm2022/lib/visualization.module.mjs +23 -5
  45. package/esm2022/lib/visualizer.component.mjs +527 -44
  46. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs} +6 -4
  47. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map} +1 -1
  48. package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs +12 -0
  49. package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs.map +1 -0
  50. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +15971 -7808
  51. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  52. package/fesm2022/tsne.worker.js +19091 -0
  53. package/index.d.ts +16 -0
  54. package/lib/contracts/display-types.d.ts +131 -0
  55. package/lib/contracts/image.contract.d.ts +7 -0
  56. package/lib/contracts/plot-type-contribution.contract.d.ts +172 -0
  57. package/lib/contracts/plot-type.d.ts +52 -2
  58. package/lib/contracts/ports/spatial-data.port.d.ts +90 -0
  59. package/lib/contracts/spatial-dataset.contract.d.ts +281 -0
  60. package/lib/contracts/visualizer.contract.d.ts +104 -1
  61. package/lib/implementations/napari-js/napari-axes-labels.d.ts +9 -7
  62. package/lib/implementations/napari-js/napari-region-overlay.d.ts +38 -4
  63. package/lib/implementations/napari-js/napari-scale-bar.d.ts +7 -3
  64. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +32 -0
  65. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +497 -16
  66. package/lib/implementations/napari-js/napari-zoom.d.ts +15 -0
  67. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +21 -0
  68. package/lib/implementations/osd/osd-coordinate-transform.d.ts +6 -0
  69. package/lib/implementations/osd/osd-zoom.d.ts +19 -0
  70. package/lib/implementations/plotly/omics-trace-builders.d.ts +193 -0
  71. package/lib/implementations/plotly/plotly.service.d.ts +9 -0
  72. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +123 -0
  73. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +115 -0
  74. package/lib/plot-mode/plot-mode-controller.d.ts +130 -0
  75. package/lib/routing-visualizer.service.d.ts +49 -6
  76. package/lib/spatial/embedding-compute.d.ts +73 -0
  77. package/lib/spatial/gene-search.d.ts +48 -0
  78. package/lib/spatial/spatial-density.d.ts +73 -0
  79. package/lib/spatial/spatial-encoding.d.ts +155 -0
  80. package/lib/spatial/spatial-expression.d.ts +144 -0
  81. package/lib/spatial/spatial-framing.d.ts +37 -0
  82. package/lib/spatial/spatial-heatmap.d.ts +111 -0
  83. package/lib/spatial/spatial-hover.d.ts +49 -0
  84. package/lib/spatial/spatial-sections.d.ts +59 -0
  85. package/lib/spatial/spatial-selection.d.ts +113 -0
  86. package/lib/spatial/spatial-volume-image.d.ts +67 -0
  87. package/lib/spatial/tsne-worker.d.ts +7 -0
  88. package/lib/spatial/world-grid.d.ts +58 -0
  89. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +439 -0
  90. package/lib/spatial-controls/spatial-controls.component.d.ts +257 -0
  91. package/lib/store/spatial-selection.service.d.ts +27 -0
  92. package/lib/store/visualizer-store.service.d.ts +13 -0
  93. package/lib/toolbar/toolbar.component.d.ts +36 -8
  94. package/lib/visualization.module.d.ts +28 -24
  95. package/lib/visualizer.component.d.ts +139 -7
  96. package/package.json +6 -2
  97. package/src/lib/assets/spatial-omics-3d.svg +31 -0
  98. package/src/lib/assets/spatial-omics.svg +27 -0
@@ -322,7 +322,11 @@ export class PlotlyService {
322
322
  // Region-based line ROIs, available in HEATMAP/IMAGE mode.
323
323
  const impl = PLOTLY_PLOT_TYPE_IMPLS[plotType];
324
324
  if (impl) {
325
- this.imageInfo.isGrayscale = !!imageInfo.isGrayscale;
325
+ // Guarded: `imageInfo` is declared with a definite-assignment assertion, so
326
+ // nothing stops it being unset at runtime — a plot driven while no image is
327
+ // loaded reached here and threw on the assignment.
328
+ if (this.imageInfo)
329
+ this.imageInfo.isGrayscale = !!imageInfo.isGrayscale;
326
330
  return this.plotViaRegistry(plotDiv, impl, this.buildTraceInput(imageInfo, imageLoaded, trueImageSize), screenHeight, inPlace);
327
331
  }
328
332
  if (imageInfo.isGrayscale) {
@@ -972,7 +976,8 @@ export class PlotlyService {
972
976
  }
973
977
  }
974
978
  setEvents(plotDiv, isGrayscale, screenHeight) {
975
- this.imageInfo.isGrayscale = isGrayscale;
979
+ if (this.imageInfo)
980
+ this.imageInfo.isGrayscale = isGrayscale;
976
981
  this.screenHeight = screenHeight;
977
982
  const plot = document.getElementById(plotDiv);
978
983
  if (plot) {
@@ -1027,7 +1032,7 @@ export class PlotlyService {
1027
1032
  }
1028
1033
  });
1029
1034
  this.zoomCoordinates = coordinates;
1030
- if (!this.imageInfo.showStack) {
1035
+ if (!this.imageInfo?.showStack) {
1031
1036
  this.triggerZoom(coordinates);
1032
1037
  }
1033
1038
  }
@@ -1310,7 +1315,7 @@ export class PlotlyService {
1310
1315
  const xRatio = rect.width / image.width;
1311
1316
  const yRatio = rect.height / image.height;
1312
1317
  if (this.fileName === reqName) {
1313
- const isGray = this.imageInfo.isGrayscale;
1318
+ const isGray = this.imageInfo?.isGrayscale;
1314
1319
  const frame = isGray
1315
1320
  ? this.plotUtilities.arrayToMatrix(image.grey().data, image.width)
1316
1321
  : this.plotUtilities.arrayToMatrix(image.getPixelsArray(), image.width);
@@ -1363,7 +1368,7 @@ export class PlotlyService {
1363
1368
  setImageInfo(showStack, scaleratio) {
1364
1369
  // Build a partial image descriptor and push it to the host via the port.
1365
1370
  const imgInfo = {
1366
- isGrayscale: this.imageInfo.isGrayscale,
1371
+ isGrayscale: this.imageInfo?.isGrayscale,
1367
1372
  trueImageSize: [this.trueImgSize[1], this.trueImgSize[3]],
1368
1373
  urls: this.urls,
1369
1374
  isStack: this.urls.length > 1,
@@ -1905,7 +1910,8 @@ export class PlotlyService {
1905
1910
  if (!showstack) {
1906
1911
  this.zIndex.next(0);
1907
1912
  }
1908
- this.imageInfo.showStack = showstack;
1913
+ if (this.imageInfo)
1914
+ this.imageInfo.showStack = showstack;
1909
1915
  this.stackLoading$.next(showstack);
1910
1916
  Plotly.relayout(this.plotDiv, { 'showstack': showstack });
1911
1917
  }
@@ -2135,4 +2141,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
2135
2141
  type: Inject,
2136
2142
  args: [CELL_SEGMENTER]
2137
2143
  }] }, { type: i9.VertexEraserToolService }, { type: i10.ZoomToBoxToolService }, { type: i11.VisualizerStore }, { type: i12.RegionStore }] });
2138
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdGx5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sS0FBSyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFnQixhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxPQUFPLEVBQW1CLGVBQWUsRUFBZ0IsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxP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Q0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSztlQUMxQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWpGLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO1FBQ2hGLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFckMsTUFBTSxLQUFLLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsMEVBQTBFO1FBQzFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFekUsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNyQixNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN4QixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUYsOEVBQThFO1FBRTlFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5DLDJFQUEyRTtRQUMzRSw4RUFBOEU7UUFDOUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCx5RUFBeUU7SUFDakUsaUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFTLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRDt1REFDbUQ7SUFDM0MsWUFBWTtRQUNsQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNSLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztTQUNmLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0NBQWdDLENBQUMsTUFBYztRQUNyRCw4RUFBOEU7UUFDOUUsd0VBQXdFO1FBQ3hFLE1BQU0sSUFBSSxHQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ2xDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4QyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlCQUFpQixDQUFDLE1BQWEsRUFBRSxNQUFnQixFQUFFLFNBQTJCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQXFCLEVBQUUsTUFBYztRQUN4RSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNO1lBQUUsT0FBTztRQUNyQyx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBZ0IsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNuRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNyRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDhCQUE4QixDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFDbkQsTUFBYztRQUNsRCxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUM7WUFBRSxPQUFPO1FBQ3RDLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM1QixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdELDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUQsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7b0JBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPO3dCQUFFLE9BQU87b0JBQ3RDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztvQkFDN0MsTUFBTSxLQUFLLEdBQUcsTUFBTTt3QkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQzt3QkFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUNsRixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFpRSxDQUFDO1NBQy9FLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUIsQ0FBQyxJQUFTO1FBQ3ZDLE1BQU0sS0FBSyxHQUFxQixFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0MsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDeEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDekMsMkVBQTJFO1FBQzNFLDZFQUE2RTtRQUM3RSx5RUFBeUU7UUFDekUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQztRQUNoQyxNQUFNLE9BQU8sR0FBRyxVQUFVO1lBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDMUIsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLDBFQUEwRTtZQUMxRSxxREFBcUQ7WUFDckQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDekYsQ0FBQztZQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVEOztrRkFFOEU7SUFDdEUsVUFBVTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUN2QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsSUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxJQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUMxQixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQzVCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGlCQUFpQixFQUFFLEtBQUs7YUFBRSxDQUMzQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxhQUF3QjtRQUN0QyxJQUFJLE9BQU8sQ0FBQztRQUNaLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsT0FBTyxHQUFHLGFBQWEsQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixpRUFBaUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsSUFBSSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUMxQyxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQ2pELENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2xELENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUksc0JBQXNCO2dCQUNuRixDQUFDO3FCQUFNLENBQUM7b0JBQ04seUZBQXlGO29CQUN6RixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUNqRCxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsVUFBVSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsTUFBTSxFQUFDO21EQUM1RSxHQUFHO2tEQUNKLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxnQ0FBZ0M7Z0JBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxPQUFlLEVBQUUsV0FBb0IsRUFBRSxZQUFvQjtRQUMzRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1Qsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbEUsaUJBQWlCO1lBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWpELHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBVTtRQUNyQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2pDLENBQUM7UUFDRCw2QkFBNkI7UUFDN0IsdUNBQXVDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUN4QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pELE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQzVDLElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO3dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzlGLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDbEUsQ0FBQztvQkFDRCxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQiw0RUFBNEU7WUFDNUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUNELHVEQUF1RDtRQUN2RCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN6QyxNQUFNLFdBQVcsR0FBVSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDakIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7b0JBQ25DLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLENBQUM7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7b0JBQ25DLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO1FBQ0Qsd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQWUsQ0FBQztZQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsc0VBQXNFO2dCQUN0RSxpRUFBaUU7Z0JBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO29CQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7d0JBQ2pELFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7d0JBQ2xDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxFQUFFO3dCQUNqRCxZQUFZLEVBQUUsVUFBVTtxQkFDekIsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUNELHlFQUF5RTtZQUN6RSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDO1FBQ0QsZUFBZTtRQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ3pFLHVFQUF1RTtZQUN2RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3RELHNHQUFzRztZQUN0RyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUNELG9DQUFvQztRQUNwQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckUsOENBQThDO1lBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBR0QsdUVBQXVFO0lBRWhFLFdBQVcsQ0FBQyxNQUFlLEVBQUUsVUFBdUIsRUFBRTtRQUMzRCwyRUFBMkU7UUFDM0UsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sY0FBYyxDQUFDLE9BQW9CO1FBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxxQkFBcUI7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBZSxFQUFFLFVBQXdCLEVBQUU7UUFDN0QseUVBQXlFO1FBQ3pFLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxPQUFxQjtRQUMxQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU0sbUJBQW1CLENBQUMsTUFBZTtRQUN4QyxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxNQUFjO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE1BQWU7UUFDckMsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UsOEVBQThFO1FBQzlFLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCx3RUFBd0U7SUFDaEUsaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQzFCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUM5QixXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUN4RCxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1NBQ3hELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDswRUFDc0U7SUFDL0QsaUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNNLHlCQUF5QjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDTSxXQUFXLENBQUMsRUFBVTtRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ00sZUFBZSxDQUFDLE1BQWU7UUFDcEMsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDTSxlQUFlLEtBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsY0FBYyxLQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTVEOzs7O09BSUc7SUFDSDtpRkFDNkU7SUFDckUsa0JBQWtCLENBQUMsRUFBVSxFQUFFLEVBQVU7UUFDL0MsTUFBTSxFQUFFLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDbkMsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ2hGLENBQUM7SUFFTyxjQUFjLENBQUMsV0FBcUI7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDNUIsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQzthQUMxQixDQUFDLENBQUM7UUFDWixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRCx1RUFBdUU7SUFFdkUsMkRBQTJEO0lBQ3BELG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDckUsQ0FBQztJQUVELDBFQUEwRTtJQUNuRSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELHVFQUF1RTtJQUV2RSxzRUFBc0U7SUFDOUQsa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEYsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQzlCLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzVCLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQzlCLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1NBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLEVBQUU7SUFDRiwrRUFBK0U7SUFDL0UsK0VBQStFO0lBQy9FLG9FQUFvRTtJQUNwRSw0RUFBNEU7SUFDNUUsbUNBQW1DO0lBRW5DLGlGQUFpRjtJQUN6RSxtQkFBbUI7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDM0MsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDtnRUFDNEQ7SUFDcEQsbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxtQkFBbUI7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU07YUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQzdFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUk7Z0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUk7Z0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksaUJBQWlCO1FBQ3RCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUM7SUFFRCxvREFBb0Q7SUFDNUMsZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUUsTUFBTSxFQUFFLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsTUFBTSxZQUFZLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDM0QsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxvQkFBb0I7UUFDbEIsT0FBTztZQUNMLGtCQUFrQixFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1lBQ25FLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtTQUNwRCxDQUFDO0lBQ0osQ0FBQztJQUVNLGtCQUFrQixDQUFDLElBQVk7UUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFTLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFTLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxXQUFxQjtRQUN2QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQzFELElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsT0FBTztRQUNULENBQUM7UUFDRCw0RUFBNEU7UUFDNUUsOENBQThDO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sU0FBUyxHQUFVLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0QixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ25DLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEMsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0JBQ3BGLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO29CQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7b0JBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDMUMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO3dCQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQzt3QkFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTTs0QkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQzs0QkFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFFLG9FQUFvRTt3QkFDcEUscUVBQXFFO3dCQUNyRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNoRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ3BCLGdFQUFnRTt3QkFDaEUsZ0VBQWdFO3dCQUNoRSxpRUFBaUU7d0JBQ2pFLGNBQWM7d0JBQ2QsTUFBTSxJQUFJLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJOzRCQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dDQUNuQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO2dDQUN2QyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTzs2QkFDdEQsRUFBRSxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDOzRCQUNyQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dDQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQztnQ0FDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUMvRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7d0JBQ3pELGtFQUFrRTt3QkFDbEUsK0RBQStEO3dCQUMvRCxxQ0FBcUM7d0JBQ3JDLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDO3dCQUM3RCxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTs0QkFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNsQyxLQUFLLEdBQUcsSUFBSSxDQUFDOzRCQUNiLElBQUksWUFBWTtnQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUM3QyxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDZCxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxVQUFVLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsRixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLGtCQUFrQjtvQkFDNUcsTUFBTSxFQUFDLDhDQUE4QyxHQUFHOzsrREFFRCxFQUFFLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDbEMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxXQUFXLENBQUMsUUFBa0I7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVPLFlBQVksQ0FBQyxTQUFtQixFQUFFLFVBQW9CO1FBQzVELHlFQUF5RTtRQUN6RSxNQUFNLE9BQU8sR0FBd0I7WUFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVztZQUN2QyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDN0IsVUFBVSxFQUFFLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVU7U0FDcEUsQ0FBQztRQUNGLElBQUksU0FBUyxLQUFLLFNBQVM7WUFBRSxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzRCxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksY0FBYyxDQUFDLFNBQXFCO1FBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsaUZBQWlGO0lBQzFFLHNCQUFzQjtRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFTO1FBQ25CLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQztJQUMzRSxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVM7UUFDakIsT0FBTyxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxVQUFVLENBQUMsT0FBaUIsRUFBRSxlQUF5QixFQUM1QyxjQUF3QixFQUFFLFNBQWtCLEVBQzVDLFNBQWtCLEtBQUs7UUFDdkMsTUFBTSxTQUFTLEdBQUcsZUFBZSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDekcsTUFBTSxJQUFJLEdBQUcsY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1FBRWxGLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUU1QixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsNkVBQTZFO1lBQzdFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO2FBQU0sQ0FBQztZQUNOLHNFQUFzRTtZQUN0RSx3REFBd0Q7WUFDeEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JHLElBQUksQ0FBQztnQkFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQVEsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ25GLENBQUM7SUFDSCxDQUFDO0lBRUQ7d0VBQ29FO0lBQzVELGNBQWMsQ0FBQyxVQUFpQjtRQUN0QyxPQUFPO1lBQ0wsTUFBTSxFQUFFLFVBQVU7WUFDbEIsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQUU7U0FDNUQsQ0FBQztJQUNKLENBQUM7SUFFRDt5QkFDcUI7SUFDYixZQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFRLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMscUVBQXFFLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksa0JBQWtCO1FBQ3ZCLHVEQUF1RDtRQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBd0I7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLHdFQUF3RTtJQUNqRSxJQUFJLEtBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxLQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sS0FBYyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sS0FBYyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELFdBQVcsS0FBMEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxXQUFXLEtBQTBCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0UsZ0JBQWdCLEtBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV4RSw0RUFBNEU7SUFDckUsY0FBYyxDQUFDLE1BQTZCLEVBQUUsUUFBaUIsRUFDaEQsVUFBMEM7UUFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ00sYUFBYSxLQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNELFdBQVcsS0FBYyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ00sZUFBZSxDQUFDLENBQVMsSUFBVSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsZUFBZSxLQUFlLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUUsa0JBQWtCLEtBQTRCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1RixnQkFBZ0IsQ0FBQyxNQUFnQixFQUFFLE1BQWdCO1FBQ3pELE9BQU87WUFDTCxLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLE9BQU87Z0JBQ2xCLGVBQWUsRUFBRSxRQUFRO2dCQUN6QixJQUFJLEVBQUUsS0FBSztnQkFDWCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxLQUFLLEVBQUUsTUFBTTthQUNkO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixlQUFlLEVBQUUsUUFBUTtnQkFDekIsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsVUFBVSxFQUFFLElBQUk7Z0JBQ3BCLG9GQUFvRjtnQkFDcEYsU0FBUyxFQUFFLEtBQUs7Z0JBQ1osV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSzthQUM1QztZQUNBLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3pCLE9BQU8sRUFBRSxDQUFDO29CQUNSLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7b0JBQ2QsWUFBWSxFQUFFO3dCQUNaLE9BQU8sRUFBRSxJQUFJO3dCQUNiLE1BQU0sRUFBRSxVQUFVO3dCQUNsQixPQUFPLEVBQUUsT0FBTztxQkFDakI7b0JBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7aUJBQ3ZCLENBQUM7WUFDRixRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RFLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQzNELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQy9DLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtTQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxTQUFrQjtRQUN2QyxNQUFNLGNBQWMsR0FBcUIsRUFBRSxDQUFDO1FBQzVDLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDckUsWUFBWTtnQkFDWixJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLEtBQUssQ0FBQyxLQUFLLEdBQUc7d0JBQ1osSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTt3QkFDdkIsWUFBWSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTt3QkFDL0IsWUFBWSxFQUFFLFVBQVU7d0JBQ3hCLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUU7cUJBQ3ZDLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixDQUFDO2dCQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7UUFDRCx1REFBdUQ7UUFDdkQsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRDs7Ozs7O09BTUc7SUFDSyxnQkFBZ0IsQ0FBQyxNQUFnQixFQUFFLE1BQWdCLEVBQUUsTUFBYztRQUN6RSxPQUFPO1lBQ0wsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNsQyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFO29CQUNMLFNBQVMsRUFBRSxvQkFBb0I7b0JBQy9CLGFBQWEsRUFBRSxvQkFBb0I7b0JBQ25DLGNBQWMsRUFBRSxJQUFJO29CQUNwQixlQUFlLEVBQUUsbUJBQW1CO29CQUNwQyxnQkFBZ0I7aUJBQ2pCO2dCQUNELEtBQUssRUFBRTtvQkFDTCxTQUFTLEVBQUUsb0JBQW9CO29CQUMvQixhQUFhLEVBQUUsb0JBQW9CO29CQUNuQyxjQUFjLEVBQUUsSUFBSTtvQkFDcEIsZUFBZSxFQUFFLG9CQUFvQjtvQkFDckMseUJBQXlCO29CQUN6QixpQkFBaUI7b0JBQ2pCLG1CQUFtQjtpQkFDcEI7Z0JBQ0QsS0FBSyxFQUFFO29CQUNMLFNBQVMsRUFBRSxvQkFBb0I7b0JBQy9CLGFBQWEsRUFBRSxvQkFBb0I7b0JBQ25DLGNBQWMsRUFBRSxJQUFJO29CQUNwQixlQUFlLEVBQUUsbUJBQW1CO2lCQUNyQztnQkFDRCxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRTtnQkFDdEMsVUFBVSxFQUFFLFFBQVE7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFDO3dCQUNSLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7d0JBQ2QsWUFBWSxFQUFFOzRCQUNaLE9BQU8sRUFBRSxJQUFJOzRCQUNiLE1BQU0sRUFBRSxVQUFVOzRCQUNsQixPQUFPLEVBQUUsT0FBTzt5QkFDakI7d0JBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7cUJBQ3ZCLENBQUM7YUFDSDtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sUUFBUTtRQUNkLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUNaLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzVFLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFXO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FDcEQsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxlQUFlO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxxQkFBcUI7UUFFMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDL0IsTUFBTSxFQUFFLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRW5ELHlCQUF5QjtRQUN6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFcEMsTUFBTSxLQUFLLEdBQVksS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzVCLElBQUksTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM5QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRTlCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMzQixxREFBcUQ7WUFDckQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxNQUFNLElBQUksR0FBRyxJQUFJLGlCQUFpQixDQUFDLEtBQUssR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQy9CLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztvQkFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLGtEQUFrRDtZQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLGlCQUFpQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztZQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxzQkFBc0I7UUFDM0IsTUFBTSxFQUFFLEdBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM1RSxNQUFNLEVBQUUsR0FBeUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQy9ELE1BQU0sRUFBRSxHQUF5QixFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDL0QsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDYixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVDQUF1QztZQUMxRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkMsT0FBTztZQUNMLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN0QixDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBYSxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUztRQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQ7c0VBQ2tFO0lBQzNELGVBQWU7UUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLE1BQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNyRyxDQUFDO0lBQ0gsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFvQjtRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUUsSUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQiw4RkFBOEY7UUFDOUYsa0ZBQWtGO1FBQ2xGLHVGQUF1RjtRQUN2RiwwRkFBMEY7UUFDMUYsMEZBQTBGO1FBQzFGLHdFQUF3RTtRQUN4RSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQWdELENBQUM7UUFDaEcsSUFBSSxDQUFDLEVBQUUsRUFBRSxXQUFXO1lBQUUsT0FBTztRQUM3QixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7a0VBQzhEO0lBQ3ZELG1CQUFtQixDQUFDLFFBQWlCO1FBQzFDLDRDQUE0QztJQUM5QyxDQUFDO0lBRUQ7cUZBQ2lGO0lBQzFFLHdCQUF3QixDQUFDLFFBQWlCO1FBQy9DLG1EQUFtRDtJQUNyRCxDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDMUIsTUFBTSxFQUFFLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLEVBQUUsRUFBRSxXQUFXO1lBQUUsT0FBTztRQUM3QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUNoQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUNoQyw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLO1lBQUUsT0FBTztRQUNyQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDNUIsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUU7WUFDMUMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUU7U0FDcEMsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUI7UUFDdEIsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxpRUFBaUU7UUFDakUsTUFBTSxFQUFFLEdBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUU1RSx1RUFBdUU7UUFDdkUsNkVBQTZFO1FBQzdFLHdCQUF3QjtRQUN4QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQztZQUMvRCxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxHQUFHLENBQUM7Z0JBQUUsT0FBTztZQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsMEVBQTBFO1FBQzFFLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFckMsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSw2QkFBNkI7UUFDN0IsSUFBSSxFQUFFLEVBQUUsV0FBVztZQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDcEUsSUFBSSxFQUFFLEVBQUUsV0FBVztvQkFBRyxNQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBK0IsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLE1BQU0sRUFBRSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxFQUFFLEVBQUUsV0FBVztZQUFFLE9BQU87UUFDN0IsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDaEMsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUs7WUFBRSxPQUFPO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUM1QixnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRTtZQUMxQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRTtTQUNwQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUNNLGVBQWUsQ0FBQyxZQUFxQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ00sd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxzRUFBc0U7SUFDdEUseUVBQXlFO0lBQ3pFLDBCQUEwQjtJQUMxQixrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUNELFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxlQUFlLENBQUMsVUFBZTtRQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsa0VBQWtFLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQTJCO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBa0I7UUFDN0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFTLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QixDQUFDLE9BQWlCO1FBQzlDLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQzthQUMxQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUNwQixFQUFFLENBQUMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLElBQUksQ0FBQztvQkFBRSxNQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxZQUFZLENBQUMsTUFBYztRQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVELE1BQU0sRUFBRSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELElBQUksRUFBRSxFQUFFLFdBQVcsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLEVBQUUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO2dCQUN2QyxJQUFJLENBQUM7b0JBQUUsTUFBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixNQUFNLEVBQUUsR0FBUSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxNQUFNLEdBQUcsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDO1FBQy9DLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsU0FBUyxDQUFDLE1BQWM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUNELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQ7NEVBQ3dFO0lBQ2hFLG1CQUFtQixDQUFDLFFBQWUsRUFBRSxHQUFZLEVBQUUsR0FBWTtRQUNyRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUM3RCxxRUFBcUU7UUFDckUsTUFBTSxNQUFNLEdBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2xELElBQUksVUFBVSxJQUFJLElBQUk7WUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLHdCQUF3QjtRQUNoRixJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1Asd0ZBQXdGO1lBQ3hGLE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFVBQVU7Z0JBQ3JDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLE9BQU87Z0JBQ2xDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUN2QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztnQkFDckIsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUNyQixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUNyQixNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxvREFBb0Q7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs4RUFDMEU7SUFDMUUsWUFBWSxDQUFDLFlBQW9CLEVBQUUsS0FBYTtRQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFHO2dCQUFFLFNBQVM7WUFDbkIsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFTLENBQUM7Z0JBQ2QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLENBQUMsR0FBRyxZQUFZLElBQUksQ0FBQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTTt3QkFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7d0JBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELENBQUM7cUJBQU0sQ0FBQztvQkFDTixDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNYLENBQUM7Z0JBQ0QsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUFNLElBQUksQ0FBQyxHQUFHLEdBQUc7b0JBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7K0VBRTJFO0lBQzNFLGFBQWEsQ0FBQyxZQUFvQixFQUFFLElBQVk7UUFDOUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7c0ZBQ2tGO0lBQ2xGLFVBQVU7UUFDUixPQUFPLENBQUMsSUFBSSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFrQjtRQUM5QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFpQjtRQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQWlCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNoQyxDQUFDOzhHQXJwRVUsYUFBYSxrQkE4SEosZ0JBQWdCLGFBQ2hCLGdCQUFnQixzUUFRSixjQUFjO2tIQXZJbkMsYUFBYSxjQUZaLE1BQU07OzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkErSGMsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUN2QixNQUFNOzJCQUFDLGdCQUFnQjs7MEJBUXZCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0ICogYXMgUGxvdGx5IGZyb20gJ3Bsb3RseS5qcy1kaXN0LW1pbic7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBQb2x5Z29uLCBSZWN0YW5nbGUsIFJlZ2lvbiB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IElJbWFnZUluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFRpbGVBY2Nlc3NQb3J0LCBUSUxFX0FDQ0VTU19QT1JUIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHsgSW1hZ2VTdGF0ZVBvcnQsIElNQUdFX1NUQVRFX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvaW1hZ2Utc3RhdGUucG9ydCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIEVNUFRZLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFNoYXBlU2VsZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NoYXBlJztcbmltcG9ydCB7IENPTkZJRywgQ09ORklHX1NVUkZBQ0UsIFBsb3RVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi9wbG90LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBXYW5kU2VydmljZSwgV2FuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlZEltYWdlRGF0YSwgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtVG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxsLXNlZ21lbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyLCBDRUxMX1NFR01FTlRFUiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgeyBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSwgVmVydGV4RXJhc2VyVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9vbVRvQm94VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBwYXJzZVN2Z1BhdGhQb2x5Z29uLFxuICB2ZXJ0aWNlc1RvU3ZnUGF0aCxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlb21ldHJ5JztcbmltcG9ydCB7IFBsb3RUeXBlLCBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHtcbiAgUExPVExZX1BMT1RfVFlQRV9JTVBMUyxcbiAgUGxvdGx5UGxvdFR5cGVJbXBsLFxuICBUcmFjZUJ1aWxkSW5wdXQsXG59IGZyb20gJy4vcGxvdGx5LXRyYWNlLWJ1aWxkZXJzJztcbmltcG9ydCB7IElWaXN1YWxpemVyLCBJbnRlbnNpdHlQcm9maWxlLCBJSXNvc3VyZmFjZUNvbnRyb2xzLCBJSW50ZW5zaXR5Q29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidDYwMUx1bWluYW5jZSwgaGlzdG9ncmFtMjU2IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ludGVuc2l0eSc7XG5pbXBvcnQgeyBWaWV3ZXJDYXBhYmlsaXRpZXMsIFZpZXdlckZlYXR1cmUsIGNhcGFiaWxpdGllc09mIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBQbG90bHlSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9wbG90bHktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgSUNvb3JkaW5hdGVUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29vcmRpbmF0ZS10cmFuc2Zvcm0uY29udHJhY3QnO1xuaW1wb3J0IHsgUGxvdGx5Q29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4vcGxvdGx5LWNvb3JkaW5hdGUtdHJhbnNmb3JtJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFZJWl9BTEVSVF9UT0FTVF9LRVkgfSBmcm9tICcuLi8uLi90b2FzdC1vdXRsZXRzJztcblxuLy8gUmUtZXhwb3J0ZWQgc28gZXhpc3RpbmcgY29uc3VtZXJzIGNhbiBrZWVwIGltcG9ydGluZyBQbG90VHlwZSBmcm9tIHRoaXNcbi8vIG1vZHVsZSB3aGlsZSBpdCBwaHlzaWNhbGx5IGxpdmVzIGluIHRoZSBiYWNrZW5kLW5ldXRyYWwgY29udHJhY3RzLyBkaXIuXG4vLyBUT0RPKHBsb3R0aW5nLWFic3RyYWN0aW9uKTogb25jZSBhbGwgY29uc3VtZXJzIGltcG9ydCBmcm9tXG4vLyAnLi9jb250cmFjdHMvcGxvdC10eXBlJyBkaXJlY3RseSwgZHJvcCB0aGlzIHJlLWV4cG9ydC5cbmV4cG9ydCB7IFBsb3RUeXBlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5cblxuKHdpbmRvdyBhcyBhbnkpLkJ1ZmZlciA9IEJ1ZmZlcjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGxvdGx5U2VydmljZSBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcblxuICAvKipcbiAgICogUGxvdGx5IGlzIHRoZSBmdWxsLWZlYXR1cmVkIGRhdGEgYmFja2VuZDogaXQgc3VwcG9ydHMgZXZlcnkgZmVhdHVyZSxcbiAgICogaW5jbHVkaW5nIDNEIHNjZW5lcywgbGl2ZSBzY2FsYXIgY29sb3JtYXBzLCBwaXhlbCByZWFkYmFjayBhbmQgdGhlXG4gICAqIHNlcnZlci1zaWRlIGhpZ2gtZGVmIHpvb20gcmUtZmV0Y2guIChPcGVuU2VhZHJhZ29uJ3Mgc3R1YiBhZHZlcnRpc2VzIG9ubHlcbiAgICogaW1hZ2UgZGlzcGxheS4pXG4gICAqL1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc09mKFtcbiAgICBWaWV3ZXJGZWF0dXJlLkltYWdlRGlzcGxheSxcbiAgICBWaWV3ZXJGZWF0dXJlLlN1cmZhY2UzRCxcbiAgICBWaWV3ZXJGZWF0dXJlLlNjYWxhckNvbG9ybWFwLFxuICAgIFZpZXdlckZlYXR1cmUuUGl4ZWxSZWFkYmFjayxcbiAgICBWaWV3ZXJGZWF0dXJlLkhpZ2hEZWZab29tLFxuICAgIFZpZXdlckZlYXR1cmUuU3RhY2tTbGlkZXIsXG4gICAgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlLFxuICBdKTtcblxuICBwcml2YXRlIHNoYXBlczogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBwcmV2aW91c1NoYXBlczogU2hhcGVTZWxlY3Rpb25bXSA9IFtdO1xuICBwcml2YXRlIGlzUmVnaW9uU2F2ZWRPbiA9IHRydWU7XG4gIHByaXZhdGUgaW1hZ2VMZW5ndGghOiBudW1iZXI7XG4gIHByaXZhdGUgc2NyZWVuSGVpZ2h0ITogbnVtYmVyO1xuICBwcml2YXRlIHBsb3REaXYhOiBzdHJpbmc7XG4gIHByaXZhdGUgaXNSZWFsWm9vbSA9IHRydWU7XG4gIHByaXZhdGUgc2NhbGVyYXRpbyA9IHRydWU7XG4gIHByaXZhdGUgdHJ1ZUltZ1NpemUhOiBudW1iZXJbXTtcbiAgcHJpdmF0ZSB6b29tQ29vcmRpbmF0ZXM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZmlsZU5hbWUhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBkcmFnTW9kZSE6IHN0cmluZztcbiAgLy8gUmVnaW9uIGRhdGEgKHRoZSBsaXN0ICsgcGVyLWltYWdlIGNhY2hlKSwgc2VsZWN0aW9uLCBpZCBtaW50aW5nLCB0aGUgcmVnaW9uXG4gIC8vIHVwZGF0ZSBldmVudCBhbmQgdGhlIHNoYXBlIGNvbG91ci9sYWJlbCBwcmVmcyBub3cgbGl2ZSBpbiB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIChpbmplY3RlZCBhcyBgdGhpcy5yZWdpb25TdG9yZWApIOKAlCB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuICAvLyBib3RoIGJhY2tlbmRzIGRlbGVnYXRlIHRvLiBgdGhpcy5zaGFwZXNgIGJlbG93IGlzIGtlcHQgYXMgUGxvdGx5J3MgKnJlbmRlclxuICAvLyBwcm9qZWN0aW9uKiBvZiB0aG9zZSByZWdpb25zICh0aGUgZGljdCBhcnJheSBQbG90bHkucmVsYXlvdXQgY29uc3VtZXMpIGFuZFxuICAvLyBpcyBtaXJyb3JlZCBpbnRvIHRoZSBzdG9yZSBvbiBldmVyeSB3cml0ZS4gQ29sb3JtYXAsIHJldmVyc2Utc2NhbGUsIGltYWdlXG4gIC8vIG1ldGFkYXRhIGFuZCBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmVcbiAgLy8gKGluamVjdGVkIGFzIGB0aGlzLnN0b3JlYCkuXG4gIHByaXZhdGUgdXJscyE6IHN0cmluZ1tdO1xuICBpbWFnZUluZm8hOiBJSW1hZ2VJbmZvO1xuICBwcml2YXRlIHBsb3RVdGlsaXRpZXMgPSBuZXcgUGxvdFV0aWxpdGllcygpO1xuICBwcml2YXRlIHBsb3RUeXBlITogUGxvdFR5cGU7XG5cbiAgcHJpdmF0ZSBvblBsb3RNb3VzZURvd246ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChyZWdpb25zQnlJbWFnZUtleS9jdXJyZW50SW1hZ2VLZXkpIG5vdyBsaXZlcyBpblxuICAvLyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlOyBzZXRBY3RpdmVJbWFnZSgpIGRlbGVnYXRlcyB0byBpdCBhbmQgcmUtcHJvamVjdHNcbiAgLy8gYHRoaXMuc2hhcGVzYCBmcm9tIHRoZSBzdG9yZSBhZnRlcndhcmRzLlxuXG4gIC8qKiBQaXhlbCBkYXRhIGNhY2hlZCBmb3Igd2FuZCBzYW1wbGluZy4gZGF0YVt6SW5kZXhdIGlzIGEgMi1EIG1hdHJpeC4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZUZyYW1lcz86IGFueVtdO1xuICBwcml2YXRlIGNhY2hlZEltYWdlV2lkdGggPSAwO1xuICBwcml2YXRlIGNhY2hlZEltYWdlSGVpZ2h0ID0gMDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVJhdGlvczogbnVtYmVyW10gPSBbMSwgMV07XG4gIHByaXZhdGUgY2FjaGVkSXNHcmF5c2NhbGUgPSBmYWxzZTtcbiAgLyoqIERhdGEtc3BhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY2FjaGVkIGZyYW1lJ3MgcGl4ZWwgKDAsMCkuIFswLDBdIGZvciB0aGUgZnVsbFxuICAgKiAgaW1hZ2U7IGEgY3JvcCdzIHRvcC1sZWZ0IHdoZW4gem9vbWVkIChzbyB0aGUgaW50ZW5zaXR5IHByb2ZpbGUgc2FtcGxlcyB0aGVcbiAgICogIHpvb20tbGV2ZWwgcGl4ZWxzIGF0IHRoZSByaWdodCBvZmZzZXQvcmVzb2x1dGlvbikuICovXG4gIHByaXZhdGUgY2FjaGVkRnJhbWVPcmlnaW46IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gIC8qKiBMYXN0IHZpc2libGUgaW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlIGZyb20gdGhlIGFjdGl2ZSBiYWNrZW5kJ3Mgdmlld3BvcnQgKHNldCBieVxuICAgKiAgdGhlIE9TRCB2aWV3cG9ydC1jaGFuZ2UgaG9vayB2aWEgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKS4gTmV3IHByb2ZpbGUgbGluZXMgYXJlXG4gICAqICBwbGFjZWQgd2l0aGluIGl0IHNvIHRoZXkgbGFuZCBvbi1zY3JlZW4gd2hlbiB6b29tZWQgaW47IG51bGwg4oaSIHVzZSBmdWxsIGltYWdlLiAqL1xuICBwcml2YXRlIGxhc3RWaXNpYmxlUm9pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIGV2ZW50cyAqL1xuICBwcml2YXRlIG9uUmVsYXlvdXRFdmVudDogYW55O1xuXG4gIHByaXZhdGUgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgLy8gY3VycmVudCBpbmRleCBvZiBpbWFnZSBpbiBzdGFjayAoaWYgc3RhY2spLCAwIGlmIHNpbmdsZSBpbWFnZVxuICBwcml2YXRlIHpJbmRleCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBhdXRvc2NhbGVFdmVudCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgLy8gVGhlIHJlZ2lvbiB1cGRhdGUgZXZlbnQgYW5kIHNlbGVjdGlvbiBzdHJlYW0gYXJlIG93bmVkIGJ5IHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmU7IGdldFJlZ2lvblVwZGF0ZUV2ZW50KCkvZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkgZGVsZWdhdGUgdG9cbiAgLy8gaXQgc28gZXZlcnkgY29uc3VtZXIgKGFuZCB0aGUgT1NEIGJhY2tlbmQpIHNlZXMgb25lIHN0cmVhbS5cbiAgLyoqIEJyaWdodCwgd2VsbC1zZXBhcmF0ZWQgY29sb3VycyBjeWNsZWQgYXMgdGhlIHVzZXIgYWRkcyBwcm9maWxlLWxpbmUgUk9Jcy5cbiAgICogIFRoZSBtYXRjaGluZyBpbnNldCB0cmFjZSBpcyBkcmF3biBpbiB0aGUgc2FtZSBjb2xvdXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgUFJPRklMRV9QQUxFVFRFID0gW1xuICAgICcjRkZENDAwJywgLy8geWVsbG93XG4gICAgJyMwMEU1RkYnLCAvLyBjeWFuXG4gICAgJyNGRjJEOTUnLCAvLyBtYWdlbnRhXG4gICAgJyMzOUZGMTQnLCAvLyBncmVlblxuICAgICcjRkY5NTAwJywgLy8gb3JhbmdlXG4gICAgJyM3QzRERkYnLCAvLyB2aW9sZXRcbiAgICAnI0ZGM0IzMCcsIC8vIHJlZFxuICAgICcjMThGRkZGJywgLy8gYXF1YVxuICBdO1xuICAvKiogUGFsZXR0ZSBjdXJzb3IgZm9yIHByb2ZpbGUgbGluZXMgKG5ldmVyIHJlc2V0IG9uIGRlbGV0ZSwgc28gY29sb3VycyBrZWVwXG4gICAqICBjeWNsaW5nIGFjcm9zcyB0aGUgc2Vzc2lvbikuICovXG4gIHByaXZhdGUgcHJvZmlsZUNvbG9yU2VxID0gMDtcbiAgcHJpdmF0ZSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgLyoqIElTT1NVUkZBQ0UgYmFuZCBhcyBhIDDigJMyNTUgc2xpZGVyIHBvc2l0aW9uLCBtYXBwZWQgb250byB0aGUgdm9sdW1lJ3MgcmVhbFxuICAgKiAgaW50ZW5zaXR5IHJhbmdlIGF0IHJlbmRlciB0aW1lIChzZWUgbWFwSXNvQmFuZCkuIERlZmF1bHRzIHRvIHRoZSBmdWxsIHJhbmdlXG4gICAqICBzbyB0aGUgZmlyc3QgcmVuZGVyIHNob3dzIHRoZSB3aG9sZSBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiBob3cgYnJpZ2h0IG9yXG4gICAqICBkYXJrIHRoZSB2b2x1bWUgaXM7IHRoZSB1c2VyIHRoZW4gbmFycm93cyB0aGUgYmFuZCB0byBpc29sYXRlIGludGVuc2l0aWVzLiAqL1xuICBwcml2YXRlIGlzb01pbiA9IDA7XG4gIHByaXZhdGUgaXNvTWF4ID0gMjU1O1xuICAvKiogQWN0dWFsIGludGVuc2l0eSByYW5nZSBvZiB0aGUgdm9sdW1lIG9uIHNjcmVlbiAoW21pbixtYXhdIG92ZXIgdGhlIGxvYWRlZFxuICAgKiAgZnJhbWVzKS4gVGhlIHNsaWRlciBzcGFucyAw4oCTMjU1LCBidXQgYSBnaXZlbiBzdGFjayBvZnRlbiBvY2N1cGllcyBvbmx5IGFcbiAgICogIHN1Yi1yYW5nZSwgc28gd2UgY2xhbXAgdGhlIGlzbyBiYW5kIGludG8gdGhpcyByYW5nZSAod2l0aCBhIHNtYWxsIG1hcmdpbilcbiAgICogIHRvIGd1YXJhbnRlZSBub24tZGVnZW5lcmF0ZSBzdXJmYWNlcyDigJQgYm90aCBvbiBmaXJzdCByZW5kZXIgYW5kIG9uIGxpdmVcbiAgICogIHNsaWRlciBtb3Zlcy4gTnVsbCB1bnRpbCBhbiBpc29zdXJmYWNlIHZvbHVtZSBoYXMgYmVlbiBtZWFzdXJlZC4gKi9cbiAgcHJpdmF0ZSBpc29EYXRhUmFuZ2U6IFtudW1iZXIsIG51bWJlcl0gfCBudWxsID0gbnVsbDtcbiAgLy8gSWQgbWludGluZyBhbmQgdGhlIHNlbGVjdGlvbiBpbmRleCBzdHJlYW0gYXJlIG93bmVkIGJ5IHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUuIFNlbGVjdGlvbiBzdGlsbCBkcml2ZXMgUGxvdGx5J3MgYF9hY3RpdmVTaGFwZUluZGV4YCAoc28gYVxuICAvLyBzaW5nbGUgc2hhcGUgZ2V0cyB0aGUgZWRpdCBoYW5kbGVzKSDigJQgc2VlIHNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKCkuXG4gIHByaXZhdGUgaW1hZ2VDYWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbWFnZUNhY2hlZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZpbGVuYW1lU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIC8qKiBEcml2ZXMgdGhlIGludGVuc2l0eSBpbnNldCBvZmYgcmVnaW9uIGFkZHMvZHJhZ3MvZGVsZXRlcyAoYm90aCBiYWNrZW5kcykuICovXG4gIHByaXZhdGUgcmVnaW9uVXBkYXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAvKiogTGl2ZSAocGVyLWZyYW1lLCBub24tY29hbGVzY2VkKSByZWdpb24gZWRpdHMg4oCUIHNvIHRoZSBpbnNldCB0cmFja3MgYW4gT1NEXG4gICAqICBsaW5lIFJPSSBsaXZlIGR1cmluZyBhIGRyYWcgKE9TRCBiYXRjaGVzIHJlZ2lvblVwZGF0ZSQgdW50aWwgcmVsZWFzZSkuICovXG4gIHByaXZhdGUgcmVnaW9uTGl2ZUVkaXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY2hhbm5lbFN1Yj86IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIHdhbmRIb3N0ITogV2FuZFRvb2xIb3N0O1xuICBwcml2YXRlIGVyYXNlckhvc3QhOiBWZXJ0ZXhFcmFzZXJUb29sSG9zdDtcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAobGF6aWx5IGNyZWF0ZWQgaW4gZ2V0UmVnaW9uT3ZlcmxheSkuICovXG4gIHByaXZhdGUgcmVnaW9uT3ZlcmxheT86IElSZWdpb25PdmVybGF5O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvb3JkaW5hdGVUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtID1cbiAgICBuZXcgUGxvdGx5Q29vcmRpbmF0ZVRyYW5zZm9ybShcbiAgICAgICgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdiksXG4gICAgICAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICAgICAgICAgICAgQEluamVjdChJTUFHRV9TVEFURV9QT1JUKSBwcml2YXRlIHN0YXRlOiBJbWFnZVN0YXRlUG9ydCxcbiAgICAgICAgICAgICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIHdhbmRTZXJ2aWNlOiBXYW5kU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGJydXNoVG9vbDogQnJ1c2hUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB2ZXJ0ZXhFcmFzZXJUb29sOiBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlZ2lvblN0b3JlOiBSZWdpb25TdG9yZSkge1xuICAgIC8vIHJlbGF5b3V0IGV2ZW50IHJvdXRlclxuICAgIHRoaXMub25SZWxheW91dEV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHsgdGhpcy5yZWxheW91dEV2ZW50SGFuZGxlcihldmVudCk7IH07XG5cbiAgICAvLyBUb29sIHNlcnZpY2VzIHJlYWQvbXV0YXRlIG91ciBzdGF0ZSB2aWEgc21hbGwgKkhvc3QgaW50ZXJmYWNlcy4gU3RvcmVkXG4gICAgLy8gc28gd2UgY2FuIHJlLWJpbmQgdGhlbSB0byBvdXJzZWx2ZXMgd2hlbmV2ZXIgYSBQbG90bHkgdG9vbCBpcyBhY3RpdmF0ZWRcbiAgICAvLyAodGhlIE9wZW5TZWFkcmFnb24gYmFja2VuZCByZS1iaW5kcyB0aGUgc2FtZSBzaW5nbGV0b24gdG9vbHMgdG8gaXRzZWxmKS5cbiAgICB0aGlzLndhbmRIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VEYXRhOiAoKSA9PiB0aGlzLmdldENhY2hlZEltYWdlRGF0YSgpLFxuICAgICAgZ2V0QWN0aXZlRnJhbWVJbmRleDogKCkgPT4gdGhpcy5hY3RpdmVGcmFtZUluZGV4KCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybSgpLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMuZmlsZU5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHJlZ2lvbnMpID0+IHRoaXMuc2V0UmVnaW9ucyhyZWdpb25zKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybSgpLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1swXSB8fCAxLFxuICAgIH07XG4gICAgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICAvLyBUaGUgYnJ1c2ggcmV1c2VzIHRoZSB3YW5kIGhvc3QgKHNhbWUgY29vcmRpbmF0ZSBmcmFtZSArIHJlZ2lvbiBhY2Nlc3MpLlxuICAgIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMudmVydGV4RXJhc2VyVG9vbC5iaW5kSG9zdCh0aGlzLmVyYXNlckhvc3QpO1xuICAgIHRoaXMuYmluZFpvb21Ub0JveEhvc3QoKTtcblxuICAgIHRoaXMuaW1hZ2VDYWNoZWRTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmlzSW1hZ2VDYWNoZWQkKCkuc3Vic2NyaWJlKGltYWdlQ2FjaGVkID0+IHtcbiAgICAgIHRoaXMuaW1hZ2VDYWNoZWQgPSBpbWFnZUNhY2hlZDtcbiAgICB9KTtcbiAgICB0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRGaWxlbmFtZSQoKS5zdWJzY3JpYmUoZmlsZW5hbWUgPT4ge1xuICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVuYW1lO1xuICAgIH0pO1xuICAgIC8vIExpdmUgcmVjb2xvciBmcm9tIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lOiByZXN0eWxlIHRoZSBkaXNwbGF5IHdpbmRvdyAoem1pbi96bWF4IGZvclxuICAgIC8vIGEgaGVhdG1hcCwgY21pbi9jbWF4IGZvciBpc29zdXJmYWNlL3N1cmZhY2UpLCB0aGUgY29sb3JzY2FsZSAoY29sb3JtYXApLCBhbmQgcmV2ZXJzZS9pbnZlcnRcbiAgICAvLyB3aGVuIHRoZSBjaGFubmVsIHN0YXRlIE9SIHRoZSBjb2xvcm1hcCBjaGFuZ2VzLiAoR2FtbWEgaXMgYXBwbGllZCBieSB0aGUgT1NEIGltYWdlIHZpZXc7IHRoZVxuICAgIC8vIFBsb3RseSBjb2xvcnNjYWxlIHdpbmRvdyBjb3ZlcnMgdGhlIGNvbW1vbiBjb250cmFzdCBjYXNlLilcbiAgICB0aGlzLmNoYW5uZWxTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY2hhbm5lbHMsIHJldiwgaW52XSkgPT4gdGhpcy5hcHBseUNoYW5uZWxEaXNwbGF5KGNoYW5uZWxzLCByZXYsIGludikpO1xuICAgIC8vIFByb2ZpbGUgbGluZXMgYXJlIHN0b3JlIHJlZ2lvbnM7IGFueSByZWdpb24gY2hhbmdlIChhZGQvZHJhZy9kZWxldGUsIG9uXG4gICAgLy8gZWl0aGVyIGJhY2tlbmQpIHNob3VsZCByZWZyZXNoIHRoZSBpbnNldCB0cmFjZXMuIFRoZSBsaXZlLWVkaXQgc3RyZWFtXG4gICAgLy8gZmlyZXMgcGVyIGZyYW1lIGR1cmluZyBhIGRyYWcgKE9TRCBjb2FsZXNjZXMgcmVnaW9uVXBkYXRlJCB1bnRpbCByZWxlYXNlKSxcbiAgICAvLyBzbyB0aGUgaW5zZXQgdHJhY2tzIGFuIE9TRCBsaW5lIFJPSSBsaXZlIGFzIGl0J3MgbW92ZWQuXG4gICAgdGhpcy5yZWdpb25VcGRhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpb25MaXZlRWRpdFN1YnNjcmlwdGlvbiA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uTGl2ZUVkaXQkKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgICBpZiAoIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybiBudWxsO1xuICAgICByZXR1cm4ge1xuICAgICAgIHdpZHRoOiB0aGlzLnRydWVJbWdTaXplWzFdIC0gdGhpcy50cnVlSW1nU2l6ZVswXSxcbiAgICAgICBoZWlnaHQ6IHRoaXMudHJ1ZUltZ1NpemVbM10gLSB0aGlzLnRydWVJbWdTaXplWzJdLFxuICAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgaW1hZ2VcbiAgICogQHBhcmFtIGltYWdlSW5mb1xuICAgKiBAcGFyYW0gekluZGV4IGluZGV4IG9mIHRoZSBpbWFnZSB0byBsb2FkXG4gICAqIEByZXR1cm4gYW4gb2JqZWN0IHdpdGggZGF0YSBhbmQgcmF0aW8ga2V5c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHVybHMgPSBpbWFnZUluZm8udXJscztcbiAgICAvLyB1c2UgekluZGV4IHByb3ZpZGVkIGlmIGFueSwgMCBvdGhlcndpc2VcbiAgICBsZXQgaW1hZ2VVcmw7XG4gICAgaWYgKHpJbmRleCkge1xuICAgICAgaW1hZ2VVcmwgPSB1cmxzW3pJbmRleF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlVXJsID0gdXJsc1swXTtcbiAgICB9XG4gICAgY29uc3QgaXNHcmF5c2NhbGUgPSBpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZShpbWFnZVVybCk7XG4gICAgY29uc3QgeFJhdGlvID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemVbMF0gLyBpbWFnZS53aWR0aDtcbiAgICBjb25zdCB5UmF0aW8gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXSAvIGltYWdlLmhlaWdodDtcblxuICAgIGNvbnN0IHRydWVJbWFnZVNpemUgPSBbXTtcbiAgICAvLyBbeDAsIHgxLCB5MCwgeTFdXG4gICAgdHJ1ZUltYWdlU2l6ZVswXSA9IDA7XG4gICAgdHJ1ZUltYWdlU2l6ZVsxXSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzBdO1xuICAgIHRydWVJbWFnZVNpemVbMl0gPSAwO1xuICAgIHRydWVJbWFnZVNpemVbM10gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXTtcbiAgICB0aGlzLnRydWVJbWdTaXplID0gdHJ1ZUltYWdlU2l6ZTtcbiAgICB0aGlzLmZpbGVOYW1lID0gaW1hZ2VJbmZvLmZpbGVOYW1lO1xuICAgIGlmIChpbWFnZUluZm8uaXNTdGFjayAmJiBpbWFnZUluZm8uc2hvd1N0YWNrKSB7XG4gICAgICBjb25zdCBpbWFnZXM6IGFueVtdID0gW107XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgICAgLy8gT25lIFVSTCBwZXIgc2xpY2Ug4oCUIGxvYWQgdGhlbSBhbGwgKGVhcmxpZXIgYGxlbmd0aC0xYCBkcm9wcGVkIHRoZSBsYXN0KS5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zb2xlLmxvZyhgaW1hZ2Ugc3RhY2sgJHtpfWApO1xuICAgICAgICAvLyBkbyBub3Qga2VlcCB3aXRoIGxvYWRpbmcgaWYgZmlsZW5hbWUgaXMgZGlmZmVyZW50IChhIG5ldyBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkKVxuICAgICAgICAvLyBvciBpZiB0aGUgc3RhY2tMb2FkaW5nIHZhbHVlIGlzIHNldCB0byBmYWxzZVxuICAgICAgICBpZiAodGhpcy5maWxlTmFtZSA9PT0gaW1hZ2VJbmZvLmZpbGVOYW1lICYmIHRoaXMuc3RhY2tMb2FkaW5nJC52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2UodXJsc1tpXSk7XG4gICAgICAgICAgaWYgKGlzR3JheXNjYWxlKSB7XG4gICAgICAgICAgICBjb25zdCBncmV5ID0gaW1hZ2UuZ3JleSgpO1xuICAgICAgICAgICAgY29uc3QgaW1nRGF0YSA9IHRoaXMucGxvdFV0aWxpdGllcy5hcnJheVRvTWF0cml4KEFycmF5LmZyb20oZ3JleS5kYXRhKSwgaW1hZ2Uud2lkdGgpO1xuICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1nRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJnYkRhdGEgPSBpbWFnZS5nZXRQaXhlbHNBcnJheSgpO1xuICAgICAgICAgICAgY29uc3QgcmdiTWF0cml4ID0gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgocmdiRGF0YSwgaW1hZ2Uud2lkdGgpO1xuICAgICAgICAgICAgaW1hZ2VzLnB1c2gocmdiTWF0cml4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChpICogMTAwKSAvIHVybHMubGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYnJlYWsgc3RhY2sgbG9hZGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyByZXNldCBzdGFja0xvYWRpbmcgcHJvZ3Jlc3MgdG8gMFxuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICAgIHJldHVybiB7IGRhdGE6IGltYWdlcywgcmF0aW9zOiBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICAgICAgICAgc2l6ZXM6IFtpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0XSxcbiAgICAgICAgICAgICAgIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGltYWdlRGF0YTtcbiAgICAgIGlmIChpc0dyYXlzY2FsZSkge1xuICAgICAgICBjb25zdCBncmV5ID0gaW1hZ2UuZ3JleSgpO1xuICAgICAgICBpbWFnZURhdGEgPSB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChBcnJheS5mcm9tKGdyZXkuZGF0YSksIGltYWdlLndpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJnYkRhdGEgPSBpbWFnZS5nZXRQaXhlbHNBcnJheSgpO1xuICAgICAgICBpbWFnZURhdGEgPSB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChyZ2JEYXRhLCBpbWFnZS53aWR0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBkYXRhOiBbaW1hZ2VEYXRhXSxcbiAgICAgICAgcmF0aW9zOiBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICBzaXplczogW2ltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHRdLFxuICAgICAgICBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwbG90RGl2XG4gICAqIEBwYXJhbSBpbWFnZUxvYWRlZCBvYmplY3Qgd2l0aCBkYXRhLCByYXRpb3MgYW5kIHNpemVzIGtleVxuICAgKiBAcGFyYW0gaW1hZ2VJbmZvIEltYWdlSW5mbyBvYmplY3RcbiAgICogQHBhcmFtIHNjcmVlbkhlaWdodCBzaXplIG9mIHRoZSBhdmFpbGFibGUgc2NyZWVuIGhlaWdodFxuICAgKiBAcGFyYW0gcGxvdFR5cGUgdHlwZSBvZiBwbG90dGluZ1xuICAgKi9cbiAgLyoqXG4gICAqIEBwYXJhbSBpblBsYWNlIHdoZW4gdHJ1ZSwgdXBkYXRlcyB0aGUgZXhpc3RpbmcgcGxvdCB2aWEgUGxvdGx5LnJlYWN0XG4gICAqICAgaW5zdGVhZCBvZiBQbG90bHkucHVyZ2UgKyBQbG90bHkubmV3UGxvdC4gVXNlZCBieSB0aGUgbXVsdGktdGllclxuICAgKiAgIGRpYWdyYW0gc3dhcCAoc21hbGwg4oaSIGxhcmdlKSBzbyB0aGUgY2FudmFzIGRvZXNuJ3QgYnJpZWZseSBibGFua1xuICAgKiAgIGJldHdlZW4gcGhhc2VzLlxuICAgKi9cbiAgcHVibGljIHBsb3QocGxvdERpdjogc3RyaW5nLCBpbWFnZUxvYWRlZDogYW55LCBpbWFnZUluZm86IElJbWFnZUluZm8sIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICBwbG90VHlwZTogUGxvdFR5cGUsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHRydWVJbWFnZVNpemU6IG51bWJlcltdID0gW107XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICAvLyBbeDAsIHgxLCB5MCwgeTFdXG4gICAgdHJ1ZUltYWdlU2l6ZVswXSA9IDA7XG4gICAgdHJ1ZUltYWdlU2l6ZVsxXSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzBdO1xuICAgIHRydWVJbWFnZVNpemVbMl0gPSAwO1xuICAgIHRydWVJbWFnZVNpemVbM10gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXTtcbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9ucyBhbmQgcHVsbCBpbiBhbnkgY2FjaGVkIHJlZ2lvbnMgZm9yIHRoZVxuICAgIC8vIGltYWdlIHdlJ3JlIGFib3V0IHRvIGRpc3BsYXksIGJlZm9yZSBQbG90bHkubmV3UGxvdCByZWFkcyBgdGhpcy5zaGFwZXNgLlxuICAgIHRoaXMuc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvKTtcbiAgICB0aGlzLmltYWdlSW5mbyA9IGltYWdlSW5mbztcbiAgICB0aGlzLnBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgLy8gQ2FjaGUgcGl4ZWwgbWF0cmljZXMgc28gdGhlIHdhbmQgdG9vbCBjYW4gc2FtcGxlIHRoZW0uXG4gICAgdGhpcy5jYWNoZWRJbWFnZUZyYW1lcyA9IGltYWdlTG9hZGVkLmRhdGE7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVdpZHRoID0gaW1hZ2VMb2FkZWQuc2l6ZXNbMF07XG4gICAgdGhpcy5jYWNoZWRJbWFnZUhlaWdodCA9IGltYWdlTG9hZGVkLnNpemVzWzFdO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VSYXRpb3MgPSBpbWFnZUxvYWRlZC5yYXRpb3M7XG4gICAgdGhpcy5jYWNoZWRGcmFtZU9yaWdpbiA9IFswLCAwXTsgLy8gZnVsbCBpbWFnZSDigJQgcmVzZXQgYW55IHByaW9yIHpvb20tY3JvcCBvcmlnaW5cbiAgICB0aGlzLmNhY2hlZElzR3JheXNjYWxlID0gISFpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG5cbiAgICAvLyBQbHVnZ2FibGUgcGxvdCB0eXBlcyAoY29udG91ciwgc2NhdHRlciwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSByZW5kZXJcbiAgICAvLyB0aHJvdWdoIHRoZSB0cmFjZS1idWlsZGVyIHJlZ2lzdHJ5LiBUaGUgb3JpZ2luYWwgSEVBVE1BUC9TVVJGQUNFL1JHQi1pbWFnZVxuICAgIC8vIHJlbmRlcmVycyBrZWVwIHRoZWlyIGRlZGljYXRlZCBwYXRocyBiZWxvdyAoYWxzbyByZXVzZWQgYnkgdGhlIGhpZ2gtZGVmXG4gICAgLy8gem9vbSByZS1mZXRjaCkuIEludGVuc2l0eSBwcm9maWxlcyBhcmUgbm8gbG9uZ2VyIGEgcGxvdCB0eXBlIOKAlCB0aGV5J3JlXG4gICAgLy8gUmVnaW9uLWJhc2VkIGxpbmUgUk9JcywgYXZhaWxhYmxlIGluIEhFQVRNQVAvSU1BR0UgbW9kZS5cbiAgICBjb25zdCBpbXBsID0gUExPVExZX1BMT1RfVFlQRV9JTVBMU1twbG90VHlwZV07XG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlID0gISFpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgICByZXR1cm4gdGhpcy5wbG90VmlhUmVnaXN0cnkoXG4gICAgICAgIHBsb3REaXYsIGltcGwsIHRoaXMuYnVpbGRUcmFjZUlucHV0KGltYWdlSW5mbywgaW1hZ2VMb2FkZWQsIHRydWVJbWFnZVNpemUpLFxuICAgICAgICBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICAgIH1cblxuICAgIGlmIChpbWFnZUluZm8uaXNHcmF5c2NhbGUpIHtcbiAgICAgIGlmIChwbG90VHlwZSA9PT0gUGxvdFR5cGUuU1VSRkFDRSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbG90U3VyZmFjZShwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgICAgICBpbWFnZUxvYWRlZC5yYXRpb3MsIHNjcmVlbkhlaWdodCwgaW5QbGFjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wbG90SGVhdG1hcChwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgICAgaW1hZ2VMb2FkZWQucmF0aW9zLCBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90UkdCSGVhdG1hcChwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgIGltYWdlTG9hZGVkLnJhdGlvcywgaW1hZ2VMb2FkZWQuc2l6ZXNbMF0sIGltYWdlTG9hZGVkLnNpemVzWzFdLCBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gcGxvdCBhIGdyYXlzY2FsZSBoZWF0bWFwXG4gICAqIEBwYXJhbSBwbG90RGl2XG4gICAqIEBwYXJhbSB1cmxzXG4gICAqIEBwYXJhbSBpbWFnZXNcbiAgICogQHBhcmFtIHRydWVJbWdTaXplIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyA6IFt4MCwgeDEsIHkwLCB5MV1cbiAgICogQHBhcmFtIHJhdGlvc1xuICAgKiBAcGFyYW0gc2NyZWVuSGVpZ2h0XG4gICAqIEByZXR1cm4gUHJvbWlzZSB0cnVlIHdoZW4gcGxvdHRpbmcgaXMgZmluaXNoZWRcbiAgICovXG4gIHByaXZhdGUgcGxvdEhlYXRtYXAocGxvdERpdjogc3RyaW5nLCB1cmxzOiBzdHJpbmdbXSwgaW1hZ2VzOiBhbnlbXSwgdHJ1ZUltZ1NpemU6IG51bWJlcltdLFxuICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGltYWdlcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdXJscztcbiAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHNjcmVlbkhlaWdodDtcbiAgICAvLyBwbG90XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IH1bXSA9IFtdO1xuICAgIGltYWdlcy5mb3JFYWNoKChkYXRhc2V0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhY2UgPSB7XG4gICAgICAgIHgwOiB0cnVlSW1nU2l6ZVswXSxcbiAgICAgICAgZHg6IHJhdGlvc1swXSxcbiAgICAgICAgeTA6IHRydWVJbWdTaXplWzJdLFxuICAgICAgICBkeTogcmF0aW9zWzBdLFxuICAgICAgICB6OiBkYXRhc2V0LFxuICAgICAgICB0eXBlOiAnaGVhdG1hcCcsXG4gICAgICAgIC8vIFdlIHJlbW92ZSB0aGUgdG9vbHRpcCBhbm5vdGF0aW9uIGZvciBwZXJmb3JtYW5jZXMgcmVhc29uc1xuICAgICAgICAvLyB0ZXh0OiBkYXRhc2V0Lm1hcCgocm93OiBhbnlbXSwgaTogYW55KSA9PiByb3cubWFwKChpdGVtLCBqKSA9PiB7XG4gICAgICAgIC8vICAgcmV0dXJuIGB4OiAkeysoaiAqIHJhdGlvc1swXSkudG9GaXhlZCgyKX08YnI+eTogJHsrKGkgKiByYXRpb3NbMF0pLnRvRml4ZWQoMil9PGJyPnZhbHVlOiAke2l0ZW19YH0pKSxcbiAgICAgICAgaG92ZXJpbmZvOiAnbm9uZScsXG4gICAgICAgIGNvbG9yc2NhbGU6IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCkuZGF0YS52YWx1ZSxcbiAgICAgICAgcmV2ZXJzZXNjYWxlOiB0aGlzLnN0b3JlLmN1cnJlbnRSZXZlcnNlU2NhbGUoKSxcbiAgICAgICAgbmFtZTogYFNsaWNlICR7aW5kZXggKyAxfWAsXG4gICAgICAgIHZpc2libGU6IGluZGV4ID09PSAwXG4gICAgICB9O1xuICAgICAgdHJhY2VzLnB1c2godHJhY2UpO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbmRlciA9IGluUGxhY2UgPyBQbG90bHkucmVhY3QgOiBQbG90bHkubmV3UGxvdDtcbiAgICByZXR1cm4gKHJlbmRlciBhcyBhbnkpKHBsb3REaXYsIHRyYWNlcyBhcyBhbnksXG4gICAgICB0aGlzLmdldEhlYXRtYXBMYXlvdXQoW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV0sIFt0cnVlSW1nU2l6ZVszXSxcbiAgICAgICAgdHJ1ZUltZ1NpemVbMl1dKSwgQ09ORklHIGFzIGFueSkudGhlbigoKSA9PiB7XG4gICAgICAvLyBoYW5kbGUgdGhlIHJlbGF5b3V0IGV2ZW50IGZvciB6b29tIC8gcm9pcyBhbmQgdGhlIGNsaWNrIGV2ZW50XG4gICAgICB0aGlzLnNldEV2ZW50cyhwbG90RGl2LCB0cnVlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBwbG90IGEgZ3JheXNjYWxlIHN1cmZhY2VcbiAgICogQHBhcmFtIHBsb3REaXZcbiAgICogQHBhcmFtIHVybHNcbiAgICogQHBhcmFtIGltYWdlc1xuICAgKiBAcGFyYW0gdHJ1ZUltZ1NpemUgYXJyYXkgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIDogW3gwLCB4MSwgeTAsIHkxXVxuICAgKiBAcGFyYW0gcmF0aW9zXG4gICAqIEBwYXJhbSBzY3JlZW5IZWlnaHRcbiAgICogQHJldHVybiBQcm9taXNlIHRydWUgd2hlbiBwbG90dGluZyBpcyBmaW5pc2hlZFxuICAgKi9cbiAgcHJpdmF0ZSBwbG90U3VyZmFjZShwbG90RGl2OiBzdHJpbmcsIHVybHM6IHN0cmluZ1tdLCBpbWFnZXM6IGFueVtdLCB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGltYWdlcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdXJscztcbiAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHNjcmVlbkhlaWdodDtcbiAgICAvLyBwbG90XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyAgfVtdID0gW107XG4gICAgaW1hZ2VzLmZvckVhY2goKGRhdGFzZXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0cmFjZSA9IHtcbiAgICAgICAgejogZGF0YXNldCxcbiAgICAgICAgdHlwZTogJ3N1cmZhY2UnLFxuICAgICAgICAvLyBob3ZlcmluZm86ICdub25lJyxcbiAgICAgICAgY29sb3JzY2FsZTogdGhpcy5zdG9yZS5jdXJyZW50Q29sb3JtYXAoKS5kYXRhLnZhbHVlLFxuICAgICAgICByZXZlcnNlc2NhbGU6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgICAvLyBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgLy8gdmlzaWJsZTogaW5kZXggPT09IDBcbiAgICAgIH07XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG4gICAgY29uc3QgeHJhbmdlID0gW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV07XG4gICAgY29uc3QgeXJhbmdlID0gW3RydWVJbWdTaXplWzJdLCB0cnVlSW1nU2l6ZVszXV07XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0U3VyZmFjZUxheW91dCh4cmFuZ2UsIHlyYW5nZSwgMC40KSwgQ09ORklHX1NVUkZBQ0UgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGhhbmRsZSB0aGUgcmVsYXlvdXQgZXZlbnQgZm9yIHpvb20gLyByb2lzIGFuZCB0aGUgY2xpY2sgZXZlbnRcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIHRydWUsIHNjcmVlbkhlaWdodCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIHBsb3QgYW4gUkdCIGhlYXRtYXBcbiAgICogQHBhcmFtIHBsb3REaXZcbiAgICogQHBhcmFtIHVybHNcbiAgICogQHBhcmFtIGltYWdlc1xuICAgKiBAcGFyYW0gdHJ1ZUltZ1NpemVcbiAgICogQHBhcmFtIHdpZHRoXG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICogQHBhcmFtIHJhdGlvc1xuICAgKiBAcGFyYW0gc2NyZWVuSGVpZ2h0XG4gICAqIEByZXR1cm4gUHJvbWlzZVxuICAgKi9cbiAgcHJpdmF0ZSBwbG90UkdCSGVhdG1hcChwbG90RGl2OiBzdHJpbmcsIHVybHM6IHN0cmluZ1tdLCBpbWFnZXM6IGFueVtdLCB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFBsb3RseS5yZWFjdCB1cGRhdGVzIGluIHBsYWNlOyBQbG90bHkucHVyZ2UgKyBQbG90bHkubmV3UGxvdCBibGFua3NcbiAgICAvLyB0aGUgY2FudmFzIGZvciB+MTAwbXMgd2hpY2ggbWFrZXMgdGhlIG11bHRpLXRpZXIgc21hbGzihpJsYXJnZSBzd2FwXG4gICAgLy8gbG9vayBsaWtlIGEgcmVncmVzc2lvbiB0byBcImxvYWRpbmdcIiBiZWZvcmUgdGhlIHNoYXJwZXIgdmVyc2lvblxuICAgIC8vIGFwcGVhcnMuXG4gICAgaWYgKCFpblBsYWNlKSBQbG90bHkucHVyZ2UocGxvdERpdik7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICB0aGlzLmltYWdlTGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcbiAgICB0aGlzLnVybHMgPSB1cmxzO1xuICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuXG4gICAgLy8gYXMgYXV0b3JhbmdlIGlzIHNldCB0byBmYWxzZSwgYW5kIG5vdCByZXZlcnNlZCB3ZSBuZWVkIHRvIHNldCB0aGUgeXJhbmdlIGNvcnJlY2x5IGhlcmVcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmdldEhlYXRtYXBMYXlvdXQoW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV0sXG4gICAgICBbdHJ1ZUltZ1NpemVbM10sIHRydWVJbWdTaXplWzJdXSk7XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IH1bXSA9IFtdO1xuICAgIGltYWdlcy5mb3JFYWNoKChkYXRhc2V0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhY2UgPSB7XG4gICAgICAgIHgwOiB0cnVlSW1nU2l6ZVswXSxcbiAgICAgICAgZHg6IHJhdGlvc1swXSxcbiAgICAgICAgeTA6IHRydWVJbWdTaXplWzJdLFxuICAgICAgICBkeTogcmF0aW9zWzBdLFxuICAgICAgICB4OiBBcnJheS5mcm9tKEFycmF5KHdpZHRoKS5rZXlzKCkpLFxuICAgICAgICB5OiBBcnJheS5mcm9tKEFycmF5KGhlaWdodCkua2V5cygpKSxcbiAgICAgICAgejogZGF0YXNldCxcbiAgICAgICAgLy8gdGV4dDogZGF0YXNldC5tYXAoKHJvdzogYW55W10sIGk6IGFueSkgPT4gcm93Lm1hcCgoaXRlbSwgaikgPT4ge1xuICAgICAgICAvLyAgIHJldHVybiBgeDogJHsrKGogKiByYXRpb3NbMF0pLnRvRml4ZWQoMil9PGJyPnk6ICR7KyhpICogcmF0aW9zWzBdKS50b0ZpeGVkKDIpfTxicj52YWx1ZTogJHtpdGVtfWB9KSksXG4gICAgICAgIGhvdmVyaW5mbzogJ25vbmUnLFxuICAgICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgICBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgdmlzaWJsZTogaW5kZXggPT09IDBcbiAgICAgIH07XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSwgbGF5b3V0LCBDT05GSUcgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGhhbmRsZSB0aGUgcmVsYXlvdXQgZXZlbnRcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIGZhbHNlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgdGhlIG5vcm1hbGlzZWQgaW5wdXQgdGhlIHBsdWdnYWJsZSB0cmFjZSBidWlsZGVycyBjb25zdW1lLlxuICAgKiBQdXJlIGRhdGEgb25seSDigJQgbm8gUGxvdGx5IGhhbmRsZXMg4oCUIHNvIHRoZSBidWlsZGVycyBzdGF5IGJhY2tlbmQtbmV1dHJhbC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFjZUlucHV0KGltYWdlSW5mbzogSUltYWdlSW5mbywgaW1hZ2VMb2FkZWQ6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZUltYWdlU2l6ZTogbnVtYmVyW10pOiBUcmFjZUJ1aWxkSW5wdXQge1xuICAgIC8vIE1lYXN1cmUgdGhlIHZvbHVtZSdzIHJlYWwgaW50ZW5zaXR5IHJhbmdlIHNvIHRoZSBpc28gYmFuZCBjYW4gYmUgY2xhbXBlZFxuICAgIC8vIGludG8gaXQgKHRoZSBzbGlkZXIgaXMgYSBmaXhlZCAw4oCTMjU1IGJ1dCBhIHN0YWNrIG1heSBvY2N1cHkgb25seSBwYXJ0IG9mXG4gICAgLy8gdGhhdCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGxlYXZlIHRoZSBzdXJmYWNlcyB3aXRoIG5vdGhpbmcgdG8gY3Jvc3MpLlxuICAgIGlmICh0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5JU09TVVJGQUNFKSB7XG4gICAgICB0aGlzLmlzb0RhdGFSYW5nZSA9IHRoaXMubWVhc3VyZUludGVuc2l0eVJhbmdlKGltYWdlTG9hZGVkLmRhdGEsICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlKTtcbiAgICB9XG4gICAgY29uc3QgW2lzb01pbiwgaXNvTWF4XSA9IHRoaXMubWFwSXNvQmFuZCh0aGlzLmlzb01pbiwgdGhpcy5pc29NYXgpO1xuICAgIHJldHVybiB7XG4gICAgICBmcmFtZXM6IGltYWdlTG9hZGVkLmRhdGEsXG4gICAgICB3aWR0aDogaW1hZ2VMb2FkZWQuc2l6ZXNbMF0sXG4gICAgICBoZWlnaHQ6IGltYWdlTG9hZGVkLnNpemVzWzFdLFxuICAgICAgcmF0aW9zOiBpbWFnZUxvYWRlZC5yYXRpb3MsXG4gICAgICB0cnVlSW1hZ2VTaXplLFxuICAgICAgaXNHcmF5c2NhbGU6ICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlLFxuICAgICAgY29sb3JzY2FsZTogdGhpcy5zdG9yZS5jdXJyZW50Q29sb3JtYXAoKS5kYXRhLnZhbHVlLFxuICAgICAgcmV2ZXJzZXNjYWxlOiB0aGlzLnN0b3JlLmN1cnJlbnRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHJlZ2lvbnM6IHRoaXMuZ2V0UmVnaW9uUG9seWdvbnMoKSxcbiAgICAgIHNoYXBlQ29sb3I6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpLFxuICAgICAgaXNvTWluLFxuICAgICAgaXNvTWF4LFxuICAgIH07XG4gIH1cblxuICAvKiogTWluL21heCBpbnRlbnNpdHkgb3ZlciBldmVyeSB2b3hlbCBvZiB0aGUgbG9hZGVkIGZyYW1lcyAoUkdCIOKGkiBsdW1pbmFuY2UpLFxuICAgKiAgdXNlZCB0byBrZWVwIHRoZSBpc28gYmFuZCBpbnNpZGUgdGhlIGRhdGEuIFJldHVybnMgbnVsbCBmb3IgZW1wdHkgaW5wdXQuICovXG4gIHByaXZhdGUgbWVhc3VyZUludGVuc2l0eVJhbmdlKGZyYW1lczogYW55W10sIGlzR3JheXNjYWxlOiBib29sZWFuKTogW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICAgIGxldCBtaW4gPSBJbmZpbml0eSwgbWF4ID0gLUluZmluaXR5O1xuICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVzIHx8IFtdKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBmcmFtZSB8fCBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93IHx8IFtdKSB7XG4gICAgICAgICAgY29uc3QgdiA9IGlzR3JheXNjYWxlID8gY2VsbFxuICAgICAgICAgICAgOiAwLjI5OSAqIGNlbGxbMF0gKyAwLjU4NyAqIGNlbGxbMV0gKyAwLjExNCAqIGNlbGxbMl07XG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodikpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh2IDwgbWluKSBtaW4gPSB2O1xuICAgICAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoTnVtYmVyLmlzRmluaXRlKG1pbikgJiYgTnVtYmVyLmlzRmluaXRlKG1heCkgJiYgbWF4ID4gbWluKSA/IFttaW4sIG1heF0gOiBudWxsO1xuICB9XG5cbiAgLyoqIE1hcCB0aGUgMOKAkzI1NSBzbGlkZXIgYmFuZCBvbnRvIHRoZSB2b2x1bWUncyBhY3R1YWwgaW50ZW5zaXR5IHJhbmdlLiBUaGVcbiAgICogIHNsaWRlciBpcyBmaXhlZCAw4oCTMjU1LCBidXQgYSBzdGFjayBvZnRlbiBvY2N1cGllcyBvbmx5IGEgbmFycm93IHN1Yi1yYW5nZVxuICAgKiAgKGUuZy4gdGhpcyBFRE9GIHZvbHVtZSBpcyB+MuKAkzUwIHdpdGggc3RydWN0dXJlIG5lYXIgNuKAkzEwKS4gTWFwcGluZyBzcHJlYWRzXG4gICAqICB0aGUgZGF0YSBhY3Jvc3MgdGhlIHdob2xlIHNsaWRlciBzbyBldmVyeSBpbnRlbnNpdHkgaXMgZWFzeSB0byByZWFjaCBhbmRcbiAgICogIHRoZSBiYW5kIGFsd2F5cyBsYW5kcyBpbnNpZGUgdGhlIGRhdGEg4oCUIGEgc21hbGwgaW5zZXQga2VlcHMgdGhlIGV4dHJlbWVcbiAgICogIHN1cmZhY2VzIG9mZiB0aGUgZXhhY3QgZGF0YSBlZGdlcywgd2hpY2ggYXJlIGRlZ2VuZXJhdGUgYW5kIGRyYXcgbm90aGluZy4gKi9cbiAgcHJpdmF0ZSBtYXBJc29CYW5kKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGxldCBsbyA9IE1hdGgubWluKGlzb01pbiwgaXNvTWF4KTtcbiAgICBsZXQgaGkgPSBNYXRoLm1heChpc29NaW4sIGlzb01heCk7XG4gICAgaWYgKHRoaXMuaXNvRGF0YVJhbmdlKSB7XG4gICAgICBjb25zdCBbdk1pbiwgdk1heF0gPSB0aGlzLmlzb0RhdGFSYW5nZTtcbiAgICAgIGNvbnN0IHNwYW4gPSB2TWF4IC0gdk1pbjtcbiAgICAgIGNvbnN0IHBhZCA9IDAuMDMgKiBzcGFuO1xuICAgICAgY29uc3QgdXNhYmxlID0gc3BhbiAtIDIgKiBwYWQ7XG4gICAgICBjb25zdCBTTElERVJfTUFYID0gMjU1OyAvLyB0b29sYmFyIHNsaWRlciBkb21haW4gKGlzb1ZhbHVlTWF4KVxuICAgICAgbG8gPSB2TWluICsgcGFkICsgKGxvIC8gU0xJREVSX01BWCkgKiB1c2FibGU7XG4gICAgICBoaSA9IHZNaW4gKyBwYWQgKyAoaGkgLyBTTElERVJfTUFYKSAqIHVzYWJsZTtcbiAgICAgIGlmIChsbyA+IGhpKSB7IGNvbnN0IHQgPSBsbzsgbG8gPSBoaTsgaGkgPSB0OyB9XG4gICAgfVxuICAgIHJldHVybiBbbG8sIGhpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGlzb3N1cmZhY2UgaW50ZW5zaXR5IGJvdW5kcy4gV2hlbiBpc29zdXJmYWNlIGlzIG9uIHNjcmVlbiB0aGlzXG4gICAqIHJlc3R5bGVzIGBpc29taW5gL2Bpc29tYXhgIGluIHBsYWNlIGZvciBhIGxpdmUgdXBkYXRlIChubyB2b2x1bWUgcmVidWlsZCkuXG4gICAqIFNsaWRlciB2YWx1ZXMgYXJlIG1hcHBlZCBvbnRvIHRoZSB2b2x1bWUncyByZWFsIHJhbmdlIHNvIHRoZSBzdXJmYWNlcyBhbHdheXNcbiAgICogaGF2ZSBkYXRhIHRvIGNyb3NzIChtYXRjaGluZyB0aGUgaW5pdGlhbCByZW5kZXIpLlxuICAgKi9cbiAgcHVibGljIHNldElzb1JhbmdlKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaXNvTWluID0gaXNvTWluO1xuICAgIHRoaXMuaXNvTWF4ID0gaXNvTWF4O1xuICAgIGlmICh0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5JU09TVVJGQUNFICYmIHRoaXMucGxvdERpdikge1xuICAgICAgY29uc3QgW2xvLCBoaV0gPSB0aGlzLm1hcElzb0JhbmQoaXNvTWluLCBpc29NYXgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlc3R5bGUodGhpcy5wbG90RGl2LCB7IGlzb21pbjogW2xvXSwgaXNvbWF4OiBbaGldIH0gYXMgYW55KTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBwbG90IG5vdCByZWFkeSAqLyB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFBsb3RseSByZW5kZXJzIGlzb3N1cmZhY2VzLCBzbyBpdCBleHBvc2VzIHRoZSBpc29zdXJmYWNlIGNvbnRyb2xzIChpdHNlbGYpLiAqL1xuICBwdWJsaWMgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHsgcmV0dXJuIHRoaXM7IH1cblxuICAvKipcbiAgICogUmVuZGVyIGEgcmVnaXN0cnktYmFja2VkIHBsb3QgdHlwZTogYnVpbGQgaXRzIHRyYWNlcyBmcm9tIHRoZSBpbnB1dCwgcGlja1xuICAgKiB0aGUgbWF0Y2hpbmcgbGF5b3V0LCByZW5kZXIsIGFuZCB3aXJlIHRoZSB1c3VhbCByZWxheW91dC9jbGljayBldmVudHMuXG4gICAqIE1pcnJvcnMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGVkaWNhdGVkIGhlYXRtYXAvc3VyZmFjZSByZW5kZXJlcnMuXG4gICAqL1xuICBwcml2YXRlIHBsb3RWaWFSZWdpc3RyeShwbG90RGl2OiBzdHJpbmcsIGltcGw6IFBsb3RseVBsb3RUeXBlSW1wbCwgaW5wdXQ6IFRyYWNlQnVpbGRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGlucHV0LmZyYW1lcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdGhpcy5pbWFnZUluZm8/LnVybHMgPz8gdGhpcy51cmxzO1xuICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuXG4gICAgY29uc3QgdHJhY2VzID0gaW1wbC5idWlsZFRyYWNlcyhpbnB1dCk7XG4gICAgY29uc3QgW3gwLCB4MSwgeTAsIHkxXSA9IGlucHV0LnRydWVJbWFnZVNpemU7XG4gICAgbGV0IGxheW91dDogYW55O1xuICAgIHN3aXRjaCAoaW1wbC5sYXlvdXRLaW5kKSB7XG4gICAgICBjYXNlICczZC12b2x1bWUnOlxuICAgICAgICBsYXlvdXQgPSB0aGlzLmdldFZvbHVtZUxheW91dCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzJkLWNoYXJ0JzpcbiAgICAgICAgbGF5b3V0ID0gdGhpcy5nZXRDaGFydExheW91dCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzJkLW92ZXJsYXknOlxuICAgICAgICBsYXlvdXQgPSB0aGlzLmdldE92ZXJsYXlMYXlvdXQoW3gwLCB4MV0sIFt5MSwgeTBdKTsgLy8gcmV2ZXJzZWQgeSBsaWtlIHRoZSBpbWFnZVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IC8vICcyZC1pbWFnZSdcbiAgICAgICAgbGF5b3V0ID0gdGhpcy5nZXRIZWF0bWFwTGF5b3V0KFt4MCwgeDFdLCBbeTEsIHkwXSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IGltcGwudGhyZWVEID8gQ09ORklHX1NVUkZBQ0UgOiBDT05GSUc7XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSwgbGF5b3V0LCBjb25maWcgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIGlucHV0LmlzR3JheXNjYWxlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGxhaW4gMkQgY2hhcnQgYXhlcyAoaW50ZW5zaXR5IHByb2ZpbGUgLyBsaW5lIHBsb3RzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDaGFydExheW91dCgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtYXJnaW46IHsgdDogMzAsIGI6IDQ1LCBsOiA2MCwgcjogMjAgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHhheGlzOiB7IHRpdGxlOiAnUG9zaXRpb24gKHB4KScgfSxcbiAgICAgIHlheGlzOiB7IHRpdGxlOiAnSW50ZW5zaXR5JyB9LFxuICAgICAgZHJhZ21vZGU6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKiogSW1hZ2UtYWxpZ25lZCAyRCBheGVzIHdpdGhvdXQgdGhlIHotcGxhbmUgc2xpZGVyIChyZWdpb24gc2NhdHRlcikuICovXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUxheW91dCh4UmFuZ2U6IG51bWJlcltdLCB5UmFuZ2U6IG51bWJlcltdKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgeGF4aXM6IHsgY29uc3RyYWluOiAncmFuZ2UnLCBjb25zdHJhaW50b3dhcmQ6ICdjZW50ZXInLCBzaWRlOiAndG9wJywgdGlja3M6ICcnLCByYW5nZTogeFJhbmdlIH0sXG4gICAgICB5YXhpczoge1xuICAgICAgICBjb25zdHJhaW46ICdyYW5nZScsIGNvbnN0cmFpbnRvd2FyZDogJ2NlbnRlcicsIHJhbmdlOiB5UmFuZ2UsIHRpY2tzOiAnJyxcbiAgICAgICAgdGlja3N1ZmZpeDogJyAgJywgYXV0b3JhbmdlOiBmYWxzZSwgc2NhbGVhbmNob3I6IHRoaXMuc2NhbGVyYXRpbyA/ICd4JyA6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG1hcmdpbjogeyB0OiAzMCwgYjogNSwgbDogNTUsIHI6IDUgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHNoYXBlczogdGhpcy5jdXJyZW50UmVuZGVyU2hhcGVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSksXG4gICAgICBkcmFnbW9kZTogdGhpcy5kcmFnTW9kZSA/IHRoaXMuZHJhZ01vZGUgOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIDNEIHNjZW5lIGZvciB2b2x1bWV0cmljIHBsb3QgdHlwZXMgKHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkuICovXG4gIHByaXZhdGUgZ2V0Vm9sdW1lTGF5b3V0KCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hcmdpbjogeyB0OiAwLCBiOiAwLCBsOiAwLCByOiAwIH0sXG4gICAgICBoZWlnaHQ6IHRoaXMuc2NyZWVuSGVpZ2h0LFxuICAgICAgYXV0b3NpemU6IHRydWUsXG4gICAgICBzY2VuZToge1xuICAgICAgICB4YXhpczogeyB0aXRsZTogJ1gnIH0sXG4gICAgICAgIHlheGlzOiB7IHRpdGxlOiAnWScgfSxcbiAgICAgICAgemF4aXM6IHsgdGl0bGU6ICdaLXBsYW5lJyB9LFxuICAgICAgICAvLyAnY3ViZScgKG5vdCAnZGF0YScpOiBhIHotc3RhY2sgaGFzIGZhciBmZXdlciBwbGFuZXMgdGhhbiBYL1kgcGl4ZWxzLFxuICAgICAgICAvLyBzbyAnZGF0YScgc3F1YXNoZXMgdGhlIHZvbHVtZSBpbnRvIGEgbmVhci1mbGF0IHNsYWIgdGhhdCByZWFkcyBhc1xuICAgICAgICAvLyBlbXB0eSBlZGdlLW9uLiBBIGN1YmUgZ2l2ZXMgdGhlIHogZGltZW5zaW9uIHJlYWwgaGVpZ2h0IHNvIHRoZVxuICAgICAgICAvLyBpc29zdXJmYWNlL3ZveGVscyBhcmUgYWN0dWFsbHkgdmlzaWJsZS5cbiAgICAgICAgYXNwZWN0bW9kZTogJ2N1YmUnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgKGRyaXZlcyB0aGUgVUkgc2VsZWN0b3IpLiAqL1xuICBwdWJsaWMgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUExPVF9UWVBFX0RFU0NSSVBUT1JTKS5maWx0ZXIoKGQpOiBkIGlzIFBsb3RUeXBlRGVzY3JpcHRvciA9PiAhIWQpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gUGxvdGx5IGRyYXdzIHNoYXBlcyBuYXRpdmVseSwgc28gdGhlXG4gICAqICBvdmVybGF5IGlzIGEgdGhpbiBhZGFwdGVyIG92ZXIgdGhpcyBzZXJ2aWNlJ3MgZHJhZyBtb2Rlcy4gKi9cbiAgcHVibGljIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkge1xuICAgIGlmICghdGhpcy5yZWdpb25PdmVybGF5KSB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgUGxvdGx5UmVnaW9uT3ZlcmxheSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25PdmVybGF5O1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVuc2l0eSBwcm9maWxlIChSZWdpb24tYmFzZWQgbGluZSBST0lzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogRW1pdHMgdGhlIGZ1bGwgc2V0IG9mIGludGVuc2l0eSBwcm9maWxlcyAob25lIHBlciBwcm9maWxlLWxpbmUgcmVnaW9uKVxuICAgKiAgd2hlbmV2ZXIgYSBwcm9maWxlIGxpbmUgaXMgYWRkZWQsIG1vdmVkLCBvciByZW1vdmVkLiAqL1xuICBwdWJsaWMgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBQbG90bHkgcmVuZGVycyB0aGUgbGluZSBST0lzICsgaW5zZXQsIHNvIGl0IGV4cG9zZXMgdGhlIGludGVuc2l0eSBjb250cm9scy4gKi9cbiAgcHVibGljIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwgeyByZXR1cm4gdGhpczsgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIGluc2V0IGNoYXJ0IGludG8gYGRpdklkYCDigJQgb25lIGxpbmVcbiAgICogdHJhY2UgcGVyIFJPSSwgZWFjaCBkcmF3biBpbiBpdHMgUk9JJ3MgY29sb3VyLiBLZXB0IGhlcmUgKG5vdCBpbiB0aGUgZGlhZ3JhbVxuICAgKiBjb21wb25lbnQpIHNvIHRoZSBjb25zdW1lciBuZXZlciB0b3VjaGVzIFBsb3RseSBkaXJlY3RseS5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZJZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHRyYWNlcyA9IChwcm9maWxlcyA/PyBbXSkubWFwKChwLCBpKSA9PiAoe1xuICAgICAgeDogcC5wb3NpdGlvbnMsXG4gICAgICB5OiBwLnZhbHVlcyxcbiAgICAgIHR5cGU6ICdzY2F0dGVyJyxcbiAgICAgIG1vZGU6ICdsaW5lcycsXG4gICAgICBsaW5lOiB7IGNvbG9yOiBwLmNvbG9yID8/ICcjRkZENDAwJywgd2lkdGg6IDIgfSxcbiAgICAgIG5hbWU6IGBMaW5lICR7aSArIDF9YCxcbiAgICAgIGhvdmVyaW5mbzogJ3greScsXG4gICAgfSkpO1xuICAgIC8vIFggYXhpcyBpcyBpbiBtaWNyb25zIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgYSBwaHlzaWNhbCBwaXhlbCBzaXplIChtcHApLFxuICAgIC8vIG90aGVyd2lzZSBpbiBwaXhlbHMg4oCUIGRyaXZlbiBieSB0aGUgdW5pdCB0aGUgc2FtcGxlciB0YWdnZWQgb24gdGhlIHByb2ZpbGUuXG4gICAgY29uc3QgdW5pdCA9IChwcm9maWxlcyA/PyBbXSkuZmluZChwID0+IHAudW5pdCk/LnVuaXQgPz8gJ3B4JztcbiAgICBjb25zdCB4VGl0bGUgPSB1bml0ID09PSAnwrVtJyA/ICdQb3NpdGlvbiAowrVtKScgOiAnUG9zaXRpb24gKHB4KSc7XG4gICAgUGxvdGx5LnJlYWN0KGVsLCB0cmFjZXMgYXMgYW55LCB7XG4gICAgICBtYXJnaW46IHsgdDogNiwgcjogOCwgYjogMzgsIGw6IDQwIH0sXG4gICAgICB4YXhpczogeyB0aXRsZTogeFRpdGxlLCB6ZXJvbGluZTogZmFsc2UsIGNvbG9yOiAnI2RkZCcgfSxcbiAgICAgIHlheGlzOiB7IHRpdGxlOiAnSW50ZW5zaXR5JywgemVyb2xpbmU6IGZhbHNlLCBjb2xvcjogJyNkZGQnIH0sXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICAgIHBhcGVyX2JnY29sb3I6ICdyZ2JhKDI1LDI1LDI1LDAuOSknLFxuICAgICAgcGxvdF9iZ2NvbG9yOiAncmdiYSgyNSwyNSwyNSwwLjkpJyxcbiAgICAgIGZvbnQ6IHsgY29sb3I6ICcjZWVlJywgc2l6ZTogMTAgfSxcbiAgICB9IGFzIGFueSwgeyBkaXNwbGF5TW9kZUJhcjogZmFsc2UsIHJlc3BvbnNpdmU6IHRydWUgfSBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBzaGFwZXMgKGZpbHRlcmVkL3JlZHJhd24gZm9yIHRoZSBjdXJyZW50IGZpbGUpLiBUaGUgcHJvZmlsZS1saW5lIFJPSXNcbiAgICogYXJlIG9yZGluYXJ5IHN0b3JlIHJlZ2lvbnMgKHRhZ2dlZCBga2luZDogJ3Byb2ZpbGUnYCksIHNvIHRoZXkgYXJlIGFscmVhZHlcbiAgICogcGFydCBvZiBgdGhpcy5zaGFwZXNgIOKAlCBubyBzZXBhcmF0ZSBhcHBlbmQgaXMgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjdXJyZW50UmVuZGVyU2hhcGVzKHNob3dMYWJlbCA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zaGFwZXNUb1JlZHJhdyhzaG93TGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIElJbnRlbnNpdHlDb250cm9sczogYWRkIGFub3RoZXIgaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBhcyBhIG5ldXRyYWwgUmVnaW9uXG4gICAqICh0YWdnZWQgYGtpbmQ6ICdwcm9maWxlJ2ApLiBJdCBpcyBhIGhvcml6b250YWwgb3BlbiAyLXBvaW50IHBvbHlsaW5lIHNwYW5uaW5nXG4gICAqIHRoZSBpbWFnZSB3aWR0aCwgc3RhZ2dlcmVkIHZlcnRpY2FsbHkgc28gc3VjY2Vzc2l2ZSBsaW5lcyBzdGF5IGRpc3RpbmN0LCBpblxuICAgKiB0aGUgbmV4dCBicmlnaHQgcGFsZXR0ZSBjb2xvdXIuIEFkZGVkIHRvIHRoZSBzaGFyZWQgc3RvcmUgc28gYm90aCBiYWNrZW5kc1xuICAgKiAoUGxvdGx5ICsgT3BlblNlYWRyYWdvbikgcmVuZGVyIGFuZCBkcmFnIGl0OyBleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYlxuICAgKiBhbmQgZXhwb3J0cyBieSBpdHMga2luZC5cbiAgICovXG4gIHB1YmxpYyBhZGRQcm9maWxlTGluZSgpOiBSZWdpb24gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5nZXRQcm9maWxlUmVnaW9ucygpLmxlbmd0aDtcbiAgICBjb25zdCBpbWdYMCA9IHRoaXMudHJ1ZUltZ1NpemVbMF0sIGltZ1gxID0gdGhpcy50cnVlSW1nU2l6ZVsxXTtcbiAgICBjb25zdCBpbWdUb3AgPSB0aGlzLnRydWVJbWdTaXplWzJdLCBpbWdCb3R0b20gPSB0aGlzLnRydWVJbWdTaXplWzNdO1xuXG4gICAgLy8gUGxhY2UgdGhlIGxpbmUgd2l0aGluIHRoZSBjdXJyZW50bHkgVklTSUJMRSBpbWFnZSBhcmVhLCBzbyB3aGVuIHpvb21lZCBpbiBpdFxuICAgIC8vIGxhbmRzIG9uLXNjcmVlbiBpbnN0ZWFkIG9mIHNwYW5uaW5nIHRoZSB3aG9sZSAobW9zdGx5IG9mZi1zY3JlZW4pIGltYWdlLCBhdFxuICAgIC8vIDIvMyBvZiB0aGUgdmlzaWJsZSB3aWR0aCBhbmQgaG9yaXpvbnRhbGx5IGNlbnRyZWQuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGxcbiAgICAvLyBpbWFnZSB3aGVuIG5vIHZpZXdwb3J0IFJPSSBpcyBrbm93biAoUGxvdGx5IGhlYXRtYXApIG9yIGEgc3RhbGUgUk9JIG5vIGxvbmdlclxuICAgIC8vIG92ZXJsYXBzIHRoZSBpbWFnZS5cbiAgICBjb25zdCByb2kgPSB0aGlzLmxhc3RWaXNpYmxlUm9pO1xuICAgIGNvbnN0IG92ZXJsYXBzID0gISFyb2kgJiYgcm9pLndpZHRoID4gMCAmJiByb2kuaGVpZ2h0ID4gMFxuICAgICAgJiYgcm9pLnggPCBpbWdYMSAmJiByb2kueCArIHJvaS53aWR0aCA+IGltZ1gwXG4gICAgICAmJiByb2kueSA8IGltZ0JvdHRvbSAmJiByb2kueSArIHJvaS5oZWlnaHQgPiBpbWdUb3A7XG4gICAgY29uc3QgeDB2ID0gb3ZlcmxhcHMgPyBNYXRoLm1heChpbWdYMCwgcm9pIS54KSA6IGltZ1gwO1xuICAgIGNvbnN0IHgxdiA9IG92ZXJsYXBzID8gTWF0aC5taW4oaW1nWDEsIHJvaSEueCArIHJvaSEud2lkdGgpIDogaW1nWDE7XG4gICAgY29uc3QgdG9wViA9IG92ZXJsYXBzID8gTWF0aC5tYXgoaW1nVG9wLCByb2khLnkpIDogaW1nVG9wO1xuICAgIGNvbnN0IGJvdHRvbVYgPSBvdmVybGFwcyA/IE1hdGgubWluKGltZ0JvdHRvbSwgcm9pIS55ICsgcm9pIS5oZWlnaHQpIDogaW1nQm90dG9tO1xuXG4gICAgY29uc3QgY3ggPSAoeDB2ICsgeDF2KSAvIDI7XG4gICAgY29uc3QgaGFsZiA9ICgoeDF2IC0geDB2KSAqICgyIC8gMykpIC8gMjsgLy8gbGluZSBzcGFucyAyLzMgb2YgdGhlIHZpc2libGUgd2lkdGhcbiAgICBjb25zdCB4MCA9IGN4IC0gaGFsZiwgeDEgPSBjeCArIGhhbGY7XG5cbiAgICBjb25zdCBiYW5kSCA9IGJvdHRvbVYgLSB0b3BWO1xuICAgIGNvbnN0IG1pZFkgPSAodG9wViArIGJvdHRvbVYpIC8gMjtcbiAgICAvLyBTdGFnZ2VyIHN1Y2Nlc3NpdmUgbGluZXMgYWNyb3NzIHRoZSB2aXNpYmxlIGJhbmQgc28gdGhleSBzdGF5IGRpc3RpbmN0LlxuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihib3R0b21WLCBNYXRoLm1heCh0b3BWLCBtaWRZICsgY291bnQgKiBiYW5kSCAqIDAuMTIpKTtcblxuICAgIGNvbnN0IHBvbHkgPSBuZXcgUG9seWdvbigpO1xuICAgIHBvbHkubnBvaW50cyA9IDI7XG4gICAgcG9seS54cG9pbnRzID0gW3gwLCB4MV07XG4gICAgcG9seS55cG9pbnRzID0gW3ksIHldO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSBbW3gwLCB5XSwgW3gxLCB5XV07XG4gICAgcG9seS5jbG9zZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gcG9seTtcbiAgICByZWdpb24ua2luZCA9ICdwcm9maWxlJztcbiAgICByZWdpb24uY29sb3IgPSB0aGlzLlBST0ZJTEVfUEFMRVRURVt0aGlzLnByb2ZpbGVDb2xvclNlcSsrICUgdGhpcy5QUk9GSUxFX1BBTEVUVEUubGVuZ3RoXTtcbiAgICAvLyBMZWF2ZSByZWdpb24ubGFiZWwgdW5kZWZpbmVkIHNvIGFwcGx5Q2xhc3NpZmljYXRpb25Db2xvcnMgd29uJ3QgcmVjb2xvciBpdC5cblxuICAgIHRoaXMucmVnaW9uU3RvcmUuYWRkUmVnaW9uKHJlZ2lvbik7XG5cbiAgICAvLyBJZiBhIFBsb3RseSBwbG90IGlzIG9uIHNjcmVlbiwgcmUtcmVuZGVyIHNoYXBlcyBzbyB0aGUgbmV3IGxpbmUgYXBwZWFycy5cbiAgICAvLyAoVGhlIE9TRCBvdmVybGF5IHJlbmRlcnMgYXV0b21hdGljYWxseSB2aWEgaXRzIHJlZ2lvbi11cGRhdGUgc3Vic2NyaXB0aW9uLilcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICB0aGlzLnN5bmNTaGFwZXNGcm9tU3RvcmUoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgc2hhcGVzOiB0aGlzLmN1cnJlbnRSZW5kZXJTaGFwZXMoKSB9IGFzIGFueSk7XG4gICAgICB9IGNhdGNoIHsgLyogZGl2IG5vdCBhIFBsb3RseSBwbG90IChPU0Qgb3ducyBpdCkgKi8gfVxuICAgIH1cbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG5cbiAgLyoqIFRoZSBwcm9maWxlLWxpbmUgUk9JcyBjdXJyZW50bHkgaW4gdGhlIHN0b3JlIChraW5kID09PSAncHJvZmlsZScpLiAqL1xuICBwcml2YXRlIGdldFByb2ZpbGVSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKHIgPT4gKHIgYXMgYW55KS5raW5kID09PSAncHJvZmlsZScpO1xuICB9XG5cbiAgLyoqIFJlY29tcHV0ZSBhbmQgYnJvYWRjYXN0IGEgcHJvZmlsZSBmb3IgZXZlcnkgcHJvZmlsZS1saW5lIHJlZ2lvbiAoaWQgKyBjb2xvdXJcbiAgICogIHRhZ2dlZCBzbyB0aGUgaW5zZXQgdHJhY2UgbWF0Y2hlcyBpdHMgbGluZSkuICovXG4gIHByaXZhdGUgZW1pdFByb2ZpbGVzKCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQubmV4dCh0aGlzLmdldFByb2ZpbGVSZWdpb25zKCkubWFwKHIgPT4gKHtcbiAgICAgIC4uLnRoaXMuY29tcHV0ZUludGVuc2l0eVByb2ZpbGVGb3JSZWdpb24ociksXG4gICAgICBpZDogci5pZCxcbiAgICAgIGNvbG9yOiByLmNvbG9yLFxuICAgIH0pKSk7XG4gIH1cblxuICAvKipcbiAgICogU2FtcGxlIHRoZSBpbnRlbnNpdHkgcHJvZmlsZSBmb3IgYSBwcm9maWxlLWxpbmUgcmVnaW9uOiBleHRyYWN0IGl0cyB0d29cbiAgICogcG9seWdvbiBlbmRwb2ludHMgYW5kIHJldXNlIHRoZSBzaGFyZWQgYGNvbXB1dGVJbnRlbnNpdHlQcm9maWxlYCBzYW1wbGluZy5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUludGVuc2l0eVByb2ZpbGVGb3JSZWdpb24ocmVnaW9uOiBSZWdpb24pOiBJbnRlbnNpdHlQcm9maWxlIHtcbiAgICAvLyBEdWNrLXR5cGVkIChub3QgYGluc3RhbmNlb2YgUG9seWdvbmApOiBhZnRlciBhIGRyYWcgcm91bmQtdHJpcHMgdGhyb3VnaCB0aGVcbiAgICAvLyBzdG9yZSB0aGUgYm91bmRzIGNhbiBiZSBhIHBsYWluIG9iamVjdCwgc28gbWF0Y2ggb24gdGhlIHBvaW50IGFycmF5cy5cbiAgICBjb25zdCBwb2x5OiBhbnkgPSByZWdpb24uYm91bmRzO1xuICAgIGlmICghcG9seSB8fCAhQXJyYXkuaXNBcnJheShwb2x5Lnhwb2ludHMpIHx8ICFBcnJheS5pc0FycmF5KHBvbHkueXBvaW50cykgfHxcbiAgICAgICAgcG9seS54cG9pbnRzLmxlbmd0aCA8IDIgfHwgcG9seS55cG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB7IHBvc2l0aW9uczogW10sIHZhbHVlczogW10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUludGVuc2l0eVByb2ZpbGUoe1xuICAgICAgeDA6IHBvbHkueHBvaW50c1swXSwgeTA6IHBvbHkueXBvaW50c1swXSxcbiAgICAgIHgxOiBwb2x5Lnhwb2ludHNbMV0sIHkxOiBwb2x5Lnlwb2ludHNbMV0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VwcGx5IHBpeGVsIGZyYW1lcyBmb3IgaW50ZW5zaXR5IHNhbXBsaW5nICh1c2VkIGJ5IHRoZSBPU0QvaW1hZ2UgYmFja2VuZCxcbiAgICogd2hvc2UgY2FjaGVkIGZyYW1lcyBtYXkgYmUgZW1wdHkpLiBPcHRpb25hbGx5IGFsc28gc2V0cyB0aGUgZGF0YS9waXhlbCByYXRpb3MuXG4gICAqL1xuICBwdWJsaWMgc2V0U2FtcGxpbmdGcmFtZXMoZnJhbWVzOiBhbnlbXSwgcmF0aW9zOiBudW1iZXJbXSwgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZWRJbWFnZUZyYW1lcyA9IGZyYW1lcztcbiAgICBpZiAocmF0aW9zKSB0aGlzLmNhY2hlZEltYWdlUmF0aW9zID0gcmF0aW9zO1xuICAgIHRoaXMuY2FjaGVkRnJhbWVPcmlnaW4gPSBvcmlnaW47XG4gIH1cblxuICAvKipcbiAgICogUG9wdWxhdGUgdGhlIHNhbXBsaW5nIGNhY2hlIGZvciB0aGUgaW50ZW5zaXR5IHByb2ZpbGVzIHdoZW4gT3BlblNlYWRyYWdvbiBpc1xuICAgKiB0aGUgYWN0aXZlIGJhY2tlbmQgKHRoZSBJbWFnZSBwbG90IHR5cGUpLiBJbiBPU0QgbW9kZSBQbG90bHkgbmV2ZXIgcmVuZGVyZWQsXG4gICAqIHNvIGBjYWNoZWRJbWFnZUZyYW1lc2AvYHRydWVJbWdTaXplYCBhcmUgdW5zZXQg4oCUIGZldGNoIHRoZSBjdXJyZW50IHNsaWNlJ3NcbiAgICogcHJldmlldyAodGhlIHNhbWUgcGl4ZWxzIHRoZSBoZWF0bWFwIHdvdWxkIHNhbXBsZSkgc28gdGhlIGxpbmUgUk9JcyBoYXZlXG4gICAqIHBpeGVsIGRhdGEgYW5kIGEgcGxhY2VtZW50IGV4dGVudC4gUmUtZW1pdHMgdGhlIHByb2ZpbGVzIG9uY2UgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWltYWdlSW5mbz8udXJscz8ubGVuZ3RoKSByZXR1cm47XG4gICAgLy8gU2FtcGxlIGp1c3QgdGhlIGRpc3BsYXllZCBzbGljZSAoc2hvd1N0YWNrIG9mZiDihpIgc2luZ2xlIGZyYW1lKTsgYGxvYWRgXG4gICAgLy8gYWxzbyBzZXRzIGB0aGlzLnRydWVJbWdTaXplYCwgd2hpY2ggYWRkUHJvZmlsZUxpbmUgbmVlZHMgZm9yIHBsYWNlbWVudC5cbiAgICBjb25zdCBzaW5nbGUgPSB7IC4uLmltYWdlSW5mbywgc2hvd1N0YWNrOiBmYWxzZSB9IGFzIElJbWFnZUluZm87XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgdGhpcy5sb2FkKHNpbmdsZSwgekluZGV4IHx8IDApO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMgPSBsb2FkZWQuZGF0YTtcbiAgICB0aGlzLmNhY2hlZEltYWdlUmF0aW9zID0gbG9hZGVkLnJhdGlvcztcbiAgICB0aGlzLmNhY2hlZEltYWdlV2lkdGggPSBsb2FkZWQuc2l6ZXM/LlswXSA/PyB0aGlzLmNhY2hlZEltYWdlV2lkdGg7XG4gICAgdGhpcy5jYWNoZWRJbWFnZUhlaWdodCA9IGxvYWRlZC5zaXplcz8uWzFdID8/IHRoaXMuY2FjaGVkSW1hZ2VIZWlnaHQ7XG4gICAgdGhpcy5jYWNoZWRGcmFtZU9yaWdpbiA9IFswLCAwXTsgLy8gZnVsbCBwcmV2aWV3XG4gICAgdGhpcy5jYWNoZWRJc0dyYXlzY2FsZSA9ICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlO1xuICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgdGhlIHZpZXdwb3J0LWNoYW5nZSBzaWduYWwgaXMgT3BlblNlYWRyYWdvbidzXG4gICAqIChpdCByZS1zYW1wbGVzIG9uIE9TRCB6b29tL3BhbikuIFBsb3RseSdzIG93biBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlXG4gICAqIHNhbXBsaW5nIGNhY2hlIGlubGluZSwgc28gaXQgbmV2ZXIgZW1pdHMgaGVyZTsgcmV0dXJucyBFTVBUWSBzbyBhIHVuaWZvcm1cbiAgICogYElWaXN1YWxpemVyYCBjb25zdW1lciBjYW4gc3Vic2NyaWJlIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdGl2ZSBiYWNrZW5kLlxuICAgKi9cbiAgcHVibGljIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICAvKipcbiAgICogUmUtZmV0Y2ggdGhlIGdpdmVuIGltYWdlLXBpeGVsIFJPSSBhdCB0aGUgZGlzcGxheSByZXNvbHV0aW9uIGFuZCB1c2UgaXQgYXNcbiAgICogdGhlIGludGVuc2l0eS1zYW1wbGluZyBzb3VyY2UsIHNvIHRoZSBwcm9maWxlIHJlZmxlY3RzIHRoZSBkYXRhIGF0IHRoZVxuICAgKiBjdXJyZW50IHpvb20gbGV2ZWwuIFNoYXJlZCBieSBib3RoIGJhY2tlbmRzOiB0aGUgT1NEIHZpZXdwb3J0LWNoYW5nZSBob29rXG4gICAqIGNhbGxzIGl0IG9uIHpvb20vcGFuOyBQbG90bHkncyBvd24gaGlnaC1kZWYgem9vbSAodHJpZ2dlclpvb20pIHVwZGF0ZXMgdGhlXG4gICAqIHNhbWUgY2FjaGUgaW5saW5lLiBgcm9pYCBpcyBpbiBmdWxsLWltYWdlIHBpeGVsIGNvb3JkaW5hdGVzLlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgcmV0dXJuO1xuICAgIC8vIFJlbWVtYmVyIHRoZSB2aXNpYmxlIHJlZ2lvbiBzbyBhIG5ldyBwcm9maWxlIGxpbmUgaXMgcGxhY2VkIGluc2lkZSBpdC5cbiAgICB0aGlzLmxhc3RWaXNpYmxlUm9pID0geyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH07XG4gICAgY29uc3Qgcm9pID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgIHJvaS54ID0gTWF0aC5yb3VuZCh4KTsgcm9pLnkgPSBNYXRoLnJvdW5kKHkpO1xuICAgIHJvaS53aWR0aCA9IE1hdGgucm91bmQod2lkdGgpOyByb2kuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuICAgIGNvbnN0IHNjcmVlbiA9IHRoaXMucGxvdFV0aWxpdGllcy5nZXREb21SZWN0YW5nbGUoJ2RpYWdyYW0nKTtcbiAgICAvLyBTbmFwc2hvdCB0aGUgZmlsZW5hbWUgc28gYSByZXNwb25zZSB0aGF0IGFycml2ZXMgYWZ0ZXIgdGhlIHVzZXIgc3dpdGNoZWRcbiAgICAvLyBmaWxlcyBpcyBkcm9wcGVkICh0aGUgcmVxdWVzdCBjYXJyaWVkIHRoZSBmaWxlIHNlbGVjdGVkIGF0IGNhbGwgdGltZSkuXG4gICAgY29uc3QgcmVxTmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgdGhpcy50aWxlcy56b29tT25SZWdpb24ocm9pLCBzY3JlZW4sIHpJbmRleCB8fCAwKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHpvb21EYXRhKSA9PiB7XG4gICAgICAgIEltYWdlLmxvYWQoQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkoem9vbURhdGEpKSkudGhlbigoaW1hZ2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmZpbGVOYW1lICE9PSByZXFOYW1lKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgaXNHcmF5ID0gISF0aGlzLmltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSBpc0dyYXlcbiAgICAgICAgICAgID8gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgoaW1hZ2UuZ3JleSgpLmRhdGEsIGltYWdlLndpZHRoKVxuICAgICAgICAgICAgOiB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChpbWFnZS5nZXRQaXhlbHNBcnJheSgpLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgdGhpcy5zZXRTYW1wbGluZ0ZyYW1lcyhbZnJhbWVdLCBbcm9pLndpZHRoIC8gaW1hZ2Uud2lkdGgsIHJvaS5oZWlnaHQgLyBpbWFnZS5oZWlnaHRdLFxuICAgICAgICAgICAgW3JvaS54LCByb2kueV0pO1xuICAgICAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IC8qIGtlZXAgdGhlIHByZXZpb3VzIHNhbXBsaW5nIGZyYW1lIG9uIGEgZmFpbGVkIGNyb3AgZmV0Y2ggKi8gfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGUgdGhlIGFjdGl2ZSBmcmFtZSdzIGludGVuc2l0eSAoZ3JheXNjYWxlIHZhbHVlIG9yIFJHQiBsdW1pbmFuY2UpXG4gICAqIGFsb25nIHRoZSBsaW5lIFJPSS4gUmV0dXJucyBkaXN0YW5jZS1hbG9uZy1saW5lIHBvc2l0aW9ucyBhbmQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlSW50ZW5zaXR5UHJvZmlsZShsaW5lOiBhbnkpOiBJbnRlbnNpdHlQcm9maWxlIHtcbiAgICBjb25zdCBlbXB0eTogSW50ZW5zaXR5UHJvZmlsZSA9IHsgcG9zaXRpb25zOiBbXSwgdmFsdWVzOiBbXSB9O1xuICAgIGlmICghdGhpcy5jYWNoZWRJbWFnZUZyYW1lcz8ubGVuZ3RoIHx8ICFsaW5lKSByZXR1cm4gZW1wdHk7XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLmNhY2hlZEltYWdlRnJhbWVzW3RoaXMuYWN0aXZlRnJhbWVJbmRleCgpXSA/PyB0aGlzLmNhY2hlZEltYWdlRnJhbWVzWzBdO1xuICAgIGlmICghZnJhbWU/Lmxlbmd0aCkgcmV0dXJuIGVtcHR5O1xuICAgIGNvbnN0IHJ4ID0gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1swXSB8fCAxO1xuICAgIGNvbnN0IHJ5ID0gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1sxXSB8fCByeDtcbiAgICBjb25zdCBbb3gsIG95XSA9IHRoaXMuY2FjaGVkRnJhbWVPcmlnaW47XG4gICAgY29uc3QgeDAgPSArbGluZS54MCwgeTAgPSArbGluZS55MCwgeDEgPSArbGluZS54MSwgeTEgPSArbGluZS55MTtcbiAgICBjb25zdCBkeERhdGEgPSB4MSAtIHgwLCBkeURhdGEgPSB5MSAtIHkwO1xuICAgIC8vIFNjYWxlIHRoZSBhbG9uZy1saW5lIGRpc3RhbmNlIGJ5IHRoZSBwaHlzaWNhbCBwaXhlbCBzaXplIChtaWNyb25zL3BpeGVsKVxuICAgIC8vIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgb25lIOKAlCBhbmlzb3Ryb3BpYyBtcHBYL21wcFkgYXJlIGFwcGxpZWQgcGVyIGF4aXMgc29cbiAgICAvLyBkaWFnb25hbCBsaW5lcyBtZWFzdXJlIHRoZSB0cnVlIHBoeXNpY2FsIGxlbmd0aC4gRmFsbHMgYmFjayB0byBwaXhlbHMuXG4gICAgY29uc3QgeyBtcHBYLCBtcHBZIH0gPSB0aGlzLmN1cnJlbnRNcHAoKTtcbiAgICBjb25zdCB1c2VNaWNyb25zID0gbXBwWCAhPSBudWxsO1xuICAgIGNvbnN0IGxlbkRhdGEgPSB1c2VNaWNyb25zXG4gICAgICA/IE1hdGguaHlwb3QoZHhEYXRhICogbXBwWCwgZHlEYXRhICogKG1wcFkgPz8gbXBwWCkpXG4gICAgICA6IE1hdGguaHlwb3QoZHhEYXRhLCBkeURhdGEpO1xuICAgIGNvbnN0IGxlblB4ID0gTWF0aC5oeXBvdChkeERhdGEgLyByeCwgZHlEYXRhIC8gcnkpO1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgyLCBNYXRoLnJvdW5kKGxlblB4KSk7XG4gICAgY29uc3QgaCA9IGZyYW1lLmxlbmd0aDtcbiAgICBjb25zdCB3ID0gZnJhbWVbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IHBvc2l0aW9uczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IHQgPSBpIC8gKG4gLSAxKTtcbiAgICAgIC8vIE1hcCBkYXRhIGNvb3JkcyB0byB0aGUgY2FjaGVkIGZyYW1lJ3MgcGl4ZWwgZ3JpZCwgb2Zmc2V0IGJ5IHRoZSBmcmFtZSdzXG4gICAgICAvLyBvcmlnaW4gKG5vbi16ZXJvIHdoZW4gdGhlIGZyYW1lIGlzIGEgem9vbWVkIGNyb3ApLlxuICAgICAgY29uc3QgcHggPSBNYXRoLnJvdW5kKCh4MCArIHQgKiBkeERhdGEgLSBveCkgLyByeCk7XG4gICAgICBjb25zdCBweSA9IE1hdGgucm91bmQoKHkwICsgdCAqIGR5RGF0YSAtIG95KSAvIHJ5KTtcbiAgICAgIGxldCB2ID0gMDtcbiAgICAgIGlmIChweCA+PSAwICYmIHB4IDwgdyAmJiBweSA+PSAwICYmIHB5IDwgaCkge1xuICAgICAgICBjb25zdCBjZWxsID0gZnJhbWVbcHldW3B4XTtcbiAgICAgICAgdiA9IEFycmF5LmlzQXJyYXkoY2VsbCkgPyAoMC4yOTkgKiBjZWxsWzBdICsgMC41ODcgKiBjZWxsWzFdICsgMC4xMTQgKiBjZWxsWzJdKSA6IGNlbGw7XG4gICAgICB9XG4gICAgICBwb3NpdGlvbnMucHVzaCh0ICogbGVuRGF0YSk7XG4gICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcG9zaXRpb25zLCB2YWx1ZXMsIHVuaXQ6IHVzZU1pY3JvbnMgPyAnwrVtJyA6ICdweCcgfTtcbiAgfVxuXG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIChtaWNyb25zL3BpeGVsKSBmb3IgdGhlIGN1cnJlbnQgaW1hZ2UsIGlmIGtub3duLlxuICAgKiAgbXBwIGlzIGNvbnN0YW50IGFjcm9zcyBmcmFtZXMvY2hhbm5lbHMsIHNvIHRoZSBmaXJzdCBtZXRhZGF0YSBlbnRyeSB0aGF0XG4gICAqICBjYXJyaWVzIGEgcG9zaXRpdmUgbXBwWCB3aW5zLiBSZXR1cm5zIG51bGxzIHdoZW4gdGhlIGltYWdlIGlzIHVuc2NhbGVkLiAqL1xuICBwcml2YXRlIGN1cnJlbnRNcHAoKTogeyBtcHBYOiBudW1iZXIgfCBudWxsOyBtcHBZOiBudW1iZXIgfCBudWxsIH0ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmltYWdlSW5mbz8uaW1hZ2VNZXRhO1xuICAgIGNvbnN0IG0gPSBBcnJheS5pc0FycmF5KG1ldGEpXG4gICAgICA/IChtZXRhLmZpbmQoZSA9PiBlICYmIChlLm1wcFggPz8gMCkgPiAwKSA/PyBtZXRhWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbXBwWCA9IG0gJiYgKG0ubXBwWCA/PyAwKSA+IDAgPyAobS5tcHBYIGFzIG51bWJlcikgOiBudWxsO1xuICAgIGNvbnN0IG1wcFkgPSBtICYmIChtLm1wcFkgPz8gMCkgPiAwID8gKG0ubXBwWSBhcyBudW1iZXIpIDogbnVsbDtcbiAgICByZXR1cm4geyBtcHBYLCBtcHBZIH07XG4gIH1cblxuICAvKipcbiAgICogYXV0b3NjYWxlIHRoZSBwbG90XG4gICAqL1xuICBwdWJsaWMgYXV0b3NjYWxlKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gW107XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAgICd4YXhpcy5hdXRvcmFuZ2UnOiB0cnVlLFxuICAgICAgICAneWF4aXMuYXV0b3JhbmdlJzogZmFsc2UgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVsYXlvdXQgdGhlIHBsb3RcbiAgICovXG4gIHB1YmxpYyByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pIHtcbiAgICBsZXQgaW1nU2l6ZTtcbiAgICBpZiAodHJ1ZUltYWdlU2l6ZSkge1xuICAgICAgaW1nU2l6ZSA9IHRydWVJbWFnZVNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltZ1NpemUgPSB0aGlzLnRydWVJbWdTaXplO1xuICAgIH1cbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICAvLyBSZWZyZXNoIGhlaWdodCBmcm9tIGN1cnJlbnQgRE9NIHNvIHBhbmVsIHJlc2l6ZXMgYXJlIHJlZmxlY3RlZFxuICAgICAgY29uc3QgcGxvdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICAgIGlmIChwbG90RWw/Lm9mZnNldEhlaWdodCkge1xuICAgICAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHBsb3RFbC5vZmZzZXRIZWlnaHQ7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy56b29tQ29vcmRpbmF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHRoaXMuZ2V0SGVhdG1hcExheW91dChcbiAgICAgICAgICAgIFt0aGlzLnpvb21Db29yZGluYXRlc1swXSwgdGhpcy56b29tQ29vcmRpbmF0ZXNbMV1dLFxuICAgICAgICAgICAgW3RoaXMuem9vbUNvb3JkaW5hdGVzWzJdLCB0aGlzLnpvb21Db29yZGluYXRlc1szXV0pKTsgICAgLy8gcmV2ZXJzZSB0aGUgeSByYW5nZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFzIGF1dG9yYW5nZSBpcyBzZXQgdG8gZmFsc2UsIGFuZCBub3QgcmV2ZXJzZWQgd2UgbmVlZCB0byBzZXQgdGhlIHlyYW5nZSBjb3JyZWNseSBoZXJlXG4gICAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5nZXRIZWF0bWFwTGF5b3V0KFxuICAgICAgICAgICAgW2ltZ1NpemVbMF0sIGltZ1NpemVbMV1dLCBbaW1nU2l6ZVszXSwgaW1nU2l6ZVsyXV0pKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkJywgZXJyKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IFZJWl9BTEVSVF9UT0FTVF9LRVksIHN0aWNreTogdHJ1ZSwgc2V2ZXJpdHk6J2Vycm9yJywgc3VtbWFyeTonQW4gZXJyb3Igb2NjdXJlZCcsIGRldGFpbDpgVGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIG9jY3VyZWQ6ICR7bXNnfS4gUGxlYXNlIHRyeSB0byBvcGVuIHRoZSBpbWFnZSBhZ2FpbiB0aHJvdWdoIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbmF2aWdhdG9yLmAgfSk7XG4gICAgICAgIC8vIFRPRE8gY29ycmVjdGx5IGNsZWFyIHRoZSBwbG90XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEV2ZW50cyhwbG90RGl2OiBzdHJpbmcsIGlzR3JheXNjYWxlOiBib29sZWFuLCBzY3JlZW5IZWlnaHQ6IG51bWJlcikge1xuICAgIHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlID0gaXNHcmF5c2NhbGU7XG4gICAgdGhpcy5zY3JlZW5IZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgY29uc3QgcGxvdDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdik7XG4gICAgaWYgKHBsb3QpIHtcbiAgICAgIC8vIHVuYmluZCBwcmV2aW91cyBldmVudFxuICAgICAgcGxvdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbG90bHlfcmVsYXlvdXQnLCB0aGlzLm9uUmVsYXlvdXRFdmVudCk7XG4gICAgICAvLyBiaW5kIG5ldyBldmVudFxuICAgICAgcGxvdC5vbigncGxvdGx5X3JlbGF5b3V0JywgdGhpcy5vblJlbGF5b3V0RXZlbnQpO1xuXG4gICAgICAvLyBDbGlja2luZyBvbiBhIHNoYXBlIGFjdGl2YXRlcyBpdCBidXQgUGxvdGx5IGRvZXNuJ3QgZmlyZSBhIGRlZGljYXRlZFxuICAgICAgLy8gZXZlbnQg4oCUIHNhbXBsZSBfYWN0aXZlU2hhcGVJbmRleCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gc3Vic2NyaWJlcnNcbiAgICAgIC8vIChSZWdpb24gRWRpdG9yKSBjYW4gbWlycm9yIHRoZSBzZWxlY3Rpb24uXG4gICAgICBwbG90LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25QbG90TW91c2VEb3duKTtcbiAgICAgIHRoaXMub25QbG90TW91c2VEb3duID0gKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLm1heWJlRW1pdEFjdGl2ZVNoYXBlSW5kZXgoKSwgMCk7XG4gICAgICBwbG90LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25QbG90TW91c2VEb3duKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbGF5b3V0RXZlbnRIYW5kbGVyKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZXZlbnQpLmluY2x1ZGVzKCdkcmFnbW9kZScpKSB7XG4gICAgICB0aGlzLmRyYWdNb2RlID0gZXZlbnQuZHJhZ21vZGU7XG4gICAgfVxuICAgIC8vIHdoZW4gcmVsYXlvdXQgZXZlbnQgb2NjdXJzXG4gICAgLy8gdXBkYXRlIHRoZSByZWdpb24gc2VsZWN0aW9uIHVkcGRhdGVzXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50KTtcbiAgICBsZXQgc2hhcGVzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICBrZXlzLmZvckVhY2goKGtleTogYW55KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LnN0YXJ0c1dpdGgoJ3NoYXBlc1snKSkge1xuICAgICAgICBjb25zdCBzaGFwZU51bWJlciA9ICtrZXkuc3BsaXQoJ1snKVsxXS5zcGxpdCgnXScpWzBdO1xuICAgICAgICBjb25zdCBzaGFwZUNoYW5nZSA9IGtleS5zcGxpdCgnLicpWzFdO1xuICAgICAgICBpZiAodGhpcy5zaGFwZXMgJiYgdGhpcy5zaGFwZXNbc2hhcGVOdW1iZXJdKSB7XG4gICAgICAgICAgaWYgKHNoYXBlQ2hhbmdlID09PSAncGF0aCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcGVzW3NoYXBlTnVtYmVyXVtzaGFwZUNoYW5nZV0gPSB0aGlzLnBsb3RVdGlsaXRpZXMucm91bmRQYXRoQ29vcmRpbmF0ZXMoZXZlbnRba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcGVzW3NoYXBlTnVtYmVyXVtzaGFwZUNoYW5nZV0gPSBNYXRoLnJvdW5kKCtldmVudFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hhcGVzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHNoYXBlc01vZGlmaWVkKSB7XG4gICAgICAvLyBNaXJyb3IgdGhlIGluLXBsYWNlIGVkaXQgaW50byB0aGUgc2hhcmVkIHN0b3JlIChzeW5jcyBpdHMgY2FjaGUgKyBlbWl0cykuXG4gICAgICB0aGlzLmNvbW1pdFNoYXBlc1RvU3RvcmUoKTtcbiAgICB9XG4gICAgLy8gbWFuYWdlIGhpZ2ggZGVmIHpvb20gKG5vdCBpZiB3ZSBhcmUgc2hvd2luZyBhIHN0YWNrKVxuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gNCAmJiB0aGlzLmlzUmVhbFpvb20pIHtcbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzOiBhbnlbXSA9IFtdO1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgneGF4aXMucmFuZ2VbJykpIHtcbiAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKGV2ZW50W2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgneWF4aXMucmFuZ2VbJykpIHtcbiAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKGV2ZW50W2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG4gICAgICBpZiAoIXRoaXMuaW1hZ2VJbmZvLnNob3dTdGFjaykge1xuICAgICAgICB0aGlzLnRyaWdnZXJab29tKGNvb3JkaW5hdGVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2hlbiBzaGFwZSBpcyBjcmVhdGVkXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmICdzaGFwZXMnIGluIGV2ZW50KSB7XG4gICAgICB0aGlzLnNoYXBlcyA9IGV2ZW50LnNoYXBlcyBhcyBhbnlbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaGFwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQSBmcmVzaGx5IFBsb3RseS1kcmF3biBzaGFwZSBoYXMgbm8gaWQgeWV0IOKAlCBnaXZlIGl0IGEgbGFiZWwgb2JqZWN0XG4gICAgICAgIC8vICh3aGVuIGxhYmVscyBhcmUgb24pIGJlZm9yZSB0aGUgc3RvcmUgbWludHMgaWQgKyBkZWZhdWx0IG5hbWUuXG4gICAgICAgIGNvbnN0IGlzTmV3ID0gdGhpcy5zaGFwZXNbaV0uaWQgPT0gbnVsbDtcbiAgICAgICAgdGhpcy5zaGFwZXNbaV0uZmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgICAgICB0aGlzLnNoYXBlc1tpXSA9IHRoaXMucGxvdFV0aWxpdGllcy5zbmFwUmVnaW9uKHRoaXMuc2hhcGVzW2ldKTtcbiAgICAgICAgaWYgKGlzTmV3ICYmIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSkge1xuICAgICAgICAgIHRoaXMuc2hhcGVzW2ldLmxhYmVsID0geyB0ZXh0OiB0aGlzLnNoYXBlc1tpXS5sYWJlbCxcbiAgICAgICAgICAgIHRleHR0ZW1wbGF0ZTogdGhpcy5zaGFwZXNbaV0ubGFiZWwsXG4gICAgICAgICAgICBmb250OiB7IGNvbG9yOiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSB9LFxuICAgICAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWludCBpZHMvbmFtZXMgaW4gdGhlIHN0b3JlLCB3cml0ZSB0aGVtIGJhY2sgb250byB0aGUgZGljdHMsIGFuZCBlbWl0LlxuICAgICAgdGhpcy5jb21taXRTaGFwZXNUb1N0b3JlKCk7XG4gICAgICBpZiAodGhpcy5pc1JlZ2lvblNhdmVkT24pIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGlmIGF1dG9zY2FsZVxuICAgIGlmIChrZXlzLmluY2x1ZGVzKCd4YXhpcy5hdXRvcmFuZ2UnKSAmJiBrZXlzLmluY2x1ZGVzKCd5YXhpcy5hdXRvcmFuZ2UnKSkge1xuICAgICAgLy8gdHJpZ2dlciBhbiBhdXRvc2NhbGUgZXZlbnQgdG8gcmVzZXQgdGhlIHNlbGVjdGVkIGltYWdlIG1vZGUgZHJvcGRvd25cbiAgICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQubmV4dCgnYW4gYXV0b3NjYWxlIGhhcyBoYXBwZW5lZCcpO1xuICAgICAgLy8gc2VsZWN0IGRpc3BsYXkgdHlwZSB0byB0cmlnZ2VyIGEgbmV3IHBsb3R0aW5nIHVwZGF0ZSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHBsb3R0aW5nIHBhcmFtZXRlcnMgc2V0XG4gICAgICB0aGlzLnRpbGVzLnNlbGVjdERpYWdyYW1EaXNwbGF5KCk7XG4gICAgfVxuICAgIC8vIGlmIHNob3dzdGFjayBvciBhc3BlY3RyYXRpbyBldmVudFxuICAgIGlmIChldmVudC5zaG93c3RhY2sgIT09IHVuZGVmaW5lZCB8fCBldmVudC5hc3BlY3RyYXRpbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTZXQgbmV3IGltYWdlIGluZm8gdG8gdHJpZ2dlciBhIHBsb3QgdXBkYXRlXG4gICAgICB0aGlzLnNldEltYWdlSW5mbyhldmVudC5zaG93c3RhY2ssIGV2ZW50LmFzcGVjdHJhdGlvKTtcbiAgICB9XG5cbiAgICAvLyBQbG90bHkgbWF5IGhhdmUgdXBkYXRlZCB0aGUgYWN0aXZlIHNoYXBlIGluZGV4IGFzIHBhcnQgb2YgdGhlIHJlbGF5b3V0XG4gICAgLy8gKGUuZy4gY2xpY2tpbmcgYSBzaGFwZSdzIGVkaXQgaGFuZGxlLCBvciBmaW5pc2hpbmcgYSBkcmF3KSDigJQgc3VyZmFjZVxuICAgIC8vIHRoYXQgY2hhbmdlIHRvIHRoZSBSZWdpb24gRWRpdG9yLlxuICAgIHRoaXMubWF5YmVFbWl0QWN0aXZlU2hhcGVJbmRleCgpO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZEFuZFBsb3QoKSB7XG4gICAgdGhpcy5zZXRJbWFnZUluZm8oKTtcbiAgfVxuXG5cbiAgLy8g4pSA4pSAIFRvb2wgZGVsZWdhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHVibGljIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9uczogV2FuZE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFJlLWJpbmQgdG8gb3Vyc2VsdmVzIGluIGNhc2UgdGhlIE9TRCBiYWNrZW5kIGxhc3QgdXNlZCB0aGVzZSBzaW5nbGV0b25zLlxuICAgIGlmIChhY3RpdmUpIHRoaXMud2FuZFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogV2FuZE9wdGlvbnMpIHtcbiAgICB0aGlzLndhbmRUb29sLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCkge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zOiBCcnVzaE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFJlLWJpbmQgdG8gb3Vyc2VsdmVzIGluIGNhc2UgdGhlIE9TRCBiYWNrZW5kIGxhc3QgdXNlZCB0aGlzIHNpbmdsZXRvbi5cbiAgICBpZiAoYWN0aXZlKSB0aGlzLmJydXNoVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IEJydXNoT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNpemUgIT0gbnVsbCkgdGhpcy5icnVzaFRvb2wuc2V0U2l6ZShvcHRpb25zLnNpemUpO1xuICB9XG5cbiAgcHVibGljIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpIHtcbiAgICB0aGlzLnZlcnRleEVyYXNlclRvb2wuc2V0UmFkaXVzKHJhZGl1cyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAvLyBUaGUgem9vbS10by1ib3ggdG9vbCBpcyBhIHJvb3Qgc2luZ2xldG9uIHNoYXJlZCB3aXRoIHRoZSBPU0QgYmFja2VuZCxcbiAgICAvLyB3aGljaCByZWJpbmRzIGl0IHRvIGl0cyBvd24gaG9zdCBvbiBhY3RpdmF0aW9uLiBSZWJpbmQgdG8gb3VycyB3aGVuIHdlXG4gICAgLy8gYWN0aXZhdGUgc28gYSBwcmlvciBPU0Qgem9vbS10by1ib3ggZG9lc24ndCBsZWF2ZSB0aGUgc2luZ2xldG9uIHBvaW50aW5nXG4gICAgLy8gYXQgT1NEJ3MgY29vcmRpbmF0ZS96b29tIGhhbmRsZXJzICh3aGljaCB3b3VsZCBicmVhayBib3gtem9vbSBvbiBoZWF0bWFwcykuXG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5iaW5kWm9vbVRvQm94SG9zdCgpO1xuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cblxuICAvKiogQmluZCB0aGUgc2hhcmVkIHpvb20tdG8tYm94IHRvb2wgdG8gdGhpcyAoUGxvdGx5KSBiYWNrZW5kJ3MgaG9zdC4gKi9cbiAgcHJpdmF0ZSBiaW5kWm9vbVRvQm94SG9zdCgpIHtcbiAgICB0aGlzLnpvb21Ub0JveFRvb2wuYmluZEhvc3Qoe1xuICAgICAgZ2V0UGxvdERpdjogKCkgPT4gdGhpcy5wbG90RGl2LFxuICAgICAgcGl4ZWxUb0RhdGE6IChweCwgcHkpID0+IHRoaXMuem9vbUJveFBpeGVsVG9EYXRhKHB4LCBweSksXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU06IHNlZ21lbnQgdGhlIGRyYXduIHJlY3RhbmdsZXMuIFRoZSBTQU0gdG9vbCByZXVzZXMgdGhlXG4gICAqICB3YW5kIGhvc3QgKGNhY2hlZCBmcmFtZSArIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgcmVnaW9uIHN0b3JlKS4gKi9cbiAgcHVibGljIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgcHVibGljIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtcbiAgICB0aGlzLmNlbGxTZWdtZW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5jZWxsU2VnbWVudFRvb2wuc2VnbWVudEJveGVzKHRoaXMuY2VsbFNlZ21lbnRlcik7XG4gIH1cbiAgcHVibGljIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvb2wuc2V0TW9kZWwoaWQpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGVsKGlkKTtcbiAgfVxuICBwdWJsaWMgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHRoaXMuc2FtUG9pbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBwdWJsaWMgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jb21taXQoKTsgfVxuICBwdWJsaWMgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNsZWFyKCk7IH1cblxuICAvKipcbiAgICogVG9vbC1ob3N0IGNhbGxiYWNrOiBhcHBseSB0aGUgem9vbS10by1ib3ggc2VsZWN0aW9uLiBTdGFjayBtb2RlIGRvZXMgYVxuICAgKiBwdXJlIGF4aXMtcmFuZ2UgcmVsYXlvdXQ7IG5vbi1zdGFjayBtb2RlIGdvZXMgdGhyb3VnaCB0aGUgaGlnaC1kZWZcbiAgICogdHJpZ2dlclpvb20gcGlwZWxpbmUgc28gdGhlIGltYWdlIGlzIHJlLWZldGNoZWQgYXQgdGhlIG5ldyByZXNvbHV0aW9uLlxuICAgKi9cbiAgLyoqIE92ZXJsYXktcGl4ZWwgLT4gUGxvdGx5IGRhdGEgY29vcmRzIHZpYSB0aGUgYXhpcyBvYmplY3RzIChzdWJ0cmFjdGluZyB0aGVcbiAgICogIHBsb3QgbWFyZ2luIG9mZnNldCkuIFRoZSB6b29tLXRvLWJveCB0b29sIGNhbGxzIHRoaXMgdGhyb3VnaCBpdHMgaG9zdC4gKi9cbiAgcHJpdmF0ZSB6b29tQm94UGl4ZWxUb0RhdGEocHg6IG51bWJlciwgcHk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgY29uc3QgeGF4aXMgPSBnZC5fZnVsbExheW91dC54YXhpcztcbiAgICBjb25zdCB5YXhpcyA9IGdkLl9mdWxsTGF5b3V0LnlheGlzO1xuICAgIHJldHVybiB7IHg6IHhheGlzLnAyZChweCAtIHhheGlzLl9vZmZzZXQpLCB5OiB5YXhpcy5wMmQocHkgLSB5YXhpcy5fb2Zmc2V0KSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pIHtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuICAgIGlmICh0aGlzLmltYWdlSW5mbz8uc2hvd1N0YWNrKSB7XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAgICd4YXhpcy5yYW5nZVswXSc6IGNvb3JkaW5hdGVzWzBdLFxuICAgICAgICAneGF4aXMucmFuZ2VbMV0nOiBjb29yZGluYXRlc1sxXSxcbiAgICAgICAgJ3lheGlzLnJhbmdlWzBdJzogY29vcmRpbmF0ZXNbMl0sXG4gICAgICAgICd5YXhpcy5yYW5nZVsxXSc6IGNvb3JkaW5hdGVzWzNdLFxuICAgICAgfSBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyaWdnZXJab29tKGNvb3JkaW5hdGVzKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgSVZpZXdwb3J0SG9zdCBpbXBsZW1lbnRhdGlvbiAoZm9yIHRoZSBvbi1jYW52YXMgdG9vbHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgcGxvdCBlbGVtZW50IHRoZSB0b29sIGNhbnZhcyBvdmVybGF5cyBhdHRhY2ggdG8uICovXG4gIHB1YmxpYyBnZXRPdmVybGF5Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICB9XG5cbiAgLyoqIFBsb3RseSBjb29yZGluYXRlIHRyYW5zZm9ybSAoc2NyZWVuIDwtPiBkYXRhIHZpYSB0aGUgYXhpcyBvYmplY3RzKS4gKi9cbiAgcHVibGljIGdldENvb3JkaW5hdGVUcmFuc2Zvcm0oKTogSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVUcmFuc2Zvcm07XG4gIH1cblxuICAvLyDilIDilIAgV2FuZFRvb2xIb3N0IGltcGxlbWVudGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBQaXhlbCBkYXRhIHRoZSB3YW5kIG5lZWRzIGZvciBzYW1wbGluZy4gbnVsbCA9IG5vIGltYWdlIGxvYWRlZC4gKi9cbiAgcHJpdmF0ZSBnZXRDYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzIHx8IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgZnJhbWVzOiB0aGlzLmNhY2hlZEltYWdlRnJhbWVzLFxuICAgICAgd2lkdGg6IHRoaXMuY2FjaGVkSW1hZ2VXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jYWNoZWRJbWFnZUhlaWdodCxcbiAgICAgIHJhdGlvczogdGhpcy5jYWNoZWRJbWFnZVJhdGlvcyxcbiAgICAgIGlzR3JheXNjYWxlOiB0aGlzLmNhY2hlZElzR3JheXNjYWxlLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIAgc2hhcmVkLXN0b3JlIHN5bmMgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gYHRoaXMuc2hhcGVzYCBpcyBQbG90bHkncyBvd24gcmVwcmVzZW50YXRpb24gKHRoZSBkaWN0IGFycmF5IFBsb3RseS5yZWxheW91dFxuICAvLyBjb25zdW1lcykuIFRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgsIGhvbGRpbmcgdGhlXG4gIC8vIG5ldXRyYWwgUmVnaW9uIG1vZGVsLiBUaGVzZSBoZWxwZXJzIGJyaWRnZSB0aGUgdHdvOiB3cml0ZXMgbWlycm9yXG4gIC8vIGB0aGlzLnNoYXBlc2AgSU5UTyB0aGUgc3RvcmU7IGltYWdlIHN3aXRjaGVzL2V4dGVybmFsIGNoYW5nZXMgcHJvamVjdCB0aGVcbiAgLy8gc3RvcmUgYmFjayBPVVQgdG8gYHRoaXMuc2hhcGVzYC5cblxuICAvKiogQnVpbGQgUGxvdGx5IHNoYXBlIGRpY3RzIGZyb20gdGhlIHN0b3JlJ3MgcmVnaW9ucyAodGhlIHJlbmRlciBwcm9qZWN0aW9uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25zVG9TaGFwZURpY3RzKCk6IGFueVtdIHtcbiAgICBjb25zdCBzaG93TGFiZWwgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCk7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLm1hcChyID0+IHtcbiAgICAgIHIuZmlsZW5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgICAgcmV0dXJuIHsgLi4uci5nZXRTaGFwZShzaG93TGFiZWwpIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgZGljdCB3b3JraW5nLXNldCBmcm9tIHRoZSBzdG9yZSAoYWZ0ZXIgYW4gaW1hZ2Ugc3dpdGNoLCBvciB3aGVuXG4gICAqICByZWdpb25zIGNoYW5nZWQgd2hpbGUgYW5vdGhlciBiYWNrZW5kIHdhcyByZW5kZXJpbmcpLiAqL1xuICBwcml2YXRlIHN5bmNTaGFwZXNGcm9tU3RvcmUoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFwZXMgPSB0aGlzLnJlZ2lvbnNUb1NoYXBlRGljdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSBzaGFyZWQgc3RvcmUgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlIGN1cnJlbnQgZGljdCB3b3JraW5nLXNldDogY29udmVydFxuICAgKiBgdGhpcy5zaGFwZXNgIHRvIG5ldXRyYWwgcmVnaW9ucyBhbmQgcmVwbGFjZSB0aGUgc3RvcmUncyBsaXN0ICh0aGUgc3RvcmVcbiAgICogbWludHMgaWRzLCBhcHBsaWVzIGNsYXNzIGNvbG91cnMsIHN5bmNzIGl0cyBwZXItaW1hZ2UgY2FjaGUgYW5kIGVtaXRzIHRoZVxuICAgKiByZWdpb24tdXBkYXRlIGV2ZW50KS4gU3RvcmUtbWludGVkIGlkcyBhcmUgd3JpdHRlbiBiYWNrIG9udG8gdGhlIGRpY3RzIHNvIHRoZVxuICAgKiB0d28gcmVwcmVzZW50YXRpb25zIHN0YXkgYWxpZ25lZC4gUHJvZmlsZS1saW5lIFJPSXMgYXJlIG9yZGluYXJ5IHJlZ2lvbnNcbiAgICogKHRhZ2dlZCBga2luZDogJ3Byb2ZpbGUnYCkgYW5kIHJvdW5kLXRyaXAgdGhyb3VnaCBoZXJlIHRvby5cbiAgICovXG4gIHByaXZhdGUgY29tbWl0U2hhcGVzVG9TdG9yZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZWdpb25zID0gdGhpcy5zaGFwZXNcbiAgICAgIC5tYXAocyA9PiBPYmplY3QuYXNzaWduKG5ldyBTaGFwZVNlbGVjdGlvbigpLCBzKS5nZXRSZWdpb24oKSk7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSwgdHJ1ZSxcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCksIGZhbHNlKTtcbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hhcGVzLmxlbmd0aCAmJiBpIDwgc3RvcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5zaGFwZXNbaV0uaWQgPT0gbnVsbCkgdGhpcy5zaGFwZXNbaV0uaWQgPSBzdG9yZWRbaV0uaWQ7XG4gICAgICBpZiAodGhpcy5zaGFwZXNbaV0ubmFtZSA9PSBudWxsKSB0aGlzLnNoYXBlc1tpXS5uYW1lID0gc3RvcmVkW2ldLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1c2ggdGhlIGN1cnJlbnQgYHRoaXMuc2hhcGVzYCB0byBQbG90bHksIG1pcnJvciB0aGVtIGludG8gdGhlIHNoYXJlZCBzdG9yZVxuICAgKiAod2hpY2ggc3luY3MgaXRzIGNhY2hlICsgZW1pdHMgdGhlIHJlZ2lvbi11cGRhdGUgZXZlbnQpLCBhbmQgcmVmcmVzaCB0aGVcbiAgICogbG9jYWwgcHJldmlvdXMtc2hhcGVzIGJ1ZmZlci4gVGhlIHdhbmQvZXJhc2VyIHRvb2xzIGNhbGwgdGhpcyBhZnRlciBtdXRhdGluZ1xuICAgKiB0aGUgc2hhcGVzIGFycmF5IGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIGFwcGx5U2hhcGVzQ2hhbmdlKCkge1xuICAgIGlmICh0aGlzLmlzUmVnaW9uU2F2ZWRPbikge1xuICAgICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gICAgfVxuICAgIHRoaXMuY29tbWl0U2hhcGVzVG9TdG9yZSgpO1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIGNvbnN0IGRpY3RBcnJheSA9IHRoaXMuc2hhcGVzLm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5zaGFwZXNSZWxheW91dChkaWN0QXJyYXkpIGFzIGFueSk7XG4gICAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSDigJQgaXRzIG92ZXJsYXkgcmVuZGVycyBzaGFwZXMgKi8gfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBBY3RpdmUgZnJhbWUgaW5kZXggaW4gdGhlIGNhY2hlZCBpbWFnZSBzdGFjay4gKi9cbiAgcHJpdmF0ZSBhY3RpdmVGcmFtZUluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzIHx8IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMubGVuZ3RoIDw9IDEpIHJldHVybiAwO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGNvbnN0IHNsaWRlckFjdGl2ZSA9IGdkPy5fZnVsbExheW91dD8uc2xpZGVycz8uWzBdPy5hY3RpdmU7XG4gICAgaWYgKHR5cGVvZiBzbGlkZXJBY3RpdmUgPT09ICdudW1iZXInKSByZXR1cm4gc2xpZGVyQWN0aXZlO1xuICAgIHJldHVybiB0aGlzLnpJbmRleC52YWx1ZSB8fCAwO1xuICB9XG5cbiAgLyoqIENhcGFiaWxpdHktZ2F0ZWQgM0Qgc2NlbmUgY29udHJvbHMgKFBsb3RseSByZW5kZXJzIHRoZSAzRCBwbG90IHR5cGVzKS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFN1cmZhY2VEcmFnTW9kZTogKG1vZGU6IHN0cmluZykgPT4gdGhpcy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSksXG4gICAgICByZXNldFN1cmZhY2VDYW1lcmE6ICgpID0+IHRoaXMucmVzZXRTdXJmYWNlQ2FtZXJhKCksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyAnc2NlbmUuZHJhZ21vZGUnOiBtb2RlIH0gYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXRTdXJmYWNlQ2FtZXJhKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgJ3NjZW5lLmNhbWVyYSc6IHt9IH0gYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJab29tKGNvb3JkaW5hdGVzOiBudW1iZXJbXSkge1xuICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPT09IDAgfHwgIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybjtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0UmVjdGFuZ2xlKGNvb3JkaW5hdGVzLCB0aGlzLnRydWVJbWdTaXplKTtcbiAgICBpZiAodGhpcy5wbG90VXRpbGl0aWVzLmlzWm9vbVNhbWVBc0ltZ1NpemUocmVjdCwgdGhpcy50cnVlSW1nU2l6ZSkpIHtcbiAgICAgIHRoaXMuYXV0b3NjYWxlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgYnJpZWYgXCJDYWNoaW5nIGltYWdlLi4uXCIgbWVzc2FnZSBmb3IgdW5jYWNoZWQgZmlsZXMgKGxhcmdlIGZpbGVzIHRha2UgYVxuICAgIC8vIG1vbWVudCB0byBjYWNoZSk7IGp1c3QgYSBzcGlubmVyIG90aGVyd2lzZS5cbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZ01lc3NhZ2UodGhpcy5pbWFnZUNhY2hlZCA/ICcnIDogJ0NhY2hpbmcgaW1hZ2UuLi4nKTtcbiAgICBjb25zdCBzY3JlZW4gPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0RG9tUmVjdGFuZ2xlKCdkaWFncmFtJyk7XG4gICAgY29uc3QgaW1hZ2VTaXplOiBhbnlbXSA9IFtdO1xuICAgIGltYWdlU2l6ZVswXSA9IHJlY3QueDtcbiAgICBpbWFnZVNpemVbMV0gPSByZWN0LnggKyByZWN0LndpZHRoO1xuICAgIGltYWdlU2l6ZVsyXSA9IHJlY3QueTtcbiAgICBpbWFnZVNpemVbM10gPSByZWN0LnkgKyByZWN0LmhlaWdodDtcbiAgICAvLyBTbmFwc2hvdCB0aGUgZmlsZW5hbWUgc28gYSByZXNwb25zZSB0aGF0IGFycml2ZXMgYWZ0ZXIgdGhlIHVzZXIgc3dpdGNoZWRcbiAgICAvLyBmaWxlcyBpcyBkcm9wcGVkICh0aGUgcmVxdWVzdCBjYXJyaWVkIHRoZSBmaWxlIHNlbGVjdGVkIGF0IGNhbGwgdGltZSkuXG4gICAgY29uc3QgcmVxTmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5zdGF0ZS5zZXRab29tKHRydWUpO1xuICAgIHRoaXMudGlsZXMuem9vbU9uUmVnaW9uKHJlY3QsIHNjcmVlbiwgdGhpcy56SW5kZXgudmFsdWUpLnN1YnNjcmliZSh7IG5leHQ6IHpvb21EYXRhID0+IHtcbiAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSh6b29tRGF0YSk7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh1aW50OEFycmF5KTtcbiAgICAgIEltYWdlLmxvYWQoYnVmZmVyKS50aGVuKChpbWFnZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHhSYXRpbyA9IHJlY3Qud2lkdGggLyBpbWFnZS53aWR0aDtcbiAgICAgICAgY29uc3QgeVJhdGlvID0gcmVjdC5oZWlnaHQgLyBpbWFnZS5oZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmZpbGVOYW1lID09PSByZXFOYW1lKSB7XG4gICAgICAgICAgY29uc3QgaXNHcmF5ID0gdGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSBpc0dyYXlcbiAgICAgICAgICAgID8gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgoaW1hZ2UuZ3JleSgpLmRhdGEsIGltYWdlLndpZHRoKVxuICAgICAgICAgICAgOiB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChpbWFnZS5nZXRQaXhlbHNBcnJheSgpLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgLy8gQWxzbyBzYW1wbGUgdGhlIGludGVuc2l0eSBwcm9maWxlcyBmcm9tIHRoaXMgaGlnaC1kZWYgY3JvcCBzbyB0aGVcbiAgICAgICAgICAvLyBpbnNldCByZWZsZWN0cyB0aGUgem9vbS1sZXZlbCByZXNvbHV0aW9uIChvcmlnaW4gPSBjcm9wIHRvcC1sZWZ0KS5cbiAgICAgICAgICB0aGlzLnNldFNhbXBsaW5nRnJhbWVzKFtmcmFtZV0sIFt4UmF0aW8sIHlSYXRpb10sIFtpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsyXV0pO1xuICAgICAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBoaWdoLWRlZiBjcm9wIGluIHRoZSBTQU1FIHBsb3QgdHlwZSB0aGUgdXNlciBpc1xuICAgICAgICAgIC8vIHZpZXdpbmcuIFdpdGhvdXQgdGhpcyB0aGUgem9vbSByZS1mZXRjaCBhbHdheXMgZmVsbCBiYWNrIHRvIGFcbiAgICAgICAgICAvLyBoZWF0bWFwLCBzbyB6b29taW5nIGluIGNvbnRvdXIgKG9yIGFueSByZWdpc3RyeSB0eXBlKSByZXZlcnRlZFxuICAgICAgICAgIC8vIHRvIGhlYXRtYXAuXG4gICAgICAgICAgY29uc3QgaW1wbCA9IFBMT1RMWV9QTE9UX1RZUEVfSU1QTFNbdGhpcy5wbG90VHlwZV07XG4gICAgICAgICAgY29uc3QgcmVuZGVyUHJvbWlzZSA9IGltcGxcbiAgICAgICAgICAgID8gdGhpcy5wbG90VmlhUmVnaXN0cnkodGhpcy5wbG90RGl2LCBpbXBsLFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRUcmFjZUlucHV0KHRoaXMuaW1hZ2VJbmZvLCB7XG4gICAgICAgICAgICAgICAgICBkYXRhOiBbZnJhbWVdLCByYXRpb3M6IFt4UmF0aW8sIHlSYXRpb10sXG4gICAgICAgICAgICAgICAgICBzaXplczogW2ltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHRdLCBmaWxlbmFtZTogcmVxTmFtZSxcbiAgICAgICAgICAgICAgICB9LCBpbWFnZVNpemUpLCB0aGlzLnNjcmVlbkhlaWdodClcbiAgICAgICAgICAgIDogKGlzR3JheVxuICAgICAgICAgICAgICAgID8gdGhpcy5wbG90SGVhdG1hcCh0aGlzLnBsb3REaXYsIHRoaXMudXJscywgW2ZyYW1lXSwgaW1hZ2VTaXplLCBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmVlbkhlaWdodClcbiAgICAgICAgICAgICAgICA6IHRoaXMucGxvdFJHQkhlYXRtYXAodGhpcy5wbG90RGl2LCB0aGlzLnVybHMsIFtmcmFtZV0sIGltYWdlU2l6ZSwgW3hSYXRpbywgeVJhdGlvXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgdGhpcy5zY3JlZW5IZWlnaHQpKTtcbiAgICAgICAgICAvLyBwbG90VmlhUmVnaXN0cnkgYWxyZWFkeSBhcHBsaWVzIHRoZSB0eXBlJ3Mgb3duIGxheW91dC9yYW5nZSBmb3JcbiAgICAgICAgICAvLyBub24taW1hZ2UgbGF5b3V0cyAoY2hhcnQvb3ZlcmxheSk7IG9ubHkgcmUtYXBwbHkgdGhlIGhlYXRtYXBcbiAgICAgICAgICAvLyByYW5nZSBmb3IgdGhlIGltYWdlLWFsaWduZWQgcGF0aHMuXG4gICAgICAgICAgY29uc3QgcmVhcHBseVJhbmdlID0gIWltcGwgfHwgaW1wbC5sYXlvdXRLaW5kID09PSAnMmQtaW1hZ2UnO1xuICAgICAgICAgIHJlbmRlclByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlQ2FjaGVkKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgaW1hZ2UgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHJlYXBwbHlSYW5nZSkgdGhpcy5yZWxheW91dChpbWFnZVNpemUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBlcnJvcjogZXJyID0+IHtcbiAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IGVycj8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQgd2hlbiB6b29taW5nJywgZXJyKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiBWSVpfQUxFUlRfVE9BU1RfS0VZLCBzdGlja3k6IHRydWUsIHNldmVyaXR5OidlcnJvcicsIHN1bW1hcnk6J0FuIGVycm9yIG9jY3VyZWQnLFxuICAgICAgICBkZXRhaWw6YFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJlZCB3aGlsZSB6b29taW5nOiAke21zZ30uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSB0cnkgdG8gb3BlbiB0aGUgaW1hZ2UgYWdhaW4gdGhyb3VnaCB0aGUgZmlsZSBuYXZpZ2F0b3IgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gb24gdGhlIHNlbGVjdGVkIGFyZWEgb25jZSBtb3JlLmAgfSk7XG4gICAgICB0aGlzLnN0YXRlLnNldExvYWRpbmdFcnJvcih0cnVlKTtcbiAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICB9LCBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3pvb21pbmcgY29tcGxldGUnKTtcbiAgICB9IH0pO1xuICB9XG5cbiAgcHVibGljIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSkge1xuICAgIHRoaXMucGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW1hZ2VJbmZvKHNob3dTdGFjaz86IGJvb2xlYW4sIHNjYWxlcmF0aW8/OiBib29sZWFuKSB7XG4gICAgLy8gQnVpbGQgYSBwYXJ0aWFsIGltYWdlIGRlc2NyaXB0b3IgYW5kIHB1c2ggaXQgdG8gdGhlIGhvc3QgdmlhIHRoZSBwb3J0LlxuICAgIGNvbnN0IGltZ0luZm86IFBhcnRpYWw8SUltYWdlSW5mbz4gPSB7XG4gICAgICBpc0dyYXlzY2FsZTogdGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGUsXG4gICAgICB0cnVlSW1hZ2VTaXplOiBbdGhpcy50cnVlSW1nU2l6ZVsxXSwgdGhpcy50cnVlSW1nU2l6ZVszXV0sXG4gICAgICB1cmxzOiB0aGlzLnVybHMsXG4gICAgICBpc1N0YWNrOiB0aGlzLnVybHMubGVuZ3RoID4gMSxcbiAgICAgIHNjYWxlUmF0aW86IHNjYWxlcmF0aW8gIT09IHVuZGVmaW5lZCA/IHNjYWxlcmF0aW8gOiB0aGlzLnNjYWxlcmF0aW8sXG4gICAgfTtcbiAgICBpZiAoc2hvd1N0YWNrICE9PSB1bmRlZmluZWQpIGltZ0luZm8uc2hvd1N0YWNrID0gc2hvd1N0YWNrO1xuICAgIGlmICh0aGlzLmZpbGVOYW1lKSBpbWdJbmZvLmZpbGVOYW1lID0gdGhpcy5maWxlTmFtZTtcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyhpbWdJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTaGFwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyYW1ld29yay1uZXV0cmFsIHZpZXcgb2YgdGhlIGN1cnJlbnQgcmVnaW9ucyDigJQgZGVsZWdhdGVzIHRvIHRoZSBzaGFyZWRcbiAgICogUmVnaW9uU3RvcmUgKHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoKS4gVGhlIGNhbm9uaWNhbCBhY2Nlc3NvciBvbiB0aGVcbiAgICogYElWaXN1YWxpemVyYCBjb250cmFjdDsgY29uc3VtZXJzIHNob3VsZCBwcmVmZXIgdGhpcyBvdmVyIGBnZXRTaGFwZXMoKWBcbiAgICogKHdoaWNoIGV4cG9zZXMgUGxvdGx5LXNoYXBlZCBkaWN0cykuXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIGltYWdlLiBUaGUgc2hhcmVkIFJlZ2lvblN0b3JlIG93bnMgdGhlIHBlci1pbWFnZSByZWdpb25cbiAgICogY2FjaGUgKHNuYXBzaG90IG91dGdvaW5nIC8gcmVzdG9yZSBpbmNvbWluZyAvIGNsZWFyIHNlbGVjdGlvbiAvIGVtaXQpOyB3ZVxuICAgKiBkZWxlZ2F0ZSB0byBpdCwgdGhlbiByZS1wcm9qZWN0IHRoZSBzdG9yZSdzIHJlZ2lvbnMgaW50byBQbG90bHkncyBkaWN0XG4gICAqIHdvcmtpbmctc2V0LiBSZS1wcm9qZWN0aW5nIHVuY29uZGl0aW9uYWxseSAoZXZlbiB3aGVuIHRoZSBzdG9yZSBuby1vcHMgZm9yXG4gICAqIHRoZSBzYW1lIGltYWdlKSBtZWFucyBQbG90bHkgYWxzbyBwaWNrcyB1cCByZWdpb25zIGFub3RoZXIgYmFja2VuZCAoT1NEKVxuICAgKiBhZGRlZCB3aGlsZSBpdCB3YXMgb2ZmLXNjcmVlbi4gQ2FsbGVkIGZyb20gYHBsb3QoKWAgYW5kIGZyb20gdGhlIHJvdXRlclxuICAgKiBiZWZvcmUgYW55IGJhY2tlbmQgcmVuZGVycy5cbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmVJbWFnZShpbWFnZUluZm86IElJbWFnZUluZm8pIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldEFjdGl2ZUltYWdlKGltYWdlSW5mbyk7XG4gICAgdGhpcy5zeW5jU2hhcGVzRnJvbVN0b3JlKCk7XG4gICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gIH1cblxuICAvKiogVGVzdC9kZXYgaG9vayDigJQgZHJvcCB0aGUgZW50aXJlIHBlci1pbWFnZSBjYWNoZSAobG9nb3V0IC8gcHJvamVjdCBzd2l0Y2gpLiAqL1xuICBwdWJsaWMgY2xlYXJSZWdpb25zQnlJbWFnZUtleSgpIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmNsZWFyUmVnaW9uc0J5SW1hZ2VLZXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBzZWxlY3RlZCByZWdpb25zIGFzIHBvbHlnb25zLiBPcGVuIHBvbHlsaW5lcyAoY2xvc2VkID09PSBmYWxzZSlcbiAgICogYXJlIGV4Y2x1ZGVkIOKAlCB0aGV5J3JlIGFubm90YXRpb24tb25seSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgZmlsbGVkIHJlZ2lvbnNcbiAgICogZm9yIGltYWdlIHByb2Nlc3NpbmcuIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkIHN0b3JlLlxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lvblBvbHlnb25zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Qb2x5Z29ucygpO1xuICB9XG5cbiAgaXNSZWN0YW5nbGUoYm5kczogYW55KTogYm5kcyBpcyBSZWN0YW5nbGUge1xuICAgIHJldHVybiAneCcgaW4gYm5kcyAmJiAneScgaW4gYm5kcyAmJiAnd2lkdGgnIGluIGJuZHMgJiYgJ2hlaWdodCcgaW4gYm5kcztcbiAgfVxuXG4gIGlzUG9seWdvbihibmRzOiBhbnkpOiBibmRzIGlzIFBvbHlnb24ge1xuICAgIHJldHVybiAnbnBvaW50cycgaW4gYm5kcyAmJiAneHBvaW50cycgaW4gYm5kcyAmJiAneXBvaW50cycgaW4gYm5kcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGxvdCByZWdpb25zLiBEZWxlZ2F0ZXMgdGhlIHN0YXRlIGNoYW5nZSB0byB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlXG4gICAqIChpZC9uYW1lIG1pbnRpbmcsIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMsIGFwcGVuZCBkZS1kdXBsaWNhdGlvbiwgcGVyLWltYWdlXG4gICAqIGNhY2hlIGFuZCB0aGUgcmVnaW9uLXVwZGF0ZSBldmVudCBhbGwgbGl2ZSB0aGVyZSksIHRoZW4gcmUtcHJvamVjdHMgdGhlXG4gICAqIHN0b3JlJ3MgcmVnaW9ucyBpbnRvIFBsb3RseSdzIGRpY3Qgd29ya2luZy1zZXQgYW5kIHJlbmRlcnMuXG4gICAqXG4gICAqIFdoZW4gYGlzUmVnaW9uU2F2ZU9uYCBpcyBmYWxzZSB0aGUgcmVnaW9ucyBhcmUgc2hvd24gdHJhbnNpZW50bHkg4oCUIHJlbmRlcmVkXG4gICAqIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIHN0b3JlZCB3b3JraW5nLXNldCAocHJlc2VydmVzIHRoZSBwcmlvciBiZWhhdmlvdXIpLlxuICAgKi9cbiAgcHVibGljIHNldFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10sIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbiwgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHNob3dMYWJlbCA9IHNob3dSZWdpb25MYWJlbCA9PT0gdW5kZWZpbmVkID8gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpIDogc2hvd1JlZ2lvbkxhYmVsO1xuICAgIGNvbnN0IHNhdmUgPSBpc1JlZ2lvblNhdmVPbiA9PT0gdW5kZWZpbmVkID8gdGhpcy5pc1JlZ2lvblNhdmVkT24gOiBpc1JlZ2lvblNhdmVPbjtcblxuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGFwcGVuZCk7XG4gICAgdGhpcy5pc1JlZ2lvblNhdmVkT24gPSBzYXZlO1xuXG4gICAgaWYgKHNhdmUpIHtcbiAgICAgIC8vIFJlLXByb2plY3QgdGhlIGF1dGhvcml0YXRpdmUgcmVnaW9ucyBpbnRvIFBsb3RseSdzIHdvcmtpbmctc2V0IGFuZCByZW5kZXIuXG4gICAgICB0aGlzLnN5bmNTaGFwZXNGcm9tU3RvcmUoKTtcbiAgICAgIHRoaXMucmVuZGVyU2hhcGVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYW5zaWVudCBkaXNwbGF5IG9ubHkg4oCUIHJlbmRlciB0aGUgcGFzc2VkIHJlZ2lvbnMsIGRvbid0IHRvdWNoIHRoZVxuICAgICAgLy8gd29ya2luZy1zZXQgKGFuZCB0aGUgc3RvcmUgZGlkbid0IHN0b3JlIHRoZW0gZWl0aGVyKS5cbiAgICAgIGNvbnN0IGRpY3RzID0gcmVnaW9ucy5tYXAociA9PiB7IHIuZmlsZW5hbWUgPSB0aGlzLmZpbGVOYW1lOyByZXR1cm4geyAuLi5yLmdldFNoYXBlKHNob3dMYWJlbCkgfTsgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB0aGlzLnNoYXBlc1JlbGF5b3V0KGRpY3RzKSBhcyBhbnkpO1xuICAgICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkg4oCUIGl0cyBvdmVybGF5IHJlbmRlcnMgc2hhcGVzICovIH1cbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHNoYXBlcy1yZWxheW91dCBwYXlsb2FkOiByZWdpb24gc2hhcGVzIChwcm9maWxlLWxpbmUgUk9JcyBpbmNsdWRlZCwgYXNcbiAgICogIHRoZXkgYXJlIG9yZGluYXJ5IHJlZ2lvbnMpIHBsdXMgdGhlIGFjdGl2ZS1zaGFwZSBmaWxsIGNvbG91ci4gKi9cbiAgcHJpdmF0ZSBzaGFwZXNSZWxheW91dChzaGFwZURpY3RzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXBlczogc2hhcGVEaWN0cyxcbiAgICAgIGFjdGl2ZXNoYXBlOiB7IGZpbGxjb2xvcjogdGhpcy5yZWdpb25TdG9yZS5nZXRGaWxsQ29sb3IoKSB9LFxuICAgIH07XG4gIH1cblxuICAvKiogUHVzaCB0aGUgY3VycmVudCBkaWN0IHdvcmtpbmctc2V0IHRvIFBsb3RseSAobm8tb3Agd2hlbiBhbm90aGVyIGJhY2tlbmRcbiAgICogIG93bnMgdGhlIGRpdikuICovXG4gIHByaXZhdGUgcmVuZGVyU2hhcGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgY29uc3QgZGljdEFycmF5ID0gdGhpcy5zaGFwZXMubWFwKHMgPT4gKHsgLi4ucyB9KSk7XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHRoaXMuc2hhcGVzUmVsYXlvdXQoZGljdEFycmF5KSBhcyBhbnkpO1xuICAgIH0gY2F0Y2ggeyAvKiBkaXYgb3duZWQgYnkgYW5vdGhlciBiYWNrZW5kIChPU0QpIOKAlCBpdHMgb3ZlcmxheSByZW5kZXJzIHNoYXBlcyAqLyB9XG4gIH1cblxuICBnZXRTaG93U2hhcGVMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwcmV2aW91cyBzYXZlZCBzaGFwZXNcbiAgICovXG4gIHB1YmxpYyBwbG90UHJldmlvdXNTaGFwZXMoKSB7XG4gICAgLy8gY29udmVydCB0byBkaWN0IHNvIHRoYXQgcGxvdGx5IHJlY29nbmlzZXMgdGhlIHNoYXBlc1xuICAgIGNvbnN0IGRpY3RBcnJheSA9IHRoaXMucHJldmlvdXNTaGFwZXMubWFwKHMgPT4gKHsgLi4ucyB9KSk7XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgc2hhcGVzOiBkaWN0QXJyYXkgfSk7XG4gICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkgKi8gfVxuICB9XG5cbiAgc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzOiBTaGFwZVNlbGVjdGlvbltdKSB7XG4gICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHNoYXBlcztcbiAgfVxuXG4gIGdldFByZXZpb3VzU2hhcGVzKCkge1xuICAgIHJldHVybiB0aGlzLnByZXZpb3VzU2hhcGVzO1xuICB9XG5cbiAgLy8gVW5kbyAoaml0LXVpIzg1KTogcmVnaW9uIGhpc3RvcnkgbGl2ZXMgaW4gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSwgc28gdGhlXG4gIC8vIGFjdGl2ZSBiYWNrZW5kJ3Mgb3ZlcmxheSByZS1yZW5kZXJzIG9mZiBpdHMgcmVnaW9uVXBkYXRlJCBvbiByZXN0b3JlLlxuICBwdWJsaWMgdW5kbygpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS51bmRvKCk7IH1cbiAgcHVibGljIHJlZG8oKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUucmVkbygpOyB9XG4gIHB1YmxpYyBjYW5VbmRvKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5jYW5VbmRvKCk7IH1cbiAgcHVibGljIGNhblJlZG8oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblJlZG8oKTsgfVxuICBwdWJsaWMgZ2V0Q2FuVW5kbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblVuZG8kKCk7IH1cbiAgcHVibGljIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRDYW5SZWRvJCgpOyB9XG4gIHB1YmxpYyByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTsgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2Ugei1zdGFjayByZWdpb25zIOKGkiBSZWdpb25TdG9yZSAoaml0LXVpIzkzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHVibGljIGVudGVyU3RhY2tNb2RlKHNsaWNlczogTWFwPG51bWJlciwgUmVnaW9uW10+LCBpbml0aWFsWj86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMYXlvdXQ/OiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUoc2xpY2VzLCBpbml0aWFsWiwgc2F2ZUxheW91dCk7XG4gIH1cbiAgcHVibGljIGV4aXRTdGFja01vZGUoKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUuZXhpdFN0YWNrTW9kZSgpOyB9XG4gIHB1YmxpYyBpc1N0YWNrTW9kZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuaXNTdGFja01vZGUoKTsgfVxuICBwdWJsaWMgZ2V0U3RhY2tTYXZlTGF5b3V0KCk6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKTtcbiAgfVxuICBwdWJsaWMgc2V0RGlzcGxheVNsaWNlKHo6IG51bWJlcik6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnNldERpc3BsYXlTbGljZSh6KTsgfVxuICBwdWJsaWMgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2xpY2VSZWdpb25zKCk7IH1cbiAgcHVibGljIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVTbGljZXMoKTsgfVxuXG4gIHByaXZhdGUgZ2V0SGVhdG1hcExheW91dCh4UmFuZ2U6IG51bWJlcltdLCB5UmFuZ2U6IG51bWJlcltdKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgeGF4aXM6IHtcbiAgICAgICAgY29uc3RyYWluOiAncmFuZ2UnLFxuICAgICAgICBjb25zdHJhaW50b3dhcmQ6ICdjZW50ZXInLFxuICAgICAgICBzaWRlOiAndG9wJyxcbiAgICAgICAgdGlja3M6ICcnLFxuICAgICAgICByYW5nZTogeFJhbmdlXG4gICAgICB9LFxuICAgICAgeWF4aXM6IHtcbiAgICAgICAgY29uc3RyYWluOiAncmFuZ2UnLFxuICAgICAgICBjb25zdHJhaW50b3dhcmQ6ICdjZW50ZXInLFxuICAgICAgICByYW5nZTogeVJhbmdlLFxuICAgICAgICB0aWNrczogJycsXG4gICAgICAgIHRpY2tzdWZmaXg6ICcgICcsXG5cdFx0XHRcdC8vIHNldCBhdXRvcmFuZ2UgdG8gZmFsc2Ugc28gdGhhdCBwbG90bHkgZG9lcyBub3Qgb3ZlcndyaXRlIHRoZSByYW5nZSBmb3IgdGhlIHkgYXhpc1xuXHRcdFx0XHRhdXRvcmFuZ2U6IGZhbHNlLFxuICAgICAgICBzY2FsZWFuY2hvcjogdGhpcy5zY2FsZXJhdGlvID8gJ3gnIDogZmFsc2VcbiAgICAgfSxcbiAgICAgIG1hcmdpbjogeyB0OiAzMCwgYjogNSwgbDogNTUsIHI6IDUgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBzbGlkZXJzOiBbe1xuICAgICAgICBwYWQ6IHsgdDogNTAgfSxcbiAgICAgICAgY3VycmVudHZhbHVlOiB7XG4gICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICBwcmVmaXg6ICdaLXBsYW5lOicsXG4gICAgICAgICAgeGFuY2hvcjogJ3JpZ2h0JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RlcHM6IHRoaXMuZ2V0U3RlcHMoKVxuICAgICAgfV0sXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHNoYXBlczogdGhpcy5jdXJyZW50UmVuZGVyU2hhcGVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSksXG4gICAgICBhY3RpdmVzaGFwZTogeyBmaWxsY29sb3I6IHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCkgfSxcbiAgICAgIGRyYWdtb2RlOiB0aGlzLmRyYWdNb2RlID8gdGhpcy5kcmFnTW9kZSA6IGZhbHNlLFxuICAgICAgbmV3c2hhcGU6IHsgbGluZTogeyBjb2xvcjogdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksIHdpZHRoOiAzIH0gfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNoYXBlc1RvUmVkcmF3KHNob3dMYWJlbDogYm9vbGVhbikge1xuICAgIGNvbnN0IHNoYXBlc1RvUmVkcmF3OiBTaGFwZVNlbGVjdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiB0aGlzLnNoYXBlcykge1xuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHNoYXBlLmZpbGVOYW1lKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5maWxlTmFtZSkpIHtcbiAgICAgICAgLy8gU2V0IGxhYmVsXG4gICAgICAgIGlmIChzaG93TGFiZWwpIHtcbiAgICAgICAgICBzaGFwZS5sYWJlbCA9IHtcbiAgICAgICAgICAgIHRleHQ6IGAke3NoYXBlLmxlZ2VuZH1gLFxuICAgICAgICAgICAgdGV4dHRlbXBsYXRlOiBgJHtzaGFwZS5sZWdlbmR9YCxcbiAgICAgICAgICAgIHRleHRwb3NpdGlvbjogJ3RvcCBsZWZ0JyxcbiAgICAgICAgICAgIGZvbnQ6IHsgY29sb3I6IGAke3NoYXBlLmxpbmUuY29sb3J9YCB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaGFwZS5sYWJlbCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHNoYXBlc1RvUmVkcmF3LnB1c2goc2hhcGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb252ZXJ0IHRvIGRpY3Qgc28gdGhhdCBwbG90bHkgcmVjb2duaXNlcyB0aGUgc2hhcGVzXG4gICAgcmV0dXJuIHNoYXBlc1RvUmVkcmF3Lm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBVbnVzZWQgKHdpbGwgYmUgdXNlZCB3aGVuIHN1cmZhY2UgcGxvdCBpcyBhZGRlZClcbiAgICogQHBhcmFtIHhSYW5nZVxuICAgKiBAcGFyYW0geVJhbmdlXG4gICAqIEBwYXJhbSB6UmF0aW9cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0U3VyZmFjZUxheW91dCh4UmFuZ2U6IG51bWJlcltdLCB5UmFuZ2U6IG51bWJlcltdLCB6UmF0aW86IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hcmdpbjogeyB0OiAwLCBiOiAwLCBsOiAwLCByOiAwIH0sXG4gICAgICBzY2VuZToge1xuICAgICAgICB4YXhpczoge1xuICAgICAgICAgIGdyaWRjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgemVyb2xpbmVjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgc2hvd2JhY2tncm91bmQ6IHRydWUsXG4gICAgICAgICAgYmFja2dyb3VuZGNvbG9yOiAncmdiKDIzMCwgMjMwLDIzMCknLFxuICAgICAgICAgIC8vIHJhbmdlOiB4UmFuZ2VcbiAgICAgICAgfSxcbiAgICAgICAgeWF4aXM6IHtcbiAgICAgICAgICBncmlkY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgIHplcm9saW5lY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgIHNob3diYWNrZ3JvdW5kOiB0cnVlLFxuICAgICAgICAgIGJhY2tncm91bmRjb2xvcjogJ3JnYigyMzAsIDIzMCwgMjMwKScsXG4gICAgICAgICAgLy8gYXV0b3JhbmdlOiAncmV2ZXJzZWQnLFxuICAgICAgICAgIC8vIHJhbmdlOiB5UmFuZ2UsXG4gICAgICAgICAgLy8gc2NhbGVhbmNob3I6ICd4J1xuICAgICAgICB9LFxuICAgICAgICB6YXhpczoge1xuICAgICAgICAgIGdyaWRjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgemVyb2xpbmVjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgc2hvd2JhY2tncm91bmQ6IHRydWUsXG4gICAgICAgICAgYmFja2dyb3VuZGNvbG9yOiAncmdiKDIzMCwgMjMwLDIzMCknXG4gICAgICAgIH0sXG4gICAgICAgIGFzcGVjdHJhdGlvOiB7IHg6IDEsIHk6IDEsIHo6IHpSYXRpbyB9LFxuICAgICAgICBhc3BlY3Rtb2RlOiAnbWFudWFsJyxcbiAgICAgICAgc2xpZGVyczogW3tcbiAgICAgICAgICBwYWQ6IHsgdDogNTAgfSxcbiAgICAgICAgICBjdXJyZW50dmFsdWU6IHtcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICBwcmVmaXg6ICdaLXBsYW5lOicsXG4gICAgICAgICAgICB4YW5jaG9yOiAncmlnaHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RlcHM6IHRoaXMuZ2V0U3RlcHMoKVxuICAgICAgICB9XSxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGVwcygpIHtcbiAgICBjb25zdCBzdGVwcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbWFnZUxlbmd0aDsgaSsrKSB7XG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IGkgKyAxLFxuICAgICAgICBtZXRob2Q6ICdyZXN0eWxlJyxcbiAgICAgICAgYXJnczogWyd2aXNpYmxlJywgQXJyYXkodGhpcy5pbWFnZUxlbmd0aCkuZmlsbChmYWxzZSkuZmlsbCh0cnVlLCBpLCBpICsgMSldLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbiBpbWFnZSB2aWEgQW5ndWxhciBIdHRwQ2xpZW50IHNvIHRoYXQgYXV0aCBpbnRlcmNlcHRvcnMgKEJlYXJlciB0b2tlbilcbiAgICogYXJlIGFwcGxpZWQsIHRoZW4gZGVjb2RlIGl0IHdpdGggaW1hZ2UtanMuIFRoaXMgYXZvaWRzIHJhdyBicm93c2VyIGZldGNoKClcbiAgICogY2FsbHMgdGhhdCBieXBhc3MgdGhlIGludGVyY2VwdG9yIGNoYWluIGFuZCBmYWlsIGJlaGluZCBhbiBPQXV0aDIgcHJveHkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRJbWFnZSh1cmw6IHN0cmluZyk6IFByb21pc2U8SW1hZ2U+IHtcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyB9KVxuICAgICk7XG4gICAgcmV0dXJuIEltYWdlLmxvYWQoQnVmZmVyLmZyb20oYnVmZmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGltYWdlIGFzIGFuIGltYWdlLWpzIEltYWdlIGluc3RhbmNlLlxuICAgKiBVc2VkIGJ5IHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lIHRvIG9idGFpbiB0aGUgaW5wdXQgaW1hZ2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmltYWdlSW5mbyB8fCAhdGhpcy5pbWFnZUluZm8udXJscyB8fCB0aGlzLmltYWdlSW5mby51cmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHpJZHggPSB0aGlzLnpJbmRleC52YWx1ZSB8fCAwO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuaW1hZ2VJbmZvLnVybHNbeklkeF0gfHwgdGhpcy5pbWFnZUluZm8udXJsc1swXTtcbiAgICByZXR1cm4gdGhpcy5sb2FkSW1hZ2UodXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGxvdCBwaXhlbCBkYXRhIGFzIGEgZmxhdCBVaW50OENsYW1wZWRBcnJheS5cbiAgICogVGhpcyBjYXB0dXJlcyB3aGF0ZXZlciBpcyBhY3R1YWxseSByZW5kZXJlZCDigJQgaW5jbHVkaW5nIHpvb21lZCByZWdpb25zLlxuICAgKiBSZXR1cm5zIHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHMsIGRhdGEgfSBvciBudWxsIGlmIG5vIHBsb3QgaXMgZGlzcGxheWVkLlxuICAgKi9cbiAgcHVibGljIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBjaGFubmVsczogbnVtYmVyO1xuICAgIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5IH0gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgaWYgKCFnZD8uZGF0YSB8fCBnZC5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBGaW5kIHRoZSB2aXNpYmxlIHRyYWNlXG4gICAgY29uc3QgZnJhbWVJZHggPSB0aGlzLmFjdGl2ZUZyYW1lSW5kZXgoKTtcbiAgICBjb25zdCB0cmFjZSA9IGdkLmRhdGFbZnJhbWVJZHhdIHx8IGdkLmRhdGFbMF07XG4gICAgaWYgKCF0cmFjZSB8fCAhdHJhY2UueikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB6RGF0YTogYW55W11bXSA9IHRyYWNlLno7XG4gICAgY29uc3QgaGVpZ2h0ID0gekRhdGEubGVuZ3RoO1xuICAgIGlmIChoZWlnaHQgPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHdpZHRoID0gekRhdGFbMF0ubGVuZ3RoO1xuXG4gICAgaWYgKHRyYWNlLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICAgIC8vIFJHQiBpbWFnZTogeltyb3ddW2NvbF0gPSBbciwgZywgYl0gb3IgW3IsIGcsIGIsIGFdXG4gICAgICBjb25zdCBzYW1wbGUgPSB6RGF0YVswXVswXTtcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gQXJyYXkuaXNBcnJheShzYW1wbGUpID8gc2FtcGxlLmxlbmd0aCA6IDM7XG4gICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogY2hhbm5lbHMpO1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICBjb25zdCBwaXhlbCA9IHpEYXRhW3ldW3hdO1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh5ICogd2lkdGggKyB4KSAqIGNoYW5uZWxzO1xuICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyBjXSA9IHBpeGVsW2NdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHMsIGRhdGEgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGVhdG1hcCAoZ3JheXNjYWxlKTogeltyb3ddW2NvbF0gPSBzY2FsYXIgdmFsdWVcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICBkYXRhW3kgKiB3aWR0aCArIHhdID0gTWF0aC5yb3VuZCh6RGF0YVt5XVt4XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiAxLCBkYXRhIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgdGhhdCB0aGUgZGlzcGxheWVkIGB6YCBncmlkIGNvdmVycywgaW5cbiAgICogZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMuIE9uIGEgc2VydmVyIHpvb20gKGB0cmlnZ2VyWm9vbWApIHRoZSB0cmFjZSBgemAgaXNcbiAgICogcmVwbGFjZWQgd2l0aCB0aGUgaGlnaC1kZWYgY3JvcCBhbmQgdGhlIGF4ZXMgYXJlIHJlbGFpZCBvdXQgdG8gdGhlIGNyb3Anc1xuICAgKiBvcmlnaW5hbC1pbWFnZSBib3VuZHMgKGBpbWFnZVNpemVgKSwgc28gdGhlIGxpdmUgYXhpcyByYW5nZXMgQVJFIHRoYXRcbiAgICogcmVjdGFuZ2xlOyB3aGVuIHRoZSB3aG9sZSBpbWFnZSBpcyBpbiB2aWV3IHRoZSByYW5nZXMgc3BhbiBgdHJ1ZUltZ1NpemVgLlxuICAgKiBSZWFkaW5nIHRoZSByYW5nZXMgdGhlcmVmb3JlIHlpZWxkcyB0aGUgY3JvcCBvcmlnaW4gKyBleHRlbnQgd2l0aG91dFxuICAgKiB0cmFja2luZyB6b29tIHN0YXRlIHNlcGFyYXRlbHkuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgaW1hZ2UsIHRoZW4gYG51bGxgLlxuICAgKi9cbiAgcHVibGljIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IGdkOiBhbnkgPSB0aGlzLnBsb3REaXYgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIDogbnVsbDtcbiAgICBjb25zdCB4cjogbnVtYmVyW10gfCB1bmRlZmluZWQgPSBnZD8uX2Z1bGxMYXlvdXQ/LnhheGlzPy5yYW5nZTtcbiAgICBjb25zdCB5cjogbnVtYmVyW10gfCB1bmRlZmluZWQgPSBnZD8uX2Z1bGxMYXlvdXQ/LnlheGlzPy5yYW5nZTtcbiAgICBpZiAoeHIgJiYgeXIpIHtcbiAgICAgIGNvbnN0IHgwID0gTWF0aC5taW4oeHJbMF0sIHhyWzFdKTtcbiAgICAgIGNvbnN0IHkwID0gTWF0aC5taW4oeXJbMF0sIHlyWzFdKTsgLy8geSBheGlzIGlzIHJldmVyc2VkIGZvciBpbWFnZSBsYXlvdXRzXG4gICAgICByZXR1cm4geyB4OiB4MCwgeTogeTAsIHdpZHRoOiBNYXRoLmFicyh4clsxXSAtIHhyWzBdKSwgaGVpZ2h0OiBNYXRoLmFicyh5clsxXSAtIHlyWzBdKSB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLnRydWVJbWdTaXplWzBdLFxuICAgICAgeTogdGhpcy50cnVlSW1nU2l6ZVsyXSxcbiAgICAgIHdpZHRoOiB0aGlzLnRydWVJbWdTaXplWzFdIC0gdGhpcy50cnVlSW1nU2l6ZVswXSxcbiAgICAgIGhlaWdodDogdGhpcy50cnVlSW1nU2l6ZVszXSAtIHRoaXMudHJ1ZUltZ1NpemVbMl0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICBQbG90bHkubmV3UGxvdCh0aGlzLnBsb3REaXYsIFtdLFxuICAgICAgICB0aGlzLmdldEhlYXRtYXBMYXlvdXQoWzAsIDEwMF0sIFsxMDAsIDBdKSwgQ09ORklHIGFzIGFueSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHJlbW92ZSBQbG90bHkncyBET00gZnJvbSB0aGUgcGxvdCBkaXYgKGF4ZXMgaW5jbHVkZWQpLiBVc2VkIHdoZW5cbiAgICogaGFuZGluZyB0aGUgZGl2IHRvIGFub3RoZXIgYmFja2VuZCAoT3BlblNlYWRyYWdvbikg4oCUIHVubGlrZSBgcmVzZXQoKWAsXG4gICAqIHdoaWNoIHJlLXJlbmRlcnMgYW4gZW1wdHkgcGxvdCBhbmQgd291bGQgbGVhdmUgdGhlIFBsb3RseSBheGVzIHNob3dpbmcuXG4gICAqL1xuICBwdWJsaWMgcHVyZ2VQbG90KCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIFBsb3RseS5wdXJnZSh0aGlzLnBsb3REaXYpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFeHBvcnQgdGhlIGhlYXRtYXAgYXMgYSBQTkcgKHRoZSByZW5kZXJlZCBwbG90IGFscmVhZHkgcmVmbGVjdHMgdGhlIGFjdGl2ZVxuICAgKiAgY29sb3JtYXAvd2luZG93KS4gVGhlIGZ1bGwtcmVzIHRpbGUgY29tcG9zaXRlIGlzIE9TRCdzIGpvYi4gKi9cbiAgcHVibGljIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEltYWdlKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIChQbG90bHkgYXMgYW55KS5kb3dubG9hZEltYWdlKHRoaXMucGxvdERpdiwgeyBmb3JtYXQ6ICdwbmcnLCBmaWxlbmFtZTogdGhpcy5maWxlTmFtZSB8fCAnaW1hZ2UnIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldEF4ZXMoKSB7XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICB0aGlzLnJlbGF5b3V0KCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpIHtcbiAgICB0aGlzLmRyYWdNb2RlID0gbW9kZSA/IChtb2RlIGFzIHN0cmluZykgOiAnJztcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuO1xuICAgIC8vIE9ubHkgcmVsYXlvdXQgYSBMSVZFIFBsb3RseSBncmFwaC4gV2hlbiBhbm90aGVyIGJhY2tlbmQgKE9TRCAvIG5hcGFyaS1qcykgb3ducyB0aGUgdmlldyB0aGVcbiAgICAvLyBkaXYgaWQgaXMgc3RpbGwgc2V0IGJ1dCBoYXMgbm8gUGxvdGx5IHBsb3QgYXR0YWNoZWQsIGFuZCBQbG90bHkucmVsYXlvdXQgdGhyb3dzXG4gICAgLy8gKFwiY2FuJ3QgYWNjZXNzIHByb3BlcnR5IF9ndWlFZGl0aW5nLCBuIGlzIHVuZGVmaW5lZFwiKS4gVGhhdCB0aHJvdyBhYm9ydGVkIHRoZSBjYWxsZXJcbiAgICAvLyAoZGVhY3RpdmF0ZUFjdGl2ZVRvb2wg4oaSIG9uU2VsZWN0UGxvdFR5cGUpIGJlZm9yZSB0aGUgcmUtcGxvdCByYW4sIHdlZGdpbmcgdGhlIHBsb3QgdHlwZVxuICAgIC8vIChlLmcuIHN0dWNrIHN3aXRjaGluZyBuYXBhcmkgdm9sdW1lIOKGlCBpc29zdXJmYWNlKS4gR3VhcmQgb24gYF9mdWxsTGF5b3V0YCBsaWtlIHRoZSB6b29tXG4gICAgLy8gaGVscGVycyBkbyBzbyBpdCBzYWZlbHkgbm8tb3BzIHdoZW4gUGxvdGx5IGlzbid0IHRoZSBhY3RpdmUgcmVuZGVyZXIuXG4gICAgY29uc3QgZ2QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIGFzIHVua25vd24gYXMgeyBfZnVsbExheW91dD86IHVua25vd24gfSB8IG51bGw7XG4gICAgaWYgKCFnZD8uX2Z1bGxMYXlvdXQpIHJldHVybjtcbiAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7IGRyYWdtb2RlOiBtb2RlIH0gYXMgYW55KTtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgSURhdGFSZW5kZXJlcn0gc3R1YiDigJQgUGxvdGx5IGhhcyBubyBvdmVydmlldyBuYXZpZ2F0b3IgKGl0J3MgYW5cbiAgICogIE9wZW5TZWFkcmFnb24gZmVhdHVyZSksIHNvIHRvZ2dsaW5nIGl0IGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgcHVibGljIHNldE5hdmlnYXRvclZpc2libGUoX3Zpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBuby1vcDogbmF2aWdhdG9yIGlzIE9wZW5TZWFkcmFnb24tb25seSAqL1xuICB9XG5cbiAgLyoqIHtAbGluayBJRGF0YVJlbmRlcmVyfSBzdHViIOKAlCBpbWFnZSBzbW9vdGhpbmcgaXMgYW4gT3BlblNlYWRyYWdvbiBjYW52YXMtZHJhd2VyXG4gICAqICBzZXR0aW5nOyB0aGUgUGxvdGx5IGltYWdlL2hlYXRtYXAgdHJhY2VzIGRvbid0IGV4cG9zZSBpdCwgc28gaXQncyBhIG5vLW9wLiAqL1xuICBwdWJsaWMgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKF9lbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogbm8tb3A6IHNtb290aGluZyB0b2dnbGUgaXMgT3BlblNlYWRyYWdvbi1vbmx5ICovXG4gIH1cblxuICBwdWJsaWMgem9vbUluKCkge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgaWYgKCFnZD8uX2Z1bGxMYXlvdXQpIHJldHVybjtcbiAgICBjb25zdCB4bCA9IGdkLl9mdWxsTGF5b3V0LnhheGlzO1xuICAgIGNvbnN0IHlsID0gZ2QuX2Z1bGxMYXlvdXQueWF4aXM7XG4gICAgLy8gM0Qgc2NlbmVzIGhhdmUgbm8gMkQgeGF4aXMveWF4aXMgKHRoZXkgbGl2ZSB1bmRlciBgc2NlbmVgKTsgdGhlIHN0ZXAtem9vbVxuICAgIC8vIGlzIG1lYW5pbmdsZXNzIHRoZXJlIGFuZCB3b3VsZCB0aHJvdyBvbiBgeGwucmFuZ2VgLiBQbG90bHkncyBzY2VuZSBoYW5kbGVzXG4gICAgLy8gc2Nyb2xsLXpvb20gbmF0aXZlbHksIHNvIGp1c3QgYmFpbC5cbiAgICBpZiAoIXhsPy5yYW5nZSB8fCAheWw/LnJhbmdlKSByZXR1cm47XG4gICAgY29uc3QgeGMgPSAoeGwucmFuZ2VbMF0gKyB4bC5yYW5nZVsxXSkgLyAyO1xuICAgIGNvbnN0IHljID0gKHlsLnJhbmdlWzBdICsgeWwucmFuZ2VbMV0pIC8gMjtcbiAgICBjb25zdCBkeCA9ICh4bC5yYW5nZVsxXSAtIHhsLnJhbmdlWzBdKSAvIDEuMztcbiAgICBjb25zdCBkeSA9ICh5bC5yYW5nZVsxXSAtIHlsLnJhbmdlWzBdKSAvIDEuMztcbiAgICBjb25zdCB4MCA9IHhjIC0gZHggLyAyLCB4MSA9IHhjICsgZHggLyAyO1xuICAgIGNvbnN0IHkwID0geWMgLSBkeSAvIDIsIHkxID0geWMgKyBkeSAvIDI7XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbeDAsIHgxLCB5MCwgeTFdO1xuICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHtcbiAgICAgICd4YXhpcy5yYW5nZVswXSc6IHgwLCAneGF4aXMucmFuZ2VbMV0nOiB4MSxcbiAgICAgICd5YXhpcy5yYW5nZVswXSc6IHkwLCAneWF4aXMucmFuZ2VbMV0nOiB5MVxuICAgIH0gYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZXZlcnkgY3VycmVudGx5IHNlbGVjdGVkIHNoYXBlLiBGYWxscyBiYWNrIHRvIHRoZSBzaW5nbGVcbiAgICogYF9hY3RpdmVTaGFwZUluZGV4YCB3aGVuIG5vIG11bHRpLXNlbGVjdGlvbiBpcyBhY3RpdmUgKGNvdmVycyB0aGUgY2FzZVxuICAgKiB3aGVyZSBQbG90bHkgY2xpY2tlZCBhIHNoYXBlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgdGFibGUpLlxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFjdGl2ZVNoYXBlKCkge1xuICAgIC8vIE5vdGU6IG5vIGBwbG90RGl2YCBndWFyZCDigJQgd2hlbiBPcGVuU2VhZHJhZ29uIGlzIHRoZSByZW5kZXJlciwgUGxvdGx5XG4gICAgLy8gbmV2ZXIgcGxvdHRlZCAocGxvdERpdiBpcyB1bnNldCksIGJ1dCBkZWxldGlvbiBvbmx5IG5lZWRzIHRoZSBzaGFwZSBsaXN0XG4gICAgLy8gKyB0aGUgY3VycmVudCBzZWxlY3Rpb247IHRoZSBQbG90bHkgcmVsYXlvdXQgYmVsb3cgaXMgZ3VhcmRlZC5cbiAgICBjb25zdCBnZDogYW55ID0gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG5cbiAgICAvLyBSZXNvbHZlIHdoYXQgdG8gZGVsZXRlOiB0aGUgc3RvcmUncyBzZWxlY3Rpb24sIGVsc2UgdGhlIHNoYXBlIFBsb3RseVxuICAgIC8vIHRyYWNrcyBhcyBjbGlja2VkICh3aGVuIHRoZSB1c2VyIGNsaWNrZWQgYSBzaGFwZSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlXG4gICAgLy8gUmVnaW9uIEVkaXRvciB0YWJsZSkuXG4gICAgaWYgKHRoaXMucmVnaW9uU3RvcmUuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSBnZD8uX2Z1bGxMYXlvdXQ/Ll9hY3RpdmVTaGFwZUluZGV4O1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID09PSB1bmRlZmluZWQgfHwgYWN0aXZlSW5kZXggPCAwKSByZXR1cm47XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKFthY3RpdmVJbmRleF0pO1xuICAgIH1cbiAgICAvLyBUaGUgc3RvcmUgcmVtb3ZlcyB0aGUgc2VsZWN0ZWQgcmVnaW9ucywgY2xlYXJzIHRoZSBzZWxlY3Rpb24sIHN5bmNzIGl0c1xuICAgIC8vIGNhY2hlIGFuZCBlbWl0cyB0aGUgcmVnaW9uLXVwZGF0ZSBldmVudC5cbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG5cbiAgICAvLyBSZS1wcm9qZWN0IHRoZSByZW1haW5pbmcgcmVnaW9ucyBhbmQgcmVuZGVyIG9uIHRoZSBQbG90bHkgcGxvdCAoYSBuby1vcCxcbiAgICAvLyBjYXVnaHQsIHdoZW4gYW5vdGhlciBiYWNrZW5kIG93bnMgdGhlIGRpdiDigJQgaXRzIG92ZXJsYXkgcmUtcmVuZGVycyB2aWFcbiAgICAvLyB0aGUgc3RvcmUncyB1cGRhdGUgZXZlbnQpLlxuICAgIGlmIChnZD8uX2Z1bGxMYXlvdXQpIGdkLl9mdWxsTGF5b3V0Ll9hY3RpdmVTaGFwZUluZGV4ID0gLTE7XG4gICAgdGhpcy5zeW5jU2hhcGVzRnJvbVN0b3JlKCk7XG4gICAgY29uc3QgZGljdEFycmF5ID0gdGhpcy5zaGFwZXMubWFwKHMgPT4gKHsgLi4ucyB9KSk7XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgc2hhcGVzOiBkaWN0QXJyYXkgfSBhcyBhbnkpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAoZ2Q/Ll9mdWxsTGF5b3V0KSAoUGxvdGx5IGFzIGFueSkucmVkcmF3KGdkKTtcbiAgICAgIH0sICgpID0+IHsgLyogZGl2IG5vdCBhIFBsb3RseSBwbG90ICovIH0pO1xuICAgIH0gY2F0Y2ggeyAvKiBkaXYgb3duZWQgYnkgYW5vdGhlciBiYWNrZW5kICovIH1cbiAgfVxuXG4gIHB1YmxpYyB6b29tT3V0KCkge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgaWYgKCFnZD8uX2Z1bGxMYXlvdXQpIHJldHVybjtcbiAgICBjb25zdCB4bCA9IGdkLl9mdWxsTGF5b3V0LnhheGlzO1xuICAgIGNvbnN0IHlsID0gZ2QuX2Z1bGxMYXlvdXQueWF4aXM7XG4gICAgLy8gM0Qgc2NlbmVzIGhhdmUgbm8gMkQgeGF4aXMveWF4aXMg4oCUIHNlZSB6b29tSW4oKS5cbiAgICBpZiAoIXhsPy5yYW5nZSB8fCAheWw/LnJhbmdlKSByZXR1cm47XG4gICAgY29uc3QgeGMgPSAoeGwucmFuZ2VbMF0gKyB4bC5yYW5nZVsxXSkgLyAyO1xuICAgIGNvbnN0IHljID0gKHlsLnJhbmdlWzBdICsgeWwucmFuZ2VbMV0pIC8gMjtcbiAgICBjb25zdCBkeCA9ICh4bC5yYW5nZVsxXSAtIHhsLnJhbmdlWzBdKSAqIDEuMztcbiAgICBjb25zdCBkeSA9ICh5bC5yYW5nZVsxXSAtIHlsLnJhbmdlWzBdKSAqIDEuMztcbiAgICBjb25zdCB4MCA9IHhjIC0gZHggLyAyLCB4MSA9IHhjICsgZHggLyAyO1xuICAgIGNvbnN0IHkwID0geWMgLSBkeSAvIDIsIHkxID0geWMgKyBkeSAvIDI7XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbeDAsIHgxLCB5MCwgeTFdO1xuICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHtcbiAgICAgICd4YXhpcy5yYW5nZVswXSc6IHgwLCAneGF4aXMucmFuZ2VbMV0nOiB4MSxcbiAgICAgICd5YXhpcy5yYW5nZVswXSc6IHkwLCAneWF4aXMucmFuZ2VbMV0nOiB5MVxuICAgIH0gYXMgYW55KTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N0YWNrTG9hZGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBwdWJsaWMgc2V0U3RhY2tMb2FkaW5nKHN0YWNrTG9hZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHN0YWNrTG9hZGluZyk7XG4gIH1cbiAgcHVibGljIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzJCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIENvbG9ybWFwIC8gcmV2ZXJzZS1zY2FsZSAvIGltYWdlIG1ldGFkYXRhIHN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWRcbiAgLy8gVmlzdWFsaXplclN0b3JlOyB0aGVzZSBkZWxlZ2F0ZSwga2VlcGluZyBvbmx5IHRoZSBQbG90bHktc3BlY2lmaWMgbGl2ZVxuICAvLyByZXN0eWxlIGFzIHJlbmRlciBnbHVlLlxuICBnZXRDb2xvcm1hcE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXBPcHRpb25zKCk7XG4gIH1cbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IGFueSkge1xuICAgIHRoaXMuc3RvcmUuc2V0Q29sb3JtYXAoY29sb3JtYXApO1xuICAgIHRyeSB7XG4gICAgICBQbG90bHkucmVzdHlsZSh0aGlzLnBsb3REaXYsIHsgJ2NvbG9yc2NhbGUnOiBbY29sb3JtYXAuZGF0YS52YWx1ZV0gfSk7XG4gICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkg4oCUIGl0IHJlY29sb3JzIHZpYSB0aGUgTFVUICovIH1cbiAgfVxuICBnZXRDb2xvcm1hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpO1xuICB9XG5cbiAgc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2NhbGU6IGFueSkge1xuICAgIHRoaXMuc3RvcmUuc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2NhbGUpO1xuICAgIHRyeSB7XG4gICAgICBQbG90bHkucmVzdHlsZSh0aGlzLnBsb3REaXYsIHsgJ3JldmVyc2VzY2FsZSc6IHJldmVyc2NhbGUgfSk7XG4gICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkg4oCUIGl0IHJlY29sb3JzIHZpYSB0aGUgTFVUICovIH1cbiAgfVxuXG4gIGdldFJldmVyc2VTY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKTtcbiAgfVxuXG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10pIHtcbiAgICB0aGlzLnN0b3JlLnNldEltYWdlTWV0YShpbWFnZU1ldGEpO1xuICB9XG5cbiAgZ2V0SW1hZ2VNZXRhKCkge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEltYWdlTWV0YSgpO1xuICB9XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbikge1xuICAgIGlmICghc2hvd3N0YWNrKSB7XG4gICAgICB0aGlzLnpJbmRleC5uZXh0KDApO1xuICAgIH1cbiAgICB0aGlzLmltYWdlSW5mby5zaG93U3RhY2sgPSBzaG93c3RhY2s7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc2hvd3N0YWNrKTtcbiAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7ICdzaG93c3RhY2snOiBzaG93c3RhY2sgfSBhcyBhbnkpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRSZWdpb25VcGRhdGVFdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25VcGRhdGVFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBvZiB0aGUgaW5kaWNlcyBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgcmVnaW9ucyDigJQgb3duZWQgYnkgdGhlIHNoYXJlZFxuICAgKiBSZWdpb25TdG9yZSBzbyB0aGUgc2VsZWN0aW9uIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGJhY2tlbmRzIGFuZCB0aGUgUmVnaW9uXG4gICAqIEVkaXRvciB0YWJsZS4gRW1wdHkgPSBub3RoaW5nIHNlbGVjdGVkLlxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCByZWdpb25zIChvciBjbGVhciB3aXRoIFtdKS4gVGhlIHNoYXJlZCBzdG9yZSBvd25zXG4gICAqIHRoZSBzZWxlY3Rpb24gc3RhdGUgKHZhbGlkYXRlcy9kZWR1cGVzL2VtaXRzKTsgaGVyZSB3ZSBhZGRpdGlvbmFsbHkgcG9pbnRcbiAgICogUGxvdGx5J3MgYF9hY3RpdmVTaGFwZUluZGV4YCBhdCB0aGUgbGFzdCBzZWxlY3RlZCBzaGFwZSBzbyBpdCBnZXRzIHRoZSBlZGl0XG4gICAqIGhhbmRsZXMuIE5vIHZpc3VhbCBjaGFuZ2UgdG8gbm9uLWFjdGl2ZSBzaGFwZXMg4oCUIFBsb3RseSdzIG93biBhY3RpdmUtc2hhcGVcbiAgICogcmVuZGVyaW5nIGlzIHRoZSBvbmx5IGhpZ2hsaWdodC5cbiAgICovXG4gIHB1YmxpYyBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IHZhbGlkID0gKGluZGljZXMgfHwgW10pXG4gICAgICAuZmlsdGVyKGkgPT4gTnVtYmVyLmlzRmluaXRlKGkpICYmIGkgPj0gMCAmJiBpIDwgdGhpcy5zaGFwZXMubGVuZ3RoKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgY2xlYW5lZDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdmFsaWQpIHtcbiAgICAgIGlmICghc2Vlbi5oYXMoaSkpIHsgc2Vlbi5hZGQoaSk7IGNsZWFuZWQucHVzaChpKTsgfVxuICAgIH1cbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICBjb25zdCBnZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICAgIGlmIChnZD8uX2Z1bGxMYXlvdXQpIHtcbiAgICAgICAgZ2QuX2Z1bGxMYXlvdXQuX2FjdGl2ZVNoYXBlSW5kZXggPSBjbGVhbmVkLmxlbmd0aCA+IDAgPyBjbGVhbmVkW2NsZWFuZWQubGVuZ3RoIC0gMV0gOiAtMTtcbiAgICAgICAgdHJ5IHsgKFBsb3RseSBhcyBhbnkpLnJlZHJhdyhnZCk7IH0gY2F0Y2ggeyAvKiBub29wIGluIHRlc3RzICovIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhjbGVhbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBzcGVjaWZpYyByZWdpb24gKElSZWdpb25TdG9yZS5zZWxlY3RSZWdpb24pLiBTZXRzIHRoZSBzaGFyZWQgc3RvcmVcbiAgICogc2VsZWN0aW9uIGJ5IGlkZW50aXR5IGFuZCBwb2ludHMgUGxvdGx5J3MgYWN0aXZlLXNoYXBlIGF0IHRoZSBtYXRjaGluZ1xuICAgKiByZW5kZXJlZCBzaGFwZSBzbyBpdHMgZWRpdCBoYW5kbGVzIGFwcGVhci5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdFJlZ2lvbihyZWdpb24pO1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuc2hhcGVzLmZpbmRJbmRleChzID0+IHMuaWQgPT09IHJlZ2lvbj8uaWQpO1xuICAgICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgICBpZiAoZ2Q/Ll9mdWxsTGF5b3V0ICYmIGlkeCA+PSAwKSB7XG4gICAgICAgIGdkLl9mdWxsTGF5b3V0Ll9hY3RpdmVTaGFwZUluZGV4ID0gaWR4O1xuICAgICAgICB0cnkgeyAoUGxvdGx5IGFzIGFueSkucmVkcmF3KGdkKTsgfSBjYXRjaCB7IC8qIG5vb3AgaW4gdGVzdHMgKi8gfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIFBsb3RseSdzIGBfYWN0aXZlU2hhcGVJbmRleGAgYW5kIHB1c2ggaXQgYXMgdGhlIHNlbGVjdGlvbi4gQ2FsbGVkIGZyb21cbiAgICogdGhlIHJlbGF5b3V0IGhhbmRsZXIgYW5kIHRoZSBwb3N0LWNsaWNrIHRpY2sg4oCUIFBsb3RseSBkb2Vzbid0IGZpcmUgYVxuICAgKiBkZWRpY2F0ZWQgYWN0aXZlLXNoYXBlIGV2ZW50IGZvciBjbGlja3MsIHNvIHdlIHNhbXBsZS4gVGhlIHN0b3JlIG5vLW9wcyBpZlxuICAgKiB0aGUgc2VsZWN0aW9uIGlzIHVuY2hhbmdlZC5cbiAgICovXG4gIHByaXZhdGUgbWF5YmVFbWl0QWN0aXZlU2hhcGVJbmRleCgpIHtcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGNvbnN0IHJhdyA9IGdkPy5fZnVsbExheW91dD8uX2FjdGl2ZVNoYXBlSW5kZXg7XG4gICAgY29uc3QgaWR4ID0gKHR5cGVvZiByYXcgPT09ICdudW1iZXInICYmIHJhdyA+PSAwICYmIHJhdyA8IHRoaXMuc2hhcGVzLmxlbmd0aCkgPyByYXcgOiAtMTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGlkeCA+PSAwID8gW2lkeF0gOiBbXSk7XG4gIH1cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy56SW5kZXgubmV4dCh6SW5kZXgpO1xuICB9XG5cbiAgZ2V0U2hhcGVDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gIH1cbiAgZ2V0RmlsbENvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpO1xuICB9XG5cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgfVxuXG4gIHNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWw6IHN0cmluZywgY29sb3I6IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUuc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbCwgY29sb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIFN1YnNjcmlwdGlvbnNcbiAgICovXG4gIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLmltYWdlQ2FjaGVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmltYWdlQ2FjaGVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlZ2lvblVwZGF0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZWdpb25VcGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVnaW9uTGl2ZUVkaXRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVnaW9uTGl2ZUVkaXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hhbm5lbFN1Yikge1xuICAgICAgdGhpcy5jaGFubmVsU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIExpdmUtYXBwbHkgdGhlIGNoYW5uZWwgZGlzcGxheSB3aW5kb3cgKHptaW4vem1heCkgKyByZXZlcnNlL2ludmVydCB0byB0aGVcbiAgICogIGhlYXRtYXAuIE5vLW9wIHdoZW4gbm8gUGxvdGx5IHBsb3QgaXMgbW91bnRlZCAoT1NEIG93bnMgdGhlIGRpdikuICovXG4gIHByaXZhdGUgYXBwbHlDaGFubmVsRGlzcGxheShjaGFubmVsczogYW55W10sIHJldjogYm9vbGVhbiwgaW52OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybjtcbiAgICBjb25zdCBjaCA9IGNoYW5uZWxzPy5bMF07XG4gICAgY29uc3QgY29sb3JzY2FsZSA9IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCk/LmRhdGE/LnZhbHVlO1xuICAgIC8vIHJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXA7IGJvdGggdG9nZXRoZXIgY2FuY2VsLlxuICAgIGNvbnN0IHVwZGF0ZTogYW55ID0geyByZXZlcnNlc2NhbGU6IHJldiAhPT0gaW52IH07XG4gICAgaWYgKGNvbG9yc2NhbGUgIT0gbnVsbCkgdXBkYXRlLmNvbG9yc2NhbGUgPSBjb2xvcnNjYWxlOyAvLyBsaXZlIGNvbG9ybWFwIHJlY29sb3JcbiAgICBpZiAoY2gpIHtcbiAgICAgIC8vIFN1cmZhY2UvaXNvc3VyZmFjZS9zY2F0dGVyM2QgY29sb3VyLW1hcCB2aWEgY21pbi9jbWF4OyBoZWF0bWFwL2NvbnRvdXIgdmlhIHptaW4vem1heC5cbiAgICAgIGNvbnN0IHRocmVlRCA9XG4gICAgICAgIHRoaXMucGxvdFR5cGUgPT09IFBsb3RUeXBlLklTT1NVUkZBQ0UgfHxcbiAgICAgICAgdGhpcy5wbG90VHlwZSA9PT0gUGxvdFR5cGUuU1VSRkFDRSB8fFxuICAgICAgICB0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5TQ0FUVEVSM0Q7XG4gICAgICBpZiAodGhyZWVEKSB7XG4gICAgICAgIHVwZGF0ZS5jbWluID0gY2gubWluO1xuICAgICAgICB1cGRhdGUuY21heCA9IGNoLm1heDtcbiAgICAgICAgdXBkYXRlLmNhdXRvID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGUuem1pbiA9IGNoLm1pbjtcbiAgICAgICAgdXBkYXRlLnptYXggPSBjaC5tYXg7XG4gICAgICAgIHVwZGF0ZS56YXV0byA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgUGxvdGx5LnJlc3R5bGUodGhpcy5wbG90RGl2LCB1cGRhdGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogbm90IGEgY29sb3VyLW1hcHBlZCB0cmFjZSwgb3IgT1NEIG93bnMgdGhlIGRpdiAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCaW5uZWQgaW50ZW5zaXR5IGhpc3RvZ3JhbSBmb3IgYSBjaGFubmVsIGZyb20gdGhlIGNhY2hlZCBzb3VyY2UgZnJhbWVzXG4gICAqICAocmF3LCBwcmUtTFVUKS4gR3JheXNjYWxlIGNlbGxzIGFyZSBudW1iZXJzOyBSR0IgY2VsbHMgYXJlIFtyLGcsYl0uICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgX2JpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICBjb25zdCBmcmFtZXMgPSB0aGlzLmNhY2hlZEltYWdlRnJhbWVzO1xuICAgIGlmICghZnJhbWVzPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZyYW1lID0gZnJhbWVzW3RoaXMuYWN0aXZlRnJhbWVJbmRleCgpXSA/PyBmcmFtZXNbMF07XG4gICAgaWYgKCFmcmFtZT8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGZyYW1lKSB7XG4gICAgICBpZiAoIXJvdykgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93KSB7XG4gICAgICAgIGxldCB2OiBudW1iZXI7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNlbGwpKSB7XG4gICAgICAgICAgdiA9IGNoYW5uZWxJbmRleCA+PSAwICYmIGNoYW5uZWxJbmRleCA8IGNlbGwubGVuZ3RoXG4gICAgICAgICAgICA/IGNlbGxbY2hhbm5lbEluZGV4XVxuICAgICAgICAgICAgOiBNYXRoLnJvdW5kKGJ0NjAxTHVtaW5hbmNlKGNlbGxbMF0sIGNlbGxbMV0sIGNlbGxbMl0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gY2VsbDtcbiAgICAgICAgfVxuICAgICAgICB2ID0gdiB8IDA7XG4gICAgICAgIGlmICh2IDwgMCkgdiA9IDA7IGVsc2UgaWYgKHYgPiAyNTUpIHYgPSAyNTU7XG4gICAgICAgIGNvdW50c1t2XSsrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGlzdG9ncmFtMjU2KGNvdW50cyk7XG4gIH1cblxuICAvKiogQXN5bmMgaGlzdG9ncmFtIHN0cmVhbSDigJQgUGxvdGx5IHJlbmRlcnMgaGVhdG1hcCBmcmFtZSBkYXRhIChhbHJlYWR5IGluXG4gICAqICBtZW1vcnksIDgtYml0IGx1bWluYW5jZSksIHNvIHRoaXMganVzdCB3cmFwcyB0aGUgc3luY2hyb25vdXMgOC1iaXRcbiAgICogIGhpc3RvZ3JhbS4gTmF0aXZlIDE2LWJpdCBoaXN0b2dyYW1zIG9ubHkgYXBwbHkgdG8gdGhlIE9TRCB0aWxlIHBhdGguICovXG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICByZXR1cm4gb2YodGhpcy5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKSk7XG4gIH1cblxuICAvKiogRGF0YSBleHBvcnQgKDE2LWJpdCBUSUZGKSBpcyBhbiBPU0QtdGlsZS1wYXRoIGZlYXR1cmUgYmFja2VkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAqICBQbG90bHkgcmVuZGVycyBoZWF0bWFwcyBmcm9tIGZyYW1lIGRhdGEsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBleHBvcnQgaGVyZS4gKi9cbiAgZXhwb3J0RGF0YSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLndhcm4oJ1twbG90bHldIDE2LWJpdCBkYXRhIGV4cG9ydCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgaGVhdG1hcCBiYWNrZW5kLicpO1xuICB9XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucGxvdFV0aWxpdGllcy5pbXBvcnRST0lzRnJvbUdlb0pzb24oZ2VvSnNvblN0cik7XG4gIH1cblxuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKSB7XG4gICAgY29uc3QganNvblN0cmluZyA9IHRoaXMucGxvdFV0aWxpdGllcy5leHBvcnRST0lzVG9HZW9Kc29uKHJlZ2lvbnMpO1xuICAgIHRoaXMucGxvdFV0aWxpdGllcy5zYXZlVG9GaWxlKGpzb25TdHJpbmcsIHRoaXMuZmlsZU5hbWUpO1xuICB9XG5cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGxvdFV0aWxpdGllcy5leHBvcnRST0lzVG9HZW9Kc29uKHJlZ2lvbnMpO1xuICB9XG5cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MkKCk7XG4gIH1cblxuICBpc1N0YWNrTG9hZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1N0YWNrTG9hZGluZyQoKTtcbiAgfVxuXG59XG4iXX0=
2144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdGx5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sS0FBSyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFnQixhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxPQUFPLEVBQW1CLGVBQWUsRUFBZ0IsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQWdCLE1BQU0sd0NBQXdDLENBQUM7QUFDeEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzlGLE9BQU8sRUFBa0IsY0FBYyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUF3QixNQUFNLHdEQUF3RCxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBSzFGLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFDaEcsT0FBTyxFQUNMLHNCQUFzQixHQUd2QixNQUFNLHlCQUF5QixDQUFDO0FBR2pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFMUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFFMUQsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw2REFBNkQ7QUFDN0QseURBQXlEO0FBQ3pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdwRCxNQUFjLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUtoQyxNQUFNLE9BQU8sYUFBYTtJQXVJeEIsWUFBOEMsS0FBcUIsRUFDckIsS0FBcUIsRUFDaEQsY0FBOEIsRUFBVSxJQUFnQixFQUN2RCxXQUF3QixFQUN4QixRQUF5QixFQUN6QixTQUEyQixFQUMzQixPQUF1QixFQUN2QixZQUFpQyxFQUNqQyxlQUF1QyxFQUNILGFBQW9DLEVBQ3hFLGdCQUF5QyxFQUN6QyxhQUFtQyxFQUNuQyxLQUFzQixFQUN0QixXQUF3QjtRQWJFLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ2hELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVk7UUFDdkQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUNILGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtRQUN4RSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBQ3pDLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNuQyxVQUFLLEdBQUwsS0FBSyxDQUFpQjtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWxKNUM7Ozs7O1dBS0c7UUFDTSxpQkFBWSxHQUF1QixjQUFjLENBQUM7WUFDekQsYUFBYSxDQUFDLFlBQVk7WUFDMUIsYUFBYSxDQUFDLFNBQVM7WUFDdkIsYUFBYSxDQUFDLGNBQWM7WUFDNUIsYUFBYSxDQUFDLGFBQWE7WUFDM0IsYUFBYSxDQUFDLFdBQVc7WUFDekIsYUFBYSxDQUFDLFdBQVc7WUFDekIsYUFBYSxDQUFDLFVBQVU7U0FDekIsQ0FBQyxDQUFDO1FBRUssV0FBTSxHQUFVLEVBQUUsQ0FBQztRQUNuQixtQkFBYyxHQUFxQixFQUFFLENBQUM7UUFDdEMsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFJdkIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWxCLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBdUIvQixrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFHcEMsb0JBQWUsR0FBd0IsSUFBSSxDQUFDO1FBUTVDLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUNyQixzQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFDdEIsc0JBQWlCLEdBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQ2xDOztpRUFFeUQ7UUFDakQsc0JBQWlCLEdBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JEOzs2RkFFcUY7UUFDN0UsbUJBQWMsR0FBbUUsSUFBSSxDQUFDO1FBS3RGLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDcEQsMEJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsZ0VBQWdFO1FBQ3hELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4QyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDNUMsdUVBQXVFO1FBQ3ZFLDZFQUE2RTtRQUM3RSw4REFBOEQ7UUFDOUQ7b0VBQzREO1FBQzNDLG9CQUFlLEdBQUc7WUFDakMsU0FBUyxFQUFFLFNBQVM7WUFDcEIsU0FBUyxFQUFFLE9BQU87WUFDbEIsU0FBUyxFQUFFLFVBQVU7WUFDckIsU0FBUyxFQUFFLFFBQVE7WUFDbkIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLE9BQU87U0FDbkIsQ0FBQztRQUNGOzJDQUNtQztRQUMzQixvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUNwQixzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBc0IsQ0FBQztRQUM5RDs7O3lGQUdpRjtRQUN6RSxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFHLEdBQUcsQ0FBQztRQUNyQjs7OzsrRUFJdUU7UUFDL0QsaUJBQVksR0FBNEIsSUFBSSxDQUFDO1FBQ3JELG9FQUFvRTtRQUNwRSx5RUFBeUU7UUFDekUsdUVBQXVFO1FBQy9ELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBY1gsd0JBQW1CLEdBQ2xDLElBQUkseUJBQXlCLENBQzNCLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUMzQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBZ0JwQyx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDL0MsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUNqRCxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDbkQsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ2xELG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUNyRCxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDM0QsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ2hDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtTQUN0RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDL0MsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUNqRCxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1lBQzdELG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUNyRCxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDM0QsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDMUQsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QywwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNqRixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN6RSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILDZGQUE2RjtRQUM3Riw4RkFBOEY7UUFDOUYsK0ZBQStGO1FBQy9GLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztZQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO1NBQ3pCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckYsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSw2RUFBNkU7UUFDN0UsMERBQTBEO1FBQzFELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNyRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDckYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ25DLE9BQU87WUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFxQixFQUFFLE1BQWM7UUFDckQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUM1QiwwQ0FBMEM7UUFDMUMsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFekQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLG1CQUFtQjtRQUNuQixhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ25DLElBQUksU0FBUyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0MsTUFBTSxNQUFNLEdBQVUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsMkVBQTJFO1lBQzNFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxtRkFBbUY7Z0JBQ25GLCtDQUErQztnQkFDL0MsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDckUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUNoQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDckYsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdkIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekIsQ0FBQztvQkFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixzQkFBc0I7b0JBQ3RCLE1BQU07Z0JBQ1IsQ0FBQztZQUNILENBQUM7WUFDRCxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO2dCQUN0QyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLFNBQVMsQ0FBQztZQUNkLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDMUIsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDeEIsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQkFDeEIsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUNsQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNIOzs7OztPQUtHO0lBQ0ksSUFBSSxDQUFDLE9BQWUsRUFBRSxXQUFnQixFQUFFLFNBQXFCLEVBQUUsWUFBb0IsRUFDOUUsUUFBa0IsRUFBRSxVQUFtQixLQUFLO1FBQ3RELE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixtQkFBbUI7UUFDbkIsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6Qix5REFBeUQ7UUFDekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDMUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0RBQWdEO1FBQ2pGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUVqRCx3RUFBd0U7UUFDeEUsNkVBQTZFO1FBQzdFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUsMkRBQTJEO1FBQzNELE1BQU0sSUFBSSxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCw0RUFBNEU7WUFDNUUsNEVBQTRFO1lBQzVFLG1EQUFtRDtZQUNuRCxJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQ3pFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FDekIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLEVBQzFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUIsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQzlFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQzlFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQ2pGLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssV0FBVyxDQUFDLE9BQWUsRUFBRSxJQUFjLEVBQUUsTUFBYSxFQUFFLFdBQXFCLEVBQ3RFLE1BQWdCLEVBQUUsWUFBb0IsRUFBRSxVQUFtQixLQUFLO1FBQ2pGLElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsT0FBTztRQUNQLE1BQU0sTUFBTSxHQUFnRSxFQUFFLENBQUM7UUFDL0UsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRztnQkFDWixFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNiLENBQUMsRUFBRSxPQUFPO2dCQUNWLElBQUksRUFBRSxTQUFTO2dCQUNmLDREQUE0RDtnQkFDNUQsbUVBQW1FO2dCQUNuRSwwR0FBMEc7Z0JBQzFHLFNBQVMsRUFBRSxNQUFNO2dCQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDbkQsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzlDLElBQUksRUFBRSxTQUFTLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQzthQUNyQixDQUFDO1lBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUN2RCxPQUFRLE1BQWMsQ0FBQyxPQUFPLEVBQUUsTUFBYSxFQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM3QyxnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssV0FBVyxDQUFDLE9BQWUsRUFBRSxJQUFjLEVBQUUsTUFBYSxFQUFFLFdBQXFCLEVBQ3JFLE1BQWdCLEVBQUUsWUFBb0IsRUFBRSxVQUFtQixLQUFLO1FBQ2xGLElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsT0FBTztRQUNQLE1BQU0sTUFBTSxHQUFpQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRztnQkFDWixDQUFDLEVBQUUsT0FBTztnQkFDVixJQUFJLEVBQUUsU0FBUztnQkFDZixxQkFBcUI7Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNuRCxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtnQkFDOUMsOEJBQThCO2dCQUM5Qix1QkFBdUI7YUFDeEIsQ0FBQztZQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkQsT0FBUSxNQUFjLENBQUMsT0FBTyxFQUFFLE1BQWEsRUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsY0FBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDN0UsZ0VBQWdFO1lBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM1QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssY0FBYyxDQUFDLE9BQWUsRUFBRSxJQUFjLEVBQUUsTUFBYSxFQUFFLFdBQXFCLEVBQ3JFLE1BQWdCLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFDL0MsWUFBb0IsRUFBRSxVQUFtQixLQUFLO1FBQ25FLHNFQUFzRTtRQUN0RSxvRUFBb0U7UUFDcEUsaUVBQWlFO1FBQ2pFLFdBQVc7UUFDWCxJQUFJLENBQUMsT0FBTztZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBRWpDLHlGQUF5RjtRQUN6RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxNQUFNLEdBQWdFLEVBQUUsQ0FBQztRQUMvRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hDLE1BQU0sS0FBSyxHQUFHO2dCQUNaLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDYixFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLENBQUMsRUFBRSxPQUFPO2dCQUNWLG1FQUFtRTtnQkFDbkUsMEdBQTBHO2dCQUMxRyxTQUFTLEVBQUUsTUFBTTtnQkFDakIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLFNBQVMsS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLEtBQUssS0FBSyxDQUFDO2FBQ3JCLENBQUM7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3ZELE9BQVEsTUFBYyxDQUFDLE9BQU8sRUFBRSxNQUFhLEVBQUUsTUFBTSxFQUFFLE1BQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDOUUsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM3QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGVBQWUsQ0FBQyxTQUFxQixFQUFFLFdBQWdCLEVBQ3ZDLGFBQXVCO1FBQzdDLDJFQUEyRTtRQUMzRSwyRUFBMkU7UUFDM0UseUVBQXlFO1FBQ3pFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkUsT0FBTztZQUNMLE1BQU0sRUFBRSxXQUFXLENBQUMsSUFBSTtZQUN4QixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTTtZQUMxQixhQUFhO1lBQ2IsV0FBVyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVztZQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUNuRCxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtZQUM5QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtZQUM1QyxNQUFNO1lBQ04sTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQ7bUZBQytFO0lBQ3ZFLHFCQUFxQixDQUFDLE1BQWEsRUFBRSxXQUFvQjtRQUMvRCxJQUFJLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDN0IsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJO3dCQUMxQixDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzt3QkFBRSxTQUFTO29CQUNsQyxJQUFJLENBQUMsR0FBRyxHQUFHO3dCQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUc7d0JBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7OztvRkFLZ0Y7SUFDeEUsVUFBVSxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQy9DLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDOUIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsc0NBQXNDO1lBQzlELEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUM3QyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDN0MsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksV0FBVyxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxRCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQztnQkFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBUyxDQUFDLENBQUM7WUFDdEUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxrRkFBa0Y7SUFDM0UscUJBQXFCLEtBQWlDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUzRTs7OztPQUlHO0lBQ0ssZUFBZSxDQUFDLE9BQWUsRUFBRSxJQUF3QixFQUFFLEtBQXNCLEVBQ2pFLFlBQW9CLEVBQUUsVUFBbUIsS0FBSztRQUNwRSxJQUFJLENBQUMsT0FBTztZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUM3QyxJQUFJLE1BQVcsQ0FBQztRQUNoQixRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixLQUFLLFdBQVc7Z0JBQ2QsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDaEMsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYixNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBQ1IsS0FBSyxZQUFZO2dCQUNmLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtnQkFDaEYsTUFBTTtZQUNSLFNBQVMsYUFBYTtnQkFDcEIsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNyRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkQsT0FBUSxNQUFjLENBQUMsT0FBTyxFQUFFLE1BQWEsRUFBRSxNQUFNLEVBQUUsTUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM5RSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3pELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNERBQTREO0lBQ3BELGNBQWM7UUFDcEIsT0FBTztZQUNMLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3pCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtZQUNqQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1lBQzdCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBRUQseUVBQXlFO0lBQ2pFLGdCQUFnQixDQUFDLE1BQWdCLEVBQUUsTUFBZ0I7UUFDekQsT0FBTztZQUNMLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUMvRixLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3ZFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLO2FBQy9FO1lBQ0QsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDekIsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN0RSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSztTQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVELGtFQUFrRTtJQUMxRCxlQUFlO1FBQ3JCLE9BQU87WUFDTCxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN6QixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNyQixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNyQixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUMzQix1RUFBdUU7Z0JBQ3ZFLG9FQUFvRTtnQkFDcEUsaUVBQWlFO2dCQUNqRSwwQ0FBMEM7Z0JBQzFDLFVBQVUsRUFBRSxNQUFNO2FBQ25CO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxtRUFBbUU7SUFDNUQsc0JBQXNCO1FBQzNCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBMkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQ7b0VBQ2dFO0lBQ3pELGdCQUFnQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCx1RUFBdUU7SUFFdkU7K0RBQzJEO0lBQ3BELG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0ZBQWtGO0lBQzNFLG9CQUFvQixLQUFnQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFekU7Ozs7T0FJRztJQUNJLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxRQUE0QjtRQUNyRSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUztZQUNkLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNYLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLE9BQU87WUFDYixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMvQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0osMkVBQTJFO1FBQzNFLDhFQUE4RTtRQUM5RSxNQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUNqRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFhLEVBQUU7WUFDOUIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNwQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUN4RCxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUM3RCxVQUFVLEVBQUUsS0FBSztZQUNqQixhQUFhLEVBQUUsb0JBQW9CO1lBQ25DLFlBQVksRUFBRSxvQkFBb0I7WUFDbEMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1NBQzNCLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUU7UUFDMUUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksY0FBYztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBFLCtFQUErRTtRQUMvRSw4RUFBOEU7UUFDOUUsNEVBQTRFO1FBQzVFLGdGQUFnRjtRQUNoRixzQkFBc0I7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztlQUNwRCxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSztlQUMxQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWpGLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO1FBQ2hG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RDtzRkFDa0Y7SUFDbEYsVUFBVTtRQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUVBQXVFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsYUFBYSxDQUFDLFVBQWtCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQWlCO1FBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBaUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2hDLENBQUM7OEdBanFFVSxhQUFhLGtCQXVJSixnQkFBZ0IsYUFDaEIsZ0JBQWdCLHNRQVFKLGNBQWM7a0hBaEpuQyxhQUFhLGNBRlosTUFBTTs7MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQXdJYyxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ3ZCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFRdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBQbG90bHkgZnJvbSAncGxvdGx5LmpzLWRpc3QtbWluJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFBvbHlnb24sIFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgVGlsZUFjY2Vzc1BvcnQsIFRJTEVfQUNDRVNTX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBJbWFnZVN0YXRlUG9ydCwgSU1BR0VfU1RBVEVfUE9SVCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9pbWFnZS1zdGF0ZS5wb3J0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgRU1QVFksIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvc2hhcGUnO1xuaW1wb3J0IHsgQ09ORklHLCBDT05GSUdfU1VSRkFDRSwgUGxvdFV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3Bsb3QudXRpbGl0aWVzJztcbmltcG9ydCB7IFdhbmRTZXJ2aWNlLCBXYW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FjaGVkSW1hZ2VEYXRhLCBXYW5kVG9vbFNlcnZpY2UsIFdhbmRUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFRvb2xTZXJ2aWNlLCBCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLCBWZXJ0ZXhFcmFzZXJUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdmVydGV4LWVyYXNlci92ZXJ0ZXgtZXJhc2VyLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBab29tVG9Cb3hUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIHBhcnNlU3ZnUGF0aFBvbHlnb24sXG4gIHZlcnRpY2VzVG9TdmdQYXRoLFxufSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBMT1RfVFlQRV9ERVNDUklQVE9SUywgUGxvdFR5cGVEZXNjcmlwdG9yIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBQTE9UTFlfUExPVF9UWVBFX0lNUExTLFxuICBQbG90bHlQbG90VHlwZUltcGwsXG4gIFRyYWNlQnVpbGRJbnB1dCxcbn0gZnJvbSAnLi9wbG90bHktdHJhY2UtYnVpbGRlcnMnO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXIsIEludGVuc2l0eVByb2ZpbGUsIElJc29zdXJmYWNlQ29udHJvbHMsIElJbnRlbnNpdHlDb250cm9scyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGJ0NjAxTHVtaW5hbmNlLCBoaXN0b2dyYW0yNTYgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcywgVmlld2VyRmVhdHVyZSwgY2FwYWJpbGl0aWVzT2YgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IFBsb3RseVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuL3Bsb3RseS1yZWdpb24tb3ZlcmxheSc7XG5pbXBvcnQgeyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBQbG90bHlDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi9wbG90bHktY29vcmRpbmF0ZS10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVklaX0FMRVJUX1RPQVNUX0tFWSB9IGZyb20gJy4uLy4uL3RvYXN0LW91dGxldHMnO1xuXG4vLyBSZS1leHBvcnRlZCBzbyBleGlzdGluZyBjb25zdW1lcnMgY2FuIGtlZXAgaW1wb3J0aW5nIFBsb3RUeXBlIGZyb20gdGhpc1xuLy8gbW9kdWxlIHdoaWxlIGl0IHBoeXNpY2FsbHkgbGl2ZXMgaW4gdGhlIGJhY2tlbmQtbmV1dHJhbCBjb250cmFjdHMvIGRpci5cbi8vIFRPRE8ocGxvdHRpbmctYWJzdHJhY3Rpb24pOiBvbmNlIGFsbCBjb25zdW1lcnMgaW1wb3J0IGZyb21cbi8vICcuL2NvbnRyYWN0cy9wbG90LXR5cGUnIGRpcmVjdGx5LCBkcm9wIHRoaXMgcmUtZXhwb3J0LlxuZXhwb3J0IHsgUGxvdFR5cGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcblxuXG4od2luZG93IGFzIGFueSkuQnVmZmVyID0gQnVmZmVyO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbG90bHlTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuXG4gIC8qKlxuICAgKiBQbG90bHkgaXMgdGhlIGZ1bGwtZmVhdHVyZWQgZGF0YSBiYWNrZW5kOiBpdCBzdXBwb3J0cyBldmVyeSBmZWF0dXJlLFxuICAgKiBpbmNsdWRpbmcgM0Qgc2NlbmVzLCBsaXZlIHNjYWxhciBjb2xvcm1hcHMsIHBpeGVsIHJlYWRiYWNrIGFuZCB0aGVcbiAgICogc2VydmVyLXNpZGUgaGlnaC1kZWYgem9vbSByZS1mZXRjaC4gKE9wZW5TZWFkcmFnb24ncyBzdHViIGFkdmVydGlzZXMgb25seVxuICAgKiBpbWFnZSBkaXNwbGF5LilcbiAgICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1xuICAgIFZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5LFxuICAgIFZpZXdlckZlYXR1cmUuU3VyZmFjZTNELFxuICAgIFZpZXdlckZlYXR1cmUuU2NhbGFyQ29sb3JtYXAsXG4gICAgVmlld2VyRmVhdHVyZS5QaXhlbFJlYWRiYWNrLFxuICAgIFZpZXdlckZlYXR1cmUuSGlnaERlZlpvb20sXG4gICAgVmlld2VyRmVhdHVyZS5TdGFja1NsaWRlcixcbiAgICBWaWV3ZXJGZWF0dXJlLklzb3N1cmZhY2UsXG4gIF0pO1xuXG4gIHByaXZhdGUgc2hhcGVzOiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIHByZXZpb3VzU2hhcGVzOiBTaGFwZVNlbGVjdGlvbltdID0gW107XG4gIHByaXZhdGUgaXNSZWdpb25TYXZlZE9uID0gdHJ1ZTtcbiAgcHJpdmF0ZSBpbWFnZUxlbmd0aCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBzY3JlZW5IZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgcGxvdERpdiE6IHN0cmluZztcbiAgcHJpdmF0ZSBpc1JlYWxab29tID0gdHJ1ZTtcbiAgcHJpdmF0ZSBzY2FsZXJhdGlvID0gdHJ1ZTtcbiAgcHJpdmF0ZSB0cnVlSW1nU2l6ZSE6IG51bWJlcltdO1xuICBwcml2YXRlIHpvb21Db29yZGluYXRlczogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBmaWxlTmFtZSE6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGRyYWdNb2RlITogc3RyaW5nO1xuICAvLyBSZWdpb24gZGF0YSAodGhlIGxpc3QgKyBwZXItaW1hZ2UgY2FjaGUpLCBzZWxlY3Rpb24sIGlkIG1pbnRpbmcsIHRoZSByZWdpb25cbiAgLy8gdXBkYXRlIGV2ZW50IGFuZCB0aGUgc2hhcGUgY29sb3VyL2xhYmVsIHByZWZzIG5vdyBsaXZlIGluIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUgKGluamVjdGVkIGFzIGB0aGlzLnJlZ2lvblN0b3JlYCkg4oCUIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoXG4gIC8vIGJvdGggYmFja2VuZHMgZGVsZWdhdGUgdG8uIGB0aGlzLnNoYXBlc2AgYmVsb3cgaXMga2VwdCBhcyBQbG90bHkncyAqcmVuZGVyXG4gIC8vIHByb2plY3Rpb24qIG9mIHRob3NlIHJlZ2lvbnMgKHRoZSBkaWN0IGFycmF5IFBsb3RseS5yZWxheW91dCBjb25zdW1lcykgYW5kXG4gIC8vIGlzIG1pcnJvcmVkIGludG8gdGhlIHN0b3JlIG9uIGV2ZXJ5IHdyaXRlLiBDb2xvcm1hcCwgcmV2ZXJzZS1zY2FsZSwgaW1hZ2VcbiAgLy8gbWV0YWRhdGEgYW5kIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZVxuICAvLyAoaW5qZWN0ZWQgYXMgYHRoaXMuc3RvcmVgKS5cbiAgcHJpdmF0ZSB1cmxzITogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgY3VycmVudGx5IHBsb3R0ZWQuXG4gICAqXG4gICAqIFRoZSBgIWAgaXMgYSBkZWZpbml0ZS1hc3NpZ25tZW50IEFTU0VSVElPTiwgbm90IGEgZ3VhcmFudGVlOiBub3RoaW5nIHNldHMgdGhpcyB1bnRpbFxuICAgKiBhbiBpbWFnZSBsb2FkcywgYW5kIGEgaG9zdCBjYW4gY2xlYXIgaXRzIGltYWdlIHdoaWxlIHRoZXNlIHBhdGhzIHN0aWxsIHJ1biDigJQgYVxuICAgKiBzcGF0aWFsLW9taWNzIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gdGlzc3VlIHNlY3Rpb24gZG9lcyBleGFjdGx5IHRoYXQuIFNvIHJlYWRzIGhlcmVcbiAgICogYXJlIG9wdGlvbmFsIGFuZCBhc3NpZ25tZW50cyBndWFyZGVkOyBhbiB1bmd1YXJkZWQgb25lIHRocmV3XG4gICAqIFwiY2FuJ3QgYWNjZXNzIHByb3BlcnR5IGlzR3JheXNjYWxlXCIgYW5kIGFib3J0ZWQgdGhlIGxvYWQuXG4gICAqL1xuICBpbWFnZUluZm8hOiBJSW1hZ2VJbmZvO1xuICBwcml2YXRlIHBsb3RVdGlsaXRpZXMgPSBuZXcgUGxvdFV0aWxpdGllcygpO1xuICBwcml2YXRlIHBsb3RUeXBlITogUGxvdFR5cGU7XG5cbiAgcHJpdmF0ZSBvblBsb3RNb3VzZURvd246ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChyZWdpb25zQnlJbWFnZUtleS9jdXJyZW50SW1hZ2VLZXkpIG5vdyBsaXZlcyBpblxuICAvLyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlOyBzZXRBY3RpdmVJbWFnZSgpIGRlbGVnYXRlcyB0byBpdCBhbmQgcmUtcHJvamVjdHNcbiAgLy8gYHRoaXMuc2hhcGVzYCBmcm9tIHRoZSBzdG9yZSBhZnRlcndhcmRzLlxuXG4gIC8qKiBQaXhlbCBkYXRhIGNhY2hlZCBmb3Igd2FuZCBzYW1wbGluZy4gZGF0YVt6SW5kZXhdIGlzIGEgMi1EIG1hdHJpeC4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZUZyYW1lcz86IGFueVtdO1xuICBwcml2YXRlIGNhY2hlZEltYWdlV2lkdGggPSAwO1xuICBwcml2YXRlIGNhY2hlZEltYWdlSGVpZ2h0ID0gMDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVJhdGlvczogbnVtYmVyW10gPSBbMSwgMV07XG4gIHByaXZhdGUgY2FjaGVkSXNHcmF5c2NhbGUgPSBmYWxzZTtcbiAgLyoqIERhdGEtc3BhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY2FjaGVkIGZyYW1lJ3MgcGl4ZWwgKDAsMCkuIFswLDBdIGZvciB0aGUgZnVsbFxuICAgKiAgaW1hZ2U7IGEgY3JvcCdzIHRvcC1sZWZ0IHdoZW4gem9vbWVkIChzbyB0aGUgaW50ZW5zaXR5IHByb2ZpbGUgc2FtcGxlcyB0aGVcbiAgICogIHpvb20tbGV2ZWwgcGl4ZWxzIGF0IHRoZSByaWdodCBvZmZzZXQvcmVzb2x1dGlvbikuICovXG4gIHByaXZhdGUgY2FjaGVkRnJhbWVPcmlnaW46IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gIC8qKiBMYXN0IHZpc2libGUgaW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlIGZyb20gdGhlIGFjdGl2ZSBiYWNrZW5kJ3Mgdmlld3BvcnQgKHNldCBieVxuICAgKiAgdGhlIE9TRCB2aWV3cG9ydC1jaGFuZ2UgaG9vayB2aWEgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKS4gTmV3IHByb2ZpbGUgbGluZXMgYXJlXG4gICAqICBwbGFjZWQgd2l0aGluIGl0IHNvIHRoZXkgbGFuZCBvbi1zY3JlZW4gd2hlbiB6b29tZWQgaW47IG51bGwg4oaSIHVzZSBmdWxsIGltYWdlLiAqL1xuICBwcml2YXRlIGxhc3RWaXNpYmxlUm9pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIGV2ZW50cyAqL1xuICBwcml2YXRlIG9uUmVsYXlvdXRFdmVudDogYW55O1xuXG4gIHByaXZhdGUgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgLy8gY3VycmVudCBpbmRleCBvZiBpbWFnZSBpbiBzdGFjayAoaWYgc3RhY2spLCAwIGlmIHNpbmdsZSBpbWFnZVxuICBwcml2YXRlIHpJbmRleCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBhdXRvc2NhbGVFdmVudCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgLy8gVGhlIHJlZ2lvbiB1cGRhdGUgZXZlbnQgYW5kIHNlbGVjdGlvbiBzdHJlYW0gYXJlIG93bmVkIGJ5IHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmU7IGdldFJlZ2lvblVwZGF0ZUV2ZW50KCkvZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkgZGVsZWdhdGUgdG9cbiAgLy8gaXQgc28gZXZlcnkgY29uc3VtZXIgKGFuZCB0aGUgT1NEIGJhY2tlbmQpIHNlZXMgb25lIHN0cmVhbS5cbiAgLyoqIEJyaWdodCwgd2VsbC1zZXBhcmF0ZWQgY29sb3VycyBjeWNsZWQgYXMgdGhlIHVzZXIgYWRkcyBwcm9maWxlLWxpbmUgUk9Jcy5cbiAgICogIFRoZSBtYXRjaGluZyBpbnNldCB0cmFjZSBpcyBkcmF3biBpbiB0aGUgc2FtZSBjb2xvdXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgUFJPRklMRV9QQUxFVFRFID0gW1xuICAgICcjRkZENDAwJywgLy8geWVsbG93XG4gICAgJyMwMEU1RkYnLCAvLyBjeWFuXG4gICAgJyNGRjJEOTUnLCAvLyBtYWdlbnRhXG4gICAgJyMzOUZGMTQnLCAvLyBncmVlblxuICAgICcjRkY5NTAwJywgLy8gb3JhbmdlXG4gICAgJyM3QzRERkYnLCAvLyB2aW9sZXRcbiAgICAnI0ZGM0IzMCcsIC8vIHJlZFxuICAgICcjMThGRkZGJywgLy8gYXF1YVxuICBdO1xuICAvKiogUGFsZXR0ZSBjdXJzb3IgZm9yIHByb2ZpbGUgbGluZXMgKG5ldmVyIHJlc2V0IG9uIGRlbGV0ZSwgc28gY29sb3VycyBrZWVwXG4gICAqICBjeWNsaW5nIGFjcm9zcyB0aGUgc2Vzc2lvbikuICovXG4gIHByaXZhdGUgcHJvZmlsZUNvbG9yU2VxID0gMDtcbiAgcHJpdmF0ZSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgLyoqIElTT1NVUkZBQ0UgYmFuZCBhcyBhIDDigJMyNTUgc2xpZGVyIHBvc2l0aW9uLCBtYXBwZWQgb250byB0aGUgdm9sdW1lJ3MgcmVhbFxuICAgKiAgaW50ZW5zaXR5IHJhbmdlIGF0IHJlbmRlciB0aW1lIChzZWUgbWFwSXNvQmFuZCkuIERlZmF1bHRzIHRvIHRoZSBmdWxsIHJhbmdlXG4gICAqICBzbyB0aGUgZmlyc3QgcmVuZGVyIHNob3dzIHRoZSB3aG9sZSBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiBob3cgYnJpZ2h0IG9yXG4gICAqICBkYXJrIHRoZSB2b2x1bWUgaXM7IHRoZSB1c2VyIHRoZW4gbmFycm93cyB0aGUgYmFuZCB0byBpc29sYXRlIGludGVuc2l0aWVzLiAqL1xuICBwcml2YXRlIGlzb01pbiA9IDA7XG4gIHByaXZhdGUgaXNvTWF4ID0gMjU1O1xuICAvKiogQWN0dWFsIGludGVuc2l0eSByYW5nZSBvZiB0aGUgdm9sdW1lIG9uIHNjcmVlbiAoW21pbixtYXhdIG92ZXIgdGhlIGxvYWRlZFxuICAgKiAgZnJhbWVzKS4gVGhlIHNsaWRlciBzcGFucyAw4oCTMjU1LCBidXQgYSBnaXZlbiBzdGFjayBvZnRlbiBvY2N1cGllcyBvbmx5IGFcbiAgICogIHN1Yi1yYW5nZSwgc28gd2UgY2xhbXAgdGhlIGlzbyBiYW5kIGludG8gdGhpcyByYW5nZSAod2l0aCBhIHNtYWxsIG1hcmdpbilcbiAgICogIHRvIGd1YXJhbnRlZSBub24tZGVnZW5lcmF0ZSBzdXJmYWNlcyDigJQgYm90aCBvbiBmaXJzdCByZW5kZXIgYW5kIG9uIGxpdmVcbiAgICogIHNsaWRlciBtb3Zlcy4gTnVsbCB1bnRpbCBhbiBpc29zdXJmYWNlIHZvbHVtZSBoYXMgYmVlbiBtZWFzdXJlZC4gKi9cbiAgcHJpdmF0ZSBpc29EYXRhUmFuZ2U6IFtudW1iZXIsIG51bWJlcl0gfCBudWxsID0gbnVsbDtcbiAgLy8gSWQgbWludGluZyBhbmQgdGhlIHNlbGVjdGlvbiBpbmRleCBzdHJlYW0gYXJlIG93bmVkIGJ5IHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUuIFNlbGVjdGlvbiBzdGlsbCBkcml2ZXMgUGxvdGx5J3MgYF9hY3RpdmVTaGFwZUluZGV4YCAoc28gYVxuICAvLyBzaW5nbGUgc2hhcGUgZ2V0cyB0aGUgZWRpdCBoYW5kbGVzKSDigJQgc2VlIHNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKCkuXG4gIHByaXZhdGUgaW1hZ2VDYWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbWFnZUNhY2hlZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZpbGVuYW1lU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIC8qKiBEcml2ZXMgdGhlIGludGVuc2l0eSBpbnNldCBvZmYgcmVnaW9uIGFkZHMvZHJhZ3MvZGVsZXRlcyAoYm90aCBiYWNrZW5kcykuICovXG4gIHByaXZhdGUgcmVnaW9uVXBkYXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAvKiogTGl2ZSAocGVyLWZyYW1lLCBub24tY29hbGVzY2VkKSByZWdpb24gZWRpdHMg4oCUIHNvIHRoZSBpbnNldCB0cmFja3MgYW4gT1NEXG4gICAqICBsaW5lIFJPSSBsaXZlIGR1cmluZyBhIGRyYWcgKE9TRCBiYXRjaGVzIHJlZ2lvblVwZGF0ZSQgdW50aWwgcmVsZWFzZSkuICovXG4gIHByaXZhdGUgcmVnaW9uTGl2ZUVkaXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY2hhbm5lbFN1Yj86IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIHdhbmRIb3N0ITogV2FuZFRvb2xIb3N0O1xuICBwcml2YXRlIGVyYXNlckhvc3QhOiBWZXJ0ZXhFcmFzZXJUb29sSG9zdDtcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAobGF6aWx5IGNyZWF0ZWQgaW4gZ2V0UmVnaW9uT3ZlcmxheSkuICovXG4gIHByaXZhdGUgcmVnaW9uT3ZlcmxheT86IElSZWdpb25PdmVybGF5O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvb3JkaW5hdGVUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtID1cbiAgICBuZXcgUGxvdGx5Q29vcmRpbmF0ZVRyYW5zZm9ybShcbiAgICAgICgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdiksXG4gICAgICAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICAgICAgICAgICAgQEluamVjdChJTUFHRV9TVEFURV9QT1JUKSBwcml2YXRlIHN0YXRlOiBJbWFnZVN0YXRlUG9ydCxcbiAgICAgICAgICAgICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIHdhbmRTZXJ2aWNlOiBXYW5kU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGJydXNoVG9vbDogQnJ1c2hUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB2ZXJ0ZXhFcmFzZXJUb29sOiBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlZ2lvblN0b3JlOiBSZWdpb25TdG9yZSkge1xuICAgIC8vIHJlbGF5b3V0IGV2ZW50IHJvdXRlclxuICAgIHRoaXMub25SZWxheW91dEV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHsgdGhpcy5yZWxheW91dEV2ZW50SGFuZGxlcihldmVudCk7IH07XG5cbiAgICAvLyBUb29sIHNlcnZpY2VzIHJlYWQvbXV0YXRlIG91ciBzdGF0ZSB2aWEgc21hbGwgKkhvc3QgaW50ZXJmYWNlcy4gU3RvcmVkXG4gICAgLy8gc28gd2UgY2FuIHJlLWJpbmQgdGhlbSB0byBvdXJzZWx2ZXMgd2hlbmV2ZXIgYSBQbG90bHkgdG9vbCBpcyBhY3RpdmF0ZWRcbiAgICAvLyAodGhlIE9wZW5TZWFkcmFnb24gYmFja2VuZCByZS1iaW5kcyB0aGUgc2FtZSBzaW5nbGV0b24gdG9vbHMgdG8gaXRzZWxmKS5cbiAgICB0aGlzLndhbmRIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VEYXRhOiAoKSA9PiB0aGlzLmdldENhY2hlZEltYWdlRGF0YSgpLFxuICAgICAgZ2V0QWN0aXZlRnJhbWVJbmRleDogKCkgPT4gdGhpcy5hY3RpdmVGcmFtZUluZGV4KCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybSgpLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMuZmlsZU5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHJlZ2lvbnMpID0+IHRoaXMuc2V0UmVnaW9ucyhyZWdpb25zKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybSgpLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1swXSB8fCAxLFxuICAgIH07XG4gICAgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICAvLyBUaGUgYnJ1c2ggcmV1c2VzIHRoZSB3YW5kIGhvc3QgKHNhbWUgY29vcmRpbmF0ZSBmcmFtZSArIHJlZ2lvbiBhY2Nlc3MpLlxuICAgIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMudmVydGV4RXJhc2VyVG9vbC5iaW5kSG9zdCh0aGlzLmVyYXNlckhvc3QpO1xuICAgIHRoaXMuYmluZFpvb21Ub0JveEhvc3QoKTtcblxuICAgIHRoaXMuaW1hZ2VDYWNoZWRTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmlzSW1hZ2VDYWNoZWQkKCkuc3Vic2NyaWJlKGltYWdlQ2FjaGVkID0+IHtcbiAgICAgIHRoaXMuaW1hZ2VDYWNoZWQgPSBpbWFnZUNhY2hlZDtcbiAgICB9KTtcbiAgICB0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRGaWxlbmFtZSQoKS5zdWJzY3JpYmUoZmlsZW5hbWUgPT4ge1xuICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVuYW1lO1xuICAgIH0pO1xuICAgIC8vIExpdmUgcmVjb2xvciBmcm9tIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lOiByZXN0eWxlIHRoZSBkaXNwbGF5IHdpbmRvdyAoem1pbi96bWF4IGZvclxuICAgIC8vIGEgaGVhdG1hcCwgY21pbi9jbWF4IGZvciBpc29zdXJmYWNlL3N1cmZhY2UpLCB0aGUgY29sb3JzY2FsZSAoY29sb3JtYXApLCBhbmQgcmV2ZXJzZS9pbnZlcnRcbiAgICAvLyB3aGVuIHRoZSBjaGFubmVsIHN0YXRlIE9SIHRoZSBjb2xvcm1hcCBjaGFuZ2VzLiAoR2FtbWEgaXMgYXBwbGllZCBieSB0aGUgT1NEIGltYWdlIHZpZXc7IHRoZVxuICAgIC8vIFBsb3RseSBjb2xvcnNjYWxlIHdpbmRvdyBjb3ZlcnMgdGhlIGNvbW1vbiBjb250cmFzdCBjYXNlLilcbiAgICB0aGlzLmNoYW5uZWxTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY2hhbm5lbHMsIHJldiwgaW52XSkgPT4gdGhpcy5hcHBseUNoYW5uZWxEaXNwbGF5KGNoYW5uZWxzLCByZXYsIGludikpO1xuICAgIC8vIFByb2ZpbGUgbGluZXMgYXJlIHN0b3JlIHJlZ2lvbnM7IGFueSByZWdpb24gY2hhbmdlIChhZGQvZHJhZy9kZWxldGUsIG9uXG4gICAgLy8gZWl0aGVyIGJhY2tlbmQpIHNob3VsZCByZWZyZXNoIHRoZSBpbnNldCB0cmFjZXMuIFRoZSBsaXZlLWVkaXQgc3RyZWFtXG4gICAgLy8gZmlyZXMgcGVyIGZyYW1lIGR1cmluZyBhIGRyYWcgKE9TRCBjb2FsZXNjZXMgcmVnaW9uVXBkYXRlJCB1bnRpbCByZWxlYXNlKSxcbiAgICAvLyBzbyB0aGUgaW5zZXQgdHJhY2tzIGFuIE9TRCBsaW5lIFJPSSBsaXZlIGFzIGl0J3MgbW92ZWQuXG4gICAgdGhpcy5yZWdpb25VcGRhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpb25MaXZlRWRpdFN1YnNjcmlwdGlvbiA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uTGl2ZUVkaXQkKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgICBpZiAoIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybiBudWxsO1xuICAgICByZXR1cm4ge1xuICAgICAgIHdpZHRoOiB0aGlzLnRydWVJbWdTaXplWzFdIC0gdGhpcy50cnVlSW1nU2l6ZVswXSxcbiAgICAgICBoZWlnaHQ6IHRoaXMudHJ1ZUltZ1NpemVbM10gLSB0aGlzLnRydWVJbWdTaXplWzJdLFxuICAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgaW1hZ2VcbiAgICogQHBhcmFtIGltYWdlSW5mb1xuICAgKiBAcGFyYW0gekluZGV4IGluZGV4IG9mIHRoZSBpbWFnZSB0byBsb2FkXG4gICAqIEByZXR1cm4gYW4gb2JqZWN0IHdpdGggZGF0YSBhbmQgcmF0aW8ga2V5c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHVybHMgPSBpbWFnZUluZm8udXJscztcbiAgICAvLyB1c2UgekluZGV4IHByb3ZpZGVkIGlmIGFueSwgMCBvdGhlcndpc2VcbiAgICBsZXQgaW1hZ2VVcmw7XG4gICAgaWYgKHpJbmRleCkge1xuICAgICAgaW1hZ2VVcmwgPSB1cmxzW3pJbmRleF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlVXJsID0gdXJsc1swXTtcbiAgICB9XG4gICAgY29uc3QgaXNHcmF5c2NhbGUgPSBpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZShpbWFnZVVybCk7XG4gICAgY29uc3QgeFJhdGlvID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemVbMF0gLyBpbWFnZS53aWR0aDtcbiAgICBjb25zdCB5UmF0aW8gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXSAvIGltYWdlLmhlaWdodDtcblxuICAgIGNvbnN0IHRydWVJbWFnZVNpemUgPSBbXTtcbiAgICAvLyBbeDAsIHgxLCB5MCwgeTFdXG4gICAgdHJ1ZUltYWdlU2l6ZVswXSA9IDA7XG4gICAgdHJ1ZUltYWdlU2l6ZVsxXSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzBdO1xuICAgIHRydWVJbWFnZVNpemVbMl0gPSAwO1xuICAgIHRydWVJbWFnZVNpemVbM10gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXTtcbiAgICB0aGlzLnRydWVJbWdTaXplID0gdHJ1ZUltYWdlU2l6ZTtcbiAgICB0aGlzLmZpbGVOYW1lID0gaW1hZ2VJbmZvLmZpbGVOYW1lO1xuICAgIGlmIChpbWFnZUluZm8uaXNTdGFjayAmJiBpbWFnZUluZm8uc2hvd1N0YWNrKSB7XG4gICAgICBjb25zdCBpbWFnZXM6IGFueVtdID0gW107XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgICAgLy8gT25lIFVSTCBwZXIgc2xpY2Ug4oCUIGxvYWQgdGhlbSBhbGwgKGVhcmxpZXIgYGxlbmd0aC0xYCBkcm9wcGVkIHRoZSBsYXN0KS5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zb2xlLmxvZyhgaW1hZ2Ugc3RhY2sgJHtpfWApO1xuICAgICAgICAvLyBkbyBub3Qga2VlcCB3aXRoIGxvYWRpbmcgaWYgZmlsZW5hbWUgaXMgZGlmZmVyZW50IChhIG5ldyBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkKVxuICAgICAgICAvLyBvciBpZiB0aGUgc3RhY2tMb2FkaW5nIHZhbHVlIGlzIHNldCB0byBmYWxzZVxuICAgICAgICBpZiAodGhpcy5maWxlTmFtZSA9PT0gaW1hZ2VJbmZvLmZpbGVOYW1lICYmIHRoaXMuc3RhY2tMb2FkaW5nJC52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2UodXJsc1tpXSk7XG4gICAgICAgICAgaWYgKGlzR3JheXNjYWxlKSB7XG4gICAgICAgICAgICBjb25zdCBncmV5ID0gaW1hZ2UuZ3JleSgpO1xuICAgICAgICAgICAgY29uc3QgaW1nRGF0YSA9IHRoaXMucGxvdFV0aWxpdGllcy5hcnJheVRvTWF0cml4KEFycmF5LmZyb20oZ3JleS5kYXRhKSwgaW1hZ2Uud2lkdGgpO1xuICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1nRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJnYkRhdGEgPSBpbWFnZS5nZXRQaXhlbHNBcnJheSgpO1xuICAgICAgICAgICAgY29uc3QgcmdiTWF0cml4ID0gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgocmdiRGF0YSwgaW1hZ2Uud2lkdGgpO1xuICAgICAgICAgICAgaW1hZ2VzLnB1c2gocmdiTWF0cml4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChpICogMTAwKSAvIHVybHMubGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYnJlYWsgc3RhY2sgbG9hZGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyByZXNldCBzdGFja0xvYWRpbmcgcHJvZ3Jlc3MgdG8gMFxuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICAgIHJldHVybiB7IGRhdGE6IGltYWdlcywgcmF0aW9zOiBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICAgICAgICAgc2l6ZXM6IFtpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0XSxcbiAgICAgICAgICAgICAgIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGltYWdlRGF0YTtcbiAgICAgIGlmIChpc0dyYXlzY2FsZSkge1xuICAgICAgICBjb25zdCBncmV5ID0gaW1hZ2UuZ3JleSgpO1xuICAgICAgICBpbWFnZURhdGEgPSB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChBcnJheS5mcm9tKGdyZXkuZGF0YSksIGltYWdlLndpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJnYkRhdGEgPSBpbWFnZS5nZXRQaXhlbHNBcnJheSgpO1xuICAgICAgICBpbWFnZURhdGEgPSB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChyZ2JEYXRhLCBpbWFnZS53aWR0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBkYXRhOiBbaW1hZ2VEYXRhXSxcbiAgICAgICAgcmF0aW9zOiBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICBzaXplczogW2ltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHRdLFxuICAgICAgICBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwbG90RGl2XG4gICAqIEBwYXJhbSBpbWFnZUxvYWRlZCBvYmplY3Qgd2l0aCBkYXRhLCByYXRpb3MgYW5kIHNpemVzIGtleVxuICAgKiBAcGFyYW0gaW1hZ2VJbmZvIEltYWdlSW5mbyBvYmplY3RcbiAgICogQHBhcmFtIHNjcmVlbkhlaWdodCBzaXplIG9mIHRoZSBhdmFpbGFibGUgc2NyZWVuIGhlaWdodFxuICAgKiBAcGFyYW0gcGxvdFR5cGUgdHlwZSBvZiBwbG90dGluZ1xuICAgKi9cbiAgLyoqXG4gICAqIEBwYXJhbSBpblBsYWNlIHdoZW4gdHJ1ZSwgdXBkYXRlcyB0aGUgZXhpc3RpbmcgcGxvdCB2aWEgUGxvdGx5LnJlYWN0XG4gICAqICAgaW5zdGVhZCBvZiBQbG90bHkucHVyZ2UgKyBQbG90bHkubmV3UGxvdC4gVXNlZCBieSB0aGUgbXVsdGktdGllclxuICAgKiAgIGRpYWdyYW0gc3dhcCAoc21hbGwg4oaSIGxhcmdlKSBzbyB0aGUgY2FudmFzIGRvZXNuJ3QgYnJpZWZseSBibGFua1xuICAgKiAgIGJldHdlZW4gcGhhc2VzLlxuICAgKi9cbiAgcHVibGljIHBsb3QocGxvdERpdjogc3RyaW5nLCBpbWFnZUxvYWRlZDogYW55LCBpbWFnZUluZm86IElJbWFnZUluZm8sIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICBwbG90VHlwZTogUGxvdFR5cGUsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHRydWVJbWFnZVNpemU6IG51bWJlcltdID0gW107XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICAvLyBbeDAsIHgxLCB5MCwgeTFdXG4gICAgdHJ1ZUltYWdlU2l6ZVswXSA9IDA7XG4gICAgdHJ1ZUltYWdlU2l6ZVsxXSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzBdO1xuICAgIHRydWVJbWFnZVNpemVbMl0gPSAwO1xuICAgIHRydWVJbWFnZVNpemVbM10gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXTtcbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9ucyBhbmQgcHVsbCBpbiBhbnkgY2FjaGVkIHJlZ2lvbnMgZm9yIHRoZVxuICAgIC8vIGltYWdlIHdlJ3JlIGFib3V0IHRvIGRpc3BsYXksIGJlZm9yZSBQbG90bHkubmV3UGxvdCByZWFkcyBgdGhpcy5zaGFwZXNgLlxuICAgIHRoaXMuc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvKTtcbiAgICB0aGlzLmltYWdlSW5mbyA9IGltYWdlSW5mbztcbiAgICB0aGlzLnBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgLy8gQ2FjaGUgcGl4ZWwgbWF0cmljZXMgc28gdGhlIHdhbmQgdG9vbCBjYW4gc2FtcGxlIHRoZW0uXG4gICAgdGhpcy5jYWNoZWRJbWFnZUZyYW1lcyA9IGltYWdlTG9hZGVkLmRhdGE7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVdpZHRoID0gaW1hZ2VMb2FkZWQuc2l6ZXNbMF07XG4gICAgdGhpcy5jYWNoZWRJbWFnZUhlaWdodCA9IGltYWdlTG9hZGVkLnNpemVzWzFdO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VSYXRpb3MgPSBpbWFnZUxvYWRlZC5yYXRpb3M7XG4gICAgdGhpcy5jYWNoZWRGcmFtZU9yaWdpbiA9IFswLCAwXTsgLy8gZnVsbCBpbWFnZSDigJQgcmVzZXQgYW55IHByaW9yIHpvb20tY3JvcCBvcmlnaW5cbiAgICB0aGlzLmNhY2hlZElzR3JheXNjYWxlID0gISFpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG5cbiAgICAvLyBQbHVnZ2FibGUgcGxvdCB0eXBlcyAoY29udG91ciwgc2NhdHRlciwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSByZW5kZXJcbiAgICAvLyB0aHJvdWdoIHRoZSB0cmFjZS1idWlsZGVyIHJlZ2lzdHJ5LiBUaGUgb3JpZ2luYWwgSEVBVE1BUC9TVVJGQUNFL1JHQi1pbWFnZVxuICAgIC8vIHJlbmRlcmVycyBrZWVwIHRoZWlyIGRlZGljYXRlZCBwYXRocyBiZWxvdyAoYWxzbyByZXVzZWQgYnkgdGhlIGhpZ2gtZGVmXG4gICAgLy8gem9vbSByZS1mZXRjaCkuIEludGVuc2l0eSBwcm9maWxlcyBhcmUgbm8gbG9uZ2VyIGEgcGxvdCB0eXBlIOKAlCB0aGV5J3JlXG4gICAgLy8gUmVnaW9uLWJhc2VkIGxpbmUgUk9JcywgYXZhaWxhYmxlIGluIEhFQVRNQVAvSU1BR0UgbW9kZS5cbiAgICBjb25zdCBpbXBsID0gUExPVExZX1BMT1RfVFlQRV9JTVBMU1twbG90VHlwZV07XG4gICAgaWYgKGltcGwpIHtcbiAgICAgIC8vIEd1YXJkZWQ6IGBpbWFnZUluZm9gIGlzIGRlY2xhcmVkIHdpdGggYSBkZWZpbml0ZS1hc3NpZ25tZW50IGFzc2VydGlvbiwgc29cbiAgICAgIC8vIG5vdGhpbmcgc3RvcHMgaXQgYmVpbmcgdW5zZXQgYXQgcnVudGltZSDigJQgYSBwbG90IGRyaXZlbiB3aGlsZSBubyBpbWFnZSBpc1xuICAgICAgLy8gbG9hZGVkIHJlYWNoZWQgaGVyZSBhbmQgdGhyZXcgb24gdGhlIGFzc2lnbm1lbnQuXG4gICAgICBpZiAodGhpcy5pbWFnZUluZm8pIHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlID0gISFpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgICByZXR1cm4gdGhpcy5wbG90VmlhUmVnaXN0cnkoXG4gICAgICAgIHBsb3REaXYsIGltcGwsIHRoaXMuYnVpbGRUcmFjZUlucHV0KGltYWdlSW5mbywgaW1hZ2VMb2FkZWQsIHRydWVJbWFnZVNpemUpLFxuICAgICAgICBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICAgIH1cblxuICAgIGlmIChpbWFnZUluZm8uaXNHcmF5c2NhbGUpIHtcbiAgICAgIGlmIChwbG90VHlwZSA9PT0gUGxvdFR5cGUuU1VSRkFDRSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbG90U3VyZmFjZShwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgICAgICBpbWFnZUxvYWRlZC5yYXRpb3MsIHNjcmVlbkhlaWdodCwgaW5QbGFjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wbG90SGVhdG1hcChwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgICAgaW1hZ2VMb2FkZWQucmF0aW9zLCBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90UkdCSGVhdG1hcChwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgIGltYWdlTG9hZGVkLnJhdGlvcywgaW1hZ2VMb2FkZWQuc2l6ZXNbMF0sIGltYWdlTG9hZGVkLnNpemVzWzFdLCBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gcGxvdCBhIGdyYXlzY2FsZSBoZWF0bWFwXG4gICAqIEBwYXJhbSBwbG90RGl2XG4gICAqIEBwYXJhbSB1cmxzXG4gICAqIEBwYXJhbSBpbWFnZXNcbiAgICogQHBhcmFtIHRydWVJbWdTaXplIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyA6IFt4MCwgeDEsIHkwLCB5MV1cbiAgICogQHBhcmFtIHJhdGlvc1xuICAgKiBAcGFyYW0gc2NyZWVuSGVpZ2h0XG4gICAqIEByZXR1cm4gUHJvbWlzZSB0cnVlIHdoZW4gcGxvdHRpbmcgaXMgZmluaXNoZWRcbiAgICovXG4gIHByaXZhdGUgcGxvdEhlYXRtYXAocGxvdERpdjogc3RyaW5nLCB1cmxzOiBzdHJpbmdbXSwgaW1hZ2VzOiBhbnlbXSwgdHJ1ZUltZ1NpemU6IG51bWJlcltdLFxuICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGltYWdlcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdXJscztcbiAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHNjcmVlbkhlaWdodDtcbiAgICAvLyBwbG90XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IH1bXSA9IFtdO1xuICAgIGltYWdlcy5mb3JFYWNoKChkYXRhc2V0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhY2UgPSB7XG4gICAgICAgIHgwOiB0cnVlSW1nU2l6ZVswXSxcbiAgICAgICAgZHg6IHJhdGlvc1swXSxcbiAgICAgICAgeTA6IHRydWVJbWdTaXplWzJdLFxuICAgICAgICBkeTogcmF0aW9zWzBdLFxuICAgICAgICB6OiBkYXRhc2V0LFxuICAgICAgICB0eXBlOiAnaGVhdG1hcCcsXG4gICAgICAgIC8vIFdlIHJlbW92ZSB0aGUgdG9vbHRpcCBhbm5vdGF0aW9uIGZvciBwZXJmb3JtYW5jZXMgcmVhc29uc1xuICAgICAgICAvLyB0ZXh0OiBkYXRhc2V0Lm1hcCgocm93OiBhbnlbXSwgaTogYW55KSA9PiByb3cubWFwKChpdGVtLCBqKSA9PiB7XG4gICAgICAgIC8vICAgcmV0dXJuIGB4OiAkeysoaiAqIHJhdGlvc1swXSkudG9GaXhlZCgyKX08YnI+eTogJHsrKGkgKiByYXRpb3NbMF0pLnRvRml4ZWQoMil9PGJyPnZhbHVlOiAke2l0ZW19YH0pKSxcbiAgICAgICAgaG92ZXJpbmZvOiAnbm9uZScsXG4gICAgICAgIGNvbG9yc2NhbGU6IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCkuZGF0YS52YWx1ZSxcbiAgICAgICAgcmV2ZXJzZXNjYWxlOiB0aGlzLnN0b3JlLmN1cnJlbnRSZXZlcnNlU2NhbGUoKSxcbiAgICAgICAgbmFtZTogYFNsaWNlICR7aW5kZXggKyAxfWAsXG4gICAgICAgIHZpc2libGU6IGluZGV4ID09PSAwXG4gICAgICB9O1xuICAgICAgdHJhY2VzLnB1c2godHJhY2UpO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbmRlciA9IGluUGxhY2UgPyBQbG90bHkucmVhY3QgOiBQbG90bHkubmV3UGxvdDtcbiAgICByZXR1cm4gKHJlbmRlciBhcyBhbnkpKHBsb3REaXYsIHRyYWNlcyBhcyBhbnksXG4gICAgICB0aGlzLmdldEhlYXRtYXBMYXlvdXQoW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV0sIFt0cnVlSW1nU2l6ZVszXSxcbiAgICAgICAgdHJ1ZUltZ1NpemVbMl1dKSwgQ09ORklHIGFzIGFueSkudGhlbigoKSA9PiB7XG4gICAgICAvLyBoYW5kbGUgdGhlIHJlbGF5b3V0IGV2ZW50IGZvciB6b29tIC8gcm9pcyBhbmQgdGhlIGNsaWNrIGV2ZW50XG4gICAgICB0aGlzLnNldEV2ZW50cyhwbG90RGl2LCB0cnVlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBwbG90IGEgZ3JheXNjYWxlIHN1cmZhY2VcbiAgICogQHBhcmFtIHBsb3REaXZcbiAgICogQHBhcmFtIHVybHNcbiAgICogQHBhcmFtIGltYWdlc1xuICAgKiBAcGFyYW0gdHJ1ZUltZ1NpemUgYXJyYXkgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIDogW3gwLCB4MSwgeTAsIHkxXVxuICAgKiBAcGFyYW0gcmF0aW9zXG4gICAqIEBwYXJhbSBzY3JlZW5IZWlnaHRcbiAgICogQHJldHVybiBQcm9taXNlIHRydWUgd2hlbiBwbG90dGluZyBpcyBmaW5pc2hlZFxuICAgKi9cbiAgcHJpdmF0ZSBwbG90U3VyZmFjZShwbG90RGl2OiBzdHJpbmcsIHVybHM6IHN0cmluZ1tdLCBpbWFnZXM6IGFueVtdLCB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGltYWdlcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdXJscztcbiAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHNjcmVlbkhlaWdodDtcbiAgICAvLyBwbG90XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyAgfVtdID0gW107XG4gICAgaW1hZ2VzLmZvckVhY2goKGRhdGFzZXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0cmFjZSA9IHtcbiAgICAgICAgejogZGF0YXNldCxcbiAgICAgICAgdHlwZTogJ3N1cmZhY2UnLFxuICAgICAgICAvLyBob3ZlcmluZm86ICdub25lJyxcbiAgICAgICAgY29sb3JzY2FsZTogdGhpcy5zdG9yZS5jdXJyZW50Q29sb3JtYXAoKS5kYXRhLnZhbHVlLFxuICAgICAgICByZXZlcnNlc2NhbGU6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgICAvLyBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgLy8gdmlzaWJsZTogaW5kZXggPT09IDBcbiAgICAgIH07XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG4gICAgY29uc3QgeHJhbmdlID0gW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV07XG4gICAgY29uc3QgeXJhbmdlID0gW3RydWVJbWdTaXplWzJdLCB0cnVlSW1nU2l6ZVszXV07XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0U3VyZmFjZUxheW91dCh4cmFuZ2UsIHlyYW5nZSwgMC40KSwgQ09ORklHX1NVUkZBQ0UgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGhhbmRsZSB0aGUgcmVsYXlvdXQgZXZlbnQgZm9yIHpvb20gLyByb2lzIGFuZCB0aGUgY2xpY2sgZXZlbnRcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIHRydWUsIHNjcmVlbkhlaWdodCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIHBsb3QgYW4gUkdCIGhlYXRtYXBcbiAgICogQHBhcmFtIHBsb3REaXZcbiAgICogQHBhcmFtIHVybHNcbiAgICogQHBhcmFtIGltYWdlc1xuICAgKiBAcGFyYW0gdHJ1ZUltZ1NpemVcbiAgICogQHBhcmFtIHdpZHRoXG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICogQHBhcmFtIHJhdGlvc1xuICAgKiBAcGFyYW0gc2NyZWVuSGVpZ2h0XG4gICAqIEByZXR1cm4gUHJvbWlzZVxuICAgKi9cbiAgcHJpdmF0ZSBwbG90UkdCSGVhdG1hcChwbG90RGl2OiBzdHJpbmcsIHVybHM6IHN0cmluZ1tdLCBpbWFnZXM6IGFueVtdLCB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFBsb3RseS5yZWFjdCB1cGRhdGVzIGluIHBsYWNlOyBQbG90bHkucHVyZ2UgKyBQbG90bHkubmV3UGxvdCBibGFua3NcbiAgICAvLyB0aGUgY2FudmFzIGZvciB+MTAwbXMgd2hpY2ggbWFrZXMgdGhlIG11bHRpLXRpZXIgc21hbGzihpJsYXJnZSBzd2FwXG4gICAgLy8gbG9vayBsaWtlIGEgcmVncmVzc2lvbiB0byBcImxvYWRpbmdcIiBiZWZvcmUgdGhlIHNoYXJwZXIgdmVyc2lvblxuICAgIC8vIGFwcGVhcnMuXG4gICAgaWYgKCFpblBsYWNlKSBQbG90bHkucHVyZ2UocGxvdERpdik7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICB0aGlzLmltYWdlTGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcbiAgICB0aGlzLnVybHMgPSB1cmxzO1xuICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuXG4gICAgLy8gYXMgYXV0b3JhbmdlIGlzIHNldCB0byBmYWxzZSwgYW5kIG5vdCByZXZlcnNlZCB3ZSBuZWVkIHRvIHNldCB0aGUgeXJhbmdlIGNvcnJlY2x5IGhlcmVcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmdldEhlYXRtYXBMYXlvdXQoW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV0sXG4gICAgICBbdHJ1ZUltZ1NpemVbM10sIHRydWVJbWdTaXplWzJdXSk7XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IH1bXSA9IFtdO1xuICAgIGltYWdlcy5mb3JFYWNoKChkYXRhc2V0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhY2UgPSB7XG4gICAgICAgIHgwOiB0cnVlSW1nU2l6ZVswXSxcbiAgICAgICAgZHg6IHJhdGlvc1swXSxcbiAgICAgICAgeTA6IHRydWVJbWdTaXplWzJdLFxuICAgICAgICBkeTogcmF0aW9zWzBdLFxuICAgICAgICB4OiBBcnJheS5mcm9tKEFycmF5KHdpZHRoKS5rZXlzKCkpLFxuICAgICAgICB5OiBBcnJheS5mcm9tKEFycmF5KGhlaWdodCkua2V5cygpKSxcbiAgICAgICAgejogZGF0YXNldCxcbiAgICAgICAgLy8gdGV4dDogZGF0YXNldC5tYXAoKHJvdzogYW55W10sIGk6IGFueSkgPT4gcm93Lm1hcCgoaXRlbSwgaikgPT4ge1xuICAgICAgICAvLyAgIHJldHVybiBgeDogJHsrKGogKiByYXRpb3NbMF0pLnRvRml4ZWQoMil9PGJyPnk6ICR7KyhpICogcmF0aW9zWzBdKS50b0ZpeGVkKDIpfTxicj52YWx1ZTogJHtpdGVtfWB9KSksXG4gICAgICAgIGhvdmVyaW5mbzogJ25vbmUnLFxuICAgICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgICBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgdmlzaWJsZTogaW5kZXggPT09IDBcbiAgICAgIH07XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSwgbGF5b3V0LCBDT05GSUcgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGhhbmRsZSB0aGUgcmVsYXlvdXQgZXZlbnRcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIGZhbHNlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgdGhlIG5vcm1hbGlzZWQgaW5wdXQgdGhlIHBsdWdnYWJsZSB0cmFjZSBidWlsZGVycyBjb25zdW1lLlxuICAgKiBQdXJlIGRhdGEgb25seSDigJQgbm8gUGxvdGx5IGhhbmRsZXMg4oCUIHNvIHRoZSBidWlsZGVycyBzdGF5IGJhY2tlbmQtbmV1dHJhbC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFjZUlucHV0KGltYWdlSW5mbzogSUltYWdlSW5mbywgaW1hZ2VMb2FkZWQ6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZUltYWdlU2l6ZTogbnVtYmVyW10pOiBUcmFjZUJ1aWxkSW5wdXQge1xuICAgIC8vIE1lYXN1cmUgdGhlIHZvbHVtZSdzIHJlYWwgaW50ZW5zaXR5IHJhbmdlIHNvIHRoZSBpc28gYmFuZCBjYW4gYmUgY2xhbXBlZFxuICAgIC8vIGludG8gaXQgKHRoZSBzbGlkZXIgaXMgYSBmaXhlZCAw4oCTMjU1IGJ1dCBhIHN0YWNrIG1heSBvY2N1cHkgb25seSBwYXJ0IG9mXG4gICAgLy8gdGhhdCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGxlYXZlIHRoZSBzdXJmYWNlcyB3aXRoIG5vdGhpbmcgdG8gY3Jvc3MpLlxuICAgIGlmICh0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5JU09TVVJGQUNFKSB7XG4gICAgICB0aGlzLmlzb0RhdGFSYW5nZSA9IHRoaXMubWVhc3VyZUludGVuc2l0eVJhbmdlKGltYWdlTG9hZGVkLmRhdGEsICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlKTtcbiAgICB9XG4gICAgY29uc3QgW2lzb01pbiwgaXNvTWF4XSA9IHRoaXMubWFwSXNvQmFuZCh0aGlzLmlzb01pbiwgdGhpcy5pc29NYXgpO1xuICAgIHJldHVybiB7XG4gICAgICBmcmFtZXM6IGltYWdlTG9hZGVkLmRhdGEsXG4gICAgICB3aWR0aDogaW1hZ2VMb2FkZWQuc2l6ZXNbMF0sXG4gICAgICBoZWlnaHQ6IGltYWdlTG9hZGVkLnNpemVzWzFdLFxuICAgICAgcmF0aW9zOiBpbWFnZUxvYWRlZC5yYXRpb3MsXG4gICAgICB0cnVlSW1hZ2VTaXplLFxuICAgICAgaXNHcmF5c2NhbGU6ICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlLFxuICAgICAgY29sb3JzY2FsZTogdGhpcy5zdG9yZS5jdXJyZW50Q29sb3JtYXAoKS5kYXRhLnZhbHVlLFxuICAgICAgcmV2ZXJzZXNjYWxlOiB0aGlzLnN0b3JlLmN1cnJlbnRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHJlZ2lvbnM6IHRoaXMuZ2V0UmVnaW9uUG9seWdvbnMoKSxcbiAgICAgIHNoYXBlQ29sb3I6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpLFxuICAgICAgaXNvTWluLFxuICAgICAgaXNvTWF4LFxuICAgIH07XG4gIH1cblxuICAvKiogTWluL21heCBpbnRlbnNpdHkgb3ZlciBldmVyeSB2b3hlbCBvZiB0aGUgbG9hZGVkIGZyYW1lcyAoUkdCIOKGkiBsdW1pbmFuY2UpLFxuICAgKiAgdXNlZCB0byBrZWVwIHRoZSBpc28gYmFuZCBpbnNpZGUgdGhlIGRhdGEuIFJldHVybnMgbnVsbCBmb3IgZW1wdHkgaW5wdXQuICovXG4gIHByaXZhdGUgbWVhc3VyZUludGVuc2l0eVJhbmdlKGZyYW1lczogYW55W10sIGlzR3JheXNjYWxlOiBib29sZWFuKTogW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICAgIGxldCBtaW4gPSBJbmZpbml0eSwgbWF4ID0gLUluZmluaXR5O1xuICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVzIHx8IFtdKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBmcmFtZSB8fCBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93IHx8IFtdKSB7XG4gICAgICAgICAgY29uc3QgdiA9IGlzR3JheXNjYWxlID8gY2VsbFxuICAgICAgICAgICAgOiAwLjI5OSAqIGNlbGxbMF0gKyAwLjU4NyAqIGNlbGxbMV0gKyAwLjExNCAqIGNlbGxbMl07XG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodikpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh2IDwgbWluKSBtaW4gPSB2O1xuICAgICAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoTnVtYmVyLmlzRmluaXRlKG1pbikgJiYgTnVtYmVyLmlzRmluaXRlKG1heCkgJiYgbWF4ID4gbWluKSA/IFttaW4sIG1heF0gOiBudWxsO1xuICB9XG5cbiAgLyoqIE1hcCB0aGUgMOKAkzI1NSBzbGlkZXIgYmFuZCBvbnRvIHRoZSB2b2x1bWUncyBhY3R1YWwgaW50ZW5zaXR5IHJhbmdlLiBUaGVcbiAgICogIHNsaWRlciBpcyBmaXhlZCAw4oCTMjU1LCBidXQgYSBzdGFjayBvZnRlbiBvY2N1cGllcyBvbmx5IGEgbmFycm93IHN1Yi1yYW5nZVxuICAgKiAgKGUuZy4gdGhpcyBFRE9GIHZvbHVtZSBpcyB+MuKAkzUwIHdpdGggc3RydWN0dXJlIG5lYXIgNuKAkzEwKS4gTWFwcGluZyBzcHJlYWRzXG4gICAqICB0aGUgZGF0YSBhY3Jvc3MgdGhlIHdob2xlIHNsaWRlciBzbyBldmVyeSBpbnRlbnNpdHkgaXMgZWFzeSB0byByZWFjaCBhbmRcbiAgICogIHRoZSBiYW5kIGFsd2F5cyBsYW5kcyBpbnNpZGUgdGhlIGRhdGEg4oCUIGEgc21hbGwgaW5zZXQga2VlcHMgdGhlIGV4dHJlbWVcbiAgICogIHN1cmZhY2VzIG9mZiB0aGUgZXhhY3QgZGF0YSBlZGdlcywgd2hpY2ggYXJlIGRlZ2VuZXJhdGUgYW5kIGRyYXcgbm90aGluZy4gKi9cbiAgcHJpdmF0ZSBtYXBJc29CYW5kKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGxldCBsbyA9IE1hdGgubWluKGlzb01pbiwgaXNvTWF4KTtcbiAgICBsZXQgaGkgPSBNYXRoLm1heChpc29NaW4sIGlzb01heCk7XG4gICAgaWYgKHRoaXMuaXNvRGF0YVJhbmdlKSB7XG4gICAgICBjb25zdCBbdk1pbiwgdk1heF0gPSB0aGlzLmlzb0RhdGFSYW5nZTtcbiAgICAgIGNvbnN0IHNwYW4gPSB2TWF4IC0gdk1pbjtcbiAgICAgIGNvbnN0IHBhZCA9IDAuMDMgKiBzcGFuO1xuICAgICAgY29uc3QgdXNhYmxlID0gc3BhbiAtIDIgKiBwYWQ7XG4gICAgICBjb25zdCBTTElERVJfTUFYID0gMjU1OyAvLyB0b29sYmFyIHNsaWRlciBkb21haW4gKGlzb1ZhbHVlTWF4KVxuICAgICAgbG8gPSB2TWluICsgcGFkICsgKGxvIC8gU0xJREVSX01BWCkgKiB1c2FibGU7XG4gICAgICBoaSA9IHZNaW4gKyBwYWQgKyAoaGkgLyBTTElERVJfTUFYKSAqIHVzYWJsZTtcbiAgICAgIGlmIChsbyA+IGhpKSB7IGNvbnN0IHQgPSBsbzsgbG8gPSBoaTsgaGkgPSB0OyB9XG4gICAgfVxuICAgIHJldHVybiBbbG8sIGhpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGlzb3N1cmZhY2UgaW50ZW5zaXR5IGJvdW5kcy4gV2hlbiBpc29zdXJmYWNlIGlzIG9uIHNjcmVlbiB0aGlzXG4gICAqIHJlc3R5bGVzIGBpc29taW5gL2Bpc29tYXhgIGluIHBsYWNlIGZvciBhIGxpdmUgdXBkYXRlIChubyB2b2x1bWUgcmVidWlsZCkuXG4gICAqIFNsaWRlciB2YWx1ZXMgYXJlIG1hcHBlZCBvbnRvIHRoZSB2b2x1bWUncyByZWFsIHJhbmdlIHNvIHRoZSBzdXJmYWNlcyBhbHdheXNcbiAgICogaGF2ZSBkYXRhIHRvIGNyb3NzIChtYXRjaGluZyB0aGUgaW5pdGlhbCByZW5kZXIpLlxuICAgKi9cbiAgcHVibGljIHNldElzb1JhbmdlKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaXNvTWluID0gaXNvTWluO1xuICAgIHRoaXMuaXNvTWF4ID0gaXNvTWF4O1xuICAgIGlmICh0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5JU09TVVJGQUNFICYmIHRoaXMucGxvdERpdikge1xuICAgICAgY29uc3QgW2xvLCBoaV0gPSB0aGlzLm1hcElzb0JhbmQoaXNvTWluLCBpc29NYXgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlc3R5bGUodGhpcy5wbG90RGl2LCB7IGlzb21pbjogW2xvXSwgaXNvbWF4OiBbaGldIH0gYXMgYW55KTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBwbG90IG5vdCByZWFkeSAqLyB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFBsb3RseSByZW5kZXJzIGlzb3N1cmZhY2VzLCBzbyBpdCBleHBvc2VzIHRoZSBpc29zdXJmYWNlIGNvbnRyb2xzIChpdHNlbGYpLiAqL1xuICBwdWJsaWMgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHsgcmV0dXJuIHRoaXM7IH1cblxuICAvKipcbiAgICogUmVuZGVyIGEgcmVnaXN0cnktYmFja2VkIHBsb3QgdHlwZTogYnVpbGQgaXRzIHRyYWNlcyBmcm9tIHRoZSBpbnB1dCwgcGlja1xuICAgKiB0aGUgbWF0Y2hpbmcgbGF5b3V0LCByZW5kZXIsIGFuZCB3aXJlIHRoZSB1c3VhbCByZWxheW91dC9jbGljayBldmVudHMuXG4gICAqIE1pcnJvcnMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGVkaWNhdGVkIGhlYXRtYXAvc3VyZmFjZSByZW5kZXJlcnMuXG4gICAqL1xuICBwcml2YXRlIHBsb3RWaWFSZWdpc3RyeShwbG90RGl2OiBzdHJpbmcsIGltcGw6IFBsb3RseVBsb3RUeXBlSW1wbCwgaW5wdXQ6IFRyYWNlQnVpbGRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGlucHV0LmZyYW1lcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdGhpcy5pbWFnZUluZm8/LnVybHMgPz8gdGhpcy51cmxzO1xuICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuXG4gICAgY29uc3QgdHJhY2VzID0gaW1wbC5idWlsZFRyYWNlcyhpbnB1dCk7XG4gICAgY29uc3QgW3gwLCB4MSwgeTAsIHkxXSA9IGlucHV0LnRydWVJbWFnZVNpemU7XG4gICAgbGV0IGxheW91dDogYW55O1xuICAgIHN3aXRjaCAoaW1wbC5sYXlvdXRLaW5kKSB7XG4gICAgICBjYXNlICczZC12b2x1bWUnOlxuICAgICAgICBsYXlvdXQgPSB0aGlzLmdldFZvbHVtZUxheW91dCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzJkLWNoYXJ0JzpcbiAgICAgICAgbGF5b3V0ID0gdGhpcy5nZXRDaGFydExheW91dCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzJkLW92ZXJsYXknOlxuICAgICAgICBsYXlvdXQgPSB0aGlzLmdldE92ZXJsYXlMYXlvdXQoW3gwLCB4MV0sIFt5MSwgeTBdKTsgLy8gcmV2ZXJzZWQgeSBsaWtlIHRoZSBpbWFnZVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IC8vICcyZC1pbWFnZSdcbiAgICAgICAgbGF5b3V0ID0gdGhpcy5nZXRIZWF0bWFwTGF5b3V0KFt4MCwgeDFdLCBbeTEsIHkwXSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IGltcGwudGhyZWVEID8gQ09ORklHX1NVUkZBQ0UgOiBDT05GSUc7XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSwgbGF5b3V0LCBjb25maWcgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIGlucHV0LmlzR3JheXNjYWxlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGxhaW4gMkQgY2hhcnQgYXhlcyAoaW50ZW5zaXR5IHByb2ZpbGUgLyBsaW5lIHBsb3RzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDaGFydExheW91dCgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtYXJnaW46IHsgdDogMzAsIGI6IDQ1LCBsOiA2MCwgcjogMjAgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHhheGlzOiB7IHRpdGxlOiAnUG9zaXRpb24gKHB4KScgfSxcbiAgICAgIHlheGlzOiB7IHRpdGxlOiAnSW50ZW5zaXR5JyB9LFxuICAgICAgZHJhZ21vZGU6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKiogSW1hZ2UtYWxpZ25lZCAyRCBheGVzIHdpdGhvdXQgdGhlIHotcGxhbmUgc2xpZGVyIChyZWdpb24gc2NhdHRlcikuICovXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUxheW91dCh4UmFuZ2U6IG51bWJlcltdLCB5UmFuZ2U6IG51bWJlcltdKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgeGF4aXM6IHsgY29uc3RyYWluOiAncmFuZ2UnLCBjb25zdHJhaW50b3dhcmQ6ICdjZW50ZXInLCBzaWRlOiAndG9wJywgdGlja3M6ICcnLCByYW5nZTogeFJhbmdlIH0sXG4gICAgICB5YXhpczoge1xuICAgICAgICBjb25zdHJhaW46ICdyYW5nZScsIGNvbnN0cmFpbnRvd2FyZDogJ2NlbnRlcicsIHJhbmdlOiB5UmFuZ2UsIHRpY2tzOiAnJyxcbiAgICAgICAgdGlja3N1ZmZpeDogJyAgJywgYXV0b3JhbmdlOiBmYWxzZSwgc2NhbGVhbmNob3I6IHRoaXMuc2NhbGVyYXRpbyA/ICd4JyA6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG1hcmdpbjogeyB0OiAzMCwgYjogNSwgbDogNTUsIHI6IDUgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHNoYXBlczogdGhpcy5jdXJyZW50UmVuZGVyU2hhcGVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSksXG4gICAgICBkcmFnbW9kZTogdGhpcy5kcmFnTW9kZSA/IHRoaXMuZHJhZ01vZGUgOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIDNEIHNjZW5lIGZvciB2b2x1bWV0cmljIHBsb3QgdHlwZXMgKHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkuICovXG4gIHByaXZhdGUgZ2V0Vm9sdW1lTGF5b3V0KCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hcmdpbjogeyB0OiAwLCBiOiAwLCBsOiAwLCByOiAwIH0sXG4gICAgICBoZWlnaHQ6IHRoaXMuc2NyZWVuSGVpZ2h0LFxuICAgICAgYXV0b3NpemU6IHRydWUsXG4gICAgICBzY2VuZToge1xuICAgICAgICB4YXhpczogeyB0aXRsZTogJ1gnIH0sXG4gICAgICAgIHlheGlzOiB7IHRpdGxlOiAnWScgfSxcbiAgICAgICAgemF4aXM6IHsgdGl0bGU6ICdaLXBsYW5lJyB9LFxuICAgICAgICAvLyAnY3ViZScgKG5vdCAnZGF0YScpOiBhIHotc3RhY2sgaGFzIGZhciBmZXdlciBwbGFuZXMgdGhhbiBYL1kgcGl4ZWxzLFxuICAgICAgICAvLyBzbyAnZGF0YScgc3F1YXNoZXMgdGhlIHZvbHVtZSBpbnRvIGEgbmVhci1mbGF0IHNsYWIgdGhhdCByZWFkcyBhc1xuICAgICAgICAvLyBlbXB0eSBlZGdlLW9uLiBBIGN1YmUgZ2l2ZXMgdGhlIHogZGltZW5zaW9uIHJlYWwgaGVpZ2h0IHNvIHRoZVxuICAgICAgICAvLyBpc29zdXJmYWNlL3ZveGVscyBhcmUgYWN0dWFsbHkgdmlzaWJsZS5cbiAgICAgICAgYXNwZWN0bW9kZTogJ2N1YmUnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgKGRyaXZlcyB0aGUgVUkgc2VsZWN0b3IpLiAqL1xuICBwdWJsaWMgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUExPVF9UWVBFX0RFU0NSSVBUT1JTKS5maWx0ZXIoKGQpOiBkIGlzIFBsb3RUeXBlRGVzY3JpcHRvciA9PiAhIWQpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gUGxvdGx5IGRyYXdzIHNoYXBlcyBuYXRpdmVseSwgc28gdGhlXG4gICAqICBvdmVybGF5IGlzIGEgdGhpbiBhZGFwdGVyIG92ZXIgdGhpcyBzZXJ2aWNlJ3MgZHJhZyBtb2Rlcy4gKi9cbiAgcHVibGljIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkge1xuICAgIGlmICghdGhpcy5yZWdpb25PdmVybGF5KSB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgUGxvdGx5UmVnaW9uT3ZlcmxheSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25PdmVybGF5O1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVuc2l0eSBwcm9maWxlIChSZWdpb24tYmFzZWQgbGluZSBST0lzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogRW1pdHMgdGhlIGZ1bGwgc2V0IG9mIGludGVuc2l0eSBwcm9maWxlcyAob25lIHBlciBwcm9maWxlLWxpbmUgcmVnaW9uKVxuICAgKiAgd2hlbmV2ZXIgYSBwcm9maWxlIGxpbmUgaXMgYWRkZWQsIG1vdmVkLCBvciByZW1vdmVkLiAqL1xuICBwdWJsaWMgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBQbG90bHkgcmVuZGVycyB0aGUgbGluZSBST0lzICsgaW5zZXQsIHNvIGl0IGV4cG9zZXMgdGhlIGludGVuc2l0eSBjb250cm9scy4gKi9cbiAgcHVibGljIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwgeyByZXR1cm4gdGhpczsgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIGluc2V0IGNoYXJ0IGludG8gYGRpdklkYCDigJQgb25lIGxpbmVcbiAgICogdHJhY2UgcGVyIFJPSSwgZWFjaCBkcmF3biBpbiBpdHMgUk9JJ3MgY29sb3VyLiBLZXB0IGhlcmUgKG5vdCBpbiB0aGUgZGlhZ3JhbVxuICAgKiBjb21wb25lbnQpIHNvIHRoZSBjb25zdW1lciBuZXZlciB0b3VjaGVzIFBsb3RseSBkaXJlY3RseS5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZJZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHRyYWNlcyA9IChwcm9maWxlcyA/PyBbXSkubWFwKChwLCBpKSA9PiAoe1xuICAgICAgeDogcC5wb3NpdGlvbnMsXG4gICAgICB5OiBwLnZhbHVlcyxcbiAgICAgIHR5cGU6ICdzY2F0dGVyJyxcbiAgICAgIG1vZGU6ICdsaW5lcycsXG4gICAgICBsaW5lOiB7IGNvbG9yOiBwLmNvbG9yID8/ICcjRkZENDAwJywgd2lkdGg6IDIgfSxcbiAgICAgIG5hbWU6IGBMaW5lICR7aSArIDF9YCxcbiAgICAgIGhvdmVyaW5mbzogJ3greScsXG4gICAgfSkpO1xuICAgIC8vIFggYXhpcyBpcyBpbiBtaWNyb25zIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgYSBwaHlzaWNhbCBwaXhlbCBzaXplIChtcHApLFxuICAgIC8vIG90aGVyd2lzZSBpbiBwaXhlbHMg4oCUIGRyaXZlbiBieSB0aGUgdW5pdCB0aGUgc2FtcGxlciB0YWdnZWQgb24gdGhlIHByb2ZpbGUuXG4gICAgY29uc3QgdW5pdCA9IChwcm9maWxlcyA/PyBbXSkuZmluZChwID0+IHAudW5pdCk/LnVuaXQgPz8gJ3B4JztcbiAgICBjb25zdCB4VGl0bGUgPSB1bml0ID09PSAnwrVtJyA/ICdQb3NpdGlvbiAowrVtKScgOiAnUG9zaXRpb24gKHB4KSc7XG4gICAgUGxvdGx5LnJlYWN0KGVsLCB0cmFjZXMgYXMgYW55LCB7XG4gICAgICBtYXJnaW46IHsgdDogNiwgcjogOCwgYjogMzgsIGw6IDQwIH0sXG4gICAgICB4YXhpczogeyB0aXRsZTogeFRpdGxlLCB6ZXJvbGluZTogZmFsc2UsIGNvbG9yOiAnI2RkZCcgfSxcbiAgICAgIHlheGlzOiB7IHRpdGxlOiAnSW50ZW5zaXR5JywgemVyb2xpbmU6IGZhbHNlLCBjb2xvcjogJyNkZGQnIH0sXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICAgIHBhcGVyX2JnY29sb3I6ICdyZ2JhKDI1LDI1LDI1LDAuOSknLFxuICAgICAgcGxvdF9iZ2NvbG9yOiAncmdiYSgyNSwyNSwyNSwwLjkpJyxcbiAgICAgIGZvbnQ6IHsgY29sb3I6ICcjZWVlJywgc2l6ZTogMTAgfSxcbiAgICB9IGFzIGFueSwgeyBkaXNwbGF5TW9kZUJhcjogZmFsc2UsIHJlc3BvbnNpdmU6IHRydWUgfSBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBzaGFwZXMgKGZpbHRlcmVkL3JlZHJhd24gZm9yIHRoZSBjdXJyZW50IGZpbGUpLiBUaGUgcHJvZmlsZS1saW5lIFJPSXNcbiAgICogYXJlIG9yZGluYXJ5IHN0b3JlIHJlZ2lvbnMgKHRhZ2dlZCBga2luZDogJ3Byb2ZpbGUnYCksIHNvIHRoZXkgYXJlIGFscmVhZHlcbiAgICogcGFydCBvZiBgdGhpcy5zaGFwZXNgIOKAlCBubyBzZXBhcmF0ZSBhcHBlbmQgaXMgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjdXJyZW50UmVuZGVyU2hhcGVzKHNob3dMYWJlbCA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zaGFwZXNUb1JlZHJhdyhzaG93TGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIElJbnRlbnNpdHlDb250cm9sczogYWRkIGFub3RoZXIgaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBhcyBhIG5ldXRyYWwgUmVnaW9uXG4gICAqICh0YWdnZWQgYGtpbmQ6ICdwcm9maWxlJ2ApLiBJdCBpcyBhIGhvcml6b250YWwgb3BlbiAyLXBvaW50IHBvbHlsaW5lIHNwYW5uaW5nXG4gICAqIHRoZSBpbWFnZSB3aWR0aCwgc3RhZ2dlcmVkIHZlcnRpY2FsbHkgc28gc3VjY2Vzc2l2ZSBsaW5lcyBzdGF5IGRpc3RpbmN0LCBpblxuICAgKiB0aGUgbmV4dCBicmlnaHQgcGFsZXR0ZSBjb2xvdXIuIEFkZGVkIHRvIHRoZSBzaGFyZWQgc3RvcmUgc28gYm90aCBiYWNrZW5kc1xuICAgKiAoUGxvdGx5ICsgT3BlblNlYWRyYWdvbikgcmVuZGVyIGFuZCBkcmFnIGl0OyBleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYlxuICAgKiBhbmQgZXhwb3J0cyBieSBpdHMga2luZC5cbiAgICovXG4gIHB1YmxpYyBhZGRQcm9maWxlTGluZSgpOiBSZWdpb24gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5nZXRQcm9maWxlUmVnaW9ucygpLmxlbmd0aDtcbiAgICBjb25zdCBpbWdYMCA9IHRoaXMudHJ1ZUltZ1NpemVbMF0sIGltZ1gxID0gdGhpcy50cnVlSW1nU2l6ZVsxXTtcbiAgICBjb25zdCBpbWdUb3AgPSB0aGlzLnRydWVJbWdTaXplWzJdLCBpbWdCb3R0b20gPSB0aGlzLnRydWVJbWdTaXplWzNdO1xuXG4gICAgLy8gUGxhY2UgdGhlIGxpbmUgd2l0aGluIHRoZSBjdXJyZW50bHkgVklTSUJMRSBpbWFnZSBhcmVhLCBzbyB3aGVuIHpvb21lZCBpbiBpdFxuICAgIC8vIGxhbmRzIG9uLXNjcmVlbiBpbnN0ZWFkIG9mIHNwYW5uaW5nIHRoZSB3aG9sZSAobW9zdGx5IG9mZi1zY3JlZW4pIGltYWdlLCBhdFxuICAgIC8vIDIvMyBvZiB0aGUgdmlzaWJsZSB3aWR0aCBhbmQgaG9yaXpvbnRhbGx5IGNlbnRyZWQuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGxcbiAgICAvLyBpbWFnZSB3aGVuIG5vIHZpZXdwb3J0IFJPSSBpcyBrbm93biAoUGxvdGx5IGhlYXRtYXApIG9yIGEgc3RhbGUgUk9JIG5vIGxvbmdlclxuICAgIC8vIG92ZXJsYXBzIHRoZSBpbWFnZS5cbiAgICBjb25zdCByb2kgPSB0aGlzLmxhc3RWaXNpYmxlUm9pO1xuICAgIGNvbnN0IG92ZXJsYXBzID0gISFyb2kgJiYgcm9pLndpZHRoID4gMCAmJiByb2kuaGVpZ2h0ID4gMFxuICAgICAgJiYgcm9pLnggPCBpbWdYMSAmJiByb2kueCArIHJvaS53aWR0aCA+IGltZ1gwXG4gICAgICAmJiByb2kueSA8IGltZ0JvdHRvbSAmJiByb2kueSArIHJvaS5oZWlnaHQgPiBpbWdUb3A7XG4gICAgY29uc3QgeDB2ID0gb3ZlcmxhcHMgPyBNYXRoLm1heChpbWdYMCwgcm9pIS54KSA6IGltZ1gwO1xuICAgIGNvbnN0IHgxdiA9IG92ZXJsYXBzID8gTWF0aC5taW4oaW1nWDEsIHJvaSEueCArIHJvaSEud2lkdGgpIDogaW1nWDE7XG4gICAgY29uc3QgdG9wViA9IG92ZXJsYXBzID8gTWF0aC5tYXgoaW1nVG9wLCByb2khLnkpIDogaW1nVG9wO1xuICAgIGNvbnN0IGJvdHRvbVYgPSBvdmVybGFwcyA/IE1hdGgubWluKGltZ0JvdHRvbSwgcm9pIS55ICsgcm9pIS5oZWlnaHQpIDogaW1nQm90dG9tO1xuXG4gICAgY29uc3QgY3ggPSAoeDB2ICsgeDF2KSAvIDI7XG4gICAgY29uc3QgaGFsZiA9ICgoeDF2IC0geDB2KSAqICgyIC8gMykpIC8gMjsgLy8gbGluZSBzcGFucyAyLzMgb2YgdGhlIHZpc2libGUgd2lkdGhcbiAgICBjb25zdCB4MCA9IGN4IC0gaGFsZiwgeDEgPSBjeCArIGhhbGY7XG5cbiAgICBjb25zdCBiYW5kSCA9IGJvdHRvbVYgLSB0b3BWO1xuICAgIGNvbnN0IG1pZFkgPSAodG9wViArIGJvdHRvbVYpIC8gMjtcbiAgICAvLyBTdGFnZ2VyIHN1Y2Nlc3NpdmUgbGluZXMgYWNyb3NzIHRoZSB2aXNpYmxlIGJhbmQgc28gdGhleSBzdGF5IGRpc3RpbmN0LlxuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihib3R0b21WLCBNYXRoLm1heCh0b3BWLCBtaWRZICsgY291bnQgKiBiYW5kSCAqIDAuMTIpKTtcblxuICAgIGNvbnN0IHBvbHkgPSBuZXcgUG9seWdvbigpO1xuICAgIHBvbHkubnBvaW50cyA9IDI7XG4gICAgcG9seS54cG9pbnRzID0gW3gwLCB4MV07XG4gICAgcG9seS55cG9pbnRzID0gW3ksIHldO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSBbW3gwLCB5XSwgW3gxLCB5XV07XG4gICAgcG9seS5jbG9zZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gcG9seTtcbiAgICByZWdpb24ua2luZCA9ICdwcm9maWxlJztcbiAgICByZWdpb24uY29sb3IgPSB0aGlzLlBST0ZJTEVfUEFMRVRURVt0aGlzLnByb2ZpbGVDb2xvclNlcSsrICUgdGhpcy5QUk9GSUxFX1BBTEVUVEUubGVuZ3RoXTtcbiAgICAvLyBMZWF2ZSByZWdpb24ubGFiZWwgdW5kZWZpbmVkIHNvIGFwcGx5Q2xhc3NpZmljYXRpb25Db2xvcnMgd29uJ3QgcmVjb2xvciBpdC5cblxuICAgIHRoaXMucmVnaW9uU3RvcmUuYWRkUmVnaW9uKHJlZ2lvbik7XG5cbiAgICAvLyBJZiBhIFBsb3RseSBwbG90IGlzIG9uIHNjcmVlbiwgcmUtcmVuZGVyIHNoYXBlcyBzbyB0aGUgbmV3IGxpbmUgYXBwZWFycy5cbiAgICAvLyAoVGhlIE9TRCBvdmVybGF5IHJlbmRlcnMgYXV0b21hdGljYWxseSB2aWEgaXRzIHJlZ2lvbi11cGRhdGUgc3Vic2NyaXB0aW9uLilcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICB0aGlzLnN5bmNTaGFwZXNGcm9tU3RvcmUoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgc2hhcGVzOiB0aGlzLmN1cnJlbnRSZW5kZXJTaGFwZXMoKSB9IGFzIGFueSk7XG4gICAgICB9IGNhdGNoIHsgLyogZGl2IG5vdCBhIFBsb3RseSBwbG90IChPU0Qgb3ducyBpdCkgKi8gfVxuICAgIH1cbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG5cbiAgLyoqIFRoZSBwcm9maWxlLWxpbmUgUk9JcyBjdXJyZW50bHkgaW4gdGhlIHN0b3JlIChraW5kID09PSAncHJvZmlsZScpLiAqL1xuICBwcml2YXRlIGdldFByb2ZpbGVSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKHIgPT4gKHIgYXMgYW55KS5raW5kID09PSAncHJvZmlsZScpO1xuICB9XG5cbiAgLyoqIFJlY29tcHV0ZSBhbmQgYnJvYWRjYXN0IGEgcHJvZmlsZSBmb3IgZXZlcnkgcHJvZmlsZS1saW5lIHJlZ2lvbiAoaWQgKyBjb2xvdXJcbiAgICogIHRhZ2dlZCBzbyB0aGUgaW5zZXQgdHJhY2UgbWF0Y2hlcyBpdHMgbGluZSkuICovXG4gIHByaXZhdGUgZW1pdFByb2ZpbGVzKCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQubmV4dCh0aGlzLmdldFByb2ZpbGVSZWdpb25zKCkubWFwKHIgPT4gKHtcbiAgICAgIC4uLnRoaXMuY29tcHV0ZUludGVuc2l0eVByb2ZpbGVGb3JSZWdpb24ociksXG4gICAgICBpZDogci5pZCxcbiAgICAgIGNvbG9yOiByLmNvbG9yLFxuICAgIH0pKSk7XG4gIH1cblxuICAvKipcbiAgICogU2FtcGxlIHRoZSBpbnRlbnNpdHkgcHJvZmlsZSBmb3IgYSBwcm9maWxlLWxpbmUgcmVnaW9uOiBleHRyYWN0IGl0cyB0d29cbiAgICogcG9seWdvbiBlbmRwb2ludHMgYW5kIHJldXNlIHRoZSBzaGFyZWQgYGNvbXB1dGVJbnRlbnNpdHlQcm9maWxlYCBzYW1wbGluZy5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUludGVuc2l0eVByb2ZpbGVGb3JSZWdpb24ocmVnaW9uOiBSZWdpb24pOiBJbnRlbnNpdHlQcm9maWxlIHtcbiAgICAvLyBEdWNrLXR5cGVkIChub3QgYGluc3RhbmNlb2YgUG9seWdvbmApOiBhZnRlciBhIGRyYWcgcm91bmQtdHJpcHMgdGhyb3VnaCB0aGVcbiAgICAvLyBzdG9yZSB0aGUgYm91bmRzIGNhbiBiZSBhIHBsYWluIG9iamVjdCwgc28gbWF0Y2ggb24gdGhlIHBvaW50IGFycmF5cy5cbiAgICBjb25zdCBwb2x5OiBhbnkgPSByZWdpb24uYm91bmRzO1xuICAgIGlmICghcG9seSB8fCAhQXJyYXkuaXNBcnJheShwb2x5Lnhwb2ludHMpIHx8ICFBcnJheS5pc0FycmF5KHBvbHkueXBvaW50cykgfHxcbiAgICAgICAgcG9seS54cG9pbnRzLmxlbmd0aCA8IDIgfHwgcG9seS55cG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB7IHBvc2l0aW9uczogW10sIHZhbHVlczogW10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUludGVuc2l0eVByb2ZpbGUoe1xuICAgICAgeDA6IHBvbHkueHBvaW50c1swXSwgeTA6IHBvbHkueXBvaW50c1swXSxcbiAgICAgIHgxOiBwb2x5Lnhwb2ludHNbMV0sIHkxOiBwb2x5Lnlwb2ludHNbMV0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VwcGx5IHBpeGVsIGZyYW1lcyBmb3IgaW50ZW5zaXR5IHNhbXBsaW5nICh1c2VkIGJ5IHRoZSBPU0QvaW1hZ2UgYmFja2VuZCxcbiAgICogd2hvc2UgY2FjaGVkIGZyYW1lcyBtYXkgYmUgZW1wdHkpLiBPcHRpb25hbGx5IGFsc28gc2V0cyB0aGUgZGF0YS9waXhlbCByYXRpb3MuXG4gICAqL1xuICBwdWJsaWMgc2V0U2FtcGxpbmdGcmFtZXMoZnJhbWVzOiBhbnlbXSwgcmF0aW9zOiBudW1iZXJbXSwgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZWRJbWFnZUZyYW1lcyA9IGZyYW1lcztcbiAgICBpZiAocmF0aW9zKSB0aGlzLmNhY2hlZEltYWdlUmF0aW9zID0gcmF0aW9zO1xuICAgIHRoaXMuY2FjaGVkRnJhbWVPcmlnaW4gPSBvcmlnaW47XG4gIH1cblxuICAvKipcbiAgICogUG9wdWxhdGUgdGhlIHNhbXBsaW5nIGNhY2hlIGZvciB0aGUgaW50ZW5zaXR5IHByb2ZpbGVzIHdoZW4gT3BlblNlYWRyYWdvbiBpc1xuICAgKiB0aGUgYWN0aXZlIGJhY2tlbmQgKHRoZSBJbWFnZSBwbG90IHR5cGUpLiBJbiBPU0QgbW9kZSBQbG90bHkgbmV2ZXIgcmVuZGVyZWQsXG4gICAqIHNvIGBjYWNoZWRJbWFnZUZyYW1lc2AvYHRydWVJbWdTaXplYCBhcmUgdW5zZXQg4oCUIGZldGNoIHRoZSBjdXJyZW50IHNsaWNlJ3NcbiAgICogcHJldmlldyAodGhlIHNhbWUgcGl4ZWxzIHRoZSBoZWF0bWFwIHdvdWxkIHNhbXBsZSkgc28gdGhlIGxpbmUgUk9JcyBoYXZlXG4gICAqIHBpeGVsIGRhdGEgYW5kIGEgcGxhY2VtZW50IGV4dGVudC4gUmUtZW1pdHMgdGhlIHByb2ZpbGVzIG9uY2UgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWltYWdlSW5mbz8udXJscz8ubGVuZ3RoKSByZXR1cm47XG4gICAgLy8gU2FtcGxlIGp1c3QgdGhlIGRpc3BsYXllZCBzbGljZSAoc2hvd1N0YWNrIG9mZiDihpIgc2luZ2xlIGZyYW1lKTsgYGxvYWRgXG4gICAgLy8gYWxzbyBzZXRzIGB0aGlzLnRydWVJbWdTaXplYCwgd2hpY2ggYWRkUHJvZmlsZUxpbmUgbmVlZHMgZm9yIHBsYWNlbWVudC5cbiAgICBjb25zdCBzaW5nbGUgPSB7IC4uLmltYWdlSW5mbywgc2hvd1N0YWNrOiBmYWxzZSB9IGFzIElJbWFnZUluZm87XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgdGhpcy5sb2FkKHNpbmdsZSwgekluZGV4IHx8IDApO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMgPSBsb2FkZWQuZGF0YTtcbiAgICB0aGlzLmNhY2hlZEltYWdlUmF0aW9zID0gbG9hZGVkLnJhdGlvcztcbiAgICB0aGlzLmNhY2hlZEltYWdlV2lkdGggPSBsb2FkZWQuc2l6ZXM/LlswXSA/PyB0aGlzLmNhY2hlZEltYWdlV2lkdGg7XG4gICAgdGhpcy5jYWNoZWRJbWFnZUhlaWdodCA9IGxvYWRlZC5zaXplcz8uWzFdID8/IHRoaXMuY2FjaGVkSW1hZ2VIZWlnaHQ7XG4gICAgdGhpcy5jYWNoZWRGcmFtZU9yaWdpbiA9IFswLCAwXTsgLy8gZnVsbCBwcmV2aWV3XG4gICAgdGhpcy5jYWNoZWRJc0dyYXlzY2FsZSA9ICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlO1xuICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgdGhlIHZpZXdwb3J0LWNoYW5nZSBzaWduYWwgaXMgT3BlblNlYWRyYWdvbidzXG4gICAqIChpdCByZS1zYW1wbGVzIG9uIE9TRCB6b29tL3BhbikuIFBsb3RseSdzIG93biBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlXG4gICAqIHNhbXBsaW5nIGNhY2hlIGlubGluZSwgc28gaXQgbmV2ZXIgZW1pdHMgaGVyZTsgcmV0dXJucyBFTVBUWSBzbyBhIHVuaWZvcm1cbiAgICogYElWaXN1YWxpemVyYCBjb25zdW1lciBjYW4gc3Vic2NyaWJlIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdGl2ZSBiYWNrZW5kLlxuICAgKi9cbiAgcHVibGljIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICAvKipcbiAgICogUmUtZmV0Y2ggdGhlIGdpdmVuIGltYWdlLXBpeGVsIFJPSSBhdCB0aGUgZGlzcGxheSByZXNvbHV0aW9uIGFuZCB1c2UgaXQgYXNcbiAgICogdGhlIGludGVuc2l0eS1zYW1wbGluZyBzb3VyY2UsIHNvIHRoZSBwcm9maWxlIHJlZmxlY3RzIHRoZSBkYXRhIGF0IHRoZVxuICAgKiBjdXJyZW50IHpvb20gbGV2ZWwuIFNoYXJlZCBieSBib3RoIGJhY2tlbmRzOiB0aGUgT1NEIHZpZXdwb3J0LWNoYW5nZSBob29rXG4gICAqIGNhbGxzIGl0IG9uIHpvb20vcGFuOyBQbG90bHkncyBvd24gaGlnaC1kZWYgem9vbSAodHJpZ2dlclpvb20pIHVwZGF0ZXMgdGhlXG4gICAqIHNhbWUgY2FjaGUgaW5saW5lLiBgcm9pYCBpcyBpbiBmdWxsLWltYWdlIHBpeGVsIGNvb3JkaW5hdGVzLlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgcmV0dXJuO1xuICAgIC8vIFJlbWVtYmVyIHRoZSB2aXNpYmxlIHJlZ2lvbiBzbyBhIG5ldyBwcm9maWxlIGxpbmUgaXMgcGxhY2VkIGluc2lkZSBpdC5cbiAgICB0aGlzLmxhc3RWaXNpYmxlUm9pID0geyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH07XG4gICAgY29uc3Qgcm9pID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgIHJvaS54ID0gTWF0aC5yb3VuZCh4KTsgcm9pLnkgPSBNYXRoLnJvdW5kKHkpO1xuICAgIHJvaS53aWR0aCA9IE1hdGgucm91bmQod2lkdGgpOyByb2kuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuICAgIGNvbnN0IHNjcmVlbiA9IHRoaXMucGxvdFV0aWxpdGllcy5nZXREb21SZWN0YW5nbGUoJ2RpYWdyYW0nKTtcbiAgICAvLyBTbmFwc2hvdCB0aGUgZmlsZW5hbWUgc28gYSByZXNwb25zZSB0aGF0IGFycml2ZXMgYWZ0ZXIgdGhlIHVzZXIgc3dpdGNoZWRcbiAgICAvLyBmaWxlcyBpcyBkcm9wcGVkICh0aGUgcmVxdWVzdCBjYXJyaWVkIHRoZSBmaWxlIHNlbGVjdGVkIGF0IGNhbGwgdGltZSkuXG4gICAgY29uc3QgcmVxTmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgdGhpcy50aWxlcy56b29tT25SZWdpb24ocm9pLCBzY3JlZW4sIHpJbmRleCB8fCAwKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHpvb21EYXRhKSA9PiB7XG4gICAgICAgIEltYWdlLmxvYWQoQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkoem9vbURhdGEpKSkudGhlbigoaW1hZ2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmZpbGVOYW1lICE9PSByZXFOYW1lKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgaXNHcmF5ID0gISF0aGlzLmltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSBpc0dyYXlcbiAgICAgICAgICAgID8gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgoaW1hZ2UuZ3JleSgpLmRhdGEsIGltYWdlLndpZHRoKVxuICAgICAgICAgICAgOiB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChpbWFnZS5nZXRQaXhlbHNBcnJheSgpLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgdGhpcy5zZXRTYW1wbGluZ0ZyYW1lcyhbZnJhbWVdLCBbcm9pLndpZHRoIC8gaW1hZ2Uud2lkdGgsIHJvaS5oZWlnaHQgLyBpbWFnZS5oZWlnaHRdLFxuICAgICAgICAgICAgW3JvaS54LCByb2kueV0pO1xuICAgICAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IC8qIGtlZXAgdGhlIHByZXZpb3VzIHNhbXBsaW5nIGZyYW1lIG9uIGEgZmFpbGVkIGNyb3AgZmV0Y2ggKi8gfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGUgdGhlIGFjdGl2ZSBmcmFtZSdzIGludGVuc2l0eSAoZ3JheXNjYWxlIHZhbHVlIG9yIFJHQiBsdW1pbmFuY2UpXG4gICAqIGFsb25nIHRoZSBsaW5lIFJPSS4gUmV0dXJucyBkaXN0YW5jZS1hbG9uZy1saW5lIHBvc2l0aW9ucyBhbmQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlSW50ZW5zaXR5UHJvZmlsZShsaW5lOiBhbnkpOiBJbnRlbnNpdHlQcm9maWxlIHtcbiAgICBjb25zdCBlbXB0eTogSW50ZW5zaXR5UHJvZmlsZSA9IHsgcG9zaXRpb25zOiBbXSwgdmFsdWVzOiBbXSB9O1xuICAgIGlmICghdGhpcy5jYWNoZWRJbWFnZUZyYW1lcz8ubGVuZ3RoIHx8ICFsaW5lKSByZXR1cm4gZW1wdHk7XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLmNhY2hlZEltYWdlRnJhbWVzW3RoaXMuYWN0aXZlRnJhbWVJbmRleCgpXSA/PyB0aGlzLmNhY2hlZEltYWdlRnJhbWVzWzBdO1xuICAgIGlmICghZnJhbWU/Lmxlbmd0aCkgcmV0dXJuIGVtcHR5O1xuICAgIGNvbnN0IHJ4ID0gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1swXSB8fCAxO1xuICAgIGNvbnN0IHJ5ID0gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1sxXSB8fCByeDtcbiAgICBjb25zdCBbb3gsIG95XSA9IHRoaXMuY2FjaGVkRnJhbWVPcmlnaW47XG4gICAgY29uc3QgeDAgPSArbGluZS54MCwgeTAgPSArbGluZS55MCwgeDEgPSArbGluZS54MSwgeTEgPSArbGluZS55MTtcbiAgICBjb25zdCBkeERhdGEgPSB4MSAtIHgwLCBkeURhdGEgPSB5MSAtIHkwO1xuICAgIC8vIFNjYWxlIHRoZSBhbG9uZy1saW5lIGRpc3RhbmNlIGJ5IHRoZSBwaHlzaWNhbCBwaXhlbCBzaXplIChtaWNyb25zL3BpeGVsKVxuICAgIC8vIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgb25lIOKAlCBhbmlzb3Ryb3BpYyBtcHBYL21wcFkgYXJlIGFwcGxpZWQgcGVyIGF4aXMgc29cbiAgICAvLyBkaWFnb25hbCBsaW5lcyBtZWFzdXJlIHRoZSB0cnVlIHBoeXNpY2FsIGxlbmd0aC4gRmFsbHMgYmFjayB0byBwaXhlbHMuXG4gICAgY29uc3QgeyBtcHBYLCBtcHBZIH0gPSB0aGlzLmN1cnJlbnRNcHAoKTtcbiAgICBjb25zdCB1c2VNaWNyb25zID0gbXBwWCAhPSBudWxsO1xuICAgIGNvbnN0IGxlbkRhdGEgPSB1c2VNaWNyb25zXG4gICAgICA/IE1hdGguaHlwb3QoZHhEYXRhICogbXBwWCwgZHlEYXRhICogKG1wcFkgPz8gbXBwWCkpXG4gICAgICA6IE1hdGguaHlwb3QoZHhEYXRhLCBkeURhdGEpO1xuICAgIGNvbnN0IGxlblB4ID0gTWF0aC5oeXBvdChkeERhdGEgLyByeCwgZHlEYXRhIC8gcnkpO1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgyLCBNYXRoLnJvdW5kKGxlblB4KSk7XG4gICAgY29uc3QgaCA9IGZyYW1lLmxlbmd0aDtcbiAgICBjb25zdCB3ID0gZnJhbWVbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IHBvc2l0aW9uczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IHQgPSBpIC8gKG4gLSAxKTtcbiAgICAgIC8vIE1hcCBkYXRhIGNvb3JkcyB0byB0aGUgY2FjaGVkIGZyYW1lJ3MgcGl4ZWwgZ3JpZCwgb2Zmc2V0IGJ5IHRoZSBmcmFtZSdzXG4gICAgICAvLyBvcmlnaW4gKG5vbi16ZXJvIHdoZW4gdGhlIGZyYW1lIGlzIGEgem9vbWVkIGNyb3ApLlxuICAgICAgY29uc3QgcHggPSBNYXRoLnJvdW5kKCh4MCArIHQgKiBkeERhdGEgLSBveCkgLyByeCk7XG4gICAgICBjb25zdCBweSA9IE1hdGgucm91bmQoKHkwICsgdCAqIGR5RGF0YSAtIG95KSAvIHJ5KTtcbiAgICAgIGxldCB2ID0gMDtcbiAgICAgIGlmIChweCA+PSAwICYmIHB4IDwgdyAmJiBweSA+PSAwICYmIHB5IDwgaCkge1xuICAgICAgICBjb25zdCBjZWxsID0gZnJhbWVbcHldW3B4XTtcbiAgICAgICAgdiA9IEFycmF5LmlzQXJyYXkoY2VsbCkgPyAoMC4yOTkgKiBjZWxsWzBdICsgMC41ODcgKiBjZWxsWzFdICsgMC4xMTQgKiBjZWxsWzJdKSA6IGNlbGw7XG4gICAgICB9XG4gICAgICBwb3NpdGlvbnMucHVzaCh0ICogbGVuRGF0YSk7XG4gICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcG9zaXRpb25zLCB2YWx1ZXMsIHVuaXQ6IHVzZU1pY3JvbnMgPyAnwrVtJyA6ICdweCcgfTtcbiAgfVxuXG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIChtaWNyb25zL3BpeGVsKSBmb3IgdGhlIGN1cnJlbnQgaW1hZ2UsIGlmIGtub3duLlxuICAgKiAgbXBwIGlzIGNvbnN0YW50IGFjcm9zcyBmcmFtZXMvY2hhbm5lbHMsIHNvIHRoZSBmaXJzdCBtZXRhZGF0YSBlbnRyeSB0aGF0XG4gICAqICBjYXJyaWVzIGEgcG9zaXRpdmUgbXBwWCB3aW5zLiBSZXR1cm5zIG51bGxzIHdoZW4gdGhlIGltYWdlIGlzIHVuc2NhbGVkLiAqL1xuICBwcml2YXRlIGN1cnJlbnRNcHAoKTogeyBtcHBYOiBudW1iZXIgfCBudWxsOyBtcHBZOiBudW1iZXIgfCBudWxsIH0ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmltYWdlSW5mbz8uaW1hZ2VNZXRhO1xuICAgIGNvbnN0IG0gPSBBcnJheS5pc0FycmF5KG1ldGEpXG4gICAgICA/IChtZXRhLmZpbmQoZSA9PiBlICYmIChlLm1wcFggPz8gMCkgPiAwKSA/PyBtZXRhWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbXBwWCA9IG0gJiYgKG0ubXBwWCA/PyAwKSA+IDAgPyAobS5tcHBYIGFzIG51bWJlcikgOiBudWxsO1xuICAgIGNvbnN0IG1wcFkgPSBtICYmIChtLm1wcFkgPz8gMCkgPiAwID8gKG0ubXBwWSBhcyBudW1iZXIpIDogbnVsbDtcbiAgICByZXR1cm4geyBtcHBYLCBtcHBZIH07XG4gIH1cblxuICAvKipcbiAgICogYXV0b3NjYWxlIHRoZSBwbG90XG4gICAqL1xuICBwdWJsaWMgYXV0b3NjYWxlKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gW107XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAgICd4YXhpcy5hdXRvcmFuZ2UnOiB0cnVlLFxuICAgICAgICAneWF4aXMuYXV0b3JhbmdlJzogZmFsc2UgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVsYXlvdXQgdGhlIHBsb3RcbiAgICovXG4gIHB1YmxpYyByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pIHtcbiAgICBsZXQgaW1nU2l6ZTtcbiAgICBpZiAodHJ1ZUltYWdlU2l6ZSkge1xuICAgICAgaW1nU2l6ZSA9IHRydWVJbWFnZVNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltZ1NpemUgPSB0aGlzLnRydWVJbWdTaXplO1xuICAgIH1cbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICAvLyBSZWZyZXNoIGhlaWdodCBmcm9tIGN1cnJlbnQgRE9NIHNvIHBhbmVsIHJlc2l6ZXMgYXJlIHJlZmxlY3RlZFxuICAgICAgY29uc3QgcGxvdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICAgIGlmIChwbG90RWw/Lm9mZnNldEhlaWdodCkge1xuICAgICAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHBsb3RFbC5vZmZzZXRIZWlnaHQ7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy56b29tQ29vcmRpbmF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHRoaXMuZ2V0SGVhdG1hcExheW91dChcbiAgICAgICAgICAgIFt0aGlzLnpvb21Db29yZGluYXRlc1swXSwgdGhpcy56b29tQ29vcmRpbmF0ZXNbMV1dLFxuICAgICAgICAgICAgW3RoaXMuem9vbUNvb3JkaW5hdGVzWzJdLCB0aGlzLnpvb21Db29yZGluYXRlc1szXV0pKTsgICAgLy8gcmV2ZXJzZSB0aGUgeSByYW5nZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFzIGF1dG9yYW5nZSBpcyBzZXQgdG8gZmFsc2UsIGFuZCBub3QgcmV2ZXJzZWQgd2UgbmVlZCB0byBzZXQgdGhlIHlyYW5nZSBjb3JyZWNseSBoZXJlXG4gICAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5nZXRIZWF0bWFwTGF5b3V0KFxuICAgICAgICAgICAgW2ltZ1NpemVbMF0sIGltZ1NpemVbMV1dLCBbaW1nU2l6ZVszXSwgaW1nU2l6ZVsyXV0pKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkJywgZXJyKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IFZJWl9BTEVSVF9UT0FTVF9LRVksIHN0aWNreTogdHJ1ZSwgc2V2ZXJpdHk6J2Vycm9yJywgc3VtbWFyeTonQW4gZXJyb3Igb2NjdXJlZCcsIGRldGFpbDpgVGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIG9jY3VyZWQ6ICR7bXNnfS4gUGxlYXNlIHRyeSB0byBvcGVuIHRoZSBpbWFnZSBhZ2FpbiB0aHJvdWdoIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbmF2aWdhdG9yLmAgfSk7XG4gICAgICAgIC8vIFRPRE8gY29ycmVjdGx5IGNsZWFyIHRoZSBwbG90XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEV2ZW50cyhwbG90RGl2OiBzdHJpbmcsIGlzR3JheXNjYWxlOiBib29sZWFuLCBzY3JlZW5IZWlnaHQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmltYWdlSW5mbykgdGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGUgPSBpc0dyYXlzY2FsZTtcbiAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHNjcmVlbkhlaWdodDtcbiAgICBjb25zdCBwbG90OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwbG90RGl2KTtcbiAgICBpZiAocGxvdCkge1xuICAgICAgLy8gdW5iaW5kIHByZXZpb3VzIGV2ZW50XG4gICAgICBwbG90LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Bsb3RseV9yZWxheW91dCcsIHRoaXMub25SZWxheW91dEV2ZW50KTtcbiAgICAgIC8vIGJpbmQgbmV3IGV2ZW50XG4gICAgICBwbG90Lm9uKCdwbG90bHlfcmVsYXlvdXQnLCB0aGlzLm9uUmVsYXlvdXRFdmVudCk7XG5cbiAgICAgIC8vIENsaWNraW5nIG9uIGEgc2hhcGUgYWN0aXZhdGVzIGl0IGJ1dCBQbG90bHkgZG9lc24ndCBmaXJlIGEgZGVkaWNhdGVkXG4gICAgICAvLyBldmVudCDigJQgc2FtcGxlIF9hY3RpdmVTaGFwZUluZGV4IG9uIHRoZSBuZXh0IG1pY3JvdGFzayBzbyBzdWJzY3JpYmVyc1xuICAgICAgLy8gKFJlZ2lvbiBFZGl0b3IpIGNhbiBtaXJyb3IgdGhlIHNlbGVjdGlvbi5cbiAgICAgIHBsb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vblBsb3RNb3VzZURvd24pO1xuICAgICAgdGhpcy5vblBsb3RNb3VzZURvd24gPSAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMubWF5YmVFbWl0QWN0aXZlU2hhcGVJbmRleCgpLCAwKTtcbiAgICAgIHBsb3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vblBsb3RNb3VzZURvd24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVsYXlvdXRFdmVudEhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgIGlmIChPYmplY3Qua2V5cyhldmVudCkuaW5jbHVkZXMoJ2RyYWdtb2RlJykpIHtcbiAgICAgIHRoaXMuZHJhZ01vZGUgPSBldmVudC5kcmFnbW9kZTtcbiAgICB9XG4gICAgLy8gd2hlbiByZWxheW91dCBldmVudCBvY2N1cnNcbiAgICAvLyB1cGRhdGUgdGhlIHJlZ2lvbiBzZWxlY3Rpb24gdWRwZGF0ZXNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnQpO1xuICAgIGxldCBzaGFwZXNNb2RpZmllZCA9IGZhbHNlO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5OiBhbnkpID0+IHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkuc3RhcnRzV2l0aCgnc2hhcGVzWycpKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlTnVtYmVyID0gK2tleS5zcGxpdCgnWycpWzFdLnNwbGl0KCddJylbMF07XG4gICAgICAgIGNvbnN0IHNoYXBlQ2hhbmdlID0ga2V5LnNwbGl0KCcuJylbMV07XG4gICAgICAgIGlmICh0aGlzLnNoYXBlcyAmJiB0aGlzLnNoYXBlc1tzaGFwZU51bWJlcl0pIHtcbiAgICAgICAgICBpZiAoc2hhcGVDaGFuZ2UgPT09ICdwYXRoJykge1xuICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGVOdW1iZXJdW3NoYXBlQ2hhbmdlXSA9IHRoaXMucGxvdFV0aWxpdGllcy5yb3VuZFBhdGhDb29yZGluYXRlcyhldmVudFtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGVOdW1iZXJdW3NoYXBlQ2hhbmdlXSA9IE1hdGgucm91bmQoK2V2ZW50W2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGFwZXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoc2hhcGVzTW9kaWZpZWQpIHtcbiAgICAgIC8vIE1pcnJvciB0aGUgaW4tcGxhY2UgZWRpdCBpbnRvIHRoZSBzaGFyZWQgc3RvcmUgKHN5bmNzIGl0cyBjYWNoZSArIGVtaXRzKS5cbiAgICAgIHRoaXMuY29tbWl0U2hhcGVzVG9TdG9yZSgpO1xuICAgIH1cbiAgICAvLyBtYW5hZ2UgaGlnaCBkZWYgem9vbSAobm90IGlmIHdlIGFyZSBzaG93aW5nIGEgc3RhY2spXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSA0ICYmIHRoaXMuaXNSZWFsWm9vbSkge1xuICAgICAgY29uc3QgY29vcmRpbmF0ZXM6IGFueVtdID0gW107XG4gICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCd4YXhpcy5yYW5nZVsnKSkge1xuICAgICAgICAgIGNvb3JkaW5hdGVzLnB1c2goZXZlbnRba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCd5YXhpcy5yYW5nZVsnKSkge1xuICAgICAgICAgIGNvb3JkaW5hdGVzLnB1c2goZXZlbnRba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcztcbiAgICAgIGlmICghdGhpcy5pbWFnZUluZm8/LnNob3dTdGFjaykge1xuICAgICAgICB0aGlzLnRyaWdnZXJab29tKGNvb3JkaW5hdGVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2hlbiBzaGFwZSBpcyBjcmVhdGVkXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmICdzaGFwZXMnIGluIGV2ZW50KSB7XG4gICAgICB0aGlzLnNoYXBlcyA9IGV2ZW50LnNoYXBlcyBhcyBhbnlbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaGFwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQSBmcmVzaGx5IFBsb3RseS1kcmF3biBzaGFwZSBoYXMgbm8gaWQgeWV0IOKAlCBnaXZlIGl0IGEgbGFiZWwgb2JqZWN0XG4gICAgICAgIC8vICh3aGVuIGxhYmVscyBhcmUgb24pIGJlZm9yZSB0aGUgc3RvcmUgbWludHMgaWQgKyBkZWZhdWx0IG5hbWUuXG4gICAgICAgIGNvbnN0IGlzTmV3ID0gdGhpcy5zaGFwZXNbaV0uaWQgPT0gbnVsbDtcbiAgICAgICAgdGhpcy5zaGFwZXNbaV0uZmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgICAgICB0aGlzLnNoYXBlc1tpXSA9IHRoaXMucGxvdFV0aWxpdGllcy5zbmFwUmVnaW9uKHRoaXMuc2hhcGVzW2ldKTtcbiAgICAgICAgaWYgKGlzTmV3ICYmIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSkge1xuICAgICAgICAgIHRoaXMuc2hhcGVzW2ldLmxhYmVsID0geyB0ZXh0OiB0aGlzLnNoYXBlc1tpXS5sYWJlbCxcbiAgICAgICAgICAgIHRleHR0ZW1wbGF0ZTogdGhpcy5zaGFwZXNbaV0ubGFiZWwsXG4gICAgICAgICAgICBmb250OiB7IGNvbG9yOiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSB9LFxuICAgICAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWludCBpZHMvbmFtZXMgaW4gdGhlIHN0b3JlLCB3cml0ZSB0aGVtIGJhY2sgb250byB0aGUgZGljdHMsIGFuZCBlbWl0LlxuICAgICAgdGhpcy5jb21taXRTaGFwZXNUb1N0b3JlKCk7XG4gICAgICBpZiAodGhpcy5pc1JlZ2lvblNhdmVkT24pIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGlmIGF1dG9zY2FsZVxuICAgIGlmIChrZXlzLmluY2x1ZGVzKCd4YXhpcy5hdXRvcmFuZ2UnKSAmJiBrZXlzLmluY2x1ZGVzKCd5YXhpcy5hdXRvcmFuZ2UnKSkge1xuICAgICAgLy8gdHJpZ2dlciBhbiBhdXRvc2NhbGUgZXZlbnQgdG8gcmVzZXQgdGhlIHNlbGVjdGVkIGltYWdlIG1vZGUgZHJvcGRvd25cbiAgICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQubmV4dCgnYW4gYXV0b3NjYWxlIGhhcyBoYXBwZW5lZCcpO1xuICAgICAgLy8gc2VsZWN0IGRpc3BsYXkgdHlwZSB0byB0cmlnZ2VyIGEgbmV3IHBsb3R0aW5nIHVwZGF0ZSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHBsb3R0aW5nIHBhcmFtZXRlcnMgc2V0XG4gICAgICB0aGlzLnRpbGVzLnNlbGVjdERpYWdyYW1EaXNwbGF5KCk7XG4gICAgfVxuICAgIC8vIGlmIHNob3dzdGFjayBvciBhc3BlY3RyYXRpbyBldmVudFxuICAgIGlmIChldmVudC5zaG93c3RhY2sgIT09IHVuZGVmaW5lZCB8fCBldmVudC5hc3BlY3RyYXRpbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTZXQgbmV3IGltYWdlIGluZm8gdG8gdHJpZ2dlciBhIHBsb3QgdXBkYXRlXG4gICAgICB0aGlzLnNldEltYWdlSW5mbyhldmVudC5zaG93c3RhY2ssIGV2ZW50LmFzcGVjdHJhdGlvKTtcbiAgICB9XG5cbiAgICAvLyBQbG90bHkgbWF5IGhhdmUgdXBkYXRlZCB0aGUgYWN0aXZlIHNoYXBlIGluZGV4IGFzIHBhcnQgb2YgdGhlIHJlbGF5b3V0XG4gICAgLy8gKGUuZy4gY2xpY2tpbmcgYSBzaGFwZSdzIGVkaXQgaGFuZGxlLCBvciBmaW5pc2hpbmcgYSBkcmF3KSDigJQgc3VyZmFjZVxuICAgIC8vIHRoYXQgY2hhbmdlIHRvIHRoZSBSZWdpb24gRWRpdG9yLlxuICAgIHRoaXMubWF5YmVFbWl0QWN0aXZlU2hhcGVJbmRleCgpO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZEFuZFBsb3QoKSB7XG4gICAgdGhpcy5zZXRJbWFnZUluZm8oKTtcbiAgfVxuXG5cbiAgLy8g4pSA4pSAIFRvb2wgZGVsZWdhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHVibGljIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9uczogV2FuZE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFJlLWJpbmQgdG8gb3Vyc2VsdmVzIGluIGNhc2UgdGhlIE9TRCBiYWNrZW5kIGxhc3QgdXNlZCB0aGVzZSBzaW5nbGV0b25zLlxuICAgIGlmIChhY3RpdmUpIHRoaXMud2FuZFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogV2FuZE9wdGlvbnMpIHtcbiAgICB0aGlzLndhbmRUb29sLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCkge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zOiBCcnVzaE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFJlLWJpbmQgdG8gb3Vyc2VsdmVzIGluIGNhc2UgdGhlIE9TRCBiYWNrZW5kIGxhc3QgdXNlZCB0aGlzIHNpbmdsZXRvbi5cbiAgICBpZiAoYWN0aXZlKSB0aGlzLmJydXNoVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IEJydXNoT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNpemUgIT0gbnVsbCkgdGhpcy5icnVzaFRvb2wuc2V0U2l6ZShvcHRpb25zLnNpemUpO1xuICB9XG5cbiAgcHVibGljIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpIHtcbiAgICB0aGlzLnZlcnRleEVyYXNlclRvb2wuc2V0UmFkaXVzKHJhZGl1cyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAvLyBUaGUgem9vbS10by1ib3ggdG9vbCBpcyBhIHJvb3Qgc2luZ2xldG9uIHNoYXJlZCB3aXRoIHRoZSBPU0QgYmFja2VuZCxcbiAgICAvLyB3aGljaCByZWJpbmRzIGl0IHRvIGl0cyBvd24gaG9zdCBvbiBhY3RpdmF0aW9uLiBSZWJpbmQgdG8gb3VycyB3aGVuIHdlXG4gICAgLy8gYWN0aXZhdGUgc28gYSBwcmlvciBPU0Qgem9vbS10by1ib3ggZG9lc24ndCBsZWF2ZSB0aGUgc2luZ2xldG9uIHBvaW50aW5nXG4gICAgLy8gYXQgT1NEJ3MgY29vcmRpbmF0ZS96b29tIGhhbmRsZXJzICh3aGljaCB3b3VsZCBicmVhayBib3gtem9vbSBvbiBoZWF0bWFwcykuXG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5iaW5kWm9vbVRvQm94SG9zdCgpO1xuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cblxuICAvKiogQmluZCB0aGUgc2hhcmVkIHpvb20tdG8tYm94IHRvb2wgdG8gdGhpcyAoUGxvdGx5KSBiYWNrZW5kJ3MgaG9zdC4gKi9cbiAgcHJpdmF0ZSBiaW5kWm9vbVRvQm94SG9zdCgpIHtcbiAgICB0aGlzLnpvb21Ub0JveFRvb2wuYmluZEhvc3Qoe1xuICAgICAgZ2V0UGxvdERpdjogKCkgPT4gdGhpcy5wbG90RGl2LFxuICAgICAgcGl4ZWxUb0RhdGE6IChweCwgcHkpID0+IHRoaXMuem9vbUJveFBpeGVsVG9EYXRhKHB4LCBweSksXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU06IHNlZ21lbnQgdGhlIGRyYXduIHJlY3RhbmdsZXMuIFRoZSBTQU0gdG9vbCByZXVzZXMgdGhlXG4gICAqICB3YW5kIGhvc3QgKGNhY2hlZCBmcmFtZSArIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgcmVnaW9uIHN0b3JlKS4gKi9cbiAgcHVibGljIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgcHVibGljIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtcbiAgICB0aGlzLmNlbGxTZWdtZW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5jZWxsU2VnbWVudFRvb2wuc2VnbWVudEJveGVzKHRoaXMuY2VsbFNlZ21lbnRlcik7XG4gIH1cbiAgcHVibGljIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvb2wuc2V0TW9kZWwoaWQpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGVsKGlkKTtcbiAgfVxuICBwdWJsaWMgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHRoaXMuc2FtUG9pbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBwdWJsaWMgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jb21taXQoKTsgfVxuICBwdWJsaWMgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNsZWFyKCk7IH1cblxuICAvKipcbiAgICogVG9vbC1ob3N0IGNhbGxiYWNrOiBhcHBseSB0aGUgem9vbS10by1ib3ggc2VsZWN0aW9uLiBTdGFjayBtb2RlIGRvZXMgYVxuICAgKiBwdXJlIGF4aXMtcmFuZ2UgcmVsYXlvdXQ7IG5vbi1zdGFjayBtb2RlIGdvZXMgdGhyb3VnaCB0aGUgaGlnaC1kZWZcbiAgICogdHJpZ2dlclpvb20gcGlwZWxpbmUgc28gdGhlIGltYWdlIGlzIHJlLWZldGNoZWQgYXQgdGhlIG5ldyByZXNvbHV0aW9uLlxuICAgKi9cbiAgLyoqIE92ZXJsYXktcGl4ZWwgLT4gUGxvdGx5IGRhdGEgY29vcmRzIHZpYSB0aGUgYXhpcyBvYmplY3RzIChzdWJ0cmFjdGluZyB0aGVcbiAgICogIHBsb3QgbWFyZ2luIG9mZnNldCkuIFRoZSB6b29tLXRvLWJveCB0b29sIGNhbGxzIHRoaXMgdGhyb3VnaCBpdHMgaG9zdC4gKi9cbiAgcHJpdmF0ZSB6b29tQm94UGl4ZWxUb0RhdGEocHg6IG51bWJlciwgcHk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgY29uc3QgeGF4aXMgPSBnZC5fZnVsbExheW91dC54YXhpcztcbiAgICBjb25zdCB5YXhpcyA9IGdkLl9mdWxsTGF5b3V0LnlheGlzO1xuICAgIHJldHVybiB7IHg6IHhheGlzLnAyZChweCAtIHhheGlzLl9vZmZzZXQpLCB5OiB5YXhpcy5wMmQocHkgLSB5YXhpcy5fb2Zmc2V0KSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pIHtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuICAgIGlmICh0aGlzLmltYWdlSW5mbz8uc2hvd1N0YWNrKSB7XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAgICd4YXhpcy5yYW5nZVswXSc6IGNvb3JkaW5hdGVzWzBdLFxuICAgICAgICAneGF4aXMucmFuZ2VbMV0nOiBjb29yZGluYXRlc1sxXSxcbiAgICAgICAgJ3lheGlzLnJhbmdlWzBdJzogY29vcmRpbmF0ZXNbMl0sXG4gICAgICAgICd5YXhpcy5yYW5nZVsxXSc6IGNvb3JkaW5hdGVzWzNdLFxuICAgICAgfSBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyaWdnZXJab29tKGNvb3JkaW5hdGVzKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgSVZpZXdwb3J0SG9zdCBpbXBsZW1lbnRhdGlvbiAoZm9yIHRoZSBvbi1jYW52YXMgdG9vbHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgcGxvdCBlbGVtZW50IHRoZSB0b29sIGNhbnZhcyBvdmVybGF5cyBhdHRhY2ggdG8uICovXG4gIHB1YmxpYyBnZXRPdmVybGF5Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICB9XG5cbiAgLyoqIFBsb3RseSBjb29yZGluYXRlIHRyYW5zZm9ybSAoc2NyZWVuIDwtPiBkYXRhIHZpYSB0aGUgYXhpcyBvYmplY3RzKS4gKi9cbiAgcHVibGljIGdldENvb3JkaW5hdGVUcmFuc2Zvcm0oKTogSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVUcmFuc2Zvcm07XG4gIH1cblxuICAvLyDilIDilIAgV2FuZFRvb2xIb3N0IGltcGxlbWVudGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBQaXhlbCBkYXRhIHRoZSB3YW5kIG5lZWRzIGZvciBzYW1wbGluZy4gbnVsbCA9IG5vIGltYWdlIGxvYWRlZC4gKi9cbiAgcHJpdmF0ZSBnZXRDYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzIHx8IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgZnJhbWVzOiB0aGlzLmNhY2hlZEltYWdlRnJhbWVzLFxuICAgICAgd2lkdGg6IHRoaXMuY2FjaGVkSW1hZ2VXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jYWNoZWRJbWFnZUhlaWdodCxcbiAgICAgIHJhdGlvczogdGhpcy5jYWNoZWRJbWFnZVJhdGlvcyxcbiAgICAgIGlzR3JheXNjYWxlOiB0aGlzLmNhY2hlZElzR3JheXNjYWxlLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIAgc2hhcmVkLXN0b3JlIHN5bmMgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gYHRoaXMuc2hhcGVzYCBpcyBQbG90bHkncyBvd24gcmVwcmVzZW50YXRpb24gKHRoZSBkaWN0IGFycmF5IFBsb3RseS5yZWxheW91dFxuICAvLyBjb25zdW1lcykuIFRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgsIGhvbGRpbmcgdGhlXG4gIC8vIG5ldXRyYWwgUmVnaW9uIG1vZGVsLiBUaGVzZSBoZWxwZXJzIGJyaWRnZSB0aGUgdHdvOiB3cml0ZXMgbWlycm9yXG4gIC8vIGB0aGlzLnNoYXBlc2AgSU5UTyB0aGUgc3RvcmU7IGltYWdlIHN3aXRjaGVzL2V4dGVybmFsIGNoYW5nZXMgcHJvamVjdCB0aGVcbiAgLy8gc3RvcmUgYmFjayBPVVQgdG8gYHRoaXMuc2hhcGVzYC5cblxuICAvKiogQnVpbGQgUGxvdGx5IHNoYXBlIGRpY3RzIGZyb20gdGhlIHN0b3JlJ3MgcmVnaW9ucyAodGhlIHJlbmRlciBwcm9qZWN0aW9uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25zVG9TaGFwZURpY3RzKCk6IGFueVtdIHtcbiAgICBjb25zdCBzaG93TGFiZWwgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCk7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLm1hcChyID0+IHtcbiAgICAgIHIuZmlsZW5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgICAgcmV0dXJuIHsgLi4uci5nZXRTaGFwZShzaG93TGFiZWwpIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgZGljdCB3b3JraW5nLXNldCBmcm9tIHRoZSBzdG9yZSAoYWZ0ZXIgYW4gaW1hZ2Ugc3dpdGNoLCBvciB3aGVuXG4gICAqICByZWdpb25zIGNoYW5nZWQgd2hpbGUgYW5vdGhlciBiYWNrZW5kIHdhcyByZW5kZXJpbmcpLiAqL1xuICBwcml2YXRlIHN5bmNTaGFwZXNGcm9tU3RvcmUoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFwZXMgPSB0aGlzLnJlZ2lvbnNUb1NoYXBlRGljdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSBzaGFyZWQgc3RvcmUgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlIGN1cnJlbnQgZGljdCB3b3JraW5nLXNldDogY29udmVydFxuICAgKiBgdGhpcy5zaGFwZXNgIHRvIG5ldXRyYWwgcmVnaW9ucyBhbmQgcmVwbGFjZSB0aGUgc3RvcmUncyBsaXN0ICh0aGUgc3RvcmVcbiAgICogbWludHMgaWRzLCBhcHBsaWVzIGNsYXNzIGNvbG91cnMsIHN5bmNzIGl0cyBwZXItaW1hZ2UgY2FjaGUgYW5kIGVtaXRzIHRoZVxuICAgKiByZWdpb24tdXBkYXRlIGV2ZW50KS4gU3RvcmUtbWludGVkIGlkcyBhcmUgd3JpdHRlbiBiYWNrIG9udG8gdGhlIGRpY3RzIHNvIHRoZVxuICAgKiB0d28gcmVwcmVzZW50YXRpb25zIHN0YXkgYWxpZ25lZC4gUHJvZmlsZS1saW5lIFJPSXMgYXJlIG9yZGluYXJ5IHJlZ2lvbnNcbiAgICogKHRhZ2dlZCBga2luZDogJ3Byb2ZpbGUnYCkgYW5kIHJvdW5kLXRyaXAgdGhyb3VnaCBoZXJlIHRvby5cbiAgICovXG4gIHByaXZhdGUgY29tbWl0U2hhcGVzVG9TdG9yZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZWdpb25zID0gdGhpcy5zaGFwZXNcbiAgICAgIC5tYXAocyA9PiBPYmplY3QuYXNzaWduKG5ldyBTaGFwZVNlbGVjdGlvbigpLCBzKS5nZXRSZWdpb24oKSk7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSwgdHJ1ZSxcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCksIGZhbHNlKTtcbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hhcGVzLmxlbmd0aCAmJiBpIDwgc3RvcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5zaGFwZXNbaV0uaWQgPT0gbnVsbCkgdGhpcy5zaGFwZXNbaV0uaWQgPSBzdG9yZWRbaV0uaWQ7XG4gICAgICBpZiAodGhpcy5zaGFwZXNbaV0ubmFtZSA9PSBudWxsKSB0aGlzLnNoYXBlc1tpXS5uYW1lID0gc3RvcmVkW2ldLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1c2ggdGhlIGN1cnJlbnQgYHRoaXMuc2hhcGVzYCB0byBQbG90bHksIG1pcnJvciB0aGVtIGludG8gdGhlIHNoYXJlZCBzdG9yZVxuICAgKiAod2hpY2ggc3luY3MgaXRzIGNhY2hlICsgZW1pdHMgdGhlIHJlZ2lvbi11cGRhdGUgZXZlbnQpLCBhbmQgcmVmcmVzaCB0aGVcbiAgICogbG9jYWwgcHJldmlvdXMtc2hhcGVzIGJ1ZmZlci4gVGhlIHdhbmQvZXJhc2VyIHRvb2xzIGNhbGwgdGhpcyBhZnRlciBtdXRhdGluZ1xuICAgKiB0aGUgc2hhcGVzIGFycmF5IGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIGFwcGx5U2hhcGVzQ2hhbmdlKCkge1xuICAgIGlmICh0aGlzLmlzUmVnaW9uU2F2ZWRPbikge1xuICAgICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gICAgfVxuICAgIHRoaXMuY29tbWl0U2hhcGVzVG9TdG9yZSgpO1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIGNvbnN0IGRpY3RBcnJheSA9IHRoaXMuc2hhcGVzLm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5zaGFwZXNSZWxheW91dChkaWN0QXJyYXkpIGFzIGFueSk7XG4gICAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSDigJQgaXRzIG92ZXJsYXkgcmVuZGVycyBzaGFwZXMgKi8gfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBBY3RpdmUgZnJhbWUgaW5kZXggaW4gdGhlIGNhY2hlZCBpbWFnZSBzdGFjay4gKi9cbiAgcHJpdmF0ZSBhY3RpdmVGcmFtZUluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzIHx8IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMubGVuZ3RoIDw9IDEpIHJldHVybiAwO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGNvbnN0IHNsaWRlckFjdGl2ZSA9IGdkPy5fZnVsbExheW91dD8uc2xpZGVycz8uWzBdPy5hY3RpdmU7XG4gICAgaWYgKHR5cGVvZiBzbGlkZXJBY3RpdmUgPT09ICdudW1iZXInKSByZXR1cm4gc2xpZGVyQWN0aXZlO1xuICAgIHJldHVybiB0aGlzLnpJbmRleC52YWx1ZSB8fCAwO1xuICB9XG5cbiAgLyoqIENhcGFiaWxpdHktZ2F0ZWQgM0Qgc2NlbmUgY29udHJvbHMgKFBsb3RseSByZW5kZXJzIHRoZSAzRCBwbG90IHR5cGVzKS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFN1cmZhY2VEcmFnTW9kZTogKG1vZGU6IHN0cmluZykgPT4gdGhpcy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSksXG4gICAgICByZXNldFN1cmZhY2VDYW1lcmE6ICgpID0+IHRoaXMucmVzZXRTdXJmYWNlQ2FtZXJhKCksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyAnc2NlbmUuZHJhZ21vZGUnOiBtb2RlIH0gYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXRTdXJmYWNlQ2FtZXJhKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgJ3NjZW5lLmNhbWVyYSc6IHt9IH0gYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJab29tKGNvb3JkaW5hdGVzOiBudW1iZXJbXSkge1xuICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPT09IDAgfHwgIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybjtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0UmVjdGFuZ2xlKGNvb3JkaW5hdGVzLCB0aGlzLnRydWVJbWdTaXplKTtcbiAgICBpZiAodGhpcy5wbG90VXRpbGl0aWVzLmlzWm9vbVNhbWVBc0ltZ1NpemUocmVjdCwgdGhpcy50cnVlSW1nU2l6ZSkpIHtcbiAgICAgIHRoaXMuYXV0b3NjYWxlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgYnJpZWYgXCJDYWNoaW5nIGltYWdlLi4uXCIgbWVzc2FnZSBmb3IgdW5jYWNoZWQgZmlsZXMgKGxhcmdlIGZpbGVzIHRha2UgYVxuICAgIC8vIG1vbWVudCB0byBjYWNoZSk7IGp1c3QgYSBzcGlubmVyIG90aGVyd2lzZS5cbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZ01lc3NhZ2UodGhpcy5pbWFnZUNhY2hlZCA/ICcnIDogJ0NhY2hpbmcgaW1hZ2UuLi4nKTtcbiAgICBjb25zdCBzY3JlZW4gPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0RG9tUmVjdGFuZ2xlKCdkaWFncmFtJyk7XG4gICAgY29uc3QgaW1hZ2VTaXplOiBhbnlbXSA9IFtdO1xuICAgIGltYWdlU2l6ZVswXSA9IHJlY3QueDtcbiAgICBpbWFnZVNpemVbMV0gPSByZWN0LnggKyByZWN0LndpZHRoO1xuICAgIGltYWdlU2l6ZVsyXSA9IHJlY3QueTtcbiAgICBpbWFnZVNpemVbM10gPSByZWN0LnkgKyByZWN0LmhlaWdodDtcbiAgICAvLyBTbmFwc2hvdCB0aGUgZmlsZW5hbWUgc28gYSByZXNwb25zZSB0aGF0IGFycml2ZXMgYWZ0ZXIgdGhlIHVzZXIgc3dpdGNoZWRcbiAgICAvLyBmaWxlcyBpcyBkcm9wcGVkICh0aGUgcmVxdWVzdCBjYXJyaWVkIHRoZSBmaWxlIHNlbGVjdGVkIGF0IGNhbGwgdGltZSkuXG4gICAgY29uc3QgcmVxTmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5zdGF0ZS5zZXRab29tKHRydWUpO1xuICAgIHRoaXMudGlsZXMuem9vbU9uUmVnaW9uKHJlY3QsIHNjcmVlbiwgdGhpcy56SW5kZXgudmFsdWUpLnN1YnNjcmliZSh7IG5leHQ6IHpvb21EYXRhID0+IHtcbiAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSh6b29tRGF0YSk7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh1aW50OEFycmF5KTtcbiAgICAgIEltYWdlLmxvYWQoYnVmZmVyKS50aGVuKChpbWFnZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHhSYXRpbyA9IHJlY3Qud2lkdGggLyBpbWFnZS53aWR0aDtcbiAgICAgICAgY29uc3QgeVJhdGlvID0gcmVjdC5oZWlnaHQgLyBpbWFnZS5oZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmZpbGVOYW1lID09PSByZXFOYW1lKSB7XG4gICAgICAgICAgY29uc3QgaXNHcmF5ID0gdGhpcy5pbWFnZUluZm8/LmlzR3JheXNjYWxlO1xuICAgICAgICAgIGNvbnN0IGZyYW1lID0gaXNHcmF5XG4gICAgICAgICAgICA/IHRoaXMucGxvdFV0aWxpdGllcy5hcnJheVRvTWF0cml4KGltYWdlLmdyZXkoKS5kYXRhLCBpbWFnZS53aWR0aClcbiAgICAgICAgICAgIDogdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgoaW1hZ2UuZ2V0UGl4ZWxzQXJyYXkoKSwgaW1hZ2Uud2lkdGgpO1xuICAgICAgICAgIC8vIEFsc28gc2FtcGxlIHRoZSBpbnRlbnNpdHkgcHJvZmlsZXMgZnJvbSB0aGlzIGhpZ2gtZGVmIGNyb3Agc28gdGhlXG4gICAgICAgICAgLy8gaW5zZXQgcmVmbGVjdHMgdGhlIHpvb20tbGV2ZWwgcmVzb2x1dGlvbiAob3JpZ2luID0gY3JvcCB0b3AtbGVmdCkuXG4gICAgICAgICAgdGhpcy5zZXRTYW1wbGluZ0ZyYW1lcyhbZnJhbWVdLCBbeFJhdGlvLCB5UmF0aW9dLCBbaW1hZ2VTaXplWzBdLCBpbWFnZVNpemVbMl1dKTtcbiAgICAgICAgICB0aGlzLmVtaXRQcm9maWxlcygpO1xuICAgICAgICAgIC8vIFJlLXJlbmRlciB0aGUgaGlnaC1kZWYgY3JvcCBpbiB0aGUgU0FNRSBwbG90IHR5cGUgdGhlIHVzZXIgaXNcbiAgICAgICAgICAvLyB2aWV3aW5nLiBXaXRob3V0IHRoaXMgdGhlIHpvb20gcmUtZmV0Y2ggYWx3YXlzIGZlbGwgYmFjayB0byBhXG4gICAgICAgICAgLy8gaGVhdG1hcCwgc28gem9vbWluZyBpbiBjb250b3VyIChvciBhbnkgcmVnaXN0cnkgdHlwZSkgcmV2ZXJ0ZWRcbiAgICAgICAgICAvLyB0byBoZWF0bWFwLlxuICAgICAgICAgIGNvbnN0IGltcGwgPSBQTE9UTFlfUExPVF9UWVBFX0lNUExTW3RoaXMucGxvdFR5cGVdO1xuICAgICAgICAgIGNvbnN0IHJlbmRlclByb21pc2UgPSBpbXBsXG4gICAgICAgICAgICA/IHRoaXMucGxvdFZpYVJlZ2lzdHJ5KHRoaXMucGxvdERpdiwgaW1wbCxcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkVHJhY2VJbnB1dCh0aGlzLmltYWdlSW5mbywge1xuICAgICAgICAgICAgICAgICAgZGF0YTogW2ZyYW1lXSwgcmF0aW9zOiBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICAgICAgICAgICAgc2l6ZXM6IFtpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0XSwgZmlsZW5hbWU6IHJlcU5hbWUsXG4gICAgICAgICAgICAgICAgfSwgaW1hZ2VTaXplKSwgdGhpcy5zY3JlZW5IZWlnaHQpXG4gICAgICAgICAgICA6IChpc0dyYXlcbiAgICAgICAgICAgICAgICA/IHRoaXMucGxvdEhlYXRtYXAodGhpcy5wbG90RGl2LCB0aGlzLnVybHMsIFtmcmFtZV0sIGltYWdlU2l6ZSwgW3hSYXRpbywgeVJhdGlvXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JlZW5IZWlnaHQpXG4gICAgICAgICAgICAgICAgOiB0aGlzLnBsb3RSR0JIZWF0bWFwKHRoaXMucGxvdERpdiwgdGhpcy51cmxzLCBbZnJhbWVdLCBpbWFnZVNpemUsIFt4UmF0aW8sIHlSYXRpb10sXG4gICAgICAgICAgICAgICAgICAgIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIHRoaXMuc2NyZWVuSGVpZ2h0KSk7XG4gICAgICAgICAgLy8gcGxvdFZpYVJlZ2lzdHJ5IGFscmVhZHkgYXBwbGllcyB0aGUgdHlwZSdzIG93biBsYXlvdXQvcmFuZ2UgZm9yXG4gICAgICAgICAgLy8gbm9uLWltYWdlIGxheW91dHMgKGNoYXJ0L292ZXJsYXkpOyBvbmx5IHJlLWFwcGx5IHRoZSBoZWF0bWFwXG4gICAgICAgICAgLy8gcmFuZ2UgZm9yIHRoZSBpbWFnZS1hbGlnbmVkIHBhdGhzLlxuICAgICAgICAgIGNvbnN0IHJlYXBwbHlSYW5nZSA9ICFpbXBsIHx8IGltcGwubGF5b3V0S2luZCA9PT0gJzJkLWltYWdlJztcbiAgICAgICAgICByZW5kZXJQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUNhY2hlZCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIGltYWdlID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChyZWFwcGx5UmFuZ2UpIHRoaXMucmVsYXlvdXQoaW1hZ2VTaXplKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgZXJyb3I6IGVyciA9PiB7XG4gICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCBlcnI/LnN0YXR1c1RleHQgfHwgU3RyaW5nKGVycik7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkIHdoZW4gem9vbWluZycsIGVycik7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IGtleTogVklaX0FMRVJUX1RPQVNUX0tFWSwgc3RpY2t5OiB0cnVlLCBzZXZlcml0eTonZXJyb3InLCBzdW1tYXJ5OidBbiBlcnJvciBvY2N1cmVkJyxcbiAgICAgICAgZGV0YWlsOmBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VyZWQgd2hpbGUgem9vbWluZzogJHttc2d9LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgdHJ5IHRvIG9wZW4gdGhlIGltYWdlIGFnYWluIHRocm91Z2ggdGhlIGZpbGUgbmF2aWdhdG9yIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tIG9uIHRoZSBzZWxlY3RlZCBhcmVhIG9uY2UgbW9yZS5gIH0pO1xuICAgICAgdGhpcy5zdGF0ZS5zZXRMb2FkaW5nRXJyb3IodHJ1ZSk7XG4gICAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyhmYWxzZSk7XG4gICAgfSwgY29tcGxldGU6ICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCd6b29taW5nIGNvbXBsZXRlJyk7XG4gICAgfSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQbG90VHlwZShwbG90VHlwZTogUGxvdFR5cGUpIHtcbiAgICB0aGlzLnBsb3RUeXBlID0gcGxvdFR5cGU7XG4gIH1cblxuICBwcml2YXRlIHNldEltYWdlSW5mbyhzaG93U3RhY2s/OiBib29sZWFuLCBzY2FsZXJhdGlvPzogYm9vbGVhbikge1xuICAgIC8vIEJ1aWxkIGEgcGFydGlhbCBpbWFnZSBkZXNjcmlwdG9yIGFuZCBwdXNoIGl0IHRvIHRoZSBob3N0IHZpYSB0aGUgcG9ydC5cbiAgICBjb25zdCBpbWdJbmZvOiBQYXJ0aWFsPElJbWFnZUluZm8+ID0ge1xuICAgICAgaXNHcmF5c2NhbGU6IHRoaXMuaW1hZ2VJbmZvPy5pc0dyYXlzY2FsZSxcbiAgICAgIHRydWVJbWFnZVNpemU6IFt0aGlzLnRydWVJbWdTaXplWzFdLCB0aGlzLnRydWVJbWdTaXplWzNdXSxcbiAgICAgIHVybHM6IHRoaXMudXJscyxcbiAgICAgIGlzU3RhY2s6IHRoaXMudXJscy5sZW5ndGggPiAxLFxuICAgICAgc2NhbGVSYXRpbzogc2NhbGVyYXRpbyAhPT0gdW5kZWZpbmVkID8gc2NhbGVyYXRpbyA6IHRoaXMuc2NhbGVyYXRpbyxcbiAgICB9O1xuICAgIGlmIChzaG93U3RhY2sgIT09IHVuZGVmaW5lZCkgaW1nSW5mby5zaG93U3RhY2sgPSBzaG93U3RhY2s7XG4gICAgaWYgKHRoaXMuZmlsZU5hbWUpIGltZ0luZm8uZmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VJbmZvKGltZ0luZm8pO1xuICB9XG5cbiAgcHVibGljIGdldFNoYXBlcygpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFwZXM7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWV3b3JrLW5ldXRyYWwgdmlldyBvZiB0aGUgY3VycmVudCByZWdpb25zIOKAlCBkZWxlZ2F0ZXMgdG8gdGhlIHNoYXJlZFxuICAgKiBSZWdpb25TdG9yZSAodGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpLiBUaGUgY2Fub25pY2FsIGFjY2Vzc29yIG9uIHRoZVxuICAgKiBgSVZpc3VhbGl6ZXJgIGNvbnRyYWN0OyBjb25zdW1lcnMgc2hvdWxkIHByZWZlciB0aGlzIG92ZXIgYGdldFNoYXBlcygpYFxuICAgKiAod2hpY2ggZXhwb3NlcyBQbG90bHktc2hhcGVkIGRpY3RzKS5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgaW1hZ2UuIFRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgb3ducyB0aGUgcGVyLWltYWdlIHJlZ2lvblxuICAgKiBjYWNoZSAoc25hcHNob3Qgb3V0Z29pbmcgLyByZXN0b3JlIGluY29taW5nIC8gY2xlYXIgc2VsZWN0aW9uIC8gZW1pdCk7IHdlXG4gICAqIGRlbGVnYXRlIHRvIGl0LCB0aGVuIHJlLXByb2plY3QgdGhlIHN0b3JlJ3MgcmVnaW9ucyBpbnRvIFBsb3RseSdzIGRpY3RcbiAgICogd29ya2luZy1zZXQuIFJlLXByb2plY3RpbmcgdW5jb25kaXRpb25hbGx5IChldmVuIHdoZW4gdGhlIHN0b3JlIG5vLW9wcyBmb3JcbiAgICogdGhlIHNhbWUgaW1hZ2UpIG1lYW5zIFBsb3RseSBhbHNvIHBpY2tzIHVwIHJlZ2lvbnMgYW5vdGhlciBiYWNrZW5kIChPU0QpXG4gICAqIGFkZGVkIHdoaWxlIGl0IHdhcyBvZmYtc2NyZWVuLiBDYWxsZWQgZnJvbSBgcGxvdCgpYCBhbmQgZnJvbSB0aGUgcm91dGVyXG4gICAqIGJlZm9yZSBhbnkgYmFja2VuZCByZW5kZXJzLlxuICAgKi9cbiAgcHVibGljIHNldEFjdGl2ZUltYWdlKGltYWdlSW5mbzogSUltYWdlSW5mbykge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvKTtcbiAgICB0aGlzLnN5bmNTaGFwZXNGcm9tU3RvcmUoKTtcbiAgICB0aGlzLnByZXZpb3VzU2hhcGVzID0gdGhpcy5zaGFwZXMuc2xpY2UoKTtcbiAgfVxuXG4gIC8qKiBUZXN0L2RldiBob29rIOKAlCBkcm9wIHRoZSBlbnRpcmUgcGVyLWltYWdlIGNhY2hlIChsb2dvdXQgLyBwcm9qZWN0IHN3aXRjaCkuICovXG4gIHB1YmxpYyBjbGVhclJlZ2lvbnNCeUltYWdlS2V5KCkge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuY2xlYXJSZWdpb25zQnlJbWFnZUtleSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIHNlbGVjdGVkIHJlZ2lvbnMgYXMgcG9seWdvbnMuIE9wZW4gcG9seWxpbmVzIChjbG9zZWQgPT09IGZhbHNlKVxuICAgKiBhcmUgZXhjbHVkZWQg4oCUIHRoZXkncmUgYW5ub3RhdGlvbi1vbmx5IGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBmaWxsZWQgcmVnaW9uc1xuICAgKiBmb3IgaW1hZ2UgcHJvY2Vzc2luZy4gRGVsZWdhdGVzIHRvIHRoZSBzaGFyZWQgc3RvcmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVnaW9uUG9seWdvbnMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblBvbHlnb25zKCk7XG4gIH1cblxuICBpc1JlY3RhbmdsZShibmRzOiBhbnkpOiBibmRzIGlzIFJlY3RhbmdsZSB7XG4gICAgcmV0dXJuICd4JyBpbiBibmRzICYmICd5JyBpbiBibmRzICYmICd3aWR0aCcgaW4gYm5kcyAmJiAnaGVpZ2h0JyBpbiBibmRzO1xuICB9XG5cbiAgaXNQb2x5Z29uKGJuZHM6IGFueSk6IGJuZHMgaXMgUG9seWdvbiB7XG4gICAgcmV0dXJuICducG9pbnRzJyBpbiBibmRzICYmICd4cG9pbnRzJyBpbiBibmRzICYmICd5cG9pbnRzJyBpbiBibmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwbG90IHJlZ2lvbnMuIERlbGVnYXRlcyB0aGUgc3RhdGUgY2hhbmdlIHRvIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmVcbiAgICogKGlkL25hbWUgbWludGluZywgY2xhc3NpZmljYXRpb24gY29sb3VycywgYXBwZW5kIGRlLWR1cGxpY2F0aW9uLCBwZXItaW1hZ2VcbiAgICogY2FjaGUgYW5kIHRoZSByZWdpb24tdXBkYXRlIGV2ZW50IGFsbCBsaXZlIHRoZXJlKSwgdGhlbiByZS1wcm9qZWN0cyB0aGVcbiAgICogc3RvcmUncyByZWdpb25zIGludG8gUGxvdGx5J3MgZGljdCB3b3JraW5nLXNldCBhbmQgcmVuZGVycy5cbiAgICpcbiAgICogV2hlbiBgaXNSZWdpb25TYXZlT25gIGlzIGZhbHNlIHRoZSByZWdpb25zIGFyZSBzaG93biB0cmFuc2llbnRseSDigJQgcmVuZGVyZWRcbiAgICogd2l0aG91dCBhbHRlcmluZyB0aGUgc3RvcmVkIHdvcmtpbmctc2V0IChwcmVzZXJ2ZXMgdGhlIHByaW9yIGJlaGF2aW91cikuXG4gICAqL1xuICBwdWJsaWMgc2V0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLCBmaWxsQ29sb3I/OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc2hvd0xhYmVsID0gc2hvd1JlZ2lvbkxhYmVsID09PSB1bmRlZmluZWQgPyB0aGlzLnJlZ2lvblN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCkgOiBzaG93UmVnaW9uTGFiZWw7XG4gICAgY29uc3Qgc2F2ZSA9IGlzUmVnaW9uU2F2ZU9uID09PSB1bmRlZmluZWQgPyB0aGlzLmlzUmVnaW9uU2F2ZWRPbiA6IGlzUmVnaW9uU2F2ZU9uO1xuXG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMsIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgYXBwZW5kKTtcbiAgICB0aGlzLmlzUmVnaW9uU2F2ZWRPbiA9IHNhdmU7XG5cbiAgICBpZiAoc2F2ZSkge1xuICAgICAgLy8gUmUtcHJvamVjdCB0aGUgYXV0aG9yaXRhdGl2ZSByZWdpb25zIGludG8gUGxvdGx5J3Mgd29ya2luZy1zZXQgYW5kIHJlbmRlci5cbiAgICAgIHRoaXMuc3luY1NoYXBlc0Zyb21TdG9yZSgpO1xuICAgICAgdGhpcy5yZW5kZXJTaGFwZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhbnNpZW50IGRpc3BsYXkgb25seSDigJQgcmVuZGVyIHRoZSBwYXNzZWQgcmVnaW9ucywgZG9uJ3QgdG91Y2ggdGhlXG4gICAgICAvLyB3b3JraW5nLXNldCAoYW5kIHRoZSBzdG9yZSBkaWRuJ3Qgc3RvcmUgdGhlbSBlaXRoZXIpLlxuICAgICAgY29uc3QgZGljdHMgPSByZWdpb25zLm1hcChyID0+IHsgci5maWxlbmFtZSA9IHRoaXMuZmlsZU5hbWU7IHJldHVybiB7IC4uLnIuZ2V0U2hhcGUoc2hvd0xhYmVsKSB9OyB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHRoaXMuc2hhcGVzUmVsYXlvdXQoZGljdHMpIGFzIGFueSk7XG4gICAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSDigJQgaXRzIG92ZXJsYXkgcmVuZGVycyBzaGFwZXMgKi8gfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc2hhcGVzLXJlbGF5b3V0IHBheWxvYWQ6IHJlZ2lvbiBzaGFwZXMgKHByb2ZpbGUtbGluZSBST0lzIGluY2x1ZGVkLCBhc1xuICAgKiAgdGhleSBhcmUgb3JkaW5hcnkgcmVnaW9ucykgcGx1cyB0aGUgYWN0aXZlLXNoYXBlIGZpbGwgY29sb3VyLiAqL1xuICBwcml2YXRlIHNoYXBlc1JlbGF5b3V0KHNoYXBlRGljdHM6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hhcGVzOiBzaGFwZURpY3RzLFxuICAgICAgYWN0aXZlc2hhcGU6IHsgZmlsbGNvbG9yOiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBQdXNoIHRoZSBjdXJyZW50IGRpY3Qgd29ya2luZy1zZXQgdG8gUGxvdGx5IChuby1vcCB3aGVuIGFub3RoZXIgYmFja2VuZFxuICAgKiAgb3ducyB0aGUgZGl2KS4gKi9cbiAgcHJpdmF0ZSByZW5kZXJTaGFwZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybjtcbiAgICBjb25zdCBkaWN0QXJyYXkgPSB0aGlzLnNoYXBlcy5tYXAocyA9PiAoeyAuLi5zIH0pKTtcbiAgICB0cnkge1xuICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5zaGFwZXNSZWxheW91dChkaWN0QXJyYXkpIGFzIGFueSk7XG4gICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkg4oCUIGl0cyBvdmVybGF5IHJlbmRlcnMgc2hhcGVzICovIH1cbiAgfVxuXG4gIGdldFNob3dTaGFwZUxhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHByZXZpb3VzIHNhdmVkIHNoYXBlc1xuICAgKi9cbiAgcHVibGljIHBsb3RQcmV2aW91c1NoYXBlcygpIHtcbiAgICAvLyBjb252ZXJ0IHRvIGRpY3Qgc28gdGhhdCBwbG90bHkgcmVjb2duaXNlcyB0aGUgc2hhcGVzXG4gICAgY29uc3QgZGljdEFycmF5ID0gdGhpcy5wcmV2aW91c1NoYXBlcy5tYXAocyA9PiAoeyAuLi5zIH0pKTtcbiAgICB0cnkge1xuICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyBzaGFwZXM6IGRpY3RBcnJheSB9KTtcbiAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSAqLyB9XG4gIH1cblxuICBzZXRQcmV2aW91c1NoYXBlcyhzaGFwZXM6IFNoYXBlU2VsZWN0aW9uW10pIHtcbiAgICB0aGlzLnByZXZpb3VzU2hhcGVzID0gc2hhcGVzO1xuICB9XG5cbiAgZ2V0UHJldmlvdXNTaGFwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXNTaGFwZXM7XG4gIH1cblxuICAvLyBVbmRvIChqaXQtdWkjODUpOiByZWdpb24gaGlzdG9yeSBsaXZlcyBpbiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyB0aGVcbiAgLy8gYWN0aXZlIGJhY2tlbmQncyBvdmVybGF5IHJlLXJlbmRlcnMgb2ZmIGl0cyByZWdpb25VcGRhdGUkIG9uIHJlc3RvcmUuXG4gIHB1YmxpYyB1bmRvKCk6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnVuZG8oKTsgfVxuICBwdWJsaWMgcmVkbygpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS5yZWRvKCk7IH1cbiAgcHVibGljIGNhblVuZG8oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblVuZG8oKTsgfVxuICBwdWJsaWMgY2FuUmVkbygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuUmVkbygpOyB9XG4gIHB1YmxpYyBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuVW5kbyQoKTsgfVxuICBwdWJsaWMgZ2V0Q2FuUmVkbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblJlZG8kKCk7IH1cbiAgcHVibGljIHJlc2V0VW5kb0hpc3RvcnkoKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpOyB9XG5cbiAgLy8g4pSA4pSAIFBlci1zbGljZSB6LXN0YWNrIHJlZ2lvbnMg4oaSIFJlZ2lvblN0b3JlIChqaXQtdWkjOTMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwdWJsaWMgZW50ZXJTdGFja01vZGUoc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sIGluaXRpYWxaPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5lbnRlclN0YWNrTW9kZShzbGljZXMsIGluaXRpYWxaLCBzYXZlTGF5b3V0KTtcbiAgfVxuICBwdWJsaWMgZXhpdFN0YWNrTW9kZSgpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS5leGl0U3RhY2tNb2RlKCk7IH1cbiAgcHVibGljIGlzU3RhY2tNb2RlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpOyB9XG4gIHB1YmxpYyBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZUxheW91dCgpO1xuICB9XG4gIHB1YmxpYyBzZXREaXNwbGF5U2xpY2UoejogbnVtYmVyKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUuc2V0RGlzcGxheVNsaWNlKHopOyB9XG4gIHB1YmxpYyBnZXRTbGljZVJlZ2lvbnMoKTogUmVnaW9uW10geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTbGljZVJlZ2lvbnMoKTsgfVxuICBwdWJsaWMgZ2V0U3RhY2tTYXZlU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpOyB9XG5cbiAgcHJpdmF0ZSBnZXRIZWF0bWFwTGF5b3V0KHhSYW5nZTogbnVtYmVyW10sIHlSYW5nZTogbnVtYmVyW10pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICB4YXhpczoge1xuICAgICAgICBjb25zdHJhaW46ICdyYW5nZScsXG4gICAgICAgIGNvbnN0cmFpbnRvd2FyZDogJ2NlbnRlcicsXG4gICAgICAgIHNpZGU6ICd0b3AnLFxuICAgICAgICB0aWNrczogJycsXG4gICAgICAgIHJhbmdlOiB4UmFuZ2VcbiAgICAgIH0sXG4gICAgICB5YXhpczoge1xuICAgICAgICBjb25zdHJhaW46ICdyYW5nZScsXG4gICAgICAgIGNvbnN0cmFpbnRvd2FyZDogJ2NlbnRlcicsXG4gICAgICAgIHJhbmdlOiB5UmFuZ2UsXG4gICAgICAgIHRpY2tzOiAnJyxcbiAgICAgICAgdGlja3N1ZmZpeDogJyAgJyxcblx0XHRcdFx0Ly8gc2V0IGF1dG9yYW5nZSB0byBmYWxzZSBzbyB0aGF0IHBsb3RseSBkb2VzIG5vdCBvdmVyd3JpdGUgdGhlIHJhbmdlIGZvciB0aGUgeSBheGlzXG5cdFx0XHRcdGF1dG9yYW5nZTogZmFsc2UsXG4gICAgICAgIHNjYWxlYW5jaG9yOiB0aGlzLnNjYWxlcmF0aW8gPyAneCcgOiBmYWxzZVxuICAgICB9LFxuICAgICAgbWFyZ2luOiB7IHQ6IDMwLCBiOiA1LCBsOiA1NSwgcjogNSB9LFxuICAgICAgaGVpZ2h0OiB0aGlzLnNjcmVlbkhlaWdodCxcbiAgICAgIHNsaWRlcnM6IFt7XG4gICAgICAgIHBhZDogeyB0OiA1MCB9LFxuICAgICAgICBjdXJyZW50dmFsdWU6IHtcbiAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgIHByZWZpeDogJ1otcGxhbmU6JyxcbiAgICAgICAgICB4YW5jaG9yOiAncmlnaHQnLFxuICAgICAgICB9LFxuICAgICAgICBzdGVwczogdGhpcy5nZXRTdGVwcygpXG4gICAgICB9XSxcbiAgICAgIGF1dG9zaXplOiB0cnVlLFxuICAgICAgc2hhcGVzOiB0aGlzLmN1cnJlbnRSZW5kZXJTaGFwZXModGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpKSxcbiAgICAgIGFjdGl2ZXNoYXBlOiB7IGZpbGxjb2xvcjogdGhpcy5yZWdpb25TdG9yZS5nZXRGaWxsQ29sb3IoKSB9LFxuICAgICAgZHJhZ21vZGU6IHRoaXMuZHJhZ01vZGUgPyB0aGlzLmRyYWdNb2RlIDogZmFsc2UsXG4gICAgICBuZXdzaGFwZTogeyBsaW5lOiB7IGNvbG9yOiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSwgd2lkdGg6IDMgfSB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hhcGVzVG9SZWRyYXcoc2hvd0xhYmVsOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2hhcGVzVG9SZWRyYXc6IFNoYXBlU2VsZWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNoYXBlIG9mIHRoaXMuc2hhcGVzKSB7XG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2hhcGUuZmlsZU5hbWUpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLmZpbGVOYW1lKSkge1xuICAgICAgICAvLyBTZXQgbGFiZWxcbiAgICAgICAgaWYgKHNob3dMYWJlbCkge1xuICAgICAgICAgIHNoYXBlLmxhYmVsID0ge1xuICAgICAgICAgICAgdGV4dDogYCR7c2hhcGUubGVnZW5kfWAsXG4gICAgICAgICAgICB0ZXh0dGVtcGxhdGU6IGAke3NoYXBlLmxlZ2VuZH1gLFxuICAgICAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnLFxuICAgICAgICAgICAgZm9udDogeyBjb2xvcjogYCR7c2hhcGUubGluZS5jb2xvcn1gIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlLmxhYmVsID0ge307XG4gICAgICAgIH1cbiAgICAgICAgc2hhcGVzVG9SZWRyYXcucHVzaChzaGFwZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnZlcnQgdG8gZGljdCBzbyB0aGF0IHBsb3RseSByZWNvZ25pc2VzIHRoZSBzaGFwZXNcbiAgICByZXR1cm4gc2hhcGVzVG9SZWRyYXcubWFwKHMgPT4gKHsgLi4ucyB9KSk7XG4gIH1cbiAgLyoqXG4gICAqIFVudXNlZCAod2lsbCBiZSB1c2VkIHdoZW4gc3VyZmFjZSBwbG90IGlzIGFkZGVkKVxuICAgKiBAcGFyYW0geFJhbmdlXG4gICAqIEBwYXJhbSB5UmFuZ2VcbiAgICogQHBhcmFtIHpSYXRpb1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTdXJmYWNlTGF5b3V0KHhSYW5nZTogbnVtYmVyW10sIHlSYW5nZTogbnVtYmVyW10sIHpSYXRpbzogbnVtYmVyKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFyZ2luOiB7IHQ6IDAsIGI6IDAsIGw6IDAsIHI6IDAgfSxcbiAgICAgIHNjZW5lOiB7XG4gICAgICAgIHhheGlzOiB7XG4gICAgICAgICAgZ3JpZGNvbG9yOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICB6ZXJvbGluZWNvbG9yOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICBzaG93YmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgICBiYWNrZ3JvdW5kY29sb3I6ICdyZ2IoMjMwLCAyMzAsMjMwKScsXG4gICAgICAgICAgLy8gcmFuZ2U6IHhSYW5nZVxuICAgICAgICB9LFxuICAgICAgICB5YXhpczoge1xuICAgICAgICAgIGdyaWRjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgemVyb2xpbmVjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgc2hvd2JhY2tncm91bmQ6IHRydWUsXG4gICAgICAgICAgYmFja2dyb3VuZGNvbG9yOiAncmdiKDIzMCwgMjMwLCAyMzApJyxcbiAgICAgICAgICAvLyBhdXRvcmFuZ2U6ICdyZXZlcnNlZCcsXG4gICAgICAgICAgLy8gcmFuZ2U6IHlSYW5nZSxcbiAgICAgICAgICAvLyBzY2FsZWFuY2hvcjogJ3gnXG4gICAgICAgIH0sXG4gICAgICAgIHpheGlzOiB7XG4gICAgICAgICAgZ3JpZGNvbG9yOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICB6ZXJvbGluZWNvbG9yOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICBzaG93YmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgICBiYWNrZ3JvdW5kY29sb3I6ICdyZ2IoMjMwLCAyMzAsMjMwKSdcbiAgICAgICAgfSxcbiAgICAgICAgYXNwZWN0cmF0aW86IHsgeDogMSwgeTogMSwgejogelJhdGlvIH0sXG4gICAgICAgIGFzcGVjdG1vZGU6ICdtYW51YWwnLFxuICAgICAgICBzbGlkZXJzOiBbe1xuICAgICAgICAgIHBhZDogeyB0OiA1MCB9LFxuICAgICAgICAgIGN1cnJlbnR2YWx1ZToge1xuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHByZWZpeDogJ1otcGxhbmU6JyxcbiAgICAgICAgICAgIHhhbmNob3I6ICdyaWdodCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGVwczogdGhpcy5nZXRTdGVwcygpXG4gICAgICAgIH1dLFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFN0ZXBzKCkge1xuICAgIGNvbnN0IHN0ZXBzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmltYWdlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBsYWJlbDogaSArIDEsXG4gICAgICAgIG1ldGhvZDogJ3Jlc3R5bGUnLFxuICAgICAgICBhcmdzOiBbJ3Zpc2libGUnLCBBcnJheSh0aGlzLmltYWdlTGVuZ3RoKS5maWxsKGZhbHNlKS5maWxsKHRydWUsIGksIGkgKyAxKV0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGFuIGltYWdlIHZpYSBBbmd1bGFyIEh0dHBDbGllbnQgc28gdGhhdCBhdXRoIGludGVyY2VwdG9ycyAoQmVhcmVyIHRva2VuKVxuICAgKiBhcmUgYXBwbGllZCwgdGhlbiBkZWNvZGUgaXQgd2l0aCBpbWFnZS1qcy4gVGhpcyBhdm9pZHMgcmF3IGJyb3dzZXIgZmV0Y2goKVxuICAgKiBjYWxscyB0aGF0IGJ5cGFzcyB0aGUgaW50ZXJjZXB0b3IgY2hhaW4gYW5kIGZhaWwgYmVoaW5kIGFuIE9BdXRoMiBwcm94eS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEltYWdlKHVybDogc3RyaW5nKTogUHJvbWlzZTxJbWFnZT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLmdldCh1cmwsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXG4gICAgKTtcbiAgICByZXR1cm4gSW1hZ2UubG9hZChCdWZmZXIuZnJvbShidWZmZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW1hZ2UgYXMgYW4gaW1hZ2UtanMgSW1hZ2UgaW5zdGFuY2UuXG4gICAqIFVzZWQgYnkgdGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUgdG8gb2J0YWluIHRoZSBpbnB1dCBpbWFnZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuaW1hZ2VJbmZvIHx8ICF0aGlzLmltYWdlSW5mby51cmxzIHx8IHRoaXMuaW1hZ2VJbmZvLnVybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeklkeCA9IHRoaXMuekluZGV4LnZhbHVlIHx8IDA7XG4gICAgY29uc3QgdXJsID0gdGhpcy5pbWFnZUluZm8udXJsc1t6SWR4XSB8fCB0aGlzLmltYWdlSW5mby51cmxzWzBdO1xuICAgIHJldHVybiB0aGlzLmxvYWRJbWFnZSh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwbG90IHBpeGVsIGRhdGEgYXMgYSBmbGF0IFVpbnQ4Q2xhbXBlZEFycmF5LlxuICAgKiBUaGlzIGNhcHR1cmVzIHdoYXRldmVyIGlzIGFjdHVhbGx5IHJlbmRlcmVkIOKAlCBpbmNsdWRpbmcgem9vbWVkIHJlZ2lvbnMuXG4gICAqIFJldHVybnMgeyB3aWR0aCwgaGVpZ2h0LCBjaGFubmVscywgZGF0YSB9IG9yIG51bGwgaWYgbm8gcGxvdCBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGNoYW5uZWxzOiBudW1iZXI7XG4gICAgZGF0YTogVWludDhDbGFtcGVkQXJyYXkgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBnZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICBpZiAoIWdkPy5kYXRhIHx8IGdkLmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEZpbmQgdGhlIHZpc2libGUgdHJhY2VcbiAgICBjb25zdCBmcmFtZUlkeCA9IHRoaXMuYWN0aXZlRnJhbWVJbmRleCgpO1xuICAgIGNvbnN0IHRyYWNlID0gZ2QuZGF0YVtmcmFtZUlkeF0gfHwgZ2QuZGF0YVswXTtcbiAgICBpZiAoIXRyYWNlIHx8ICF0cmFjZS56KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHpEYXRhOiBhbnlbXVtdID0gdHJhY2UuejtcbiAgICBjb25zdCBoZWlnaHQgPSB6RGF0YS5sZW5ndGg7XG4gICAgaWYgKGhlaWdodCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd2lkdGggPSB6RGF0YVswXS5sZW5ndGg7XG5cbiAgICBpZiAodHJhY2UudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgICAgLy8gUkdCIGltYWdlOiB6W3Jvd11bY29sXSA9IFtyLCBnLCBiXSBvciBbciwgZywgYiwgYV1cbiAgICAgIGNvbnN0IHNhbXBsZSA9IHpEYXRhWzBdWzBdO1xuICAgICAgY29uc3QgY2hhbm5lbHMgPSBBcnJheS5pc0FycmF5KHNhbXBsZSkgPyBzYW1wbGUubGVuZ3RoIDogMztcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiBjaGFubmVscyk7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgIGNvbnN0IHBpeGVsID0gekRhdGFbeV1beF07XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHkgKiB3aWR0aCArIHgpICogY2hhbm5lbHM7XG4gICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICBkYXRhW29mZnNldCArIGNdID0gcGl4ZWxbY107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0LCBjaGFubmVscywgZGF0YSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIZWF0bWFwIChncmF5c2NhbGUpOiB6W3Jvd11bY29sXSA9IHNjYWxhciB2YWx1ZVxuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgIGRhdGFbeSAqIHdpZHRoICsgeF0gPSBNYXRoLnJvdW5kKHpEYXRhW3ldW3hdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHM6IDEsIGRhdGEgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaW9uIG9mIHRoZSBvcmlnaW5hbCBpbWFnZSB0aGF0IHRoZSBkaXNwbGF5ZWQgYHpgIGdyaWQgY292ZXJzLCBpblxuICAgKiBmdWxsLWltYWdlIHBpeGVsIGNvb3Jkcy4gT24gYSBzZXJ2ZXIgem9vbSAoYHRyaWdnZXJab29tYCkgdGhlIHRyYWNlIGB6YCBpc1xuICAgKiByZXBsYWNlZCB3aXRoIHRoZSBoaWdoLWRlZiBjcm9wIGFuZCB0aGUgYXhlcyBhcmUgcmVsYWlkIG91dCB0byB0aGUgY3JvcCdzXG4gICAqIG9yaWdpbmFsLWltYWdlIGJvdW5kcyAoYGltYWdlU2l6ZWApLCBzbyB0aGUgbGl2ZSBheGlzIHJhbmdlcyBBUkUgdGhhdFxuICAgKiByZWN0YW5nbGU7IHdoZW4gdGhlIHdob2xlIGltYWdlIGlzIGluIHZpZXcgdGhlIHJhbmdlcyBzcGFuIGB0cnVlSW1nU2l6ZWAuXG4gICAqIFJlYWRpbmcgdGhlIHJhbmdlcyB0aGVyZWZvcmUgeWllbGRzIHRoZSBjcm9wIG9yaWdpbiArIGV4dGVudCB3aXRob3V0XG4gICAqIHRyYWNraW5nIHpvb20gc3RhdGUgc2VwYXJhdGVseS4gRmFsbHMgYmFjayB0byB0aGUgZnVsbCBpbWFnZSwgdGhlbiBgbnVsbGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgZ2Q6IGFueSA9IHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICAgIGNvbnN0IHhyOiBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IGdkPy5fZnVsbExheW91dD8ueGF4aXM/LnJhbmdlO1xuICAgIGNvbnN0IHlyOiBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IGdkPy5fZnVsbExheW91dD8ueWF4aXM/LnJhbmdlO1xuICAgIGlmICh4ciAmJiB5cikge1xuICAgICAgY29uc3QgeDAgPSBNYXRoLm1pbih4clswXSwgeHJbMV0pO1xuICAgICAgY29uc3QgeTAgPSBNYXRoLm1pbih5clswXSwgeXJbMV0pOyAvLyB5IGF4aXMgaXMgcmV2ZXJzZWQgZm9yIGltYWdlIGxheW91dHNcbiAgICAgIHJldHVybiB7IHg6IHgwLCB5OiB5MCwgd2lkdGg6IE1hdGguYWJzKHhyWzFdIC0geHJbMF0pLCBoZWlnaHQ6IE1hdGguYWJzKHlyWzFdIC0geXJbMF0pIH07XG4gICAgfVxuICAgIGlmICghdGhpcy50cnVlSW1nU2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHRoaXMudHJ1ZUltZ1NpemVbMF0sXG4gICAgICB5OiB0aGlzLnRydWVJbWdTaXplWzJdLFxuICAgICAgd2lkdGg6IHRoaXMudHJ1ZUltZ1NpemVbMV0gLSB0aGlzLnRydWVJbWdTaXplWzBdLFxuICAgICAgaGVpZ2h0OiB0aGlzLnRydWVJbWdTaXplWzNdIC0gdGhpcy50cnVlSW1nU2l6ZVsyXSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIFBsb3RseS5uZXdQbG90KHRoaXMucGxvdERpdiwgW10sXG4gICAgICAgIHRoaXMuZ2V0SGVhdG1hcExheW91dChbMCwgMTAwXSwgWzEwMCwgMF0pLCBDT05GSUcgYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgcmVtb3ZlIFBsb3RseSdzIERPTSBmcm9tIHRoZSBwbG90IGRpdiAoYXhlcyBpbmNsdWRlZCkuIFVzZWQgd2hlblxuICAgKiBoYW5kaW5nIHRoZSBkaXYgdG8gYW5vdGhlciBiYWNrZW5kIChPcGVuU2VhZHJhZ29uKSDigJQgdW5saWtlIGByZXNldCgpYCxcbiAgICogd2hpY2ggcmUtcmVuZGVycyBhbiBlbXB0eSBwbG90IGFuZCB3b3VsZCBsZWF2ZSB0aGUgUGxvdGx5IGF4ZXMgc2hvd2luZy5cbiAgICovXG4gIHB1YmxpYyBwdXJnZVBsb3QoKSB7XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgUGxvdGx5LnB1cmdlKHRoaXMucGxvdERpdik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEV4cG9ydCB0aGUgaGVhdG1hcCBhcyBhIFBORyAodGhlIHJlbmRlcmVkIHBsb3QgYWxyZWFkeSByZWZsZWN0cyB0aGUgYWN0aXZlXG4gICAqICBjb2xvcm1hcC93aW5kb3cpLiBUaGUgZnVsbC1yZXMgdGlsZSBjb21wb3NpdGUgaXMgT1NEJ3Mgam9iLiAqL1xuICBwdWJsaWMgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZG93bmxvYWRJbWFnZSgpO1xuICB9XG5cbiAgcHVibGljIGRvd25sb2FkSW1hZ2UoKSB7XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgKFBsb3RseSBhcyBhbnkpLmRvd25sb2FkSW1hZ2UodGhpcy5wbG90RGl2LCB7IGZvcm1hdDogJ3BuZycsIGZpbGVuYW1lOiB0aGlzLmZpbGVOYW1lIHx8ICdpbWFnZScgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0QXhlcygpIHtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IFtdO1xuICAgIHRoaXMucmVsYXlvdXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSkge1xuICAgIHRoaXMuZHJhZ01vZGUgPSBtb2RlID8gKG1vZGUgYXMgc3RyaW5nKSA6ICcnO1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgLy8gT25seSByZWxheW91dCBhIExJVkUgUGxvdGx5IGdyYXBoLiBXaGVuIGFub3RoZXIgYmFja2VuZCAoT1NEIC8gbmFwYXJpLWpzKSBvd25zIHRoZSB2aWV3IHRoZVxuICAgIC8vIGRpdiBpZCBpcyBzdGlsbCBzZXQgYnV0IGhhcyBubyBQbG90bHkgcGxvdCBhdHRhY2hlZCwgYW5kIFBsb3RseS5yZWxheW91dCB0aHJvd3NcbiAgICAvLyAoXCJjYW4ndCBhY2Nlc3MgcHJvcGVydHkgX2d1aUVkaXRpbmcsIG4gaXMgdW5kZWZpbmVkXCIpLiBUaGF0IHRocm93IGFib3J0ZWQgdGhlIGNhbGxlclxuICAgIC8vIChkZWFjdGl2YXRlQWN0aXZlVG9vbCDihpIgb25TZWxlY3RQbG90VHlwZSkgYmVmb3JlIHRoZSByZS1wbG90IHJhbiwgd2VkZ2luZyB0aGUgcGxvdCB0eXBlXG4gICAgLy8gKGUuZy4gc3R1Y2sgc3dpdGNoaW5nIG5hcGFyaSB2b2x1bWUg4oaUIGlzb3N1cmZhY2UpLiBHdWFyZCBvbiBgX2Z1bGxMYXlvdXRgIGxpa2UgdGhlIHpvb21cbiAgICAvLyBoZWxwZXJzIGRvIHNvIGl0IHNhZmVseSBuby1vcHMgd2hlbiBQbG90bHkgaXNuJ3QgdGhlIGFjdGl2ZSByZW5kZXJlci5cbiAgICBjb25zdCBnZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgYXMgdW5rbm93biBhcyB7IF9mdWxsTGF5b3V0PzogdW5rbm93biB9IHwgbnVsbDtcbiAgICBpZiAoIWdkPy5fZnVsbExheW91dCkgcmV0dXJuO1xuICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgZHJhZ21vZGU6IG1vZGUgfSBhcyBhbnkpO1xuICB9XG5cbiAgLyoqIHtAbGluayBJRGF0YVJlbmRlcmVyfSBzdHViIOKAlCBQbG90bHkgaGFzIG5vIG92ZXJ2aWV3IG5hdmlnYXRvciAoaXQncyBhblxuICAgKiAgT3BlblNlYWRyYWdvbiBmZWF0dXJlKSwgc28gdG9nZ2xpbmcgaXQgaXMgYSBuby1vcCBoZXJlLiAqL1xuICBwdWJsaWMgc2V0TmF2aWdhdG9yVmlzaWJsZShfdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIG5vLW9wOiBuYXZpZ2F0b3IgaXMgT3BlblNlYWRyYWdvbi1vbmx5ICovXG4gIH1cblxuICAvKioge0BsaW5rIElEYXRhUmVuZGVyZXJ9IHN0dWIg4oCUIGltYWdlIHNtb290aGluZyBpcyBhbiBPcGVuU2VhZHJhZ29uIGNhbnZhcy1kcmF3ZXJcbiAgICogIHNldHRpbmc7IHRoZSBQbG90bHkgaW1hZ2UvaGVhdG1hcCB0cmFjZXMgZG9uJ3QgZXhwb3NlIGl0LCBzbyBpdCdzIGEgbm8tb3AuICovXG4gIHB1YmxpYyBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoX2VuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBuby1vcDogc21vb3RoaW5nIHRvZ2dsZSBpcyBPcGVuU2VhZHJhZ29uLW9ubHkgKi9cbiAgfVxuXG4gIHB1YmxpYyB6b29tSW4oKSB7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybjtcbiAgICBjb25zdCBnZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICBpZiAoIWdkPy5fZnVsbExheW91dCkgcmV0dXJuO1xuICAgIGNvbnN0IHhsID0gZ2QuX2Z1bGxMYXlvdXQueGF4aXM7XG4gICAgY29uc3QgeWwgPSBnZC5fZnVsbExheW91dC55YXhpcztcbiAgICAvLyAzRCBzY2VuZXMgaGF2ZSBubyAyRCB4YXhpcy95YXhpcyAodGhleSBsaXZlIHVuZGVyIGBzY2VuZWApOyB0aGUgc3RlcC16b29tXG4gICAgLy8gaXMgbWVhbmluZ2xlc3MgdGhlcmUgYW5kIHdvdWxkIHRocm93IG9uIGB4bC5yYW5nZWAuIFBsb3RseSdzIHNjZW5lIGhhbmRsZXNcbiAgICAvLyBzY3JvbGwtem9vbSBuYXRpdmVseSwgc28ganVzdCBiYWlsLlxuICAgIGlmICgheGw/LnJhbmdlIHx8ICF5bD8ucmFuZ2UpIHJldHVybjtcbiAgICBjb25zdCB4YyA9ICh4bC5yYW5nZVswXSArIHhsLnJhbmdlWzFdKSAvIDI7XG4gICAgY29uc3QgeWMgPSAoeWwucmFuZ2VbMF0gKyB5bC5yYW5nZVsxXSkgLyAyO1xuICAgIGNvbnN0IGR4ID0gKHhsLnJhbmdlWzFdIC0geGwucmFuZ2VbMF0pIC8gMS4zO1xuICAgIGNvbnN0IGR5ID0gKHlsLnJhbmdlWzFdIC0geWwucmFuZ2VbMF0pIC8gMS4zO1xuICAgIGNvbnN0IHgwID0geGMgLSBkeCAvIDIsIHgxID0geGMgKyBkeCAvIDI7XG4gICAgY29uc3QgeTAgPSB5YyAtIGR5IC8gMiwgeTEgPSB5YyArIGR5IC8gMjtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IFt4MCwgeDEsIHkwLCB5MV07XG4gICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwge1xuICAgICAgJ3hheGlzLnJhbmdlWzBdJzogeDAsICd4YXhpcy5yYW5nZVsxXSc6IHgxLFxuICAgICAgJ3lheGlzLnJhbmdlWzBdJzogeTAsICd5YXhpcy5yYW5nZVsxXSc6IHkxXG4gICAgfSBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBldmVyeSBjdXJyZW50bHkgc2VsZWN0ZWQgc2hhcGUuIEZhbGxzIGJhY2sgdG8gdGhlIHNpbmdsZVxuICAgKiBgX2FjdGl2ZVNoYXBlSW5kZXhgIHdoZW4gbm8gbXVsdGktc2VsZWN0aW9uIGlzIGFjdGl2ZSAoY292ZXJzIHRoZSBjYXNlXG4gICAqIHdoZXJlIFBsb3RseSBjbGlja2VkIGEgc2hhcGUgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSB0YWJsZSkuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQWN0aXZlU2hhcGUoKSB7XG4gICAgLy8gTm90ZTogbm8gYHBsb3REaXZgIGd1YXJkIOKAlCB3aGVuIE9wZW5TZWFkcmFnb24gaXMgdGhlIHJlbmRlcmVyLCBQbG90bHlcbiAgICAvLyBuZXZlciBwbG90dGVkIChwbG90RGl2IGlzIHVuc2V0KSwgYnV0IGRlbGV0aW9uIG9ubHkgbmVlZHMgdGhlIHNoYXBlIGxpc3RcbiAgICAvLyArIHRoZSBjdXJyZW50IHNlbGVjdGlvbjsgdGhlIFBsb3RseSByZWxheW91dCBiZWxvdyBpcyBndWFyZGVkLlxuICAgIGNvbnN0IGdkOiBhbnkgPSB0aGlzLnBsb3REaXYgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIDogbnVsbDtcblxuICAgIC8vIFJlc29sdmUgd2hhdCB0byBkZWxldGU6IHRoZSBzdG9yZSdzIHNlbGVjdGlvbiwgZWxzZSB0aGUgc2hhcGUgUGxvdGx5XG4gICAgLy8gdHJhY2tzIGFzIGNsaWNrZWQgKHdoZW4gdGhlIHVzZXIgY2xpY2tlZCBhIHNoYXBlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGVcbiAgICAvLyBSZWdpb24gRWRpdG9yIHRhYmxlKS5cbiAgICBpZiAodGhpcy5yZWdpb25TdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYWN0aXZlSW5kZXg6IG51bWJlciA9IGdkPy5fZnVsbExheW91dD8uX2FjdGl2ZVNoYXBlSW5kZXg7XG4gICAgICBpZiAoYWN0aXZlSW5kZXggPT09IHVuZGVmaW5lZCB8fCBhY3RpdmVJbmRleCA8IDApIHJldHVybjtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoW2FjdGl2ZUluZGV4XSk7XG4gICAgfVxuICAgIC8vIFRoZSBzdG9yZSByZW1vdmVzIHRoZSBzZWxlY3RlZCByZWdpb25zLCBjbGVhcnMgdGhlIHNlbGVjdGlvbiwgc3luY3MgaXRzXG4gICAgLy8gY2FjaGUgYW5kIGVtaXRzIHRoZSByZWdpb24tdXBkYXRlIGV2ZW50LlxuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlQWN0aXZlU2hhcGUoKTtcblxuICAgIC8vIFJlLXByb2plY3QgdGhlIHJlbWFpbmluZyByZWdpb25zIGFuZCByZW5kZXIgb24gdGhlIFBsb3RseSBwbG90IChhIG5vLW9wLFxuICAgIC8vIGNhdWdodCwgd2hlbiBhbm90aGVyIGJhY2tlbmQgb3ducyB0aGUgZGl2IOKAlCBpdHMgb3ZlcmxheSByZS1yZW5kZXJzIHZpYVxuICAgIC8vIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudCkuXG4gICAgaWYgKGdkPy5fZnVsbExheW91dCkgZ2QuX2Z1bGxMYXlvdXQuX2FjdGl2ZVNoYXBlSW5kZXggPSAtMTtcbiAgICB0aGlzLnN5bmNTaGFwZXNGcm9tU3RvcmUoKTtcbiAgICBjb25zdCBkaWN0QXJyYXkgPSB0aGlzLnNoYXBlcy5tYXAocyA9PiAoeyAuLi5zIH0pKTtcbiAgICB0cnkge1xuICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyBzaGFwZXM6IGRpY3RBcnJheSB9IGFzIGFueSkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChnZD8uX2Z1bGxMYXlvdXQpIChQbG90bHkgYXMgYW55KS5yZWRyYXcoZ2QpO1xuICAgICAgfSwgKCkgPT4geyAvKiBkaXYgbm90IGEgUGxvdGx5IHBsb3QgKi8gfSk7XG4gICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKi8gfVxuICB9XG5cbiAgcHVibGljIHpvb21PdXQoKSB7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybjtcbiAgICBjb25zdCBnZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICBpZiAoIWdkPy5fZnVsbExheW91dCkgcmV0dXJuO1xuICAgIGNvbnN0IHhsID0gZ2QuX2Z1bGxMYXlvdXQueGF4aXM7XG4gICAgY29uc3QgeWwgPSBnZC5fZnVsbExheW91dC55YXhpcztcbiAgICAvLyAzRCBzY2VuZXMgaGF2ZSBubyAyRCB4YXhpcy95YXhpcyDigJQgc2VlIHpvb21JbigpLlxuICAgIGlmICgheGw/LnJhbmdlIHx8ICF5bD8ucmFuZ2UpIHJldHVybjtcbiAgICBjb25zdCB4YyA9ICh4bC5yYW5nZVswXSArIHhsLnJhbmdlWzFdKSAvIDI7XG4gICAgY29uc3QgeWMgPSAoeWwucmFuZ2VbMF0gKyB5bC5yYW5nZVsxXSkgLyAyO1xuICAgIGNvbnN0IGR4ID0gKHhsLnJhbmdlWzFdIC0geGwucmFuZ2VbMF0pICogMS4zO1xuICAgIGNvbnN0IGR5ID0gKHlsLnJhbmdlWzFdIC0geWwucmFuZ2VbMF0pICogMS4zO1xuICAgIGNvbnN0IHgwID0geGMgLSBkeCAvIDIsIHgxID0geGMgKyBkeCAvIDI7XG4gICAgY29uc3QgeTAgPSB5YyAtIGR5IC8gMiwgeTEgPSB5YyArIGR5IC8gMjtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IFt4MCwgeDEsIHkwLCB5MV07XG4gICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwge1xuICAgICAgJ3hheGlzLnJhbmdlWzBdJzogeDAsICd4YXhpcy5yYW5nZVsxXSc6IHgxLFxuICAgICAgJ3lheGlzLnJhbmdlWzBdJzogeTAsICd5YXhpcy5yYW5nZVsxXSc6IHkxXG4gICAgfSBhcyBhbnkpO1xuICB9XG5cbiAgcHVibGljIGlzU3RhY2tMb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHB1YmxpYyBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuICBwdWJsaWMgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gQ29sb3JtYXAgLyByZXZlcnNlLXNjYWxlIC8gaW1hZ2UgbWV0YWRhdGEgc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmU7IHRoZXNlIGRlbGVnYXRlLCBrZWVwaW5nIG9ubHkgdGhlIFBsb3RseS1zcGVjaWZpYyBsaXZlXG4gIC8vIHJlc3R5bGUgYXMgcmVuZGVyIGdsdWUuXG4gIGdldENvbG9ybWFwT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDb2xvcm1hcE9wdGlvbnMoKTtcbiAgfVxuICBzZXRDb2xvcm1hcChjb2xvcm1hcDogYW55KSB7XG4gICAgdGhpcy5zdG9yZS5zZXRDb2xvcm1hcChjb2xvcm1hcCk7XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZXN0eWxlKHRoaXMucGxvdERpdiwgeyAnY29sb3JzY2FsZSc6IFtjb2xvcm1hcC5kYXRhLnZhbHVlXSB9KTtcbiAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSDigJQgaXQgcmVjb2xvcnMgdmlhIHRoZSBMVVQgKi8gfVxuICB9XG4gIGdldENvbG9ybWFwKCkge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCk7XG4gIH1cblxuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzY2FsZTogYW55KSB7XG4gICAgdGhpcy5zdG9yZS5zZXRSZXZlcnNlU2NhbGUocmV2ZXJzY2FsZSk7XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZXN0eWxlKHRoaXMucGxvdERpdiwgeyAncmV2ZXJzZXNjYWxlJzogcmV2ZXJzY2FsZSB9KTtcbiAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSDigJQgaXQgcmVjb2xvcnMgdmlhIHRoZSBMVVQgKi8gfVxuICB9XG5cbiAgZ2V0UmV2ZXJzZVNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpO1xuICB9XG5cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSkge1xuICAgIHRoaXMuc3RvcmUuc2V0SW1hZ2VNZXRhKGltYWdlTWV0YSk7XG4gIH1cblxuICBnZXRJbWFnZU1ldGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW1hZ2VNZXRhKCk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKSB7XG4gICAgaWYgKCFzaG93c3RhY2spIHtcbiAgICAgIHRoaXMuekluZGV4Lm5leHQoMCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmltYWdlSW5mbykgdGhpcy5pbWFnZUluZm8uc2hvd1N0YWNrID0gc2hvd3N0YWNrO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHNob3dzdGFjayk7XG4gICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyAnc2hvd3N0YWNrJzogc2hvd3N0YWNrIH0gYXMgYW55KTtcbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9zY2FsZUV2ZW50LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gb2YgdGhlIGluZGljZXMgb2YgY3VycmVudGx5IHNlbGVjdGVkIHJlZ2lvbnMg4oCUIG93bmVkIGJ5IHRoZSBzaGFyZWRcbiAgICogUmVnaW9uU3RvcmUgc28gdGhlIHNlbGVjdGlvbiBpcyBjb25zaXN0ZW50IGFjcm9zcyBiYWNrZW5kcyBhbmQgdGhlIFJlZ2lvblxuICAgKiBFZGl0b3IgdGFibGUuIEVtcHR5ID0gbm90aGluZyBzZWxlY3RlZC5cbiAgICovXG4gIGdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpOiBPYnNlcnZhYmxlPG51bWJlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSBzZWxlY3QgcmVnaW9ucyAob3IgY2xlYXIgd2l0aCBbXSkuIFRoZSBzaGFyZWQgc3RvcmUgb3duc1xuICAgKiB0aGUgc2VsZWN0aW9uIHN0YXRlICh2YWxpZGF0ZXMvZGVkdXBlcy9lbWl0cyk7IGhlcmUgd2UgYWRkaXRpb25hbGx5IHBvaW50XG4gICAqIFBsb3RseSdzIGBfYWN0aXZlU2hhcGVJbmRleGAgYXQgdGhlIGxhc3Qgc2VsZWN0ZWQgc2hhcGUgc28gaXQgZ2V0cyB0aGUgZWRpdFxuICAgKiBoYW5kbGVzLiBObyB2aXN1YWwgY2hhbmdlIHRvIG5vbi1hY3RpdmUgc2hhcGVzIOKAlCBQbG90bHkncyBvd24gYWN0aXZlLXNoYXBlXG4gICAqIHJlbmRlcmluZyBpcyB0aGUgb25seSBoaWdobGlnaHQuXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICBjb25zdCB2YWxpZCA9IChpbmRpY2VzIHx8IFtdKVxuICAgICAgLmZpbHRlcihpID0+IE51bWJlci5pc0Zpbml0ZShpKSAmJiBpID49IDAgJiYgaSA8IHRoaXMuc2hhcGVzLmxlbmd0aCk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGNvbnN0IGNsZWFuZWQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpIG9mIHZhbGlkKSB7XG4gICAgICBpZiAoIXNlZW4uaGFzKGkpKSB7IHNlZW4uYWRkKGkpOyBjbGVhbmVkLnB1c2goaSk7IH1cbiAgICB9XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgICBpZiAoZ2Q/Ll9mdWxsTGF5b3V0KSB7XG4gICAgICAgIGdkLl9mdWxsTGF5b3V0Ll9hY3RpdmVTaGFwZUluZGV4ID0gY2xlYW5lZC5sZW5ndGggPiAwID8gY2xlYW5lZFtjbGVhbmVkLmxlbmd0aCAtIDFdIDogLTE7XG4gICAgICAgIHRyeSB7IChQbG90bHkgYXMgYW55KS5yZWRyYXcoZ2QpOyB9IGNhdGNoIHsgLyogbm9vcCBpbiB0ZXN0cyAqLyB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoY2xlYW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGEgc3BlY2lmaWMgcmVnaW9uIChJUmVnaW9uU3RvcmUuc2VsZWN0UmVnaW9uKS4gU2V0cyB0aGUgc2hhcmVkIHN0b3JlXG4gICAqIHNlbGVjdGlvbiBieSBpZGVudGl0eSBhbmQgcG9pbnRzIFBsb3RseSdzIGFjdGl2ZS1zaGFwZSBhdCB0aGUgbWF0Y2hpbmdcbiAgICogcmVuZGVyZWQgc2hhcGUgc28gaXRzIGVkaXQgaGFuZGxlcyBhcHBlYXIuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICBjb25zdCBpZHggPSB0aGlzLnNoYXBlcy5maW5kSW5kZXgocyA9PiBzLmlkID09PSByZWdpb24/LmlkKTtcbiAgICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgICAgaWYgKGdkPy5fZnVsbExheW91dCAmJiBpZHggPj0gMCkge1xuICAgICAgICBnZC5fZnVsbExheW91dC5fYWN0aXZlU2hhcGVJbmRleCA9IGlkeDtcbiAgICAgICAgdHJ5IHsgKFBsb3RseSBhcyBhbnkpLnJlZHJhdyhnZCk7IH0gY2F0Y2ggeyAvKiBub29wIGluIHRlc3RzICovIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBQbG90bHkncyBgX2FjdGl2ZVNoYXBlSW5kZXhgIGFuZCBwdXNoIGl0IGFzIHRoZSBzZWxlY3Rpb24uIENhbGxlZCBmcm9tXG4gICAqIHRoZSByZWxheW91dCBoYW5kbGVyIGFuZCB0aGUgcG9zdC1jbGljayB0aWNrIOKAlCBQbG90bHkgZG9lc24ndCBmaXJlIGFcbiAgICogZGVkaWNhdGVkIGFjdGl2ZS1zaGFwZSBldmVudCBmb3IgY2xpY2tzLCBzbyB3ZSBzYW1wbGUuIFRoZSBzdG9yZSBuby1vcHMgaWZcbiAgICogdGhlIHNlbGVjdGlvbiBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIG1heWJlRW1pdEFjdGl2ZVNoYXBlSW5kZXgoKSB7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybjtcbiAgICBjb25zdCBnZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICBjb25zdCByYXcgPSBnZD8uX2Z1bGxMYXlvdXQ/Ll9hY3RpdmVTaGFwZUluZGV4O1xuICAgIGNvbnN0IGlkeCA9ICh0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyAmJiByYXcgPj0gMCAmJiByYXcgPCB0aGlzLnNoYXBlcy5sZW5ndGgpID8gcmF3IDogLTE7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpZHggPj0gMCA/IFtpZHhdIDogW10pO1xuICB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuekluZGV4Lm5leHQoekluZGV4KTtcbiAgfVxuXG4gIGdldFNoYXBlQ29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICB9XG4gIGdldEZpbGxDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRGaWxsQ29sb3IoKTtcbiAgfVxuXG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7XG4gIH1cblxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBTdWJzY3JpcHRpb25zXG4gICAqL1xuICB1bnN1YnNjcmliZSgpIHtcbiAgICBpZiAodGhpcy5pbWFnZUNhY2hlZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pbWFnZUNhY2hlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWdpb25VcGRhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVnaW9uVXBkYXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlZ2lvbkxpdmVFZGl0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlZ2lvbkxpdmVFZGl0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoYW5uZWxTdWIpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMaXZlLWFwcGx5IHRoZSBjaGFubmVsIGRpc3BsYXkgd2luZG93ICh6bWluL3ptYXgpICsgcmV2ZXJzZS9pbnZlcnQgdG8gdGhlXG4gICAqICBoZWF0bWFwLiBOby1vcCB3aGVuIG5vIFBsb3RseSBwbG90IGlzIG1vdW50ZWQgKE9TRCBvd25zIHRoZSBkaXYpLiAqL1xuICBwcml2YXRlIGFwcGx5Q2hhbm5lbERpc3BsYXkoY2hhbm5lbHM6IGFueVtdLCByZXY6IGJvb2xlYW4sIGludjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgY29uc3QgY2ggPSBjaGFubmVscz8uWzBdO1xuICAgIGNvbnN0IGNvbG9yc2NhbGUgPSB0aGlzLnN0b3JlLmN1cnJlbnRDb2xvcm1hcCgpPy5kYXRhPy52YWx1ZTtcbiAgICAvLyByZXZlcnNlLXNjYWxlIGFuZCBpbnZlcnQgZWFjaCBmbGlwIHRoZSByYW1wOyBib3RoIHRvZ2V0aGVyIGNhbmNlbC5cbiAgICBjb25zdCB1cGRhdGU6IGFueSA9IHsgcmV2ZXJzZXNjYWxlOiByZXYgIT09IGludiB9O1xuICAgIGlmIChjb2xvcnNjYWxlICE9IG51bGwpIHVwZGF0ZS5jb2xvcnNjYWxlID0gY29sb3JzY2FsZTsgLy8gbGl2ZSBjb2xvcm1hcCByZWNvbG9yXG4gICAgaWYgKGNoKSB7XG4gICAgICAvLyBTdXJmYWNlL2lzb3N1cmZhY2Uvc2NhdHRlcjNkIGNvbG91ci1tYXAgdmlhIGNtaW4vY21heDsgaGVhdG1hcC9jb250b3VyIHZpYSB6bWluL3ptYXguXG4gICAgICBjb25zdCB0aHJlZUQgPVxuICAgICAgICB0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5JU09TVVJGQUNFIHx8XG4gICAgICAgIHRoaXMucGxvdFR5cGUgPT09IFBsb3RUeXBlLlNVUkZBQ0UgfHxcbiAgICAgICAgdGhpcy5wbG90VHlwZSA9PT0gUGxvdFR5cGUuU0NBVFRFUjNEO1xuICAgICAgaWYgKHRocmVlRCkge1xuICAgICAgICB1cGRhdGUuY21pbiA9IGNoLm1pbjtcbiAgICAgICAgdXBkYXRlLmNtYXggPSBjaC5tYXg7XG4gICAgICAgIHVwZGF0ZS5jYXV0byA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlLnptaW4gPSBjaC5taW47XG4gICAgICAgIHVwZGF0ZS56bWF4ID0gY2gubWF4O1xuICAgICAgICB1cGRhdGUuemF1dG8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZXN0eWxlKHRoaXMucGxvdERpdiwgdXBkYXRlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIG5vdCBhIGNvbG91ci1tYXBwZWQgdHJhY2UsIG9yIE9TRCBvd25zIHRoZSBkaXYgKi9cbiAgICB9XG4gIH1cblxuICAvKiogQmlubmVkIGludGVuc2l0eSBoaXN0b2dyYW0gZm9yIGEgY2hhbm5lbCBmcm9tIHRoZSBjYWNoZWQgc291cmNlIGZyYW1lc1xuICAgKiAgKHJhdywgcHJlLUxVVCkuIEdyYXlzY2FsZSBjZWxscyBhcmUgbnVtYmVyczsgUkdCIGNlbGxzIGFyZSBbcixnLGJdLiAqL1xuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIF9iaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgZnJhbWVzID0gdGhpcy5jYWNoZWRJbWFnZUZyYW1lcztcbiAgICBpZiAoIWZyYW1lcz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBmcmFtZSA9IGZyYW1lc1t0aGlzLmFjdGl2ZUZyYW1lSW5kZXgoKV0gPz8gZnJhbWVzWzBdO1xuICAgIGlmICghZnJhbWU/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY291bnRzID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBmcmFtZSkge1xuICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdykge1xuICAgICAgICBsZXQgdjogbnVtYmVyO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjZWxsKSkge1xuICAgICAgICAgIHYgPSBjaGFubmVsSW5kZXggPj0gMCAmJiBjaGFubmVsSW5kZXggPCBjZWxsLmxlbmd0aFxuICAgICAgICAgICAgPyBjZWxsW2NoYW5uZWxJbmRleF1cbiAgICAgICAgICAgIDogTWF0aC5yb3VuZChidDYwMUx1bWluYW5jZShjZWxsWzBdLCBjZWxsWzFdLCBjZWxsWzJdKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdiA9IGNlbGw7XG4gICAgICAgIH1cbiAgICAgICAgdiA9IHYgfCAwO1xuICAgICAgICBpZiAodiA8IDApIHYgPSAwOyBlbHNlIGlmICh2ID4gMjU1KSB2ID0gMjU1O1xuICAgICAgICBjb3VudHNbdl0rKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhpc3RvZ3JhbTI1Nihjb3VudHMpO1xuICB9XG5cbiAgLyoqIEFzeW5jIGhpc3RvZ3JhbSBzdHJlYW0g4oCUIFBsb3RseSByZW5kZXJzIGhlYXRtYXAgZnJhbWUgZGF0YSAoYWxyZWFkeSBpblxuICAgKiAgbWVtb3J5LCA4LWJpdCBsdW1pbmFuY2UpLCBzbyB0aGlzIGp1c3Qgd3JhcHMgdGhlIHN5bmNocm9ub3VzIDgtYml0XG4gICAqICBoaXN0b2dyYW0uIE5hdGl2ZSAxNi1iaXQgaGlzdG9ncmFtcyBvbmx5IGFwcGx5IHRvIHRoZSBPU0QgdGlsZSBwYXRoLiAqL1xuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIG9mKHRoaXMuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucykpO1xuICB9XG5cbiAgLyoqIERhdGEgZXhwb3J0ICgxNi1iaXQgVElGRikgaXMgYW4gT1NELXRpbGUtcGF0aCBmZWF0dXJlIGJhY2tlZCBieSB0aGUgc2VydmVyLlxuICAgKiAgUGxvdGx5IHJlbmRlcnMgaGVhdG1hcHMgZnJvbSBmcmFtZSBkYXRhLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZXhwb3J0IGhlcmUuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgY29uc29sZS53YXJuKCdbcGxvdGx5XSAxNi1iaXQgZGF0YSBleHBvcnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGhlYXRtYXAgYmFja2VuZC4nKTtcbiAgfVxuXG4gIGltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cjogc3RyaW5nKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnBsb3RVdGlsaXRpZXMuaW1wb3J0Uk9Jc0Zyb21HZW9Kc29uKGdlb0pzb25TdHIpO1xuICB9XG5cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSkge1xuICAgIGNvbnN0IGpzb25TdHJpbmcgPSB0aGlzLnBsb3RVdGlsaXRpZXMuZXhwb3J0Uk9Jc1RvR2VvSnNvbihyZWdpb25zKTtcbiAgICB0aGlzLnBsb3RVdGlsaXRpZXMuc2F2ZVRvRmlsZShqc29uU3RyaW5nLCB0aGlzLmZpbGVOYW1lKTtcbiAgfVxuXG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBsb3RVdGlsaXRpZXMuZXhwb3J0Uk9Jc1RvR2VvSnNvbihyZWdpb25zKTtcbiAgfVxuXG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrTG9hZGluZ1Byb2dyZXNzJCgpO1xuICB9XG5cbiAgaXNTdGFja0xvYWRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTdGFja0xvYWRpbmckKCk7XG4gIH1cblxufVxuIl19