@jax-data-science/sci-image-visualizer 0.10.0 → 0.11.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/index.mjs +4 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
- package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
- package/esm2022/lib/region-editor/region-editor.component.mjs +147 -4
- package/esm2022/lib/region-editor/region-persistence.service.mjs +9 -1
- package/esm2022/lib/region-import/label-classes.mjs +149 -0
- package/esm2022/lib/region-import/label-volume.mjs +194 -0
- package/esm2022/lib/region-import/region-import.mjs +71 -0
- package/esm2022/lib/routing-visualizer.service.mjs +93 -1
- package/esm2022/lib/store/region-source-scope.mjs +19 -4
- package/esm2022/lib/store/region-store.service.mjs +64 -14
- package/esm2022/lib/visualizer.component.mjs +28 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs} +1049 -188
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/index.d.ts +6 -0
- package/lib/contracts/ports/region-io.port.d.ts +24 -0
- package/lib/contracts/region-editor-api.contract.d.ts +19 -1
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
- package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
- package/lib/implementations/osd/slice-cache.d.ts +13 -3
- package/lib/region-editor/region-editor.component.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +5 -1
- package/lib/region-import/label-classes.d.ts +39 -0
- package/lib/region-import/label-volume.d.ts +31 -0
- package/lib/region-import/region-import.d.ts +46 -0
- package/lib/routing-visualizer.service.d.ts +30 -0
- package/lib/store/region-source-scope.d.ts +8 -2
- package/lib/store/region-store.service.d.ts +15 -5
- package/lib/visualizer.component.d.ts +9 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +0 -1
|
@@ -185,7 +185,10 @@ export class SliceCache {
|
|
|
185
185
|
/**
|
|
186
186
|
* Add slice z's channel group: one additively-composited ('lighter' = Fiji
|
|
187
187
|
* "Composite") TiledImage per channel, hidden (opacity 0) until revealed.
|
|
188
|
-
*
|
|
188
|
+
* The visible channels' are preloaded, so the background loader can pre-fill
|
|
189
|
+
* every slice; a hidden channel's loads nothing until it is shown (a 22-channel
|
|
190
|
+
* plate fetched and decoded every channel's tiles, overflowing the tile cache:
|
|
191
|
+
* tiles evicted mid-conversion failed to decode).
|
|
189
192
|
* Cached so a revisit is an instant opacity toggle — no re-fetch, no
|
|
190
193
|
* white-flicker. Mirrors addSlice for the composite path.
|
|
191
194
|
*/
|
|
@@ -226,7 +229,7 @@ export class SliceCache {
|
|
|
226
229
|
width: 1,
|
|
227
230
|
opacity: 0, // revealed by revealChannelSlice once the group is in
|
|
228
231
|
compositeOperation: 'lighter',
|
|
229
|
-
preload:
|
|
232
|
+
preload: this.host.channelVisible(c),
|
|
230
233
|
success: (e) => {
|
|
231
234
|
const item = e?.item;
|
|
232
235
|
if (token !== this.sliceLoadToken) {
|
|
@@ -249,17 +252,37 @@ export class SliceCache {
|
|
|
249
252
|
}
|
|
250
253
|
}
|
|
251
254
|
/** Reveal slice z's channel group (each visible channel → opacity 1) and
|
|
252
|
-
* hide every other cached slice's group. Instant; no fetch/decode.
|
|
255
|
+
* hide every other cached slice's group. Instant; no fetch/decode. Only the
|
|
256
|
+
* visible channels keep loading (preload): a hidden channel's tiles are not
|
|
257
|
+
* fetched or decoded until it is shown. */
|
|
253
258
|
revealChannelSlice(z) {
|
|
259
|
+
const hidden = new Set();
|
|
254
260
|
for (const [zz, group] of this.channelSliceItems) {
|
|
255
261
|
const active = zz === z;
|
|
256
262
|
group.forEach((it, c) => {
|
|
257
263
|
if (!it)
|
|
258
264
|
return;
|
|
259
265
|
const visible = this.host.channelVisible(c);
|
|
266
|
+
if (!visible)
|
|
267
|
+
hidden.add(it);
|
|
268
|
+
quiet(() => it.setPreload?.(visible));
|
|
260
269
|
quiet(() => it.setOpacity(active && visible ? 1 : 0));
|
|
261
270
|
});
|
|
262
271
|
}
|
|
272
|
+
this.dropQueuedTiles(hidden);
|
|
273
|
+
}
|
|
274
|
+
/** Drop the tile requests still waiting in OSD's queue for `items` (channels just hidden), so
|
|
275
|
+
* the visible channels' tiles are not stuck behind them. A request already sent completes. */
|
|
276
|
+
dropQueuedTiles(items) {
|
|
277
|
+
const loader = this.host.viewer()?.imageLoader;
|
|
278
|
+
if (!items.size || !Array.isArray(loader?.jobQueue))
|
|
279
|
+
return;
|
|
280
|
+
loader.jobQueue = loader.jobQueue.filter((job) => {
|
|
281
|
+
if (!items.has(job?.tile?.tiledImage))
|
|
282
|
+
return true;
|
|
283
|
+
quiet(() => job.abort?.());
|
|
284
|
+
return false;
|
|
285
|
+
});
|
|
263
286
|
}
|
|
264
287
|
/** Show the given composite slice (opacity 1) and hide all other cached slices. */
|
|
265
288
|
showOnlySlice(z) {
|
|
@@ -423,12 +446,18 @@ export class SliceCache {
|
|
|
423
446
|
const it = this.sliceItems.get(z);
|
|
424
447
|
return it ? [it] : [];
|
|
425
448
|
}
|
|
426
|
-
/** Whether slice z's tiles are still streaming (any cached image not fully loaded).
|
|
449
|
+
/** Whether slice z's tiles are still streaming (any cached image not fully loaded). A hidden
|
|
450
|
+
* channel loads nothing, so it never becomes fully loaded: only the visible channels count, or
|
|
451
|
+
* the background loader would wait on it forever. */
|
|
427
452
|
sliceTilesLoading(z) {
|
|
428
453
|
const g = this.sliceGroup(z);
|
|
429
454
|
if (!g.length)
|
|
430
455
|
return false;
|
|
431
|
-
|
|
456
|
+
const multi = this.host.isMultiChannel();
|
|
457
|
+
return g.some((it, c) => it &&
|
|
458
|
+
(!multi || this.host.channelVisible(c)) &&
|
|
459
|
+
typeof it.getFullyLoaded === 'function' &&
|
|
460
|
+
!it.getFullyLoaded());
|
|
432
461
|
}
|
|
433
462
|
/** Remove slice z's cached image(s) from the world and the active cache. */
|
|
434
463
|
removeCachedSlice(z) {
|
|
@@ -490,4 +519,4 @@ export class SliceCache {
|
|
|
490
519
|
this.bgAttempted.clear();
|
|
491
520
|
}
|
|
492
521
|
}
|
|
493
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvc2xpY2UtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUEwQ3ZDLE1BQU0sT0FBTyxVQUFVO0lBdUNyQixZQUFvQixJQUFvQjtRQUFwQixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQXRDeEMscUVBQXFFO1FBQzdELGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQUMxRDs7aURBRXlDO1FBQ2pDLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO1FBQ3BGOzhFQUNzRTtRQUM5RCxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDeEMsdURBQXVEO1FBQy9DLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFDaEMsMEVBQTBFO1FBQ2xFLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMxQztrRkFDMEU7UUFDbEUsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDM0I7OzZEQUVxRDtRQUM3QyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUN6Qzt1REFDK0M7UUFDdkMsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDM0IsZ0ZBQWdGO1FBQ3hFLGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUN4Qyx1RUFBdUU7UUFDL0Qsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDNUIsZ0ZBQWdGO1FBQy9ELDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUM1Qzs7O3lCQUdpQjtRQUNBLDJCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUM5Qyw0REFBNEQ7UUFDcEQsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLGtCQUFhLEdBQXlDLElBQUksQ0FBQztJQUV4QixDQUFDO0lBRTVDLHlFQUF5RTtJQUV6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RUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPU0QsIHF1aWV0IH0gZnJvbSAnLi9vc2QtbGliJztcbmltcG9ydCB7IE9zZFRpbGVkSW1hZ2VMaWtlLCBPc2RWaWV3ZXJMaWtlIH0gZnJvbSAnLi9vc2Qtdmlld2VyLWxpa2UnO1xuXG4vKipcbiAqIFN0YWNrLXNsaWNlIGNhY2hlIGZvciB0aGUgT3BlblNlYWRyYWdvbiBiYWNrZW5kIChyZWZhY3RvcmluZyBwbGFuLCBTdGVwIDMg4oCUXG4gKiBhIHB1cmUgbW92ZSBvZiB0aGUgY2FjaGUgY2x1c3RlciBvdXQgb2YgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSkuXG4gKlxuICogU2NydWJiaW5nIHRoZSB6LXNsaWRlciB1c2VkIHRvIHZpZXdlci5vcGVuKCkgYSBmcmVzaCB0aWxlIHNvdXJjZSBwZXIgc2xpY2UsXG4gKiB3aGljaCBkZXN0cm95cyB0aGUgY3VycmVudCB0aWxlZCBpbWFnZSAoYW5kIGl0cyBkZWNvZGVkK3JlY29sb3JlZCB0aWxlcyksIHNvXG4gKiByZXZpc2l0aW5nIGEgc2xpY2UgcmUtZmV0Y2hlZCBldmVyeXRoaW5nLiBJbnN0ZWFkIHdlIGtlZXAgZWFjaCB2aXNpdGVkIHNsaWNlXG4gKiBhcyBpdHMgb3duIHRpbGVkIGltYWdlIGluIHRoZSB3b3JsZCBhbmQganVzdCB0b2dnbGUgb3BhY2l0eSDigJQgYSByZXZpc2l0ZWRcbiAqIHNsaWNlIGlzIGluc3RhbnQgKG5vIG5ldHdvcmssIG5vIHJlLWRlY29kZSwgbm8gcmUtcmVjb2xvcikuIEJvdW5kZWQgYnkgYW5cbiAqIExSVSBzbyBkZWVwIHN0YWNrcyBkb24ndCBncm93IHdpdGhvdXQgbGltaXQuIE11bHRpY2hhbm5lbCBzbGljZXMgY2FjaGUgb25lXG4gKiBUaWxlZEltYWdlIHBlciBjaGFubmVsIChhZGRpdGl2ZWx5IGNvbXBvc2l0ZWQpOyBjb21wb3NpdGUgc2xpY2VzIGNhY2hlIG9uZS5cbiAqIEEgYmFja2dyb3VuZCBsb2FkZXIgcHJlLWZpbGxzIHRoZSByZXN0IG9mIHRoZSBzdGFjaywgb25lIHNsaWNlIGF0IGEgdGltZSxcbiAqIHlpZWxkaW5nIHRvIHRoZSB2aXNpYmxlIHNsaWNlIHNvIG9uLXNjcmVlbiB0aWxlcyBhbHdheXMgd2luIHRoZSBjb25uZWN0aW9uLlxuICovXG5cbi8qKiBXaGF0IHRoZSBjYWNoZSBuZWVkcyBmcm9tIHRoZSB2aXN1YWxpemVyIHNlcnZpY2UuIEFsbCBhY2Nlc3NvcnMgYXJlIGxpdmVcbiAqICAoY2FsbGVkIGF0IHVzZSB0aW1lLCBuZXZlciBjYXB0dXJlZCkgc28gdGhlIGNhY2hlIGFsd2F5cyBzZWVzIHRoZSBjdXJyZW50XG4gKiAgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgbWF0Y2hpbmcgdGhlIGZpZWxkIHJlYWRzIGl0IHJlcGxhY2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGljZUNhY2hlSG9zdCB7XG4gIC8qKiBUaGUgbW91bnRlZCB2aWV3ZXIsIG9yIG51bGwuICovXG4gIHZpZXdlcigpOiBPc2RWaWV3ZXJMaWtlIHwgbnVsbDtcbiAgLyoqIFRydWUgd2hlbiBhIHZpZXdlciwgZGVzY3JpcHRvciBhbmQgaW5mb0I2NCBhcmUgYWxsIHByZXNlbnQuICovXG4gIGhhc0ltYWdlKCk6IGJvb2xlYW47XG4gIC8qKiBTdGFjayBkZXB0aCAoZGVzY3JpcHRvci56LCAxIGZvciBzaW5nbGUgaW1hZ2VzKS4gKi9cbiAgc2xpY2VDb3VudCgpOiBudW1iZXI7XG4gIC8qKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCB6LXNsaWNlLiAqL1xuICBjdXJyZW50WigpOiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCByZW5kZXJpbmcgKG11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UpIHZzIGNvbXBvc2l0ZS4gKi9cbiAgaXNNdWx0aUNoYW5uZWwoKTogYm9vbGVhbjtcbiAgLyoqIENoYW5uZWwgY291bnQgZm9yIGEgbXVsdGljaGFubmVsIGdyb3VwIGFkZC4gKi9cbiAgY2hhbm5lbENvdW50KCk6IG51bWJlcjtcbiAgLyoqIENoYW5uZWwgdmlzaWJpbGl0eSAoZHJpdmVzIGdyb3VwIHJldmVhbCBvcGFjaXR5KS4gKi9cbiAgY2hhbm5lbFZpc2libGUoYzogbnVtYmVyKTogYm9vbGVhbjtcbiAgLyoqIFRpbGUgc291cmNlIGZvciBzbGljZSB6IChvcHRpb25hbGx5IG9uZSBjaGFubmVsKS4gKi9cbiAgYnVpbGRUaWxlU291cmNlKHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IHN0cmluZyB8IG9iamVjdDtcbiAgLyoqIEEgY29tcG9zaXRlIHNsaWNlIGxhbmRlZCBpbiB0aGUgd29ybGQg4oCUIHRoZSBzZXJ2aWNlIHNhbXBsZXMgaXRzIHdpbmRvdy4gKi9cbiAgb25Db21wb3NpdGVTbGljZUFkZGVkKHo6IG51bWJlcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTbGljZUNhY2hlIHtcbiAgLyoqIHotc2xpY2Ug4oaSIGl0cyBUaWxlZEltYWdlIGluIHRoZSB2aWV3ZXIgd29ybGQgKGNvbXBvc2l0ZSBwYXRoKS4gKi9cbiAgcHJpdmF0ZSBzbGljZUl0ZW1zID0gbmV3IE1hcDxudW1iZXIsIE9zZFRpbGVkSW1hZ2VMaWtlPigpO1xuICAvKiogTXVsdGljaGFubmVsIHBlci1zbGljZSBjYWNoZTogeiDihpIgdGhlIE4gY2hhbm5lbCBUaWxlZEltYWdlcyBmb3IgdGhhdCBzbGljZVxuICAgKiAgKGFkZGl0aXZlbHkgY29tcG9zaXRlZCBieSBPU0Q7IGluZGV4ID0gY2hhbm5lbCkuIE9ubHkgdGhlIGFjdGl2ZSBzbGljZSdzXG4gICAqICB2aXNpYmxlIGNoYW5uZWxzIGhhdmUgb3BhY2l0eSA+IDAuICovXG4gIHByaXZhdGUgY2hhbm5lbFNsaWNlSXRlbXMgPSBuZXcgTWFwPG51bWJlciwgQXJyYXk8T3NkVGlsZWRJbWFnZUxpa2UgfCB1bmRlZmluZWQ+PigpO1xuICAvKiogQ2FjaGVkIG11bHRpY2hhbm5lbCBzbGljZXMgd2hvc2UgdGlsZXMgd2VyZSB0aW50ZWQgYmVmb3JlIHRoZSBsYXRlc3RcbiAgICogIGRpc3BsYXkgY2hhbmdlOyByZS10aW50ZWQgbGF6aWx5IHdoZW4gbmV4dCByZXZlYWxlZCBieSB6LXNjcnViLiAqL1xuICBwcml2YXRlIHN0YWxlU2xpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIC8qKiBNb3N0LXJlY2VudGx5LXNob3duIHogbGFzdDsgZHJpdmVzIExSVSBldmljdGlvbi4gKi9cbiAgcHJpdmF0ZSBzbGljZUxydTogbnVtYmVyW10gPSBbXTtcbiAgLyoqIHotc2xpY2VzIHdob3NlIHRpbGVkIGltYWdlIGlzIGJlaW5nIGFkZGVkIChkZWR1cGUgcmFwaWQgc2NydWJiaW5nKS4gKi9cbiAgcHJpdmF0ZSBzbGljZXNMb2FkaW5nID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIC8qKiBCdW1wZWQgd2hlbmV2ZXIgdGhlIGxvYWRlZCBpbWFnZSBjaGFuZ2VzOyBpbi1mbGlnaHQgYmFja2dyb3VuZCBzbGljZSBhZGRzXG4gICAqICBjYXB0dXJlZCB1bmRlciBhbiBvbGRlciB0b2tlbiBhcmUgZHJvcHBlZCAoY2FuY2VsbGVkIGltYWdlIHN3aXRjaCkuICovXG4gIHByaXZhdGUgc2xpY2VMb2FkVG9rZW4gPSAwO1xuICAvKiogVGhlIHNsaWNlIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBpcyBjdXJyZW50bHkgd2FpdGluZyBvbiAoaXRzIHRpbGVzIGFyZVxuICAgKiAgc3RpbGwgc3RyZWFtaW5nKTogYWRkVGlsZWRJbWFnZSAnc3VjY2VzcycgZmlyZXMgb24gYWRkLCBub3Qgb24gdGlsZSBsb2FkLFxuICAgKiAgc28gd2UgZ2F0ZSB0aGUgbmV4dCBzbGljZSBvbiBnZXRGdWxseUxvYWRlZCgpLiAqL1xuICBwcml2YXRlIGJnTG9hZGluZ1o6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogV2hlbiBiZ0xvYWRpbmdaIHN0YXJ0ZWQgbG9hZGluZyDigJQgYSBmYWxsYmFjayBzbyBhIHNsb3cvc3R1Y2sgc2xpY2UgY2FuJ3RcbiAgICogIHN0YWxsIHRoZSB3aG9sZSBiYWNrZ3JvdW5kIHBhc3MgZm9yZXZlci4gKi9cbiAgcHJpdmF0ZSBiZ0xvYWRpbmdTaW5jZSA9IDA7XG4gIC8qKiBTbGljZXMgdGhlIGJhY2tncm91bmQgbG9hZGVyIGhhcyBhbHJlYWR5IGF0dGVtcHRlZCAobm8gdGlnaHQgcmV0cnkgbG9vcCkuICovXG4gIHByaXZhdGUgYmdBdHRlbXB0ZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgLyoqIE1heCBjYWNoZWQgc2xpY2UgdGlsZWQgaW1hZ2VzIGtlcHQgcmVzaWRlbnQgYmVmb3JlIExSVSBldmljdGlvbi4gKi9cbiAgcHJpdmF0ZSBtYXhDYWNoZWRTbGljZXMgPSA4O1xuICAvKiogVXBwZXIgYm91bmQgb24gcmVzaWRlbnQgc2xpY2VzLCByZWdhcmRsZXNzIG9mIHN0YWNrIGRlcHRoIChtZW1vcnkgZ3VhcmQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9DQUNIRURfU0xJQ0VTX0NBUCA9IDY0O1xuICAvKiogRml0LXZpZXcgdGlsZSBidWRnZXQgYWJvdmUgd2hpY2ggYmFja2dyb3VuZCBwcmVsb2FkaW5nIGlzIHNraXBwZWQ6IGEgaHVnZVxuICAgKiAgbm8tcHlyYW1pZCBzdGFjayB3b3VsZCBwcmVsb2FkIGV2ZXJ5IHNsaWNlIGF0IGZ1bGwgcmVzb2x1dGlvbiBhbmRcbiAgICogIGZsb29kL3RpbWVvdXQuIE5vcm1hbCBzdGFja3Mgc3RheSBiZWxvdyBpdCBhbmQgS0VFUCB0aGUgZmxpY2tlci1mcmVlXG4gICAqICBwcmUtY2FjaGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX1BSRUZFVENIX0ZJVF9USUxFUyA9IDI1NjtcbiAgLyoqIFRydWUgb25seSBmb3Igc3RhY2tzIHRvbyBsYXJnZSB0byBiYWNrZ3JvdW5kLXByZWxvYWQuICovXG4gIHByaXZhdGUgc2tpcFNsaWNlUHJlZmV0Y2ggPSBmYWxzZTtcbiAgcHJpdmF0ZSBwcmVmZXRjaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogU2xpY2VDYWNoZUhvc3QpIHt9XG5cbiAgLy8g4pSA4pSAIGNvbmZpZ3VyYXRpb24gKHBlciBpbWFnZSwgZnJvbSBwbG90KCkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBTaXplIHRoZSBjYWNoZSBmb3IgdGhlIGxvYWRlZCBpbWFnZToga2VlcCB0aGUgd2hvbGUgc3RhY2sgcmVzaWRlbnRcbiAgICogIChjYXBwZWQpIHNvIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBmaWxscyBldmVyeSBzbGljZSB3aXRob3V0IGV2aWN0aW5nXG4gICAqICBpdHNlbGY7IHNraXAgcHJlbG9hZGluZyBlbnRpcmVseSB3aGVuIGV2ZW4gdGhlIGNvYXJzZXN0IGxldmVsJ3MgdGlsZVxuICAgKiAgZ3JpZCBpcyB0b28gbGFyZ2UgKGl0cyBzbGljZXMgb25seSBleGlzdCBhdCBmdWxsIHJlc29sdXRpb24pLiAqL1xuICBjb25maWd1cmUoc3RhY2tEZXB0aDogbnVtYmVyLCBjb2Fyc2VGaXRUaWxlczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5za2lwU2xpY2VQcmVmZXRjaCA9IGNvYXJzZUZpdFRpbGVzID4gdGhpcy5NQVhfUFJFRkVUQ0hfRklUX1RJTEVTO1xuICAgIHRoaXMubWF4Q2FjaGVkU2xpY2VzID0gc3RhY2tEZXB0aCA+IDEgPyBNYXRoLm1pbih0aGlzLk1BWF9DQUNIRURfU0xJQ0VTX0NBUCwgc3RhY2tEZXB0aCkgOiAxO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgTFJVIGNhcCAodGhlIHZpZXdlciBzaXplcyBpdHMgdGlsZSBjYWNoZSBmcm9tIGl0KS4gKi9cbiAgbWF4U2xpY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWF4Q2FjaGVkU2xpY2VzO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHBlci1jaGFubmVsIGdyb3VwcyAob24gYSBmcmVzaCBwbG90KS4gKi9cbiAgY2xlYXJDaGFubmVsR3JvdXBzKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIG92ZXIgdGhlIHNsaWNlIHRoZSB2aWV3ZXIganVzdCBvcGVuZWQgKHdvcmxkIGl0ZW0gMCkuIENvbXBvc2l0ZTogc2VlZFxuICAgKiB0aGUgY2FjaGUgd2l0aCBpdCwgc28gc2NydWJiaW5nIGJhY2sgdG8gaXQgbGF0ZXIgaXMgYW4gaW5zdGFudCBvcGFjaXR5XG4gICAqIHRvZ2dsZSwgbm90IGEgcmUtb3Blbi4gTXVsdGljaGFubmVsOiBkcm9wIHRoYXQgc2luZ2xlIChjaGFubmVsLTApIGltYWdlIGFuZFxuICAgKiBhZGQgdGhlIHNsaWNlJ3MgY2hhbm5lbCBncm91cCBpbnN0ZWFkOyB0aGUgYmFja2dyb3VuZCBsb2FkZXIgLyBMUlUgdGhlblxuICAgKiBwcmUtZmlsbHMgdGhlIG90aGVyIHNsaWNlcycgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgKi9cbiAgYWRvcHRPcGVuZWRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLmhvc3Qudmlld2VyKCk7XG4gICAgaWYgKHRoaXMuaG9zdC5pc011bHRpQ2hhbm5lbCgpKSB7XG4gICAgICBxdWlldCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0MCA9IHZpZXdlcj8ud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgICAgICBpZiAodmlld2VyICYmIGl0MCkgdmlld2VyLndvcmxkLnJlbW92ZUl0ZW0oaXQwKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRDaGFubmVsU2xpY2Uoeik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0SXRlbSA9IHZpZXdlcj8ud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgIGlmIChmaXJzdEl0ZW0pIHRoaXMuc2VlZENvbXBvc2l0ZSh6LCBmaXJzdEl0ZW0pO1xuICB9XG5cbiAgLyoqIFNlZWQgdGhlIGNhY2hlIHdpdGggdGhlIGp1c3Qtb3BlbmVkIGNvbXBvc2l0ZSBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICogIHNjcnViYmluZyBiYWNrIHRvIGl0IGxhdGVyIGlzIGFuIGluc3RhbnQgb3BhY2l0eSB0b2dnbGUsIG5vdCBhIHJlLW9wZW4uICovXG4gIHNlZWRDb21wb3NpdGUoejogbnVtYmVyLCBpdGVtOiBPc2RUaWxlZEltYWdlTGlrZSk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VJdGVtcy5zZXQoeiwgaXRlbSk7XG4gICAgdGhpcy50b3VjaFNsaWNlTHJ1KHopO1xuICB9XG5cbiAgLy8g4pSA4pSAIHNsaWNlIGRpc3BsYXkgKHNldFpJbmRleCdzIGNhY2hlIHdvcmspIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBTaG93IHNsaWNlIHo6IHJldmVhbCBpdCBpbnN0YW50bHkgd2hlbiBjYWNoZWQgKHJlLXRpbnRpbmcgYSBzdGFsZVxuICAgKiAgbXVsdGljaGFubmVsIGdyb3VwKSwgb3RoZXJ3aXNlIGFkZCBpdCBvbmNlLiBUaGUgY3VycmVudCBzbGljZSBzdGF5c1xuICAgKiAgdmlzaWJsZSB1bnRpbCB0aGUgbmV3IG9uZSBpcyBpbiDigJQgbm8gd2hpdGUtZmxpY2tlci4gKi9cbiAgc2hvd1NsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmdldCh6KTtcbiAgICAgIGlmIChncm91cCAmJiBncm91cC5sZW5ndGggJiYgZ3JvdXAuc29tZSgoaXQpID0+IGl0ICYmIHRoaXMuc2xpY2VJbldvcmxkKGl0KSkpIHtcbiAgICAgICAgdGhpcy5yZXZlYWxDaGFubmVsU2xpY2Uoeik7XG4gICAgICAgIC8vIElmIGEgZGlzcGxheSBjaGFuZ2UgaGFwcGVuZWQgd2hpbGUgdGhpcyBzbGljZSB3YXMgY2FjaGVkLCBpdHMgdGlsZXNcbiAgICAgICAgLy8gaG9sZCBhIHN0YWxlIHRpbnQg4oCUIHJlLWFwcGx5IG5vdyAoaXQncyB0aGUgdmlzaWJsZSBzbGljZSwgc28gdGhlXG4gICAgICAgIC8vIGJyaWVmIHJlc3RvcmUgZmxhc2ggaXMgYWNjZXB0YWJsZSwgbGlrZSBhIGZyZXNoIGxvYWQpLlxuICAgICAgICBpZiAodGhpcy5zdGFsZVNsaWNlcy5kZWxldGUoeikpIHRoaXMuaW52YWxpZGF0ZVNsaWNlKHopO1xuICAgICAgICB0aGlzLnRvdWNoU2xpY2VMcnUoeik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zbGljZXNMb2FkaW5nLmhhcyh6KSkge1xuICAgICAgICB0aGlzLmFkZENoYW5uZWxTbGljZSh6KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zbGljZUl0ZW1zLmdldCh6KTtcbiAgICBpZiAoY2FjaGVkICYmIHRoaXMuc2xpY2VJbldvcmxkKGNhY2hlZCkpIHtcbiAgICAgIC8vIEluc3RhbnQ6IHJldmVhbCB0aGUgY2FjaGVkIHNsaWNlLCBoaWRlIHRoZSBvdGhlcnMg4oCUIG5vIGZldGNoL2RlY29kZS5cbiAgICAgIHRoaXMuc2hvd09ubHlTbGljZSh6KTtcbiAgICAgIHRoaXMudG91Y2hTbGljZUxydSh6KTtcbiAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zbGljZXNMb2FkaW5nLmhhcyh6KSkgcmV0dXJuOyAvLyBhbHJlYWR5IGJlaW5nIGFkZGVkOyBzdWNjZXNzIHJldmVhbHMgaXRcbiAgICB0aGlzLmFkZFNsaWNlKHopO1xuICB9XG5cbiAgLyoqIEFkZCBhIG5ldmVyLXNlZW4gc2xpY2UgYXMgYSBoaWRkZW4gdGlsZWQgaW1hZ2UsIHRoZW4gcmV2ZWFsIGl0IG9uY2UgbG9hZGVkXG4gICAqICAoY29tcG9zaXRlIHBhdGg7IG11bHRpY2hhbm5lbCByb3V0ZXMgdG8gYWRkQ2hhbm5lbFNsaWNlKS4gKi9cbiAgcHJpdmF0ZSBhZGRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaG9zdC5oYXNJbWFnZSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaG9zdC5pc011bHRpQ2hhbm5lbCgpKSB7XG4gICAgICB0aGlzLmFkZENoYW5uZWxTbGljZSh6KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5zbGljZXNMb2FkaW5nLmFkZCh6KTtcbiAgICAvLyBUYWcgdGhpcyBhZGQgdG8gdGhlIGN1cnJlbnQgaW1hZ2U7IGlmIHRoZSB1c2VyIHN3aXRjaGVzIGltYWdlcyBiZWZvcmUgaXRcbiAgICAvLyByZXNvbHZlcywgdGhlIHN0YWxlIGNhbGxiYWNrIGlzIGRyb3BwZWQgKHRoZSBhZGQgYmVsb25ncyB0byB0aGUgb2xkIHN0YWNrKS5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuc2xpY2VMb2FkVG9rZW47XG4gICAgY29uc3QgdHMgPSB0aGlzLmhvc3QuYnVpbGRUaWxlU291cmNlKHopO1xuICAgIHRyeSB7XG4gICAgICAvLyBhZGRUaWxlZEltYWdlIGxpdmVzIG9uIHRoZSBWaWV3ZXIgKGl0IHF1ZXVlcyB0aGUgYWRkIGludG8gdGhlIHdvcmxkKS5cbiAgICAgIHZpZXdlci5hZGRUaWxlZEltYWdlKHtcbiAgICAgICAgdGlsZVNvdXJjZTogdHMsXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHdpZHRoOiAxLCAvLyBtYXRjaCB0aGUgcHJpbWFyeSBpbWFnZSdzIG5vcm1hbGl6ZWQgcGxhY2VtZW50XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIC8vIExvYWQgdGlsZXMgZXZlbiB0aG91Z2ggaXQncyBoaWRkZW4g4oCUIHRoaXMgaXMgd2hhdCBsZXRzIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIC8vIGxvYWRlciBmaWxsIGV2ZXJ5IHNsaWNlJ3MgY2FjaGUgc28gc2NydWJiaW5nIGdldHMgcHJvZ3Jlc3NpdmVseSBzbW9vdGhlci5cbiAgICAgICAgcHJlbG9hZDogdHJ1ZSxcbiAgICAgICAgc3VjY2VzczogKGUpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gZT8uaXRlbTtcbiAgICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMuc2xpY2VMb2FkVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIEltYWdlIHN3aXRjaGVkIHdoaWxlIHRoaXMgd2FzIGFkZGluZyDigJQgZHJvcCB0aGUgb3JwaGFuIHNvIGl0IHN0b3BzXG4gICAgICAgICAgICAvLyBsb2FkaW5nIGluc3RlYWQgb2Ygc3RyZWFtaW5nIHRpbGVzIGZvciB0aGUgYWJhbmRvbmVkIHN0YWNrLlxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgcXVpZXQoKCkgPT4gdGhpcy5ob3N0LnZpZXdlcigpPy53b3JsZD8ucmVtb3ZlSXRlbShpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2xpY2VzTG9hZGluZy5kZWxldGUoeik7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zbGljZUl0ZW1zLnNldCh6LCBpdGVtKTtcbiAgICAgICAgICB0aGlzLnRvdWNoU2xpY2VMcnUoeik7XG4gICAgICAgICAgdGhpcy5ob3N0Lm9uQ29tcG9zaXRlU2xpY2VBZGRlZCh6KTtcbiAgICAgICAgICAvLyBPbmx5IHJldmVhbCBpZiB0aGUgdXNlciBpcyBzdGlsbCBvbiB0aGlzIHNsaWNlIChmYXN0IHNjcnViYmluZyBtYXlcbiAgICAgICAgICAvLyBoYXZlIG1vdmVkIG9uIOKAlCBsZWF2ZSBpdCBjYWNoZWQvaGlkZGVuIGZvciBhIGxhdGVyIHJldmlzaXQpLlxuICAgICAgICAgIGlmICh6ID09PSB0aGlzLmhvc3QuY3VycmVudFooKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93T25seVNsaWNlKHopO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZXZpY3RTbGljZUxydSgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIGlmICh0b2tlbiA9PT0gdGhpcy5zbGljZUxvYWRUb2tlbikgdGhpcy5zbGljZXNMb2FkaW5nLmRlbGV0ZSh6KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zbGljZXNMb2FkaW5nLmRlbGV0ZSh6KTtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gZmFpbGVkIHRvIGFkZCB6LXNsaWNlJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIHNsaWNlIHoncyBjaGFubmVsIGdyb3VwOiBvbmUgYWRkaXRpdmVseS1jb21wb3NpdGVkICgnbGlnaHRlcicgPSBGaWppXG4gICAqIFwiQ29tcG9zaXRlXCIpIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwsIGhpZGRlbiAob3BhY2l0eSAwKSB1bnRpbCByZXZlYWxlZC5cbiAgICogRWFjaCBpcyBwcmVsb2FkZWQgc28gdGhlIGJhY2tncm91bmQgbG9hZGVyIGNhbiBwcmUtZmlsbCBldmVyeSBzbGljZS5cbiAgICogQ2FjaGVkIHNvIGEgcmV2aXNpdCBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlIOKAlCBubyByZS1mZXRjaCwgbm9cbiAgICogd2hpdGUtZmxpY2tlci4gTWlycm9ycyBhZGRTbGljZSBmb3IgdGhlIGNvbXBvc2l0ZSBwYXRoLlxuICAgKi9cbiAgYWRkQ2hhbm5lbFNsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3N0Lmhhc0ltYWdlKCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5jaGFubmVsU2xpY2VJdGVtcy5oYXMoeikgfHwgdGhpcy5zbGljZXNMb2FkaW5nLmhhcyh6KSkgcmV0dXJuO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuO1xuICAgIHRoaXMuc2xpY2VzTG9hZGluZy5hZGQoeik7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnNsaWNlTG9hZFRva2VuO1xuICAgIGNvbnN0IG4gPSB0aGlzLmhvc3QuY2hhbm5lbENvdW50KCk7XG4gICAgY29uc3QgZ3JvdXA6IEFycmF5PE9zZFRpbGVkSW1hZ2VMaWtlIHwgdW5kZWZpbmVkPiA9IG5ldyBBcnJheShuKTtcbiAgICBsZXQgc2V0dGxlZCA9IDA7XG4gICAgY29uc3Qgb25TZXR0bGVkID0gKCkgPT4ge1xuICAgICAgaWYgKCsrc2V0dGxlZCA8IG4pIHJldHVybjtcbiAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zbGljZUxvYWRUb2tlbikgcmV0dXJuOyAvLyBpbWFnZSBzd2l0Y2hlZCBtaWQtYWRkXG4gICAgICB0aGlzLnNsaWNlc0xvYWRpbmcuZGVsZXRlKHopO1xuICAgICAgdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5zZXQoeiwgZ3JvdXApO1xuICAgICAgdGhpcy5zdGFsZVNsaWNlcy5kZWxldGUoeik7IC8vIGZyZXNobHkgdGludGVkIGF0IHRoZSBjdXJyZW50IGRpc3BsYXkgc3RhdGVcbiAgICAgIHRoaXMudG91Y2hTbGljZUxydSh6KTtcbiAgICAgIGlmICh6ID09PSB0aGlzLmhvc3QuY3VycmVudFooKSkge1xuICAgICAgICB0aGlzLnJldmVhbENoYW5uZWxTbGljZSh6KTsgLy8gdGlsZXMgbWF5IHN0aWxsIGJlIGRlY29kaW5nOyBvcGFjaXR5IGlzIHNldCBub3dcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV2aWN0U2xpY2VMcnUoKTtcbiAgICB9O1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbjsgYysrKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2aWV3ZXIuYWRkVGlsZWRJbWFnZSh7XG4gICAgICAgICAgdGlsZVNvdXJjZTogdGhpcy5ob3N0LmJ1aWxkVGlsZVNvdXJjZSh6LCBjKSxcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgb3BhY2l0eTogMCwgLy8gcmV2ZWFsZWQgYnkgcmV2ZWFsQ2hhbm5lbFNsaWNlIG9uY2UgdGhlIGdyb3VwIGlzIGluXG4gICAgICAgICAgY29tcG9zaXRlT3BlcmF0aW9uOiAnbGlnaHRlcicsXG4gICAgICAgICAgcHJlbG9hZDogdHJ1ZSxcbiAgICAgICAgICBzdWNjZXNzOiAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGU/Lml0ZW07XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMuc2xpY2VMb2FkVG9rZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBxdWlldCgoKSA9PiB0aGlzLmhvc3Qudmlld2VyKCk/LndvcmxkPy5yZW1vdmVJdGVtKGl0ZW0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbSkgZ3JvdXBbY10gPSBpdGVtO1xuICAgICAgICAgICAgb25TZXR0bGVkKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4gb25TZXR0bGVkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gZmFpbGVkIHRvIGFkZCBjaGFubmVsIHNsaWNlIGltYWdlJywgeiwgYywgZXJyKTtcbiAgICAgICAgb25TZXR0bGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFJldmVhbCBzbGljZSB6J3MgY2hhbm5lbCBncm91cCAoZWFjaCB2aXNpYmxlIGNoYW5uZWwg4oaSIG9wYWNpdHkgMSkgYW5kXG4gICAqICBoaWRlIGV2ZXJ5IG90aGVyIGNhY2hlZCBzbGljZSdzIGdyb3VwLiBJbnN0YW50OyBubyBmZXRjaC9kZWNvZGUuICovXG4gIHJldmVhbENoYW5uZWxTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFt6eiwgZ3JvdXBdIG9mIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHp6ID09PSB6O1xuICAgICAgZ3JvdXAuZm9yRWFjaCgoaXQsIGMpID0+IHtcbiAgICAgICAgaWYgKCFpdCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5ob3N0LmNoYW5uZWxWaXNpYmxlKGMpO1xuICAgICAgICBxdWlldCgoKSA9PiBpdC5zZXRPcGFjaXR5KGFjdGl2ZSAmJiB2aXNpYmxlID8gMSA6IDApKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTaG93IHRoZSBnaXZlbiBjb21wb3NpdGUgc2xpY2UgKG9wYWNpdHkgMSkgYW5kIGhpZGUgYWxsIG90aGVyIGNhY2hlZCBzbGljZXMuICovXG4gIHByaXZhdGUgc2hvd09ubHlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFt6eiwgaXRlbV0gb2YgdGhpcy5zbGljZUl0ZW1zKSB7XG4gICAgICBxdWlldCgoKSA9PiBpdGVtLnNldE9wYWNpdHkoenogPT09IHogPyAxIDogMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBkaXNwbGF5IGludmFsaWRhdGlvbiAobXVsdGljaGFubmVsKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmUtdGludCBhZnRlciBhIGRpc3BsYXkgY2hhbmdlOiBpbnZhbGlkYXRlIE9OTFkgdGhlIHZpc2libGUgc2xpY2Unc1xuICAgKiAgY2hhbm5lbCBpbWFnZXMg4oCUIGludmFsaWRhdGluZyB0aGUgd2hvbGUgd29ybGQgd291bGQgcmUtcHJvY2VzcyBldmVyeVxuICAgKiAgaGlkZGVuL3ByZWxvYWRlZCBzbGljZSdzIHRpbGVzIChodW5kcmVkcyksIGZsb29kaW5nIE9TRCBhbmQgd2FzdGluZyB3b3JrXG4gICAqICBvbiB0aWxlcyB0aGF0IGFyZW4ndCBvbiBzY3JlZW4uIFRoZSBvdGhlciBjYWNoZWQgc2xpY2VzIGFyZSBtYXJrZWQgc3RhbGVcbiAgICogIGFuZCByZS10aW50ZWQgbGF6aWx5IHdoZW4gcmV2ZWFsZWQuICovXG4gIGludmFsaWRhdGVDaGFubmVsRGlzcGxheSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmludmFsaWRhdGVTbGljZSh6KTtcbiAgICB0aGlzLnN0YWxlU2xpY2VzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCB6eiBvZiB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmtleXMoKSkge1xuICAgICAgaWYgKHp6ICE9PSB6KSB0aGlzLnN0YWxlU2xpY2VzLmFkZCh6eik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEludmFsaWRhdGUgKHJlc3RvcmUgKyByZS1yZWNvbG9yKSBqdXN0IHRoZSBjaGFubmVsIGltYWdlcyBvZiBvbmUgY2FjaGVkXG4gICAqICBzbGljZS4gQSBzaGFyZWQgdGltZXN0YW1wIGJhdGNoZXMgdGhlIHBlci1pbWFnZSBpbnZhbGlkYXRpb25zIGludG8gb25lXG4gICAqICBwcm9jZXNzaW5nIHBhc3MgKE9TRCBkZWR1cGVzIHRpbGVzIGFscmVhZHkgc3RhbXBlZCBhdCA+PSB0U3RhbXApLiAqL1xuICBwcml2YXRlIGludmFsaWRhdGVTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZ2V0KHopID8/IFtdO1xuICAgIGlmICghZ3JvdXAubGVuZ3RoKSByZXR1cm47XG4gICAgLy8gRmVhdHVyZS10ZXN0ZWQ6IGEgbW9ja2VkIE9TRCBtb2R1bGUgKHNwZWNzKSBtYXkgbm90IHByb3ZpZGUgaXQuXG4gICAgY29uc3QgdFN0YW1wID0gdHlwZW9mIE9TRC5ub3cgPT09ICdmdW5jdGlvbicgPyBPU0Qubm93KCkgOiBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgaXQgb2YgZ3JvdXApIHtcbiAgICAgIGlmIChpdCAmJiB0eXBlb2YgaXQucmVxdWVzdEludmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcXVpZXQoKCkgPT4gaXQucmVxdWVzdEludmFsaWRhdGU/Lih0cnVlLCBmYWxzZSwgdFN0YW1wKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIGJhY2tncm91bmQgc3RhY2sgcHJlbG9hZGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogRGVib3VuY2Ugc28gYSBidXJzdCBvZiB2aWV3cG9ydC9zbGljZSBldmVudHMgY29hbGVzY2VzLCB0aGVuIGFkdmFuY2UgdGhlXG4gICAqICBiYWNrZ3JvdW5kIHN0YWNrIGxvYWRlciBieSBvbmUgc2xpY2UuICovXG4gIHNjaGVkdWxlUHJlZmV0Y2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2tpcFNsaWNlUHJlZmV0Y2gpIHJldHVybjtcbiAgICBpZiAodGhpcy5wcmVmZXRjaFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5wcmVmZXRjaFRpbWVyKTtcbiAgICB0aGlzLnByZWZldGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMubG9hZE5leHRCYWNrZ3JvdW5kU2xpY2UoKSwgMjAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrZ3JvdW5kLWxvYWQgdGhlIHdob2xlIHN0YWNrOiBhZGQgZWFjaCBub3QteWV0LWNhY2hlZCBzbGljZSBhcyBhXG4gICAqIGhpZGRlbiwgcHJlbG9hZGVkIHRpbGVkIGltYWdlLCBvbmUgYXQgYSB0aW1lLCB3b3JraW5nIG91dHdhcmQgZnJvbSB0aGVcbiAgICogY3VycmVudCBzbGljZSDigJQgYW5kIG5ldmVyIGJsb2NraW5nIHRoZSB2aXNpYmxlIHNsaWNlIChpdCB5aWVsZHMgd2hpbGUgdGhlXG4gICAqIGN1cnJlbnQgdmlldyBpcyBzdGlsbCBzdHJlYW1pbmcgdGlsZXM7IG9ubHkgb25lIHNsaWNlIGlzIGluIGZsaWdodCBhdCBhXG4gICAqIHRpbWUgc28gdGhlIG9uLXNjcmVlbiB0aWxlcyBhbHdheXMgd2luIHRoZSBjb25uZWN0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgbG9hZE5leHRCYWNrZ3JvdW5kU2xpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVmZXRjaFRpbWVyID0gbnVsbDtcbiAgICBpZiAoIXRoaXMuaG9zdC5oYXNJbWFnZSgpKSByZXR1cm47XG4gICAgY29uc3Qgc2xpY2VDb3VudCA9IHRoaXMuaG9zdC5zbGljZUNvdW50KCk7XG4gICAgaWYgKHNsaWNlQ291bnQgPD0gMSkgcmV0dXJuOyAvLyBub3QgYSBzdGFjayDigJQgbm90aGluZyB0byBwcmVsb2FkXG4gICAgLy8gWWllbGQgdG8gdGhlIHZpc2libGUgc2xpY2Ugd2hpbGUgaXQncyBzdGlsbCBzdHJlYW1pbmcgdGlsZXMuXG4gICAgaWYgKHRoaXMuc2xpY2VUaWxlc0xvYWRpbmcodGhpcy5ob3N0LmN1cnJlbnRaKCkpKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gR2F0ZSBvbiB0aGUgaW4tZmxpZ2h0IHNsaWNlJ3MgVElMRVMgZmluaXNoaW5nIOKAlCBhZGRUaWxlZEltYWdlJ3Mgc3VjY2Vzc1xuICAgIC8vIGZpcmVzIG9uIGFkZCwgbm90IG9uIHRpbGUgbG9hZCwgc28gd2l0aG91dCB0aGlzIHdlJ2QgYWRkIHRoZSB3aG9sZSBzdGFja1xuICAgIC8vIGF0IG9uY2UgYW5kIGZsb29kIHRoZSBjb25uZWN0aW9uLiBBIHRpbWUgZmFsbGJhY2sgcHJldmVudHMgYSBzdHVjayBzbGljZVxuICAgIC8vIGZyb20gc3RhbGxpbmcgdGhlIHBhc3MuXG4gICAgaWYgKHRoaXMuYmdMb2FkaW5nWiAhPSBudWxsKSB7XG4gICAgICBjb25zdCBhZGRpbmcgPSB0aGlzLnNsaWNlc0xvYWRpbmcuaGFzKHRoaXMuYmdMb2FkaW5nWik7XG4gICAgICBjb25zdCB0aWxlc0xvYWRpbmcgPSB0aGlzLnNsaWNlVGlsZXNMb2FkaW5nKHRoaXMuYmdMb2FkaW5nWik7XG4gICAgICBjb25zdCB0aW1lZE91dCA9IERhdGUubm93KCkgLSB0aGlzLmJnTG9hZGluZ1NpbmNlID4gODAwMDtcbiAgICAgIGlmICgoYWRkaW5nIHx8IHRpbGVzTG9hZGluZykgJiYgIXRpbWVkT3V0KSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmJnTG9hZGluZ1ogPSBudWxsOyAvLyB0aGF0IHNsaWNlJ3MgdGlsZXMgYXJlIGluIChvciBnYXZlIHVwKSDigJQgYWR2YW5jZVxuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy5uZWFyZXN0VW5jYWNoZWRTbGljZShzbGljZUNvdW50KTtcbiAgICBpZiAobmV4dCA9PSBudWxsKSByZXR1cm47IC8vIHdob2xlIHN0YWNrIGNhY2hlZCDigJQgZG9uZVxuICAgIHRoaXMuYmdMb2FkaW5nWiA9IG5leHQ7XG4gICAgdGhpcy5iZ0xvYWRpbmdTaW5jZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5iZ0F0dGVtcHRlZC5hZGQobmV4dCk7XG4gICAgdGhpcy5hZGRTbGljZShuZXh0KTsgLy8gaGlkZGVuICsgcHJlbG9hZCAoYWRkZWQgd2l0aCBvcGFjaXR5IDA7IG5vdCByZXZlYWxlZClcbiAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTsgLy8gcG9sbCB1bnRpbCBpdHMgdGlsZXMgbG9hZCwgdGhlbiBhZHZhbmNlXG4gIH1cblxuICAvKiogVGhlIG5vdC15ZXQtY2FjaGVkIHNsaWNlIGNsb3Nlc3QgdG8gdGhlIGN1cnJlbnQgb25lIChsb2FkIG5lYXJlc3QgZmlyc3QpLFxuICAgKiAgc2tpcHBpbmcgYW55IGFscmVhZHkgYXR0ZW1wdGVkIHNvIGEgZmFpbGVkL3Nsb3cgb25lIGlzbid0IHJldHJpZWQgaW4gYSBsb29wLiAqL1xuICBwcml2YXRlIG5lYXJlc3RVbmNhY2hlZFNsaWNlKHNsaWNlQ291bnQ6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuaG9zdC5jdXJyZW50WigpO1xuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgc2xpY2VDb3VudDsgZCsrKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gZCA9PT0gMCA/IFtjdXJdIDogW2N1ciAtIGQsIGN1ciArIGRdO1xuICAgICAgZm9yIChjb25zdCB6IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHogPj0gMCAmJlxuICAgICAgICAgIHogPCBzbGljZUNvdW50ICYmXG4gICAgICAgICAgIXRoaXMuc2xpY2VDYWNoZUhhcyh6KSAmJlxuICAgICAgICAgICF0aGlzLnNsaWNlc0xvYWRpbmcuaGFzKHopICYmXG4gICAgICAgICAgIXRoaXMuYmdBdHRlbXB0ZWQuaGFzKHopXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB6O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYmFja2dyb3VuZCBzdGFjayBwcmVsb2FkaW5nIGFuZCBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgc2xpY2UgYWRkLlxuICAgKiBDYWxsZWQgd2hlbiBhIGRpZmZlcmVudCBpbWFnZSBpcyBzZWxlY3RlZCBzbyB0aGUgcHJldmlvdXMgc3RhY2sgc3RvcHNcbiAgICogbG9hZGluZyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGZpbmlzaGluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIGNhbmNlbEJhY2tncm91bmRMb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWZldGNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnByZWZldGNoVGltZXIpO1xuICAgICAgdGhpcy5wcmVmZXRjaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zbGljZXNMb2FkaW5nLmNsZWFyKCk7XG4gICAgdGhpcy5iZ0xvYWRpbmdaID0gbnVsbDtcbiAgICB0aGlzLmJnQXR0ZW1wdGVkLmNsZWFyKCk7XG4gICAgdGhpcy5zbGljZUxvYWRUb2tlbisrOyAvLyBkcm9wIHBlbmRpbmcgYWRkVGlsZWRJbWFnZSBjYWxsYmFja3MgZnJvbSB0aGUgb2xkIGltYWdlXG4gICAgLy8gQWJvcnQgaW4tZmxpZ2h0IGJhY2tncm91bmQgdGlsZXMgaW1tZWRpYXRlbHkgYnkgZHJvcHBpbmcgdGhlIGhpZGRlblxuICAgIC8vIHByZWxvYWRlZCBzbGljZXMgKHJlbW92ZUl0ZW0gY2FuY2VscyB0aGVpciBwZW5kaW5nIHRpbGUgbG9hZHMpLiBLZWVwIHRoZVxuICAgIC8vIHZpc2libGUgc2xpY2Ugc28gdGhlIGN1cnJlbnQgdmlldyBkb2Vzbid0IGJsYW5rIGJlZm9yZSB0aGUgbmV4dCBwbG90LlxuICAgIHRoaXMuZHJvcEhpZGRlblNsaWNlcygpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBldmVyeSBjYWNoZWQgc2xpY2UgZXhjZXB0IHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIG9uZSwgYWJvcnRpbmdcbiAgICogIHRoZWlyIGluLWZsaWdodCB0aWxlIHJlcXVlc3RzLiAqL1xuICBwcml2YXRlIGRyb3BIaWRkZW5TbGljZXMoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmhvc3QuY3VycmVudFooKTtcbiAgICBmb3IgKGNvbnN0IFt6LCBpdGVtXSBvZiBbLi4udGhpcy5zbGljZUl0ZW1zXSkge1xuICAgICAgaWYgKHogPT09IGN1cikgY29udGludWU7XG4gICAgICB0aGlzLnNsaWNlSXRlbXMuZGVsZXRlKHopO1xuICAgICAgcXVpZXQoKCkgPT4gdi53b3JsZC5yZW1vdmVJdGVtKGl0ZW0pKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbeiwgZ3JvdXBdIG9mIFsuLi50aGlzLmNoYW5uZWxTbGljZUl0ZW1zXSkge1xuICAgICAgaWYgKHogPT09IGN1cikgY29udGludWU7XG4gICAgICB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmRlbGV0ZSh6KTtcbiAgICAgIGZvciAoY29uc3QgaXQgb2YgZ3JvdXApIHtcbiAgICAgICAgaWYgKGl0KSB7XG4gICAgICAgICAgcXVpZXQoKCkgPT4gdi53b3JsZC5yZW1vdmVJdGVtKGl0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zbGljZUxydSA9IHRoaXMuc2xpY2VDYWNoZUhhcyhjdXIpID8gW2N1cl0gOiBbXTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBjYWNoZSBib29ra2VlcGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogV2hldGhlciBzbGljZSB6IGlzIGluIHRoZSBhY3RpdmUgY2FjaGUgKGNvbXBvc2l0ZSBzaW5nbGUgaW1hZ2UsIG9yIHRoZVxuICAgKiAgbXVsdGljaGFubmVsIHBlci1jaGFubmVsIGdyb3VwKS4gKi9cbiAgcHJpdmF0ZSBzbGljZUNhY2hlSGFzKHo6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSA/IHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuaGFzKHopIDogdGhpcy5zbGljZUl0ZW1zLmhhcyh6KTtcbiAgfVxuXG4gIC8qKiBUaGUgY2FjaGVkIFRpbGVkSW1hZ2UocykgZm9yIHNsaWNlIHogKDDigJMxIGZvciBjb21wb3NpdGUsIE4gZm9yIG11bHRpY2hhbm5lbCkuICovXG4gIHByaXZhdGUgc2xpY2VHcm91cCh6OiBudW1iZXIpOiBBcnJheTxPc2RUaWxlZEltYWdlTGlrZSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkgcmV0dXJuIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZ2V0KHopID8/IFtdO1xuICAgIGNvbnN0IGl0ID0gdGhpcy5zbGljZUl0ZW1zLmdldCh6KTtcbiAgICByZXR1cm4gaXQgPyBbaXRdIDogW107XG4gIH1cblxuICAvKiogV2hldGhlciBzbGljZSB6J3MgdGlsZXMgYXJlIHN0aWxsIHN0cmVhbWluZyAoYW55IGNhY2hlZCBpbWFnZSBub3QgZnVsbHkgbG9hZGVkKS4gKi9cbiAgcHJpdmF0ZSBzbGljZVRpbGVzTG9hZGluZyh6OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBnID0gdGhpcy5zbGljZUdyb3VwKHopO1xuICAgIGlmICghZy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZy5zb21lKChpdCkgPT4gaXQgJiYgdHlwZW9mIGl0LmdldEZ1bGx5TG9hZGVkID09PSAnZnVuY3Rpb24nICYmICFpdC5nZXRGdWxseUxvYWRlZCgpKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgc2xpY2UgeidzIGNhY2hlZCBpbWFnZShzKSBmcm9tIHRoZSB3b3JsZCBhbmQgdGhlIGFjdGl2ZSBjYWNoZS4gKi9cbiAgcHJpdmF0ZSByZW1vdmVDYWNoZWRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmdldCh6KTtcbiAgICAgIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZGVsZXRlKHopO1xuICAgICAgaWYgKGdyb3VwICYmIHYpXG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgZ3JvdXApIHtcbiAgICAgICAgICBpZiAoaXQpIHtcbiAgICAgICAgICAgIHF1aWV0KCgpID0+IHYud29ybGQucmVtb3ZlSXRlbShpdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5zbGljZUl0ZW1zLmdldCh6KTtcbiAgICAgIHRoaXMuc2xpY2VJdGVtcy5kZWxldGUoeik7XG4gICAgICBpZiAoaXRlbSAmJiB2KSB7XG4gICAgICAgIHF1aWV0KCgpID0+IHYud29ybGQucmVtb3ZlSXRlbShpdGVtKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIElzIHRoZSB0aWxlZCBpbWFnZSBzdGlsbCBpbiB0aGUgd29ybGQgKG5vdCBldmljdGVkKT8gKi9cbiAgcHJpdmF0ZSBzbGljZUluV29ybGQoaXRlbTogT3NkVGlsZWRJbWFnZUxpa2UpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICh0aGlzLmhvc3Qudmlld2VyKCk/LndvcmxkLmdldEluZGV4T2ZJdGVtKGl0ZW0pID8/IC0xKSA+PSAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBNYXJrIHogYXMgbW9zdC1yZWNlbnRseS11c2VkLiAqL1xuICBwcml2YXRlIHRvdWNoU2xpY2VMcnUoejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaSA9IHRoaXMuc2xpY2VMcnUuaW5kZXhPZih6KTtcbiAgICBpZiAoaSA+PSAwKSB0aGlzLnNsaWNlTHJ1LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLnNsaWNlTHJ1LnB1c2goeik7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgbGVhc3QtcmVjZW50bHktdXNlZCBjYWNoZWQgc2xpY2VzIGJleW9uZCB0aGUgY2FwIChuZXZlciB0aGVcbiAgICogIGN1cnJlbnQgb25lKSwgcmVtb3ZpbmcgdGhlaXIgdGlsZWQgaW1hZ2VzIHNvIG1lbW9yeSBzdGF5cyBib3VuZGVkLiAqL1xuICBwcml2YXRlIGV2aWN0U2xpY2VMcnUoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuc2xpY2VMcnUubGVuZ3RoID4gdGhpcy5tYXhDYWNoZWRTbGljZXMpIHtcbiAgICAgIGNvbnN0IGN1ciA9IHRoaXMuaG9zdC5jdXJyZW50WigpO1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5zbGljZUxydS5maW5kSW5kZXgoKHopID0+IHogIT09IGN1cik7XG4gICAgICBpZiAoaWR4IDwgMCkgYnJlYWs7XG4gICAgICBjb25zdCB6ID0gdGhpcy5zbGljZUxydS5zcGxpY2UoaWR4LCAxKVswXTtcbiAgICAgIHRoaXMucmVtb3ZlQ2FjaGVkU2xpY2Uoeik7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsZWFyIHRoZSBjYWNoZSAob24gdGVhcmRvd24gLyBpbWFnZSBzd2l0Y2gpLiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlSXRlbXMuY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFsZVNsaWNlcy5jbGVhcigpO1xuICAgIHRoaXMuc2xpY2VMcnUgPSBbXTtcbiAgICB0aGlzLnNsaWNlc0xvYWRpbmcuY2xlYXIoKTtcbiAgICB0aGlzLmJnTG9hZGluZ1ogPSBudWxsO1xuICAgIHRoaXMuYmdBdHRlbXB0ZWQuY2xlYXIoKTtcbiAgfVxufVxuIl19
|
|
522
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvc2xpY2UtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUEwQ3ZDLE1BQU0sT0FBTyxVQUFVO0lBdUNyQixZQUFvQixJQUFvQjtRQUFwQixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQXRDeEMscUVBQXFFO1FBQzdELGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQUMxRDs7aURBRXlDO1FBQ2pDLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO1FBQ3BGOzhFQUNzRTtRQUM5RCxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDeEMsdURBQXVEO1FBQy9DLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFDaEMsMEVBQTBFO1FBQ2xFLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMxQztrRkFDMEU7UUFDbEUsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDM0I7OzZEQUVxRDtRQUM3QyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUN6Qzt1REFDK0M7UUFDdkMsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDM0IsZ0ZBQWdGO1FBQ3hFLGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUN4Qyx1RUFBdUU7UUFDL0Qsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDNUIsZ0ZBQWdGO1FBQy9ELDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUM1Qzs7O3lCQUdpQjtRQUNBLDJCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUM5Qyw0REFBNEQ7UUFDcEQsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLGtCQUFhLEdBQXlDLElBQUksQ0FBQztJQUV4QixDQUFDO0lBRTVDLHlFQUF5RTtJQUV6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QyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPU0QsIHF1aWV0IH0gZnJvbSAnLi9vc2QtbGliJztcbmltcG9ydCB7IE9zZFF1ZXVlZFRpbGVKb2IsIE9zZFRpbGVkSW1hZ2VMaWtlLCBPc2RWaWV3ZXJMaWtlIH0gZnJvbSAnLi9vc2Qtdmlld2VyLWxpa2UnO1xuXG4vKipcbiAqIFN0YWNrLXNsaWNlIGNhY2hlIGZvciB0aGUgT3BlblNlYWRyYWdvbiBiYWNrZW5kIChyZWZhY3RvcmluZyBwbGFuLCBTdGVwIDMg4oCUXG4gKiBhIHB1cmUgbW92ZSBvZiB0aGUgY2FjaGUgY2x1c3RlciBvdXQgb2YgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSkuXG4gKlxuICogU2NydWJiaW5nIHRoZSB6LXNsaWRlciB1c2VkIHRvIHZpZXdlci5vcGVuKCkgYSBmcmVzaCB0aWxlIHNvdXJjZSBwZXIgc2xpY2UsXG4gKiB3aGljaCBkZXN0cm95cyB0aGUgY3VycmVudCB0aWxlZCBpbWFnZSAoYW5kIGl0cyBkZWNvZGVkK3JlY29sb3JlZCB0aWxlcyksIHNvXG4gKiByZXZpc2l0aW5nIGEgc2xpY2UgcmUtZmV0Y2hlZCBldmVyeXRoaW5nLiBJbnN0ZWFkIHdlIGtlZXAgZWFjaCB2aXNpdGVkIHNsaWNlXG4gKiBhcyBpdHMgb3duIHRpbGVkIGltYWdlIGluIHRoZSB3b3JsZCBhbmQganVzdCB0b2dnbGUgb3BhY2l0eSDigJQgYSByZXZpc2l0ZWRcbiAqIHNsaWNlIGlzIGluc3RhbnQgKG5vIG5ldHdvcmssIG5vIHJlLWRlY29kZSwgbm8gcmUtcmVjb2xvcikuIEJvdW5kZWQgYnkgYW5cbiAqIExSVSBzbyBkZWVwIHN0YWNrcyBkb24ndCBncm93IHdpdGhvdXQgbGltaXQuIE11bHRpY2hhbm5lbCBzbGljZXMgY2FjaGUgb25lXG4gKiBUaWxlZEltYWdlIHBlciBjaGFubmVsIChhZGRpdGl2ZWx5IGNvbXBvc2l0ZWQpOyBjb21wb3NpdGUgc2xpY2VzIGNhY2hlIG9uZS5cbiAqIEEgYmFja2dyb3VuZCBsb2FkZXIgcHJlLWZpbGxzIHRoZSByZXN0IG9mIHRoZSBzdGFjaywgb25lIHNsaWNlIGF0IGEgdGltZSxcbiAqIHlpZWxkaW5nIHRvIHRoZSB2aXNpYmxlIHNsaWNlIHNvIG9uLXNjcmVlbiB0aWxlcyBhbHdheXMgd2luIHRoZSBjb25uZWN0aW9uLlxuICovXG5cbi8qKiBXaGF0IHRoZSBjYWNoZSBuZWVkcyBmcm9tIHRoZSB2aXN1YWxpemVyIHNlcnZpY2UuIEFsbCBhY2Nlc3NvcnMgYXJlIGxpdmVcbiAqICAoY2FsbGVkIGF0IHVzZSB0aW1lLCBuZXZlciBjYXB0dXJlZCkgc28gdGhlIGNhY2hlIGFsd2F5cyBzZWVzIHRoZSBjdXJyZW50XG4gKiAgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgbWF0Y2hpbmcgdGhlIGZpZWxkIHJlYWRzIGl0IHJlcGxhY2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGljZUNhY2hlSG9zdCB7XG4gIC8qKiBUaGUgbW91bnRlZCB2aWV3ZXIsIG9yIG51bGwuICovXG4gIHZpZXdlcigpOiBPc2RWaWV3ZXJMaWtlIHwgbnVsbDtcbiAgLyoqIFRydWUgd2hlbiBhIHZpZXdlciwgZGVzY3JpcHRvciBhbmQgaW5mb0I2NCBhcmUgYWxsIHByZXNlbnQuICovXG4gIGhhc0ltYWdlKCk6IGJvb2xlYW47XG4gIC8qKiBTdGFjayBkZXB0aCAoZGVzY3JpcHRvci56LCAxIGZvciBzaW5nbGUgaW1hZ2VzKS4gKi9cbiAgc2xpY2VDb3VudCgpOiBudW1iZXI7XG4gIC8qKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCB6LXNsaWNlLiAqL1xuICBjdXJyZW50WigpOiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCByZW5kZXJpbmcgKG11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UpIHZzIGNvbXBvc2l0ZS4gKi9cbiAgaXNNdWx0aUNoYW5uZWwoKTogYm9vbGVhbjtcbiAgLyoqIENoYW5uZWwgY291bnQgZm9yIGEgbXVsdGljaGFubmVsIGdyb3VwIGFkZC4gKi9cbiAgY2hhbm5lbENvdW50KCk6IG51bWJlcjtcbiAgLyoqIENoYW5uZWwgdmlzaWJpbGl0eSAoZHJpdmVzIGdyb3VwIHJldmVhbCBvcGFjaXR5KS4gKi9cbiAgY2hhbm5lbFZpc2libGUoYzogbnVtYmVyKTogYm9vbGVhbjtcbiAgLyoqIFRpbGUgc291cmNlIGZvciBzbGljZSB6IChvcHRpb25hbGx5IG9uZSBjaGFubmVsKS4gKi9cbiAgYnVpbGRUaWxlU291cmNlKHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IHN0cmluZyB8IG9iamVjdDtcbiAgLyoqIEEgY29tcG9zaXRlIHNsaWNlIGxhbmRlZCBpbiB0aGUgd29ybGQg4oCUIHRoZSBzZXJ2aWNlIHNhbXBsZXMgaXRzIHdpbmRvdy4gKi9cbiAgb25Db21wb3NpdGVTbGljZUFkZGVkKHo6IG51bWJlcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTbGljZUNhY2hlIHtcbiAgLyoqIHotc2xpY2Ug4oaSIGl0cyBUaWxlZEltYWdlIGluIHRoZSB2aWV3ZXIgd29ybGQgKGNvbXBvc2l0ZSBwYXRoKS4gKi9cbiAgcHJpdmF0ZSBzbGljZUl0ZW1zID0gbmV3IE1hcDxudW1iZXIsIE9zZFRpbGVkSW1hZ2VMaWtlPigpO1xuICAvKiogTXVsdGljaGFubmVsIHBlci1zbGljZSBjYWNoZTogeiDihpIgdGhlIE4gY2hhbm5lbCBUaWxlZEltYWdlcyBmb3IgdGhhdCBzbGljZVxuICAgKiAgKGFkZGl0aXZlbHkgY29tcG9zaXRlZCBieSBPU0Q7IGluZGV4ID0gY2hhbm5lbCkuIE9ubHkgdGhlIGFjdGl2ZSBzbGljZSdzXG4gICAqICB2aXNpYmxlIGNoYW5uZWxzIGhhdmUgb3BhY2l0eSA+IDAuICovXG4gIHByaXZhdGUgY2hhbm5lbFNsaWNlSXRlbXMgPSBuZXcgTWFwPG51bWJlciwgQXJyYXk8T3NkVGlsZWRJbWFnZUxpa2UgfCB1bmRlZmluZWQ+PigpO1xuICAvKiogQ2FjaGVkIG11bHRpY2hhbm5lbCBzbGljZXMgd2hvc2UgdGlsZXMgd2VyZSB0aW50ZWQgYmVmb3JlIHRoZSBsYXRlc3RcbiAgICogIGRpc3BsYXkgY2hhbmdlOyByZS10aW50ZWQgbGF6aWx5IHdoZW4gbmV4dCByZXZlYWxlZCBieSB6LXNjcnViLiAqL1xuICBwcml2YXRlIHN0YWxlU2xpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIC8qKiBNb3N0LXJlY2VudGx5LXNob3duIHogbGFzdDsgZHJpdmVzIExSVSBldmljdGlvbi4gKi9cbiAgcHJpdmF0ZSBzbGljZUxydTogbnVtYmVyW10gPSBbXTtcbiAgLyoqIHotc2xpY2VzIHdob3NlIHRpbGVkIGltYWdlIGlzIGJlaW5nIGFkZGVkIChkZWR1cGUgcmFwaWQgc2NydWJiaW5nKS4gKi9cbiAgcHJpdmF0ZSBzbGljZXNMb2FkaW5nID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIC8qKiBCdW1wZWQgd2hlbmV2ZXIgdGhlIGxvYWRlZCBpbWFnZSBjaGFuZ2VzOyBpbi1mbGlnaHQgYmFja2dyb3VuZCBzbGljZSBhZGRzXG4gICAqICBjYXB0dXJlZCB1bmRlciBhbiBvbGRlciB0b2tlbiBhcmUgZHJvcHBlZCAoY2FuY2VsbGVkIGltYWdlIHN3aXRjaCkuICovXG4gIHByaXZhdGUgc2xpY2VMb2FkVG9rZW4gPSAwO1xuICAvKiogVGhlIHNsaWNlIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBpcyBjdXJyZW50bHkgd2FpdGluZyBvbiAoaXRzIHRpbGVzIGFyZVxuICAgKiAgc3RpbGwgc3RyZWFtaW5nKTogYWRkVGlsZWRJbWFnZSAnc3VjY2VzcycgZmlyZXMgb24gYWRkLCBub3Qgb24gdGlsZSBsb2FkLFxuICAgKiAgc28gd2UgZ2F0ZSB0aGUgbmV4dCBzbGljZSBvbiBnZXRGdWxseUxvYWRlZCgpLiAqL1xuICBwcml2YXRlIGJnTG9hZGluZ1o6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogV2hlbiBiZ0xvYWRpbmdaIHN0YXJ0ZWQgbG9hZGluZyDigJQgYSBmYWxsYmFjayBzbyBhIHNsb3cvc3R1Y2sgc2xpY2UgY2FuJ3RcbiAgICogIHN0YWxsIHRoZSB3aG9sZSBiYWNrZ3JvdW5kIHBhc3MgZm9yZXZlci4gKi9cbiAgcHJpdmF0ZSBiZ0xvYWRpbmdTaW5jZSA9IDA7XG4gIC8qKiBTbGljZXMgdGhlIGJhY2tncm91bmQgbG9hZGVyIGhhcyBhbHJlYWR5IGF0dGVtcHRlZCAobm8gdGlnaHQgcmV0cnkgbG9vcCkuICovXG4gIHByaXZhdGUgYmdBdHRlbXB0ZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgLyoqIE1heCBjYWNoZWQgc2xpY2UgdGlsZWQgaW1hZ2VzIGtlcHQgcmVzaWRlbnQgYmVmb3JlIExSVSBldmljdGlvbi4gKi9cbiAgcHJpdmF0ZSBtYXhDYWNoZWRTbGljZXMgPSA4O1xuICAvKiogVXBwZXIgYm91bmQgb24gcmVzaWRlbnQgc2xpY2VzLCByZWdhcmRsZXNzIG9mIHN0YWNrIGRlcHRoIChtZW1vcnkgZ3VhcmQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9DQUNIRURfU0xJQ0VTX0NBUCA9IDY0O1xuICAvKiogRml0LXZpZXcgdGlsZSBidWRnZXQgYWJvdmUgd2hpY2ggYmFja2dyb3VuZCBwcmVsb2FkaW5nIGlzIHNraXBwZWQ6IGEgaHVnZVxuICAgKiAgbm8tcHlyYW1pZCBzdGFjayB3b3VsZCBwcmVsb2FkIGV2ZXJ5IHNsaWNlIGF0IGZ1bGwgcmVzb2x1dGlvbiBhbmRcbiAgICogIGZsb29kL3RpbWVvdXQuIE5vcm1hbCBzdGFja3Mgc3RheSBiZWxvdyBpdCBhbmQgS0VFUCB0aGUgZmxpY2tlci1mcmVlXG4gICAqICBwcmUtY2FjaGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX1BSRUZFVENIX0ZJVF9USUxFUyA9IDI1NjtcbiAgLyoqIFRydWUgb25seSBmb3Igc3RhY2tzIHRvbyBsYXJnZSB0byBiYWNrZ3JvdW5kLXByZWxvYWQuICovXG4gIHByaXZhdGUgc2tpcFNsaWNlUHJlZmV0Y2ggPSBmYWxzZTtcbiAgcHJpdmF0ZSBwcmVmZXRjaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogU2xpY2VDYWNoZUhvc3QpIHt9XG5cbiAgLy8g4pSA4pSAIGNvbmZpZ3VyYXRpb24gKHBlciBpbWFnZSwgZnJvbSBwbG90KCkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBTaXplIHRoZSBjYWNoZSBmb3IgdGhlIGxvYWRlZCBpbWFnZToga2VlcCB0aGUgd2hvbGUgc3RhY2sgcmVzaWRlbnRcbiAgICogIChjYXBwZWQpIHNvIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBmaWxscyBldmVyeSBzbGljZSB3aXRob3V0IGV2aWN0aW5nXG4gICAqICBpdHNlbGY7IHNraXAgcHJlbG9hZGluZyBlbnRpcmVseSB3aGVuIGV2ZW4gdGhlIGNvYXJzZXN0IGxldmVsJ3MgdGlsZVxuICAgKiAgZ3JpZCBpcyB0b28gbGFyZ2UgKGl0cyBzbGljZXMgb25seSBleGlzdCBhdCBmdWxsIHJlc29sdXRpb24pLiAqL1xuICBjb25maWd1cmUoc3RhY2tEZXB0aDogbnVtYmVyLCBjb2Fyc2VGaXRUaWxlczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5za2lwU2xpY2VQcmVmZXRjaCA9IGNvYXJzZUZpdFRpbGVzID4gdGhpcy5NQVhfUFJFRkVUQ0hfRklUX1RJTEVTO1xuICAgIHRoaXMubWF4Q2FjaGVkU2xpY2VzID0gc3RhY2tEZXB0aCA+IDEgPyBNYXRoLm1pbih0aGlzLk1BWF9DQUNIRURfU0xJQ0VTX0NBUCwgc3RhY2tEZXB0aCkgOiAxO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgTFJVIGNhcCAodGhlIHZpZXdlciBzaXplcyBpdHMgdGlsZSBjYWNoZSBmcm9tIGl0KS4gKi9cbiAgbWF4U2xpY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWF4Q2FjaGVkU2xpY2VzO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHBlci1jaGFubmVsIGdyb3VwcyAob24gYSBmcmVzaCBwbG90KS4gKi9cbiAgY2xlYXJDaGFubmVsR3JvdXBzKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIG92ZXIgdGhlIHNsaWNlIHRoZSB2aWV3ZXIganVzdCBvcGVuZWQgKHdvcmxkIGl0ZW0gMCkuIENvbXBvc2l0ZTogc2VlZFxuICAgKiB0aGUgY2FjaGUgd2l0aCBpdCwgc28gc2NydWJiaW5nIGJhY2sgdG8gaXQgbGF0ZXIgaXMgYW4gaW5zdGFudCBvcGFjaXR5XG4gICAqIHRvZ2dsZSwgbm90IGEgcmUtb3Blbi4gTXVsdGljaGFubmVsOiBkcm9wIHRoYXQgc2luZ2xlIChjaGFubmVsLTApIGltYWdlIGFuZFxuICAgKiBhZGQgdGhlIHNsaWNlJ3MgY2hhbm5lbCBncm91cCBpbnN0ZWFkOyB0aGUgYmFja2dyb3VuZCBsb2FkZXIgLyBMUlUgdGhlblxuICAgKiBwcmUtZmlsbHMgdGhlIG90aGVyIHNsaWNlcycgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgKi9cbiAgYWRvcHRPcGVuZWRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLmhvc3Qudmlld2VyKCk7XG4gICAgaWYgKHRoaXMuaG9zdC5pc011bHRpQ2hhbm5lbCgpKSB7XG4gICAgICBxdWlldCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0MCA9IHZpZXdlcj8ud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgICAgICBpZiAodmlld2VyICYmIGl0MCkgdmlld2VyLndvcmxkLnJlbW92ZUl0ZW0oaXQwKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRDaGFubmVsU2xpY2Uoeik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0SXRlbSA9IHZpZXdlcj8ud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgIGlmIChmaXJzdEl0ZW0pIHRoaXMuc2VlZENvbXBvc2l0ZSh6LCBmaXJzdEl0ZW0pO1xuICB9XG5cbiAgLyoqIFNlZWQgdGhlIGNhY2hlIHdpdGggdGhlIGp1c3Qtb3BlbmVkIGNvbXBvc2l0ZSBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICogIHNjcnViYmluZyBiYWNrIHRvIGl0IGxhdGVyIGlzIGFuIGluc3RhbnQgb3BhY2l0eSB0b2dnbGUsIG5vdCBhIHJlLW9wZW4uICovXG4gIHNlZWRDb21wb3NpdGUoejogbnVtYmVyLCBpdGVtOiBPc2RUaWxlZEltYWdlTGlrZSk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VJdGVtcy5zZXQoeiwgaXRlbSk7XG4gICAgdGhpcy50b3VjaFNsaWNlTHJ1KHopO1xuICB9XG5cbiAgLy8g4pSA4pSAIHNsaWNlIGRpc3BsYXkgKHNldFpJbmRleCdzIGNhY2hlIHdvcmspIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBTaG93IHNsaWNlIHo6IHJldmVhbCBpdCBpbnN0YW50bHkgd2hlbiBjYWNoZWQgKHJlLXRpbnRpbmcgYSBzdGFsZVxuICAgKiAgbXVsdGljaGFubmVsIGdyb3VwKSwgb3RoZXJ3aXNlIGFkZCBpdCBvbmNlLiBUaGUgY3VycmVudCBzbGljZSBzdGF5c1xuICAgKiAgdmlzaWJsZSB1bnRpbCB0aGUgbmV3IG9uZSBpcyBpbiDigJQgbm8gd2hpdGUtZmxpY2tlci4gKi9cbiAgc2hvd1NsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmdldCh6KTtcbiAgICAgIGlmIChncm91cCAmJiBncm91cC5sZW5ndGggJiYgZ3JvdXAuc29tZSgoaXQpID0+IGl0ICYmIHRoaXMuc2xpY2VJbldvcmxkKGl0KSkpIHtcbiAgICAgICAgdGhpcy5yZXZlYWxDaGFubmVsU2xpY2Uoeik7XG4gICAgICAgIC8vIElmIGEgZGlzcGxheSBjaGFuZ2UgaGFwcGVuZWQgd2hpbGUgdGhpcyBzbGljZSB3YXMgY2FjaGVkLCBpdHMgdGlsZXNcbiAgICAgICAgLy8gaG9sZCBhIHN0YWxlIHRpbnQg4oCUIHJlLWFwcGx5IG5vdyAoaXQncyB0aGUgdmlzaWJsZSBzbGljZSwgc28gdGhlXG4gICAgICAgIC8vIGJyaWVmIHJlc3RvcmUgZmxhc2ggaXMgYWNjZXB0YWJsZSwgbGlrZSBhIGZyZXNoIGxvYWQpLlxuICAgICAgICBpZiAodGhpcy5zdGFsZVNsaWNlcy5kZWxldGUoeikpIHRoaXMuaW52YWxpZGF0ZVNsaWNlKHopO1xuICAgICAgICB0aGlzLnRvdWNoU2xpY2VMcnUoeik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zbGljZXNMb2FkaW5nLmhhcyh6KSkge1xuICAgICAgICB0aGlzLmFkZENoYW5uZWxTbGljZSh6KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zbGljZUl0ZW1zLmdldCh6KTtcbiAgICBpZiAoY2FjaGVkICYmIHRoaXMuc2xpY2VJbldvcmxkKGNhY2hlZCkpIHtcbiAgICAgIC8vIEluc3RhbnQ6IHJldmVhbCB0aGUgY2FjaGVkIHNsaWNlLCBoaWRlIHRoZSBvdGhlcnMg4oCUIG5vIGZldGNoL2RlY29kZS5cbiAgICAgIHRoaXMuc2hvd09ubHlTbGljZSh6KTtcbiAgICAgIHRoaXMudG91Y2hTbGljZUxydSh6KTtcbiAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zbGljZXNMb2FkaW5nLmhhcyh6KSkgcmV0dXJuOyAvLyBhbHJlYWR5IGJlaW5nIGFkZGVkOyBzdWNjZXNzIHJldmVhbHMgaXRcbiAgICB0aGlzLmFkZFNsaWNlKHopO1xuICB9XG5cbiAgLyoqIEFkZCBhIG5ldmVyLXNlZW4gc2xpY2UgYXMgYSBoaWRkZW4gdGlsZWQgaW1hZ2UsIHRoZW4gcmV2ZWFsIGl0IG9uY2UgbG9hZGVkXG4gICAqICAoY29tcG9zaXRlIHBhdGg7IG11bHRpY2hhbm5lbCByb3V0ZXMgdG8gYWRkQ2hhbm5lbFNsaWNlKS4gKi9cbiAgcHJpdmF0ZSBhZGRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaG9zdC5oYXNJbWFnZSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaG9zdC5pc011bHRpQ2hhbm5lbCgpKSB7XG4gICAgICB0aGlzLmFkZENoYW5uZWxTbGljZSh6KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5zbGljZXNMb2FkaW5nLmFkZCh6KTtcbiAgICAvLyBUYWcgdGhpcyBhZGQgdG8gdGhlIGN1cnJlbnQgaW1hZ2U7IGlmIHRoZSB1c2VyIHN3aXRjaGVzIGltYWdlcyBiZWZvcmUgaXRcbiAgICAvLyByZXNvbHZlcywgdGhlIHN0YWxlIGNhbGxiYWNrIGlzIGRyb3BwZWQgKHRoZSBhZGQgYmVsb25ncyB0byB0aGUgb2xkIHN0YWNrKS5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuc2xpY2VMb2FkVG9rZW47XG4gICAgY29uc3QgdHMgPSB0aGlzLmhvc3QuYnVpbGRUaWxlU291cmNlKHopO1xuICAgIHRyeSB7XG4gICAgICAvLyBhZGRUaWxlZEltYWdlIGxpdmVzIG9uIHRoZSBWaWV3ZXIgKGl0IHF1ZXVlcyB0aGUgYWRkIGludG8gdGhlIHdvcmxkKS5cbiAgICAgIHZpZXdlci5hZGRUaWxlZEltYWdlKHtcbiAgICAgICAgdGlsZVNvdXJjZTogdHMsXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHdpZHRoOiAxLCAvLyBtYXRjaCB0aGUgcHJpbWFyeSBpbWFnZSdzIG5vcm1hbGl6ZWQgcGxhY2VtZW50XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIC8vIExvYWQgdGlsZXMgZXZlbiB0aG91Z2ggaXQncyBoaWRkZW4g4oCUIHRoaXMgaXMgd2hhdCBsZXRzIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIC8vIGxvYWRlciBmaWxsIGV2ZXJ5IHNsaWNlJ3MgY2FjaGUgc28gc2NydWJiaW5nIGdldHMgcHJvZ3Jlc3NpdmVseSBzbW9vdGhlci5cbiAgICAgICAgcHJlbG9hZDogdHJ1ZSxcbiAgICAgICAgc3VjY2VzczogKGUpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gZT8uaXRlbTtcbiAgICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMuc2xpY2VMb2FkVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIEltYWdlIHN3aXRjaGVkIHdoaWxlIHRoaXMgd2FzIGFkZGluZyDigJQgZHJvcCB0aGUgb3JwaGFuIHNvIGl0IHN0b3BzXG4gICAgICAgICAgICAvLyBsb2FkaW5nIGluc3RlYWQgb2Ygc3RyZWFtaW5nIHRpbGVzIGZvciB0aGUgYWJhbmRvbmVkIHN0YWNrLlxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgcXVpZXQoKCkgPT4gdGhpcy5ob3N0LnZpZXdlcigpPy53b3JsZD8ucmVtb3ZlSXRlbShpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2xpY2VzTG9hZGluZy5kZWxldGUoeik7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zbGljZUl0ZW1zLnNldCh6LCBpdGVtKTtcbiAgICAgICAgICB0aGlzLnRvdWNoU2xpY2VMcnUoeik7XG4gICAgICAgICAgdGhpcy5ob3N0Lm9uQ29tcG9zaXRlU2xpY2VBZGRlZCh6KTtcbiAgICAgICAgICAvLyBPbmx5IHJldmVhbCBpZiB0aGUgdXNlciBpcyBzdGlsbCBvbiB0aGlzIHNsaWNlIChmYXN0IHNjcnViYmluZyBtYXlcbiAgICAgICAgICAvLyBoYXZlIG1vdmVkIG9uIOKAlCBsZWF2ZSBpdCBjYWNoZWQvaGlkZGVuIGZvciBhIGxhdGVyIHJldmlzaXQpLlxuICAgICAgICAgIGlmICh6ID09PSB0aGlzLmhvc3QuY3VycmVudFooKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93T25seVNsaWNlKHopO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZXZpY3RTbGljZUxydSgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIGlmICh0b2tlbiA9PT0gdGhpcy5zbGljZUxvYWRUb2tlbikgdGhpcy5zbGljZXNMb2FkaW5nLmRlbGV0ZSh6KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zbGljZXNMb2FkaW5nLmRlbGV0ZSh6KTtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gZmFpbGVkIHRvIGFkZCB6LXNsaWNlJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIHNsaWNlIHoncyBjaGFubmVsIGdyb3VwOiBvbmUgYWRkaXRpdmVseS1jb21wb3NpdGVkICgnbGlnaHRlcicgPSBGaWppXG4gICAqIFwiQ29tcG9zaXRlXCIpIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwsIGhpZGRlbiAob3BhY2l0eSAwKSB1bnRpbCByZXZlYWxlZC5cbiAgICogVGhlIHZpc2libGUgY2hhbm5lbHMnIGFyZSBwcmVsb2FkZWQsIHNvIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBjYW4gcHJlLWZpbGxcbiAgICogZXZlcnkgc2xpY2U7IGEgaGlkZGVuIGNoYW5uZWwncyBsb2FkcyBub3RoaW5nIHVudGlsIGl0IGlzIHNob3duIChhIDIyLWNoYW5uZWxcbiAgICogcGxhdGUgZmV0Y2hlZCBhbmQgZGVjb2RlZCBldmVyeSBjaGFubmVsJ3MgdGlsZXMsIG92ZXJmbG93aW5nIHRoZSB0aWxlIGNhY2hlOlxuICAgKiB0aWxlcyBldmljdGVkIG1pZC1jb252ZXJzaW9uIGZhaWxlZCB0byBkZWNvZGUpLlxuICAgKiBDYWNoZWQgc28gYSByZXZpc2l0IGlzIGFuIGluc3RhbnQgb3BhY2l0eSB0b2dnbGUg4oCUIG5vIHJlLWZldGNoLCBub1xuICAgKiB3aGl0ZS1mbGlja2VyLiBNaXJyb3JzIGFkZFNsaWNlIGZvciB0aGUgY29tcG9zaXRlIHBhdGguXG4gICAqL1xuICBhZGRDaGFubmVsU2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhvc3QuaGFzSW1hZ2UoKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmhhcyh6KSB8fCB0aGlzLnNsaWNlc0xvYWRpbmcuaGFzKHopKSByZXR1cm47XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5zbGljZXNMb2FkaW5nLmFkZCh6KTtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuc2xpY2VMb2FkVG9rZW47XG4gICAgY29uc3QgbiA9IHRoaXMuaG9zdC5jaGFubmVsQ291bnQoKTtcbiAgICBjb25zdCBncm91cDogQXJyYXk8T3NkVGlsZWRJbWFnZUxpa2UgfCB1bmRlZmluZWQ+ID0gbmV3IEFycmF5KG4pO1xuICAgIGxldCBzZXR0bGVkID0gMDtcbiAgICBjb25zdCBvblNldHRsZWQgPSAoKSA9PiB7XG4gICAgICBpZiAoKytzZXR0bGVkIDwgbikgcmV0dXJuO1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLnNsaWNlTG9hZFRva2VuKSByZXR1cm47IC8vIGltYWdlIHN3aXRjaGVkIG1pZC1hZGRcbiAgICAgIHRoaXMuc2xpY2VzTG9hZGluZy5kZWxldGUoeik7XG4gICAgICB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLnNldCh6LCBncm91cCk7XG4gICAgICB0aGlzLnN0YWxlU2xpY2VzLmRlbGV0ZSh6KTsgLy8gZnJlc2hseSB0aW50ZWQgYXQgdGhlIGN1cnJlbnQgZGlzcGxheSBzdGF0ZVxuICAgICAgdGhpcy50b3VjaFNsaWNlTHJ1KHopO1xuICAgICAgaWYgKHogPT09IHRoaXMuaG9zdC5jdXJyZW50WigpKSB7XG4gICAgICAgIHRoaXMucmV2ZWFsQ2hhbm5lbFNsaWNlKHopOyAvLyB0aWxlcyBtYXkgc3RpbGwgYmUgZGVjb2Rpbmc7IG9wYWNpdHkgaXMgc2V0IG5vd1xuICAgICAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXZpY3RTbGljZUxydSgpO1xuICAgIH07XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBuOyBjKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZpZXdlci5hZGRUaWxlZEltYWdlKHtcbiAgICAgICAgICB0aWxlU291cmNlOiB0aGlzLmhvc3QuYnVpbGRUaWxlU291cmNlKHosIGMpLFxuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICBvcGFjaXR5OiAwLCAvLyByZXZlYWxlZCBieSByZXZlYWxDaGFubmVsU2xpY2Ugb25jZSB0aGUgZ3JvdXAgaXMgaW5cbiAgICAgICAgICBjb21wb3NpdGVPcGVyYXRpb246ICdsaWdodGVyJyxcbiAgICAgICAgICBwcmVsb2FkOiB0aGlzLmhvc3QuY2hhbm5lbFZpc2libGUoYyksXG4gICAgICAgICAgc3VjY2VzczogKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlPy5pdGVtO1xuICAgICAgICAgICAgaWYgKHRva2VuICE9PSB0aGlzLnNsaWNlTG9hZFRva2VuKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgcXVpZXQoKCkgPT4gdGhpcy5ob3N0LnZpZXdlcigpPy53b3JsZD8ucmVtb3ZlSXRlbShpdGVtKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGl0ZW0pIGdyb3VwW2NdID0gaXRlbTtcbiAgICAgICAgICAgIG9uU2V0dGxlZCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICgpID0+IG9uU2V0dGxlZCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIGZhaWxlZCB0byBhZGQgY2hhbm5lbCBzbGljZSBpbWFnZScsIHosIGMsIGVycik7XG4gICAgICAgIG9uU2V0dGxlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXZlYWwgc2xpY2UgeidzIGNoYW5uZWwgZ3JvdXAgKGVhY2ggdmlzaWJsZSBjaGFubmVsIOKGkiBvcGFjaXR5IDEpIGFuZFxuICAgKiAgaGlkZSBldmVyeSBvdGhlciBjYWNoZWQgc2xpY2UncyBncm91cC4gSW5zdGFudDsgbm8gZmV0Y2gvZGVjb2RlLiBPbmx5IHRoZVxuICAgKiAgdmlzaWJsZSBjaGFubmVscyBrZWVwIGxvYWRpbmcgKHByZWxvYWQpOiBhIGhpZGRlbiBjaGFubmVsJ3MgdGlsZXMgYXJlIG5vdFxuICAgKiAgZmV0Y2hlZCBvciBkZWNvZGVkIHVudGlsIGl0IGlzIHNob3duLiAqL1xuICByZXZlYWxDaGFubmVsU2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaGlkZGVuID0gbmV3IFNldDxPc2RUaWxlZEltYWdlTGlrZT4oKTtcbiAgICBmb3IgKGNvbnN0IFt6eiwgZ3JvdXBdIG9mIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHp6ID09PSB6O1xuICAgICAgZ3JvdXAuZm9yRWFjaCgoaXQsIGMpID0+IHtcbiAgICAgICAgaWYgKCFpdCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5ob3N0LmNoYW5uZWxWaXNpYmxlKGMpO1xuICAgICAgICBpZiAoIXZpc2libGUpIGhpZGRlbi5hZGQoaXQpO1xuICAgICAgICBxdWlldCgoKSA9PiBpdC5zZXRQcmVsb2FkPy4odmlzaWJsZSkpO1xuICAgICAgICBxdWlldCgoKSA9PiBpdC5zZXRPcGFjaXR5KGFjdGl2ZSAmJiB2aXNpYmxlID8gMSA6IDApKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmRyb3BRdWV1ZWRUaWxlcyhoaWRkZW4pO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHRpbGUgcmVxdWVzdHMgc3RpbGwgd2FpdGluZyBpbiBPU0QncyBxdWV1ZSBmb3IgYGl0ZW1zYCAoY2hhbm5lbHMganVzdCBoaWRkZW4pLCBzb1xuICAgKiAgdGhlIHZpc2libGUgY2hhbm5lbHMnIHRpbGVzIGFyZSBub3Qgc3R1Y2sgYmVoaW5kIHRoZW0uIEEgcmVxdWVzdCBhbHJlYWR5IHNlbnQgY29tcGxldGVzLiAqL1xuICBwcml2YXRlIGRyb3BRdWV1ZWRUaWxlcyhpdGVtczogU2V0PE9zZFRpbGVkSW1hZ2VMaWtlPik6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlciA9IHRoaXMuaG9zdC52aWV3ZXIoKT8uaW1hZ2VMb2FkZXI7XG4gICAgaWYgKCFpdGVtcy5zaXplIHx8ICFBcnJheS5pc0FycmF5KGxvYWRlcj8uam9iUXVldWUpKSByZXR1cm47XG4gICAgbG9hZGVyLmpvYlF1ZXVlID0gKGxvYWRlci5qb2JRdWV1ZSBhcyBPc2RRdWV1ZWRUaWxlSm9iW10pLmZpbHRlcigoam9iKSA9PiB7XG4gICAgICBpZiAoIWl0ZW1zLmhhcyhqb2I/LnRpbGU/LnRpbGVkSW1hZ2UgYXMgT3NkVGlsZWRJbWFnZUxpa2UpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHF1aWV0KCgpID0+IGpvYi5hYm9ydD8uKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNob3cgdGhlIGdpdmVuIGNvbXBvc2l0ZSBzbGljZSAob3BhY2l0eSAxKSBhbmQgaGlkZSBhbGwgb3RoZXIgY2FjaGVkIHNsaWNlcy4gKi9cbiAgcHJpdmF0ZSBzaG93T25seVNsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW3p6LCBpdGVtXSBvZiB0aGlzLnNsaWNlSXRlbXMpIHtcbiAgICAgIHF1aWV0KCgpID0+IGl0ZW0uc2V0T3BhY2l0eSh6eiA9PT0geiA/IDEgOiAwKSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIGRpc3BsYXkgaW52YWxpZGF0aW9uIChtdWx0aWNoYW5uZWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZS10aW50IGFmdGVyIGEgZGlzcGxheSBjaGFuZ2U6IGludmFsaWRhdGUgT05MWSB0aGUgdmlzaWJsZSBzbGljZSdzXG4gICAqICBjaGFubmVsIGltYWdlcyDigJQgaW52YWxpZGF0aW5nIHRoZSB3aG9sZSB3b3JsZCB3b3VsZCByZS1wcm9jZXNzIGV2ZXJ5XG4gICAqICBoaWRkZW4vcHJlbG9hZGVkIHNsaWNlJ3MgdGlsZXMgKGh1bmRyZWRzKSwgZmxvb2RpbmcgT1NEIGFuZCB3YXN0aW5nIHdvcmtcbiAgICogIG9uIHRpbGVzIHRoYXQgYXJlbid0IG9uIHNjcmVlbi4gVGhlIG90aGVyIGNhY2hlZCBzbGljZXMgYXJlIG1hcmtlZCBzdGFsZVxuICAgKiAgYW5kIHJlLXRpbnRlZCBsYXppbHkgd2hlbiByZXZlYWxlZC4gKi9cbiAgaW52YWxpZGF0ZUNoYW5uZWxEaXNwbGF5KHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW52YWxpZGF0ZVNsaWNlKHopO1xuICAgIHRoaXMuc3RhbGVTbGljZXMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHp6IG9mIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMua2V5cygpKSB7XG4gICAgICBpZiAoenogIT09IHopIHRoaXMuc3RhbGVTbGljZXMuYWRkKHp6KTtcbiAgICB9XG4gIH1cblxuICAvKiogSW52YWxpZGF0ZSAocmVzdG9yZSArIHJlLXJlY29sb3IpIGp1c3QgdGhlIGNoYW5uZWwgaW1hZ2VzIG9mIG9uZSBjYWNoZWRcbiAgICogIHNsaWNlLiBBIHNoYXJlZCB0aW1lc3RhbXAgYmF0Y2hlcyB0aGUgcGVyLWltYWdlIGludmFsaWRhdGlvbnMgaW50byBvbmVcbiAgICogIHByb2Nlc3NpbmcgcGFzcyAoT1NEIGRlZHVwZXMgdGlsZXMgYWxyZWFkeSBzdGFtcGVkIGF0ID49IHRTdGFtcCkuICovXG4gIHByaXZhdGUgaW52YWxpZGF0ZVNsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5nZXQoeikgPz8gW107XG4gICAgaWYgKCFncm91cC5sZW5ndGgpIHJldHVybjtcbiAgICAvLyBGZWF0dXJlLXRlc3RlZDogYSBtb2NrZWQgT1NEIG1vZHVsZSAoc3BlY3MpIG1heSBub3QgcHJvdmlkZSBpdC5cbiAgICBjb25zdCB0U3RhbXAgPSB0eXBlb2YgT1NELm5vdyA9PT0gJ2Z1bmN0aW9uJyA/IE9TRC5ub3coKSA6IERhdGUubm93KCk7XG4gICAgZm9yIChjb25zdCBpdCBvZiBncm91cCkge1xuICAgICAgaWYgKGl0ICYmIHR5cGVvZiBpdC5yZXF1ZXN0SW52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBxdWlldCgoKSA9PiBpdC5yZXF1ZXN0SW52YWxpZGF0ZT8uKHRydWUsIGZhbHNlLCB0U3RhbXApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgYmFja2dyb3VuZCBzdGFjayBwcmVsb2FkaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBEZWJvdW5jZSBzbyBhIGJ1cnN0IG9mIHZpZXdwb3J0L3NsaWNlIGV2ZW50cyBjb2FsZXNjZXMsIHRoZW4gYWR2YW5jZSB0aGVcbiAgICogIGJhY2tncm91bmQgc3RhY2sgbG9hZGVyIGJ5IG9uZSBzbGljZS4gKi9cbiAgc2NoZWR1bGVQcmVmZXRjaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5za2lwU2xpY2VQcmVmZXRjaCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWZldGNoVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnByZWZldGNoVGltZXIpO1xuICAgIHRoaXMucHJlZmV0Y2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb2FkTmV4dEJhY2tncm91bmRTbGljZSgpLCAyMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2tncm91bmQtbG9hZCB0aGUgd2hvbGUgc3RhY2s6IGFkZCBlYWNoIG5vdC15ZXQtY2FjaGVkIHNsaWNlIGFzIGFcbiAgICogaGlkZGVuLCBwcmVsb2FkZWQgdGlsZWQgaW1hZ2UsIG9uZSBhdCBhIHRpbWUsIHdvcmtpbmcgb3V0d2FyZCBmcm9tIHRoZVxuICAgKiBjdXJyZW50IHNsaWNlIOKAlCBhbmQgbmV2ZXIgYmxvY2tpbmcgdGhlIHZpc2libGUgc2xpY2UgKGl0IHlpZWxkcyB3aGlsZSB0aGVcbiAgICogY3VycmVudCB2aWV3IGlzIHN0aWxsIHN0cmVhbWluZyB0aWxlczsgb25seSBvbmUgc2xpY2UgaXMgaW4gZmxpZ2h0IGF0IGFcbiAgICogdGltZSBzbyB0aGUgb24tc2NyZWVuIHRpbGVzIGFsd2F5cyB3aW4gdGhlIGNvbm5lY3Rpb24pLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkTmV4dEJhY2tncm91bmRTbGljZSgpOiB2b2lkIHtcbiAgICB0aGlzLnByZWZldGNoVGltZXIgPSBudWxsO1xuICAgIGlmICghdGhpcy5ob3N0Lmhhc0ltYWdlKCkpIHJldHVybjtcbiAgICBjb25zdCBzbGljZUNvdW50ID0gdGhpcy5ob3N0LnNsaWNlQ291bnQoKTtcbiAgICBpZiAoc2xpY2VDb3VudCA8PSAxKSByZXR1cm47IC8vIG5vdCBhIHN0YWNrIOKAlCBub3RoaW5nIHRvIHByZWxvYWRcbiAgICAvLyBZaWVsZCB0byB0aGUgdmlzaWJsZSBzbGljZSB3aGlsZSBpdCdzIHN0aWxsIHN0cmVhbWluZyB0aWxlcy5cbiAgICBpZiAodGhpcy5zbGljZVRpbGVzTG9hZGluZyh0aGlzLmhvc3QuY3VycmVudFooKSkpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBHYXRlIG9uIHRoZSBpbi1mbGlnaHQgc2xpY2UncyBUSUxFUyBmaW5pc2hpbmcg4oCUIGFkZFRpbGVkSW1hZ2UncyBzdWNjZXNzXG4gICAgLy8gZmlyZXMgb24gYWRkLCBub3Qgb24gdGlsZSBsb2FkLCBzbyB3aXRob3V0IHRoaXMgd2UnZCBhZGQgdGhlIHdob2xlIHN0YWNrXG4gICAgLy8gYXQgb25jZSBhbmQgZmxvb2QgdGhlIGNvbm5lY3Rpb24uIEEgdGltZSBmYWxsYmFjayBwcmV2ZW50cyBhIHN0dWNrIHNsaWNlXG4gICAgLy8gZnJvbSBzdGFsbGluZyB0aGUgcGFzcy5cbiAgICBpZiAodGhpcy5iZ0xvYWRpbmdaICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGFkZGluZyA9IHRoaXMuc2xpY2VzTG9hZGluZy5oYXModGhpcy5iZ0xvYWRpbmdaKTtcbiAgICAgIGNvbnN0IHRpbGVzTG9hZGluZyA9IHRoaXMuc2xpY2VUaWxlc0xvYWRpbmcodGhpcy5iZ0xvYWRpbmdaKTtcbiAgICAgIGNvbnN0IHRpbWVkT3V0ID0gRGF0ZS5ub3coKSAtIHRoaXMuYmdMb2FkaW5nU2luY2UgPiA4MDAwO1xuICAgICAgaWYgKChhZGRpbmcgfHwgdGlsZXNMb2FkaW5nKSAmJiAhdGltZWRPdXQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmdMb2FkaW5nWiA9IG51bGw7IC8vIHRoYXQgc2xpY2UncyB0aWxlcyBhcmUgaW4gKG9yIGdhdmUgdXApIOKAlCBhZHZhbmNlXG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5lYXJlc3RVbmNhY2hlZFNsaWNlKHNsaWNlQ291bnQpO1xuICAgIGlmIChuZXh0ID09IG51bGwpIHJldHVybjsgLy8gd2hvbGUgc3RhY2sgY2FjaGVkIOKAlCBkb25lXG4gICAgdGhpcy5iZ0xvYWRpbmdaID0gbmV4dDtcbiAgICB0aGlzLmJnTG9hZGluZ1NpbmNlID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmJnQXR0ZW1wdGVkLmFkZChuZXh0KTtcbiAgICB0aGlzLmFkZFNsaWNlKG5leHQpOyAvLyBoaWRkZW4gKyBwcmVsb2FkIChhZGRlZCB3aXRoIG9wYWNpdHkgMDsgbm90IHJldmVhbGVkKVxuICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpOyAvLyBwb2xsIHVudGlsIGl0cyB0aWxlcyBsb2FkLCB0aGVuIGFkdmFuY2VcbiAgfVxuXG4gIC8qKiBUaGUgbm90LXlldC1jYWNoZWQgc2xpY2UgY2xvc2VzdCB0byB0aGUgY3VycmVudCBvbmUgKGxvYWQgbmVhcmVzdCBmaXJzdCksXG4gICAqICBza2lwcGluZyBhbnkgYWxyZWFkeSBhdHRlbXB0ZWQgc28gYSBmYWlsZWQvc2xvdyBvbmUgaXNuJ3QgcmV0cmllZCBpbiBhIGxvb3AuICovXG4gIHByaXZhdGUgbmVhcmVzdFVuY2FjaGVkU2xpY2Uoc2xpY2VDb3VudDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5ob3N0LmN1cnJlbnRaKCk7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBzbGljZUNvdW50OyBkKyspIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBkID09PSAwID8gW2N1cl0gOiBbY3VyIC0gZCwgY3VyICsgZF07XG4gICAgICBmb3IgKGNvbnN0IHogb2YgY2FuZGlkYXRlcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA+PSAwICYmXG4gICAgICAgICAgeiA8IHNsaWNlQ291bnQgJiZcbiAgICAgICAgICAhdGhpcy5zbGljZUNhY2hlSGFzKHopICYmXG4gICAgICAgICAgIXRoaXMuc2xpY2VzTG9hZGluZy5oYXMoeikgJiZcbiAgICAgICAgICAhdGhpcy5iZ0F0dGVtcHRlZC5oYXMoeilcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHo7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBiYWNrZ3JvdW5kIHN0YWNrIHByZWxvYWRpbmcgYW5kIGludmFsaWRhdGUgYW55IGluLWZsaWdodCBzbGljZSBhZGQuXG4gICAqIENhbGxlZCB3aGVuIGEgZGlmZmVyZW50IGltYWdlIGlzIHNlbGVjdGVkIHNvIHRoZSBwcmV2aW91cyBzdGFjayBzdG9wc1xuICAgKiBsb2FkaW5nIGltbWVkaWF0ZWx5IGluc3RlYWQgb2YgZmluaXNoaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgKi9cbiAgY2FuY2VsQmFja2dyb3VuZExvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlZmV0Y2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJlZmV0Y2hUaW1lcik7XG4gICAgICB0aGlzLnByZWZldGNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnNsaWNlc0xvYWRpbmcuY2xlYXIoKTtcbiAgICB0aGlzLmJnTG9hZGluZ1ogPSBudWxsO1xuICAgIHRoaXMuYmdBdHRlbXB0ZWQuY2xlYXIoKTtcbiAgICB0aGlzLnNsaWNlTG9hZFRva2VuKys7IC8vIGRyb3AgcGVuZGluZyBhZGRUaWxlZEltYWdlIGNhbGxiYWNrcyBmcm9tIHRoZSBvbGQgaW1hZ2VcbiAgICAvLyBBYm9ydCBpbi1mbGlnaHQgYmFja2dyb3VuZCB0aWxlcyBpbW1lZGlhdGVseSBieSBkcm9wcGluZyB0aGUgaGlkZGVuXG4gICAgLy8gcHJlbG9hZGVkIHNsaWNlcyAocmVtb3ZlSXRlbSBjYW5jZWxzIHRoZWlyIHBlbmRpbmcgdGlsZSBsb2FkcykuIEtlZXAgdGhlXG4gICAgLy8gdmlzaWJsZSBzbGljZSBzbyB0aGUgY3VycmVudCB2aWV3IGRvZXNuJ3QgYmxhbmsgYmVmb3JlIHRoZSBuZXh0IHBsb3QuXG4gICAgdGhpcy5kcm9wSGlkZGVuU2xpY2VzKCk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGV2ZXJ5IGNhY2hlZCBzbGljZSBleGNlcHQgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgb25lLCBhYm9ydGluZ1xuICAgKiAgdGhlaXIgaW4tZmxpZ2h0IHRpbGUgcmVxdWVzdHMuICovXG4gIHByaXZhdGUgZHJvcEhpZGRlblNsaWNlcygpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuaG9zdC5jdXJyZW50WigpO1xuICAgIGZvciAoY29uc3QgW3osIGl0ZW1dIG9mIFsuLi50aGlzLnNsaWNlSXRlbXNdKSB7XG4gICAgICBpZiAoeiA9PT0gY3VyKSBjb250aW51ZTtcbiAgICAgIHRoaXMuc2xpY2VJdGVtcy5kZWxldGUoeik7XG4gICAgICBxdWlldCgoKSA9PiB2LndvcmxkLnJlbW92ZUl0ZW0oaXRlbSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFt6LCBncm91cF0gb2YgWy4uLnRoaXMuY2hhbm5lbFNsaWNlSXRlbXNdKSB7XG4gICAgICBpZiAoeiA9PT0gY3VyKSBjb250aW51ZTtcbiAgICAgIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZGVsZXRlKHopO1xuICAgICAgZm9yIChjb25zdCBpdCBvZiBncm91cCkge1xuICAgICAgICBpZiAoaXQpIHtcbiAgICAgICAgICBxdWlldCgoKSA9PiB2LndvcmxkLnJlbW92ZUl0ZW0oaXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNsaWNlTHJ1ID0gdGhpcy5zbGljZUNhY2hlSGFzKGN1cikgPyBbY3VyXSA6IFtdO1xuICB9XG5cbiAgLy8g4pSA4pSAIGNhY2hlIGJvb2trZWVwaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBXaGV0aGVyIHNsaWNlIHogaXMgaW4gdGhlIGFjdGl2ZSBjYWNoZSAoY29tcG9zaXRlIHNpbmdsZSBpbWFnZSwgb3IgdGhlXG4gICAqICBtdWx0aWNoYW5uZWwgcGVyLWNoYW5uZWwgZ3JvdXApLiAqL1xuICBwcml2YXRlIHNsaWNlQ2FjaGVIYXMoejogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdC5pc011bHRpQ2hhbm5lbCgpID8gdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5oYXMoeikgOiB0aGlzLnNsaWNlSXRlbXMuaGFzKHopO1xuICB9XG5cbiAgLyoqIFRoZSBjYWNoZWQgVGlsZWRJbWFnZShzKSBmb3Igc2xpY2UgeiAoMOKAkzEgZm9yIGNvbXBvc2l0ZSwgTiBmb3IgbXVsdGljaGFubmVsKS4gKi9cbiAgcHJpdmF0ZSBzbGljZUdyb3VwKHo6IG51bWJlcik6IEFycmF5PE9zZFRpbGVkSW1hZ2VMaWtlIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHRoaXMuaG9zdC5pc011bHRpQ2hhbm5lbCgpKSByZXR1cm4gdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5nZXQoeikgPz8gW107XG4gICAgY29uc3QgaXQgPSB0aGlzLnNsaWNlSXRlbXMuZ2V0KHopO1xuICAgIHJldHVybiBpdCA/IFtpdF0gOiBbXTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHNsaWNlIHoncyB0aWxlcyBhcmUgc3RpbGwgc3RyZWFtaW5nIChhbnkgY2FjaGVkIGltYWdlIG5vdCBmdWxseSBsb2FkZWQpLiBBIGhpZGRlblxuICAgKiAgY2hhbm5lbCBsb2FkcyBub3RoaW5nLCBzbyBpdCBuZXZlciBiZWNvbWVzIGZ1bGx5IGxvYWRlZDogb25seSB0aGUgdmlzaWJsZSBjaGFubmVscyBjb3VudCwgb3JcbiAgICogIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciB3b3VsZCB3YWl0IG9uIGl0IGZvcmV2ZXIuICovXG4gIHByaXZhdGUgc2xpY2VUaWxlc0xvYWRpbmcoejogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZyA9IHRoaXMuc2xpY2VHcm91cCh6KTtcbiAgICBpZiAoIWcubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgbXVsdGkgPSB0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKTtcbiAgICByZXR1cm4gZy5zb21lKFxuICAgICAgKGl0LCBjKSA9PlxuICAgICAgICBpdCAmJlxuICAgICAgICAoIW11bHRpIHx8IHRoaXMuaG9zdC5jaGFubmVsVmlzaWJsZShjKSkgJiZcbiAgICAgICAgdHlwZW9mIGl0LmdldEZ1bGx5TG9hZGVkID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICFpdC5nZXRGdWxseUxvYWRlZCgpLFxuICAgICk7XG4gIH1cblxuICAvKiogUmVtb3ZlIHNsaWNlIHoncyBjYWNoZWQgaW1hZ2UocykgZnJvbSB0aGUgd29ybGQgYW5kIHRoZSBhY3RpdmUgY2FjaGUuICovXG4gIHByaXZhdGUgcmVtb3ZlQ2FjaGVkU2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAodGhpcy5ob3N0LmlzTXVsdGlDaGFubmVsKCkpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5nZXQoeik7XG4gICAgICB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmRlbGV0ZSh6KTtcbiAgICAgIGlmIChncm91cCAmJiB2KVxuICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIGdyb3VwKSB7XG4gICAgICAgICAgaWYgKGl0KSB7XG4gICAgICAgICAgICBxdWlldCgoKSA9PiB2LndvcmxkLnJlbW92ZUl0ZW0oaXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuc2xpY2VJdGVtcy5nZXQoeik7XG4gICAgICB0aGlzLnNsaWNlSXRlbXMuZGVsZXRlKHopO1xuICAgICAgaWYgKGl0ZW0gJiYgdikge1xuICAgICAgICBxdWlldCgoKSA9PiB2LndvcmxkLnJlbW92ZUl0ZW0oaXRlbSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBJcyB0aGUgdGlsZWQgaW1hZ2Ugc3RpbGwgaW4gdGhlIHdvcmxkIChub3QgZXZpY3RlZCk/ICovXG4gIHByaXZhdGUgc2xpY2VJbldvcmxkKGl0ZW06IE9zZFRpbGVkSW1hZ2VMaWtlKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAodGhpcy5ob3N0LnZpZXdlcigpPy53b3JsZC5nZXRJbmRleE9mSXRlbShpdGVtKSA/PyAtMSkgPj0gMDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogTWFyayB6IGFzIG1vc3QtcmVjZW50bHktdXNlZC4gKi9cbiAgcHJpdmF0ZSB0b3VjaFNsaWNlTHJ1KHo6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGkgPSB0aGlzLnNsaWNlTHJ1LmluZGV4T2Yoeik7XG4gICAgaWYgKGkgPj0gMCkgdGhpcy5zbGljZUxydS5zcGxpY2UoaSwgMSk7XG4gICAgdGhpcy5zbGljZUxydS5wdXNoKHopO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQgY2FjaGVkIHNsaWNlcyBiZXlvbmQgdGhlIGNhcCAobmV2ZXIgdGhlXG4gICAqICBjdXJyZW50IG9uZSksIHJlbW92aW5nIHRoZWlyIHRpbGVkIGltYWdlcyBzbyBtZW1vcnkgc3RheXMgYm91bmRlZC4gKi9cbiAgcHJpdmF0ZSBldmljdFNsaWNlTHJ1KCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLnNsaWNlTHJ1Lmxlbmd0aCA+IHRoaXMubWF4Q2FjaGVkU2xpY2VzKSB7XG4gICAgICBjb25zdCBjdXIgPSB0aGlzLmhvc3QuY3VycmVudFooKTtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuc2xpY2VMcnUuZmluZEluZGV4KCh6KSA9PiB6ICE9PSBjdXIpO1xuICAgICAgaWYgKGlkeCA8IDApIGJyZWFrO1xuICAgICAgY29uc3QgeiA9IHRoaXMuc2xpY2VMcnUuc3BsaWNlKGlkeCwgMSlbMF07XG4gICAgICB0aGlzLnJlbW92ZUNhY2hlZFNsaWNlKHopO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGVhciB0aGUgY2FjaGUgKG9uIHRlYXJkb3duIC8gaW1hZ2Ugc3dpdGNoKS4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZUl0ZW1zLmNsZWFyKCk7XG4gICAgdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhbGVTbGljZXMuY2xlYXIoKTtcbiAgICB0aGlzLnNsaWNlTHJ1ID0gW107XG4gICAgdGhpcy5zbGljZXNMb2FkaW5nLmNsZWFyKCk7XG4gICAgdGhpcy5iZ0xvYWRpbmdaID0gbnVsbDtcbiAgICB0aGlzLmJnQXR0ZW1wdGVkLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
|