@jax-data-science/sci-image-visualizer 0.12.0 → 0.13.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.
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/reconstruct.mjs +11 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +18 -6
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +29 -14
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +6 -1
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +9 -4
- package/esm2022/lib/region-editor/region-editor.component.mjs +13 -1
- package/esm2022/lib/routing-visualizer.service.mjs +4 -1
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +71 -21
- package/esm2022/lib/spatial/spatial-selection.mjs +70 -1
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +53 -11
- package/esm2022/lib/store/region-selection.mjs +21 -4
- package/esm2022/lib/store/region-store.service.mjs +22 -3
- package/esm2022/lib/store/spatial-selection.service.mjs +13 -1
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +3 -3
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs} +770 -500
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -2
- package/lib/contracts/region-editor-api.contract.d.ts +3 -0
- package/lib/contracts/visualizer.contract.d.ts +25 -2
- package/lib/geometry/reconstruct.d.ts +6 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +13 -1
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +11 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +3 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +6 -1
- package/lib/routing-visualizer.service.d.ts +1 -0
- package/lib/spatial/spatial-controls.facade.d.ts +16 -2
- package/lib/spatial/spatial-selection.d.ts +16 -1
- package/lib/spatial-controls/spatial-controls.component.d.ts +14 -3
- package/lib/store/region-selection.d.ts +14 -3
- package/lib/store/region-store.service.d.ts +14 -1
- package/lib/store/spatial-selection.service.d.ts +8 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs.map +0 -1
|
@@ -187,6 +187,7 @@ export class NapariRegionOverlay {
|
|
|
187
187
|
this.commitPolygon(pts, true);
|
|
188
188
|
this.redraw();
|
|
189
189
|
};
|
|
190
|
+
this.own = opts.screenSpace ? new Set() : null;
|
|
190
191
|
if (getComputedStyle(host).position === 'static')
|
|
191
192
|
host.style.position = 'relative';
|
|
192
193
|
this.svg = document.createElementNS(SVG_NS, 'svg');
|
|
@@ -200,7 +201,7 @@ export class NapariRegionOverlay {
|
|
|
200
201
|
touchAction: 'none',
|
|
201
202
|
});
|
|
202
203
|
this.host.appendChild(this.svg);
|
|
203
|
-
this.renderer = new NapariRegionSvgRenderer(this.svg, this.store);
|
|
204
|
+
this.renderer = new NapariRegionSvgRenderer(this.svg, this.store, (r) => this.draws(r));
|
|
204
205
|
this.projection = new OverlayProjection(this.svg, this.viewer);
|
|
205
206
|
this.sourceLayer =
|
|
206
207
|
opts.regionSource === false ? null : new RegionSourceLayer(this.svg, this.store.getRegionSourceView$());
|
|
@@ -333,11 +334,20 @@ export class NapariRegionOverlay {
|
|
|
333
334
|
this.draftPath.push([ix, iy]);
|
|
334
335
|
}
|
|
335
336
|
}
|
|
336
|
-
/** The currently-selected region (single selection), or null. */
|
|
337
|
+
/** The currently-selected region (single selection) this overlay draws, or null. */
|
|
337
338
|
selectedRegion() {
|
|
338
339
|
const regions = this.store.getRegions();
|
|
339
340
|
const i = this.selected[0];
|
|
340
|
-
|
|
341
|
+
const region = i != null && i >= 0 && i < regions.length ? regions[i] : null;
|
|
342
|
+
return region && this.draws(region) ? region : null;
|
|
343
|
+
}
|
|
344
|
+
/** Whether this overlay draws (and lets the pointer pick) `region`: see {@link own}. */
|
|
345
|
+
draws(region) {
|
|
346
|
+
return !this.own || this.own.has(region.id);
|
|
347
|
+
}
|
|
348
|
+
/** The regions this overlay drew in screen space (the 3D view's lassos); [] in image space. */
|
|
349
|
+
ownRegionIds() {
|
|
350
|
+
return this.own ? [...this.own] : [];
|
|
341
351
|
}
|
|
342
352
|
/**
|
|
343
353
|
* Start a select/move interaction: grab a handle (rectangle corner) or vertex of the already-
|
|
@@ -360,7 +370,7 @@ export class NapariRegionOverlay {
|
|
|
360
370
|
const regions = this.store.getRegions();
|
|
361
371
|
const [wx, wy] = this.projection.toWorld(e.clientX, e.clientY);
|
|
362
372
|
for (let i = regions.length - 1; i >= 0; i--) {
|
|
363
|
-
if (this.store.isClassHidden(regions[i].label))
|
|
373
|
+
if (this.store.isClassHidden(regions[i].label) || !this.draws(regions[i]))
|
|
364
374
|
continue;
|
|
365
375
|
if (regionContains(regions[i], wx, wy, { toScreen: this.projection.toScreen, tolPx: OPEN_PATH_HIT_PX })) {
|
|
366
376
|
this.store.selectRegion(regions[i]);
|
|
@@ -441,7 +451,7 @@ export class NapariRegionOverlay {
|
|
|
441
451
|
const regions = this.store.getRegions();
|
|
442
452
|
this.store.setSelectedShapeIndices(regionsInRect(regions, x0, y0, x1, y1, {
|
|
443
453
|
skipProfiles: true,
|
|
444
|
-
skip: (r) => this.store.isClassHidden(r.label),
|
|
454
|
+
skip: (r) => this.store.isClassHidden(r.label) || !this.draws(r),
|
|
445
455
|
}));
|
|
446
456
|
const features = this.sourceLayer?.featuresInRect(x0, y0, x1, y1) ?? [];
|
|
447
457
|
if (features.length) {
|
|
@@ -459,6 +469,7 @@ export class NapariRegionOverlay {
|
|
|
459
469
|
region.bounds = rect;
|
|
460
470
|
region.color = this.store.getShapeColor();
|
|
461
471
|
this.store.addRegion(region);
|
|
472
|
+
this.own?.add(region.id);
|
|
462
473
|
}
|
|
463
474
|
commitPolygon(points, closed) {
|
|
464
475
|
const poly = new Polygon();
|
|
@@ -472,6 +483,7 @@ export class NapariRegionOverlay {
|
|
|
472
483
|
region.color = this.store.getShapeColor();
|
|
473
484
|
region.label = 'Region';
|
|
474
485
|
this.store.addRegion(region);
|
|
486
|
+
this.own?.add(region.id);
|
|
475
487
|
}
|
|
476
488
|
// ── rendering ─────────────────────────────────────────────────────────────
|
|
477
489
|
/** Show or hide the drawn regions. A region being drawn stays visible either way. */
|
|
@@ -505,4 +517,4 @@ export class NapariRegionOverlay {
|
|
|
505
517
|
});
|
|
506
518
|
}
|
|
507
519
|
}
|
|
508
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXJlZ2lvbi1vdmVybGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS1yZWdpb24tb3ZlcmxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRW5HLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBQ2QsYUFBYSxHQUNkLE1BQU0sc0NBQXNDLENBQUM7QUFFOUMsT0FBTyxFQUFXLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDeEUsT0FBTyxFQUFjLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTNFLE1BQU0sTUFBTSxHQUFHLDRCQUE0QixDQUFDO0FBQzVDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0I7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixrR0FBa0c7QUFDbEcsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLDRFQUE0RTtBQUM1RSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIseUZBQXlGO0FBQ3pGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBNkIzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFB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RUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsMEZBQTBGO0lBQ2xGLGFBQWE7UUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDN0YsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXksIFJlZ2lvblRvb2xNb2RlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiwgUmVjdGFuZ2xlLCBQb2x5Z29uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB0eXBlIHsgQWZmaW5lIH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5pbXBvcnQgeyBSZWdpb25Tb3VyY2VMYXllciwgU09VUkNFX01BUlFVRUVfTElNSVQgfSBmcm9tICcuLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc291cmNlLWxheWVyJztcblxuaW1wb3J0IHtcbiAgaGl0SGFuZGxlLFxuICBuZWFyZXN0RWRnZSxcbiAgbmVhcmVzdFZlcnRleCxcbiAgcmVnaW9uQ29udGFpbnMsXG4gIHJlZ2lvbnNJblJlY3QsXG59IGZyb20gJy4uLy4uL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1nZW9tZXRyeSc7XG5cbmltcG9ydCB7IERyYWdCb3gsIE5hcGFyaVJlZ2lvblN2Z1JlbmRlcmVyIH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3ZnLXJlbmRlcmVyJztcbmltcG9ydCB7IE92ZXJsYXlQcm9qZWN0aW9uIH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS9vdmVybGF5LXByb2plY3Rpb24nO1xuaW1wb3J0IHsgUmVnaW9uRWRpdCwgYXBwbHlSZWdpb25FZGl0IH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZWRpdCc7XG5cbmNvbnN0IFNWR19OUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4vKipcbiAqIE1pbiBkcmFnIGJlZm9yZSBhIGZyZWVoYW5kIHBhdGggcmVjb3JkcyBhbm90aGVyIHBvaW50LCBpbiBTQ1JFRU4gcGl4ZWxzLlxuICpcbiAqIFNjcmVlbiByYXRoZXIgdGhhbiB3b3JsZCwgd2hpY2ggaXMgd2hhdCBcIjIgaW1hZ2UgcHhcIiBhbHdheXMgbWVhbnQgaW4gcHJhY3RpY2U6IGF0IDEwMCVcbiAqIHpvb20gb3ZlciBhbiBpbWFnZSB0aGUgdHdvIGFyZSB0aGUgc2FtZSB0aGluZy4gVGFrZW4gYXMgd29ybGQgdW5pdHMgaXQgYnJlYWtzIG9uIGFueVxuICogZGF0YXNldCB3aG9zZSB3b3JsZCBpcyBzbWFsbCDigJQgc2VxRklTSCdzIHNhbXBsZSBzcGFucyBhYm91dCA1IHVuaXRzLCBzbyBhIDItdW5pdFxuICogdGhyZXNob2xkIHJlY29yZHMgYSBwb2ludCBldmVyeSA0MCUgb2YgdGhlIHdheSBhY3Jvc3MgYW5kIGEgZnJlZWhhbmQgUk9JIGNvbWVzIG91dCBhcyBhXG4gKiB0cmlhbmdsZS4gQWdhaW5zdCB0aGUgc2NyZWVuIGl0IGFsc28gZG9lcyB0aGUgcmlnaHQgdGhpbmcgdW5kZXIgem9vbTogZHJhd2luZyB6b29tZWQgaW5cbiAqIHJlY29yZHMgYSBmaW5lciBwYXRoLCBiZWNhdXNlIHRoYXQgaXMgZXhhY3RseSB3aGVuIHRoZSBleHRyYSBkZXRhaWwgaXMgdmlzaWJsZS5cbiAqL1xuY29uc3QgRlJFRUhBTkRfU1RFUF9QWCA9IDI7XG4vKipcbiAqIFNtYWxsZXN0IGNvbW1pdHRlZCByZWN0YW5nbGUsIGluIFNDUkVFTiBwaXhlbHMgb24gZWFjaCBzaWRlLlxuICpcbiAqIEl0cyBqb2IgaXMgdG8gdGhyb3cgYXdheSBhIGNsaWNrIHRoYXQgd2FzIG5vdCBhIGRyYWcuIEhlbGQgaW4gd29ybGQgdW5pdHMg4oCUIHdoaWNoIGl0IHdhc1xuICog4oCUIGl0IGluc3RlYWQgdGhyb3dzIGF3YXkgcmVhbCBkcmFncyBvbiBhbnkgZGF0YXNldCB3aG9zZSB3b3JsZCBpcyBzbWFsbDogaW4gc2VxRklTSCdzXG4gKiB+NSB4IDcgdW5pdCBzYW1wbGUgYSByZWN0YW5nbGUgaGFkIHRvIGNvdmVyIDQwJSBvZiB0aGUgd2lkdGggdG8gY29tbWl0IGF0IGFsbCwgYW5kXG4gKiBhbnl0aGluZyBzbWFsbGVyIHZhbmlzaGVkIHdpdGggbm8gZmVlZGJhY2suIFRoYXQgd2FzIHRoZSBkaXJlY3QgY2F1c2Ugb2YgUk9JcyBiZWluZ1xuICogaW1wb3NzaWJsZSB0byBjcmVhdGUgdGhlcmUuXG4gKi9cbmNvbnN0IE1JTl9SRUNUX0RSQUdfUFggPSAyO1xuLyoqXG4gKiBBIHJ1YmJlciBiYW5kIHNtYWxsZXIgdGhhbiB0aGlzIG9uIGJvdGggc2lkZXMsIGluIFNDUkVFTiBwaXhlbHMsIGlzIGEgY2xpY2sgb24gZW1wdHkgc3BhY2VcbiAqIChpdCBjbGVhcnMgdGhlIHNlbGVjdGlvbikuIFNjcmVlbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHtAbGluayBNSU5fUkVDVF9EUkFHX1BYfTogMyB3b3JsZFxuICogdW5pdHMgaXMgb3ZlciBoYWxmIG9mIHNlcUZJU0gncyBzYW1wbGUuXG4gKi9cbmNvbnN0IE1JTl9NQVJRVUVFX1BYID0gMztcbi8qKiBDbGljay1kaXN0YW5jZSAoc2NyZWVuIHB4KSB3aXRoaW4gd2hpY2ggYSBwb2x5Z29uIGNsaWNrIHNuYXBzIGNsb3NlZCBvbnRvIHRoZSBmaXJzdCB2ZXJ0ZXguICovXG5jb25zdCBDTE9TRV9TTkFQX1BYID0gMTA7XG4vKiogU2NyZWVuLXB4IGhpdCByYWRpdXMgZm9yIGdyYWJiaW5nIGEgdmVydGV4IC8gcmVjdGFuZ2xlIGNvcm5lciBoYW5kbGUuICovXG5jb25zdCBIQU5ETEVfSElUX1BYID0gOTtcbi8qKiBTY3JlZW4tcHggZGlzdGFuY2UgZnJvbSBhbiBvcGVuIHBvbHlsaW5lIHdpdGhpbiB3aGljaCBhIGNsaWNrIHNlbGVjdHMgaXQgKGFzIE9TRCkuICovXG5jb25zdCBPUEVOX1BBVEhfSElUX1BYID0gNjtcblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgdGhlIG5hcGFyaSBWaWV3ZXIgdGhlIG92ZXJsYXkgbmVlZHMgKGNvb3JkIHRyYW5zZm9ybXMgKyBjb250cm9sIGdhdGluZykuXG4gKlxuICogQ09PUkRJTkFURSBTUEFDRVM6IGBjYW52YXNUb1dvcmxkYCB0YWtlcyBDTElFTlQgcGl4ZWxzICh2aWV3cG9ydCBjb29yZGluYXRlcywgYXMgYSBwb2ludGVyXG4gKiBldmVudCdzIGBjbGllbnRYL1lgKSwgZXhhY3RseSBhcyBuYXBhcmktanMgYFZpZXdlci5jYW52YXNUb1dvcmxkYCBkb2VzLiBgY2FudmFzVHJhbnNmb3JtYCBpc1xuICogdGhlIGNhbWVyYSdzIHdvcmxkIOKGkiBDQU5WQVMtTE9DQUwgQ1NTLXBpeGVsIGFmZmluZSwgbmFwYXJpLWpzIGBWaWV3ZXIuY2FudmFzVHJhbnNmb3JtYCwgd2hpY2hcbiAqIHJlYWRzIG5vIGxheW91dDogZHJhd2luZyBhbmQgZm9sbG93aW5nIHRoZSBjYW1lcmEgdXNlIGl0LCBzbyBhIGNhbWVyYSBmcmFtZSBjb3N0cyBvbmVcbiAqIGBtYXRyaXgoLi4uKWAgYW5kIG5vIGBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKWAgKHJldmlldyBOQVBBUkktQk9VTkRBUlktMTApLiBUaGUgc3ZnIGNvdmVycyB0aGVcbiAqIHBsb3QgaG9zdCBhbmQgdGhlIGNhbnZhcyBpcyB0aGUgaG9zdCdzIGluLWZsb3cgY2hpbGQgYXQgaXRzIHRvcC1sZWZ0LCBzbyBjYW52YXMtbG9jYWwgYW5kXG4gKiBzdmctbG9jYWwgcGl4ZWxzIGFyZSB0aGUgc2FtZTsgYSBwb2ludGVyJ3MgY2xpZW50IHBpeGVscyBhcmUgbWFwcGVkIGludG8gdGhlIHN2ZyBieSB0aGVcbiAqIG92ZXJsYXkgaXRzZWxmLlxuICpcbiAqIEV4cG9ydGVkIGJlY2F1c2UgdGhlIDNEIHNwYXRpYWwgbW9kZSBzdXBwbGllcyBhIFNDUkVFTi1TUEFDRSBpbXBsZW1lbnRhdGlvbiBvZiBpdDogdGhlcmUgdGhlXG4gKiBkcmF3biBzaGFwZSBpcyBhIGxhc3NvIGluIGNhbnZhcyBwaXhlbHMsIG5vdCBhIHJlY3RhbmdsZSBpbiBpbWFnZSBzcGFjZSwgc28gXCJ3b3JsZFwiIGlzIHRoZVxuICogY2FudmFzIGl0c2VsZiDigJQgYGNhbnZhc1RvV29ybGRgIGlzIHRoZSBjbGllbnQg4oaSIGNhbnZhcyBvZmZzZXQgYW5kIGBjYW52YXNUcmFuc2Zvcm1gIHRoZVxuICogaWRlbnRpdHkuIFRoYXQgbGV0cyB0aGUgM0QgdmlldyByZXVzZSB0aGlzIHdob2xlIG92ZXJsYXkg4oCUIGV2ZXJ5IHRvb2wsIHRoZSBoYW5kbGVzLCB0aGUgc3RvcmVcbiAqIHJvdW5kLXRyaXAg4oCUIHdpdGggbm8gM0Qtc3BlY2lmaWMgZHJhd2luZyBjb2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJsYXlWaWV3ZXIge1xuICAvKiogQ2xpZW50IHB4IOKGkiB3b3JsZC4gKi9cbiAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gIC8qKiBXb3JsZCDihpIgY2FudmFzLWxvY2FsICg9IHN2Zy1sb2NhbCkgQ1NTIHB4LCBhcyBhbiBTVkcgYWZmaW5lIGBbYSwgYiwgYywgZCwgZSwgZl1gLiAqL1xuICBjYW52YXNUcmFuc2Zvcm0oKTogQWZmaW5lO1xuICBzZXRDb250cm9sc0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQ7XG4gIHJlYWRvbmx5IGNhbWVyYTogeyByZWFkb25seSBjaGFuZ2VkOiB7IGNvbm5lY3QobGlzdGVuZXI6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIH0gfTtcbn1cblxuLyoqXG4gKiBTVkcgcmVnaW9uIG92ZXJsYXkgZm9yIHRoZSBuYXBhcmktanMgV2ViR1BVIGltYWdlIHZpZXcgKGppdC11aSMxMDIpLCBtaXJyb3JpbmcgdGhlIE9TRCBiYWNrZW5kJ3NcbiAqIHtAbGluayBPc2RSZWdpb25PdmVybGF5fSBidXQgZHJpdmVuIGJ5IG5hcGFyaSdzIGBjYW52YXNUb1dvcmxkYC9gY2FudmFzVHJhbnNmb3JtYCB0cmFuc2Zvcm1zXG4gKiAoc2VlIHtAbGluayBPdmVybGF5Vmlld2VyfSBmb3IgdGhlaXIgY29vcmRpbmF0ZSBzcGFjZXMpLlxuICogVmVjdG9yIHNoYXBlcyBhcmUgZHJhd24gaW4gYW4gYWJzb2x1dGVseS1wb3NpdGlvbmVkIGA8c3ZnPmAgb3ZlciB0aGUgY2FudmFzIChubyBuZWVkIHRvIHB1c2hcbiAqIHRoZW0gdGhyb3VnaCBXZWJHUFUpIGJ5IHtAbGluayBOYXBhcmlSZWdpb25TdmdSZW5kZXJlcn0gb3ZlciB0aGUgc2hhcmVkIGBTdmdSZWdpb25SZW5kZXJlcmA6XG4gKiBpbiB3b3JsZCBjb29yZGluYXRlcyBpbnNpZGUgb25lIHRyYW5zZm9ybWVkIGdyb3VwLCByZWJ1aWx0IG9uIGEgcmVnaW9uIG9yIHNlbGVjdGlvbiBjaGFuZ2UsXG4gKiB3aGlsZSBhIGNhbWVyYSBtb3ZlIG9ubHkgcmV3cml0ZXMgdGhlIHRyYW5zZm9ybSAobmFwYXJpLWpzJ3MgYGNhbnZhc1RyYW5zZm9ybWAsIHRoZSBjYW1lcmFcbiAqIGNlbnRyZS96b29tKSBhbmQgdGhlIGZldyBzY3JlZW4tc3BhY2UgaGFuZGxlcyBhbmQgbGFiZWxzLiBUaGlzIGNsYXNzIGlzXG4gKiB0aGUgZ2VzdHVyZSBjb250cm9sbGVyOiBwb2ludGVyIGhhbmRsZXJzLCB0aGUgdG9vbCBtb2RlLCBhbmQgdGhlIGVkaXQvZHJhZnQvbWFycXVlZSBzdGF0ZS5cbiAqIEl0IHdyaXRlcyBjb21wbGV0ZWQgc2hhcGVzIHRvIHRoZSBzaGFyZWQge0BsaW5rIFJlZ2lvblN0b3JlfSAoc28gc2F2ZSAvIHVuZG8gLyBleHBvcnQgd29ya1xuICogaWRlbnRpY2FsbHkgdG8gT1NEKS5cbiAqXG4gKiBTdXBwb3J0cyAoaml0LXVpIzEwMik6IHJlY3RhbmdsZSAvIHBvbHlnb24gLyBmcmVlaGFuZCBwYXRoIGRyYXdpbmcsIGNsaWNrLXNlbGVjdCBhbmQgcnViYmVyLWJhbmRcbiAqIG1hcnF1ZWUgc2VsZWN0LCBwYW4vem9vbSBnYXRpbmcgdmlhIGBzZXRDb250cm9sc0VuYWJsZWRgLCBib2R5IG1vdmUsIHZlcnRleCBtb3ZlL2FkZC9kZWxldGUsXG4gKiBiZXppZXIgaGFuZGxlIGVkaXRpbmcsIGFuZCBkb251dCBob2xlcyAoaW5jbHVkaW5nIGhvbGUgdmVydGV4ICsgaG9sZS1iZXppZXItaGFuZGxlIGVkaXRpbmcpLlxuICogSGl0LXRlc3Rpbmcgc2hhcmVzIGByZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnlgIHdpdGggdGhlIE9TRCBvdmVybGF5LCBzbyBib3RoIGZvbGxvd1xuICogdGhlIHNhbWUgcnVsZXMgKG11bHRpLXBhcnQgcmVnaW9ucywgaG9sZXMsIG9wZW4gcG9seWxpbmVzLCBoYW5kbGUtbGVzcyBiZXppZXIgY3VydmVzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hcGFyaVJlZ2lvbk92ZXJsYXkgaW1wbGVtZW50cyBJUmVnaW9uT3ZlcmxheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ZnOiBTVkdTVkdFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBOYXBhcmlSZWdpb25TdmdSZW5kZXJlcjtcbiAgLyoqIFRoZSBpbWFnZSdzIHJlZ2lvbiBzb3VyY2UsIGRyYXduIHVuZGVyIHRoZSByZWdpb25zIGF0IHRoZSB6b29tJ3MgbGV2ZWwgb2YgZGV0YWlsOyBudWxsXG4gICAqICB3aGVyZSB3b3JsZCBpcyBub3QgdGhlIGltYWdlICh0aGUgM0QgdmlldydzIHNjcmVlbi1zcGFjZSBsYXNzb3MpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZUxheWVyOiBSZWdpb25Tb3VyY2VMYXllciB8IG51bGw7XG4gIC8qKiBDbGllbnQg4oaUIHN2Zy1sb2NhbCDihpQgd29ybGQgY29udmVyc2lvbnMsIHdpdGggdGhlIHN2ZyBvcmlnaW4gcmVhZCBvbmNlIHBlciBnZXN0dXJlL3JlZHJhdy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9qZWN0aW9uOiBPdmVybGF5UHJvamVjdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2Nvbm5lY3RDYW1lcmE6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBtb2RlOiBSZWdpb25Ub29sTW9kZSA9ICdub25lJztcbiAgcHJpdmF0ZSBzZWxlY3RlZDogbnVtYmVyW10gPSBbXTtcblxuICAvKiogSW4tcHJvZ3Jlc3MgZHJhd2luZyBzdGF0ZSAoaW1hZ2Utc3BhY2UpLiAqL1xuICBwcml2YXRlIGRyYWZ0UmVjdDogRHJhZ0JveCB8IG51bGwgPSBudWxsO1xuICAvKiogSW4tcHJvZ3Jlc3MgcnViYmVyLWJhbmQgc2VsZWN0aW9uIG1hcnF1ZWUgKHNlbGVjdCBtb2RlKSwgaW1hZ2Utc3BhY2UuICovXG4gIHByaXZhdGUgbWFycXVlZTogRHJhZ0JveCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWZ0UGF0aDogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gfCBudWxsID0gbnVsbDsgLy8gZnJlZWhhbmQgb3IgY2xpY2sgcG9seWdvblxuICBwcml2YXRlIGRyYXdpbmcgPSBmYWxzZTsgLy8gcG9pbnRlciBpcyBkb3duIGZvciByZWN0IC8gZnJlZWhhbmRcbiAgcHJpdmF0ZSByZWdpb25zVmlzaWJsZSA9IHRydWU7XG5cbiAgLyoqIEluLXByb2dyZXNzIG1hbmlwdWxhdGlvbiAoc2VsZWN0L21vdmUgbW9kZXMpOiBkcmFnZ2luZyBhIGJvZHksIGEgcG9seWdvbiB2ZXJ0ZXgsIG9yIGFcbiAgICogIHJlY3RhbmdsZSBjb3JuZXIuIGBhbmNob3JgIGlzIHRoZSBmaXhlZCBvcHBvc2l0ZSBjb3JuZXIgZm9yIGEgcmVjdGFuZ2xlIHJlc2l6ZS4gKi9cbiAgcHJpdmF0ZSBlZGl0OiBSZWdpb25FZGl0IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjogT3ZlcmxheVZpZXdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBSZWdpb25TdG9yZSxcbiAgICBvcHRzOiB7IHJlZ2lvblNvdXJjZT86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShob3N0KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIGhvc3Quc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRoaXMuc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgJ3N2ZycpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5zdmcuc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgaW5zZXQ6ICcwJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHpJbmRleDogJzIwJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJywgLy8gdW50aWwgYSB0b29sIGFjdGl2YXRlc1xuICAgICAgdG91Y2hBY3Rpb246ICdub25lJyxcbiAgICB9IGFzIFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pO1xuICAgIHRoaXMuaG9zdC5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBOYXBhcmlSZWdpb25TdmdSZW5kZXJlcih0aGlzLnN2ZywgdGhpcy5zdG9yZSk7XG4gICAgdGhpcy5wcm9qZWN0aW9uID0gbmV3IE92ZXJsYXlQcm9qZWN0aW9uKHRoaXMuc3ZnLCB0aGlzLnZpZXdlcik7XG4gICAgdGhpcy5zb3VyY2VMYXllciA9XG4gICAgICBvcHRzLnJlZ2lvblNvdXJjZSA9PT0gZmFsc2UgPyBudWxsIDogbmV3IFJlZ2lvblNvdXJjZUxheWVyKHRoaXMuc3ZnLCB0aGlzLnN0b3JlLmdldFJlZ2lvblNvdXJjZVZpZXckKCkpO1xuXG4gICAgdGhpcy5zdmcuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uUG9pbnRlckRvd24pO1xuICAgIHRoaXMuc3ZnLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICB0aGlzLnN2Zy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICB0aGlzLnN2Zy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJDYW5jZWwpO1xuICAgIHRoaXMuc3ZnLmFkZEV2ZW50TGlzdGVuZXIoJ2xvc3Rwb2ludGVyY2FwdHVyZScsIHRoaXMub25Qb2ludGVyQ2FuY2VsKTtcbiAgICB0aGlzLnN2Zy5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMub25EYmxDbGljayk7XG5cbiAgICB0aGlzLnN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWRyYXcoKSkpO1xuICAgIHRoaXMuc3Vicy5hZGQoXG4gICAgICB0aGlzLnN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpLnN1YnNjcmliZSgoaWR4KSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBpZHggPz8gW107XG4gICAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIC8vIEEgY2FtZXJhIG1vdmUgcmV3cml0ZXMgdGhlIHJlbmRlcmVyJ3MgdHJhbnNmb3JtIGFuZCBpdHMgZmV3IHNjcmVlbi1zcGFjZSBlbGVtZW50cztcbiAgICAvLyB0aGUgcmVnaW9ucyBhcmUgZHJhd24gaW4gd29ybGQgY29vcmRpbmF0ZXMgYW5kIGFyZSBub3QgcmVidWlsdCAoTkFQQVJJLUJPVU5EQVJZLTEwKS5cbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEgPSB0aGlzLnZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMudXBkYXRlQ2FtZXJhKCkpO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbk92ZXJsYXkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcmVnaW9uIHRvb2wgY3VycmVudGx5IG93bnMgdGhlIHBvaW50ZXIuXG4gICAqXG4gICAqIEV4cG9zZWQgc28gdGhlIHNwYXRpYWwgdmlld3MgY2FuIHRlbGwgYSBiYXJlIGNsaWNrIG9uIHRoZSBjbG91ZCAoc2VsZWN0IHRoZVxuICAgKiBjbGFzcyB1bmRlciB0aGUgY3Vyc29yKSBmcm9tIGEgY2xpY2sgdGhhdCBiZWxvbmdzIHRvIGEgZHJhd2luZyBnZXN0dXJlIOKAlFxuICAgKiBwbGFjaW5nIGEgcG9seWdvbiB2ZXJ0ZXggaXMgYWxzbyBhIGNsaWNrIHRoYXQgZG9lcyBub3QgbW92ZSwgYW5kIGl0IG11c3Qgbm90XG4gICAqIGNoYW5nZSB0aGUgc2VsZWN0aW9uIGJlaGluZCB0aGUgc2hhcGUgYmVpbmcgZHJhd24uXG4gICAqL1xuICBnZXQgdG9vbEFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlICE9PSAnbm9uZSc7XG4gIH1cblxuICBzZXRNb2RlKG1vZGU6IFJlZ2lvblRvb2xNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5lbmRHZXN0dXJlKCk7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLmRyYWZ0UmVjdCA9IG51bGw7XG4gICAgdGhpcy5kcmFmdFBhdGggPSBudWxsO1xuICAgIC8vIFRoZSBvdmVybGF5IG93bnMgcG9pbnRlci9uYXZpZ2F0aW9uIGdhdGluZzogd2hpbGUgYSB0b29sIGlzIGFjdGl2ZSBpdCBjYXB0dXJlcyB0aGUgcG9pbnRlclxuICAgIC8vIGFuZCB0aGUgbmFwYXJpIGNhbWVyYSBjb250cm9scyBhcmUgZGlzYWJsZWQ7ICdub25lJyBoYW5kcyB0aGUgcG9pbnRlciBiYWNrIGZvciBwYW4vem9vbS5cbiAgICBjb25zdCBhY3RpdmUgPSBtb2RlICE9PSAnbm9uZSc7XG4gICAgdGhpcy52aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKCFhY3RpdmUpO1xuICAgIHRoaXMuc3ZnLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBhY3RpdmUgPyAnYXV0bycgOiAnbm9uZSc7XG4gICAgdGhpcy5zdmcuc3R5bGUuY3Vyc29yID0gYWN0aXZlID8gJ2Nyb3NzaGFpcicgOiAnZGVmYXVsdCc7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH1cblxuICBzZXRTZWxlY3RlZEJlemllcihiZXppZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uKCk7XG4gICAgaWYgKHNlbD8uaWQgIT0gbnVsbCkgdGhpcy5zdG9yZS5zZXRCZXppZXIoc2VsLmlkLCBiZXppZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBmaW5lbHkgYSBkcmF3biB2ZXJ0ZXggbWF5IGJlIHBsYWNlZCwgaW4gd29ybGQgdW5pdHM6IG9uZSAoYW4gaW1hZ2UncyBwaXhlbHMpIGJ5XG4gICAqIGRlZmF1bHQsIGZpbmVyIGZvciBhIGRhdGFzZXQgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIG5vdCBwaXhlbHMgKHNlZSBPdmVybGF5UHJvamVjdGlvbikuXG4gICAqL1xuICBzZXRXb3JsZFF1YW50dW0ocXVhbnR1bTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wcm9qZWN0aW9uLnNldFdvcmxkUXVhbnR1bShxdWFudHVtKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdmcucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uUG9pbnRlckRvd24pO1xuICAgIHRoaXMuc3ZnLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICB0aGlzLnN2Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICB0aGlzLnN2Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJDYW5jZWwpO1xuICAgIHRoaXMuc3ZnLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvc3Rwb2ludGVyY2FwdHVyZScsIHRoaXMub25Qb2ludGVyQ2FuY2VsKTtcbiAgICB0aGlzLnN2Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMub25EYmxDbGljayk7XG4gICAgdGhpcy5kaXNjb25uZWN0Q2FtZXJhKCk7XG4gICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgLy8gQSBkcmFnIHRvcm4gZG93biBtaWQtZ2VzdHVyZSAoYSBiYWNrZW5kIHN3aXRjaCkgbXVzdCBzdGlsbCBjbG9zZSBpdHMgc3RvcmUgYmF0Y2guXG4gICAgdGhpcy5lbmRHZXN0dXJlKCk7XG4gICAgdGhpcy5zb3VyY2VMYXllcj8uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLnN2Zy5wYXJlbnROb2RlKSB0aGlzLnN2Zy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc3ZnKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBwb2ludGVyIGhhbmRsZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIHJlYWRvbmx5IG9uUG9pbnRlckRvd24gPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ25vbmUnKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucHJvamVjdGlvbi53aXRoT3JpZ2luKCgpID0+IHRoaXMucG9pbnRlckRvd24oZSkpO1xuICB9O1xuXG4gIHByaXZhdGUgcG9pbnRlckRvd24oZTogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgW2l4LCBpeV0gPSB0aGlzLnByb2plY3Rpb24udG9JbWFnZShlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0Jykge1xuICAgICAgdGhpcy5kcmFmdFJlY3QgPSB7IHgwOiBpeCwgeTA6IGl5LCB4MTogaXgsIHkxOiBpeSB9O1xuICAgICAgdGhpcy5kcmF3aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3ZnLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdjbG9zZWRwYXRoJyB8fCB0aGlzLm1vZGUgPT09ICdkcmF3b3BlbnBhdGgnKSB7XG4gICAgICB0aGlzLmRyYWZ0UGF0aCA9IFtbaXgsIGl5XV07XG4gICAgICB0aGlzLmRyYXdpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zdmcuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZHJhd3BvbHlnb24nKSB7XG4gICAgICB0aGlzLmhhbmRsZVBvbHlnb25DbGljayhpeCwgaXksIGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcgfHwgdGhpcy5tb2RlID09PSAnbW92ZScpIHtcbiAgICAgIHRoaXMuYmVnaW5NYW5pcHVsYXRpb24oaXgsIGl5LCBlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2FkZHBvaW50Jykge1xuICAgICAgdGhpcy5oYW5kbGVBZGRQb2ludChpeCwgaXksIGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2RlbGV0ZXBvaW50Jykge1xuICAgICAgdGhpcy5oYW5kbGVEZWxldGVQb2ludChpeCwgaXkpO1xuICAgIH1cbiAgICB0aGlzLnJlZHJhdygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvblBvaW50ZXJNb3ZlID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IFtpeCwgaXldID0gdGhpcy5wcm9qZWN0aW9uLnRvSW1hZ2UoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIGlmICh0aGlzLm1hcnF1ZWUpIHtcbiAgICAgIHRoaXMubWFycXVlZS54MSA9IGl4O1xuICAgICAgdGhpcy5tYXJxdWVlLnkxID0gaXk7XG4gICAgICB0aGlzLnVwZGF0ZU1hcnF1ZWVFbCgpOyAvLyB1cGRhdGUganVzdCB0aGUgbWFycXVlZSByZWN0IOKAlCBOT1QgYSBmdWxsIHJlZ2lvbiByZWRyYXdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZWRpdCkge1xuICAgICAgYXBwbHlSZWdpb25FZGl0KHRoaXMuc3RvcmUsIHRoaXMuZWRpdCwgaXgsIGl5KTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kcmF3aW5nKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZHJhZnRSZWN0KSB7XG4gICAgICB0aGlzLmRyYWZ0UmVjdC54MSA9IGl4O1xuICAgICAgdGhpcy5kcmFmdFJlY3QueTEgPSBpeTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZnRQYXRoKSB7XG4gICAgICBjb25zdCBzdGVwID0gRlJFRUhBTkRfU1RFUF9QWCAqIHRoaXMucHJvamVjdGlvbi53b3JsZFBlckNhbnZhc1BpeGVsKCk7XG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy5kcmFmdFBhdGhbdGhpcy5kcmFmdFBhdGgubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoTWF0aC5hYnMoaXggLSBsYXN0WzBdKSA+PSBzdGVwIHx8IE1hdGguYWJzKGl5IC0gbGFzdFsxXSkgPj0gc3RlcCkge1xuICAgICAgICB0aGlzLmRyYWZ0UGF0aC5wdXNoKFtpeCwgaXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvblBvaW50ZXJVcCA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5tYXJxdWVlKSB7XG4gICAgICBjb25zdCBtID0gdGhpcy5tYXJxdWVlO1xuICAgICAgdGhpcy5tYXJxdWVlID0gbnVsbDtcbiAgICAgIHRoaXMucmVuZGVyZXIuY2xlYXJNYXJxdWVlKCk7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN2Zy5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGFscmVhZHkgcmVsZWFzZWQgKi9cbiAgICAgIH1cbiAgICAgIHRoaXMuZmluaXNoTWFycXVlZShtKTsgLy8gc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMg4oaSIG9uZSByZWRyYXcgdmlhIHRoZSBzZWxlY3Rpb24gc3Vic2NyaXB0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuc3RvcmUuZW5kQmF0Y2goKTtcbiAgICAgIHRoaXMuZWRpdCA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN2Zy5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGFscmVhZHkgcmVsZWFzZWQgKi9cbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kcmF3aW5nKSByZXR1cm47XG4gICAgdGhpcy5kcmF3aW5nID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3ZnLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBjYXB0dXJlIG1heSBhbHJlYWR5IGJlIHJlbGVhc2VkICovXG4gICAgfVxuICAgIGlmICh0aGlzLmRyYWZ0UmVjdCkge1xuICAgICAgY29uc3QgeyB4MCwgeTAsIHgxLCB5MSB9ID0gdGhpcy5kcmFmdFJlY3Q7XG4gICAgICBjb25zdCB4ID0gTWF0aC5taW4oeDAsIHgxKTtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLm1pbih5MCwgeTEpO1xuICAgICAgY29uc3QgdyA9IE1hdGguYWJzKHgxIC0geDApO1xuICAgICAgY29uc3QgaCA9IE1hdGguYWJzKHkxIC0geTApO1xuICAgICAgdGhpcy5kcmFmdFJlY3QgPSBudWxsO1xuICAgICAgY29uc3QgbWluID0gTUlOX1JFQ1RfRFJBR19QWCAqIHRoaXMucHJvamVjdGlvbi53b3JsZFBlckNhbnZhc1BpeGVsKCk7XG4gICAgICBpZiAodyA+PSBtaW4gJiYgaCA+PSBtaW4pIHRoaXMuY29tbWl0UmVjdGFuZ2xlKHgsIHksIHcsIGgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kcmFmdFBhdGgpIHtcbiAgICAgIGNvbnN0IHB0cyA9IHRoaXMuZHJhZnRQYXRoO1xuICAgICAgdGhpcy5kcmFmdFBhdGggPSBudWxsO1xuICAgICAgY29uc3QgY2xvc2VkID0gdGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnO1xuICAgICAgaWYgKHB0cy5sZW5ndGggPj0gKGNsb3NlZCA/IDMgOiAyKSkgdGhpcy5jb21taXRQb2x5Z29uKHB0cywgY2xvc2VkKTtcbiAgICB9XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIHBvaW50ZXIgZ2VzdHVyZSBlbmRlZCB3aXRob3V0IGEgcG9pbnRlcnVwICh0aGUgYnJvd3NlciBjYW5jZWxsZWQgaXQsIG9yIGNhcHR1cmUgd2FzXG4gICAqIGxvc3QpOiBlbmQgaXQgd2l0aG91dCBjb21taXR0aW5nLiBBbHNvIGZpcmVzIGFmdGVyIGV2ZXJ5IG5vcm1hbCByZWxlYXNlLCB3aGVuIG5vdGhpbmdcbiAgICogaXMgbGl2ZSBhbnkgbW9yZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qb2ludGVyQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5lZGl0ICYmICF0aGlzLmRyYXdpbmcgJiYgIXRoaXMubWFycXVlZSkgcmV0dXJuO1xuICAgIHRoaXMuZW5kR2VzdHVyZSgpO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuZCB3aGF0ZXZlciBwb2ludGVyIGdlc3R1cmUgaXMgbGl2ZSB3aXRob3V0IGNvbW1pdHRpbmcgaXQ6IGNsb3NlIHRoZSBzdG9yZSBiYXRjaCBhIGRyYWdcbiAgICogb3BlbmVkIChzbyBsYXRlciBlZGl0cyBhcmUgZW1pdHRlZCBhZ2FpbikgYW5kIGZvcmdldCB0aGUgZHJhZyAoc28gYSBiYXJlIGhvdmVyIG5vIGxvbmdlclxuICAgKiBtb3ZlcyB0aGUgcmVnaW9uKSwgYW5kIGRyb3AgdGhlIG1hcnF1ZWUgYW5kIGEgcmVjdGFuZ2xlL2ZyZWVoYW5kIGRyYWZ0LiBBIGNsaWNrLXBsYWNlZFxuICAgKiBwb2x5Z29uIGlzIG5vdCBhIHBvaW50ZXIgZ2VzdHVyZSBhbmQgc3Vydml2ZXMuXG4gICAqL1xuICBwcml2YXRlIGVuZEdlc3R1cmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdCkgdGhpcy5zdG9yZS5lbmRCYXRjaCgpO1xuICAgIHRoaXMuZWRpdCA9IG51bGw7XG4gICAgaWYgKHRoaXMuZHJhd2luZykge1xuICAgICAgdGhpcy5kcmFmdFJlY3QgPSBudWxsO1xuICAgICAgdGhpcy5kcmFmdFBhdGggPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmRyYXdpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcnF1ZWUgPSBudWxsO1xuICAgIHRoaXMucmVuZGVyZXIuY2xlYXJNYXJxdWVlKCk7XG4gIH1cblxuICAvKiogQ2xpY2stdG8tcGxhY2UgcG9seWdvbjogYWRkIGEgdmVydGV4LCBvciBjbG9zZSB3aGVuIGNsaWNraW5nIG5lYXIgdGhlIGZpcnN0IG9uZS4gKi9cbiAgcHJpdmF0ZSBoYW5kbGVQb2x5Z29uQ2xpY2soaXg6IG51bWJlciwgaXk6IG51bWJlciwgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZnRQYXRoKSB7XG4gICAgICB0aGlzLmRyYWZ0UGF0aCA9IFtbaXgsIGl5XV07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5lYXIgPVxuICAgICAgdGhpcy5wcm9qZWN0aW9uLnNjcmVlbkRpc3QoY2xpZW50WCwgY2xpZW50WSwgdGhpcy5kcmFmdFBhdGhbMF1bMF0sIHRoaXMuZHJhZnRQYXRoWzBdWzFdKSA8PSBDTE9TRV9TTkFQX1BYICYmXG4gICAgICB0aGlzLmRyYWZ0UGF0aC5sZW5ndGggPj0gMztcbiAgICBpZiAobmVhcikge1xuICAgICAgY29uc3QgcHRzID0gdGhpcy5kcmFmdFBhdGg7XG4gICAgICB0aGlzLmRyYWZ0UGF0aCA9IG51bGw7XG4gICAgICB0aGlzLmNvbW1pdFBvbHlnb24ocHRzLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcmFmdFBhdGgucHVzaChbaXgsIGl5XSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkRibENsaWNrID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnZHJhd3BvbHlnb24nIHx8ICF0aGlzLmRyYWZ0UGF0aCkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBwdHMgPSB0aGlzLmRyYWZ0UGF0aDtcbiAgICB0aGlzLmRyYWZ0UGF0aCA9IG51bGw7XG4gICAgaWYgKHB0cy5sZW5ndGggPj0gMykgdGhpcy5jb21taXRQb2x5Z29uKHB0cywgdHJ1ZSk7XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfTtcblxuICAvKiogVGhlIGN1cnJlbnRseS1zZWxlY3RlZCByZWdpb24gKHNpbmdsZSBzZWxlY3Rpb24pLCBvciBudWxsLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkUmVnaW9uKCk6IFJlZ2lvbiB8IG51bGwge1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBpID0gdGhpcy5zZWxlY3RlZFswXTtcbiAgICByZXR1cm4gaSAhPSBudWxsICYmIGkgPj0gMCAmJiBpIDwgcmVnaW9ucy5sZW5ndGggPyByZWdpb25zW2ldIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIHNlbGVjdC9tb3ZlIGludGVyYWN0aW9uOiBncmFiIGEgaGFuZGxlIChyZWN0YW5nbGUgY29ybmVyKSBvciB2ZXJ0ZXggb2YgdGhlIGFscmVhZHktXG4gICAqIHNlbGVjdGVkIHJlZ2lvbiBmaXJzdDsgb3RoZXJ3aXNlIHNlbGVjdCB0aGUgdG9wbW9zdCByZWdpb24gdW5kZXIgdGhlIGN1cnNvciBhbmQgZHJhZyBpdHMgYm9keS5cbiAgICovXG4gIHByaXZhdGUgYmVnaW5NYW5pcHVsYXRpb24oaXg6IG51bWJlciwgaXk6IG51bWJlciwgZTogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbigpO1xuICAgIGlmIChzZWw/LmJvdW5kcykge1xuICAgICAgY29uc3QgW2x4LCBseV0gPSB0aGlzLnByb2plY3Rpb24uY2xpZW50VG9Mb2NhbChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgICBjb25zdCBncmFiID0gaGl0SGFuZGxlKHNlbCwgbHgsIGx5LCB0aGlzLnByb2plY3Rpb24udG9TY3JlZW4sIEhBTkRMRV9ISVRfUFgpO1xuICAgICAgaWYgKGdyYWIpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5iZWdpbkJhdGNoKCk7XG4gICAgICAgIHRoaXMuZWRpdCA9IHsgLi4uZ3JhYiwgaWQ6IHNlbC5pZCwgbGFzdDogW2l4LCBpeV0gfTtcbiAgICAgICAgdGhpcy5zdmcuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhpdC10ZXN0IGJvZGllcywgdG9wbW9zdCBmaXJzdCAobGFzdCBkcmF3biByZW5kZXJzIG9uIHRvcCksIGF0IHRoZSBleGFjdCBwb2ludGVyXG4gICAgLy8gcG9zaXRpb24g4oCUIHNuYXBwaW5nIGlzIGZvciBwbGFjaW5nIHZlcnRpY2VzLCBub3QgZm9yIHBpY2tpbmcuXG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IFt3eCwgd3ldID0gdGhpcy5wcm9qZWN0aW9uLnRvV29ybGQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIGZvciAobGV0IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodGhpcy5zdG9yZS5pc0NsYXNzSGlkZGVuKHJlZ2lvbnNbaV0ubGFiZWwpKSBjb250aW51ZTtcbiAgICAgIGlmIChyZWdpb25Db250YWlucyhyZWdpb25zW2ldLCB3eCwgd3ksIHsgdG9TY3JlZW46IHRoaXMucHJvamVjdGlvbi50b1NjcmVlbiwgdG9sUHg6IE9QRU5fUEFUSF9ISVRfUFggfSkpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uc1tpXSk7XG4gICAgICAgIHRoaXMuc3RvcmUuYmVnaW5CYXRjaCgpO1xuICAgICAgICB0aGlzLmVkaXQgPSB7IGtpbmQ6ICdib2R5JywgaWQ6IHJlZ2lvbnNbaV0uaWQsIGxhc3Q6IFtpeCwgaXldIH07XG4gICAgICAgIHRoaXMuc3ZnLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBIGZlYXR1cmUgb2YgdGhlIHJlZ2lvbiBzb3VyY2U6IHRha2UgaXQgaW50byB0aGUgcmVnaW9ucyBhbmQgc2VsZWN0IGl0IChhIGRyYWcgb24gaXRcbiAgICAvLyBtb3ZlcyBpdCBvbmNlIGl0IGlzIHNlbGVjdGVkKS5cbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5zb3VyY2VMYXllcj8uZmVhdHVyZUF0KHd4LCB3eSwgT1BFTl9QQVRIX0hJVF9QWCk7XG4gICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgIHZvaWQgdGhpcy5zdG9yZS5zZWxlY3RTb3VyY2VGZWF0dXJlcyhbZmVhdHVyZS5pZF0sIGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEVtcHR5IHNwYWNlOiBpbiBzZWxlY3QgbW9kZSBzdGFydCBhIHJ1YmJlci1iYW5kIG1hcnF1ZWUgKHNlbGVjdHMgdGhlIHJlZ2lvbnMgaXQgY292ZXJzIG9uXG4gICAgLy8gcmVsZWFzZSk7IGluIG1vdmUgbW9kZSBqdXN0IGNsZWFyIHRoZSBzZWxlY3Rpb24uXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIHRoaXMubWFycXVlZSA9IHsgeDA6IGl4LCB5MDogaXksIHgxOiBpeCwgeTE6IGl5IH07XG4gICAgICB0aGlzLnVwZGF0ZU1hcnF1ZWVFbCgpO1xuICAgICAgdGhpcy5zdmcuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKFtdKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdyB0aGUgbWFycXVlZSB3aGVyZSBpdCBpcyBub3cgKG9ubHkgdGhlIG1hcnF1ZWUgZWxlbWVudDogbm8gZnVsbCByZWdpb24gcmVkcmF3KS4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVNYXJxdWVlRWwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hcnF1ZWUpIHJldHVybjtcbiAgICBjb25zdCB7IHgwLCB5MCwgeDEsIHkxIH0gPSB0aGlzLm1hcnF1ZWU7XG4gICAgY29uc3QgW2x4LCBseV0gPSB0aGlzLnByb2plY3Rpb24udG9Mb2NhbChNYXRoLm1pbih4MCwgeDEpLCBNYXRoLm1pbih5MCwgeTEpKTtcbiAgICBjb25zdCBbcngsIHJ5XSA9IHRoaXMucHJvamVjdGlvbi50b0xvY2FsKE1hdGgubWF4KHgwLCB4MSksIE1hdGgubWF4KHkwLCB5MSkpO1xuICAgIHRoaXMucmVuZGVyZXIuc2hvd01hcnF1ZWUobHgsIGx5LCByeCwgcnkpO1xuICB9XG5cbiAgLyoqIGFkZHBvaW50IG1vZGU6IGluc2VydCBhIHZlcnRleCBhdCB0aGUgY2xpY2sgb24gdGhlIHNlbGVjdGVkIHBvbHlnb24ncyBuZWFyZXN0IGVkZ2VcbiAgICogIChleHRlcmlvciBvciBhIGhvbGUgcmluZykuICovXG4gIHByaXZhdGUgaGFuZGxlQWRkUG9pbnQoaXg6IG51bWJlciwgaXk6IG51bWJlciwgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uKCk7XG4gICAgaWYgKCFzZWwpIHJldHVybjtcbiAgICBjb25zdCBbbHgsIGx5XSA9IHRoaXMucHJvamVjdGlvbi5jbGllbnRUb0xvY2FsKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGNvbnN0IGVkZ2UgPSBuZWFyZXN0RWRnZShzZWwsIGx4LCBseSwgdGhpcy5wcm9qZWN0aW9uLnRvU2NyZWVuKTtcbiAgICBpZiAoIWVkZ2UpIHJldHVybjtcbiAgICBpZiAoZWRnZS5yaW5nIDwgMCkgdGhpcy5zdG9yZS5hZGRWZXJ0ZXgoc2VsLmlkLCBlZGdlLnNlZ0luZGV4LCBpeCwgaXkpO1xuICAgIGVsc2UgdGhpcy5zdG9yZS5hZGRIb2xlVmVydGV4KHNlbC5pZCwgZWRnZS5yaW5nLCBlZGdlLnNlZ0luZGV4LCBpeCwgaXkpO1xuICB9XG5cbiAgLyoqIGRlbGV0ZXBvaW50IG1vZGU6IHJlbW92ZSB0aGUgc2VsZWN0ZWQgcG9seWdvbidzIHZlcnRleCBuZWFyZXN0IHRoZSBjbGljayAoZXh0ZXJpb3Igb3IgYVxuICAgKiAgaG9sZSByaW5nKS4gKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGVQb2ludChpeDogbnVtYmVyLCBpeTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbigpO1xuICAgIGlmICghc2VsKSByZXR1cm47XG4gICAgY29uc3QgdiA9IG5lYXJlc3RWZXJ0ZXgoc2VsLCBpeCwgaXkpO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh2LnJpbmcgPCAwKSB0aGlzLnN0b3JlLmRlbGV0ZVZlcnRleChzZWwuaWQsIHYuaW5kZXgpO1xuICAgIGVsc2UgdGhpcy5zdG9yZS5kZWxldGVIb2xlVmVydGV4KHNlbC5pZCwgdi5yaW5nLCB2LmluZGV4KTtcbiAgfVxuXG4gIC8qKiBGaW5hbGl6ZSBhIHJ1YmJlci1iYW5kIG1hcnF1ZWU6IHNlbGVjdCBldmVyeSByZWdpb24gd2hvc2UgYm91bmRpbmcgYm94IGl0IG92ZXJsYXBzIChhXG4gICAqICBtYXJxdWVlIHVuZGVyIHtAbGluayBNSU5fTUFSUVVFRV9QWH0gaXMgYSBjbGljayBvbiBlbXB0eSBzcGFjZSDihpIgY2xlYXIgdGhlIHNlbGVjdGlvbikuICovXG4gIHByaXZhdGUgZmluaXNoTWFycXVlZShtOiBEcmFnQm94KTogdm9pZCB7XG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbihtLngwLCBtLngxKTtcbiAgICBjb25zdCB4MSA9IE1hdGgubWF4KG0ueDAsIG0ueDEpO1xuICAgIGNvbnN0IHkwID0gTWF0aC5taW4obS55MCwgbS55MSk7XG4gICAgY29uc3QgeTEgPSBNYXRoLm1heChtLnkwLCBtLnkxKTtcbiAgICBjb25zdCBtaW4gPSBNSU5fTUFSUVVFRV9QWCAqIHRoaXMucHJvamVjdGlvbi53b3JsZFBlckNhbnZhc1BpeGVsKCk7XG4gICAgaWYgKHgxIC0geDAgPCBtaW4gJiYgeTEgLSB5MCA8IG1pbikge1xuICAgICAgdGhpcy5zdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhbXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKFxuICAgICAgcmVnaW9uc0luUmVjdChyZWdpb25zLCB4MCwgeTAsIHgxLCB5MSwge1xuICAgICAgICBza2lwUHJvZmlsZXM6IHRydWUsXG4gICAgICAgIHNraXA6IChyKSA9PiB0aGlzLnN0b3JlLmlzQ2xhc3NIaWRkZW4oci5sYWJlbCksXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5zb3VyY2VMYXllcj8uZmVhdHVyZXNJblJlY3QoeDAsIHkwLCB4MSwgeTEpID8/IFtdO1xuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgIHZvaWQgdGhpcy5zdG9yZS5zZWxlY3RTb3VyY2VGZWF0dXJlcyhcbiAgICAgICAgZmVhdHVyZXMuc2xpY2UoMCwgU09VUkNFX01BUlFVRUVfTElNSVQpLm1hcCgoZikgPT4gZi5pZCksXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBzaGFwZSBjb21taXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgY29tbWl0UmVjdGFuZ2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgcmVjdC54ID0geDtcbiAgICByZWN0LnkgPSB5O1xuICAgIHJlY3Qud2lkdGggPSB3aWR0aDtcbiAgICByZWN0LmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmJvdW5kcyA9IHJlY3Q7XG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5zdG9yZS5hZGRSZWdpb24ocmVnaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbWl0UG9seWdvbihwb2ludHM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LCBjbG9zZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBwb2x5ID0gbmV3IFBvbHlnb24oKTtcbiAgICBwb2x5Lm5wb2ludHMgPSBwb2ludHMubGVuZ3RoO1xuICAgIHBvbHkueHBvaW50cyA9IHBvaW50cy5tYXAoKHApID0+IHBbMF0pO1xuICAgIHBvbHkueXBvaW50cyA9IHBvaW50cy5tYXAoKHApID0+IHBbMV0pO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSBwb2ludHMubWFwKChwKSA9PiBbcFswXSwgcFsxXV0pO1xuICAgIHBvbHkuY2xvc2VkID0gY2xvc2VkO1xuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gcG9seTtcbiAgICByZWdpb24uY29sb3IgPSB0aGlzLnN0b3JlLmdldFNoYXBlQ29sb3IoKTtcbiAgICByZWdpb24ubGFiZWwgPSAnUmVnaW9uJztcbiAgICB0aGlzLnN0b3JlLmFkZFJlZ2lvbihyZWdpb24pO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlbmRlcmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgZHJhd24gcmVnaW9ucy4gQSByZWdpb24gYmVpbmcgZHJhd24gc3RheXMgdmlzaWJsZSBlaXRoZXIgd2F5LiAqL1xuICBzZXRSZWdpb25zVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHZpc2libGUgPT09IHRoaXMucmVnaW9uc1Zpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnJlZ2lvbnNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICB0aGlzLnNvdXJjZUxheWVyPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cblxuICAvKiogRm9sbG93IGEgY2FtZXJhIG1vdmU6IG9uZSB0cmFuc2Zvcm0gYXR0cmlidXRlIHBsdXMgdGhlIHNjcmVlbi1zcGFjZSBlbGVtZW50cy4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVDYW1lcmEoKTogdm9pZCB7XG4gICAgY29uc3QgYWZmaW5lID0gdGhpcy5wcm9qZWN0aW9uLmFmZmluZSgpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2FtZXJhKGFmZmluZSk7XG4gICAgdGhpcy5zb3VyY2VMYXllcj8uc2V0Q2FtZXJhKGFmZmluZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBldmVyeSBlbGVtZW50IGZyb20gdGhlIHN0b3JlOiB0aGUgcmVnaW9ucyBpbiB3b3JsZCBjb29yZGluYXRlcyAob25lIHRyYW5zZm9ybWVkXG4gICAqIGdyb3VwKSwgdGhlaXIgbGFiZWxzLCBhbmQgdGhlIG92ZXJsYXkuIFJlYWRzIG5vIGxheW91dDogdGhlIGNhbWVyYSBhZmZpbmUgaXMgdGhlIHZpZXdlcidzLlxuICAgKi9cbiAgcmVkcmF3KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ2FtZXJhKCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5yZWdpb25zVmlzaWJsZSA/IHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpIDogW10sIHRoaXMuc2VsZWN0ZWQpO1xuICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIHNjcmVlbi1zcGFjZSBvdmVybGF5IG9ubHk6IHRoZSBzZWxlY3RlZCByZWdpb25zJyBoYW5kbGVzIGFuZCB0aGUgZHJhZnQuICovXG4gIHByaXZhdGUgcmVuZGVyT3ZlcmxheSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlck92ZXJsYXkodGhpcy5yZWdpb25zVmlzaWJsZSA/IHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpIDogW10sIHRoaXMuc2VsZWN0ZWQsIHtcbiAgICAgIHJlY3Q6IHRoaXMuZHJhZnRSZWN0LFxuICAgICAgcGF0aDogdGhpcy5kcmFmdFBhdGgsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
520
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXJlZ2lvbi1vdmVybGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS1yZWdpb24tb3ZlcmxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRW5HLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBQ2QsYUFBYSxHQUNkLE1BQU0sc0NBQXNDLENBQUM7QUFFOUMsT0FBTyxFQUFXLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDeEUsT0FBTyxFQUFjLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTNFLE1BQU0sTUFBTSxHQUFHLDRCQUE0QixDQUFDO0FBQzVDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0I7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixrR0FBa0c7QUFDbEcsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLDRFQUE0RTtBQUM1RSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIseUZBQXlGO0FBQ3pGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBNkIzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFB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QUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUM3RixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDcEIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSwgUmVnaW9uVG9vbE1vZGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVnaW9uLCBSZWN0YW5nbGUsIFBvbHlnb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHR5cGUgeyBBZmZpbmUgfSBmcm9tICcuLi8uLi9yZWdpb24tb3ZlcmxheS9zdmctcmVnaW9uLXJlbmRlcmVyJztcbmltcG9ydCB7IFJlZ2lvblNvdXJjZUxheWVyLCBTT1VSQ0VfTUFSUVVFRV9MSU1JVCB9IGZyb20gJy4uLy4uL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zb3VyY2UtbGF5ZXInO1xuXG5pbXBvcnQge1xuICBoaXRIYW5kbGUsXG4gIG5lYXJlc3RFZGdlLFxuICBuZWFyZXN0VmVydGV4LFxuICByZWdpb25Db250YWlucyxcbiAgcmVnaW9uc0luUmVjdCxcbn0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWdlb21ldHJ5JztcblxuaW1wb3J0IHsgRHJhZ0JveCwgTmFwYXJpUmVnaW9uU3ZnUmVuZGVyZXIgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdmctcmVuZGVyZXInO1xuaW1wb3J0IHsgT3ZlcmxheVByb2plY3Rpb24gfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L292ZXJsYXktcHJvamVjdGlvbic7XG5pbXBvcnQgeyBSZWdpb25FZGl0LCBhcHBseVJlZ2lvbkVkaXQgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1lZGl0JztcblxuY29uc3QgU1ZHX05TID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbi8qKlxuICogTWluIGRyYWcgYmVmb3JlIGEgZnJlZWhhbmQgcGF0aCByZWNvcmRzIGFub3RoZXIgcG9pbnQsIGluIFNDUkVFTiBwaXhlbHMuXG4gKlxuICogU2NyZWVuIHJhdGhlciB0aGFuIHdvcmxkLCB3aGljaCBpcyB3aGF0IFwiMiBpbWFnZSBweFwiIGFsd2F5cyBtZWFudCBpbiBwcmFjdGljZTogYXQgMTAwJVxuICogem9vbSBvdmVyIGFuIGltYWdlIHRoZSB0d28gYXJlIHRoZSBzYW1lIHRoaW5nLiBUYWtlbiBhcyB3b3JsZCB1bml0cyBpdCBicmVha3Mgb24gYW55XG4gKiBkYXRhc2V0IHdob3NlIHdvcmxkIGlzIHNtYWxsIOKAlCBzZXFGSVNIJ3Mgc2FtcGxlIHNwYW5zIGFib3V0IDUgdW5pdHMsIHNvIGEgMi11bml0XG4gKiB0aHJlc2hvbGQgcmVjb3JkcyBhIHBvaW50IGV2ZXJ5IDQwJSBvZiB0aGUgd2F5IGFjcm9zcyBhbmQgYSBmcmVlaGFuZCBST0kgY29tZXMgb3V0IGFzIGFcbiAqIHRyaWFuZ2xlLiBBZ2FpbnN0IHRoZSBzY3JlZW4gaXQgYWxzbyBkb2VzIHRoZSByaWdodCB0aGluZyB1bmRlciB6b29tOiBkcmF3aW5nIHpvb21lZCBpblxuICogcmVjb3JkcyBhIGZpbmVyIHBhdGgsIGJlY2F1c2UgdGhhdCBpcyBleGFjdGx5IHdoZW4gdGhlIGV4dHJhIGRldGFpbCBpcyB2aXNpYmxlLlxuICovXG5jb25zdCBGUkVFSEFORF9TVEVQX1BYID0gMjtcbi8qKlxuICogU21hbGxlc3QgY29tbWl0dGVkIHJlY3RhbmdsZSwgaW4gU0NSRUVOIHBpeGVscyBvbiBlYWNoIHNpZGUuXG4gKlxuICogSXRzIGpvYiBpcyB0byB0aHJvdyBhd2F5IGEgY2xpY2sgdGhhdCB3YXMgbm90IGEgZHJhZy4gSGVsZCBpbiB3b3JsZCB1bml0cyDigJQgd2hpY2ggaXQgd2FzXG4gKiDigJQgaXQgaW5zdGVhZCB0aHJvd3MgYXdheSByZWFsIGRyYWdzIG9uIGFueSBkYXRhc2V0IHdob3NlIHdvcmxkIGlzIHNtYWxsOiBpbiBzZXFGSVNIJ3NcbiAqIH41IHggNyB1bml0IHNhbXBsZSBhIHJlY3RhbmdsZSBoYWQgdG8gY292ZXIgNDAlIG9mIHRoZSB3aWR0aCB0byBjb21taXQgYXQgYWxsLCBhbmRcbiAqIGFueXRoaW5nIHNtYWxsZXIgdmFuaXNoZWQgd2l0aCBubyBmZWVkYmFjay4gVGhhdCB3YXMgdGhlIGRpcmVjdCBjYXVzZSBvZiBST0lzIGJlaW5nXG4gKiBpbXBvc3NpYmxlIHRvIGNyZWF0ZSB0aGVyZS5cbiAqL1xuY29uc3QgTUlOX1JFQ1RfRFJBR19QWCA9IDI7XG4vKipcbiAqIEEgcnViYmVyIGJhbmQgc21hbGxlciB0aGFuIHRoaXMgb24gYm90aCBzaWRlcywgaW4gU0NSRUVOIHBpeGVscywgaXMgYSBjbGljayBvbiBlbXB0eSBzcGFjZVxuICogKGl0IGNsZWFycyB0aGUgc2VsZWN0aW9uKS4gU2NyZWVuIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIE1JTl9SRUNUX0RSQUdfUFh9OiAzIHdvcmxkXG4gKiB1bml0cyBpcyBvdmVyIGhhbGYgb2Ygc2VxRklTSCdzIHNhbXBsZS5cbiAqL1xuY29uc3QgTUlOX01BUlFVRUVfUFggPSAzO1xuLyoqIENsaWNrLWRpc3RhbmNlIChzY3JlZW4gcHgpIHdpdGhpbiB3aGljaCBhIHBvbHlnb24gY2xpY2sgc25hcHMgY2xvc2VkIG9udG8gdGhlIGZpcnN0IHZlcnRleC4gKi9cbmNvbnN0IENMT1NFX1NOQVBfUFggPSAxMDtcbi8qKiBTY3JlZW4tcHggaGl0IHJhZGl1cyBmb3IgZ3JhYmJpbmcgYSB2ZXJ0ZXggLyByZWN0YW5nbGUgY29ybmVyIGhhbmRsZS4gKi9cbmNvbnN0IEhBTkRMRV9ISVRfUFggPSA5O1xuLyoqIFNjcmVlbi1weCBkaXN0YW5jZSBmcm9tIGFuIG9wZW4gcG9seWxpbmUgd2l0aGluIHdoaWNoIGEgY2xpY2sgc2VsZWN0cyBpdCAoYXMgT1NEKS4gKi9cbmNvbnN0IE9QRU5fUEFUSF9ISVRfUFggPSA2O1xuXG4vKipcbiAqIFRoZSBzbGljZSBvZiB0aGUgbmFwYXJpIFZpZXdlciB0aGUgb3ZlcmxheSBuZWVkcyAoY29vcmQgdHJhbnNmb3JtcyArIGNvbnRyb2wgZ2F0aW5nKS5cbiAqXG4gKiBDT09SRElOQVRFIFNQQUNFUzogYGNhbnZhc1RvV29ybGRgIHRha2VzIENMSUVOVCBwaXhlbHMgKHZpZXdwb3J0IGNvb3JkaW5hdGVzLCBhcyBhIHBvaW50ZXJcbiAqIGV2ZW50J3MgYGNsaWVudFgvWWApLCBleGFjdGx5IGFzIG5hcGFyaS1qcyBgVmlld2VyLmNhbnZhc1RvV29ybGRgIGRvZXMuIGBjYW52YXNUcmFuc2Zvcm1gIGlzXG4gKiB0aGUgY2FtZXJhJ3Mgd29ybGQg4oaSIENBTlZBUy1MT0NBTCBDU1MtcGl4ZWwgYWZmaW5lLCBuYXBhcmktanMgYFZpZXdlci5jYW52YXNUcmFuc2Zvcm1gLCB3aGljaFxuICogcmVhZHMgbm8gbGF5b3V0OiBkcmF3aW5nIGFuZCBmb2xsb3dpbmcgdGhlIGNhbWVyYSB1c2UgaXQsIHNvIGEgY2FtZXJhIGZyYW1lIGNvc3RzIG9uZVxuICogYG1hdHJpeCguLi4pYCBhbmQgbm8gYGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpYCAocmV2aWV3IE5BUEFSSS1CT1VOREFSWS0xMCkuIFRoZSBzdmcgY292ZXJzIHRoZVxuICogcGxvdCBob3N0IGFuZCB0aGUgY2FudmFzIGlzIHRoZSBob3N0J3MgaW4tZmxvdyBjaGlsZCBhdCBpdHMgdG9wLWxlZnQsIHNvIGNhbnZhcy1sb2NhbCBhbmRcbiAqIHN2Zy1sb2NhbCBwaXhlbHMgYXJlIHRoZSBzYW1lOyBhIHBvaW50ZXIncyBjbGllbnQgcGl4ZWxzIGFyZSBtYXBwZWQgaW50byB0aGUgc3ZnIGJ5IHRoZVxuICogb3ZlcmxheSBpdHNlbGYuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSB0aGUgM0Qgc3BhdGlhbCBtb2RlIHN1cHBsaWVzIGEgU0NSRUVOLVNQQUNFIGltcGxlbWVudGF0aW9uIG9mIGl0OiB0aGVyZSB0aGVcbiAqIGRyYXduIHNoYXBlIGlzIGEgbGFzc28gaW4gY2FudmFzIHBpeGVscywgbm90IGEgcmVjdGFuZ2xlIGluIGltYWdlIHNwYWNlLCBzbyBcIndvcmxkXCIgaXMgdGhlXG4gKiBjYW52YXMgaXRzZWxmIOKAlCBgY2FudmFzVG9Xb3JsZGAgaXMgdGhlIGNsaWVudCDihpIgY2FudmFzIG9mZnNldCBhbmQgYGNhbnZhc1RyYW5zZm9ybWAgdGhlXG4gKiBpZGVudGl0eS4gVGhhdCBsZXRzIHRoZSAzRCB2aWV3IHJldXNlIHRoaXMgd2hvbGUgb3ZlcmxheSDigJQgZXZlcnkgdG9vbCwgdGhlIGhhbmRsZXMsIHRoZSBzdG9yZVxuICogcm91bmQtdHJpcCDigJQgd2l0aCBubyAzRC1zcGVjaWZpYyBkcmF3aW5nIGNvZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcmxheVZpZXdlciB7XG4gIC8qKiBDbGllbnQgcHgg4oaSIHdvcmxkLiAqL1xuICBjYW52YXNUb1dvcmxkKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXTtcbiAgLyoqIFdvcmxkIOKGkiBjYW52YXMtbG9jYWwgKD0gc3ZnLWxvY2FsKSBDU1MgcHgsIGFzIGFuIFNWRyBhZmZpbmUgYFthLCBiLCBjLCBkLCBlLCBmXWAuICovXG4gIGNhbnZhc1RyYW5zZm9ybSgpOiBBZmZpbmU7XG4gIHNldENvbnRyb2xzRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZDtcbiAgcmVhZG9ubHkgY2FtZXJhOiB7IHJlYWRvbmx5IGNoYW5nZWQ6IHsgY29ubmVjdChsaXN0ZW5lcjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQgfSB9O1xufVxuXG4vKipcbiAqIFNWRyByZWdpb24gb3ZlcmxheSBmb3IgdGhlIG5hcGFyaS1qcyBXZWJHUFUgaW1hZ2UgdmlldyAoaml0LXVpIzEwMiksIG1pcnJvcmluZyB0aGUgT1NEIGJhY2tlbmQnc1xuICoge0BsaW5rIE9zZFJlZ2lvbk92ZXJsYXl9IGJ1dCBkcml2ZW4gYnkgbmFwYXJpJ3MgYGNhbnZhc1RvV29ybGRgL2BjYW52YXNUcmFuc2Zvcm1gIHRyYW5zZm9ybXNcbiAqIChzZWUge0BsaW5rIE92ZXJsYXlWaWV3ZXJ9IGZvciB0aGVpciBjb29yZGluYXRlIHNwYWNlcykuXG4gKiBWZWN0b3Igc2hhcGVzIGFyZSBkcmF3biBpbiBhbiBhYnNvbHV0ZWx5LXBvc2l0aW9uZWQgYDxzdmc+YCBvdmVyIHRoZSBjYW52YXMgKG5vIG5lZWQgdG8gcHVzaFxuICogdGhlbSB0aHJvdWdoIFdlYkdQVSkgYnkge0BsaW5rIE5hcGFyaVJlZ2lvblN2Z1JlbmRlcmVyfSBvdmVyIHRoZSBzaGFyZWQgYFN2Z1JlZ2lvblJlbmRlcmVyYDpcbiAqIGluIHdvcmxkIGNvb3JkaW5hdGVzIGluc2lkZSBvbmUgdHJhbnNmb3JtZWQgZ3JvdXAsIHJlYnVpbHQgb24gYSByZWdpb24gb3Igc2VsZWN0aW9uIGNoYW5nZSxcbiAqIHdoaWxlIGEgY2FtZXJhIG1vdmUgb25seSByZXdyaXRlcyB0aGUgdHJhbnNmb3JtIChuYXBhcmktanMncyBgY2FudmFzVHJhbnNmb3JtYCwgdGhlIGNhbWVyYVxuICogY2VudHJlL3pvb20pIGFuZCB0aGUgZmV3IHNjcmVlbi1zcGFjZSBoYW5kbGVzIGFuZCBsYWJlbHMuIFRoaXMgY2xhc3MgaXNcbiAqIHRoZSBnZXN0dXJlIGNvbnRyb2xsZXI6IHBvaW50ZXIgaGFuZGxlcnMsIHRoZSB0b29sIG1vZGUsIGFuZCB0aGUgZWRpdC9kcmFmdC9tYXJxdWVlIHN0YXRlLlxuICogSXQgd3JpdGVzIGNvbXBsZXRlZCBzaGFwZXMgdG8gdGhlIHNoYXJlZCB7QGxpbmsgUmVnaW9uU3RvcmV9IChzbyBzYXZlIC8gdW5kbyAvIGV4cG9ydCB3b3JrXG4gKiBpZGVudGljYWxseSB0byBPU0QpLlxuICpcbiAqIFN1cHBvcnRzIChqaXQtdWkjMTAyKTogcmVjdGFuZ2xlIC8gcG9seWdvbiAvIGZyZWVoYW5kIHBhdGggZHJhd2luZywgY2xpY2stc2VsZWN0IGFuZCBydWJiZXItYmFuZFxuICogbWFycXVlZSBzZWxlY3QsIHBhbi96b29tIGdhdGluZyB2aWEgYHNldENvbnRyb2xzRW5hYmxlZGAsIGJvZHkgbW92ZSwgdmVydGV4IG1vdmUvYWRkL2RlbGV0ZSxcbiAqIGJlemllciBoYW5kbGUgZWRpdGluZywgYW5kIGRvbnV0IGhvbGVzIChpbmNsdWRpbmcgaG9sZSB2ZXJ0ZXggKyBob2xlLWJlemllci1oYW5kbGUgZWRpdGluZykuXG4gKiBIaXQtdGVzdGluZyBzaGFyZXMgYHJlZ2lvbi1vdmVybGF5L3JlZ2lvbi1nZW9tZXRyeWAgd2l0aCB0aGUgT1NEIG92ZXJsYXksIHNvIGJvdGggZm9sbG93XG4gKiB0aGUgc2FtZSBydWxlcyAobXVsdGktcGFydCByZWdpb25zLCBob2xlcywgb3BlbiBwb2x5bGluZXMsIGhhbmRsZS1sZXNzIGJlemllciBjdXJ2ZXMpLlxuICovXG5leHBvcnQgY2xhc3MgTmFwYXJpUmVnaW9uT3ZlcmxheSBpbXBsZW1lbnRzIElSZWdpb25PdmVybGF5IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IE5hcGFyaVJlZ2lvblN2Z1JlbmRlcmVyO1xuICAvKiogVGhlIGltYWdlJ3MgcmVnaW9uIHNvdXJjZSwgZHJhd24gdW5kZXIgdGhlIHJlZ2lvbnMgYXQgdGhlIHpvb20ncyBsZXZlbCBvZiBkZXRhaWw7IG51bGxcbiAgICogIHdoZXJlIHdvcmxkIGlzIG5vdCB0aGUgaW1hZ2UgKHRoZSAzRCB2aWV3J3Mgc2NyZWVuLXNwYWNlIGxhc3NvcykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlTGF5ZXI6IFJlZ2lvblNvdXJjZUxheWVyIHwgbnVsbDtcbiAgLyoqIENsaWVudCDihpQgc3ZnLWxvY2FsIOKGlCB3b3JsZCBjb252ZXJzaW9ucywgd2l0aCB0aGUgc3ZnIG9yaWdpbiByZWFkIG9uY2UgcGVyIGdlc3R1cmUvcmVkcmF3LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3Rpb246IE92ZXJsYXlQcm9qZWN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzY29ubmVjdENhbWVyYTogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIG1vZGU6IFJlZ2lvblRvb2xNb2RlID0gJ25vbmUnO1xuICBwcml2YXRlIHNlbGVjdGVkOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKiBJbi1wcm9ncmVzcyBkcmF3aW5nIHN0YXRlIChpbWFnZS1zcGFjZSkuICovXG4gIHByaXZhdGUgZHJhZnRSZWN0OiBEcmFnQm94IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbi1wcm9ncmVzcyBydWJiZXItYmFuZCBzZWxlY3Rpb24gbWFycXVlZSAoc2VsZWN0IG1vZGUpLCBpbWFnZS1zcGFjZS4gKi9cbiAgcHJpdmF0ZSBtYXJxdWVlOiBEcmFnQm94IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZHJhZnRQYXRoOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiB8IG51bGwgPSBudWxsOyAvLyBmcmVlaGFuZCBvciBjbGljayBwb2x5Z29uXG4gIHByaXZhdGUgZHJhd2luZyA9IGZhbHNlOyAvLyBwb2ludGVyIGlzIGRvd24gZm9yIHJlY3QgLyBmcmVlaGFuZFxuICBwcml2YXRlIHJlZ2lvbnNWaXNpYmxlID0gdHJ1ZTtcblxuICAvKiogSW4tcHJvZ3Jlc3MgbWFuaXB1bGF0aW9uIChzZWxlY3QvbW92ZSBtb2Rlcyk6IGRyYWdnaW5nIGEgYm9keSwgYSBwb2x5Z29uIHZlcnRleCwgb3IgYVxuICAgKiAgcmVjdGFuZ2xlIGNvcm5lci4gYGFuY2hvcmAgaXMgdGhlIGZpeGVkIG9wcG9zaXRlIGNvcm5lciBmb3IgYSByZWN0YW5nbGUgcmVzaXplLiAqL1xuICBwcml2YXRlIGVkaXQ6IFJlZ2lvbkVkaXQgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogU2NyZWVuIHNwYWNlICh0aGUgM0QgdmlldydzIGxhc3Nvcyk6IHRoZSByZWdpb25zIHRoaXMgb3ZlcmxheSBkcmV3IGl0c2VsZiwgYnkgaWQuIE9ubHkgdGhvc2VcbiAgICogYXJlIGRyYXduLCBwaWNrZWQgb3IgZWRpdGVkIGhlcmU7IGV2ZXJ5IG90aGVyIHJlZ2lvbiBpbiB0aGUgc3RvcmUgaXMgaW4gaW1hZ2Ugc3BhY2UgKHRoZVxuICAgKiBpbWFnZSdzIG93biwgYW4gaW1wb3J0ZWQgc2V0LCBzdHJ1Y3R1cmVzIGEgdHJlZSBjbGljayB0b29rIGZyb20gYSBzb3VyY2UpIGFuZCBtZWFucyBub3RoaW5nXG4gICAqIGF0IGNhbnZhcyBwaXhlbHMuIE51bGw6IGV2ZXJ5IHJlZ2lvbiAod29ybGQgaXMgdGhlIGltYWdlKS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3duOiBTZXQ8bnVtYmVyPiB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjogT3ZlcmxheVZpZXdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBSZWdpb25TdG9yZSxcbiAgICBvcHRzOiB7IHJlZ2lvblNvdXJjZT86IGJvb2xlYW47IHNjcmVlblNwYWNlPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIHRoaXMub3duID0gb3B0cy5zY3JlZW5TcGFjZSA/IG5ldyBTZXQoKSA6IG51bGw7XG4gICAgaWYgKGdldENvbXB1dGVkU3R5bGUoaG9zdCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSBob3N0LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aGlzLnN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdzdmcnKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuc3ZnLnN0eWxlLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGluc2V0OiAnMCcsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB6SW5kZXg6ICcyMCcsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsIC8vIHVudGlsIGEgdG9vbCBhY3RpdmF0ZXNcbiAgICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gICAgfSBhcyBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+KTtcbiAgICB0aGlzLmhvc3QuYXBwZW5kQ2hpbGQodGhpcy5zdmcpO1xuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgTmFwYXJpUmVnaW9uU3ZnUmVuZGVyZXIodGhpcy5zdmcsIHRoaXMuc3RvcmUsIChyKSA9PiB0aGlzLmRyYXdzKHIpKTtcbiAgICB0aGlzLnByb2plY3Rpb24gPSBuZXcgT3ZlcmxheVByb2plY3Rpb24odGhpcy5zdmcsIHRoaXMudmlld2VyKTtcbiAgICB0aGlzLnNvdXJjZUxheWVyID1cbiAgICAgIG9wdHMucmVnaW9uU291cmNlID09PSBmYWxzZSA/IG51bGwgOiBuZXcgUmVnaW9uU291cmNlTGF5ZXIodGhpcy5zdmcsIHRoaXMuc3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldyQoKSk7XG5cbiAgICB0aGlzLnN2Zy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25Qb2ludGVyRG93bik7XG4gICAgdGhpcy5zdmcuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgIHRoaXMuc3ZnLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXApO1xuICAgIHRoaXMuc3ZnLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlckNhbmNlbCk7XG4gICAgdGhpcy5zdmcuYWRkRXZlbnRMaXN0ZW5lcignbG9zdHBvaW50ZXJjYXB0dXJlJywgdGhpcy5vblBvaW50ZXJDYW5jZWwpO1xuICAgIHRoaXMuc3ZnLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbkRibENsaWNrKTtcblxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5zdG9yZS5nZXRSZWdpb25VcGRhdGVFdmVudCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlZHJhdygpKSk7XG4gICAgdGhpcy5zdWJzLmFkZChcbiAgICAgIHRoaXMuc3RvcmUuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkuc3Vic2NyaWJlKChpZHgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGlkeCA/PyBbXTtcbiAgICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gQSBjYW1lcmEgbW92ZSByZXdyaXRlcyB0aGUgcmVuZGVyZXIncyB0cmFuc2Zvcm0gYW5kIGl0cyBmZXcgc2NyZWVuLXNwYWNlIGVsZW1lbnRzO1xuICAgIC8vIHRoZSByZWdpb25zIGFyZSBkcmF3biBpbiB3b3JsZCBjb29yZGluYXRlcyBhbmQgYXJlIG5vdCByZWJ1aWx0IChOQVBBUkktQk9VTkRBUlktMTApLlxuICAgIHRoaXMuZGlzY29ubmVjdENhbWVyYSA9IHRoaXMudmlld2VyLmNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4gdGhpcy51cGRhdGVDYW1lcmEoKSk7XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uT3ZlcmxheSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSByZWdpb24gdG9vbCBjdXJyZW50bHkgb3ducyB0aGUgcG9pbnRlci5cbiAgICpcbiAgICogRXhwb3NlZCBzbyB0aGUgc3BhdGlhbCB2aWV3cyBjYW4gdGVsbCBhIGJhcmUgY2xpY2sgb24gdGhlIGNsb3VkIChzZWxlY3QgdGhlXG4gICAqIGNsYXNzIHVuZGVyIHRoZSBjdXJzb3IpIGZyb20gYSBjbGljayB0aGF0IGJlbG9uZ3MgdG8gYSBkcmF3aW5nIGdlc3R1cmUg4oCUXG4gICAqIHBsYWNpbmcgYSBwb2x5Z29uIHZlcnRleCBpcyBhbHNvIGEgY2xpY2sgdGhhdCBkb2VzIG5vdCBtb3ZlLCBhbmQgaXQgbXVzdCBub3RcbiAgICogY2hhbmdlIHRoZSBzZWxlY3Rpb24gYmVoaW5kIHRoZSBzaGFwZSBiZWluZyBkcmF3bi5cbiAgICovXG4gIGdldCB0b29sQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgIT09ICdub25lJztcbiAgfVxuXG4gIHNldE1vZGUobW9kZTogUmVnaW9uVG9vbE1vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmVuZEdlc3R1cmUoKTtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZHJhZnRSZWN0ID0gbnVsbDtcbiAgICB0aGlzLmRyYWZ0UGF0aCA9IG51bGw7XG4gICAgLy8gVGhlIG92ZXJsYXkgb3ducyBwb2ludGVyL25hdmlnYXRpb24gZ2F0aW5nOiB3aGlsZSBhIHRvb2wgaXMgYWN0aXZlIGl0IGNhcHR1cmVzIHRoZSBwb2ludGVyXG4gICAgLy8gYW5kIHRoZSBuYXBhcmkgY2FtZXJhIGNvbnRyb2xzIGFyZSBkaXNhYmxlZDsgJ25vbmUnIGhhbmRzIHRoZSBwb2ludGVyIGJhY2sgZm9yIHBhbi96b29tLlxuICAgIGNvbnN0IGFjdGl2ZSA9IG1vZGUgIT09ICdub25lJztcbiAgICB0aGlzLnZpZXdlci5zZXRDb250cm9sc0VuYWJsZWQoIWFjdGl2ZSk7XG4gICAgdGhpcy5zdmcuc3R5bGUucG9pbnRlckV2ZW50cyA9IGFjdGl2ZSA/ICdhdXRvJyA6ICdub25lJztcbiAgICB0aGlzLnN2Zy5zdHlsZS5jdXJzb3IgPSBhY3RpdmUgPyAnY3Jvc3NoYWlyJyA6ICdkZWZhdWx0JztcbiAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkQmV6aWVyKGJlemllcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb24oKTtcbiAgICBpZiAoc2VsPy5pZCAhPSBudWxsKSB0aGlzLnN0b3JlLnNldEJlemllcihzZWwuaWQsIGJlemllcik7XG4gIH1cblxuICAvKipcbiAgICogSG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLCBpbiB3b3JsZCB1bml0czogb25lIChhbiBpbWFnZSdzIHBpeGVscykgYnlcbiAgICogZGVmYXVsdCwgZmluZXIgZm9yIGEgZGF0YXNldCB3aG9zZSBjb29yZGluYXRlcyBhcmUgbm90IHBpeGVscyAoc2VlIE92ZXJsYXlQcm9qZWN0aW9uKS5cbiAgICovXG4gIHNldFdvcmxkUXVhbnR1bShxdWFudHVtOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnByb2plY3Rpb24uc2V0V29ybGRRdWFudHVtKHF1YW50dW0pO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN2Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25Qb2ludGVyRG93bik7XG4gICAgdGhpcy5zdmcucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgIHRoaXMuc3ZnLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXApO1xuICAgIHRoaXMuc3ZnLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlckNhbmNlbCk7XG4gICAgdGhpcy5zdmcucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9zdHBvaW50ZXJjYXB0dXJlJywgdGhpcy5vblBvaW50ZXJDYW5jZWwpO1xuICAgIHRoaXMuc3ZnLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbkRibENsaWNrKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEoKTtcbiAgICB0aGlzLnN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICAvLyBBIGRyYWcgdG9ybiBkb3duIG1pZC1nZXN0dXJlIChhIGJhY2tlbmQgc3dpdGNoKSBtdXN0IHN0aWxsIGNsb3NlIGl0cyBzdG9yZSBiYXRjaC5cbiAgICB0aGlzLmVuZEdlc3R1cmUoKTtcbiAgICB0aGlzLnNvdXJjZUxheWVyPy5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMuc3ZnLnBhcmVudE5vZGUpIHRoaXMuc3ZnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zdmcpO1xuICB9XG5cbiAgLy8g4pSA4pSAIHBvaW50ZXIgaGFuZGxlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qb2ludGVyRG93biA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnbm9uZScpIHJldHVybjtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5wcm9qZWN0aW9uLndpdGhPcmlnaW4oKCkgPT4gdGhpcy5wb2ludGVyRG93bihlKSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBwb2ludGVyRG93bihlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBbaXgsIGl5XSA9IHRoaXMucHJvamVjdGlvbi50b0ltYWdlKGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnKSB7XG4gICAgICB0aGlzLmRyYWZ0UmVjdCA9IHsgeDA6IGl4LCB5MDogaXksIHgxOiBpeCwgeTE6IGl5IH07XG4gICAgICB0aGlzLmRyYXdpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zdmcuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8IHRoaXMubW9kZSA9PT0gJ2RyYXdvcGVucGF0aCcpIHtcbiAgICAgIHRoaXMuZHJhZnRQYXRoID0gW1tpeCwgaXldXTtcbiAgICAgIHRoaXMuZHJhd2luZyA9IHRydWU7XG4gICAgICB0aGlzLnN2Zy5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdkcmF3cG9seWdvbicpIHtcbiAgICAgIHRoaXMuaGFuZGxlUG9seWdvbkNsaWNrKGl4LCBpeSwgZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0JyB8fCB0aGlzLm1vZGUgPT09ICdtb3ZlJykge1xuICAgICAgdGhpcy5iZWdpbk1hbmlwdWxhdGlvbihpeCwgaXksIGUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnYWRkcG9pbnQnKSB7XG4gICAgICB0aGlzLmhhbmRsZUFkZFBvaW50KGl4LCBpeSwgZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZGVsZXRlcG9pbnQnKSB7XG4gICAgICB0aGlzLmhhbmRsZURlbGV0ZVBvaW50KGl4LCBpeSk7XG4gICAgfVxuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG9uUG9pbnRlck1vdmUgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgW2l4LCBpeV0gPSB0aGlzLnByb2plY3Rpb24udG9JbWFnZShlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgaWYgKHRoaXMubWFycXVlZSkge1xuICAgICAgdGhpcy5tYXJxdWVlLngxID0gaXg7XG4gICAgICB0aGlzLm1hcnF1ZWUueTEgPSBpeTtcbiAgICAgIHRoaXMudXBkYXRlTWFycXVlZUVsKCk7IC8vIHVwZGF0ZSBqdXN0IHRoZSBtYXJxdWVlIHJlY3Qg4oCUIE5PVCBhIGZ1bGwgcmVnaW9uIHJlZHJhd1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5lZGl0KSB7XG4gICAgICBhcHBseVJlZ2lvbkVkaXQodGhpcy5zdG9yZSwgdGhpcy5lZGl0LCBpeCwgaXkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRyYXdpbmcpIHJldHVybjtcbiAgICBpZiAodGhpcy5kcmFmdFJlY3QpIHtcbiAgICAgIHRoaXMuZHJhZnRSZWN0LngxID0gaXg7XG4gICAgICB0aGlzLmRyYWZ0UmVjdC55MSA9IGl5O1xuICAgIH0gZWxzZSBpZiAodGhpcy5kcmFmdFBhdGgpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBGUkVFSEFORF9TVEVQX1BYICogdGhpcy5wcm9qZWN0aW9uLndvcmxkUGVyQ2FudmFzUGl4ZWwoKTtcbiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmRyYWZ0UGF0aFt0aGlzLmRyYWZ0UGF0aC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChNYXRoLmFicyhpeCAtIGxhc3RbMF0pID49IHN0ZXAgfHwgTWF0aC5hYnMoaXkgLSBsYXN0WzFdKSA+PSBzdGVwKSB7XG4gICAgICAgIHRoaXMuZHJhZnRQYXRoLnB1c2goW2l4LCBpeV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uUG9pbnRlclVwID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLm1hcnF1ZWUpIHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLm1hcnF1ZWU7XG4gICAgICB0aGlzLm1hcnF1ZWUgPSBudWxsO1xuICAgICAgdGhpcy5yZW5kZXJlci5jbGVhck1hcnF1ZWUoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3ZnLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogYWxyZWFkeSByZWxlYXNlZCAqL1xuICAgICAgfVxuICAgICAgdGhpcy5maW5pc2hNYXJxdWVlKG0pOyAvLyBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyDihpIgb25lIHJlZHJhdyB2aWEgdGhlIHNlbGVjdGlvbiBzdWJzY3JpcHRpb25cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZWRpdCkge1xuICAgICAgdGhpcy5zdG9yZS5lbmRCYXRjaCgpO1xuICAgICAgdGhpcy5lZGl0ID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3ZnLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogYWxyZWFkeSByZWxlYXNlZCAqL1xuICAgICAgfVxuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRyYXdpbmcpIHJldHVybjtcbiAgICB0aGlzLmRyYXdpbmcgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zdmcucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGNhcHR1cmUgbWF5IGFscmVhZHkgYmUgcmVsZWFzZWQgKi9cbiAgICB9XG4gICAgaWYgKHRoaXMuZHJhZnRSZWN0KSB7XG4gICAgICBjb25zdCB7IHgwLCB5MCwgeDEsIHkxIH0gPSB0aGlzLmRyYWZ0UmVjdDtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1pbih4MCwgeDEpO1xuICAgICAgY29uc3QgeSA9IE1hdGgubWluKHkwLCB5MSk7XG4gICAgICBjb25zdCB3ID0gTWF0aC5hYnMoeDEgLSB4MCk7XG4gICAgICBjb25zdCBoID0gTWF0aC5hYnMoeTEgLSB5MCk7XG4gICAgICB0aGlzLmRyYWZ0UmVjdCA9IG51bGw7XG4gICAgICBjb25zdCBtaW4gPSBNSU5fUkVDVF9EUkFHX1BYICogdGhpcy5wcm9qZWN0aW9uLndvcmxkUGVyQ2FudmFzUGl4ZWwoKTtcbiAgICAgIGlmICh3ID49IG1pbiAmJiBoID49IG1pbikgdGhpcy5jb21taXRSZWN0YW5nbGUoeCwgeSwgdywgaCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRyYWZ0UGF0aCkge1xuICAgICAgY29uc3QgcHRzID0gdGhpcy5kcmFmdFBhdGg7XG4gICAgICB0aGlzLmRyYWZ0UGF0aCA9IG51bGw7XG4gICAgICBjb25zdCBjbG9zZWQgPSB0aGlzLm1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCc7XG4gICAgICBpZiAocHRzLmxlbmd0aCA+PSAoY2xvc2VkID8gMyA6IDIpKSB0aGlzLmNvbW1pdFBvbHlnb24ocHRzLCBjbG9zZWQpO1xuICAgIH1cbiAgICB0aGlzLnJlZHJhdygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcG9pbnRlciBnZXN0dXJlIGVuZGVkIHdpdGhvdXQgYSBwb2ludGVydXAgKHRoZSBicm93c2VyIGNhbmNlbGxlZCBpdCwgb3IgY2FwdHVyZSB3YXNcbiAgICogbG9zdCk6IGVuZCBpdCB3aXRob3V0IGNvbW1pdHRpbmcuIEFsc28gZmlyZXMgYWZ0ZXIgZXZlcnkgbm9ybWFsIHJlbGVhc2UsIHdoZW4gbm90aGluZ1xuICAgKiBpcyBsaXZlIGFueSBtb3JlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvblBvaW50ZXJDYW5jZWwgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLmVkaXQgJiYgIXRoaXMuZHJhd2luZyAmJiAhdGhpcy5tYXJxdWVlKSByZXR1cm47XG4gICAgdGhpcy5lbmRHZXN0dXJlKCk7XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfTtcblxuICAvKipcbiAgICogRW5kIHdoYXRldmVyIHBvaW50ZXIgZ2VzdHVyZSBpcyBsaXZlIHdpdGhvdXQgY29tbWl0dGluZyBpdDogY2xvc2UgdGhlIHN0b3JlIGJhdGNoIGEgZHJhZ1xuICAgKiBvcGVuZWQgKHNvIGxhdGVyIGVkaXRzIGFyZSBlbWl0dGVkIGFnYWluKSBhbmQgZm9yZ2V0IHRoZSBkcmFnIChzbyBhIGJhcmUgaG92ZXIgbm8gbG9uZ2VyXG4gICAqIG1vdmVzIHRoZSByZWdpb24pLCBhbmQgZHJvcCB0aGUgbWFycXVlZSBhbmQgYSByZWN0YW5nbGUvZnJlZWhhbmQgZHJhZnQuIEEgY2xpY2stcGxhY2VkXG4gICAqIHBvbHlnb24gaXMgbm90IGEgcG9pbnRlciBnZXN0dXJlIGFuZCBzdXJ2aXZlcy5cbiAgICovXG4gIHByaXZhdGUgZW5kR2VzdHVyZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0KSB0aGlzLnN0b3JlLmVuZEJhdGNoKCk7XG4gICAgdGhpcy5lZGl0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5kcmF3aW5nKSB7XG4gICAgICB0aGlzLmRyYWZ0UmVjdCA9IG51bGw7XG4gICAgICB0aGlzLmRyYWZ0UGF0aCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZHJhd2luZyA9IGZhbHNlO1xuICAgIHRoaXMubWFycXVlZSA9IG51bGw7XG4gICAgdGhpcy5yZW5kZXJlci5jbGVhck1hcnF1ZWUoKTtcbiAgfVxuXG4gIC8qKiBDbGljay10by1wbGFjZSBwb2x5Z29uOiBhZGQgYSB2ZXJ0ZXgsIG9yIGNsb3NlIHdoZW4gY2xpY2tpbmcgbmVhciB0aGUgZmlyc3Qgb25lLiAqL1xuICBwcml2YXRlIGhhbmRsZVBvbHlnb25DbGljayhpeDogbnVtYmVyLCBpeTogbnVtYmVyLCBjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFmdFBhdGgpIHtcbiAgICAgIHRoaXMuZHJhZnRQYXRoID0gW1tpeCwgaXldXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmVhciA9XG4gICAgICB0aGlzLnByb2plY3Rpb24uc2NyZWVuRGlzdChjbGllbnRYLCBjbGllbnRZLCB0aGlzLmRyYWZ0UGF0aFswXVswXSwgdGhpcy5kcmFmdFBhdGhbMF1bMV0pIDw9IENMT1NFX1NOQVBfUFggJiZcbiAgICAgIHRoaXMuZHJhZnRQYXRoLmxlbmd0aCA+PSAzO1xuICAgIGlmIChuZWFyKSB7XG4gICAgICBjb25zdCBwdHMgPSB0aGlzLmRyYWZ0UGF0aDtcbiAgICAgIHRoaXMuZHJhZnRQYXRoID0gbnVsbDtcbiAgICAgIHRoaXMuY29tbWl0UG9seWdvbihwdHMsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYWZ0UGF0aC5wdXNoKFtpeCwgaXldKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGJsQ2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdkcmF3cG9seWdvbicgfHwgIXRoaXMuZHJhZnRQYXRoKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHB0cyA9IHRoaXMuZHJhZnRQYXRoO1xuICAgIHRoaXMuZHJhZnRQYXRoID0gbnVsbDtcbiAgICBpZiAocHRzLmxlbmd0aCA+PSAzKSB0aGlzLmNvbW1pdFBvbHlnb24ocHRzLCB0cnVlKTtcbiAgICB0aGlzLnJlZHJhdygpO1xuICB9O1xuXG4gIC8qKiBUaGUgY3VycmVudGx5LXNlbGVjdGVkIHJlZ2lvbiAoc2luZ2xlIHNlbGVjdGlvbikgdGhpcyBvdmVybGF5IGRyYXdzLCBvciBudWxsLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkUmVnaW9uKCk6IFJlZ2lvbiB8IG51bGwge1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBpID0gdGhpcy5zZWxlY3RlZFswXTtcbiAgICBjb25zdCByZWdpb24gPSBpICE9IG51bGwgJiYgaSA+PSAwICYmIGkgPCByZWdpb25zLmxlbmd0aCA/IHJlZ2lvbnNbaV0gOiBudWxsO1xuICAgIHJldHVybiByZWdpb24gJiYgdGhpcy5kcmF3cyhyZWdpb24pID8gcmVnaW9uIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoaXMgb3ZlcmxheSBkcmF3cyAoYW5kIGxldHMgdGhlIHBvaW50ZXIgcGljaykgYHJlZ2lvbmA6IHNlZSB7QGxpbmsgb3dufS4gKi9cbiAgcHJpdmF0ZSBkcmF3cyhyZWdpb246IFJlZ2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5vd24gfHwgdGhpcy5vd24uaGFzKHJlZ2lvbi5pZCk7XG4gIH1cblxuICAvKiogVGhlIHJlZ2lvbnMgdGhpcyBvdmVybGF5IGRyZXcgaW4gc2NyZWVuIHNwYWNlICh0aGUgM0QgdmlldydzIGxhc3Nvcyk7IFtdIGluIGltYWdlIHNwYWNlLiAqL1xuICBvd25SZWdpb25JZHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLm93biA/IFsuLi50aGlzLm93bl0gOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIHNlbGVjdC9tb3ZlIGludGVyYWN0aW9uOiBncmFiIGEgaGFuZGxlIChyZWN0YW5nbGUgY29ybmVyKSBvciB2ZXJ0ZXggb2YgdGhlIGFscmVhZHktXG4gICAqIHNlbGVjdGVkIHJlZ2lvbiBmaXJzdDsgb3RoZXJ3aXNlIHNlbGVjdCB0aGUgdG9wbW9zdCByZWdpb24gdW5kZXIgdGhlIGN1cnNvciBhbmQgZHJhZyBpdHMgYm9keS5cbiAgICovXG4gIHByaXZhdGUgYmVnaW5NYW5pcHVsYXRpb24oaXg6IG51bWJlciwgaXk6IG51bWJlciwgZTogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbigpO1xuICAgIGlmIChzZWw/LmJvdW5kcykge1xuICAgICAgY29uc3QgW2x4LCBseV0gPSB0aGlzLnByb2plY3Rpb24uY2xpZW50VG9Mb2NhbChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgICBjb25zdCBncmFiID0gaGl0SGFuZGxlKHNlbCwgbHgsIGx5LCB0aGlzLnByb2plY3Rpb24udG9TY3JlZW4sIEhBTkRMRV9ISVRfUFgpO1xuICAgICAgaWYgKGdyYWIpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5iZWdpbkJhdGNoKCk7XG4gICAgICAgIHRoaXMuZWRpdCA9IHsgLi4uZ3JhYiwgaWQ6IHNlbC5pZCwgbGFzdDogW2l4LCBpeV0gfTtcbiAgICAgICAgdGhpcy5zdmcuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhpdC10ZXN0IGJvZGllcywgdG9wbW9zdCBmaXJzdCAobGFzdCBkcmF3biByZW5kZXJzIG9uIHRvcCksIGF0IHRoZSBleGFjdCBwb2ludGVyXG4gICAgLy8gcG9zaXRpb24g4oCUIHNuYXBwaW5nIGlzIGZvciBwbGFjaW5nIHZlcnRpY2VzLCBub3QgZm9yIHBpY2tpbmcuXG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IFt3eCwgd3ldID0gdGhpcy5wcm9qZWN0aW9uLnRvV29ybGQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIGZvciAobGV0IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodGhpcy5zdG9yZS5pc0NsYXNzSGlkZGVuKHJlZ2lvbnNbaV0ubGFiZWwpIHx8ICF0aGlzLmRyYXdzKHJlZ2lvbnNbaV0pKSBjb250aW51ZTtcbiAgICAgIGlmIChyZWdpb25Db250YWlucyhyZWdpb25zW2ldLCB3eCwgd3ksIHsgdG9TY3JlZW46IHRoaXMucHJvamVjdGlvbi50b1NjcmVlbiwgdG9sUHg6IE9QRU5fUEFUSF9ISVRfUFggfSkpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uc1tpXSk7XG4gICAgICAgIHRoaXMuc3RvcmUuYmVnaW5CYXRjaCgpO1xuICAgICAgICB0aGlzLmVkaXQgPSB7IGtpbmQ6ICdib2R5JywgaWQ6IHJlZ2lvbnNbaV0uaWQsIGxhc3Q6IFtpeCwgaXldIH07XG4gICAgICAgIHRoaXMuc3ZnLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBIGZlYXR1cmUgb2YgdGhlIHJlZ2lvbiBzb3VyY2U6IHRha2UgaXQgaW50byB0aGUgcmVnaW9ucyBhbmQgc2VsZWN0IGl0IChhIGRyYWcgb24gaXRcbiAgICAvLyBtb3ZlcyBpdCBvbmNlIGl0IGlzIHNlbGVjdGVkKS5cbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5zb3VyY2VMYXllcj8uZmVhdHVyZUF0KHd4LCB3eSwgT1BFTl9QQVRIX0hJVF9QWCk7XG4gICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgIHZvaWQgdGhpcy5zdG9yZS5zZWxlY3RTb3VyY2VGZWF0dXJlcyhbZmVhdHVyZS5pZF0sIGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEVtcHR5IHNwYWNlOiBpbiBzZWxlY3QgbW9kZSBzdGFydCBhIHJ1YmJlci1iYW5kIG1hcnF1ZWUgKHNlbGVjdHMgdGhlIHJlZ2lvbnMgaXQgY292ZXJzIG9uXG4gICAgLy8gcmVsZWFzZSk7IGluIG1vdmUgbW9kZSBqdXN0IGNsZWFyIHRoZSBzZWxlY3Rpb24uXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIHRoaXMubWFycXVlZSA9IHsgeDA6IGl4LCB5MDogaXksIHgxOiBpeCwgeTE6IGl5IH07XG4gICAgICB0aGlzLnVwZGF0ZU1hcnF1ZWVFbCgpO1xuICAgICAgdGhpcy5zdmcuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKFtdKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdyB0aGUgbWFycXVlZSB3aGVyZSBpdCBpcyBub3cgKG9ubHkgdGhlIG1hcnF1ZWUgZWxlbWVudDogbm8gZnVsbCByZWdpb24gcmVkcmF3KS4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVNYXJxdWVlRWwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hcnF1ZWUpIHJldHVybjtcbiAgICBjb25zdCB7IHgwLCB5MCwgeDEsIHkxIH0gPSB0aGlzLm1hcnF1ZWU7XG4gICAgY29uc3QgW2x4LCBseV0gPSB0aGlzLnByb2plY3Rpb24udG9Mb2NhbChNYXRoLm1pbih4MCwgeDEpLCBNYXRoLm1pbih5MCwgeTEpKTtcbiAgICBjb25zdCBbcngsIHJ5XSA9IHRoaXMucHJvamVjdGlvbi50b0xvY2FsKE1hdGgubWF4KHgwLCB4MSksIE1hdGgubWF4KHkwLCB5MSkpO1xuICAgIHRoaXMucmVuZGVyZXIuc2hvd01hcnF1ZWUobHgsIGx5LCByeCwgcnkpO1xuICB9XG5cbiAgLyoqIGFkZHBvaW50IG1vZGU6IGluc2VydCBhIHZlcnRleCBhdCB0aGUgY2xpY2sgb24gdGhlIHNlbGVjdGVkIHBvbHlnb24ncyBuZWFyZXN0IGVkZ2VcbiAgICogIChleHRlcmlvciBvciBhIGhvbGUgcmluZykuICovXG4gIHByaXZhdGUgaGFuZGxlQWRkUG9pbnQoaXg6IG51bWJlciwgaXk6IG51bWJlciwgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uKCk7XG4gICAgaWYgKCFzZWwpIHJldHVybjtcbiAgICBjb25zdCBbbHgsIGx5XSA9IHRoaXMucHJvamVjdGlvbi5jbGllbnRUb0xvY2FsKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGNvbnN0IGVkZ2UgPSBuZWFyZXN0RWRnZShzZWwsIGx4LCBseSwgdGhpcy5wcm9qZWN0aW9uLnRvU2NyZWVuKTtcbiAgICBpZiAoIWVkZ2UpIHJldHVybjtcbiAgICBpZiAoZWRnZS5yaW5nIDwgMCkgdGhpcy5zdG9yZS5hZGRWZXJ0ZXgoc2VsLmlkLCBlZGdlLnNlZ0luZGV4LCBpeCwgaXkpO1xuICAgIGVsc2UgdGhpcy5zdG9yZS5hZGRIb2xlVmVydGV4KHNlbC5pZCwgZWRnZS5yaW5nLCBlZGdlLnNlZ0luZGV4LCBpeCwgaXkpO1xuICB9XG5cbiAgLyoqIGRlbGV0ZXBvaW50IG1vZGU6IHJlbW92ZSB0aGUgc2VsZWN0ZWQgcG9seWdvbidzIHZlcnRleCBuZWFyZXN0IHRoZSBjbGljayAoZXh0ZXJpb3Igb3IgYVxuICAgKiAgaG9sZSByaW5nKS4gKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGVQb2ludChpeDogbnVtYmVyLCBpeTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbigpO1xuICAgIGlmICghc2VsKSByZXR1cm47XG4gICAgY29uc3QgdiA9IG5lYXJlc3RWZXJ0ZXgoc2VsLCBpeCwgaXkpO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh2LnJpbmcgPCAwKSB0aGlzLnN0b3JlLmRlbGV0ZVZlcnRleChzZWwuaWQsIHYuaW5kZXgpO1xuICAgIGVsc2UgdGhpcy5zdG9yZS5kZWxldGVIb2xlVmVydGV4KHNlbC5pZCwgdi5yaW5nLCB2LmluZGV4KTtcbiAgfVxuXG4gIC8qKiBGaW5hbGl6ZSBhIHJ1YmJlci1iYW5kIG1hcnF1ZWU6IHNlbGVjdCBldmVyeSByZWdpb24gd2hvc2UgYm91bmRpbmcgYm94IGl0IG92ZXJsYXBzIChhXG4gICAqICBtYXJxdWVlIHVuZGVyIHtAbGluayBNSU5fTUFSUVVFRV9QWH0gaXMgYSBjbGljayBvbiBlbXB0eSBzcGFjZSDihpIgY2xlYXIgdGhlIHNlbGVjdGlvbikuICovXG4gIHByaXZhdGUgZmluaXNoTWFycXVlZShtOiBEcmFnQm94KTogdm9pZCB7XG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbihtLngwLCBtLngxKTtcbiAgICBjb25zdCB4MSA9IE1hdGgubWF4KG0ueDAsIG0ueDEpO1xuICAgIGNvbnN0IHkwID0gTWF0aC5taW4obS55MCwgbS55MSk7XG4gICAgY29uc3QgeTEgPSBNYXRoLm1heChtLnkwLCBtLnkxKTtcbiAgICBjb25zdCBtaW4gPSBNSU5fTUFSUVVFRV9QWCAqIHRoaXMucHJvamVjdGlvbi53b3JsZFBlckNhbnZhc1BpeGVsKCk7XG4gICAgaWYgKHgxIC0geDAgPCBtaW4gJiYgeTEgLSB5MCA8IG1pbikge1xuICAgICAgdGhpcy5zdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhbXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKFxuICAgICAgcmVnaW9uc0luUmVjdChyZWdpb25zLCB4MCwgeTAsIHgxLCB5MSwge1xuICAgICAgICBza2lwUHJvZmlsZXM6IHRydWUsXG4gICAgICAgIHNraXA6IChyKSA9PiB0aGlzLnN0b3JlLmlzQ2xhc3NIaWRkZW4oci5sYWJlbCkgfHwgIXRoaXMuZHJhd3MociksXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5zb3VyY2VMYXllcj8uZmVhdHVyZXNJblJlY3QoeDAsIHkwLCB4MSwgeTEpID8/IFtdO1xuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgIHZvaWQgdGhpcy5zdG9yZS5zZWxlY3RTb3VyY2VGZWF0dXJlcyhcbiAgICAgICAgZmVhdHVyZXMuc2xpY2UoMCwgU09VUkNFX01BUlFVRUVfTElNSVQpLm1hcCgoZikgPT4gZi5pZCksXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBzaGFwZSBjb21taXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgY29tbWl0UmVjdGFuZ2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgcmVjdC54ID0geDtcbiAgICByZWN0LnkgPSB5O1xuICAgIHJlY3Qud2lkdGggPSB3aWR0aDtcbiAgICByZWN0LmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmJvdW5kcyA9IHJlY3Q7XG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5zdG9yZS5hZGRSZWdpb24ocmVnaW9uKTtcbiAgICB0aGlzLm93bj8uYWRkKHJlZ2lvbi5pZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1pdFBvbHlnb24ocG9pbnRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgY2xvc2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0gcG9pbnRzLmxlbmd0aDtcbiAgICBwb2x5Lnhwb2ludHMgPSBwb2ludHMubWFwKChwKSA9PiBwWzBdKTtcbiAgICBwb2x5Lnlwb2ludHMgPSBwb2ludHMubWFwKChwKSA9PiBwWzFdKTtcbiAgICBwb2x5LmNvb3JkaW5hdGVzID0gcG9pbnRzLm1hcCgocCkgPT4gW3BbMF0sIHBbMV1dKTtcbiAgICBwb2x5LmNsb3NlZCA9IGNsb3NlZDtcbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmJvdW5kcyA9IHBvbHk7XG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgcmVnaW9uLmxhYmVsID0gJ1JlZ2lvbic7XG4gICAgdGhpcy5zdG9yZS5hZGRSZWdpb24ocmVnaW9uKTtcbiAgICB0aGlzLm93bj8uYWRkKHJlZ2lvbi5pZCk7XG4gIH1cblxuICAvLyDilIDilIAgcmVuZGVyaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogU2hvdyBvciBoaWRlIHRoZSBkcmF3biByZWdpb25zLiBBIHJlZ2lvbiBiZWluZyBkcmF3biBzdGF5cyB2aXNpYmxlIGVpdGhlciB3YXkuICovXG4gIHNldFJlZ2lvbnNWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodmlzaWJsZSA9PT0gdGhpcy5yZWdpb25zVmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMucmVnaW9uc1Zpc2libGUgPSB2aXNpYmxlO1xuICAgIHRoaXMuc291cmNlTGF5ZXI/LnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIC8qKiBGb2xsb3cgYSBjYW1lcmEgbW92ZTogb25lIHRyYW5zZm9ybSBhdHRyaWJ1dGUgcGx1cyB0aGUgc2NyZWVuLXNwYWNlIGVsZW1lbnRzLiAqL1xuICBwcml2YXRlIHVwZGF0ZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBjb25zdCBhZmZpbmUgPSB0aGlzLnByb2plY3Rpb24uYWZmaW5lKCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRDYW1lcmEoYWZmaW5lKTtcbiAgICB0aGlzLnNvdXJjZUxheWVyPy5zZXRDYW1lcmEoYWZmaW5lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkIGV2ZXJ5IGVsZW1lbnQgZnJvbSB0aGUgc3RvcmU6IHRoZSByZWdpb25zIGluIHdvcmxkIGNvb3JkaW5hdGVzIChvbmUgdHJhbnNmb3JtZWRcbiAgICogZ3JvdXApLCB0aGVpciBsYWJlbHMsIGFuZCB0aGUgb3ZlcmxheS4gUmVhZHMgbm8gbGF5b3V0OiB0aGUgY2FtZXJhIGFmZmluZSBpcyB0aGUgdmlld2VyJ3MuXG4gICAqL1xuICByZWRyYXcoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDYW1lcmEoKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnJlZ2lvbnNWaXNpYmxlID8gdGhpcy5zdG9yZS5nZXRSZWdpb25zKCkgOiBbXSwgdGhpcy5zZWxlY3RlZCk7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgc2NyZWVuLXNwYWNlIG92ZXJsYXkgb25seTogdGhlIHNlbGVjdGVkIHJlZ2lvbnMnIGhhbmRsZXMgYW5kIHRoZSBkcmFmdC4gKi9cbiAgcHJpdmF0ZSByZW5kZXJPdmVybGF5KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyT3ZlcmxheSh0aGlzLnJlZ2lvbnNWaXNpYmxlID8gdGhpcy5zdG9yZS5nZXRSZWdpb25zKCkgOiBbXSwgdGhpcy5zZWxlY3RlZCwge1xuICAgICAgcmVjdDogdGhpcy5kcmFmdFJlY3QsXG4gICAgICBwYXRoOiB0aGlzLmRyYWZ0UGF0aCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -110,27 +110,38 @@ export class NapariToolBridge {
|
|
|
110
110
|
* A screen-space shape stops meaning anything the moment the camera moves, so an orbit clears
|
|
111
111
|
* the regions drawn in this view (and only those). The SELECTION they produced is kept: that is
|
|
112
112
|
* the durable artefact, and the highlighted points stay highlighted from every angle.
|
|
113
|
+
*
|
|
114
|
+
* Every other region in the store is in image space - the image's own, an imported set,
|
|
115
|
+
* structures a tree click took from a region source - so the overlay neither draws nor picks it
|
|
116
|
+
* (it would lie flat at canvas pixels over the cloud), and an orbit leaves it alone: they show
|
|
117
|
+
* in 3D as their reconstructions instead.
|
|
113
118
|
*/
|
|
114
119
|
install3dInteraction(viewer, host) {
|
|
115
120
|
const { regionStore } = this.deps;
|
|
116
121
|
// World here is the canvas, not the image: no region source to draw.
|
|
117
|
-
|
|
122
|
+
const overlay = new NapariRegionOverlay(host, this.screenSpaceViewer(viewer), regionStore, {
|
|
118
123
|
regionSource: false,
|
|
124
|
+
screenSpace: true,
|
|
119
125
|
});
|
|
126
|
+
this.regionOverlay = overlay;
|
|
120
127
|
this.buildCoordinateTransform();
|
|
121
|
-
// Regions already in the shared store when the 3D view mounted (the image's own, say) are
|
|
122
|
-
// not screen-space shapes and must survive an orbit; only those drawn here are cleared.
|
|
123
128
|
// (No mid-gesture case to guard: the overlay disables the camera controls while drawing.)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
this.cameraOff = viewer.camera3d.changed.connect(() => this.clearOwnLassos());
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Remove the regions the 3D overlay drew in screen space (only those) from the store: a lasso
|
|
133
|
+
* means nothing once the camera it was drawn under moves or the scene goes. Not an edit of the
|
|
134
|
+
* user's: no undo step (NAPARI-SVC-11).
|
|
135
|
+
*/
|
|
136
|
+
clearOwnLassos() {
|
|
137
|
+
const overlay = this.regionOverlay;
|
|
138
|
+
if (!overlay)
|
|
139
|
+
return;
|
|
140
|
+
const { regionStore } = this.deps;
|
|
141
|
+
const present = new Set(regionStore.getRegions().map((r) => r.id));
|
|
142
|
+
const drawn = overlay.ownRegionIds().filter((id) => present.has(id));
|
|
143
|
+
if (drawn.length)
|
|
144
|
+
this.host.inZone(() => regionStore.removeRegions(drawn, { recordUndo: false }));
|
|
134
145
|
}
|
|
135
146
|
/**
|
|
136
147
|
* The {@link OverlayViewer} the 3D region overlay draws through: "world" is the canvas, in
|
|
@@ -152,6 +163,10 @@ export class NapariToolBridge {
|
|
|
152
163
|
/** End the scene's interaction: the overlay, the camera hook, the pending timers and the
|
|
153
164
|
* pixels read from the old canvas. The armed tool and the pixel-tool set persist. */
|
|
154
165
|
teardown() {
|
|
166
|
+
// The overlay's record of its lassos goes with it: remove them first, or they would stay in
|
|
167
|
+
// the store unowned - hidden by the next 3D overlay, beyond an orbit's reach, and still
|
|
168
|
+
// feeding "Select from ROIs" with screen coordinates of a camera that is gone.
|
|
169
|
+
this.clearOwnLassos();
|
|
155
170
|
this.regionOverlay?.destroy();
|
|
156
171
|
this.regionOverlay = null;
|
|
157
172
|
this.cachedImage = null;
|
|
@@ -344,4 +359,4 @@ export class NapariToolBridge {
|
|
|
344
359
|
return this.deps.cellSegmentTool.segmentBoxes(this.toolHost, segmenter);
|
|
345
360
|
}
|
|
346
361
|
}
|
|
347
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXRvb2wtYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS10b29sLWJyaWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBS2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBaUIsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVV4RCwrRkFBK0Y7QUFDL0YsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxZQUNtQixNQUdoQixFQUNnQixLQUFvQjtRQUpwQixXQUFNLEdBQU4sTUFBTSxDQUd0QjtRQUNnQixVQUFLLEdBQUwsS0FBSyxDQUFlO0lBQ3BDLENBQUM7SUFDSixZQUFZLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDM0MsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsVUFBa0I7UUFDbkMsT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsd0JBQXdCO0lBQ3ZFLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBNkJEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGdC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QUFJLENBQUMsU0FBUztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IENhbnZhc1Rvb2xJZCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IElDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSURFTlRJVFlfQUZGSU5FIH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIENhbnZhc1Rvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9jYW52YXMtdG9vbCc7XG5pbXBvcnQgeyBDYW52YXNUb29sTWFuYWdlciB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdG9vbC1raXQvY2FudmFzLXRvb2wtbWFuYWdlcic7XG5pbXBvcnQgeyBjcmVhdGVDYW52YXNUb29sTWFuYWdlciB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvY2FudmFzLXRvb2xzJztcbmltcG9ydCB7IHBhY2tlZEZyYW1lIH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9mcmFtZS1waXhlbHMnO1xuaW1wb3J0IHsgV2FuZFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlSZWdpb25PdmVybGF5LCBPdmVybGF5Vmlld2VyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgUkVBREJBQ0tfREVCT1VOQ0VfTVMgfSBmcm9tICcuL25hcGFyaS1oZWxwZXJzJztcblxuLyoqIEEgd29ybGQtc3BhY2UgcmVjdGFuZ2xlICh4LCB5ID0gdG9wLWxlZnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JsZFJlY3Qge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSBvdmVyIHRoZSBuYXBhcmkgY2FtZXJhOiBwb2ludGVyIGNsaWVudCBjb29yZHMg4oaUIGltYWdlL3dvcmxkIGNvb3Jkcy4gKi9cbmV4cG9ydCBjbGFzcyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtIGltcGxlbWVudHMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjoge1xuICAgICAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICByZWFkb25seSBjYW1lcmE6IHsgem9vbTogbnVtYmVyIH07XG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5OiAoKSA9PiBib29sZWFuLFxuICApIHt9XG4gIGNsaWVudFRvRGF0YShjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cbiAgZGF0YUxlbmd0aFRvU2NyZWVuKGRhdGFMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFMZW5ndGggKiB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTsgLy8gQ1NTIHB4IHBlciB3b3JsZCB1bml0XG4gIH1cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59XG5cbi8qKiBXaGF0IHRoZSBicmlkZ2UgcmVhZHMgZnJvbSB0aGUgc2VydmljZTogdGhlIGxpdmUgdmlld2VyIGFuZCBpdHMgRE9NLCB0aGUgaW1hZ2Ugb24gc2NyZWVuLCBhbmRcbiAqICB3aGVyZSB0aGUgdmlld3BvcnQgYW5kIHpvbmUtY3Jvc3Npbmcgb3V0cHV0IGdvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sQnJpZGdlSG9zdCB7XG4gIHZpZXdlcigpOiBWaWV3ZXIgfCBudWxsO1xuICBob3N0KCk6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgLyoqIFRoZSBpbWFnZSdzIGZ1bGwtcmVzb2x1dGlvbiBzaXplLCBvciBudWxsIGJlZm9yZSBvbmUgaXMgZHJhd24uICovXG4gIGltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBmcmFtZUluZGV4KCk6IG51bWJlcjtcbiAgZmlsZU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHZpc2libGUgcmVnaW9uIGNoYW5nZWQgKGNsYW1wZWQgdG8gdGhlIGltYWdlKTsgY2FsbGVkIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS4gKi9cbiAgdmlld3BvcnRDaGFuZ2VkKHJlY3Q6IFdvcmxkUmVjdCk6IHZvaWQ7XG4gIC8qKiBSdW4gYGZuYCBvdXRzaWRlIC8gaW5zaWRlIHRoZSBBbmd1bGFyIHpvbmUuICovXG4gIG91dHNpZGVab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbiAgaW5ab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbn1cblxuLyoqIFRoZSBzZXJ2aWNlcyB0aGUgcGl4ZWwgdG9vbHMgYW5kIHNlZ21lbnRhdGlvbiBydW5zIG5lZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xCcmlkZ2VEZXBzIHtcbiAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlO1xuICB3YW5kU2VydmljZTogV2FuZFNlcnZpY2U7XG4gIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlO1xuICBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2U7XG4gIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZTtcbiAgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBuYXBhcmkgYmFja2VuZCdzIHNpZGUgb2YgdGhlIHNoYXJlZCBjYW52YXMgdG9vbHMgKHJldmlldyBBcHBlbmRpeCBCLCBzdGVwIDQpOiB0aGUgcmVnaW9uXG4gKiBvdmVybGF5LCB0aGUge0BsaW5rIENhbnZhc1Rvb2xNYW5hZ2VyfSBhbmQgaXRzIGhvc3QsIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSwgYW5kIHRoZVxuICogZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIHRoZSB3YW5kLCBicnVzaCwgZXJhc2VyIGFuZCBTQU0vY2VsbHBvc2UgcmVhZCDigJQga2VwdCBjdXJyZW50IGFzIHRoZVxuICogY2FtZXJhIG1vdmVzLCBidXQgb25seSBwYWlkIGZvciB3aGlsZSBhIHBpeGVsIHRvb2wgbmVlZHMgaXQgKE5BUEFSSS1TVkMtMjYpLlxuICpcbiAqIE9uZSBwZXIgc2VydmljZTsge0BsaW5rIHRlYXJkb3dufSBlbmRzIGEgc2NlbmUncyBpbnRlcmFjdGlvbiAob3ZlcmxheSwgY2FtZXJhIGhvb2ssIHRpbWVycyxcbiAqIHBpeGVscykgYW5kIGFuIGBpbnN0YWxs4oCmSW50ZXJhY3Rpb25gIHN0YXJ0cyB0aGUgbmV4dCBvbmUncy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hcGFyaVRvb2xCcmlkZ2Uge1xuICAvKiogV2hhdCB0aGlzIGJhY2tlbmQncyBjYW52YXMgdG9vbHMgcmVhZCBhbmQgd3JpdGUgKG9uZSBob3N0IGZvciBldmVyeSB0b29sKS4gKi9cbiAgcmVhZG9ubHkgdG9vbEhvc3Q6IENhbnZhc1Rvb2xIb3N0O1xuICAvKiogVGhpcyBiYWNrZW5kJ3Mgb3duIHdhbmQsIGJydXNoLCBlcmFzZXIsIHpvb20tdG8tYm94IGFuZCBTQU0gcG9pbnQgdG9vbHMuICovXG4gIHJlYWRvbmx5IGNhbnZhc1Rvb2xzOiBDYW52YXNUb29sTWFuYWdlcjtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IChudWxsIHVudGlsIGEgMkQvM0QgaW50ZXJhY3Rpb24gaXMgaW5zdGFsbGVkKS4gKi9cbiAgcmVnaW9uT3ZlcmxheTogTmFwYXJpUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBpeGVsIHRvb2xzJyBwb2ludGVyIOKGlCB3b3JsZCB0cmFuc2Zvcm0gZm9yIHRoZSBjdXJyZW50IHZpZXdlci4gKi9cbiAgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgbGFzdCByZWFkYmFjayBvZiB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSAodGhlIHBpeGVsIHRvb2xzJyBzb3VyY2UpLiAqL1xuICBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgLyoqIFZpc2libGUgd29ybGQgcmVjdCBjYXB0dXJlZCBBVCB0aGUgbGFzdCByZWFkYmFjayDigJQgbXVzdCBwYWlyIHdpdGggYGxhc3RQaXhlbHNgIHNvIHRoZSBwaXhlbFxuICAgKiAgdG9vbHMnIHJhdGlvcy9vcmlnaW4gbWF0Y2ggdGhlIG1hdHJpeCdzIGNhbWVyYSAodXNpbmcgdGhlIGxpdmUgcmVjdCBhZnRlciBhIHBhbi96b29tIHdvdWxkXG4gICAqICBtaXMtc2NhbGUgdGhlIHJlZ2lvbikuICovXG4gIGxhc3RQaXhlbHNSZWN0OiBXb3JsZFJlY3QgfCBudWxsID0gbnVsbDtcbiAgLyoqIEFjdGl2ZSB0b29scyB0aGF0IHJlYWQgdGhlIGRpc3BsYXllZCBwaXhlbHM7IGEgcGFuL3pvb20gcmUtcmVhZHMgdGhlbSBvbmx5IHdoaWxlIG5vbi1lbXB0eS4gKi9cbiAgcmVhZG9ubHkgcGl4ZWxUb29scyA9IG5ldyBTZXQ8Q2FudmFzVG9vbElkPigpO1xuICAvKiogVGhlIGNhbWVyYSBtb3ZlZCBzaW5jZSB7QGxpbmsgbGFzdFBpeGVsc30gd2FzIHJlYWQuICovXG4gIHBpeGVsc1N0YWxlID0gZmFsc2U7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEZWJvdW5jZWQgcmVhZGJhY2sgdGltZXIgKyBjYW1lcmEtY2hhbmdlIHVuc3Vic2NyaWJlIChrZWVwIGxhc3RQaXhlbHMgY3VycmVudCBmb3IgdG9vbHMpLiAqL1xuICBwcml2YXRlIHJlYWRiYWNrVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEZWJvdW5jZWQgdmlld3BvcnQgZW1pc3Npb24gZm9yIGEgY2FtZXJhIGNoYW5nZSB0aGF0IG5lZWRzIG5vIHBpeGVscy4gKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYU9mZjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBUb29sQnJpZGdlSG9zdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IFRvb2xCcmlkZ2VEZXBzLFxuICApIHtcbiAgICBjb25zdCB7IHJlZ2lvblN0b3JlIH0gPSBkZXBzO1xuICAgIC8vIFRoZSBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0XG4gICAgLy8gcG9pbnRlciBjb29yZHMgdmlhIHRoZSBuYXBhcmkgY2FtZXJhLCBtaXJyb3JpbmcgdGhlIE9TRCBob3N0LiBUaGlzIGJhY2tlbmQgb3ducyBpdHMgb3duIHRvb2xcbiAgICAvLyBpbnN0YW5jZXMgKFJULTIxKTsgdGhlIGhvc3QgcmVhZHMgbGl2ZSBzdGF0ZSwgc28gaXQgaXMgYnVpbHQgb25jZS5cbiAgICB0aGlzLnRvb2xIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gcmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvblN0b3JlLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiBob3N0LmZyYW1lSW5kZXgoKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IGhvc3QuaG9zdCgpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiBob3N0LmZpbGVOYW1lKCksXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksXG4gICAgICBwaXhlbFRvRGF0YTogKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gaG9zdC5ob3N0KCk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB2aWV3ZXIgPSBob3N0LnZpZXdlcigpO1xuICAgICAgICBpZiAoIXZpZXdlciB8fCAhcmVjdCkgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgICAgICBjb25zdCBbeCwgeV0gPSB2aWV3ZXIuY2FudmFzVG9Xb3JsZChyZWN0LmxlZnQgKyBweCwgcmVjdC50b3AgKyBweSk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgIH0sXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gICAgdGhpcy5jYW52YXNUb29scyA9IGNyZWF0ZUNhbnZhc1Rvb2xNYW5hZ2VyKHRoaXMudG9vbEhvc3QsIHtcbiAgICAgIHdhbmRTZXJ2aWNlOiBkZXBzLndhbmRTZXJ2aWNlLFxuICAgICAgcmVnaW9uU3RvcmUsXG4gICAgICBzYW1Qb2ludDogZGVwcy5zYW1Qb2ludFRvb2wsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGludGVyYWN0aW9uIHN0YWNrIGV2ZXJ5IDJEIG1vZGUgbmVlZHM6IHRoZSByZWdpb24gb3ZlcmxheSAoZHJhdy9zZWxlY3QvZWRpdCksIHRoZSBwaXhlbFxuICAgKiB0b29scyB0aGF0IHJlYWQgYmFjayBkaXNwbGF5ZWQgcGl4ZWxzICh3YW5kLCBicnVzaCwgdmVydGV4IGVyYXNlciwgem9vbS10by1ib3gsIFNBTS9jZWxscG9zZSksXG4gICAqIGFuZCBhIGNhbWVyYSBob29rIHRoYXQga2VlcHMgdGhhdCByZWFkYmFjayBjdXJyZW50IGFzIHRoZSB2aWV3IHBhbnMvem9vbXMgYW5kIHRpbGVkIGxldmVsc1xuICAgKiBsb2FkLlxuICAgKlxuICAgKiBPbmUgY2FsbCBmb3IgYWxsIG9mIGl0IGJlY2F1c2UgZm9yZ2V0dGluZyBpdCBpcyBpbnZpc2libGU6IHRoZSB0b29sYmFyIGdhdGVzIGl0cyByZWdpb24gYnV0dG9uc1xuICAgKiBvbiAyRC12cy0zRCByYXRoZXIgdGhhbiBvbiBwbG90IHR5cGUsIHNvIGEgMkQgbW9kZSB0aGF0IHNraXBzIHRoaXMgc2hvd3MgZXZlcnkgdG9vbCBhbmQgc2lsZW50bHlcbiAgICogZG9lcyBub3RoaW5nLiBUaGF0IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5lZCB0byB0aGUgc3BhdGlhbCBhbmQgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIgbW9kZXMuXG4gICAqL1xuICBpbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB2aWV3ZXIsIHRoaXMuZGVwcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZENvb3JkaW5hdGVUcmFuc2Zvcm0oKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMub25WaWV3Q2hhbmdlZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpb24gZHJhd2luZyBmb3IgdGhlIDNEIGNsb3VkLlxuICAgKlxuICAgKiBSZXVzZXMge0BsaW5rIE5hcGFyaVJlZ2lvbk92ZXJsYXl9IHZlcmJhdGltIGJ5IGhhbmRpbmcgaXQgYSBTQ1JFRU4tU1BBQ0Ugdmlld2VyOiB0aGUgZHJhd25cbiAgICogc2hhcGUgaXMgYSBsYXNzbyBpbiBjYW52YXMgcGl4ZWxzLCBzbyBcIndvcmxkXCIgaXMgdGhlIGNhbnZhcyBhbmQgYm90aCB0cmFuc2Zvcm1zIGFyZSBpZGVudGl0eVxuICAgKiAoYmFyIHRoZSBjbGllbnTihpJjYW52YXMgb2Zmc2V0KS4gRXZlcnkgZXhpc3RpbmcgdG9vbCDigJQgcmVjdGFuZ2xlLCBwb2x5Z29uLCBmcmVlaGFuZCDigJQgdGhlcmVmb3JlXG4gICAqIHdvcmtzIGluIDNEIHdpdGggbm8gbmV3IGRyYXdpbmcgY29kZS5cbiAgICpcbiAgICogQSBzY3JlZW4tc3BhY2Ugc2hhcGUgc3RvcHMgbWVhbmluZyBhbnl0aGluZyB0aGUgbW9tZW50IHRoZSBjYW1lcmEgbW92ZXMsIHNvIGFuIG9yYml0IGNsZWFyc1xuICAgKiB0aGUgcmVnaW9ucyBkcmF3biBpbiB0aGlzIHZpZXcgKGFuZCBvbmx5IHRob3NlKS4gVGhlIFNFTEVDVElPTiB0aGV5IHByb2R1Y2VkIGlzIGtlcHQ6IHRoYXQgaXNcbiAgICogdGhlIGR1cmFibGUgYXJ0ZWZhY3QsIGFuZCB0aGUgaGlnaGxpZ2h0ZWQgcG9pbnRzIHN0YXkgaGlnaGxpZ2h0ZWQgZnJvbSBldmVyeSBhbmdsZS5cbiAgICovXG4gIGluc3RhbGwzZEludGVyYWN0aW9uKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVnaW9uU3RvcmUgfSA9IHRoaXMuZGVwcztcbiAgICAvLyBXb3JsZCBoZXJlIGlzIHRoZSBjYW52YXMsIG5vdCB0aGUgaW1hZ2U6IG5vIHJlZ2lvbiBzb3VyY2UgdG8gZHJhdy5cbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB0aGlzLnNjcmVlblNwYWNlVmlld2VyKHZpZXdlciksIHJlZ2lvblN0b3JlLCB7XG4gICAgICByZWdpb25Tb3VyY2U6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuYnVpbGRDb29yZGluYXRlVHJhbnNmb3JtKCk7XG4gICAgLy8gUmVnaW9ucyBhbHJlYWR5IGluIHRoZSBzaGFyZWQgc3RvcmUgd2hlbiB0aGUgM0QgdmlldyBtb3VudGVkICh0aGUgaW1hZ2UncyBvd24sIHNheSkgYXJlXG4gICAgLy8gbm90IHNjcmVlbi1zcGFjZSBzaGFwZXMgYW5kIG11c3Qgc3Vydml2ZSBhbiBvcmJpdDsgb25seSB0aG9zZSBkcmF3biBoZXJlIGFyZSBjbGVhcmVkLlxuICAgIC8vIChObyBtaWQtZ2VzdHVyZSBjYXNlIHRvIGd1YXJkOiB0aGUgb3ZlcmxheSBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzIHdoaWxlIGRyYXdpbmcuKVxuICAgIGNvbnN0IGZvcmVpZ24gPSBuZXcgU2V0KHJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IHZpZXdlci5jYW1lcmEzZC5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZHJhd24gPSByZWdpb25TdG9yZVxuICAgICAgICAuZ2V0UmVnaW9ucygpXG4gICAgICAgIC5maWx0ZXIoKHIpID0+ICFmb3JlaWduLmhhcyhyLmlkKSlcbiAgICAgICAgLm1hcCgocikgPT4gci5pZCk7XG4gICAgICAvLyBOb3QgYW4gZWRpdCBvZiB0aGUgdXNlcidzOiBubyB1bmRvIHN0ZXAgKE5BUEFSSS1TVkMtMTEpLlxuICAgICAgaWYgKGRyYXduLmxlbmd0aCkgdGhpcy5ob3N0LmluWm9uZSgoKSA9PiByZWdpb25TdG9yZS5yZW1vdmVSZWdpb25zKGRyYXduLCB7IHJlY29yZFVuZG86IGZhbHNlIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIE92ZXJsYXlWaWV3ZXJ9IHRoZSAzRCByZWdpb24gb3ZlcmxheSBkcmF3cyB0aHJvdWdoOiBcIndvcmxkXCIgaXMgdGhlIGNhbnZhcywgaW5cbiAgICogY2FudmFzLWxvY2FsIENTUyBwaXhlbHMuIEEgcG9pbnRlciBhcnJpdmVzIGluIENMSUVOVCBwaXhlbHMsIHNvIGBjYW52YXNUb1dvcmxkYCBzdWJ0cmFjdHMgdGhlXG4gICAqIGNhbnZhcydzIGNsaWVudCBvZmZzZXQgKHdpdGhvdXQgaXQgdGhlIGxhc3NvIHdhcyBkcmF3biBvZmZzZXQgZnJvbSB0aGUgY3Vyc29yIHdoZW5ldmVyIHRoZVxuICAgKiBjYW52YXMgd2FzIG5vdCBhdCB0aGUgcGFnZSBvcmlnaW4pOyBkcmF3aW5nIGlzIHRoZW4gdGhlIGlkZW50aXR5LCB3aXRoIG5vIGxheW91dCByZWFkLlxuICAgKi9cbiAgc2NyZWVuU3BhY2VWaWV3ZXIodmlld2VyOiBWaWV3ZXIpOiBPdmVybGF5Vmlld2VyIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzVG9Xb3JsZDogKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmhvc3QuY2FudmFzKCk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4gciA/IFtjbGllbnRYIC0gci5sZWZ0LCBjbGllbnRZIC0gci50b3BdIDogW2NsaWVudFgsIGNsaWVudFldO1xuICAgICAgfSxcbiAgICAgIGNhbnZhc1RyYW5zZm9ybTogKCkgPT4gSURFTlRJVFlfQUZGSU5FLFxuICAgICAgc2V0Q29udHJvbHNFbmFibGVkOiAoZW5hYmxlZDogYm9vbGVhbikgPT4gdmlld2VyLnNldENvbnRyb2xzRW5hYmxlZChlbmFibGVkKSxcbiAgICAgIGNhbWVyYTogdmlld2VyLmNhbWVyYTNkLFxuICAgIH07XG4gIH1cblxuICAvKiogRW5kIHRoZSBzY2VuZSdzIGludGVyYWN0aW9uOiB0aGUgb3ZlcmxheSwgdGhlIGNhbWVyYSBob29rLCB0aGUgcGVuZGluZyB0aW1lcnMgYW5kIHRoZVxuICAgKiAgcGl4ZWxzIHJlYWQgZnJvbSB0aGUgb2xkIGNhbnZhcy4gVGhlIGFybWVkIHRvb2wgYW5kIHRoZSBwaXhlbC10b29sIHNldCBwZXJzaXN0LiAqL1xuICB0ZWFyZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXk/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3cG9ydFRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdwb3J0VGltZXIpO1xuICAgICAgdGhpcy52aWV3cG9ydFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5waXhlbHNTdGFsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2FtZXJhT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IG51bGw7XG4gICAgdGhpcy5sYXN0UGl4ZWxzID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGludG8gYGxhc3RQaXhlbHNgICh0aGUgcGl4ZWwtdG9vbHMnIHNvdXJjZSkgKyBlbWl0IHRoZSBjbGFtcGVkXG4gICAqICB2aXNpYmxlIHJlZ2lvbi4gQSBmcmVzaCBQaXhlbERhdGEgb2JqZWN0IG1lYW5zIGNhY2hlZEltYWdlRGF0YSgpIHJlYnVpbGRzIGF1dG9tYXRpY2FsbHkuICovXG4gIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmhvc3Qudmlld2VyKCk7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHB4ID0gYXdhaXQgdi5yZWFkRGlzcGxheWVkUGl4ZWxzKCk7XG4gICAgICBpZiAodGhpcy5ob3N0LnZpZXdlcigpICE9PSB2KSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gdi52aXNpYmxlV29ybGRSZWN0KCk7IC8vIGNhcHR1cmUgV0lUSCB0aGUgcGl4ZWxzIChzYW1lIGNhbWVyYSlcbiAgICAgIHRoaXMubGFzdFBpeGVscyA9IHB4O1xuICAgICAgdGhpcy5sYXN0UGl4ZWxzUmVjdCA9IHJlY3Q7XG4gICAgICB0aGlzLnBpeGVsc1N0YWxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRWaWV3cG9ydChyZWN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlIChubyBkZXZpY2UgeWV0LCBvciBpdCB3YXMgbG9zdCk6IHRoZSB0b29scyBrZWVwIHRoZSBsYXN0IHBpeGVscyAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIHJlYWRiYWNrIG9uIHRoZSBuZXh0IGZyYW1lIOKAlCBhZnRlciBhIHBsb3Qgb3IgYSBzY2VuZSBjaGFuZ2UgZHJldyBzb21ldGhpbmcgbmV3LiAqL1xuICBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3N0LnZpZXdlcigpKSByZXR1cm47XG4gICAgdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCkpO1xuICAgICAgZWxzZSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpLCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEZWJvdW5jZWQgcmVhZGJhY2sg4oCUIGFybWVkIG9uIGNhbWVyYSBjaGFuZ2VzIHdoaWxlIGEgcGl4ZWwgdG9vbCBpcyBhY3RpdmUsIHNvIGBsYXN0UGl4ZWxzYFxuICAgKiAgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXcgYWZ0ZXIgYSBwYW4vem9vbSBzZXR0bGVzLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIGFybVJlYWRiYWNrKGRlbGF5TXMgPSBSRUFEQkFDS19ERUJPVU5DRV9NUyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWFkYmFja1RpbWVyID0gbnVsbDtcbiAgICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgICB9LCBkZWxheU1zKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEVtaXQgdGhlIHZpc2libGUgcmVnaW9uLCBjbGFtcGVkIHRvIHRoZSBpbWFnZS4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnQocmVjdDogV29ybGRSZWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuaG9zdC5pbWFnZVNpemUoKTtcbiAgICBpZiAoIXNpemUgfHwgIXJlY3QpIHJldHVybjtcbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0LCByZWN0LnkpKTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKHNpemUud2lkdGggLSB4LCByZWN0LndpZHRoKSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgIHRoaXMuaG9zdC52aWV3cG9ydENoYW5nZWQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgMkQgcGFuL3pvb20uIFRoZSBmdWxsLWNhbnZhcyBHUFUgcmVhZGJhY2sgaXMgcGFpZCBmb3Igb25seSB3aGlsZSBhIHBpeGVsIHRvb2wgcmVhZHMgaXRcbiAgICogKHtAbGluayBwaXhlbFRvb2xzfSk7IG90aGVyd2lzZSBvbmx5IHRoZSB2aWV3cG9ydCByZWN0IGlzIGVtaXR0ZWQgKGRlYm91bmNlZCksIGFuZCB0aGUgcGl4ZWxzXG4gICAqIGFyZSBtYXJrZWQgc3RhbGUgZm9yIHdob2V2ZXIgbmV4dCBuZWVkcyB0aGVtIChhIHRvb2wgYXJtcyBhIGZyZXNoIHJlYWRiYWNrIGFzIGl0IGFjdGl2YXRlcykuXG4gICAqL1xuICBwcml2YXRlIG9uVmlld0NoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5waXhlbHNTdGFsZSA9IHRydWU7XG4gICAgaWYgKHRoaXMucGl4ZWxUb29scy5zaXplID4gMCkge1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygpOyAvLyBlbWl0cyB0aGUgdmlld3BvcnQgd2l0aCB0aGUgcGl4ZWxzXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0VGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMudmlld3BvcnRUaW1lcik7XG4gICAgdGhpcy52aWV3cG9ydFRpbWVyID0gdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3cG9ydFRpbWVyID0gbnVsbDtcbiAgICAgICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgICAgICBpZiAodmlld2VyKSB0aGlzLmVtaXRWaWV3cG9ydCh2aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpKTtcbiAgICAgIH0sIFJFQURCQUNLX0RFQk9VTkNFX01TKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBwaXhlbCB0b29scycgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gZm9yIHRoZSBjdXJyZW50IHZpZXdlci4gKi9cbiAgcHJpdmF0ZSBidWlsZENvb3JkaW5hdGVUcmFuc2Zvcm0oKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdmlld2VyLFxuICAgICAgKCkgPT4gISF0aGlzLmhvc3Qudmlld2VyKCkgJiYgKHRoaXMuaG9zdC5pbWFnZVNpemUoKT8ud2lkdGggPz8gMCkgPiAwLFxuICAgICk7XG4gIH1cblxuICAvKiogWm9vbS9wYW4gdGhlIGNhbWVyYSB0byBmaXQgYSBkYXRhLXNwYWNlIHJlY3RhbmdsZSBgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dYC4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuaG9zdC5jYW52YXMoKTtcbiAgICBpZiAoIXYgfHwgIWNhbnZhcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW3hNaW4sIHhNYXgsIHlBLCB5Ql0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoeE1pbiwgeE1heCk7XG4gICAgY29uc3QgeTAgPSBNYXRoLm1pbih5QSwgeUIpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoeUEsIHlCKTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgeDEgLSB4MCk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIHkxIC0geTApO1xuICAgIGNvbnN0IHZ3ID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSBjYW52YXMuY2xpZW50SGVpZ2h0IHx8IGg7XG4gICAgdi5jYW1lcmEuY2VudGVyID0gWyh4MCArIHgxKSAvIDIsICh5MCArIHkxKSAvIDJdO1xuICAgIHYuY2FtZXJhLnpvb20gPSBNYXRoLm1pbih2dyAvIHcsIHZoIC8gaCk7XG4gICAgdi5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQnVpbGQgQ2FjaGVkSW1hZ2VEYXRhIGZyb20gdGhlIG1vc3QgcmVjZW50IHJlYWRiYWNrIOKAlCBpdHMgUkdCQSBkZXZpY2UgcGl4ZWxzIGFyZSB0aGUgZnJhbWVcbiAgICogIGFzLWlzIChwYWNrZWQsIG5vIHBlci1waXhlbCBhcnJheXM6IE5BUEFSSS1TVkMtMjMpIOKAlCB3aXRoIHJhdGlvcy9vcmlnaW4gbWFwcGluZyBpbWFnZSBjb29yZHNcbiAgICogIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgY2FjaGVkSW1hZ2VEYXRhKCk6IENhY2hlZEltYWdlRGF0YSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXB4IHx8ICF2aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdmlld2VyLnZpc2libGVXb3JsZFJlY3QoKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0ge1xuICAgICAgZnJhbWVzOiBbcGFja2VkRnJhbWUocHguZGF0YSwgdywgaCldLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSdzIGBiZWZvcmVUb29sQ2hhbmdlYDogdHJhY2sgdGhlIHBpeGVsLXJlYWRpbmcgdG9vbCAoc2VlIHtAbGluayBvblZpZXdDaGFuZ2VkfSksXG4gICAqIGdhdGUgdGhlIGNhbWVyYSwgYW5kIGFybSBhIGZyZXNoIHJlYWRiYWNrIGZvciBhIHBpeGVsIHRvb2wuIE5vdGhpbmcgaXMgYXJtZWQgd2l0aG91dCBhXG4gICAqIHZpZXdlciwgbm9yIGEgcGl4ZWwgdG9vbCBiZWZvcmUgYSBwbG90IGJ1aWx0IGl0cyBjb29yZGluYXRlIHRyYW5zZm9ybS5cbiAgICpcbiAgICogQ29udHJvbCBnYXRpbmc6IGEgdG9vbCB0aGF0IEFDVElWQVRFUyBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzOyBkZWFjdGl2YXRpb24gaXMgYSBuby1vcFxuICAgKiBiZWNhdXNlIHRoZSBob3N0IGFsd2F5cyBjYWxscyB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIEZJUlNUIGluIGVhY2ggdG9nZ2xlICh3aGljaCBzZXRzXG4gICAqIHRoZSBiYXNlbGluZSBlbmFibGVkL2Rpc2FibGVkKSwgc28gcmUtZW5hYmxpbmcgaGVyZSB3b3VsZCBmaWdodCBhIGZyZXNobHktYWN0aXZhdGVkIGRyYXcgbW9kZS5cbiAgICovXG4gIGJlZm9yZVRvb2xDaGFuZ2UobmV4dDogQ2FudmFzVG9vbElkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucGl4ZWxUb29scy5jbGVhcigpO1xuICAgIGlmIChuZXh0ICE9PSBudWxsICYmIG5leHQgIT09ICd6b29tVG9Cb3gnKSB0aGlzLnBpeGVsVG9vbHMuYWRkKG5leHQpO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuIGZhbHNlOyAvLyBubyBwbG90IHlldCDihpIgbm90aGluZyB0byBkcml2ZVxuICAgIGlmIChuZXh0ID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobmV4dCAhPT0gJ3pvb21Ub0JveCcgJiYgIXRoaXMuY29vcmRUcmFuc2Zvcm0pIHJldHVybiBmYWxzZTtcbiAgICB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICBpZiAobmV4dCA9PT0gJ3pvb21Ub0JveCcpIHJldHVybiB0cnVlO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIC8vIFRoZSBlcmFzZXIgb25seSBjb252ZXJ0cyBjb29yZGluYXRlcyB3aXRoIHRoZSByZWFkYmFjaywgc28gYSBjdXJyZW50IG9uZSB3aWxsIGRvLlxuICAgIGlmIChuZXh0ICE9PSAnZXJhc2VWZXJ0ZXgnIHx8IHRoaXMucGl4ZWxzU3RhbGUpIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogU0FNIG92ZXIgdGhlIGRyYXduIHJlY3RhbmdsZXMg4oCUIGEgc2VydmVyIHJvdW5kLXRyaXAgdGhhdCByZWFkcyB0aGUgcmVjdGFuZ2xlcyBmcm9tIHRoZVxuICAgKiAgUmVnaW9uU3RvcmUgYW5kIHRoZSBpbWFnZSBmcm9tIGEgZnJlc2ggcmVhZGJhY2suIFJldHVybnMgdGhlIHJlZ2lvbnMgYWRkZWQuICovXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmhvc3Qudmlld2VyKCkgfHwgIXRoaXMuY29vcmRUcmFuc2Zvcm0pIHJldHVybiAwO1xuICAgIGF3YWl0IHRoaXMucnVuUmVhZGJhY2soKTsgLy8gdGhlIFNBTSBlbWJlZGRpbmcgc2FtcGxlcyB0aGUgY3VycmVudGx5LWRpc3BsYXllZCBpbWFnZVxuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlcHMuc2FtVG9vbC5zZWdtZW50Qm94ZXModGhpcy50b29sSG9zdCk7XG4gIH1cblxuICAvKiogQ2VsbHBvc2Ugb3ZlciB0aGUgZHJhd24gcmVjdGFuZ2xlcyAoc2VlIHtAbGluayBzZWdtZW50UmVjdGFuZ2xlc30pLiAqL1xuICBhc3luYyBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgc2VnbWVudGVyID0gdGhpcy5kZXBzLmNlbGxTZWdtZW50ZXI7XG4gICAgaWYgKCF0aGlzLmhvc3Qudmlld2VyKCkgfHwgIXRoaXMuY29vcmRUcmFuc2Zvcm0gfHwgIXNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlcHMuY2VsbFNlZ21lbnRUb29sLnNlZ21lbnRCb3hlcyh0aGlzLnRvb2xIb3N0LCBzZWdtZW50ZXIpO1xuICB9XG59XG4iXX0=
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXRvb2wtYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS10b29sLWJyaWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBS2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBaUIsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVV4RCwrRkFBK0Y7QUFDL0YsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxZQUNtQixNQUdoQixFQUNnQixLQUFvQjtRQUpwQixXQUFNLEdBQU4sTUFBTSxDQUd0QjtRQUNnQixVQUFLLEdBQUwsS0FBSyxDQUFlO0lBQ3BDLENBQUM7SUFDSixZQUFZLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDM0MsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsVUFBa0I7UUFDbkMsT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsd0JBQXdCO0lBQ3ZFLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBNkJEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGdC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LENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLEtBQUssQ0FBQyx5QkFBeUI7UUFDN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IENhbnZhc1Rvb2xJZCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IElDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSURFTlRJVFlfQUZGSU5FIH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIENhbnZhc1Rvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9jYW52YXMtdG9vbCc7XG5pbXBvcnQgeyBDYW52YXNUb29sTWFuYWdlciB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdG9vbC1raXQvY2FudmFzLXRvb2wtbWFuYWdlcic7XG5pbXBvcnQgeyBjcmVhdGVDYW52YXNUb29sTWFuYWdlciB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvY2FudmFzLXRvb2xzJztcbmltcG9ydCB7IHBhY2tlZEZyYW1lIH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9mcmFtZS1waXhlbHMnO1xuaW1wb3J0IHsgV2FuZFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlSZWdpb25PdmVybGF5LCBPdmVybGF5Vmlld2VyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgUkVBREJBQ0tfREVCT1VOQ0VfTVMgfSBmcm9tICcuL25hcGFyaS1oZWxwZXJzJztcblxuLyoqIEEgd29ybGQtc3BhY2UgcmVjdGFuZ2xlICh4LCB5ID0gdG9wLWxlZnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JsZFJlY3Qge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSBvdmVyIHRoZSBuYXBhcmkgY2FtZXJhOiBwb2ludGVyIGNsaWVudCBjb29yZHMg4oaUIGltYWdlL3dvcmxkIGNvb3Jkcy4gKi9cbmV4cG9ydCBjbGFzcyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtIGltcGxlbWVudHMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjoge1xuICAgICAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICByZWFkb25seSBjYW1lcmE6IHsgem9vbTogbnVtYmVyIH07XG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5OiAoKSA9PiBib29sZWFuLFxuICApIHt9XG4gIGNsaWVudFRvRGF0YShjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cbiAgZGF0YUxlbmd0aFRvU2NyZWVuKGRhdGFMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFMZW5ndGggKiB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTsgLy8gQ1NTIHB4IHBlciB3b3JsZCB1bml0XG4gIH1cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59XG5cbi8qKiBXaGF0IHRoZSBicmlkZ2UgcmVhZHMgZnJvbSB0aGUgc2VydmljZTogdGhlIGxpdmUgdmlld2VyIGFuZCBpdHMgRE9NLCB0aGUgaW1hZ2Ugb24gc2NyZWVuLCBhbmRcbiAqICB3aGVyZSB0aGUgdmlld3BvcnQgYW5kIHpvbmUtY3Jvc3Npbmcgb3V0cHV0IGdvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sQnJpZGdlSG9zdCB7XG4gIHZpZXdlcigpOiBWaWV3ZXIgfCBudWxsO1xuICBob3N0KCk6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgLyoqIFRoZSBpbWFnZSdzIGZ1bGwtcmVzb2x1dGlvbiBzaXplLCBvciBudWxsIGJlZm9yZSBvbmUgaXMgZHJhd24uICovXG4gIGltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBmcmFtZUluZGV4KCk6IG51bWJlcjtcbiAgZmlsZU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHZpc2libGUgcmVnaW9uIGNoYW5nZWQgKGNsYW1wZWQgdG8gdGhlIGltYWdlKTsgY2FsbGVkIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS4gKi9cbiAgdmlld3BvcnRDaGFuZ2VkKHJlY3Q6IFdvcmxkUmVjdCk6IHZvaWQ7XG4gIC8qKiBSdW4gYGZuYCBvdXRzaWRlIC8gaW5zaWRlIHRoZSBBbmd1bGFyIHpvbmUuICovXG4gIG91dHNpZGVab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbiAgaW5ab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbn1cblxuLyoqIFRoZSBzZXJ2aWNlcyB0aGUgcGl4ZWwgdG9vbHMgYW5kIHNlZ21lbnRhdGlvbiBydW5zIG5lZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xCcmlkZ2VEZXBzIHtcbiAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlO1xuICB3YW5kU2VydmljZTogV2FuZFNlcnZpY2U7XG4gIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlO1xuICBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2U7XG4gIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZTtcbiAgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBuYXBhcmkgYmFja2VuZCdzIHNpZGUgb2YgdGhlIHNoYXJlZCBjYW52YXMgdG9vbHMgKHJldmlldyBBcHBlbmRpeCBCLCBzdGVwIDQpOiB0aGUgcmVnaW9uXG4gKiBvdmVybGF5LCB0aGUge0BsaW5rIENhbnZhc1Rvb2xNYW5hZ2VyfSBhbmQgaXRzIGhvc3QsIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSwgYW5kIHRoZVxuICogZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIHRoZSB3YW5kLCBicnVzaCwgZXJhc2VyIGFuZCBTQU0vY2VsbHBvc2UgcmVhZCDigJQga2VwdCBjdXJyZW50IGFzIHRoZVxuICogY2FtZXJhIG1vdmVzLCBidXQgb25seSBwYWlkIGZvciB3aGlsZSBhIHBpeGVsIHRvb2wgbmVlZHMgaXQgKE5BUEFSSS1TVkMtMjYpLlxuICpcbiAqIE9uZSBwZXIgc2VydmljZTsge0BsaW5rIHRlYXJkb3dufSBlbmRzIGEgc2NlbmUncyBpbnRlcmFjdGlvbiAob3ZlcmxheSwgY2FtZXJhIGhvb2ssIHRpbWVycyxcbiAqIHBpeGVscykgYW5kIGFuIGBpbnN0YWxs4oCmSW50ZXJhY3Rpb25gIHN0YXJ0cyB0aGUgbmV4dCBvbmUncy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hcGFyaVRvb2xCcmlkZ2Uge1xuICAvKiogV2hhdCB0aGlzIGJhY2tlbmQncyBjYW52YXMgdG9vbHMgcmVhZCBhbmQgd3JpdGUgKG9uZSBob3N0IGZvciBldmVyeSB0b29sKS4gKi9cbiAgcmVhZG9ubHkgdG9vbEhvc3Q6IENhbnZhc1Rvb2xIb3N0O1xuICAvKiogVGhpcyBiYWNrZW5kJ3Mgb3duIHdhbmQsIGJydXNoLCBlcmFzZXIsIHpvb20tdG8tYm94IGFuZCBTQU0gcG9pbnQgdG9vbHMuICovXG4gIHJlYWRvbmx5IGNhbnZhc1Rvb2xzOiBDYW52YXNUb29sTWFuYWdlcjtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IChudWxsIHVudGlsIGEgMkQvM0QgaW50ZXJhY3Rpb24gaXMgaW5zdGFsbGVkKS4gKi9cbiAgcmVnaW9uT3ZlcmxheTogTmFwYXJpUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBpeGVsIHRvb2xzJyBwb2ludGVyIOKGlCB3b3JsZCB0cmFuc2Zvcm0gZm9yIHRoZSBjdXJyZW50IHZpZXdlci4gKi9cbiAgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgbGFzdCByZWFkYmFjayBvZiB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSAodGhlIHBpeGVsIHRvb2xzJyBzb3VyY2UpLiAqL1xuICBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgLyoqIFZpc2libGUgd29ybGQgcmVjdCBjYXB0dXJlZCBBVCB0aGUgbGFzdCByZWFkYmFjayDigJQgbXVzdCBwYWlyIHdpdGggYGxhc3RQaXhlbHNgIHNvIHRoZSBwaXhlbFxuICAgKiAgdG9vbHMnIHJhdGlvcy9vcmlnaW4gbWF0Y2ggdGhlIG1hdHJpeCdzIGNhbWVyYSAodXNpbmcgdGhlIGxpdmUgcmVjdCBhZnRlciBhIHBhbi96b29tIHdvdWxkXG4gICAqICBtaXMtc2NhbGUgdGhlIHJlZ2lvbikuICovXG4gIGxhc3RQaXhlbHNSZWN0OiBXb3JsZFJlY3QgfCBudWxsID0gbnVsbDtcbiAgLyoqIEFjdGl2ZSB0b29scyB0aGF0IHJlYWQgdGhlIGRpc3BsYXllZCBwaXhlbHM7IGEgcGFuL3pvb20gcmUtcmVhZHMgdGhlbSBvbmx5IHdoaWxlIG5vbi1lbXB0eS4gKi9cbiAgcmVhZG9ubHkgcGl4ZWxUb29scyA9IG5ldyBTZXQ8Q2FudmFzVG9vbElkPigpO1xuICAvKiogVGhlIGNhbWVyYSBtb3ZlZCBzaW5jZSB7QGxpbmsgbGFzdFBpeGVsc30gd2FzIHJlYWQuICovXG4gIHBpeGVsc1N0YWxlID0gZmFsc2U7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEZWJvdW5jZWQgcmVhZGJhY2sgdGltZXIgKyBjYW1lcmEtY2hhbmdlIHVuc3Vic2NyaWJlIChrZWVwIGxhc3RQaXhlbHMgY3VycmVudCBmb3IgdG9vbHMpLiAqL1xuICBwcml2YXRlIHJlYWRiYWNrVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEZWJvdW5jZWQgdmlld3BvcnQgZW1pc3Npb24gZm9yIGEgY2FtZXJhIGNoYW5nZSB0aGF0IG5lZWRzIG5vIHBpeGVscy4gKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYU9mZjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBUb29sQnJpZGdlSG9zdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IFRvb2xCcmlkZ2VEZXBzLFxuICApIHtcbiAgICBjb25zdCB7IHJlZ2lvblN0b3JlIH0gPSBkZXBzO1xuICAgIC8vIFRoZSBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0XG4gICAgLy8gcG9pbnRlciBjb29yZHMgdmlhIHRoZSBuYXBhcmkgY2FtZXJhLCBtaXJyb3JpbmcgdGhlIE9TRCBob3N0LiBUaGlzIGJhY2tlbmQgb3ducyBpdHMgb3duIHRvb2xcbiAgICAvLyBpbnN0YW5jZXMgKFJULTIxKTsgdGhlIGhvc3QgcmVhZHMgbGl2ZSBzdGF0ZSwgc28gaXQgaXMgYnVpbHQgb25jZS5cbiAgICB0aGlzLnRvb2xIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gcmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvblN0b3JlLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiBob3N0LmZyYW1lSW5kZXgoKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IGhvc3QuaG9zdCgpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiBob3N0LmZpbGVOYW1lKCksXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksXG4gICAgICBwaXhlbFRvRGF0YTogKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gaG9zdC5ob3N0KCk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB2aWV3ZXIgPSBob3N0LnZpZXdlcigpO1xuICAgICAgICBpZiAoIXZpZXdlciB8fCAhcmVjdCkgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgICAgICBjb25zdCBbeCwgeV0gPSB2aWV3ZXIuY2FudmFzVG9Xb3JsZChyZWN0LmxlZnQgKyBweCwgcmVjdC50b3AgKyBweSk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgIH0sXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gICAgdGhpcy5jYW52YXNUb29scyA9IGNyZWF0ZUNhbnZhc1Rvb2xNYW5hZ2VyKHRoaXMudG9vbEhvc3QsIHtcbiAgICAgIHdhbmRTZXJ2aWNlOiBkZXBzLndhbmRTZXJ2aWNlLFxuICAgICAgcmVnaW9uU3RvcmUsXG4gICAgICBzYW1Qb2ludDogZGVwcy5zYW1Qb2ludFRvb2wsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGludGVyYWN0aW9uIHN0YWNrIGV2ZXJ5IDJEIG1vZGUgbmVlZHM6IHRoZSByZWdpb24gb3ZlcmxheSAoZHJhdy9zZWxlY3QvZWRpdCksIHRoZSBwaXhlbFxuICAgKiB0b29scyB0aGF0IHJlYWQgYmFjayBkaXNwbGF5ZWQgcGl4ZWxzICh3YW5kLCBicnVzaCwgdmVydGV4IGVyYXNlciwgem9vbS10by1ib3gsIFNBTS9jZWxscG9zZSksXG4gICAqIGFuZCBhIGNhbWVyYSBob29rIHRoYXQga2VlcHMgdGhhdCByZWFkYmFjayBjdXJyZW50IGFzIHRoZSB2aWV3IHBhbnMvem9vbXMgYW5kIHRpbGVkIGxldmVsc1xuICAgKiBsb2FkLlxuICAgKlxuICAgKiBPbmUgY2FsbCBmb3IgYWxsIG9mIGl0IGJlY2F1c2UgZm9yZ2V0dGluZyBpdCBpcyBpbnZpc2libGU6IHRoZSB0b29sYmFyIGdhdGVzIGl0cyByZWdpb24gYnV0dG9uc1xuICAgKiBvbiAyRC12cy0zRCByYXRoZXIgdGhhbiBvbiBwbG90IHR5cGUsIHNvIGEgMkQgbW9kZSB0aGF0IHNraXBzIHRoaXMgc2hvd3MgZXZlcnkgdG9vbCBhbmQgc2lsZW50bHlcbiAgICogZG9lcyBub3RoaW5nLiBUaGF0IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5lZCB0byB0aGUgc3BhdGlhbCBhbmQgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIgbW9kZXMuXG4gICAqL1xuICBpbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB2aWV3ZXIsIHRoaXMuZGVwcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZENvb3JkaW5hdGVUcmFuc2Zvcm0oKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMub25WaWV3Q2hhbmdlZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpb24gZHJhd2luZyBmb3IgdGhlIDNEIGNsb3VkLlxuICAgKlxuICAgKiBSZXVzZXMge0BsaW5rIE5hcGFyaVJlZ2lvbk92ZXJsYXl9IHZlcmJhdGltIGJ5IGhhbmRpbmcgaXQgYSBTQ1JFRU4tU1BBQ0Ugdmlld2VyOiB0aGUgZHJhd25cbiAgICogc2hhcGUgaXMgYSBsYXNzbyBpbiBjYW52YXMgcGl4ZWxzLCBzbyBcIndvcmxkXCIgaXMgdGhlIGNhbnZhcyBhbmQgYm90aCB0cmFuc2Zvcm1zIGFyZSBpZGVudGl0eVxuICAgKiAoYmFyIHRoZSBjbGllbnTihpJjYW52YXMgb2Zmc2V0KS4gRXZlcnkgZXhpc3RpbmcgdG9vbCDigJQgcmVjdGFuZ2xlLCBwb2x5Z29uLCBmcmVlaGFuZCDigJQgdGhlcmVmb3JlXG4gICAqIHdvcmtzIGluIDNEIHdpdGggbm8gbmV3IGRyYXdpbmcgY29kZS5cbiAgICpcbiAgICogQSBzY3JlZW4tc3BhY2Ugc2hhcGUgc3RvcHMgbWVhbmluZyBhbnl0aGluZyB0aGUgbW9tZW50IHRoZSBjYW1lcmEgbW92ZXMsIHNvIGFuIG9yYml0IGNsZWFyc1xuICAgKiB0aGUgcmVnaW9ucyBkcmF3biBpbiB0aGlzIHZpZXcgKGFuZCBvbmx5IHRob3NlKS4gVGhlIFNFTEVDVElPTiB0aGV5IHByb2R1Y2VkIGlzIGtlcHQ6IHRoYXQgaXNcbiAgICogdGhlIGR1cmFibGUgYXJ0ZWZhY3QsIGFuZCB0aGUgaGlnaGxpZ2h0ZWQgcG9pbnRzIHN0YXkgaGlnaGxpZ2h0ZWQgZnJvbSBldmVyeSBhbmdsZS5cbiAgICpcbiAgICogRXZlcnkgb3RoZXIgcmVnaW9uIGluIHRoZSBzdG9yZSBpcyBpbiBpbWFnZSBzcGFjZSAtIHRoZSBpbWFnZSdzIG93biwgYW4gaW1wb3J0ZWQgc2V0LFxuICAgKiBzdHJ1Y3R1cmVzIGEgdHJlZSBjbGljayB0b29rIGZyb20gYSByZWdpb24gc291cmNlIC0gc28gdGhlIG92ZXJsYXkgbmVpdGhlciBkcmF3cyBub3IgcGlja3MgaXRcbiAgICogKGl0IHdvdWxkIGxpZSBmbGF0IGF0IGNhbnZhcyBwaXhlbHMgb3ZlciB0aGUgY2xvdWQpLCBhbmQgYW4gb3JiaXQgbGVhdmVzIGl0IGFsb25lOiB0aGV5IHNob3dcbiAgICogaW4gM0QgYXMgdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIGluc3RlYWQuXG4gICAqL1xuICBpbnN0YWxsM2RJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlZ2lvblN0b3JlIH0gPSB0aGlzLmRlcHM7XG4gICAgLy8gV29ybGQgaGVyZSBpcyB0aGUgY2FudmFzLCBub3QgdGhlIGltYWdlOiBubyByZWdpb24gc291cmNlIHRvIGRyYXcuXG4gICAgY29uc3Qgb3ZlcmxheSA9IG5ldyBOYXBhcmlSZWdpb25PdmVybGF5KGhvc3QsIHRoaXMuc2NyZWVuU3BhY2VWaWV3ZXIodmlld2VyKSwgcmVnaW9uU3RvcmUsIHtcbiAgICAgIHJlZ2lvblNvdXJjZTogZmFsc2UsXG4gICAgICBzY3JlZW5TcGFjZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBvdmVybGF5O1xuICAgIHRoaXMuYnVpbGRDb29yZGluYXRlVHJhbnNmb3JtKCk7XG4gICAgLy8gKE5vIG1pZC1nZXN0dXJlIGNhc2UgdG8gZ3VhcmQ6IHRoZSBvdmVybGF5IGRpc2FibGVzIHRoZSBjYW1lcmEgY29udHJvbHMgd2hpbGUgZHJhd2luZy4pXG4gICAgdGhpcy5jYW1lcmFPZmYgPSB2aWV3ZXIuY2FtZXJhM2QuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMuY2xlYXJPd25MYXNzb3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSByZWdpb25zIHRoZSAzRCBvdmVybGF5IGRyZXcgaW4gc2NyZWVuIHNwYWNlIChvbmx5IHRob3NlKSBmcm9tIHRoZSBzdG9yZTogYSBsYXNzb1xuICAgKiBtZWFucyBub3RoaW5nIG9uY2UgdGhlIGNhbWVyYSBpdCB3YXMgZHJhd24gdW5kZXIgbW92ZXMgb3IgdGhlIHNjZW5lIGdvZXMuIE5vdCBhbiBlZGl0IG9mIHRoZVxuICAgKiB1c2VyJ3M6IG5vIHVuZG8gc3RlcCAoTkFQQVJJLVNWQy0xMSkuXG4gICAqL1xuICBwcml2YXRlIGNsZWFyT3duTGFzc29zKCk6IHZvaWQge1xuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgeyByZWdpb25TdG9yZSB9ID0gdGhpcy5kZXBzO1xuICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KHJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBjb25zdCBkcmF3biA9IG92ZXJsYXkub3duUmVnaW9uSWRzKCkuZmlsdGVyKChpZCkgPT4gcHJlc2VudC5oYXMoaWQpKTtcbiAgICBpZiAoZHJhd24ubGVuZ3RoKSB0aGlzLmhvc3QuaW5ab25lKCgpID0+IHJlZ2lvblN0b3JlLnJlbW92ZVJlZ2lvbnMoZHJhd24sIHsgcmVjb3JkVW5kbzogZmFsc2UgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgT3ZlcmxheVZpZXdlcn0gdGhlIDNEIHJlZ2lvbiBvdmVybGF5IGRyYXdzIHRocm91Z2g6IFwid29ybGRcIiBpcyB0aGUgY2FudmFzLCBpblxuICAgKiBjYW52YXMtbG9jYWwgQ1NTIHBpeGVscy4gQSBwb2ludGVyIGFycml2ZXMgaW4gQ0xJRU5UIHBpeGVscywgc28gYGNhbnZhc1RvV29ybGRgIHN1YnRyYWN0cyB0aGVcbiAgICogY2FudmFzJ3MgY2xpZW50IG9mZnNldCAod2l0aG91dCBpdCB0aGUgbGFzc28gd2FzIGRyYXduIG9mZnNldCBmcm9tIHRoZSBjdXJzb3Igd2hlbmV2ZXIgdGhlXG4gICAqIGNhbnZhcyB3YXMgbm90IGF0IHRoZSBwYWdlIG9yaWdpbik7IGRyYXdpbmcgaXMgdGhlbiB0aGUgaWRlbnRpdHksIHdpdGggbm8gbGF5b3V0IHJlYWQuXG4gICAqL1xuICBzY3JlZW5TcGFjZVZpZXdlcih2aWV3ZXI6IFZpZXdlcik6IE92ZXJsYXlWaWV3ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBjYW52YXNUb1dvcmxkOiAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgciA9IHRoaXMuaG9zdC5jYW52YXMoKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiByID8gW2NsaWVudFggLSByLmxlZnQsIGNsaWVudFkgLSByLnRvcF0gOiBbY2xpZW50WCwgY2xpZW50WV07XG4gICAgICB9LFxuICAgICAgY2FudmFzVHJhbnNmb3JtOiAoKSA9PiBJREVOVElUWV9BRkZJTkUsXG4gICAgICBzZXRDb250cm9sc0VuYWJsZWQ6IChlbmFibGVkOiBib29sZWFuKSA9PiB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGVuYWJsZWQpLFxuICAgICAgY2FtZXJhOiB2aWV3ZXIuY2FtZXJhM2QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBFbmQgdGhlIHNjZW5lJ3MgaW50ZXJhY3Rpb246IHRoZSBvdmVybGF5LCB0aGUgY2FtZXJhIGhvb2ssIHRoZSBwZW5kaW5nIHRpbWVycyBhbmQgdGhlXG4gICAqICBwaXhlbHMgcmVhZCBmcm9tIHRoZSBvbGQgY2FudmFzLiBUaGUgYXJtZWQgdG9vbCBhbmQgdGhlIHBpeGVsLXRvb2wgc2V0IHBlcnNpc3QuICovXG4gIHRlYXJkb3duKCk6IHZvaWQge1xuICAgIC8vIFRoZSBvdmVybGF5J3MgcmVjb3JkIG9mIGl0cyBsYXNzb3MgZ29lcyB3aXRoIGl0OiByZW1vdmUgdGhlbSBmaXJzdCwgb3IgdGhleSB3b3VsZCBzdGF5IGluXG4gICAgLy8gdGhlIHN0b3JlIHVub3duZWQgLSBoaWRkZW4gYnkgdGhlIG5leHQgM0Qgb3ZlcmxheSwgYmV5b25kIGFuIG9yYml0J3MgcmVhY2gsIGFuZCBzdGlsbFxuICAgIC8vIGZlZWRpbmcgXCJTZWxlY3QgZnJvbSBST0lzXCIgd2l0aCBzY3JlZW4gY29vcmRpbmF0ZXMgb2YgYSBjYW1lcmEgdGhhdCBpcyBnb25lLlxuICAgIHRoaXMuY2xlYXJPd25MYXNzb3MoKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXk/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3cG9ydFRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdwb3J0VGltZXIpO1xuICAgICAgdGhpcy52aWV3cG9ydFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5waXhlbHNTdGFsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2FtZXJhT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IG51bGw7XG4gICAgdGhpcy5sYXN0UGl4ZWxzID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGludG8gYGxhc3RQaXhlbHNgICh0aGUgcGl4ZWwtdG9vbHMnIHNvdXJjZSkgKyBlbWl0IHRoZSBjbGFtcGVkXG4gICAqICB2aXNpYmxlIHJlZ2lvbi4gQSBmcmVzaCBQaXhlbERhdGEgb2JqZWN0IG1lYW5zIGNhY2hlZEltYWdlRGF0YSgpIHJlYnVpbGRzIGF1dG9tYXRpY2FsbHkuICovXG4gIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmhvc3Qudmlld2VyKCk7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHB4ID0gYXdhaXQgdi5yZWFkRGlzcGxheWVkUGl4ZWxzKCk7XG4gICAgICBpZiAodGhpcy5ob3N0LnZpZXdlcigpICE9PSB2KSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gdi52aXNpYmxlV29ybGRSZWN0KCk7IC8vIGNhcHR1cmUgV0lUSCB0aGUgcGl4ZWxzIChzYW1lIGNhbWVyYSlcbiAgICAgIHRoaXMubGFzdFBpeGVscyA9IHB4O1xuICAgICAgdGhpcy5sYXN0UGl4ZWxzUmVjdCA9IHJlY3Q7XG4gICAgICB0aGlzLnBpeGVsc1N0YWxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRWaWV3cG9ydChyZWN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlIChubyBkZXZpY2UgeWV0LCBvciBpdCB3YXMgbG9zdCk6IHRoZSB0b29scyBrZWVwIHRoZSBsYXN0IHBpeGVscyAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIHJlYWRiYWNrIG9uIHRoZSBuZXh0IGZyYW1lIOKAlCBhZnRlciBhIHBsb3Qgb3IgYSBzY2VuZSBjaGFuZ2UgZHJldyBzb21ldGhpbmcgbmV3LiAqL1xuICBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3N0LnZpZXdlcigpKSByZXR1cm47XG4gICAgdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCkpO1xuICAgICAgZWxzZSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpLCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEZWJvdW5jZWQgcmVhZGJhY2sg4oCUIGFybWVkIG9uIGNhbWVyYSBjaGFuZ2VzIHdoaWxlIGEgcGl4ZWwgdG9vbCBpcyBhY3RpdmUsIHNvIGBsYXN0UGl4ZWxzYFxuICAgKiAgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXcgYWZ0ZXIgYSBwYW4vem9vbSBzZXR0bGVzLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIGFybVJlYWRiYWNrKGRlbGF5TXMgPSBSRUFEQkFDS19ERUJPVU5DRV9NUyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWFkYmFja1RpbWVyID0gbnVsbDtcbiAgICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgICB9LCBkZWxheU1zKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEVtaXQgdGhlIHZpc2libGUgcmVnaW9uLCBjbGFtcGVkIHRvIHRoZSBpbWFnZS4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnQocmVjdDogV29ybGRSZWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuaG9zdC5pbWFnZVNpemUoKTtcbiAgICBpZiAoIXNpemUgfHwgIXJlY3QpIHJldHVybjtcbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0LCByZWN0LnkpKTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKHNpemUud2lkdGggLSB4LCByZWN0LndpZHRoKSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgIHRoaXMuaG9zdC52aWV3cG9ydENoYW5nZWQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgMkQgcGFuL3pvb20uIFRoZSBmdWxsLWNhbnZhcyBHUFUgcmVhZGJhY2sgaXMgcGFpZCBmb3Igb25seSB3aGlsZSBhIHBpeGVsIHRvb2wgcmVhZHMgaXRcbiAgICogKHtAbGluayBwaXhlbFRvb2xzfSk7IG90aGVyd2lzZSBvbmx5IHRoZSB2aWV3cG9ydCByZWN0IGlzIGVtaXR0ZWQgKGRlYm91bmNlZCksIGFuZCB0aGUgcGl4ZWxzXG4gICAqIGFyZSBtYXJrZWQgc3RhbGUgZm9yIHdob2V2ZXIgbmV4dCBuZWVkcyB0aGVtIChhIHRvb2wgYXJtcyBhIGZyZXNoIHJlYWRiYWNrIGFzIGl0IGFjdGl2YXRlcykuXG4gICAqL1xuICBwcml2YXRlIG9uVmlld0NoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5waXhlbHNTdGFsZSA9IHRydWU7XG4gICAgaWYgKHRoaXMucGl4ZWxUb29scy5zaXplID4gMCkge1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygpOyAvLyBlbWl0cyB0aGUgdmlld3BvcnQgd2l0aCB0aGUgcGl4ZWxzXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0VGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMudmlld3BvcnRUaW1lcik7XG4gICAgdGhpcy52aWV3cG9ydFRpbWVyID0gdGhpcy5ob3N0Lm91dHNpZGVab25lKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3cG9ydFRpbWVyID0gbnVsbDtcbiAgICAgICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgICAgICBpZiAodmlld2VyKSB0aGlzLmVtaXRWaWV3cG9ydCh2aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpKTtcbiAgICAgIH0sIFJFQURCQUNLX0RFQk9VTkNFX01TKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBwaXhlbCB0b29scycgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gZm9yIHRoZSBjdXJyZW50IHZpZXdlci4gKi9cbiAgcHJpdmF0ZSBidWlsZENvb3JkaW5hdGVUcmFuc2Zvcm0oKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdmlld2VyLFxuICAgICAgKCkgPT4gISF0aGlzLmhvc3Qudmlld2VyKCkgJiYgKHRoaXMuaG9zdC5pbWFnZVNpemUoKT8ud2lkdGggPz8gMCkgPiAwLFxuICAgICk7XG4gIH1cblxuICAvKiogWm9vbS9wYW4gdGhlIGNhbWVyYSB0byBmaXQgYSBkYXRhLXNwYWNlIHJlY3RhbmdsZSBgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dYC4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuaG9zdC5jYW52YXMoKTtcbiAgICBpZiAoIXYgfHwgIWNhbnZhcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW3hNaW4sIHhNYXgsIHlBLCB5Ql0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoeE1pbiwgeE1heCk7XG4gICAgY29uc3QgeTAgPSBNYXRoLm1pbih5QSwgeUIpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoeUEsIHlCKTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgeDEgLSB4MCk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIHkxIC0geTApO1xuICAgIGNvbnN0IHZ3ID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSBjYW52YXMuY2xpZW50SGVpZ2h0IHx8IGg7XG4gICAgdi5jYW1lcmEuY2VudGVyID0gWyh4MCArIHgxKSAvIDIsICh5MCArIHkxKSAvIDJdO1xuICAgIHYuY2FtZXJhLnpvb20gPSBNYXRoLm1pbih2dyAvIHcsIHZoIC8gaCk7XG4gICAgdi5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQnVpbGQgQ2FjaGVkSW1hZ2VEYXRhIGZyb20gdGhlIG1vc3QgcmVjZW50IHJlYWRiYWNrIOKAlCBpdHMgUkdCQSBkZXZpY2UgcGl4ZWxzIGFyZSB0aGUgZnJhbWVcbiAgICogIGFzLWlzIChwYWNrZWQsIG5vIHBlci1waXhlbCBhcnJheXM6IE5BUEFSSS1TVkMtMjMpIOKAlCB3aXRoIHJhdGlvcy9vcmlnaW4gbWFwcGluZyBpbWFnZSBjb29yZHNcbiAgICogIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgY2FjaGVkSW1hZ2VEYXRhKCk6IENhY2hlZEltYWdlRGF0YSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXB4IHx8ICF2aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdmlld2VyLnZpc2libGVXb3JsZFJlY3QoKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0ge1xuICAgICAgZnJhbWVzOiBbcGFja2VkRnJhbWUocHguZGF0YSwgdywgaCldLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSdzIGBiZWZvcmVUb29sQ2hhbmdlYDogdHJhY2sgdGhlIHBpeGVsLXJlYWRpbmcgdG9vbCAoc2VlIHtAbGluayBvblZpZXdDaGFuZ2VkfSksXG4gICAqIGdhdGUgdGhlIGNhbWVyYSwgYW5kIGFybSBhIGZyZXNoIHJlYWRiYWNrIGZvciBhIHBpeGVsIHRvb2wuIE5vdGhpbmcgaXMgYXJtZWQgd2l0aG91dCBhXG4gICAqIHZpZXdlciwgbm9yIGEgcGl4ZWwgdG9vbCBiZWZvcmUgYSBwbG90IGJ1aWx0IGl0cyBjb29yZGluYXRlIHRyYW5zZm9ybS5cbiAgICpcbiAgICogQ29udHJvbCBnYXRpbmc6IGEgdG9vbCB0aGF0IEFDVElWQVRFUyBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzOyBkZWFjdGl2YXRpb24gaXMgYSBuby1vcFxuICAgKiBiZWNhdXNlIHRoZSBob3N0IGFsd2F5cyBjYWxscyB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIEZJUlNUIGluIGVhY2ggdG9nZ2xlICh3aGljaCBzZXRzXG4gICAqIHRoZSBiYXNlbGluZSBlbmFibGVkL2Rpc2FibGVkKSwgc28gcmUtZW5hYmxpbmcgaGVyZSB3b3VsZCBmaWdodCBhIGZyZXNobHktYWN0aXZhdGVkIGRyYXcgbW9kZS5cbiAgICovXG4gIGJlZm9yZVRvb2xDaGFuZ2UobmV4dDogQ2FudmFzVG9vbElkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucGl4ZWxUb29scy5jbGVhcigpO1xuICAgIGlmIChuZXh0ICE9PSBudWxsICYmIG5leHQgIT09ICd6b29tVG9Cb3gnKSB0aGlzLnBpeGVsVG9vbHMuYWRkKG5leHQpO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuIGZhbHNlOyAvLyBubyBwbG90IHlldCDihpIgbm90aGluZyB0byBkcml2ZVxuICAgIGlmIChuZXh0ID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobmV4dCAhPT0gJ3pvb21Ub0JveCcgJiYgIXRoaXMuY29vcmRUcmFuc2Zvcm0pIHJldHVybiBmYWxzZTtcbiAgICB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICBpZiAobmV4dCA9PT0gJ3pvb21Ub0JveCcpIHJldHVybiB0cnVlO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIC8vIFRoZSBlcmFzZXIgb25seSBjb252ZXJ0cyBjb29yZGluYXRlcyB3aXRoIHRoZSByZWFkYmFjaywgc28gYSBjdXJyZW50IG9uZSB3aWxsIGRvLlxuICAgIGlmIChuZXh0ICE9PSAnZXJhc2VWZXJ0ZXgnIHx8IHRoaXMucGl4ZWxzU3RhbGUpIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogU0FNIG92ZXIgdGhlIGRyYXduIHJlY3RhbmdsZXMg4oCUIGEgc2VydmVyIHJvdW5kLXRyaXAgdGhhdCByZWFkcyB0aGUgcmVjdGFuZ2xlcyBmcm9tIHRoZVxuICAgKiAgUmVnaW9uU3RvcmUgYW5kIHRoZSBpbWFnZSBmcm9tIGEgZnJlc2ggcmVhZGJhY2suIFJldHVybnMgdGhlIHJlZ2lvbnMgYWRkZWQuICovXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmhvc3Qudmlld2VyKCkgfHwgIXRoaXMuY29vcmRUcmFuc2Zvcm0pIHJldHVybiAwO1xuICAgIGF3YWl0IHRoaXMucnVuUmVhZGJhY2soKTsgLy8gdGhlIFNBTSBlbWJlZGRpbmcgc2FtcGxlcyB0aGUgY3VycmVudGx5LWRpc3BsYXllZCBpbWFnZVxuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlcHMuc2FtVG9vbC5zZWdtZW50Qm94ZXModGhpcy50b29sSG9zdCk7XG4gIH1cblxuICAvKiogQ2VsbHBvc2Ugb3ZlciB0aGUgZHJhd24gcmVjdGFuZ2xlcyAoc2VlIHtAbGluayBzZWdtZW50UmVjdGFuZ2xlc30pLiAqL1xuICBhc3luYyBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgc2VnbWVudGVyID0gdGhpcy5kZXBzLmNlbGxTZWdtZW50ZXI7XG4gICAgaWYgKCF0aGlzLmhvc3Qudmlld2VyKCkgfHwgIXRoaXMuY29vcmRUcmFuc2Zvcm0gfHwgIXNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlcHMuY2VsbFNlZ21lbnRUb29sLnNlZ21lbnRCb3hlcyh0aGlzLnRvb2xIb3N0LCBzZWdtZW50ZXIpO1xuICB9XG59XG4iXX0=
|