@jax-data-science/sci-image-visualizer 0.3.0 → 0.3.2

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.
@@ -1,6 +1,6 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { BehaviorSubject, Subject } from 'rxjs';
3
- import { Region, Rectangle, Polygon, MultiPolygon } from '../models/region';
3
+ import { Region, Rectangle, Polygon, MultiPolygon, hydrateBounds } from '../models/region';
4
4
  import { PlotUtilities } from '../plot.utilities';
5
5
  import { VisualizerStore } from './visualizer-store.service';
6
6
  import { defaultHandleOffsets } from '../models/bezier';
@@ -123,6 +123,10 @@ export class RegionStore {
123
123
  region.id = this.nextId++;
124
124
  if (region.name == null)
125
125
  region.name = `shape${region.id}`;
126
+ // JSON in, class instances out — everything downstream (the overlays'
127
+ // rendering, geometry de-dup, moveRegion, GeoJSON export) discriminates
128
+ // the bounds with `instanceof` (jit-ui#124).
129
+ region.bounds = hydrateBounds(region.bounds);
126
130
  }
127
131
  this.applyClassificationColors(regions);
128
132
  this.isRegionSavedOn = isRegionSaveOn;
@@ -275,6 +279,7 @@ export class RegionStore {
275
279
  if (region.name == null)
276
280
  region.name = `shape${region.id}`;
277
281
  region.z = z;
282
+ region.bounds = hydrateBounds(region.bounds); // jit-ui#124
278
283
  }
279
284
  this.applyClassificationColors(regions);
280
285
  return regions.slice();
@@ -526,6 +531,7 @@ export class RegionStore {
526
531
  region.id = this.nextId++;
527
532
  if (region.name == null)
528
533
  region.name = `shape${region.id}`;
534
+ region.bounds = hydrateBounds(region.bounds); // jit-ui#124
529
535
  // A region drawn on a stack belongs to the slice currently displayed, so
530
536
  // it saves/reloads on that slice (jit-ui#93). No-op for single-plane images
531
537
  // (currentSliceZ stays 0).
@@ -1026,4 +1032,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1026
1032
  type: Injectable,
1027
1033
  args: [{ providedIn: 'root' }]
1028
1034
  }], ctorParameters: () => [{ type: i1.VisualizerStore }] });
1029
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFFbEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxNQUFNLE9BQU8sV0FBVzthQUVFLGVBQVUsR0FBRyxFQUFFLEFBQUwsQ0FBTTthQUNoQixxQkFBZ0IsR0FBRyxHQUFHLEFBQU4sQ0FBTztJQWtGL0MsWUFBb0IsS0FBc0I7UUFBdEIsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFoRjFDO2lDQUN5QjtRQUNqQixzQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUV4RCw0REFBNEQ7UUFDcEQsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUMvQixnRUFBZ0U7UUFDeEQsb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFFdkM7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUNLLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFDM0IsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQUNuQyw0RUFBNEU7UUFDcEUsa0JBQWEsR0FBRyxLQUFL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QUUsS0FBSyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sRUFBRSxHQUFJLENBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFJLENBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxNQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNuRSxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs4R0FqK0JVLFdBQVc7a0hBQVgsV0FBVyxjQURFLE1BQU07OzJGQUNuQixXQUFXO2tCQUR2QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiwgUmVjdGFuZ2xlLCBQb2x5Z29uLCBNdWx0aVBvbHlnb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFBsb3RVdGlsaXRpZXMgfSBmcm9tICcuLi9wbG90LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBkZWZhdWx0SGFuZGxlT2Zmc2V0cyB9IGZyb20gJy4uL21vZGVscy9iZXppZXInO1xuaW1wb3J0IHsgSVJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRBcGkgfSBmcm9tICcuLi9jb250cmFjdHMvcmVnaW9uLXN0b3JlLmNvbnRyYWN0JztcbmltcG9ydCB7IGZpbmRQcmVzZXQsIGZhbGxiYWNrQ29sb3JGb3IgfSBmcm9tICcuL2NsYXNzLWNvbG9yLnV0aWwnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCByZWdpb24gc3RvcmUg4oCUIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciByZWdpb24gc3RhdGUuXG4gKlxuICogSG9sZHMgdGhlIG5ldXRyYWwge0BsaW5rIFJlZ2lvbn0gbW9kZWwgKG5ldmVyIGEgYmFja2VuZCdzIG93biBzaGFwZVxuICogcmVwcmVzZW50YXRpb24pLCBrZXllZCBwZXIgaW1hZ2Ugc28gcmVnaW9ucyBwZXJzaXN0IGFzIHRoZSB1c2VyIHN3aXRjaGVzXG4gKiBmaWxlcyBhbmQgc3Vydml2ZSBhIFBsb3RseeKHhE9wZW5TZWFkcmFnb24gYmFja2VuZCBzd2l0Y2ggKGJvdGggYmFja2VuZHMgcmVhZFxuICogYW5kIHdyaXRlICp0aGlzKiBzdG9yZSwgc28gbm8gbWlncmF0aW9uIGlzIG5lZWRlZCkuIEJhY2tlbmRzIG93biAqcmVuZGVyaW5nKlxuICogYW5kIHJlYWN0IHRvIHtAbGluayBnZXRSZWdpb25VcGRhdGVFdmVudH07IHRoaXMgc2VydmljZSBvd25zICpzdGF0ZSogYW5kIHRoZVxuICogZWRpdGluZyBvcGVyYXRpb25zLlxuICpcbiAqIEltcGxlbWVudHM6XG4gKiAgLSB7QGxpbmsgSVJlZ2lvblN0b3JlfSDigJQgdGhlIGNyb3NzLWJhY2tlbmQgQ1JVRC9zZWxlY3Rpb24vY29sb3VyIGNvbnRyYWN0XG4gKiAgICBldmVyeSBjb25zdW1lciAoUmVnaW9uIEVkaXRvciwgc2VnbWVudGF0aW9uLCBldGMuKSBhbHJlYWR5IHVzZXMuXG4gKiAgLSB7QGxpbmsgSVJlZ2lvbkVkaXRBcGl9IOKAlCBSZWdpb24tbmF0aXZlIGdlb21ldHJ5IGVkaXRzIChtb3ZlL3Jlc2l6ZSwgYW5kXG4gKiAgICBhZGQvZGVsZXRlL21vdmUgdmVydGV4KSB0aGUgT1NEIG92ZXJsYXkgZHJpdmVzLlxuICpcbiAqIENsYXNzaWZpY2F0aW9uIGNvbG91cnMgbGl2ZSBpbiB7QGxpbmsgVmlzdWFsaXplclN0b3JlfSAoc2hhcmVkIGJ5IGJvdGhcbiAqIGJhY2tlbmRzKTsgR2VvSlNPTiBpbXBvcnQvZXhwb3J0IGFuZCB0aGUgY2xvc2VkLXBvbHlnb24gcHJvamVjdGlvbiByZXVzZSB0aGVcbiAqIG5ldXRyYWwge0BsaW5rIFBsb3RVdGlsaXRpZXN9IGhlbHBlcnMuIEFsbCBjb29yZGluYXRlcyBhcmUgaW1hZ2UgcGl4ZWxzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlZ2lvblN0b3JlIGltcGxlbWVudHMgSVJlZ2lvblN0b3JlLCBJUmVnaW9uRWRpdEFwaSB7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVU5ET19MSU1JVCA9IDEwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBVTkRPX0NPQUxFU0NFX01TID0gMjUwO1xuXG4gIC8qKiBQZXItaW1hZ2UgcmVnaW9uIGNhY2hlLiBgcmVnaW9uc2AgaXMgYWx3YXlzIGEgc25hcHNob3Qgb2YgdGhlIGVudHJ5IGZvclxuICAgKiAgYGN1cnJlbnRJbWFnZUtleWAuICovXG4gIHByaXZhdGUgcmVnaW9uc0J5SW1hZ2VLZXkgPSBuZXcgTWFwPHN0cmluZywgUmVnaW9uW10+KCk7XG4gIHByaXZhdGUgY3VycmVudEltYWdlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgY3VycmVudCBpbWFnZSdzIHJlZ2lvbnMg4oCUIHRoZSBsaXZlLCBlZGl0ZWQgYXJyYXkuICovXG4gIHByaXZhdGUgcmVnaW9uczogUmVnaW9uW10gPSBbXTtcbiAgLyoqIExhc3Qgc2F2ZWQgc25hcHNob3QsIHJlc3RvcmFibGUgdmlhIHBsb3RQcmV2aW91c1NoYXBlcygpLiAqL1xuICBwcml2YXRlIHByZXZpb3VzUmVnaW9uczogUmVnaW9uW10gPSBbXTtcblxuICAvKipcbiAgICogVW5kby9yZWRvIGhpc3RvcnkgKGppdC11aSM4NSk6IHVwIHRvIHtAbGluayBVTkRPX0xJTUlUfSBzbmFwc2hvdHMgb2YgdGhlXG4gICAqIHJlZ2lvbiBzZXQsIGVhY2ggYSBkZWVwIGNsb25lIGNhcHR1cmVkIGltbWVkaWF0ZWx5ICpiZWZvcmUqIGFcbiAgICogcmVnaW9uLWVkaXRpbmcgYWN0aW9uLiB7QGxpbmsgdW5kb30gcG9wcyB0aGUgbmV3ZXN0IG9mZiBgdW5kb1N0YWNrYCwgcHVzaGVzXG4gICAqIHRoZSBjdXJyZW50IHN0YXRlIG9udG8gYHJlZG9TdGFja2AsIGFuZCByZXN0b3JlcyBpdCDigJQgc28gaXQgY2FuIGJlIGludm9rZWRcbiAgICogdXAgdG8ge0BsaW5rIFVORE9fTElNSVR9IHRpbWVzIGluIGEgcm93LiB7QGxpbmsgcmVkb30gaXMgdGhlIG1pcnJvci4gQW55IG5ld1xuICAgKiByZWdpb24gYWN0aW9uIGNsZWFycyBgcmVkb1N0YWNrYCAodGhlIHJlZG8gZnV0dXJlIGlzIG5vIGxvbmdlciByZWFjaGFibGUpLlxuICAgKlxuICAgKiBBIGNvbnRpbnVvdXMgZ2VzdHVyZSAoYSB3YW5kL2JydXNoL3ZlcnRleCBkcmFnIGNvbW1pdHMgdG8gdGhlIHN0b3JlIG1hbnlcbiAgICogdGltZXMpIGlzIGNvYWxlc2NlZCBpbnRvIGEgc2luZ2xlIGVudHJ5OiB0aGUgZmlyc3QgY29tbWl0IG9mIGEgYnVyc3RcbiAgICogY2FwdHVyZXMgdGhlIHByZS1idXJzdCBzdGF0ZSBhbmQgZXZlcnkgY29tbWl0IHdpdGhpblxuICAgKiB7QGxpbmsgVU5ET19DT0FMRVNDRV9NU30gb2YgdGhlIHByZXZpb3VzIG9uZSBpcyBmb2xkZWQgaW50byBpdC4gSGlzdG9yeVxuICAgKiBuZXZlciBjcm9zc2VzIGFuIGltYWdlIGxvYWQvc3dpdGNoIOKAlCB7QGxpbmsgcmVzZXRVbmRvSGlzdG9yeX0gY2xlYXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSB1bmRvU3RhY2s6IFJlZ2lvbltdW10gPSBbXTtcbiAgcHJpdmF0ZSByZWRvU3RhY2s6IFJlZ2lvbltdW10gPSBbXTtcbiAgLyoqIFRydWUgd2hpbGUgYSBjb2FsZXNjaW5nIGJ1cnN0IGlzIG9wZW4gKGZ1cnRoZXIgY29tbWl0cyBmb2xkIGludG8gaXQpLiAqL1xuICBwcml2YXRlIHVuZG9CdXJzdE9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB1bmRvQnVyc3RUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hpbGUgcmVzdG9yaW5nIGEgc25hcHNob3QsIHNvIHRoZSByZXN0b3JlIHJlY29yZHMgbm8gbmV3IGhpc3RvcnkuICovXG4gIHByaXZhdGUgcmVzdG9yaW5nVW5kbyA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNhblVuZG8kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuUmVkbyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAvKiogTW9ub3RvbmljIGlkIHNvdXJjZSDigJQgaWRzIG5ldmVyIHJlcGVhdCB3aXRoaW4gdGhlIHNlcnZpY2UgbGlmZXRpbWUsIHNvXG4gICAqICBzZWxlY3Rpb24gc3RheXMgY29ycmVjdCBhY3Jvc3MgZGVsZXRlL2FkZCBjeWNsZXMgZXZlbiB3aGVuIG5hbWVzIGNvbGxpZGUuICovXG4gIHByaXZhdGUgbmV4dElkID0gMTtcblxuICBwcml2YXRlIHNob3dTaGFwZUxhYmVsID0gZmFsc2U7XG4gIHByaXZhdGUgc2hhcGVDb2xvciA9ICcjMDBGRkZGJztcbiAgcHJpdmF0ZSBmaWxsQ29sb3IgPSAnI2ZmMDBmZic7XG4gIHByaXZhdGUgaXNSZWdpb25TYXZlZE9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogUGVyLXNsaWNlIHJlZ2lvbiBzdXBwb3J0IGZvciB6LXN0YWNrcyAoaml0LXVpIzkzKS4gV2hpbGUge0BsaW5rIHN0YWNrTW9kZX1cbiAgICogaXMgb24gKGEgei1zdGFjayBpcyBsb2FkZWQpLCB0aGUgbGl2ZSBgcmVnaW9uc2AgYXJyYXkgYWx3YXlzIGhvbGRzIE9ORVxuICAgKiBzbGljZSDigJQgdGhlIHtAbGluayBjdXJyZW50U2xpY2VafSBzbGljZSDigJQgc28gdGhlIG9uLWNhbnZhcyBvdmVybGF5cywgdGhlXG4gICAqIHNlbGVjdGlvbiBwcm9qZWN0aW9uLCBhbmQgdGhlIFJlZ2lvbnMgdGFibGUga2VlcCB3b3JraW5nIHVuY2hhbmdlZFxuICAgKiAodGhleSBhbGwgcmVhZCB7QGxpbmsgZ2V0UmVnaW9uc30pLiBUaGUgb3RoZXIgc2xpY2VzIGxpdmUgaW5cbiAgICoge0BsaW5rIHJlZ2lvbnNCeVNsaWNlfTsge0BsaW5rIHNldERpc3BsYXlTbGljZX0gc3dhcHMgdGhlIGxpdmUgc2V0IG9uIHNjcnViXG4gICAqIGFuZCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfSBmbGF0dGVucyBldmVyeSBzbGljZSAoZWFjaCB0YWdnZWQgd2l0aCBpdHNcbiAgICogemVyby1iYXNlZCB7QGxpbmsgUmVnaW9uLnp9KSBmb3Igc2F2ZS9leHBvcnQuIE9mZiBieSBkZWZhdWx0IChzdGFja01vZGVcbiAgICogZmFsc2UsIHogMCksIHNvIHNpbmdsZS1wbGFuZSBpbWFnZXMgYXJlIGNvbXBsZXRlbHkgdW5hZmZlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVnaW9uc0J5U2xpY2UgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gIHByaXZhdGUgc3RhY2tNb2RlID0gZmFsc2U7XG4gIHByaXZhdGUgY3VycmVudFNsaWNlWiA9IDA7XG4gIC8qKiBIb3cgYSBzdGFjaydzIHJlZ2lvbnMgcm91bmQtdHJpcCB0byBkaXNrIChqaXQtdWkjOTMpOiBgY29tYmluZWRgIHdyaXRlcyBvbmVcbiAgICogIHotaW5kZXhlZCBnZW9qc29uIChzaW5nbGUtZmlsZSB6LXN0YWNrLCBRdVBhdGggc2NoZW1hKTsgYHBlci1zbGljZS1maWxlYFxuICAgKiAgd3JpdGVzIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlIChhIGZvbGRlciBvZiBudW1iZXJlZCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHN0YWNrU2F2ZUxheW91dDogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScgPSAnY29tYmluZWQnO1xuICAvKiogU2xpY2VzIHRoYXQgd2VyZSBsb2FkZWQgd2l0aCByZWdpb25zIChqaXQtdWkjOTMpLiBBIHBlci1zbGljZS1maWxlIHNhdmVcbiAgICogIHJlLXdyaXRlcyB0aGVzZSBldmVuIHdoZW4gbm93IGVtcHR5LCBzbyBjbGVhcmluZyBhIHNsaWNlJ3MgcmVnaW9ucyBhbmRcbiAgICogIHNhdmluZyByZW1vdmVzIGl0cyBwcmV2aW91c2x5LXNhdmVkIGdlb2pzb24gKHdyaXRlcyBhbiBlbXB0eSBvbmUpLiAqL1xuICBwcml2YXRlIHN0YWNrSW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLyoqIFNlbGVjdGlvbiBpcyB0cmFja2VkIGJ5IHJlZ2lvbiAqaWQqIGludGVybmFsbHkgKHN0YWJsZSBhY3Jvc3MgZWRpdHMpIGFuZFxuICAgKiAgcHJvamVjdGVkIHRvIGFycmF5IGluZGljZXMgb24gdGhlIElSZWdpb25TdG9yZSBib3VuZGFyeS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZElkczogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RlZEluZGljZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXJbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblVwZGF0ZSQgPSBuZXcgU3ViamVjdDxSZWdpb25bXT4oKTtcbiAgLyoqIE5vbi1jb2FsZXNjZWQgc2libGluZyBvZiByZWdpb25VcGRhdGUkOiBmaXJlcyBvbiBldmVyeSBjaGFuZ2UgZXZlbiBkdXJpbmcgYVxuICAgKiAgYmF0Y2hlZCBkcmFnLCBzbyBsaXZlIGNvbnN1bWVycyAoaW50ZW5zaXR5IGluc2V0KSB1cGRhdGUgcGVyIGZyYW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbkxpdmVFZGl0JCA9IG5ldyBTdWJqZWN0PFJlZ2lvbltdPigpO1xuXG4gIC8qKiBFbWl0IGNvYWxlc2NpbmcgZm9yIGxpdmUgZHJhZ3MgKHNlZSBJUmVnaW9uRWRpdEFwaS5iZWdpbkJhdGNoKS4gKi9cbiAgcHJpdmF0ZSBiYXRjaERlcHRoID0gMDtcbiAgcHJpdmF0ZSBwZW5kaW5nRW1pdCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGxvdFV0aWxpdGllcyA9IG5ldyBQbG90VXRpbGl0aWVzKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlKSB7fVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgKG9yLCB3aXRoIGBhcHBlbmRgLCBhZGQgdG8pIHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9ucy4gTWludHMgaWRzXG4gICAqIGFuZCBkZWZhdWx0IG5hbWVzLCBhcHBsaWVzIHN0b3JlZCBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzLCBhbmQgZW1pdHMuIFdoZW5cbiAgICogYGlzUmVnaW9uU2F2ZU9uYCBpcyBmYWxzZSB0aGUgcmVnaW9ucyBhcmUgc2hvd24gdHJhbnNpZW50bHkgKGVtaXR0ZWQpIGJ1dFxuICAgKiBub3Qgc3RvcmVkIOKAlCBtaXJyb3JzIHRoZSBwcmV2aW91cyBQbG90bHkgYmVoYXZpb3VyLlxuICAgKi9cbiAgc2V0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbiwgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgICAgICAgICAgIGZpbGxDb2xvcj86IHN0cmluZywgYXBwZW5kOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoc2hvd1JlZ2lvbkxhYmVsID09PSB1bmRlZmluZWQpIHNob3dSZWdpb25MYWJlbCA9IHRoaXMuc2hvd1NoYXBlTGFiZWw7XG4gICAgaWYgKGlzUmVnaW9uU2F2ZU9uID09PSB1bmRlZmluZWQpIGlzUmVnaW9uU2F2ZU9uID0gdGhpcy5pc1JlZ2lvblNhdmVkT247XG4gICAgaWYgKGZpbGxDb2xvciA9PT0gdW5kZWZpbmVkKSBmaWxsQ29sb3IgPSB0aGlzLmZpbGxDb2xvcjtcblxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHJlZ2lvbnMpIHtcbiAgICAgIGlmIChyZWdpb24uaWQgPT0gbnVsbCkgcmVnaW9uLmlkID0gdGhpcy5uZXh0SWQrKztcbiAgICAgIGlmIChyZWdpb24ubmFtZSA9PSBudWxsKSByZWdpb24ubmFtZSA9IGBzaGFwZSR7cmVnaW9uLmlkfWA7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlDbGFzc2lmaWNhdGlvbkNvbG9ycyhyZWdpb25zKTtcblxuICAgIHRoaXMuaXNSZWdpb25TYXZlZE9uID0gaXNSZWdpb25TYXZlT247XG4gICAgaWYgKGlzUmVnaW9uU2F2ZU9uKSB7XG4gICAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgICAgdGhpcy5zaG93U2hhcGVMYWJlbCA9IHNob3dSZWdpb25MYWJlbDtcbiAgICAgIHRoaXMuZmlsbENvbG9yID0gZmlsbENvbG9yO1xuICAgICAgaWYgKGFwcGVuZCkge1xuICAgICAgICAvLyBSZWplY3QgYnkgaWQgY29sbGlzaW9uIChhbHJlYWR5IHRyYWNrZWQpIG9yIGdlb21ldHJ5IGVxdWFsaXR5IChzYW1lXG4gICAgICAgIC8vIGNvb3JkaW5hdGVzKSDigJQgdGhlIGZpbmQgYnV0dG9uIGNhbiBwdXNoIHRoZSBzYW1lIHJlZ2lvbiByZXBlYXRlZGx5LlxuICAgICAgICBjb25zdCBhZGRlZCA9IHJlZ2lvbnMuZmlsdGVyKHIgPT5cbiAgICAgICAgICAhdGhpcy5yZWdpb25zLnNvbWUoZXhpc3RpbmcgPT4gZXhpc3RpbmcuaWQgPT09IHIuaWQgfHwgdGhpcy5yZWdpb25zRXF1YWwoZXhpc3RpbmcsIHIpKSk7XG4gICAgICAgIHRoaXMucmVnaW9ucyA9IHRoaXMucmVnaW9ucy5jb25jYXQoYWRkZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWdpb25zID0gcmVnaW9ucy5zbGljZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5lbWl0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYW5zaWVudCBkaXNwbGF5IG9ubHkg4oCUIGRvbid0IHRvdWNoIHN0b3JlZCBzdGF0ZS5cbiAgICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHJlZ2lvbnMuc2xpY2UoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBjYW5vbmljYWwgYWNjZXNzb3I6IGN1cnJlbnQgaW1hZ2UncyByZWdpb25zIChsaXZlIGluc3RhbmNlcykuICovXG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnMuc2xpY2UoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2UgcmVnaW9ucyBmb3Igei1zdGFja3MgKGppdC11aSM5Mykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRydWUgd2hpbGUgYSB6LXN0YWNrIGlzIGxvYWRlZCBhbmQgdGhlIHN0b3JlIGhvbGRzIHJlZ2lvbnMgcGVyIHNsaWNlLiAqL1xuICBpc1N0YWNrTW9kZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3RhY2tNb2RlOyB9XG5cbiAgLyoqIFRoZSBjdXJyZW50IGRpc3BsYXkgc2xpY2UgKHplcm8tYmFzZWQpLiAqL1xuICBnZXREaXNwbGF5U2xpY2UoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY3VycmVudFNsaWNlWjsgfVxuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgc3RhY2sgcGVyc2lzdHMgdG8gZGlzayAoaml0LXVpIzkzKTogYGNvbWJpbmVkYCA9IG9uZVxuICAgKiAgei1pbmRleGVkIGdlb2pzb24gKHNpbmdsZS1maWxlIHotc3RhY2spOyBgcGVyLXNsaWNlLWZpbGVgID0gb25lIGdlb2pzb24gcGVyXG4gICAqICBzbGljZS1maWxlIChmb2xkZXIgc3RhY2spLiBNZWFuaW5nbGVzcyBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIGdldFN0YWNrU2F2ZUxheW91dCgpOiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyB7IHJldHVybiB0aGlzLnN0YWNrU2F2ZUxheW91dDsgfVxuXG4gIC8qKlxuICAgKiBFbnRlciBwZXItc2xpY2Ugc3RhY2sgbW9kZS4gYHNsaWNlc2AgbWFwcyBlYWNoIHplcm8tYmFzZWQgc2xpY2UgaW5kZXggdG9cbiAgICogdGhlIHJlZ2lvbnMgaW1wb3J0ZWQgZm9yIHRoYXQgc2xpY2U7IHRoZSBzdG9yZSBtYWtlcyBgaW5pdGlhbFpgJ3Mgc2xpY2UgdGhlXG4gICAqIGxpdmUgc2V0LCBzbyB0aGUgb3ZlcmxheXMgLyBzZWxlY3Rpb24gLyBSZWdpb25zIHRhYmxlIGFyZSB1bmNoYW5nZWQgKHRoZXlcbiAgICogc3RpbGwgcmVhZCB7QGxpbmsgZ2V0UmVnaW9uc30pLiBGcmVzaGx5LWNyZWF0ZWQgcmVnaW9ucyBhcmUgdGFnZ2VkIHdpdGggdGhlXG4gICAqIGN1cnJlbnQgc2xpY2Ugc28gdGhleSBwZXJzaXN0IG9uIGl0LCBhbmQge0BsaW5rIGdldFNsaWNlUmVnaW9uc30gcmV0dXJuc1xuICAgKiBldmVyeSBzbGljZSBmb3Igc2F2ZS9leHBvcnQuIElkcy9uYW1lcy9jbGFzc2lmaWNhdGlvbiBjb2xvdXJzIGFyZSBtaW50ZWRcbiAgICogZXhhY3RseSBhcyB7QGxpbmsgc2V0UmVnaW9uc30gZG9lcy5cbiAgICovXG4gIGVudGVyU3RhY2tNb2RlKHNsaWNlczogTWFwPG51bWJlciwgUmVnaW9uW10+LCBpbml0aWFsWiA9IDAsXG4gICAgICAgICAgICAgICAgIHNhdmVMYXlvdXQ6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnID0gJ2NvbWJpbmVkJyk6IHZvaWQge1xuICAgIHRoaXMuc3RhY2tNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLnN0YWNrU2F2ZUxheW91dCA9IHNhdmVMYXlvdXQ7XG4gICAgdGhpcy5jdXJyZW50U2xpY2VaID0gaW5pdGlhbFogfHwgMDtcbiAgICB0aGlzLnJlZ2lvbnNCeVNsaWNlID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIHRoaXMuc3RhY2tJbml0aWFsTm9uRW1wdHkgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IFt6LCByZWdzXSBvZiBzbGljZXMpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZVNsaWNlKHJlZ3MgfHwgW10sIHopO1xuICAgICAgdGhpcy5yZWdpb25zQnlTbGljZS5zZXQoeiwgbm9ybWFsaXplZCk7XG4gICAgICBpZiAobm9ybWFsaXplZC5sZW5ndGgpIHRoaXMuc3RhY2tJbml0aWFsTm9uRW1wdHkuYWRkKHopO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lvbnMgPSAodGhpcy5yZWdpb25zQnlTbGljZS5nZXQodGhpcy5jdXJyZW50U2xpY2VaKSA/PyBbXSkuc2xpY2UoKTtcbiAgICB0aGlzLnByZXZpb3VzUmVnaW9ucyA9IHRoaXMucmVnaW9ucy5zbGljZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRJZHMgPSBbXTtcbiAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgIHRoaXMucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG5cbiAgLyoqIExlYXZlIHN0YWNrIG1vZGUgKHNpbmdsZS1wbGFuZSBpbWFnZSwgb3IgdGhlIHN0YWNrIHdhcyBjbG9zZWQpLiAqL1xuICBleGl0U3RhY2tNb2RlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGFja01vZGUpIHJldHVybjtcbiAgICB0aGlzLnN0YWNrTW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudFNsaWNlWiA9IDA7XG4gICAgdGhpcy5yZWdpb25zQnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICB0aGlzLnN0YWNrSW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBhIGRpZmZlcmVudCBzbGljZTogY2FwdHVyZSB0aGUgY3VycmVudCBzbGljZSdzIChwb3NzaWJseSBlZGl0ZWQpXG4gICAqIHJlZ2lvbnMgYmFjayBpbnRvIHRoZSBwZXItc2xpY2Ugc3RvcmUsIHRoZW4gbG9hZCB0aGUgdGFyZ2V0IHNsaWNlJ3MgcmVnaW9uc1xuICAgKiBhcyB0aGUgbGl2ZSBzZXQgYW5kIGVtaXQuIFVuZG8gbmV2ZXIgY3Jvc3NlcyBhIHNsaWNlLiBPdXRzaWRlIHN0YWNrIG1vZGVcbiAgICogdGhpcyBvbmx5IHJlY29yZHMgdGhlIHJlcXVlc3RlZCBzbGljZSBpbmRleCAoYSBuby1vcCBvdGhlcndpc2U6IHNpbmdsZS1wbGFuZVxuICAgKiByZWdpb25zIHN0YXkgb24gdGhlIGRlZmF1bHQgcGxhbmUg4oCUIGFkZFJlZ2lvbiB0YWdzIFJlZ2lvbi56IG9ubHkgaW4gc3RhY2tcbiAgICogbW9kZSwgc28gdGhlIHJlY29yZGVkIGluZGV4IGlzIHVudXNlZCB1bnRpbCBhIHN0YWNrIGlzIGVudGVyZWQpLiAoaml0LXVpIzkzKVxuICAgKi9cbiAgc2V0RGlzcGxheVNsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB6IHx8IDA7XG4gICAgaWYgKCF0aGlzLnN0YWNrTW9kZSkgeyB0aGlzLmN1cnJlbnRTbGljZVogPSBuZXh0OyByZXR1cm47IH1cbiAgICBpZiAodGhpcy5jdXJyZW50U2xpY2VaID09PSBuZXh0KSByZXR1cm47XG4gICAgdGhpcy5yZWdpb25zQnlTbGljZS5zZXQodGhpcy5jdXJyZW50U2xpY2VaLCB0aGlzLnJlZ2lvbnMuc2xpY2UoKSk7XG4gICAgdGhpcy5jdXJyZW50U2xpY2VaID0gbmV4dDtcbiAgICB0aGlzLnJlZ2lvbnMgPSAodGhpcy5yZWdpb25zQnlTbGljZS5nZXQobmV4dCkgPz8gW10pLnNsaWNlKCk7XG4gICAgdGhpcy5wcmV2aW91c1JlZ2lvbnMgPSB0aGlzLnJlZ2lvbnMuc2xpY2UoKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gW107XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVyeSBzbGljZSdzIHJlZ2lvbnMgZm9yIHNhdmUvZXhwb3J0LCBlYWNoIHRhZ2dlZCB3aXRoIGl0cyB6ZXJvLWJhc2VkXG4gICAqIHNsaWNlIGluZGV4IGluIHtAbGluayBSZWdpb24uen0uIENhcHR1cmVzIHRoZSBjdXJyZW50IHNsaWNlJ3MgbGl2ZSBlZGl0c1xuICAgKiBmaXJzdC4gUmV0dXJucyB0aGUgZmxhdCBzaW5nbGUtcGxhbmUgc2V0IHdoZW4gbm90IGluIHN0YWNrIG1vZGUuIChqaXQtdWkjOTMpXG4gICAqL1xuICBnZXRTbGljZVJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIGlmICghdGhpcy5zdGFja01vZGUpIHJldHVybiB0aGlzLnJlZ2lvbnMuc2xpY2UoKTtcbiAgICB0aGlzLnJlZ2lvbnNCeVNsaWNlLnNldCh0aGlzLmN1cnJlbnRTbGljZVosIHRoaXMucmVnaW9ucy5zbGljZSgpKTtcbiAgICBjb25zdCBvdXQ6IFJlZ2lvbltdID0gW107XG4gICAgY29uc3QgenMgPSBBcnJheS5mcm9tKHRoaXMucmVnaW9uc0J5U2xpY2Uua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgZm9yIChjb25zdCB6IG9mIHpzKSB7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWdpb25zQnlTbGljZS5nZXQoeikgYXMgUmVnaW9uW10pIHtcbiAgICAgICAgci56ID0gejtcbiAgICAgICAgb3V0LnB1c2gocik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBldmVyeVxuICAgKiBzbGljZSB0aGF0IGN1cnJlbnRseSBoYXMgcmVnaW9ucywgUExVUyBzbGljZXMgdGhhdCB3ZXJlIGxvYWRlZCBub24tZW1wdHkgYnV0XG4gICAqIGFyZSBub3cgZW1wdHkgKHNvIHRoZWlyIGZpbGUgaXMgcmUtd3JpdHRlbiBlbXB0eSwgY2xlYXJpbmcgYSBzbGljZSB3aG9zZVxuICAgKiByZWdpb25zIHRoZSB1c2VyIGRlbGV0ZWQpLiBFYWNoIHJldHVybmVkIHJlZ2lvbiBpcyB0YWdnZWQgd2l0aCBpdHMgeiwgYW5kXG4gICAqIHRoZSBjdXJyZW50IGxpdmUgc2xpY2UgaXMgY2FwdHVyZWQgZmlyc3QuIEVtcHR5IG91dHNpZGUgc3RhY2sgbW9kZS5cbiAgICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICBpZiAoIXRoaXMuc3RhY2tNb2RlKSByZXR1cm4gb3V0O1xuICAgIHRoaXMucmVnaW9uc0J5U2xpY2Uuc2V0KHRoaXMuY3VycmVudFNsaWNlWiwgdGhpcy5yZWdpb25zLnNsaWNlKCkpO1xuICAgIGNvbnN0IHpzID0gbmV3IFNldDxudW1iZXI+KHRoaXMuc3RhY2tJbml0aWFsTm9uRW1wdHkpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMucmVnaW9uc0J5U2xpY2UpIGlmIChyZWdzLmxlbmd0aCkgenMuYWRkKHopO1xuICAgIGZvciAoY29uc3QgeiBvZiBBcnJheS5mcm9tKHpzKS5zb3J0KChhLCBiKSA9PiBhIC0gYikpIHtcbiAgICAgIGNvbnN0IHJlZ3MgPSAodGhpcy5yZWdpb25zQnlTbGljZS5nZXQoeikgPz8gW10pLm1hcCgocikgPT4geyByLnogPSB6OyByZXR1cm4gcjsgfSk7XG4gICAgICBvdXQuc2V0KHosIHJlZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIE1pbnQgaWRzL25hbWVzICsgYXBwbHkgY2xhc3NpZmljYXRpb24gY29sb3VycyArIHRhZyB0aGUgc2xpY2UgaW5kZXgsIGFzXG4gICAqICB7QGxpbmsgc2V0UmVnaW9uc30gZG9lcywgZm9yIHJlZ2lvbnMgZW50ZXJpbmcgdGhlIHBlci1zbGljZSBzdG9yZS4gKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVTbGljZShyZWdpb25zOiBSZWdpb25bXSwgejogbnVtYmVyKTogUmVnaW9uW10ge1xuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHJlZ2lvbnMpIHtcbiAgICAgIGlmIChyZWdpb24uaWQgPT0gbnVsbCkgcmVnaW9uLmlkID0gdGhpcy5uZXh0SWQrKztcbiAgICAgIGlmIChyZWdpb24ubmFtZSA9PSBudWxsKSByZWdpb24ubmFtZSA9IGBzaGFwZSR7cmVnaW9uLmlkfWA7XG4gICAgICByZWdpb24ueiA9IHo7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlDbGFzc2lmaWNhdGlvbkNvbG9ycyhyZWdpb25zKTtcbiAgICByZXR1cm4gcmVnaW9ucy5zbGljZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlZCBwb2x5Z29ucyBwcm9qZWN0ZWQgZm9yIGltYWdlLXByb2Nlc3NpbmcgY29uc3VtZXJzIChzZWdtZW50YXRpb24sXG4gICAqIHRyYWNlIGJ1aWxkZXJzKS4gT3BlbiBwb2x5bGluZXMgYXJlIGFubm90YXRpb24tb25seSBhbmQgZXhjbHVkZWQuIFJldXNlc1xuICAgKiB0aGUgbmV1dHJhbCBQbG90VXRpbGl0aWVzIHByb2plY3Rpb24gc28gb3V0cHV0IG1hdGNoZXMgdGhlIHByZXZpb3VzIHBhdGguXG4gICAqL1xuICBnZXRSZWdpb25Qb2x5Z29ucygpOiBhbnlbXSB7XG4gICAgY29uc3QgcmV0OiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHRoaXMucmVnaW9ucykge1xuICAgICAgY29uc3QgcG9seTogYW55ID0gdGhpcy5wbG90VXRpbGl0aWVzLmdldFBvbHlnb24oeyAuLi5yZWdpb24uZ2V0U2hhcGUodGhpcy5zaG93U2hhcGVMYWJlbCkgfSk7XG4gICAgICBpZiAocG9seSA9PSBudWxsIHx8IHBvbHkuY2xvc2VkID09PSBmYWxzZSkgY29udGludWU7XG4gICAgICByZXQucHVzaChwb2x5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGdldFJlZ2lvblVwZGF0ZUV2ZW50KCk6IE9ic2VydmFibGU8YW55W10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25VcGRhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIExpdmUgKG5vbi1jb2FsZXNjZWQpIHJlZ2lvbi1jaGFuZ2Ugc3RyZWFtIOKAlCBmaXJlcyBwZXIgZnJhbWUgZHVyaW5nIGEgZHJhZy5cbiAgICogIFVzZWQgYnkgdGhlIGludGVuc2l0eS1wcm9maWxlIGluc2V0IHNvIGl0IHRyYWNrcyBsaW5lIFJPSXMgbGl2ZS4gKi9cbiAgZ2V0UmVnaW9uTGl2ZUVkaXQkKCk6IE9ic2VydmFibGU8UmVnaW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25MaXZlRWRpdCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlOiBzZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFNlbGVjdCByZWdpb25zIGJ5IGFycmF5IGluZGV4IChvciBbXSB0byBjbGVhcikuIFN0b3JlZCBpbnRlcm5hbGx5IGJ5IGlkXG4gICAqICBzbyB0aGUgc2VsZWN0aW9uIHN1cnZpdmVzIHN1YnNlcXVlbnQgZWRpdHMvcmVvcmRlcnMuICovXG4gIHNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcyB8fCBbXSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaSkgfHwgaSA8IDAgfHwgaSA+PSB0aGlzLnJlZ2lvbnMubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5yZWdpb25zW2ldLmlkO1xuICAgICAgaWYgKCFzZWVuLmhhcyhpZCkpIHsgc2Vlbi5hZGQoaWQpOyBpZHMucHVzaChpZCk7IH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IGlkcztcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgYSBzaW5nbGUgcmVnaW9uIGJ5IGlkZW50aXR5IChpZCkuIEJhY2tlbmRzIGNhbGwgdGhpcyBmcm9tIHRoZWlyXG4gICAqICBgc2VsZWN0UmVnaW9uKClgOyB0aGUgT1NEIG92ZXJsYXkgKyByZWdpb24gZWRpdG9yIGhpZ2hsaWdodCBvZmYgdGhlXG4gICAqICByZXN1bHRpbmcgc2VsZWN0aW9uIGVtaXQuIE5vLW9wIGlmIHRoZSByZWdpb24gaXNuJ3QgaW4gdGhlIHN0b3JlLiAqL1xuICBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkIHtcbiAgICBpZiAocmVnaW9uPy5pZCA9PSBudWxsIHx8IHRoaXMuaW5kZXhPZklkKHJlZ2lvbi5pZCkgPCAwKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtyZWdpb24uaWRdO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluZGljZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFN5bmNocm9ub3VzIGN1cnJlbnQgc2VsZWN0aW9uIChhcnJheSBpbmRpY2VzKSDigJQgZm9yIGNhbGxlcnMgdGhhdCBuZWVkIHRvXG4gICAqICByZWFkIHRoZSBzZWxlY3Rpb24gd2l0aG91dCBzdWJzY3JpYmluZy4gKi9cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW5kaWNlcyQudmFsdWU7XG4gIH1cblxuICAvKiogRGVsZXRlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVnaW9ucyBhbmQgY2xlYXIgdGhlIHNlbGVjdGlvbi4gKi9cbiAgZGVsZXRlQWN0aXZlU2hhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRJZHMpO1xuICAgIHRoaXMucmVnaW9ucyA9IHRoaXMucmVnaW9ucy5maWx0ZXIociA9PiAhaWRzLmhhcyhyLmlkKSk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtdO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlOiBjb2xvdXJzIC8gbGFiZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFNob3dTaGFwZUxhYmVsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zaG93U2hhcGVMYWJlbDsgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnNoYXBlQ29sb3I7IH1cbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmZpbGxDb2xvcjsgfVxuXG4gIC8qKiBDb252ZW5pZW5jZSBzZXR0ZXJzIChub3Qgb24gdGhlIGNvbnRyYWN0KSBmb3IgdG9vbGJhciB3aXJpbmcuICovXG4gIHNldFNob3dTaGFwZUxhYmVsKHNob3c6IGJvb2xlYW4pOiB2b2lkIHsgdGhpcy5zaG93U2hhcGVMYWJlbCA9IHNob3c7IH1cbiAgc2V0U2hhcGVDb2xvcihjb2xvcjogc3RyaW5nKTogdm9pZCB7IHRoaXMuc2hhcGVDb2xvciA9IGNvbG9yOyB9XG4gIHNldEZpbGxDb2xvcihjb2xvcjogc3RyaW5nKTogdm9pZCB7IHRoaXMuZmlsbENvbG9yID0gY29sb3I7IH1cblxuICBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTsgfVxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5zdG9yZS5zZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsLCBjb2xvcik7IH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlOiBwcmV2aW91cy1zaGFwZXMgYnVmZmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZS1zaG93IHRoZSBsYXN0IHNhdmVkIHNuYXBzaG90ICh0cmFuc2llbnQg4oCUIGRvZXMgbm90IGFsdGVyIHN0b3JlZCBzdGF0ZSkuICovXG4gIHBsb3RQcmV2aW91c1NoYXBlcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZSQubmV4dCh0aGlzLnByZXZpb3VzUmVnaW9ucy5zbGljZSgpKTtcbiAgfVxuICBzZXRQcmV2aW91c1NoYXBlcyhzaGFwZXM6IGFueVtdKTogdm9pZCB7IHRoaXMucHJldmlvdXNSZWdpb25zID0gKHNoYXBlcyBhcyBSZWdpb25bXSkuc2xpY2UoKTsgfVxuICBnZXRQcmV2aW91c1NoYXBlcygpOiBhbnlbXSB7IHJldHVybiB0aGlzLnByZXZpb3VzUmVnaW9ucy5zbGljZSgpOyB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZTogdW5kbyAvIHJlZG8gKGppdC11aSM4NSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEVtaXRzIHdoZXRoZXIgYW4gdW5kbyBzdGVwIGlzIGN1cnJlbnRseSBhdmFpbGFibGUg4oCUIGRyaXZlcyB0aGUgdG9vbGJhclxuICAgKiAgVW5kbyBidXR0b24ncyBlbmFibGVkIHN0YXRlIChncmV5ZWQgb3V0IHdoZW4gZmFsc2UpLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jYW5VbmRvJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB3aGV0aGVyIGEgcmVkbyBzdGVwIGlzIGN1cnJlbnRseSBhdmFpbGFibGUg4oCUIGRyaXZlcyB0aGUgdG9vbGJhclxuICAgKiAgUmVkbyBidXR0b24ncyBlbmFibGVkIHN0YXRlLiAqL1xuICBnZXRDYW5SZWRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jYW5SZWRvJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5VbmRvJH0g4oCUIHRydWUgd2hlbiBhdCBsZWFzdCBvbmUgcmVnaW9uXG4gICAqICBhY3Rpb24gY2FuIGJlIHVuZG9uZS4gKi9cbiAgY2FuVW5kbygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51bmRvU3RhY2subGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5SZWRvJH0g4oCUIHRydWUgd2hlbiBhbiB1bmRvbmUgYWN0aW9uIGNhblxuICAgKiAgYmUgcmUtYXBwbGllZC4gKi9cbiAgY2FuUmVkbygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uLCByZXN0b3JpbmcgdGhlIHJlZ2lvbiBzZXQgdG8gaXRzIHN0YXRlXG4gICAqIGp1c3QgYmVmb3JlIHRoYXQgYWN0aW9uIGFuZCBwdXNoaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9udG8gdGhlIHJlZG8gc3RhY2suXG4gICAqIFVwIHRvIHtAbGluayBVTkRPX0xJTUlUfSBzdGVwcyBhcmUgcmV0YWluZWQsIHNvIHRoaXMgY2FuIGJlIGNhbGxlZCB1cCB0b1xuICAgKiB7QGxpbmsgVU5ET19MSU1JVH0gdGltZXMgaW4gYSByb3cgYmVmb3JlIHRoZSBoaXN0b3J5IGVtcHRpZXMuIE5vLW9wIHdoZW5cbiAgICogbm90aGluZyBpcyBsZWZ0IHRvIHVuZG8uXG4gICAqL1xuICB1bmRvKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVuZG9TdGFjay5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudW5kb1N0YWNrLnBvcCgpIGFzIFJlZ2lvbltdO1xuICAgIC8vIFN0YXNoIHRoZSBjdXJyZW50IChwb3N0LWFjdGlvbikgc3RhdGUgc28gcmVkbyBjYW4gcmUtYXBwbHkgaXQuXG4gICAgdGhpcy5yZWRvU3RhY2sucHVzaCh0aGlzLmNsb25lUmVnaW9ucyh0aGlzLnJlZ2lvbnMpKTtcbiAgICBpZiAodGhpcy5yZWRvU3RhY2subGVuZ3RoID4gUmVnaW9uU3RvcmUuVU5ET19MSU1JVCkgdGhpcy5yZWRvU3RhY2suc2hpZnQoKTtcbiAgICB0aGlzLnJlc3RvcmVTbmFwc2hvdChzbmFwc2hvdCk7XG4gIH1cblxuICAvKipcbiAgICogUmVkbyB0aGUgYWN0aW9uIG1vc3QgcmVjZW50bHkgdW5kb25lLCByZXN0b3JpbmcgdGhlIHJlZ2lvbiBzZXQgdG8gdGhlIHN0YXRlXG4gICAqIGl0IGhhZCBiZWZvcmUgdGhhdCB1bmRvIGFuZCBwdXNoaW5nIHRoZSBjdXJyZW50IHN0YXRlIGJhY2sgb250byB0aGUgdW5kb1xuICAgKiBzdGFjay4gTm8tb3Agd2hlbiB0aGVyZSdzIG5vdGhpbmcgdG8gcmVkbyAodGhlIHJlZG8gc3RhY2sgaXMgY2xlYXJlZCBieSBhbnlcbiAgICogZnJlc2ggcmVnaW9uIGFjdGlvbikuXG4gICAqL1xuICByZWRvKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZG9TdGFjay5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMucmVkb1N0YWNrLnBvcCgpIGFzIFJlZ2lvbltdO1xuICAgIHRoaXMudW5kb1N0YWNrLnB1c2godGhpcy5jbG9uZVJlZ2lvbnModGhpcy5yZWdpb25zKSk7XG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmxlbmd0aCA+IFJlZ2lvblN0b3JlLlVORE9fTElNSVQpIHRoaXMudW5kb1N0YWNrLnNoaWZ0KCk7XG4gICAgdGhpcy5yZXN0b3JlU25hcHNob3Qoc25hcHNob3QpO1xuICB9XG5cbiAgLyoqIERpc2NhcmQgdGhlIHVuZG8vcmVkbyBoaXN0b3J5IChlLmcuIG9uIGltYWdlIGxvYWQvc3dpdGNoIOKAlCBoaXN0b3J5IG5ldmVyXG4gICAqICBjcm9zc2VzIGltYWdlcykuICovXG4gIHJlc2V0VW5kb0hpc3RvcnkoKTogdm9pZCB7XG4gICAgdGhpcy51bmRvU3RhY2sgPSBbXTtcbiAgICB0aGlzLnJlZG9TdGFjayA9IFtdO1xuICAgIHRoaXMuY2xvc2VVbmRvQnVyc3QoKTtcbiAgICBpZiAodGhpcy5jYW5VbmRvJC52YWx1ZSkgdGhpcy5jYW5VbmRvJC5uZXh0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5jYW5SZWRvJC52YWx1ZSkgdGhpcy5jYW5SZWRvJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBNYWtlIGBzbmFwc2hvdGAgdGhlIGxpdmUgcmVnaW9uIHNldCBhbmQgbm90aWZ5IGJvdGggYmFja2VuZHMuIFNoYXJlZCBieVxuICAgKiAge0BsaW5rIHVuZG99IGFuZCB7QGxpbmsgcmVkb307IHRoZSBzbmFwc2hvdCBpcyBhbHJlYWR5IGEgZGV0YWNoZWQgZGVlcFxuICAgKiAgY2xvbmUsIHNvIGl0IGJlY29tZXMgdGhlIGxpdmUgYXJyYXkgZGlyZWN0bHkuICovXG4gIHByaXZhdGUgcmVzdG9yZVNuYXBzaG90KHNuYXBzaG90OiBSZWdpb25bXSk6IHZvaWQge1xuICAgIC8vIENsb3NlIGFueSBvcGVuIGNvYWxlc2NpbmcgYnVyc3Qgc28gdGhlIG5leHQgZWRpdCBzdGFydHMgYSBmcmVzaCBlbnRyeSxcbiAgICAvLyBhbmQgZmxhZyB0aGUgcmVzdG9yZSBzbyBpdCBkb2Vzbid0IHJlY29yZCBpdHNlbGYgYmFjayBpbnRvIHRoZSBoaXN0b3J5LlxuICAgIHRoaXMuY2xvc2VVbmRvQnVyc3QoKTtcbiAgICB0aGlzLnJlc3RvcmluZ1VuZG8gPSB0cnVlO1xuICAgIHRoaXMucmVnaW9ucyA9IHNuYXBzaG90O1xuICAgIC8vIERyb3AgYW55IHNlbGVjdGVkIGlkcyB0aGUgcmVzdG9yZWQgc2V0IG5vIGxvbmdlciBjb250YWlucy5cbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZElkcy5maWx0ZXIoaWQgPT4gdGhpcy5pbmRleE9mSWQoaWQpID49IDApO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5yZXN0b3JpbmdVbmRvID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0VW5kb1N0YXRlKCk7XG4gICAgLy8gTm90aWZ5IHRoZSBsaXZlICsgY29hbGVzY2VkIHN0cmVhbXMgc28gd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuXG4gICAgLy8gcmUtcmVuZGVycyBmcm9tIHRoZSByZXN0b3JlZCBzdG9yZSBzdGF0ZS5cbiAgICB0aGlzLnJlZ2lvbkxpdmVFZGl0JC5uZXh0KHRoaXMucmVnaW9ucy5zbGljZSgpKTtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZSQubmV4dCh0aGlzLmdldFJlZ2lvbnMoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZSB0aGUgcHJlLWFjdGlvbiByZWdpb24gc2V0IGludG8gdGhlIGJvdW5kZWQgdW5kbyBoaXN0b3J5LiBDYWxsZWQgYXRcbiAgICogdGhlIHRvcCBvZiBldmVyeSBtdXRhdGluZyBvcGVyYXRpb24sICpiZWZvcmUqIGl0IGNoYW5nZXMgYHJlZ2lvbnNgLCBzbyB0aGVcbiAgICogc25hcHNob3QgaXMgdGhlIHN0YXRlIHRvIHJldHVybiB0by4gUmFwaWQgY29tbWl0cyBmcm9tIG9uZSBnZXN0dXJlIGNvYWxlc2NlXG4gICAqIGludG8gYSBzaW5nbGUgZW50cnkgKHNlZSB7QGxpbmsgdW5kb1N0YWNrfSkuIEEgZnJlc2ggYWN0aW9uIGFsc28gYWJhbmRvbnNcbiAgICogYW55IHJlZG8gZnV0dXJlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRVbmRvU25hcHNob3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzdG9yaW5nVW5kbykgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0c0J1cnN0ID0gIXRoaXMudW5kb0J1cnN0T3BlbjtcbiAgICB0aGlzLmFybVVuZG9CdXJzdCgpO1xuICAgIGlmICghc3RhcnRzQnVyc3QpIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbWlkLWJ1cnN0IOKAlCBrZWVwIGZpcnN0IHNuYXBzaG90XG4gICAgdGhpcy51bmRvU3RhY2sucHVzaCh0aGlzLmNsb25lUmVnaW9ucyh0aGlzLnJlZ2lvbnMpKTtcbiAgICBpZiAodGhpcy51bmRvU3RhY2subGVuZ3RoID4gUmVnaW9uU3RvcmUuVU5ET19MSU1JVCkgdGhpcy51bmRvU3RhY2suc2hpZnQoKTtcbiAgICB0aGlzLnJlZG9TdGFjayA9IFtdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IGVkaXQgaW52YWxpZGF0ZXMgcmVkb1xuICAgIHRoaXMuZW1pdFVuZG9TdGF0ZSgpO1xuICB9XG5cbiAgLyoqIFB1c2ggdGhlIGN1cnJlbnQgY2FuLXVuZG8gLyBjYW4tcmVkbyBhdmFpbGFiaWxpdHkgdG8gc3Vic2NyaWJlcnMuICovXG4gIHByaXZhdGUgZW1pdFVuZG9TdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjYW5VbmRvID0gdGhpcy51bmRvU3RhY2subGVuZ3RoID4gMDtcbiAgICBjb25zdCBjYW5SZWRvID0gdGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMDtcbiAgICBpZiAodGhpcy5jYW5VbmRvJC52YWx1ZSAhPT0gY2FuVW5kbykgdGhpcy5jYW5VbmRvJC5uZXh0KGNhblVuZG8pO1xuICAgIGlmICh0aGlzLmNhblJlZG8kLnZhbHVlICE9PSBjYW5SZWRvKSB0aGlzLmNhblJlZG8kLm5leHQoY2FuUmVkbyk7XG4gIH1cblxuICAvKiogKFJlKWFybSB0aGUgaWRsZSB0aW1lciB0aGF0IGNsb3NlcyB0aGUgY3VycmVudCBjb2FsZXNjaW5nIGJ1cnN0LiAqL1xuICBwcml2YXRlIGFybVVuZG9CdXJzdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVuZG9CdXJzdE9wZW4gPSB0cnVlO1xuICAgIGlmICh0aGlzLnVuZG9CdXJzdFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy51bmRvQnVyc3RUaW1lcik7XG4gICAgdGhpcy51bmRvQnVyc3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51bmRvQnVyc3RPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLnVuZG9CdXJzdFRpbWVyID0gbnVsbDtcbiAgICB9LCBSZWdpb25TdG9yZS5VTkRPX0NPQUxFU0NFX01TKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VVbmRvQnVyc3QoKTogdm9pZCB7XG4gICAgdGhpcy51bmRvQnVyc3RPcGVuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudW5kb0J1cnN0VGltZXIpIHsgY2xlYXJUaW1lb3V0KHRoaXMudW5kb0J1cnN0VGltZXIpOyB0aGlzLnVuZG9CdXJzdFRpbWVyID0gbnVsbDsgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZVJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHJlZ2lvbnMubWFwKHIgPT4gdGhpcy5jbG9uZVJlZ2lvbihyKSk7XG4gIH1cblxuICAvKiogRGVlcCBjbG9uZSBhIHJlZ2lvbiBzbyBhbiBpbi1wbGFjZSBnZW9tZXRyeSBlZGl0IGNhbid0IG11dGF0ZSBhIHN0b3JlZFxuICAgKiAgaGlzdG9yeSBzbmFwc2hvdCAoYm91bmRzIGFyZSBjbG9uZWQgdmlhIHtAbGluayBjbG9uZUJvdW5kc30pLiAqL1xuICBwcml2YXRlIGNsb25lUmVnaW9uKHI6IFJlZ2lvbik6IFJlZ2lvbiB7XG4gICAgY29uc3QgYyA9IG5ldyBSZWdpb24oKTtcbiAgICBPYmplY3QuYXNzaWduKGMsIHIpO1xuICAgIGMuYm91bmRzID0gci5ib3VuZHMgPyB0aGlzLmNsb25lQm91bmRzKHIuYm91bmRzKSA6IHIuYm91bmRzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHIudGlsZUNvb3JkaW5hdGVzKSkgYy50aWxlQ29vcmRpbmF0ZXMgPSByLnRpbGVDb29yZGluYXRlcy5zbGljZSgpO1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZTogR2VvSlNPTiBJL08gKG5ldXRyYWwgaGVscGVycykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucGxvdFV0aWxpdGllcy5pbXBvcnRST0lzRnJvbUdlb0pzb24oZ2VvSnNvblN0cik7XG4gIH1cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIHRoaXMucGxvdFV0aWxpdGllcy5zYXZlVG9GaWxlKHRoaXMucGxvdFV0aWxpdGllcy5leHBvcnRST0lzVG9HZW9Kc29uKHJlZ2lvbnMpKTtcbiAgfVxuICBnZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnM6IFJlZ2lvbltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wbG90VXRpbGl0aWVzLmV4cG9ydFJPSXNUb0dlb0pzb24ocmVnaW9ucyk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRBcGk6IHN0cnVjdHVyYWwgZWRpdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkUmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogbnVtYmVyIHtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIGlmIChyZWdpb24uaWQgPT0gbnVsbCkgcmVnaW9uLmlkID0gdGhpcy5uZXh0SWQrKztcbiAgICBpZiAocmVnaW9uLm5hbWUgPT0gbnVsbCkgcmVnaW9uLm5hbWUgPSBgc2hhcGUke3JlZ2lvbi5pZH1gO1xuICAgIC8vIEEgcmVnaW9uIGRyYXduIG9uIGEgc3RhY2sgYmVsb25ncyB0byB0aGUgc2xpY2UgY3VycmVudGx5IGRpc3BsYXllZCwgc29cbiAgICAvLyBpdCBzYXZlcy9yZWxvYWRzIG9uIHRoYXQgc2xpY2UgKGppdC11aSM5MykuIE5vLW9wIGZvciBzaW5nbGUtcGxhbmUgaW1hZ2VzXG4gICAgLy8gKGN1cnJlbnRTbGljZVogc3RheXMgMCkuXG4gICAgaWYgKHRoaXMuc3RhY2tNb2RlKSByZWdpb24ueiA9IHRoaXMuY3VycmVudFNsaWNlWjtcbiAgICB0aGlzLmFwcGx5Q2xhc3NpZmljYXRpb25Db2xvcnMoW3JlZ2lvbl0pO1xuICAgIHRoaXMucmVnaW9ucy5wdXNoKHJlZ2lvbik7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtyZWdpb24uaWRdO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gICAgcmV0dXJuIHJlZ2lvbi5pZDtcbiAgfVxuXG4gIHJlbW92ZVJlZ2lvbihpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5pbmRleE9mSWQoaWQpO1xuICAgIGlmIChpZHggPCAwKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICB0aGlzLnJlZ2lvbnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IHRoaXMuc2VsZWN0ZWRJZHMuZmlsdGVyKHMgPT4gcyAhPT0gaWQpO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICB1cGRhdGVCb3VuZHMoaWQ6IG51bWJlciwgYm91bmRzOiBSZWN0YW5nbGUgfCBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uKTogdm9pZCB7XG4gICAgY29uc3QgciA9IHRoaXMuZmluZEJ5SWQoaWQpO1xuICAgIGlmICghcikgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgci5ib3VuZHMgPSB0aGlzLmNsb25lQm91bmRzKGJvdW5kcyk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIG1vdmVSZWdpb24oaWQ6IG51bWJlciwgZHg6IG51bWJlciwgZHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHIgPSB0aGlzLmZpbmRCeUlkKGlkKTtcbiAgICBpZiAoIXIgfHwgIXIuYm91bmRzKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBjb25zdCBiID0gci5ib3VuZHM7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICAgIGIueCArPSBkeDtcbiAgICAgIGIueSArPSBkeTtcbiAgICB9IGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVBvbHlnb24oYiwgZHgsIGR5KTtcbiAgICB9IGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHtcbiAgICAgIC8vIFRyYW5zbGF0ZSBldmVyeSBwYXJ0IChhbmQgaXRzIGhvbGVzKSB0b2dldGhlciAoaml0LXVpIzg1KS5cbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBiLnBvbHlnb25zKSB0aGlzLnRyYW5zbGF0ZVBvbHlnb24ocGFydCwgZHgsIGR5KTtcbiAgICB9XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBUcmFuc2xhdGUgYSBwb2x5Z29uJ3MgdmVydGljZXMgYW5kIGFueSBob2xlcyBpbiBwbGFjZSBieSAoZHgsIGR5KS4gKi9cbiAgcHJpdmF0ZSB0cmFuc2xhdGVQb2x5Z29uKHA6IFBvbHlnb24sIGR4OiBudW1iZXIsIGR5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBwLnhwb2ludHMgPSBwLnhwb2ludHMubWFwKHggPT4geCArIGR4KTtcbiAgICBwLnlwb2ludHMgPSBwLnlwb2ludHMubWFwKHkgPT4geSArIGR5KTtcbiAgICBwLmNvb3JkaW5hdGVzID0gcC54cG9pbnRzLm1hcCgoeCwgaSkgPT4gW3gsIHAueXBvaW50c1tpXV0pO1xuICAgIGlmIChwLmhvbGVzKSBwLmhvbGVzID0gcC5ob2xlcy5tYXAocmluZyA9PiByaW5nLm1hcCgoW3gsIHldKSA9PiBbeCArIGR4LCB5ICsgZHldKSk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRBcGk6IHZlcnRleCBlZGl0cyAocG9seWdvbnMgb25seSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgbW92ZVZlcnRleChpZDogbnVtYmVyLCBpbmRleDogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBvbHkgPSB0aGlzLnBvbHlnb25PZihpZCk7XG4gICAgaWYgKCFwb2x5IHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBwb2x5Lnhwb2ludHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBwb2x5Lnhwb2ludHNbaW5kZXhdID0geDtcbiAgICBwb2x5Lnlwb2ludHNbaW5kZXhdID0geTtcbiAgICBwb2x5LmNvb3JkaW5hdGVzW2luZGV4XSA9IFt4LCB5XTtcbiAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG5cbiAgLyoqIE1vdmUgYSB2ZXJ0ZXggb24gYSBwb2x5Z29uJ3MgaW50ZXJpb3IgcmluZyAoaG9sZSkg4oCUIGppdC11aSM4NS4gKi9cbiAgbW92ZUhvbGVWZXJ0ZXgoaWQ6IG51bWJlciwgaG9sZUluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcG9seSA9IHRoaXMucG9seWdvbk9mKGlkKTtcbiAgICBpZiAoIXBvbHkgfHwgIXBvbHkuaG9sZXMgfHwgaG9sZUluZGV4IDwgMCB8fCBob2xlSW5kZXggPj0gcG9seS5ob2xlcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCByaW5nID0gcG9seS5ob2xlc1tob2xlSW5kZXhdO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcmluZy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIHJpbmdbaW5kZXhdID0gW3gsIHldO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICAvKiogSW5zZXJ0IGEgdmVydGV4IG9uIGEgcG9seWdvbidzIGludGVyaW9yIHJpbmcgKGhvbGUpLCBhZnRlciBgc2VnSW5kZXhgXG4gICAqICAodGhlIGVkZ2UncyBzdGFydCB2ZXJ0ZXgpLiBOby1vcCBmb3IgYW4gb3V0LW9mLXJhbmdlIGhvbGUg4oCUIGppdC11aSM4NS4gKi9cbiAgYWRkSG9sZVZlcnRleChpZDogbnVtYmVyLCBob2xlSW5kZXg6IG51bWJlciwgc2VnSW5kZXg6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwb2x5ID0gdGhpcy5wb2x5Z29uT2YoaWQpO1xuICAgIGlmICghcG9seSB8fCAhcG9seS5ob2xlcyB8fCBob2xlSW5kZXggPCAwIHx8IGhvbGVJbmRleCA+PSBwb2x5LmhvbGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHJpbmcgPSBwb2x5LmhvbGVzW2hvbGVJbmRleF07XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBjb25zdCBhdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlZ0luZGV4ICsgMSwgcmluZy5sZW5ndGgpKTtcbiAgICByaW5nLnNwbGljZShhdCwgMCwgW3gsIHldKTtcbiAgICBpZiAocG9seS5iZXppZXIpIHRoaXMuc2VlZEhvbGVIYW5kbGVzKHBvbHkpOyAvLyBrZWVwIGhvbGUgaGFuZGxlcyBhbGlnbmVkIHRvIHRoZSByaW5nXG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgdGhlIHZlcnRleCBhdCBgaW5kZXhgIG9uIGEgcG9seWdvbidzIGludGVyaW9yIHJpbmcgKGhvbGUpLiBSZW1vdmluZ1xuICAgKiAgaXQgYmVsb3cgMyB2ZXJ0aWNlcyBkcm9wcyB0aGUgd2hvbGUgaG9sZSAoYSByaW5nIHdpdGggPCAzIHBvaW50cyBib3VuZHMgbm9cbiAgICogIGFyZWEpIOKAlCBqaXQtdWkjODUuICovXG4gIGRlbGV0ZUhvbGVWZXJ0ZXgoaWQ6IG51bWJlciwgaG9sZUluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwb2x5ID0gdGhpcy5wb2x5Z29uT2YoaWQpO1xuICAgIGlmICghcG9seSB8fCAhcG9seS5ob2xlcyB8fCBob2xlSW5kZXggPCAwIHx8IGhvbGVJbmRleCA+PSBwb2x5LmhvbGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHJpbmcgPSBwb2x5LmhvbGVzW2hvbGVJbmRleF07XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSByaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgaWYgKHJpbmcubGVuZ3RoIDw9IDMpIHtcbiAgICAgIHBvbHkuaG9sZXMuc3BsaWNlKGhvbGVJbmRleCwgMSk7XG4gICAgICBpZiAocG9seS5ob2xlcy5sZW5ndGggPT09IDApIHBvbHkuaG9sZXMgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJpbmcuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaWYgKHBvbHkuYmV6aWVyKSB0aGlzLnNlZWRIb2xlSGFuZGxlcyhwb2x5KTsgLy8ga2VlcCBob2xlIGhhbmRsZXMgYWxpZ25lZCB0byB0aGUgcmluZyhzKVxuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICBhZGRWZXJ0ZXgoaWQ6IG51bWJlciwgc2VnSW5kZXg6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwb2x5ID0gdGhpcy5wb2x5Z29uT2YoaWQpO1xuICAgIGlmICghcG9seSkgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgLy8gSW5zZXJ0IGFmdGVyIHNlZ0luZGV4ICh0aGUgc3RhcnQgdmVydGV4IG9mIHRoZSBlZGdlKS4gQ2xhbXAgdG8gcmFuZ2UuXG4gICAgY29uc3QgYXQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWdJbmRleCArIDEsIHBvbHkueHBvaW50cy5sZW5ndGgpKTtcbiAgICBwb2x5Lnhwb2ludHMuc3BsaWNlKGF0LCAwLCB4KTtcbiAgICBwb2x5Lnlwb2ludHMuc3BsaWNlKGF0LCAwLCB5KTtcbiAgICBwb2x5LmNvb3JkaW5hdGVzID0gcG9seS54cG9pbnRzLm1hcCgoeHgsIGkpID0+IFt4eCwgcG9seS55cG9pbnRzW2ldXSk7XG4gICAgcG9seS5ucG9pbnRzID0gcG9seS54cG9pbnRzLmxlbmd0aDtcbiAgICAvLyBHaXZlIHRoZSBuZXcgdmVydGV4IHNtb290aCBoYW5kbGVzIGZyb20gaXRzIG5laWdoYm91cnM7IGtlZXAgdGhlIG90aGVycydcbiAgICAvLyAocG9zc2libHkgaGFuZC1lZGl0ZWQpIGhhbmRsZXMgaW50YWN0LlxuICAgIGlmIChwb2x5LmJlemllciAmJiBwb2x5LmhhbmRsZXNJbiAmJiBwb2x5LmhhbmRsZXNPdXQpIHtcbiAgICAgIGNvbnN0IG4gPSBwb2x5Lnhwb2ludHMubGVuZ3RoO1xuICAgICAgY29uc3QgY2xvc2VkID0gcG9seS5jbG9zZWQgIT09IGZhbHNlO1xuICAgICAgY29uc3QgcHJldiA9IGNsb3NlZCA/IChhdCAtIDEgKyBuKSAlIG4gOiBNYXRoLm1heCgwLCBhdCAtIDEpO1xuICAgICAgY29uc3QgbmV4dCA9IGNsb3NlZCA/IChhdCArIDEpICUgbiA6IE1hdGgubWluKG4gLSAxLCBhdCArIDEpO1xuICAgICAgY29uc3QgdHggPSAocG9seS54cG9pbnRzW25leHRdIC0gcG9seS54cG9pbnRzW3ByZXZdKSAvIDY7XG4gICAgICBjb25zdCB0eSA9IChwb2x5Lnlwb2ludHNbbmV4dF0gLSBwb2x5Lnlwb2ludHNbcHJldl0pIC8gNjtcbiAgICAgIHBvbHkuaGFuZGxlc0luLnNwbGljZShhdCwgMCwgWy10eCwgLXR5XSk7XG4gICAgICBwb2x5LmhhbmRsZXNPdXQuc3BsaWNlKGF0LCAwLCBbdHgsIHR5XSk7XG4gICAgfVxuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICBkZWxldGVWZXJ0ZXgoaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBvbHkgPSB0aGlzLnBvbHlnb25PZihpZCk7XG4gICAgaWYgKCFwb2x5IHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBwb2x5Lnhwb2ludHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbWluID0gcG9seS5jbG9zZWQgPT09IGZhbHNlID8gMiA6IDM7XG4gICAgaWYgKHBvbHkueHBvaW50cy5sZW5ndGggPD0gbWluKSByZXR1cm47IC8vIHJlZnVzZSB0byBkZWdlbmVyYXRlIHRoZSBwb2x5Z29uXG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBwb2x5Lnhwb2ludHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBwb2x5Lnlwb2ludHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBwb2x5LmNvb3JkaW5hdGVzID0gcG9seS54cG9pbnRzLm1hcCgoeHgsIGkpID0+IFt4eCwgcG9seS55cG9pbnRzW2ldXSk7XG4gICAgcG9seS5ucG9pbnRzID0gcG9seS54cG9pbnRzLmxlbmd0aDtcbiAgICBpZiAocG9seS5iZXppZXIgJiYgcG9seS5oYW5kbGVzSW4gJiYgcG9seS5oYW5kbGVzT3V0KSB7XG4gICAgICBwb2x5LmhhbmRsZXNJbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcG9seS5oYW5kbGVzT3V0LnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICBzZXRCZXppZXIoaWQ6IG51bWJlciwgYmV6aWVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgciA9IHRoaXMuZmluZEJ5SWQoaWQpO1xuICAgIGlmICghciB8fCAhci5ib3VuZHMpIHJldHVybjtcbiAgICBpZiAoci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICBpZiAoci5ib3VuZHMuYmV6aWVyID09PSBiZXppZXIpIHJldHVybjtcbiAgICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgICB0aGlzLmFwcGx5QmV6aWVyKHIuYm91bmRzLCBiZXppZXIpO1xuICAgIH0gZWxzZSBpZiAoci5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUgJiYgYmV6aWVyKSB7XG4gICAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgICAgLy8gU21vb3RoaW5nIGEgcmVjdGFuZ2xlOiBjb252ZXJ0IGl0IHRvIGEgNC1hbmNob3IgY2xvc2VkIHBvbHlnb24gZmlyc3QuXG4gICAgICBjb25zdCBiID0gci5ib3VuZHM7XG4gICAgICBjb25zdCB4cyA9IFtiLngsIGIueCArIGIud2lkdGgsIGIueCArIGIud2lkdGgsIGIueF07XG4gICAgICBjb25zdCB5cyA9IFtiLnksIGIueSwgYi55ICsgYi5oZWlnaHQsIGIueSArIGIuaGVpZ2h0XTtcbiAgICAgIGNvbnN0IHBvbHkgPSBuZXcgUG9seWdvbigpO1xuICAgICAgcG9seS5ucG9pbnRzID0gNDtcbiAgICAgIHBvbHkueHBvaW50cyA9IHhzO1xuICAgICAgcG9seS55cG9pbnRzID0geXM7XG4gICAgICBwb2x5LmNvb3JkaW5hdGVzID0geHMubWFwKCh4LCBpKSA9PiBbeCwgeXNbaV1dKTtcbiAgICAgIHBvbHkuY2xvc2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXBwbHlCZXppZXIocG9seSwgdHJ1ZSk7XG4gICAgICByLmJvdW5kcyA9IHBvbHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjsgLy8gYmV6aWVyPWZhbHNlIG9uIGEgcmVjdGFuZ2xlOiBub3RoaW5nIHRvIGRvXG4gICAgfVxuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICAvKiogVHVybiBiZXppZXIgb24gKGFuZCBzZWVkIGVkaXRhYmxlIGhhbmRsZXMgZnJvbSB0aGUgc21vb3RoIGRlZmF1bHQpIG9yIG9mZlxuICAgKiAgKGFuZCBkcm9wIHRoZSBoYW5kbGVzKS4gKi9cbiAgcHJpdmF0ZSBhcHBseUJlemllcihwb2x5OiBQb2x5Z29uLCBiZXppZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBwb2x5LmJlemllciA9IGJlemllcjtcbiAgICBpZiAoYmV6aWVyKSB7XG4gICAgICBjb25zdCBvZmYgPSBkZWZhdWx0SGFuZGxlT2Zmc2V0cyhwb2x5Lnhwb2ludHMsIHBvbHkueXBvaW50cywgcG9seS5jbG9zZWQgIT09IGZhbHNlKTtcbiAgICAgIHBvbHkuaGFuZGxlc0luID0gb2ZmLmluO1xuICAgICAgcG9seS5oYW5kbGVzT3V0ID0gb2ZmLm91dDtcbiAgICAgIHRoaXMuc2VlZEhvbGVIYW5kbGVzKHBvbHkpOyAvLyBzbW9vdGggdGhlIGhvbGVzIHRvbyAoZG9udXQg4oaSIGJlemllciBjdXJ2ZXMgdGhlIGhvbGVzKVxuICAgIH0gZWxzZSB7XG4gICAgICBwb2x5LmhhbmRsZXNJbiA9IHVuZGVmaW5lZDtcbiAgICAgIHBvbHkuaGFuZGxlc091dCA9IHVuZGVmaW5lZDtcbiAgICAgIHBvbHkuaG9sZUhhbmRsZXNJbiA9IHVuZGVmaW5lZDtcbiAgICAgIHBvbHkuaG9sZUhhbmRsZXNPdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIChSZSlzZWVkIHBlci1ob2xlIGJlemllciBoYW5kbGVzIGZyb20gdGhlIENhdG11bGwtUm9tIGRlZmF1bHQsIHBhcmFsbGVsIHRvIGBwb2x5LmhvbGVzYC4gKi9cbiAgcHJpdmF0ZSBzZWVkSG9sZUhhbmRsZXMocG9seTogUG9seWdvbik6IHZvaWQge1xuICAgIGlmICghcG9seS5ob2xlcyB8fCAhcG9seS5ob2xlcy5sZW5ndGgpIHtcbiAgICAgIHBvbHkuaG9sZUhhbmRsZXNJbiA9IHVuZGVmaW5lZDtcbiAgICAgIHBvbHkuaG9sZUhhbmRsZXNPdXQgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluczogbnVtYmVyW11bXVtdID0gW107XG4gICAgY29uc3Qgb3V0czogbnVtYmVyW11bXVtdID0gW107XG4gICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHkuaG9sZXMpIHtcbiAgICAgIGNvbnN0IG9mZiA9IGRlZmF1bHRIYW5kbGVPZmZzZXRzKFxuICAgICAgICByaW5nLm1hcCgocCkgPT4gcFswXSksXG4gICAgICAgIHJpbmcubWFwKChwKSA9PiBwWzFdKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBpbnMucHVzaChvZmYuaW4pO1xuICAgICAgb3V0cy5wdXNoKG9mZi5vdXQpO1xuICAgIH1cbiAgICBwb2x5LmhvbGVIYW5kbGVzSW4gPSBpbnM7XG4gICAgcG9seS5ob2xlSGFuZGxlc091dCA9IG91dHM7XG4gIH1cblxuICAvKiogRHJhZyBhIGJlemllciBjb250cm9sIHBvaW50IG9uIGEgaG9sZSByaW5nIHZlcnRleCAoZG9udXQgYmV6aWVyIGVkaXRpbmcpLiAqL1xuICBtb3ZlSG9sZUJlemllckhhbmRsZShcbiAgICBpZDogbnVtYmVyLFxuICAgIGhvbGVJbmRleDogbnVtYmVyLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc2lkZTogJ2luJyB8ICdvdXQnLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBvbHkgPSB0aGlzLnBvbHlnb25PZihpZCk7XG4gICAgaWYgKCFwb2x5IHx8ICFwb2x5LmJlemllciB8fCAhcG9seS5ob2xlcyB8fCBob2xlSW5kZXggPCAwIHx8IGhvbGVJbmRleCA+PSBwb2x5LmhvbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByaW5nID0gcG9seS5ob2xlc1tob2xlSW5kZXhdO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcmluZy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIGlmICghcG9seS5ob2xlSGFuZGxlc0luIHx8ICFwb2x5LmhvbGVIYW5kbGVzT3V0KSB0aGlzLnNlZWRIb2xlSGFuZGxlcyhwb2x5KTtcbiAgICBjb25zdCBvZmZzZXQgPSBbeCAtIHJpbmdbaW5kZXhdWzBdLCB5IC0gcmluZ1tpbmRleF1bMV1dO1xuICAgIGlmIChzaWRlID09PSAnaW4nKSBwb2x5LmhvbGVIYW5kbGVzSW4hW2hvbGVJbmRleF1baW5kZXhdID0gb2Zmc2V0O1xuICAgIGVsc2UgcG9seS5ob2xlSGFuZGxlc091dCFbaG9sZUluZGV4XVtpbmRleF0gPSBvZmZzZXQ7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIG1vdmVCZXppZXJIYW5kbGUoaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlciwgc2lkZTogJ2luJyB8ICdvdXQnLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBvbHkgPSB0aGlzLnBvbHlnb25PZihpZCk7XG4gICAgaWYgKCFwb2x5IHx8ICFwb2x5LmJlemllciB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gcG9seS54cG9pbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgaWYgKCFwb2x5LmhhbmRsZXNJbiB8fCAhcG9seS5oYW5kbGVzT3V0KSB7XG4gICAgICBjb25zdCBvZmYgPSBkZWZhdWx0SGFuZGxlT2Zmc2V0cyhwb2x5Lnhwb2ludHMsIHBvbHkueXBvaW50cywgcG9seS5jbG9zZWQgIT09IGZhbHNlKTtcbiAgICAgIHBvbHkuaGFuZGxlc0luID0gb2ZmLmluO1xuICAgICAgcG9seS5oYW5kbGVzT3V0ID0gb2ZmLm91dDtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gW3ggLSBwb2x5Lnhwb2ludHNbaW5kZXhdLCB5IC0gcG9seS55cG9pbnRzW2luZGV4XV07XG4gICAgaWYgKHNpZGUgPT09ICdpbicpIHBvbHkuaGFuZGxlc0luW2luZGV4XSA9IG9mZnNldDtcbiAgICBlbHNlIHBvbHkuaGFuZGxlc091dFtpbmRleF0gPSBvZmZzZXQ7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIGJlZ2luQmF0Y2goKTogdm9pZCB7IHRoaXMuYmF0Y2hEZXB0aCsrOyB9XG4gIGVuZEJhdGNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJhdGNoRGVwdGggPiAwKSB0aGlzLmJhdGNoRGVwdGgtLTtcbiAgICBpZiAodGhpcy5iYXRjaERlcHRoID09PSAwICYmIHRoaXMucGVuZGluZ0VtaXQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0VtaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMuZ2V0UmVnaW9ucygpKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgcGVyLWltYWdlIGxpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgaW1hZ2U6IHNuYXBzaG90IHRoZSBvdXRnb2luZyByZWdpb25zLCByZXN0b3JlIHRoZVxuICAgKiBpbmNvbWluZyBpbWFnZSdzIChvciBbXSBpZiBub25lKSwgY2xlYXIgc2VsZWN0aW9uLCBhbmQgbm90aWZ5LiBJZGVtcG90ZW50XG4gICAqIGZvciB0aGUgc2FtZSBpbWFnZSAoc28gcmVwZWF0ZWQgcmVwbG90cyBvZiBvbmUgaW1hZ2Uga2VlcCBpdHMgcmVnaW9ucykuXG4gICAqL1xuICBzZXRBY3RpdmVJbWFnZShpbWFnZUluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBuZXdLZXkgPSB0aGlzLmRlcml2ZUltYWdlS2V5KGltYWdlSW5mbyk7XG4gICAgaWYgKHRoaXMuY3VycmVudEltYWdlS2V5ID09PSBuZXdLZXkpIHJldHVybjtcbiAgICAvLyBTd2l0Y2hpbmcgaW1hZ2VzIGVuZHMgYW55IHBlci1zbGljZSBzdGFjayBzZXNzaW9uIChqaXQtdWkjOTMpOyB0aGUgbG9hZGVyXG4gICAgLy8gcmUtZW50ZXJzIHN0YWNrIG1vZGUgYWZ0ZXJ3YXJkcyBpZiB0aGUgbmV3IGltYWdlIGlzIGl0c2VsZiBhIHotc3RhY2suXG4gICAgdGhpcy5leGl0U3RhY2tNb2RlKCk7XG4gICAgaWYgKHRoaXMuY3VycmVudEltYWdlS2V5KSB7XG4gICAgICB0aGlzLnJlZ2lvbnNCeUltYWdlS2V5LnNldCh0aGlzLmN1cnJlbnRJbWFnZUtleSwgdGhpcy5yZWdpb25zLnNsaWNlKCkpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRJbWFnZUtleSA9IG5ld0tleTtcbiAgICB0aGlzLnJlZ2lvbnMgPSAobmV3S2V5ICYmIHRoaXMucmVnaW9uc0J5SW1hZ2VLZXkuZ2V0KG5ld0tleSkpXG4gICAgICA/ICh0aGlzLnJlZ2lvbnNCeUltYWdlS2V5LmdldChuZXdLZXkpIGFzIFJlZ2lvbltdKS5zbGljZSgpXG4gICAgICA6IFtdO1xuICAgIHRoaXMucHJldmlvdXNSZWdpb25zID0gdGhpcy5yZWdpb25zLnNsaWNlKCk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtdO1xuICAgIC8vIFVuZG8gbmV2ZXIgY3Jvc3NlcyBhbiBpbWFnZSBzd2l0Y2guXG4gICAgdGhpcy5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQodGhpcy5nZXRSZWdpb25zKCkpO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIGVudGlyZSBwZXItaW1hZ2UgY2FjaGUgKGxvZ291dCAvIHByb2plY3Qgc3dpdGNoKS4gKi9cbiAgY2xlYXJSZWdpb25zQnlJbWFnZUtleSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbnNCeUltYWdlS2V5LmNsZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50SW1hZ2VLZXkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWdpb25zID0gW107XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtdO1xuICAgIHRoaXMucmVzZXRVbmRvSGlzdG9yeSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGRlcml2ZUltYWdlS2V5KGltYWdlSW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpbWFnZUluZm8pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGltYWdlSW5mby51cmxzICYmIGltYWdlSW5mby51cmxzLmxlbmd0aCA+IDAgJiYgaW1hZ2VJbmZvLnVybHNbMF0pIHtcbiAgICAgIHJldHVybiBpbWFnZUluZm8udXJsc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIGltYWdlSW5mby5maWxlTmFtZSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBlYWNoIHJlZ2lvbidzIGNvbG91ciBmcm9tIHRoZSBhbm5vdGF0aW9uLWNsYXNzIHByZXNldCBzZXQgKGppdC11aSM3MCkuXG4gICAqIFRoZSBwcmVzZXRzIGFyZSB0aGUgc291cmNlIG9mIHRydXRoIGZvciBjb2xvdXIg4oCUIHRoaXMgKipvdmVycmlkZXMgYW55IGNvbG91clxuICAgKiBlbWJlZGRlZCBpbiB0aGUgR2VvSlNPTioqICh3aGljaCB0aGUgWU9MTyB3b3JrZXIgd3JpdGVzIHRvZGF5KS4gQSBtYXRjaGluZ1xuICAgKiBwcmVzZXQgZ2l2ZXMgdGhlIGNsYXNzIGNvbG91cjsgYW4gdW5rbm93biBjbGFzcyBnZXRzIGEgZGV0ZXJtaW5pc3RpYyBmYWxsYmFja1xuICAgKiBjb2xvdXIgKGFuZCwgb25seSB3aGVuIGBhdXRvUHJvbW90ZWAgaXMgb24sIGlzIGFkZGVkIHRvIHRoZSBlZGl0YWJsZSBsaXN0KS5cbiAgICogUmVnaW9ucyB0aGUgdXNlciBleHBsaWNpdGx5IHJlY29sb3VyZWQgKGBjb2xvck92ZXJyaWRkZW5gKSBhcmUgbGVmdCB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5Q2xhc3NpZmljYXRpb25Db2xvcnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCBzZXQgPSB0aGlzLnN0b3JlLmdldFByZXNldFNldCgpO1xuICAgIGNvbnN0IGtleU9mID0gKGxhYmVsOiBzdHJpbmcpID0+XG4gICAgICBzZXQubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyBsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKSA6IGxhYmVsO1xuICAgIGNvbnN0IGtub3duID0gbmV3IFNldChzZXQuY2xhc3Nlcy5tYXAoKGMpID0+IGtleU9mKGMubmFtZSkpKTtcbiAgICBmb3IgKGNvbnN0IHJlZ2lvbiBvZiByZWdpb25zKSB7XG4gICAgICBpZiAoIXJlZ2lvbi5sYWJlbCB8fCByZWdpb24uY29sb3JPdmVycmlkZGVuKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHByZXNldCA9IGZpbmRQcmVzZXQocmVnaW9uLmxhYmVsLCBzZXQpO1xuICAgICAgaWYgKHByZXNldCkge1xuICAgICAgICByZWdpb24uY29sb3IgPSBwcmVzZXQuY29sb3I7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sb3IgPSBmYWxsYmFja0NvbG9yRm9yKHJlZ2lvbi5sYWJlbCwgc2V0LmZhbGxiYWNrUGFsZXR0ZSk7XG4gICAgICByZWdpb24uY29sb3IgPSBjb2xvcjtcbiAgICAgIGlmIChzZXQuYXV0b1Byb21vdGUgJiYgIWtub3duLmhhcyhrZXlPZihyZWdpb24ubGFiZWwpKSkge1xuICAgICAgICBrbm93bi5hZGQoa2V5T2YocmVnaW9uLmxhYmVsKSk7XG4gICAgICAgIC8vIEluIG5vcm1hbGl6ZWQgbW9kZSwgdHJpbSB0aGUgcHJvbW90ZWQgbmFtZSBzbyBsZWFkaW5nL3RyYWlsaW5nXG4gICAgICAgIC8vIHdoaXRlc3BhY2UgZG9lc24ndCBjcmVhdGUgaW52aXNpYmxlIGR1cGxpY2F0ZXMgb3Igb2RkIGRpc3BsYXkgbmFtZXMuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBzZXQubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyByZWdpb24ubGFiZWwudHJpbSgpIDogcmVnaW9uLmxhYmVsO1xuICAgICAgICB0aGlzLnN0b3JlLnVwc2VydENsYXNzKHsgbmFtZSwgY29sb3IsIHNvdXJjZTogJ2F1dG8nIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0NhY2hlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRJbWFnZUtleSkge1xuICAgICAgdGhpcy5yZWdpb25zQnlJbWFnZUtleS5zZXQodGhpcy5jdXJyZW50SW1hZ2VLZXksIHRoaXMucmVnaW9ucy5zbGljZSgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXQoKTogdm9pZCB7XG4gICAgLy8gTGl2ZS1lZGl0IGxpc3RlbmVycyAoZS5nLiB0aGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQpIHJlYWN0IG9uIEVWRVJZXG4gICAgLy8gY2hhbmdlIOKAlCBpbmNsdWRpbmcgcGVyLWZyYW1lIGR1cmluZyBhIGJhdGNoZWQgZHJhZyDigJQgc28gdGhleSB0cmFjayB0aGVcbiAgICAvLyByZWdpb24gbGl2ZS4gVGhlIG1haW4gcmVnaW9uVXBkYXRlJCBzdGF5cyBjb2FsZXNjZWQgZHVyaW5nIGEgYmF0Y2ggKGZpcmVzXG4gICAgLy8gb25jZSBvbiBlbmRCYXRjaCkgdG8ga2VlcCBoZWF2aWVyIGNvbnN1bWVycyAoUmVnaW9ucyB0YWIpIGNhbG0uXG4gICAgdGhpcy5yZWdpb25MaXZlRWRpdCQubmV4dCh0aGlzLnJlZ2lvbnMuc2xpY2UoKSk7XG4gICAgaWYgKHRoaXMuYmF0Y2hEZXB0aCA+IDApIHsgdGhpcy5wZW5kaW5nRW1pdCA9IHRydWU7IHJldHVybjsgfVxuICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMuZ2V0UmVnaW9ucygpKTtcbiAgfVxuXG4gIC8qKiBQcm9qZWN0IHNlbGVjdGVkIGlkcyB0byBjdXJyZW50IGFycmF5IGluZGljZXMsIHBydW5pbmcgaWRzIHRoYXQgbm8gbG9uZ2VyXG4gICAqICBleGlzdCwgYW5kIGVtaXQgaWYgdGhlIGluZGV4IHNldCBjaGFuZ2VkLiAqL1xuICBwcml2YXRlIGVtaXRTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBsaXZlSWRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy5zZWxlY3RlZElkcykge1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5pbmRleE9mSWQoaWQpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7IGluZGljZXMucHVzaChpZHgpOyBsaXZlSWRzLnB1c2goaWQpOyB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRJZHMgPSBsaXZlSWRzO1xuICAgIGlmICghdGhpcy5pbmRpY2VzRXF1YWwodGhpcy5zZWxlY3RlZEluZGljZXMkLnZhbHVlLCBpbmRpY2VzKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEluZGljZXMkLm5leHQoaW5kaWNlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbmRpY2VzRXF1YWwoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFJlZ2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9ucy5maW5kKHIgPT4gci5pZCA9PT0gaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmRleE9mSWQoaWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9ucy5maW5kSW5kZXgociA9PiByLmlkID09PSBpZCk7XG4gIH1cblxuICAvKiogVGhlIHJlZ2lvbidzIGJvdW5kcyBhcyBhIFBvbHlnb24sIG9yIHVuZGVmaW5lZCBpZiBpdCBpc24ndCBhIHBvbHlnb24uICovXG4gIHByaXZhdGUgcG9seWdvbk9mKGlkOiBudW1iZXIpOiBQb2x5Z29uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByID0gdGhpcy5maW5kQnlJZChpZCk7XG4gICAgcmV0dXJuIHIgJiYgci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uID8gci5ib3VuZHMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGNsb25lUG9seWdvbihwOiBQb2x5Z29uKTogUG9seWdvbiB7XG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0gcC5ucG9pbnRzO1xuICAgIHBvbHkueHBvaW50cyA9IHAueHBvaW50cy5zbGljZSgpO1xuICAgIHBvbHkueXBvaW50cyA9IHAueXBvaW50cy5zbGljZSgpO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSBwLmNvb3JkaW5hdGVzLm1hcChjID0+IGMuc2xpY2UoKSk7XG4gICAgcG9seS5jbG9zZWQgPSBwLmNsb3NlZDtcbiAgICBwb2x5LmJlemllciA9IHAuYmV6aWVyO1xuICAgIGlmIChwLmhhbmRsZXNJbikgcG9seS5oYW5kbGVzSW4gPSBwLmhhbmRsZXNJbi5tYXAobyA9PiBvLnNsaWNlKCkpO1xuICAgIGlmIChwLmhhbmRsZXNPdXQpIHBvbHkuaGFuZGxlc091dCA9IHAuaGFuZGxlc091dC5tYXAobyA9PiBvLnNsaWNlKCkpO1xuICAgIGlmIChwLmhvbGVzKSBwb2x5LmhvbGVzID0gcC5ob2xlcy5tYXAocmluZyA9PiByaW5nLm1hcChwdCA9PiBwdC5zbGljZSgpKSk7XG4gICAgaWYgKHAuaG9sZUhhbmRsZXNJbikgcG9seS5ob2xlSGFuZGxlc0luID0gcC5ob2xlSGFuZGxlc0luLm1hcChyID0+IHIubWFwKG8gPT4gby5zbGljZSgpKSk7XG4gICAgaWYgKHAuaG9sZUhhbmRsZXNPdXQpIHBvbHkuaG9sZUhhbmRsZXNPdXQgPSBwLmhvbGVIYW5kbGVzT3V0Lm1hcChyID0+IHIubWFwKG8gPT4gby5zbGljZSgpKSk7XG4gICAgcmV0dXJuIHBvbHk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lQm91bmRzKGJvdW5kczogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbik6IFJlY3RhbmdsZSB8IFBvbHlnb24gfCBNdWx0aVBvbHlnb24ge1xuICAgIGlmIChib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgICByZWN0LnggPSBib3VuZHMueDsgcmVjdC55ID0gYm91bmRzLnk7IHJlY3Qud2lkdGggPSBib3VuZHMud2lkdGg7IHJlY3QuaGVpZ2h0ID0gYm91bmRzLmhlaWdodDtcbiAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICBpZiAoYm91bmRzIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSB7XG4gICAgICBjb25zdCBtcCA9IG5ldyBNdWx0aVBvbHlnb24oKTtcbiAgICAgIG1wLnBvbHlnb25zID0gYm91bmRzLnBvbHlnb25zLm1hcChwID0+IHRoaXMuY2xvbmVQb2x5Z29uKHApKTtcbiAgICAgIHJldHVybiBtcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmVQb2x5Z29uKGJvdW5kcyk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lvbnNFcXVhbChhOiBSZWdpb24sIGI6IFJlZ2lvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJhID0gYS5ib3VuZHMsIGJiID0gYi5ib3VuZHM7XG4gICAgaWYgKGJhIGluc3RhbmNlb2YgUmVjdGFuZ2xlICYmIGJiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgICByZXR1cm4gYmEueCA9PT0gYmIueCAmJiBiYS55ID09PSBiYi55ICYmIGJhLndpZHRoID09PSBiYi53aWR0aCAmJiBiYS5oZWlnaHQgPT09IGJiLmhlaWdodDtcbiAgICB9XG4gICAgaWYgKGJhIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uICYmIGJiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSB7XG4gICAgICBpZiAoYmEucG9seWdvbnMubGVuZ3RoICE9PSBiYi5wb2x5Z29ucy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmEucG9seWdvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF0aGlzLnBvbHlnb25zRXF1YWwoYmEucG9seWdvbnNbaV0sIGJiLnBvbHlnb25zW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChiYSBpbnN0YW5jZW9mIFBvbHlnb24gJiYgYmIgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb2x5Z29uc0VxdWFsKGJhLCBiYik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcG9seWdvbnNFcXVhbChwYTogUG9seWdvbiwgcGI6IFBvbHlnb24pOiBib29sZWFuIHtcbiAgICBpZiAoKHBhLmNsb3NlZCAhPT0gZmFsc2UpICE9PSAocGIuY2xvc2VkICE9PSBmYWxzZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocGEueHBvaW50cy5sZW5ndGggIT09IHBiLnhwb2ludHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYS54cG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGEueHBvaW50c1tpXSAhPT0gcGIueHBvaW50c1tpXSB8fCBwYS55cG9pbnRzW2ldICE9PSBwYi55cG9pbnRzW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhvbGVzRXF1YWwocGEuaG9sZXMsIHBiLmhvbGVzKTtcbiAgfVxuXG4gIC8qKiBDb21wYXJlIHR3byBwb2x5Z29ucycgaW50ZXJpb3ItcmluZyAoaG9sZSkgc2V0cyBmb3IgdGhlIGRlZHVwZSBwYXRoLiAqL1xuICBwcml2YXRlIGhvbGVzRXF1YWwoYTogbnVtYmVyW11bXVtdIHwgdW5kZWZpbmVkLCBiOiBudW1iZXJbXVtdW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBjb25zdCBuYSA9IGE/Lmxlbmd0aCA/PyAwLCBuYiA9IGI/Lmxlbmd0aCA/PyAwO1xuICAgIGlmIChuYSAhPT0gbmIpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBoID0gMDsgaCA8IG5hOyBoKyspIHtcbiAgICAgIGNvbnN0IHJhID0gKGEgYXMgbnVtYmVyW11bXVtdKVtoXSwgcmIgPSAoYiBhcyBudW1iZXJbXVtdW10pW2hdO1xuICAgICAgaWYgKHJhLmxlbmd0aCAhPT0gcmIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyYVtpXVswXSAhPT0gcmJbaV1bMF0gfHwgcmFbaV1bMV0gIT09IHJiW2ldWzFdKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
1035
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7O0FBRWxFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsTUFBTSxPQUFPLFdBQVc7YUFFRSxlQUFVLEdBQUcsRUFBRSxBQUFMLENBQU07YUFDaEIscUJBQWdCLEdBQUcsR0FBRyxBQUFOLENBQU87SUFrRi9DLFlBQW9CLEtBQXNCO1FBQXRCLFVBQUssR0FBTCxLQUFLLENBQWlCO1FBaEYxQztpQ0FDeUI7UUFDakIsc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFFeEQsNERBQTREO1FBQ3BELFlBQU8sR0FBYSxFQUFFLENBQUM7UUFDL0IsZ0VBQWdFO1FBQ3hELG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBRXZDOzs7Ozs7Ozs7Ozs7O1dBYUc7UUFDSyxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBQzNCLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFDbkMsNEVBQTRFO1FBQ3BFLGtCQUFh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LEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiwgUmVjdGFuZ2xlLCBQb2x5Z29uLCBNdWx0aVBvbHlnb24sIGh5ZHJhdGVCb3VuZHMgfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFBsb3RVdGlsaXRpZXMgfSBmcm9tICcuLi9wbG90LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBkZWZhdWx0SGFuZGxlT2Zmc2V0cyB9IGZyb20gJy4uL21vZGVscy9iZXppZXInO1xuaW1wb3J0IHsgSVJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRBcGkgfSBmcm9tICcuLi9jb250cmFjdHMvcmVnaW9uLXN0b3JlLmNvbnRyYWN0JztcbmltcG9ydCB7IGZpbmRQcmVzZXQsIGZhbGxiYWNrQ29sb3JGb3IgfSBmcm9tICcuL2NsYXNzLWNvbG9yLnV0aWwnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCByZWdpb24gc3RvcmUg4oCUIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciByZWdpb24gc3RhdGUuXG4gKlxuICogSG9sZHMgdGhlIG5ldXRyYWwge0BsaW5rIFJlZ2lvbn0gbW9kZWwgKG5ldmVyIGEgYmFja2VuZCdzIG93biBzaGFwZVxuICogcmVwcmVzZW50YXRpb24pLCBrZXllZCBwZXIgaW1hZ2Ugc28gcmVnaW9ucyBwZXJzaXN0IGFzIHRoZSB1c2VyIHN3aXRjaGVzXG4gKiBmaWxlcyBhbmQgc3Vydml2ZSBhIFBsb3RseeKHhE9wZW5TZWFkcmFnb24gYmFja2VuZCBzd2l0Y2ggKGJvdGggYmFja2VuZHMgcmVhZFxuICogYW5kIHdyaXRlICp0aGlzKiBzdG9yZSwgc28gbm8gbWlncmF0aW9uIGlzIG5lZWRlZCkuIEJhY2tlbmRzIG93biAqcmVuZGVyaW5nKlxuICogYW5kIHJlYWN0IHRvIHtAbGluayBnZXRSZWdpb25VcGRhdGVFdmVudH07IHRoaXMgc2VydmljZSBvd25zICpzdGF0ZSogYW5kIHRoZVxuICogZWRpdGluZyBvcGVyYXRpb25zLlxuICpcbiAqIEltcGxlbWVudHM6XG4gKiAgLSB7QGxpbmsgSVJlZ2lvblN0b3JlfSDigJQgdGhlIGNyb3NzLWJhY2tlbmQgQ1JVRC9zZWxlY3Rpb24vY29sb3VyIGNvbnRyYWN0XG4gKiAgICBldmVyeSBjb25zdW1lciAoUmVnaW9uIEVkaXRvciwgc2VnbWVudGF0aW9uLCBldGMuKSBhbHJlYWR5IHVzZXMuXG4gKiAgLSB7QGxpbmsgSVJlZ2lvbkVkaXRBcGl9IOKAlCBSZWdpb24tbmF0aXZlIGdlb21ldHJ5IGVkaXRzIChtb3ZlL3Jlc2l6ZSwgYW5kXG4gKiAgICBhZGQvZGVsZXRlL21vdmUgdmVydGV4KSB0aGUgT1NEIG92ZXJsYXkgZHJpdmVzLlxuICpcbiAqIENsYXNzaWZpY2F0aW9uIGNvbG91cnMgbGl2ZSBpbiB7QGxpbmsgVmlzdWFsaXplclN0b3JlfSAoc2hhcmVkIGJ5IGJvdGhcbiAqIGJhY2tlbmRzKTsgR2VvSlNPTiBpbXBvcnQvZXhwb3J0IGFuZCB0aGUgY2xvc2VkLXBvbHlnb24gcHJvamVjdGlvbiByZXVzZSB0aGVcbiAqIG5ldXRyYWwge0BsaW5rIFBsb3RVdGlsaXRpZXN9IGhlbHBlcnMuIEFsbCBjb29yZGluYXRlcyBhcmUgaW1hZ2UgcGl4ZWxzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlZ2lvblN0b3JlIGltcGxlbWVudHMgSVJlZ2lvblN0b3JlLCBJUmVnaW9uRWRpdEFwaSB7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVU5ET19MSU1JVCA9IDEwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBVTkRPX0NPQUxFU0NFX01TID0gMjUwO1xuXG4gIC8qKiBQZXItaW1hZ2UgcmVnaW9uIGNhY2hlLiBgcmVnaW9uc2AgaXMgYWx3YXlzIGEgc25hcHNob3Qgb2YgdGhlIGVudHJ5IGZvclxuICAgKiAgYGN1cnJlbnRJbWFnZUtleWAuICovXG4gIHByaXZhdGUgcmVnaW9uc0J5SW1hZ2VLZXkgPSBuZXcgTWFwPHN0cmluZywgUmVnaW9uW10+KCk7XG4gIHByaXZhdGUgY3VycmVudEltYWdlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgY3VycmVudCBpbWFnZSdzIHJlZ2lvbnMg4oCUIHRoZSBsaXZlLCBlZGl0ZWQgYXJyYXkuICovXG4gIHByaXZhdGUgcmVnaW9uczogUmVnaW9uW10gPSBbXTtcbiAgLyoqIExhc3Qgc2F2ZWQgc25hcHNob3QsIHJlc3RvcmFibGUgdmlhIHBsb3RQcmV2aW91c1NoYXBlcygpLiAqL1xuICBwcml2YXRlIHByZXZpb3VzUmVnaW9uczogUmVnaW9uW10gPSBbXTtcblxuICAvKipcbiAgICogVW5kby9yZWRvIGhpc3RvcnkgKGppdC11aSM4NSk6IHVwIHRvIHtAbGluayBVTkRPX0xJTUlUfSBzbmFwc2hvdHMgb2YgdGhlXG4gICAqIHJlZ2lvbiBzZXQsIGVhY2ggYSBkZWVwIGNsb25lIGNhcHR1cmVkIGltbWVkaWF0ZWx5ICpiZWZvcmUqIGFcbiAgICogcmVnaW9uLWVkaXRpbmcgYWN0aW9uLiB7QGxpbmsgdW5kb30gcG9wcyB0aGUgbmV3ZXN0IG9mZiBgdW5kb1N0YWNrYCwgcHVzaGVzXG4gICAqIHRoZSBjdXJyZW50IHN0YXRlIG9udG8gYHJlZG9TdGFja2AsIGFuZCByZXN0b3JlcyBpdCDigJQgc28gaXQgY2FuIGJlIGludm9rZWRcbiAgICogdXAgdG8ge0BsaW5rIFVORE9fTElNSVR9IHRpbWVzIGluIGEgcm93LiB7QGxpbmsgcmVkb30gaXMgdGhlIG1pcnJvci4gQW55IG5ld1xuICAgKiByZWdpb24gYWN0aW9uIGNsZWFycyBgcmVkb1N0YWNrYCAodGhlIHJlZG8gZnV0dXJlIGlzIG5vIGxvbmdlciByZWFjaGFibGUpLlxuICAgKlxuICAgKiBBIGNvbnRpbnVvdXMgZ2VzdHVyZSAoYSB3YW5kL2JydXNoL3ZlcnRleCBkcmFnIGNvbW1pdHMgdG8gdGhlIHN0b3JlIG1hbnlcbiAgICogdGltZXMpIGlzIGNvYWxlc2NlZCBpbnRvIGEgc2luZ2xlIGVudHJ5OiB0aGUgZmlyc3QgY29tbWl0IG9mIGEgYnVyc3RcbiAgICogY2FwdHVyZXMgdGhlIHByZS1idXJzdCBzdGF0ZSBhbmQgZXZlcnkgY29tbWl0IHdpdGhpblxuICAgKiB7QGxpbmsgVU5ET19DT0FMRVNDRV9NU30gb2YgdGhlIHByZXZpb3VzIG9uZSBpcyBmb2xkZWQgaW50byBpdC4gSGlzdG9yeVxuICAgKiBuZXZlciBjcm9zc2VzIGFuIGltYWdlIGxvYWQvc3dpdGNoIOKAlCB7QGxpbmsgcmVzZXRVbmRvSGlzdG9yeX0gY2xlYXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSB1bmRvU3RhY2s6IFJlZ2lvbltdW10gPSBbXTtcbiAgcHJpdmF0ZSByZWRvU3RhY2s6IFJlZ2lvbltdW10gPSBbXTtcbiAgLyoqIFRydWUgd2hpbGUgYSBjb2FsZXNjaW5nIGJ1cnN0IGlzIG9wZW4gKGZ1cnRoZXIgY29tbWl0cyBmb2xkIGludG8gaXQpLiAqL1xuICBwcml2YXRlIHVuZG9CdXJzdE9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB1bmRvQnVyc3RUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hpbGUgcmVzdG9yaW5nIGEgc25hcHNob3QsIHNvIHRoZSByZXN0b3JlIHJlY29yZHMgbm8gbmV3IGhpc3RvcnkuICovXG4gIHByaXZhdGUgcmVzdG9yaW5nVW5kbyA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNhblVuZG8kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuUmVkbyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAvKiogTW9ub3RvbmljIGlkIHNvdXJjZSDigJQgaWRzIG5ldmVyIHJlcGVhdCB3aXRoaW4gdGhlIHNlcnZpY2UgbGlmZXRpbWUsIHNvXG4gICAqICBzZWxlY3Rpb24gc3RheXMgY29ycmVjdCBhY3Jvc3MgZGVsZXRlL2FkZCBjeWNsZXMgZXZlbiB3aGVuIG5hbWVzIGNvbGxpZGUuICovXG4gIHByaXZhdGUgbmV4dElkID0gMTtcblxuICBwcml2YXRlIHNob3dTaGFwZUxhYmVsID0gZmFsc2U7XG4gIHByaXZhdGUgc2hhcGVDb2xvciA9ICcjMDBGRkZGJztcbiAgcHJpdmF0ZSBmaWxsQ29sb3IgPSAnI2ZmMDBmZic7XG4gIHByaXZhdGUgaXNSZWdpb25TYXZlZE9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogUGVyLXNsaWNlIHJlZ2lvbiBzdXBwb3J0IGZvciB6LXN0YWNrcyAoaml0LXVpIzkzKS4gV2hpbGUge0BsaW5rIHN0YWNrTW9kZX1cbiAgICogaXMgb24gKGEgei1zdGFjayBpcyBsb2FkZWQpLCB0aGUgbGl2ZSBgcmVnaW9uc2AgYXJyYXkgYWx3YXlzIGhvbGRzIE9ORVxuICAgKiBzbGljZSDigJQgdGhlIHtAbGluayBjdXJyZW50U2xpY2VafSBzbGljZSDigJQgc28gdGhlIG9uLWNhbnZhcyBvdmVybGF5cywgdGhlXG4gICAqIHNlbGVjdGlvbiBwcm9qZWN0aW9uLCBhbmQgdGhlIFJlZ2lvbnMgdGFibGUga2VlcCB3b3JraW5nIHVuY2hhbmdlZFxuICAgKiAodGhleSBhbGwgcmVhZCB7QGxpbmsgZ2V0UmVnaW9uc30pLiBUaGUgb3RoZXIgc2xpY2VzIGxpdmUgaW5cbiAgICoge0BsaW5rIHJlZ2lvbnNCeVNsaWNlfTsge0BsaW5rIHNldERpc3BsYXlTbGljZX0gc3dhcHMgdGhlIGxpdmUgc2V0IG9uIHNjcnViXG4gICAqIGFuZCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfSBmbGF0dGVucyBldmVyeSBzbGljZSAoZWFjaCB0YWdnZWQgd2l0aCBpdHNcbiAgICogemVyby1iYXNlZCB7QGxpbmsgUmVnaW9uLnp9KSBmb3Igc2F2ZS9leHBvcnQuIE9mZiBieSBkZWZhdWx0IChzdGFja01vZGVcbiAgICogZmFsc2UsIHogMCksIHNvIHNpbmdsZS1wbGFuZSBpbWFnZXMgYXJlIGNvbXBsZXRlbHkgdW5hZmZlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVnaW9uc0J5U2xpY2UgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gIHByaXZhdGUgc3RhY2tNb2RlID0gZmFsc2U7XG4gIHByaXZhdGUgY3VycmVudFNsaWNlWiA9IDA7XG4gIC8qKiBIb3cgYSBzdGFjaydzIHJlZ2lvbnMgcm91bmQtdHJpcCB0byBkaXNrIChqaXQtdWkjOTMpOiBgY29tYmluZWRgIHdyaXRlcyBvbmVcbiAgICogIHotaW5kZXhlZCBnZW9qc29uIChzaW5nbGUtZmlsZSB6LXN0YWNrLCBRdVBhdGggc2NoZW1hKTsgYHBlci1zbGljZS1maWxlYFxuICAgKiAgd3JpdGVzIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlIChhIGZvbGRlciBvZiBudW1iZXJlZCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHN0YWNrU2F2ZUxheW91dDogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScgPSAnY29tYmluZWQnO1xuICAvKiogU2xpY2VzIHRoYXQgd2VyZSBsb2FkZWQgd2l0aCByZWdpb25zIChqaXQtdWkjOTMpLiBBIHBlci1zbGljZS1maWxlIHNhdmVcbiAgICogIHJlLXdyaXRlcyB0aGVzZSBldmVuIHdoZW4gbm93IGVtcHR5LCBzbyBjbGVhcmluZyBhIHNsaWNlJ3MgcmVnaW9ucyBhbmRcbiAgICogIHNhdmluZyByZW1vdmVzIGl0cyBwcmV2aW91c2x5LXNhdmVkIGdlb2pzb24gKHdyaXRlcyBhbiBlbXB0eSBvbmUpLiAqL1xuICBwcml2YXRlIHN0YWNrSW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLyoqIFNlbGVjdGlvbiBpcyB0cmFja2VkIGJ5IHJlZ2lvbiAqaWQqIGludGVybmFsbHkgKHN0YWJsZSBhY3Jvc3MgZWRpdHMpIGFuZFxuICAgKiAgcHJvamVjdGVkIHRvIGFycmF5IGluZGljZXMgb24gdGhlIElSZWdpb25TdG9yZSBib3VuZGFyeS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZElkczogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RlZEluZGljZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXJbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblVwZGF0ZSQgPSBuZXcgU3ViamVjdDxSZWdpb25bXT4oKTtcbiAgLyoqIE5vbi1jb2FsZXNjZWQgc2libGluZyBvZiByZWdpb25VcGRhdGUkOiBmaXJlcyBvbiBldmVyeSBjaGFuZ2UgZXZlbiBkdXJpbmcgYVxuICAgKiAgYmF0Y2hlZCBkcmFnLCBzbyBsaXZlIGNvbnN1bWVycyAoaW50ZW5zaXR5IGluc2V0KSB1cGRhdGUgcGVyIGZyYW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbkxpdmVFZGl0JCA9IG5ldyBTdWJqZWN0PFJlZ2lvbltdPigpO1xuXG4gIC8qKiBFbWl0IGNvYWxlc2NpbmcgZm9yIGxpdmUgZHJhZ3MgKHNlZSBJUmVnaW9uRWRpdEFwaS5iZWdpbkJhdGNoKS4gKi9cbiAgcHJpdmF0ZSBiYXRjaERlcHRoID0gMDtcbiAgcHJpdmF0ZSBwZW5kaW5nRW1pdCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGxvdFV0aWxpdGllcyA9IG5ldyBQbG90VXRpbGl0aWVzKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlKSB7fVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgKG9yLCB3aXRoIGBhcHBlbmRgLCBhZGQgdG8pIHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9ucy4gTWludHMgaWRzXG4gICAqIGFuZCBkZWZhdWx0IG5hbWVzLCBhcHBsaWVzIHN0b3JlZCBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzLCBhbmQgZW1pdHMuIFdoZW5cbiAgICogYGlzUmVnaW9uU2F2ZU9uYCBpcyBmYWxzZSB0aGUgcmVnaW9ucyBhcmUgc2hvd24gdHJhbnNpZW50bHkgKGVtaXR0ZWQpIGJ1dFxuICAgKiBub3Qgc3RvcmVkIOKAlCBtaXJyb3JzIHRoZSBwcmV2aW91cyBQbG90bHkgYmVoYXZpb3VyLlxuICAgKi9cbiAgc2V0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbiwgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgICAgICAgICAgIGZpbGxDb2xvcj86IHN0cmluZywgYXBwZW5kOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoc2hvd1JlZ2lvbkxhYmVsID09PSB1bmRlZmluZWQpIHNob3dSZWdpb25MYWJlbCA9IHRoaXMuc2hvd1NoYXBlTGFiZWw7XG4gICAgaWYgKGlzUmVnaW9uU2F2ZU9uID09PSB1bmRlZmluZWQpIGlzUmVnaW9uU2F2ZU9uID0gdGhpcy5pc1JlZ2lvblNhdmVkT247XG4gICAgaWYgKGZpbGxDb2xvciA9PT0gdW5kZWZpbmVkKSBmaWxsQ29sb3IgPSB0aGlzLmZpbGxDb2xvcjtcblxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHJlZ2lvbnMpIHtcbiAgICAgIGlmIChyZWdpb24uaWQgPT0gbnVsbCkgcmVnaW9uLmlkID0gdGhpcy5uZXh0SWQrKztcbiAgICAgIGlmIChyZWdpb24ubmFtZSA9PSBudWxsKSByZWdpb24ubmFtZSA9IGBzaGFwZSR7cmVnaW9uLmlkfWA7XG4gICAgICAvLyBKU09OIGluLCBjbGFzcyBpbnN0YW5jZXMgb3V0IOKAlCBldmVyeXRoaW5nIGRvd25zdHJlYW0gKHRoZSBvdmVybGF5cydcbiAgICAgIC8vIHJlbmRlcmluZywgZ2VvbWV0cnkgZGUtZHVwLCBtb3ZlUmVnaW9uLCBHZW9KU09OIGV4cG9ydCkgZGlzY3JpbWluYXRlc1xuICAgICAgLy8gdGhlIGJvdW5kcyB3aXRoIGBpbnN0YW5jZW9mYCAoaml0LXVpIzEyNCkuXG4gICAgICByZWdpb24uYm91bmRzID0gaHlkcmF0ZUJvdW5kcyhyZWdpb24uYm91bmRzKTtcbiAgICB9XG4gICAgdGhpcy5hcHBseUNsYXNzaWZpY2F0aW9uQ29sb3JzKHJlZ2lvbnMpO1xuXG4gICAgdGhpcy5pc1JlZ2lvblNhdmVkT24gPSBpc1JlZ2lvblNhdmVPbjtcbiAgICBpZiAoaXNSZWdpb25TYXZlT24pIHtcbiAgICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgICB0aGlzLnNob3dTaGFwZUxhYmVsID0gc2hvd1JlZ2lvbkxhYmVsO1xuICAgICAgdGhpcy5maWxsQ29sb3IgPSBmaWxsQ29sb3I7XG4gICAgICBpZiAoYXBwZW5kKSB7XG4gICAgICAgIC8vIFJlamVjdCBieSBpZCBjb2xsaXNpb24gKGFscmVhZHkgdHJhY2tlZCkgb3IgZ2VvbWV0cnkgZXF1YWxpdHkgKHNhbWVcbiAgICAgICAgLy8gY29vcmRpbmF0ZXMpIOKAlCB0aGUgZmluZCBidXR0b24gY2FuIHB1c2ggdGhlIHNhbWUgcmVnaW9uIHJlcGVhdGVkbHkuXG4gICAgICAgIGNvbnN0IGFkZGVkID0gcmVnaW9ucy5maWx0ZXIociA9PlxuICAgICAgICAgICF0aGlzLnJlZ2lvbnMuc29tZShleGlzdGluZyA9PiBleGlzdGluZy5pZCA9PT0gci5pZCB8fCB0aGlzLnJlZ2lvbnNFcXVhbChleGlzdGluZywgcikpKTtcbiAgICAgICAgdGhpcy5yZWdpb25zID0gdGhpcy5yZWdpb25zLmNvbmNhdChhZGRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZ2lvbnMgPSByZWdpb25zLnNsaWNlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmVtaXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhbnNpZW50IGRpc3BsYXkgb25seSDigJQgZG9uJ3QgdG91Y2ggc3RvcmVkIHN0YXRlLlxuICAgICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQocmVnaW9ucy5zbGljZSgpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIGNhbm9uaWNhbCBhY2Nlc3NvcjogY3VycmVudCBpbWFnZSdzIHJlZ2lvbnMgKGxpdmUgaW5zdGFuY2VzKS4gKi9cbiAgZ2V0UmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9ucy5zbGljZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBlci1zbGljZSByZWdpb25zIGZvciB6LXN0YWNrcyAoaml0LXVpIzkzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVHJ1ZSB3aGlsZSBhIHotc3RhY2sgaXMgbG9hZGVkIGFuZCB0aGUgc3RvcmUgaG9sZHMgcmVnaW9ucyBwZXIgc2xpY2UuICovXG4gIGlzU3RhY2tNb2RlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdGFja01vZGU7IH1cblxuICAvKiogVGhlIGN1cnJlbnQgZGlzcGxheSBzbGljZSAoemVyby1iYXNlZCkuICovXG4gIGdldERpc3BsYXlTbGljZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5jdXJyZW50U2xpY2VaOyB9XG5cbiAgLyoqIEhvdyB0aGUgY3VycmVudCBzdGFjayBwZXJzaXN0cyB0byBkaXNrIChqaXQtdWkjOTMpOiBgY29tYmluZWRgID0gb25lXG4gICAqICB6LWluZGV4ZWQgZ2VvanNvbiAoc2luZ2xlLWZpbGUgei1zdGFjayk7IGBwZXItc2xpY2UtZmlsZWAgPSBvbmUgZ2VvanNvbiBwZXJcbiAgICogIHNsaWNlLWZpbGUgKGZvbGRlciBzdGFjaykuIE1lYW5pbmdsZXNzIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U3RhY2tTYXZlTGF5b3V0KCk6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnIHsgcmV0dXJuIHRoaXMuc3RhY2tTYXZlTGF5b3V0OyB9XG5cbiAgLyoqXG4gICAqIEVudGVyIHBlci1zbGljZSBzdGFjayBtb2RlLiBgc2xpY2VzYCBtYXBzIGVhY2ggemVyby1iYXNlZCBzbGljZSBpbmRleCB0b1xuICAgKiB0aGUgcmVnaW9ucyBpbXBvcnRlZCBmb3IgdGhhdCBzbGljZTsgdGhlIHN0b3JlIG1ha2VzIGBpbml0aWFsWmAncyBzbGljZSB0aGVcbiAgICogbGl2ZSBzZXQsIHNvIHRoZSBvdmVybGF5cyAvIHNlbGVjdGlvbiAvIFJlZ2lvbnMgdGFibGUgYXJlIHVuY2hhbmdlZCAodGhleVxuICAgKiBzdGlsbCByZWFkIHtAbGluayBnZXRSZWdpb25zfSkuIEZyZXNobHktY3JlYXRlZCByZWdpb25zIGFyZSB0YWdnZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzbGljZSBzbyB0aGV5IHBlcnNpc3Qgb24gaXQsIGFuZCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfSByZXR1cm5zXG4gICAqIGV2ZXJ5IHNsaWNlIGZvciBzYXZlL2V4cG9ydC4gSWRzL25hbWVzL2NsYXNzaWZpY2F0aW9uIGNvbG91cnMgYXJlIG1pbnRlZFxuICAgKiBleGFjdGx5IGFzIHtAbGluayBzZXRSZWdpb25zfSBkb2VzLlxuICAgKi9cbiAgZW50ZXJTdGFja01vZGUoc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sIGluaXRpYWxaID0gMCxcbiAgICAgICAgICAgICAgICAgc2F2ZUxheW91dDogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScgPSAnY29tYmluZWQnKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja01vZGUgPSB0cnVlO1xuICAgIHRoaXMuc3RhY2tTYXZlTGF5b3V0ID0gc2F2ZUxheW91dDtcbiAgICB0aGlzLmN1cnJlbnRTbGljZVogPSBpbml0aWFsWiB8fCAwO1xuICAgIHRoaXMucmVnaW9uc0J5U2xpY2UgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgdGhpcy5zdGFja0luaXRpYWxOb25FbXB0eSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHNsaWNlcykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplU2xpY2UocmVncyB8fCBbXSwgeik7XG4gICAgICB0aGlzLnJlZ2lvbnNCeVNsaWNlLnNldCh6LCBub3JtYWxpemVkKTtcbiAgICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCkgdGhpcy5zdGFja0luaXRpYWxOb25FbXB0eS5hZGQoeik7XG4gICAgfVxuICAgIHRoaXMucmVnaW9ucyA9ICh0aGlzLnJlZ2lvbnNCeVNsaWNlLmdldCh0aGlzLmN1cnJlbnRTbGljZVopID8/IFtdKS5zbGljZSgpO1xuICAgIHRoaXMucHJldmlvdXNSZWdpb25zID0gdGhpcy5yZWdpb25zLnNsaWNlKCk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtdO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICAvKiogTGVhdmUgc3RhY2sgbW9kZSAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YWNrTW9kZSkgcmV0dXJuO1xuICAgIHRoaXMuc3RhY2tNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5jdXJyZW50U2xpY2VaID0gMDtcbiAgICB0aGlzLnJlZ2lvbnNCeVNsaWNlID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIHRoaXMuc3RhY2tJbml0aWFsTm9uRW1wdHkgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IGEgZGlmZmVyZW50IHNsaWNlOiBjYXB0dXJlIHRoZSBjdXJyZW50IHNsaWNlJ3MgKHBvc3NpYmx5IGVkaXRlZClcbiAgICogcmVnaW9ucyBiYWNrIGludG8gdGhlIHBlci1zbGljZSBzdG9yZSwgdGhlbiBsb2FkIHRoZSB0YXJnZXQgc2xpY2UncyByZWdpb25zXG4gICAqIGFzIHRoZSBsaXZlIHNldCBhbmQgZW1pdC4gVW5kbyBuZXZlciBjcm9zc2VzIGEgc2xpY2UuIE91dHNpZGUgc3RhY2sgbW9kZVxuICAgKiB0aGlzIG9ubHkgcmVjb3JkcyB0aGUgcmVxdWVzdGVkIHNsaWNlIGluZGV4IChhIG5vLW9wIG90aGVyd2lzZTogc2luZ2xlLXBsYW5lXG4gICAqIHJlZ2lvbnMgc3RheSBvbiB0aGUgZGVmYXVsdCBwbGFuZSDigJQgYWRkUmVnaW9uIHRhZ3MgUmVnaW9uLnogb25seSBpbiBzdGFja1xuICAgKiBtb2RlLCBzbyB0aGUgcmVjb3JkZWQgaW5kZXggaXMgdW51c2VkIHVudGlsIGEgc3RhY2sgaXMgZW50ZXJlZCkuIChqaXQtdWkjOTMpXG4gICAqL1xuICBzZXREaXNwbGF5U2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHogfHwgMDtcbiAgICBpZiAoIXRoaXMuc3RhY2tNb2RlKSB7IHRoaXMuY3VycmVudFNsaWNlWiA9IG5leHQ7IHJldHVybjsgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRTbGljZVogPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLnJlZ2lvbnNCeVNsaWNlLnNldCh0aGlzLmN1cnJlbnRTbGljZVosIHRoaXMucmVnaW9ucy5zbGljZSgpKTtcbiAgICB0aGlzLmN1cnJlbnRTbGljZVogPSBuZXh0O1xuICAgIHRoaXMucmVnaW9ucyA9ICh0aGlzLnJlZ2lvbnNCeVNsaWNlLmdldChuZXh0KSA/PyBbXSkuc2xpY2UoKTtcbiAgICB0aGlzLnByZXZpb3VzUmVnaW9ucyA9IHRoaXMucmVnaW9ucy5zbGljZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRJZHMgPSBbXTtcbiAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgIHRoaXMucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHNsaWNlJ3MgcmVnaW9ucyBmb3Igc2F2ZS9leHBvcnQsIGVhY2ggdGFnZ2VkIHdpdGggaXRzIHplcm8tYmFzZWRcbiAgICogc2xpY2UgaW5kZXggaW4ge0BsaW5rIFJlZ2lvbi56fS4gQ2FwdHVyZXMgdGhlIGN1cnJlbnQgc2xpY2UncyBsaXZlIGVkaXRzXG4gICAqIGZpcnN0LiBSZXR1cm5zIHRoZSBmbGF0IHNpbmdsZS1wbGFuZSBzZXQgd2hlbiBub3QgaW4gc3RhY2sgbW9kZS4gKGppdC11aSM5MylcbiAgICovXG4gIGdldFNsaWNlUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgaWYgKCF0aGlzLnN0YWNrTW9kZSkgcmV0dXJuIHRoaXMucmVnaW9ucy5zbGljZSgpO1xuICAgIHRoaXMucmVnaW9uc0J5U2xpY2Uuc2V0KHRoaXMuY3VycmVudFNsaWNlWiwgdGhpcy5yZWdpb25zLnNsaWNlKCkpO1xuICAgIGNvbnN0IG91dDogUmVnaW9uW10gPSBbXTtcbiAgICBjb25zdCB6cyA9IEFycmF5LmZyb20odGhpcy5yZWdpb25zQnlTbGljZS5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBmb3IgKGNvbnN0IHogb2YgenMpIHtcbiAgICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlZ2lvbnNCeVNsaWNlLmdldCh6KSBhcyBSZWdpb25bXSkge1xuICAgICAgICByLnogPSB6O1xuICAgICAgICBvdXQucHVzaChyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTbGljZXMgdG8gd3JpdGUgb24gYSBwZXItc2xpY2UtZmlsZSBzYXZlIChmb2xkZXIgc3RhY2ssIGppdC11aSM5Myk6IGV2ZXJ5XG4gICAqIHNsaWNlIHRoYXQgY3VycmVudGx5IGhhcyByZWdpb25zLCBQTFVTIHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSBidXRcbiAgICogYXJlIG5vdyBlbXB0eSAoc28gdGhlaXIgZmlsZSBpcyByZS13cml0dGVuIGVtcHR5LCBjbGVhcmluZyBhIHNsaWNlIHdob3NlXG4gICAqIHJlZ2lvbnMgdGhlIHVzZXIgZGVsZXRlZCkuIEVhY2ggcmV0dXJuZWQgcmVnaW9uIGlzIHRhZ2dlZCB3aXRoIGl0cyB6LCBhbmRcbiAgICogdGhlIGN1cnJlbnQgbGl2ZSBzbGljZSBpcyBjYXB0dXJlZCBmaXJzdC4gRW1wdHkgb3V0c2lkZSBzdGFjayBtb2RlLlxuICAgKi9cbiAgZ2V0U3RhY2tTYXZlU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGlmICghdGhpcy5zdGFja01vZGUpIHJldHVybiBvdXQ7XG4gICAgdGhpcy5yZWdpb25zQnlTbGljZS5zZXQodGhpcy5jdXJyZW50U2xpY2VaLCB0aGlzLnJlZ2lvbnMuc2xpY2UoKSk7XG4gICAgY29uc3QgenMgPSBuZXcgU2V0PG51bWJlcj4odGhpcy5zdGFja0luaXRpYWxOb25FbXB0eSk7XG4gICAgZm9yIChjb25zdCBbeiwgcmVnc10gb2YgdGhpcy5yZWdpb25zQnlTbGljZSkgaWYgKHJlZ3MubGVuZ3RoKSB6cy5hZGQoeik7XG4gICAgZm9yIChjb25zdCB6IG9mIEFycmF5LmZyb20oenMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSkge1xuICAgICAgY29uc3QgcmVncyA9ICh0aGlzLnJlZ2lvbnNCeVNsaWNlLmdldCh6KSA/PyBbXSkubWFwKChyKSA9PiB7IHIueiA9IHo7IHJldHVybiByOyB9KTtcbiAgICAgIG91dC5zZXQoeiwgcmVncyk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogTWludCBpZHMvbmFtZXMgKyBhcHBseSBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzICsgdGFnIHRoZSBzbGljZSBpbmRleCwgYXNcbiAgICogIHtAbGluayBzZXRSZWdpb25zfSBkb2VzLCBmb3IgcmVnaW9ucyBlbnRlcmluZyB0aGUgcGVyLXNsaWNlIHN0b3JlLiAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVNsaWNlKHJlZ2lvbnM6IFJlZ2lvbltdLCB6OiBudW1iZXIpOiBSZWdpb25bXSB7XG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgcmVnaW9ucykge1xuICAgICAgaWYgKHJlZ2lvbi5pZCA9PSBudWxsKSByZWdpb24uaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgICAgaWYgKHJlZ2lvbi5uYW1lID09IG51bGwpIHJlZ2lvbi5uYW1lID0gYHNoYXBlJHtyZWdpb24uaWR9YDtcbiAgICAgIHJlZ2lvbi56ID0gejtcbiAgICAgIHJlZ2lvbi5ib3VuZHMgPSBoeWRyYXRlQm91bmRzKHJlZ2lvbi5ib3VuZHMpOyAgIC8vIGppdC11aSMxMjRcbiAgICB9XG4gICAgdGhpcy5hcHBseUNsYXNzaWZpY2F0aW9uQ29sb3JzKHJlZ2lvbnMpO1xuICAgIHJldHVybiByZWdpb25zLnNsaWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VkIHBvbHlnb25zIHByb2plY3RlZCBmb3IgaW1hZ2UtcHJvY2Vzc2luZyBjb25zdW1lcnMgKHNlZ21lbnRhdGlvbixcbiAgICogdHJhY2UgYnVpbGRlcnMpLiBPcGVuIHBvbHlsaW5lcyBhcmUgYW5ub3RhdGlvbi1vbmx5IGFuZCBleGNsdWRlZC4gUmV1c2VzXG4gICAqIHRoZSBuZXV0cmFsIFBsb3RVdGlsaXRpZXMgcHJvamVjdGlvbiBzbyBvdXRwdXQgbWF0Y2hlcyB0aGUgcHJldmlvdXMgcGF0aC5cbiAgICovXG4gIGdldFJlZ2lvblBvbHlnb25zKCk6IGFueVtdIHtcbiAgICBjb25zdCByZXQ6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgdGhpcy5yZWdpb25zKSB7XG4gICAgICBjb25zdCBwb2x5OiBhbnkgPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0UG9seWdvbih7IC4uLnJlZ2lvbi5nZXRTaGFwZSh0aGlzLnNob3dTaGFwZUxhYmVsKSB9KTtcbiAgICAgIGlmIChwb2x5ID09IG51bGwgfHwgcG9seS5jbG9zZWQgPT09IGZhbHNlKSBjb250aW51ZTtcbiAgICAgIHJldC5wdXNoKHBvbHkpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblVwZGF0ZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogTGl2ZSAobm9uLWNvYWxlc2NlZCkgcmVnaW9uLWNoYW5nZSBzdHJlYW0g4oCUIGZpcmVzIHBlciBmcmFtZSBkdXJpbmcgYSBkcmFnLlxuICAgKiAgVXNlZCBieSB0aGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgc28gaXQgdHJhY2tzIGxpbmUgUk9JcyBsaXZlLiAqL1xuICBnZXRSZWdpb25MaXZlRWRpdCQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkxpdmVFZGl0JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogU2VsZWN0IHJlZ2lvbnMgYnkgYXJyYXkgaW5kZXggKG9yIFtdIHRvIGNsZWFyKS4gU3RvcmVkIGludGVybmFsbHkgYnkgaWRcbiAgICogIHNvIHRoZSBzZWxlY3Rpb24gc3Vydml2ZXMgc3Vic2VxdWVudCBlZGl0cy9yZW9yZGVycy4gKi9cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCBpZHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzIHx8IFtdKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpKSB8fCBpIDwgMCB8fCBpID49IHRoaXMucmVnaW9ucy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaWQgPSB0aGlzLnJlZ2lvbnNbaV0uaWQ7XG4gICAgICBpZiAoIXNlZW4uaGFzKGlkKSkgeyBzZWVuLmFkZChpZCk7IGlkcy5wdXNoKGlkKTsgfVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gaWRzO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgLyoqIFNlbGVjdCBhIHNpbmdsZSByZWdpb24gYnkgaWRlbnRpdHkgKGlkKS4gQmFja2VuZHMgY2FsbCB0aGlzIGZyb20gdGhlaXJcbiAgICogIGBzZWxlY3RSZWdpb24oKWA7IHRoZSBPU0Qgb3ZlcmxheSArIHJlZ2lvbiBlZGl0b3IgaGlnaGxpZ2h0IG9mZiB0aGVcbiAgICogIHJlc3VsdGluZyBzZWxlY3Rpb24gZW1pdC4gTm8tb3AgaWYgdGhlIHJlZ2lvbiBpc24ndCBpbiB0aGUgc3RvcmUuICovXG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQge1xuICAgIGlmIChyZWdpb24/LmlkID09IG51bGwgfHwgdGhpcy5pbmRleE9mSWQocmVnaW9uLmlkKSA8IDApIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gW3JlZ2lvbi5pZF07XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW5kaWNlcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgY3VycmVudCBzZWxlY3Rpb24gKGFycmF5IGluZGljZXMpIOKAlCBmb3IgY2FsbGVycyB0aGF0IG5lZWQgdG9cbiAgICogIHJlYWQgdGhlIHNlbGVjdGlvbiB3aXRob3V0IHN1YnNjcmliaW5nLiAqL1xuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRpY2VzJC52YWx1ZTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZWdpb25zIGFuZCBjbGVhciB0aGUgc2VsZWN0aW9uLiAqL1xuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZElkcyk7XG4gICAgdGhpcy5yZWdpb25zID0gdGhpcy5yZWdpb25zLmZpbHRlcihyID0+ICFpZHMuaGFzKHIuaWQpKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gW107XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IGNvbG91cnMgLyBsYWJlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnNob3dTaGFwZUxhYmVsOyB9XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc2hhcGVDb2xvcjsgfVxuICBnZXRGaWxsQ29sb3IoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZmlsbENvbG9yOyB9XG5cbiAgLyoqIENvbnZlbmllbmNlIHNldHRlcnMgKG5vdCBvbiB0aGUgY29udHJhY3QpIGZvciB0b29sYmFyIHdpcmluZy4gKi9cbiAgc2V0U2hvd1NoYXBlTGFiZWwoc2hvdzogYm9vbGVhbik6IHZvaWQgeyB0aGlzLnNob3dTaGFwZUxhYmVsID0gc2hvdzsgfVxuICBzZXRTaGFwZUNvbG9yKGNvbG9yOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5zaGFwZUNvbG9yID0gY29sb3I7IH1cbiAgc2V0RmlsbENvbG9yKGNvbG9yOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5maWxsQ29sb3IgPSBjb2xvcjsgfVxuXG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4geyByZXR1cm4gdGhpcy5zdG9yZS5nZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOyB9XG4gIHNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWw6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQgeyB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTsgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IHByZXZpb3VzLXNoYXBlcyBidWZmZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJlLXNob3cgdGhlIGxhc3Qgc2F2ZWQgc25hcHNob3QgKHRyYW5zaWVudCDigJQgZG9lcyBub3QgYWx0ZXIgc3RvcmVkIHN0YXRlKS4gKi9cbiAgcGxvdFByZXZpb3VzU2hhcGVzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMucHJldmlvdXNSZWdpb25zLnNsaWNlKCkpO1xuICB9XG4gIHNldFByZXZpb3VzU2hhcGVzKHNoYXBlczogYW55W10pOiB2b2lkIHsgdGhpcy5wcmV2aW91c1JlZ2lvbnMgPSAoc2hhcGVzIGFzIFJlZ2lvbltdKS5zbGljZSgpOyB9XG4gIGdldFByZXZpb3VzU2hhcGVzKCk6IGFueVtdIHsgcmV0dXJuIHRoaXMucHJldmlvdXNSZWdpb25zLnNsaWNlKCk7IH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlOiB1bmRvIC8gcmVkbyAoaml0LXVpIzg1KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogRW1pdHMgd2hldGhlciBhbiB1bmRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBVbmRvIGJ1dHRvbidzIGVuYWJsZWQgc3RhdGUgKGdyZXllZCBvdXQgd2hlbiBmYWxzZSkuICovXG4gIGdldENhblVuZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNhblVuZG8kLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIEVtaXRzIHdoZXRoZXIgYSByZWRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBSZWRvIGJ1dHRvbidzIGVuYWJsZWQgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNhblJlZG8kLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblVuZG8kfSDigJQgdHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSByZWdpb25cbiAgICogIGFjdGlvbiBjYW4gYmUgdW5kb25lLiAqL1xuICBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnVuZG9TdGFjay5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfSDigJQgdHJ1ZSB3aGVuIGFuIHVuZG9uZSBhY3Rpb24gY2FuXG4gICAqICBiZSByZS1hcHBsaWVkLiAqL1xuICBjYW5SZWRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZG9TdGFjay5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZG8gdGhlIG1vc3QgcmVjZW50IHJlZ2lvbiBhY3Rpb24sIHJlc3RvcmluZyB0aGUgcmVnaW9uIHNldCB0byBpdHMgc3RhdGVcbiAgICoganVzdCBiZWZvcmUgdGhhdCBhY3Rpb24gYW5kIHB1c2hpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb250byB0aGUgcmVkbyBzdGFjay5cbiAgICogVXAgdG8ge0BsaW5rIFVORE9fTElNSVR9IHN0ZXBzIGFyZSByZXRhaW5lZCwgc28gdGhpcyBjYW4gYmUgY2FsbGVkIHVwIHRvXG4gICAqIHtAbGluayBVTkRPX0xJTUlUfSB0aW1lcyBpbiBhIHJvdyBiZWZvcmUgdGhlIGhpc3RvcnkgZW1wdGllcy4gTm8tb3Agd2hlblxuICAgKiBub3RoaW5nIGlzIGxlZnQgdG8gdW5kby5cbiAgICovXG4gIHVuZG8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy51bmRvU3RhY2sucG9wKCkgYXMgUmVnaW9uW107XG4gICAgLy8gU3Rhc2ggdGhlIGN1cnJlbnQgKHBvc3QtYWN0aW9uKSBzdGF0ZSBzbyByZWRvIGNhbiByZS1hcHBseSBpdC5cbiAgICB0aGlzLnJlZG9TdGFjay5wdXNoKHRoaXMuY2xvbmVSZWdpb25zKHRoaXMucmVnaW9ucykpO1xuICAgIGlmICh0aGlzLnJlZG9TdGFjay5sZW5ndGggPiBSZWdpb25TdG9yZS5VTkRPX0xJTUlUKSB0aGlzLnJlZG9TdGFjay5zaGlmdCgpO1xuICAgIHRoaXMucmVzdG9yZVNuYXBzaG90KHNuYXBzaG90KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRvIHRoZSBhY3Rpb24gbW9zdCByZWNlbnRseSB1bmRvbmUsIHJlc3RvcmluZyB0aGUgcmVnaW9uIHNldCB0byB0aGUgc3RhdGVcbiAgICogaXQgaGFkIGJlZm9yZSB0aGF0IHVuZG8gYW5kIHB1c2hpbmcgdGhlIGN1cnJlbnQgc3RhdGUgYmFjayBvbnRvIHRoZSB1bmRvXG4gICAqIHN0YWNrLiBOby1vcCB3aGVuIHRoZXJlJ3Mgbm90aGluZyB0byByZWRvICh0aGUgcmVkbyBzdGFjayBpcyBjbGVhcmVkIGJ5IGFueVxuICAgKiBmcmVzaCByZWdpb24gYWN0aW9uKS5cbiAgICovXG4gIHJlZG8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVkb1N0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5yZWRvU3RhY2sucG9wKCkgYXMgUmVnaW9uW107XG4gICAgdGhpcy51bmRvU3RhY2sucHVzaCh0aGlzLmNsb25lUmVnaW9ucyh0aGlzLnJlZ2lvbnMpKTtcbiAgICBpZiAodGhpcy51bmRvU3RhY2subGVuZ3RoID4gUmVnaW9uU3RvcmUuVU5ET19MSU1JVCkgdGhpcy51bmRvU3RhY2suc2hpZnQoKTtcbiAgICB0aGlzLnJlc3RvcmVTbmFwc2hvdChzbmFwc2hvdCk7XG4gIH1cblxuICAvKiogRGlzY2FyZCB0aGUgdW5kby9yZWRvIGhpc3RvcnkgKGUuZy4gb24gaW1hZ2UgbG9hZC9zd2l0Y2gg4oCUIGhpc3RvcnkgbmV2ZXJcbiAgICogIGNyb3NzZXMgaW1hZ2VzKS4gKi9cbiAgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuZG9TdGFjayA9IFtdO1xuICAgIHRoaXMucmVkb1N0YWNrID0gW107XG4gICAgdGhpcy5jbG9zZVVuZG9CdXJzdCgpO1xuICAgIGlmICh0aGlzLmNhblVuZG8kLnZhbHVlKSB0aGlzLmNhblVuZG8kLm5leHQoZmFsc2UpO1xuICAgIGlmICh0aGlzLmNhblJlZG8kLnZhbHVlKSB0aGlzLmNhblJlZG8kLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqIE1ha2UgYHNuYXBzaG90YCB0aGUgbGl2ZSByZWdpb24gc2V0IGFuZCBub3RpZnkgYm90aCBiYWNrZW5kcy4gU2hhcmVkIGJ5XG4gICAqICB7QGxpbmsgdW5kb30gYW5kIHtAbGluayByZWRvfTsgdGhlIHNuYXBzaG90IGlzIGFscmVhZHkgYSBkZXRhY2hlZCBkZWVwXG4gICAqICBjbG9uZSwgc28gaXQgYmVjb21lcyB0aGUgbGl2ZSBhcnJheSBkaXJlY3RseS4gKi9cbiAgcHJpdmF0ZSByZXN0b3JlU25hcHNob3Qoc25hcHNob3Q6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgYW55IG9wZW4gY29hbGVzY2luZyBidXJzdCBzbyB0aGUgbmV4dCBlZGl0IHN0YXJ0cyBhIGZyZXNoIGVudHJ5LFxuICAgIC8vIGFuZCBmbGFnIHRoZSByZXN0b3JlIHNvIGl0IGRvZXNuJ3QgcmVjb3JkIGl0c2VsZiBiYWNrIGludG8gdGhlIGhpc3RvcnkuXG4gICAgdGhpcy5jbG9zZVVuZG9CdXJzdCgpO1xuICAgIHRoaXMucmVzdG9yaW5nVW5kbyA9IHRydWU7XG4gICAgdGhpcy5yZWdpb25zID0gc25hcHNob3Q7XG4gICAgLy8gRHJvcCBhbnkgc2VsZWN0ZWQgaWRzIHRoZSByZXN0b3JlZCBzZXQgbm8gbG9uZ2VyIGNvbnRhaW5zLlxuICAgIHRoaXMuc2VsZWN0ZWRJZHMgPSB0aGlzLnNlbGVjdGVkSWRzLmZpbHRlcihpZCA9PiB0aGlzLmluZGV4T2ZJZChpZCkgPj0gMCk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnJlc3RvcmluZ1VuZG8gPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRVbmRvU3RhdGUoKTtcbiAgICAvLyBOb3RpZnkgdGhlIGxpdmUgKyBjb2FsZXNjZWQgc3RyZWFtcyBzbyB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW5cbiAgICAvLyByZS1yZW5kZXJzIGZyb20gdGhlIHJlc3RvcmVkIHN0b3JlIHN0YXRlLlxuICAgIHRoaXMucmVnaW9uTGl2ZUVkaXQkLm5leHQodGhpcy5yZWdpb25zLnNsaWNlKCkpO1xuICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMuZ2V0UmVnaW9ucygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlIHRoZSBwcmUtYWN0aW9uIHJlZ2lvbiBzZXQgaW50byB0aGUgYm91bmRlZCB1bmRvIGhpc3RvcnkuIENhbGxlZCBhdFxuICAgKiB0aGUgdG9wIG9mIGV2ZXJ5IG11dGF0aW5nIG9wZXJhdGlvbiwgKmJlZm9yZSogaXQgY2hhbmdlcyBgcmVnaW9uc2AsIHNvIHRoZVxuICAgKiBzbmFwc2hvdCBpcyB0aGUgc3RhdGUgdG8gcmV0dXJuIHRvLiBSYXBpZCBjb21taXRzIGZyb20gb25lIGdlc3R1cmUgY29hbGVzY2VcbiAgICogaW50byBhIHNpbmdsZSBlbnRyeSAoc2VlIHtAbGluayB1bmRvU3RhY2t9KS4gQSBmcmVzaCBhY3Rpb24gYWxzbyBhYmFuZG9uc1xuICAgKiBhbnkgcmVkbyBmdXR1cmUuXG4gICAqL1xuICBwcml2YXRlIHJlY29yZFVuZG9TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXN0b3JpbmdVbmRvKSByZXR1cm47XG4gICAgY29uc3Qgc3RhcnRzQnVyc3QgPSAhdGhpcy51bmRvQnVyc3RPcGVuO1xuICAgIHRoaXMuYXJtVW5kb0J1cnN0KCk7XG4gICAgaWYgKCFzdGFydHNCdXJzdCkgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAvLyBtaWQtYnVyc3Qg4oCUIGtlZXAgZmlyc3Qgc25hcHNob3RcbiAgICB0aGlzLnVuZG9TdGFjay5wdXNoKHRoaXMuY2xvbmVSZWdpb25zKHRoaXMucmVnaW9ucykpO1xuICAgIGlmICh0aGlzLnVuZG9TdGFjay5sZW5ndGggPiBSZWdpb25TdG9yZS5VTkRPX0xJTUlUKSB0aGlzLnVuZG9TdGFjay5zaGlmdCgpO1xuICAgIHRoaXMucmVkb1N0YWNrID0gW107ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBuZXcgZWRpdCBpbnZhbGlkYXRlcyByZWRvXG4gICAgdGhpcy5lbWl0VW5kb1N0YXRlKCk7XG4gIH1cblxuICAvKiogUHVzaCB0aGUgY3VycmVudCBjYW4tdW5kbyAvIGNhbi1yZWRvIGF2YWlsYWJpbGl0eSB0byBzdWJzY3JpYmVycy4gKi9cbiAgcHJpdmF0ZSBlbWl0VW5kb1N0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNhblVuZG8gPSB0aGlzLnVuZG9TdGFjay5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGNhblJlZG8gPSB0aGlzLnJlZG9TdGFjay5sZW5ndGggPiAwO1xuICAgIGlmICh0aGlzLmNhblVuZG8kLnZhbHVlICE9PSBjYW5VbmRvKSB0aGlzLmNhblVuZG8kLm5leHQoY2FuVW5kbyk7XG4gICAgaWYgKHRoaXMuY2FuUmVkbyQudmFsdWUgIT09IGNhblJlZG8pIHRoaXMuY2FuUmVkbyQubmV4dChjYW5SZWRvKTtcbiAgfVxuXG4gIC8qKiAoUmUpYXJtIHRoZSBpZGxlIHRpbWVyIHRoYXQgY2xvc2VzIHRoZSBjdXJyZW50IGNvYWxlc2NpbmcgYnVyc3QuICovXG4gIHByaXZhdGUgYXJtVW5kb0J1cnN0KCk6IHZvaWQge1xuICAgIHRoaXMudW5kb0J1cnN0T3BlbiA9IHRydWU7XG4gICAgaWYgKHRoaXMudW5kb0J1cnN0VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnVuZG9CdXJzdFRpbWVyKTtcbiAgICB0aGlzLnVuZG9CdXJzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVuZG9CdXJzdE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMudW5kb0J1cnN0VGltZXIgPSBudWxsO1xuICAgIH0sIFJlZ2lvblN0b3JlLlVORE9fQ09BTEVTQ0VfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVVuZG9CdXJzdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVuZG9CdXJzdE9wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy51bmRvQnVyc3RUaW1lcikgeyBjbGVhclRpbWVvdXQodGhpcy51bmRvQnVyc3RUaW1lcik7IHRoaXMudW5kb0J1cnN0VGltZXIgPSBudWxsOyB9XG4gIH1cblxuICBwcml2YXRlIGNsb25lUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gcmVnaW9ucy5tYXAociA9PiB0aGlzLmNsb25lUmVnaW9uKHIpKTtcbiAgfVxuXG4gIC8qKiBEZWVwIGNsb25lIGEgcmVnaW9uIHNvIGFuIGluLXBsYWNlIGdlb21ldHJ5IGVkaXQgY2FuJ3QgbXV0YXRlIGEgc3RvcmVkXG4gICAqICBoaXN0b3J5IHNuYXBzaG90IChib3VuZHMgYXJlIGNsb25lZCB2aWEge0BsaW5rIGNsb25lQm91bmRzfSkuICovXG4gIHByaXZhdGUgY2xvbmVSZWdpb24ocjogUmVnaW9uKTogUmVnaW9uIHtcbiAgICBjb25zdCBjID0gbmV3IFJlZ2lvbigpO1xuICAgIE9iamVjdC5hc3NpZ24oYywgcik7XG4gICAgYy5ib3VuZHMgPSByLmJvdW5kcyA/IHRoaXMuY2xvbmVCb3VuZHMoci5ib3VuZHMpIDogci5ib3VuZHM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoci50aWxlQ29vcmRpbmF0ZXMpKSBjLnRpbGVDb29yZGluYXRlcyA9IHIudGlsZUNvb3JkaW5hdGVzLnNsaWNlKCk7XG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlOiBHZW9KU09OIEkvTyAobmV1dHJhbCBoZWxwZXJzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5wbG90VXRpbGl0aWVzLmltcG9ydFJPSXNGcm9tR2VvSnNvbihnZW9Kc29uU3RyKTtcbiAgfVxuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgdGhpcy5wbG90VXRpbGl0aWVzLnNhdmVUb0ZpbGUodGhpcy5wbG90VXRpbGl0aWVzLmV4cG9ydFJPSXNUb0dlb0pzb24ocmVnaW9ucykpO1xuICB9XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBsb3RVdGlsaXRpZXMuZXhwb3J0Uk9Jc1RvR2VvSnNvbihyZWdpb25zKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uRWRpdEFwaTogc3RydWN0dXJhbCBlZGl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhZGRSZWdpb24ocmVnaW9uOiBSZWdpb24pOiBudW1iZXIge1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgaWYgKHJlZ2lvbi5pZCA9PSBudWxsKSByZWdpb24uaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgIGlmIChyZWdpb24ubmFtZSA9PSBudWxsKSByZWdpb24ubmFtZSA9IGBzaGFwZSR7cmVnaW9uLmlkfWA7XG4gICAgcmVnaW9uLmJvdW5kcyA9IGh5ZHJhdGVCb3VuZHMocmVnaW9uLmJvdW5kcyk7ICAgLy8gaml0LXVpIzEyNFxuICAgIC8vIEEgcmVnaW9uIGRyYXduIG9uIGEgc3RhY2sgYmVsb25ncyB0byB0aGUgc2xpY2UgY3VycmVudGx5IGRpc3BsYXllZCwgc29cbiAgICAvLyBpdCBzYXZlcy9yZWxvYWRzIG9uIHRoYXQgc2xpY2UgKGppdC11aSM5MykuIE5vLW9wIGZvciBzaW5nbGUtcGxhbmUgaW1hZ2VzXG4gICAgLy8gKGN1cnJlbnRTbGljZVogc3RheXMgMCkuXG4gICAgaWYgKHRoaXMuc3RhY2tNb2RlKSByZWdpb24ueiA9IHRoaXMuY3VycmVudFNsaWNlWjtcbiAgICB0aGlzLmFwcGx5Q2xhc3NpZmljYXRpb25Db2xvcnMoW3JlZ2lvbl0pO1xuICAgIHRoaXMucmVnaW9ucy5wdXNoKHJlZ2lvbik7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtyZWdpb24uaWRdO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gICAgcmV0dXJuIHJlZ2lvbi5pZDtcbiAgfVxuXG4gIHJlbW92ZVJlZ2lvbihpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5pbmRleE9mSWQoaWQpO1xuICAgIGlmIChpZHggPCAwKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICB0aGlzLnJlZ2lvbnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IHRoaXMuc2VsZWN0ZWRJZHMuZmlsdGVyKHMgPT4gcyAhPT0gaWQpO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICB1cGRhdGVCb3VuZHMoaWQ6IG51bWJlciwgYm91bmRzOiBSZWN0YW5nbGUgfCBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uKTogdm9pZCB7XG4gICAgY29uc3QgciA9IHRoaXMuZmluZEJ5SWQoaWQpO1xuICAgIGlmICghcikgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgci5ib3VuZHMgPSB0aGlzLmNsb25lQm91bmRzKGJvdW5kcyk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIG1vdmVSZWdpb24oaWQ6IG51bWJlciwgZHg6IG51bWJlciwgZHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHIgPSB0aGlzLmZpbmRCeUlkKGlkKTtcbiAgICBpZiAoIXIgfHwgIXIuYm91bmRzKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBjb25zdCBiID0gci5ib3VuZHM7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICAgIGIueCArPSBkeDtcbiAgICAgIGIueSArPSBkeTtcbiAgICB9IGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVBvbHlnb24oYiwgZHgsIGR5KTtcbiAgICB9IGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHtcbiAgICAgIC8vIFRyYW5zbGF0ZSBldmVyeSBwYXJ0IChhbmQgaXRzIGhvbGVzKSB0b2dldGhlciAoaml0LXVpIzg1KS5cbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBiLnBvbHlnb25zKSB0aGlzLnRyYW5zbGF0ZVBvbHlnb24ocGFydCwgZHgsIGR5KTtcbiAgICB9XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBUcmFuc2xhdGUgYSBwb2x5Z29uJ3MgdmVydGljZXMgYW5kIGFueSBob2xlcyBpbiBwbGFjZSBieSAoZHgsIGR5KS4gKi9cbiAgcHJpdmF0ZSB0cmFuc2xhdGVQb2x5Z29uKHA6IFBvbHlnb24sIGR4OiBudW1iZXIsIGR5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBwLnhwb2ludHMgPSBwLnhwb2ludHMubWFwKHggPT4geCArIGR4KTtcbiAgICBwLnlwb2ludHMgPSBwLnlwb2ludHMubWFwKHkgPT4geSArIGR5KTtcbiAgICBwLmNvb3JkaW5hdGVzID0gcC54cG9pbnRzLm1hcCgoeCwgaSkgPT4gW3gsIHAueXBvaW50c1tpXV0pO1xuICAgIGlmIChwLmhvbGVzKSBwLmhvbGVzID0gcC5ob2xlcy5tYXAocmluZyA9PiByaW5nLm1hcCgoW3gsIHldKSA9PiBbeCArIGR4LCB5ICsgZHldKSk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRBcGk6IHZlcnRleCBlZGl0cyAocG9seWdvbnMgb25seSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgbW92ZVZlcnRleChpZDogbnVtYmVyLCBpbmRleDogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBvbHkgPSB0aGlzLnBvbHlnb25PZihpZCk7XG4gICAgaWYgKCFwb2x5IHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBwb2x5Lnhwb2ludHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBwb2x5Lnhwb2ludHNbaW5kZXhdID0geDtcbiAgICBwb2x5Lnlwb2ludHNbaW5kZXhdID0geTtcbiAgICBwb2x5LmNvb3JkaW5hdGVzW2luZGV4XSA9IFt4LCB5XTtcbiAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG5cbiAgLyoqIE1vdmUgYSB2ZXJ0ZXggb24gYSBwb2x5Z29uJ3MgaW50ZXJpb3IgcmluZyAoaG9sZSkg4oCUIGppdC11aSM4NS4gKi9cbiAgbW92ZUhvbGVWZXJ0ZXgoaWQ6IG51bWJlciwgaG9sZUluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcG9seSA9IHRoaXMucG9seWdvbk9mKGlkKTtcbiAgICBpZiAoIXBvbHkgfHwgIXBvbHkuaG9sZXMgfHwgaG9sZUluZGV4IDwgMCB8fCBob2xlSW5kZXggPj0gcG9seS5ob2xlcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCByaW5nID0gcG9seS5ob2xlc1tob2xlSW5kZXhdO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcmluZy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIHJpbmdbaW5kZXhdID0gW3gsIHldO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICAvKiogSW5zZXJ0IGEgdmVydGV4IG9uIGEgcG9seWdvbidzIGludGVyaW9yIHJpbmcgKGhvbGUpLCBhZnRlciBgc2VnSW5kZXhgXG4gICAqICAodGhlIGVkZ2UncyBzdGFydCB2ZXJ0ZXgpLiBOby1vcCBmb3IgYW4gb3V0LW9mLXJhbmdlIGhvbGUg4oCUIGppdC11aSM4NS4gKi9cbiAgYWRkSG9sZVZlcnRleChpZDogbnVtYmVyLCBob2xlSW5kZXg6IG51bWJlciwgc2VnSW5kZXg6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwb2x5ID0gdGhpcy5wb2x5Z29uT2YoaWQpO1xuICAgIGlmICghcG9seSB8fCAhcG9seS5ob2xlcyB8fCBob2xlSW5kZXggPCAwIHx8IGhvbGVJbmRleCA+PSBwb2x5LmhvbGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHJpbmcgPSBwb2x5LmhvbGVzW2hvbGVJbmRleF07XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBjb25zdCBhdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlZ0luZGV4ICsgMSwgcmluZy5sZW5ndGgpKTtcbiAgICByaW5nLnNwbGljZShhdCwgMCwgW3gsIHldKTtcbiAgICBpZiAocG9seS5iZXppZXIpIHRoaXMuc2VlZEhvbGVIYW5kbGVzKHBvbHkpOyAvLyBrZWVwIGhvbGUgaGFuZGxlcyBhbGlnbmVkIHRvIHRoZSByaW5nXG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgdGhlIHZlcnRleCBhdCBgaW5kZXhgIG9uIGEgcG9seWdvbidzIGludGVyaW9yIHJpbmcgKGhvbGUpLiBSZW1vdmluZ1xuICAgKiAgaXQgYmVsb3cgMyB2ZXJ0aWNlcyBkcm9wcyB0aGUgd2hvbGUgaG9sZSAoYSByaW5nIHdpdGggPCAzIHBvaW50cyBib3VuZHMgbm9cbiAgICogIGFyZWEpIOKAlCBqaXQtdWkjODUuICovXG4gIGRlbGV0ZUhvbGVWZXJ0ZXgoaWQ6IG51bWJlciwgaG9sZUluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwb2x5ID0gdGhpcy5wb2x5Z29uT2YoaWQpO1xuICAgIGlmICghcG9seSB8fCAhcG9seS5ob2xlcyB8fCBob2xlSW5kZXggPCAwIHx8IGhvbGVJbmRleCA+PSBwb2x5LmhvbGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHJpbmcgPSBwb2x5LmhvbGVzW2hvbGVJbmRleF07XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSByaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgaWYgKHJpbmcubGVuZ3RoIDw9IDMpIHtcbiAgICAgIHBvbHkuaG9sZXMuc3BsaWNlKGhvbGVJbmRleCwgMSk7XG4gICAgICBpZiAocG9seS5ob2xlcy5sZW5ndGggPT09IDApIHBvbHkuaG9sZXMgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJpbmcuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaWYgKHBvbHkuYmV6aWVyKSB0aGlzLnNlZWRIb2xlSGFuZGxlcyhwb2x5KTsgLy8ga2VlcCBob2xlIGhhbmRsZXMgYWxpZ25lZCB0byB0aGUgcmluZyhzKVxuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICBhZGRWZXJ0ZXgoaWQ6IG51bWJlciwgc2VnSW5kZXg6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwb2x5ID0gdGhpcy5wb2x5Z29uT2YoaWQpO1xuICAgIGlmICghcG9seSkgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgLy8gSW5zZXJ0IGFmdGVyIHNlZ0luZGV4ICh0aGUgc3RhcnQgdmVydGV4IG9mIHRoZSBlZGdlKS4gQ2xhbXAgdG8gcmFuZ2UuXG4gICAgY29uc3QgYXQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWdJbmRleCArIDEsIHBvbHkueHBvaW50cy5sZW5ndGgpKTtcbiAgICBwb2x5Lnhwb2ludHMuc3BsaWNlKGF0LCAwLCB4KTtcbiAgICBwb2x5Lnlwb2ludHMuc3BsaWNlKGF0LCAwLCB5KTtcbiAgICBwb2x5LmNvb3JkaW5hdGVzID0gcG9seS54cG9pbnRzLm1hcCgoeHgsIGkpID0+IFt4eCwgcG9seS55cG9pbnRzW2ldXSk7XG4gICAgcG9seS5ucG9pbnRzID0gcG9seS54cG9pbnRzLmxlbmd0aDtcbiAgICAvLyBHaXZlIHRoZSBuZXcgdmVydGV4IHNtb290aCBoYW5kbGVzIGZyb20gaXRzIG5laWdoYm91cnM7IGtlZXAgdGhlIG90aGVycydcbiAgICAvLyAocG9zc2libHkgaGFuZC1lZGl0ZWQpIGhhbmRsZXMgaW50YWN0LlxuICAgIGlmIChwb2x5LmJlemllciAmJiBwb2x5LmhhbmRsZXNJbiAmJiBwb2x5LmhhbmRsZXNPdXQpIHtcbiAgICAgIGNvbnN0IG4gPSBwb2x5Lnhwb2ludHMubGVuZ3RoO1xuICAgICAgY29uc3QgY2xvc2VkID0gcG9seS5jbG9zZWQgIT09IGZhbHNlO1xuICAgICAgY29uc3QgcHJldiA9IGNsb3NlZCA/IChhdCAtIDEgKyBuKSAlIG4gOiBNYXRoLm1heCgwLCBhdCAtIDEpO1xuICAgICAgY29uc3QgbmV4dCA9IGNsb3NlZCA/IChhdCArIDEpICUgbiA6IE1hdGgubWluKG4gLSAxLCBhdCArIDEpO1xuICAgICAgY29uc3QgdHggPSAocG9seS54cG9pbnRzW25leHRdIC0gcG9seS54cG9pbnRzW3ByZXZdKSAvIDY7XG4gICAgICBjb25zdCB0eSA9IChwb2x5Lnlwb2ludHNbbmV4dF0gLSBwb2x5Lnlwb2ludHNbcHJldl0pIC8gNjtcbiAgICAgIHBvbHkuaGFuZGxlc0luLnNwbGljZShhdCwgMCwgWy10eCwgLXR5XSk7XG4gICAgICBwb2x5LmhhbmRsZXNPdXQuc3BsaWNlKGF0LCAwLCBbdHgsIHR5XSk7XG4gICAgfVxuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICBkZWxldGVWZXJ0ZXgoaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBvbHkgPSB0aGlzLnBvbHlnb25PZihpZCk7XG4gICAgaWYgKCFwb2x5IHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBwb2x5Lnhwb2ludHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbWluID0gcG9seS5jbG9zZWQgPT09IGZhbHNlID8gMiA6IDM7XG4gICAgaWYgKHBvbHkueHBvaW50cy5sZW5ndGggPD0gbWluKSByZXR1cm47IC8vIHJlZnVzZSB0byBkZWdlbmVyYXRlIHRoZSBwb2x5Z29uXG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBwb2x5Lnhwb2ludHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBwb2x5Lnlwb2ludHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBwb2x5LmNvb3JkaW5hdGVzID0gcG9seS54cG9pbnRzLm1hcCgoeHgsIGkpID0+IFt4eCwgcG9seS55cG9pbnRzW2ldXSk7XG4gICAgcG9seS5ucG9pbnRzID0gcG9seS54cG9pbnRzLmxlbmd0aDtcbiAgICBpZiAocG9seS5iZXppZXIgJiYgcG9seS5oYW5kbGVzSW4gJiYgcG9seS5oYW5kbGVzT3V0KSB7XG4gICAgICBwb2x5LmhhbmRsZXNJbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcG9seS5oYW5kbGVzT3V0LnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICBzZXRCZXppZXIoaWQ6IG51bWJlciwgYmV6aWVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgciA9IHRoaXMuZmluZEJ5SWQoaWQpO1xuICAgIGlmICghciB8fCAhci5ib3VuZHMpIHJldHVybjtcbiAgICBpZiAoci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICBpZiAoci5ib3VuZHMuYmV6aWVyID09PSBiZXppZXIpIHJldHVybjtcbiAgICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgICB0aGlzLmFwcGx5QmV6aWVyKHIuYm91bmRzLCBiZXppZXIpO1xuICAgIH0gZWxzZSBpZiAoci5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUgJiYgYmV6aWVyKSB7XG4gICAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgICAgLy8gU21vb3RoaW5nIGEgcmVjdGFuZ2xlOiBjb252ZXJ0IGl0IHRvIGEgNC1hbmNob3IgY2xvc2VkIHBvbHlnb24gZmlyc3QuXG4gICAgICBjb25zdCBiID0gci5ib3VuZHM7XG4gICAgICBjb25zdCB4cyA9IFtiLngsIGIueCArIGIud2lkdGgsIGIueCArIGIud2lkdGgsIGIueF07XG4gICAgICBjb25zdCB5cyA9IFtiLnksIGIueSwgYi55ICsgYi5oZWlnaHQsIGIueSArIGIuaGVpZ2h0XTtcbiAgICAgIGNvbnN0IHBvbHkgPSBuZXcgUG9seWdvbigpO1xuICAgICAgcG9seS5ucG9pbnRzID0gNDtcbiAgICAgIHBvbHkueHBvaW50cyA9IHhzO1xuICAgICAgcG9seS55cG9pbnRzID0geXM7XG4gICAgICBwb2x5LmNvb3JkaW5hdGVzID0geHMubWFwKCh4LCBpKSA9PiBbeCwgeXNbaV1dKTtcbiAgICAgIHBvbHkuY2xvc2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXBwbHlCZXppZXIocG9seSwgdHJ1ZSk7XG4gICAgICByLmJvdW5kcyA9IHBvbHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjsgLy8gYmV6aWVyPWZhbHNlIG9uIGEgcmVjdGFuZ2xlOiBub3RoaW5nIHRvIGRvXG4gICAgfVxuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICAvKiogVHVybiBiZXppZXIgb24gKGFuZCBzZWVkIGVkaXRhYmxlIGhhbmRsZXMgZnJvbSB0aGUgc21vb3RoIGRlZmF1bHQpIG9yIG9mZlxuICAgKiAgKGFuZCBkcm9wIHRoZSBoYW5kbGVzKS4gKi9cbiAgcHJpdmF0ZSBhcHBseUJlemllcihwb2x5OiBQb2x5Z29uLCBiZXppZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBwb2x5LmJlemllciA9IGJlemllcjtcbiAgICBpZiAoYmV6aWVyKSB7XG4gICAgICBjb25zdCBvZmYgPSBkZWZhdWx0SGFuZGxlT2Zmc2V0cyhwb2x5Lnhwb2ludHMsIHBvbHkueXBvaW50cywgcG9seS5jbG9zZWQgIT09IGZhbHNlKTtcbiAgICAgIHBvbHkuaGFuZGxlc0luID0gb2ZmLmluO1xuICAgICAgcG9seS5oYW5kbGVzT3V0ID0gb2ZmLm91dDtcbiAgICAgIHRoaXMuc2VlZEhvbGVIYW5kbGVzKHBvbHkpOyAvLyBzbW9vdGggdGhlIGhvbGVzIHRvbyAoZG9udXQg4oaSIGJlemllciBjdXJ2ZXMgdGhlIGhvbGVzKVxuICAgIH0gZWxzZSB7XG4gICAgICBwb2x5LmhhbmRsZXNJbiA9IHVuZGVmaW5lZDtcbiAgICAgIHBvbHkuaGFuZGxlc091dCA9IHVuZGVmaW5lZDtcbiAgICAgIHBvbHkuaG9sZUhhbmRsZXNJbiA9IHVuZGVmaW5lZDtcbiAgICAgIHBvbHkuaG9sZUhhbmRsZXNPdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIChSZSlzZWVkIHBlci1ob2xlIGJlemllciBoYW5kbGVzIGZyb20gdGhlIENhdG11bGwtUm9tIGRlZmF1bHQsIHBhcmFsbGVsIHRvIGBwb2x5LmhvbGVzYC4gKi9cbiAgcHJpdmF0ZSBzZWVkSG9sZUhhbmRsZXMocG9seTogUG9seWdvbik6IHZvaWQge1xuICAgIGlmICghcG9seS5ob2xlcyB8fCAhcG9seS5ob2xlcy5sZW5ndGgpIHtcbiAgICAgIHBvbHkuaG9sZUhhbmRsZXNJbiA9IHVuZGVmaW5lZDtcbiAgICAgIHBvbHkuaG9sZUhhbmRsZXNPdXQgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluczogbnVtYmVyW11bXVtdID0gW107XG4gICAgY29uc3Qgb3V0czogbnVtYmVyW11bXVtdID0gW107XG4gICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHkuaG9sZXMpIHtcbiAgICAgIGNvbnN0IG9mZiA9IGRlZmF1bHRIYW5kbGVPZmZzZXRzKFxuICAgICAgICByaW5nLm1hcCgocCkgPT4gcFswXSksXG4gICAgICAgIHJpbmcubWFwKChwKSA9PiBwWzFdKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBpbnMucHVzaChvZmYuaW4pO1xuICAgICAgb3V0cy5wdXNoKG9mZi5vdXQpO1xuICAgIH1cbiAgICBwb2x5LmhvbGVIYW5kbGVzSW4gPSBpbnM7XG4gICAgcG9seS5ob2xlSGFuZGxlc091dCA9IG91dHM7XG4gIH1cblxuICAvKiogRHJhZyBhIGJlemllciBjb250cm9sIHBvaW50IG9uIGEgaG9sZSByaW5nIHZlcnRleCAoZG9udXQgYmV6aWVyIGVkaXRpbmcpLiAqL1xuICBtb3ZlSG9sZUJlemllckhhbmRsZShcbiAgICBpZDogbnVtYmVyLFxuICAgIGhvbGVJbmRleDogbnVtYmVyLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc2lkZTogJ2luJyB8ICdvdXQnLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBvbHkgPSB0aGlzLnBvbHlnb25PZihpZCk7XG4gICAgaWYgKCFwb2x5IHx8ICFwb2x5LmJlemllciB8fCAhcG9seS5ob2xlcyB8fCBob2xlSW5kZXggPCAwIHx8IGhvbGVJbmRleCA+PSBwb2x5LmhvbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByaW5nID0gcG9seS5ob2xlc1tob2xlSW5kZXhdO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcmluZy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIGlmICghcG9seS5ob2xlSGFuZGxlc0luIHx8ICFwb2x5LmhvbGVIYW5kbGVzT3V0KSB0aGlzLnNlZWRIb2xlSGFuZGxlcyhwb2x5KTtcbiAgICBjb25zdCBvZmZzZXQgPSBbeCAtIHJpbmdbaW5kZXhdWzBdLCB5IC0gcmluZ1tpbmRleF1bMV1dO1xuICAgIGlmIChzaWRlID09PSAnaW4nKSBwb2x5LmhvbGVIYW5kbGVzSW4hW2hvbGVJbmRleF1baW5kZXhdID0gb2Zmc2V0O1xuICAgIGVsc2UgcG9seS5ob2xlSGFuZGxlc091dCFbaG9sZUluZGV4XVtpbmRleF0gPSBvZmZzZXQ7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIG1vdmVCZXppZXJIYW5kbGUoaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlciwgc2lkZTogJ2luJyB8ICdvdXQnLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBvbHkgPSB0aGlzLnBvbHlnb25PZihpZCk7XG4gICAgaWYgKCFwb2x5IHx8ICFwb2x5LmJlemllciB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gcG9seS54cG9pbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgaWYgKCFwb2x5LmhhbmRsZXNJbiB8fCAhcG9seS5oYW5kbGVzT3V0KSB7XG4gICAgICBjb25zdCBvZmYgPSBkZWZhdWx0SGFuZGxlT2Zmc2V0cyhwb2x5Lnhwb2ludHMsIHBvbHkueXBvaW50cywgcG9seS5jbG9zZWQgIT09IGZhbHNlKTtcbiAgICAgIHBvbHkuaGFuZGxlc0luID0gb2ZmLmluO1xuICAgICAgcG9seS5oYW5kbGVzT3V0ID0gb2ZmLm91dDtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gW3ggLSBwb2x5Lnhwb2ludHNbaW5kZXhdLCB5IC0gcG9seS55cG9pbnRzW2luZGV4XV07XG4gICAgaWYgKHNpZGUgPT09ICdpbicpIHBvbHkuaGFuZGxlc0luW2luZGV4XSA9IG9mZnNldDtcbiAgICBlbHNlIHBvbHkuaGFuZGxlc091dFtpbmRleF0gPSBvZmZzZXQ7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIGJlZ2luQmF0Y2goKTogdm9pZCB7IHRoaXMuYmF0Y2hEZXB0aCsrOyB9XG4gIGVuZEJhdGNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJhdGNoRGVwdGggPiAwKSB0aGlzLmJhdGNoRGVwdGgtLTtcbiAgICBpZiAodGhpcy5iYXRjaERlcHRoID09PSAwICYmIHRoaXMucGVuZGluZ0VtaXQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0VtaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMuZ2V0UmVnaW9ucygpKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgcGVyLWltYWdlIGxpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgaW1hZ2U6IHNuYXBzaG90IHRoZSBvdXRnb2luZyByZWdpb25zLCByZXN0b3JlIHRoZVxuICAgKiBpbmNvbWluZyBpbWFnZSdzIChvciBbXSBpZiBub25lKSwgY2xlYXIgc2VsZWN0aW9uLCBhbmQgbm90aWZ5LiBJZGVtcG90ZW50XG4gICAqIGZvciB0aGUgc2FtZSBpbWFnZSAoc28gcmVwZWF0ZWQgcmVwbG90cyBvZiBvbmUgaW1hZ2Uga2VlcCBpdHMgcmVnaW9ucykuXG4gICAqL1xuICBzZXRBY3RpdmVJbWFnZShpbWFnZUluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBuZXdLZXkgPSB0aGlzLmRlcml2ZUltYWdlS2V5KGltYWdlSW5mbyk7XG4gICAgaWYgKHRoaXMuY3VycmVudEltYWdlS2V5ID09PSBuZXdLZXkpIHJldHVybjtcbiAgICAvLyBTd2l0Y2hpbmcgaW1hZ2VzIGVuZHMgYW55IHBlci1zbGljZSBzdGFjayBzZXNzaW9uIChqaXQtdWkjOTMpOyB0aGUgbG9hZGVyXG4gICAgLy8gcmUtZW50ZXJzIHN0YWNrIG1vZGUgYWZ0ZXJ3YXJkcyBpZiB0aGUgbmV3IGltYWdlIGlzIGl0c2VsZiBhIHotc3RhY2suXG4gICAgdGhpcy5leGl0U3RhY2tNb2RlKCk7XG4gICAgaWYgKHRoaXMuY3VycmVudEltYWdlS2V5KSB7XG4gICAgICB0aGlzLnJlZ2lvbnNCeUltYWdlS2V5LnNldCh0aGlzLmN1cnJlbnRJbWFnZUtleSwgdGhpcy5yZWdpb25zLnNsaWNlKCkpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRJbWFnZUtleSA9IG5ld0tleTtcbiAgICB0aGlzLnJlZ2lvbnMgPSAobmV3S2V5ICYmIHRoaXMucmVnaW9uc0J5SW1hZ2VLZXkuZ2V0KG5ld0tleSkpXG4gICAgICA/ICh0aGlzLnJlZ2lvbnNCeUltYWdlS2V5LmdldChuZXdLZXkpIGFzIFJlZ2lvbltdKS5zbGljZSgpXG4gICAgICA6IFtdO1xuICAgIHRoaXMucHJldmlvdXNSZWdpb25zID0gdGhpcy5yZWdpb25zLnNsaWNlKCk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtdO1xuICAgIC8vIFVuZG8gbmV2ZXIgY3Jvc3NlcyBhbiBpbWFnZSBzd2l0Y2guXG4gICAgdGhpcy5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQodGhpcy5nZXRSZWdpb25zKCkpO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIGVudGlyZSBwZXItaW1hZ2UgY2FjaGUgKGxvZ291dCAvIHByb2plY3Qgc3dpdGNoKS4gKi9cbiAgY2xlYXJSZWdpb25zQnlJbWFnZUtleSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbnNCeUltYWdlS2V5LmNsZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50SW1hZ2VLZXkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWdpb25zID0gW107XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IFtdO1xuICAgIHRoaXMucmVzZXRVbmRvSGlzdG9yeSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGRlcml2ZUltYWdlS2V5KGltYWdlSW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpbWFnZUluZm8pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGltYWdlSW5mby51cmxzICYmIGltYWdlSW5mby51cmxzLmxlbmd0aCA+IDAgJiYgaW1hZ2VJbmZvLnVybHNbMF0pIHtcbiAgICAgIHJldHVybiBpbWFnZUluZm8udXJsc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIGltYWdlSW5mby5maWxlTmFtZSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBlYWNoIHJlZ2lvbidzIGNvbG91ciBmcm9tIHRoZSBhbm5vdGF0aW9uLWNsYXNzIHByZXNldCBzZXQgKGppdC11aSM3MCkuXG4gICAqIFRoZSBwcmVzZXRzIGFyZSB0aGUgc291cmNlIG9mIHRydXRoIGZvciBjb2xvdXIg4oCUIHRoaXMgKipvdmVycmlkZXMgYW55IGNvbG91clxuICAgKiBlbWJlZGRlZCBpbiB0aGUgR2VvSlNPTioqICh3aGljaCB0aGUgWU9MTyB3b3JrZXIgd3JpdGVzIHRvZGF5KS4gQSBtYXRjaGluZ1xuICAgKiBwcmVzZXQgZ2l2ZXMgdGhlIGNsYXNzIGNvbG91cjsgYW4gdW5rbm93biBjbGFzcyBnZXRzIGEgZGV0ZXJtaW5pc3RpYyBmYWxsYmFja1xuICAgKiBjb2xvdXIgKGFuZCwgb25seSB3aGVuIGBhdXRvUHJvbW90ZWAgaXMgb24sIGlzIGFkZGVkIHRvIHRoZSBlZGl0YWJsZSBsaXN0KS5cbiAgICogUmVnaW9ucyB0aGUgdXNlciBleHBsaWNpdGx5IHJlY29sb3VyZWQgKGBjb2xvck92ZXJyaWRkZW5gKSBhcmUgbGVmdCB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5Q2xhc3NpZmljYXRpb25Db2xvcnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCBzZXQgPSB0aGlzLnN0b3JlLmdldFByZXNldFNldCgpO1xuICAgIGNvbnN0IGtleU9mID0gKGxhYmVsOiBzdHJpbmcpID0+XG4gICAgICBzZXQubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyBsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKSA6IGxhYmVsO1xuICAgIGNvbnN0IGtub3duID0gbmV3IFNldChzZXQuY2xhc3Nlcy5tYXAoKGMpID0+IGtleU9mKGMubmFtZSkpKTtcbiAgICBmb3IgKGNvbnN0IHJlZ2lvbiBvZiByZWdpb25zKSB7XG4gICAgICBpZiAoIXJlZ2lvbi5sYWJlbCB8fCByZWdpb24uY29sb3JPdmVycmlkZGVuKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHByZXNldCA9IGZpbmRQcmVzZXQocmVnaW9uLmxhYmVsLCBzZXQpO1xuICAgICAgaWYgKHByZXNldCkge1xuICAgICAgICByZWdpb24uY29sb3IgPSBwcmVzZXQuY29sb3I7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sb3IgPSBmYWxsYmFja0NvbG9yRm9yKHJlZ2lvbi5sYWJlbCwgc2V0LmZhbGxiYWNrUGFsZXR0ZSk7XG4gICAgICByZWdpb24uY29sb3IgPSBjb2xvcjtcbiAgICAgIGlmIChzZXQuYXV0b1Byb21vdGUgJiYgIWtub3duLmhhcyhrZXlPZihyZWdpb24ubGFiZWwpKSkge1xuICAgICAgICBrbm93bi5hZGQoa2V5T2YocmVnaW9uLmxhYmVsKSk7XG4gICAgICAgIC8vIEluIG5vcm1hbGl6ZWQgbW9kZSwgdHJpbSB0aGUgcHJvbW90ZWQgbmFtZSBzbyBsZWFkaW5nL3RyYWlsaW5nXG4gICAgICAgIC8vIHdoaXRlc3BhY2UgZG9lc24ndCBjcmVhdGUgaW52aXNpYmxlIGR1cGxpY2F0ZXMgb3Igb2RkIGRpc3BsYXkgbmFtZXMuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBzZXQubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyByZWdpb24ubGFiZWwudHJpbSgpIDogcmVnaW9uLmxhYmVsO1xuICAgICAgICB0aGlzLnN0b3JlLnVwc2VydENsYXNzKHsgbmFtZSwgY29sb3IsIHNvdXJjZTogJ2F1dG8nIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0NhY2hlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRJbWFnZUtleSkge1xuICAgICAgdGhpcy5yZWdpb25zQnlJbWFnZUtleS5zZXQodGhpcy5jdXJyZW50SW1hZ2VLZXksIHRoaXMucmVnaW9ucy5zbGljZSgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXQoKTogdm9pZCB7XG4gICAgLy8gTGl2ZS1lZGl0IGxpc3RlbmVycyAoZS5nLiB0aGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQpIHJlYWN0IG9uIEVWRVJZXG4gICAgLy8gY2hhbmdlIOKAlCBpbmNsdWRpbmcgcGVyLWZyYW1lIGR1cmluZyBhIGJhdGNoZWQgZHJhZyDigJQgc28gdGhleSB0cmFjayB0aGVcbiAgICAvLyByZWdpb24gbGl2ZS4gVGhlIG1haW4gcmVnaW9uVXBkYXRlJCBzdGF5cyBjb2FsZXNjZWQgZHVyaW5nIGEgYmF0Y2ggKGZpcmVzXG4gICAgLy8gb25jZSBvbiBlbmRCYXRjaCkgdG8ga2VlcCBoZWF2aWVyIGNvbnN1bWVycyAoUmVnaW9ucyB0YWIpIGNhbG0uXG4gICAgdGhpcy5yZWdpb25MaXZlRWRpdCQubmV4dCh0aGlzLnJlZ2lvbnMuc2xpY2UoKSk7XG4gICAgaWYgKHRoaXMuYmF0Y2hEZXB0aCA+IDApIHsgdGhpcy5wZW5kaW5nRW1pdCA9IHRydWU7IHJldHVybjsgfVxuICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMuZ2V0UmVnaW9ucygpKTtcbiAgfVxuXG4gIC8qKiBQcm9qZWN0IHNlbGVjdGVkIGlkcyB0byBjdXJyZW50IGFycmF5IGluZGljZXMsIHBydW5pbmcgaWRzIHRoYXQgbm8gbG9uZ2VyXG4gICAqICBleGlzdCwgYW5kIGVtaXQgaWYgdGhlIGluZGV4IHNldCBjaGFuZ2VkLiAqL1xuICBwcml2YXRlIGVtaXRTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBsaXZlSWRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy5zZWxlY3RlZElkcykge1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5pbmRleE9mSWQoaWQpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7IGluZGljZXMucHVzaChpZHgpOyBsaXZlSWRzLnB1c2goaWQpOyB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRJZHMgPSBsaXZlSWRzO1xuICAgIGlmICghdGhpcy5pbmRpY2VzRXF1YWwodGhpcy5zZWxlY3RlZEluZGljZXMkLnZhbHVlLCBpbmRpY2VzKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEluZGljZXMkLm5leHQoaW5kaWNlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbmRpY2VzRXF1YWwoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFJlZ2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9ucy5maW5kKHIgPT4gci5pZCA9PT0gaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmRleE9mSWQoaWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9ucy5maW5kSW5kZXgociA9PiByLmlkID09PSBpZCk7XG4gIH1cblxuICAvKiogVGhlIHJlZ2lvbidzIGJvdW5kcyBhcyBhIFBvbHlnb24sIG9yIHVuZGVmaW5lZCBpZiBpdCBpc24ndCBhIHBvbHlnb24uICovXG4gIHByaXZhdGUgcG9seWdvbk9mKGlkOiBudW1iZXIpOiBQb2x5Z29uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByID0gdGhpcy5maW5kQnlJZChpZCk7XG4gICAgcmV0dXJuIHIgJiYgci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uID8gci5ib3VuZHMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGNsb25lUG9seWdvbihwOiBQb2x5Z29uKTogUG9seWdvbiB7XG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0gcC5ucG9pbnRzO1xuICAgIHBvbHkueHBvaW50cyA9IHAueHBvaW50cy5zbGljZSgpO1xuICAgIHBvbHkueXBvaW50cyA9IHAueXBvaW50cy5zbGljZSgpO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSBwLmNvb3JkaW5hdGVzLm1hcChjID0+IGMuc2xpY2UoKSk7XG4gICAgcG9seS5jbG9zZWQgPSBwLmNsb3NlZDtcbiAgICBwb2x5LmJlemllciA9IHAuYmV6aWVyO1xuICAgIGlmIChwLmhhbmRsZXNJbikgcG9seS5oYW5kbGVzSW4gPSBwLmhhbmRsZXNJbi5tYXAobyA9PiBvLnNsaWNlKCkpO1xuICAgIGlmIChwLmhhbmRsZXNPdXQpIHBvbHkuaGFuZGxlc091dCA9IHAuaGFuZGxlc091dC5tYXAobyA9PiBvLnNsaWNlKCkpO1xuICAgIGlmIChwLmhvbGVzKSBwb2x5LmhvbGVzID0gcC5ob2xlcy5tYXAocmluZyA9PiByaW5nLm1hcChwdCA9PiBwdC5zbGljZSgpKSk7XG4gICAgaWYgKHAuaG9sZUhhbmRsZXNJbikgcG9seS5ob2xlSGFuZGxlc0luID0gcC5ob2xlSGFuZGxlc0luLm1hcChyID0+IHIubWFwKG8gPT4gby5zbGljZSgpKSk7XG4gICAgaWYgKHAuaG9sZUhhbmRsZXNPdXQpIHBvbHkuaG9sZUhhbmRsZXNPdXQgPSBwLmhvbGVIYW5kbGVzT3V0Lm1hcChyID0+IHIubWFwKG8gPT4gby5zbGljZSgpKSk7XG4gICAgcmV0dXJuIHBvbHk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lQm91bmRzKGJvdW5kczogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbik6IFJlY3RhbmdsZSB8IFBvbHlnb24gfCBNdWx0aVBvbHlnb24ge1xuICAgIGlmIChib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgICByZWN0LnggPSBib3VuZHMueDsgcmVjdC55ID0gYm91bmRzLnk7IHJlY3Qud2lkdGggPSBib3VuZHMud2lkdGg7IHJlY3QuaGVpZ2h0ID0gYm91bmRzLmhlaWdodDtcbiAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICBpZiAoYm91bmRzIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSB7XG4gICAgICBjb25zdCBtcCA9IG5ldyBNdWx0aVBvbHlnb24oKTtcbiAgICAgIG1wLnBvbHlnb25zID0gYm91bmRzLnBvbHlnb25zLm1hcChwID0+IHRoaXMuY2xvbmVQb2x5Z29uKHApKTtcbiAgICAgIHJldHVybiBtcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmVQb2x5Z29uKGJvdW5kcyk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lvbnNFcXVhbChhOiBSZWdpb24sIGI6IFJlZ2lvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJhID0gYS5ib3VuZHMsIGJiID0gYi5ib3VuZHM7XG4gICAgaWYgKGJhIGluc3RhbmNlb2YgUmVjdGFuZ2xlICYmIGJiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgICByZXR1cm4gYmEueCA9PT0gYmIueCAmJiBiYS55ID09PSBiYi55ICYmIGJhLndpZHRoID09PSBiYi53aWR0aCAmJiBiYS5oZWlnaHQgPT09IGJiLmhlaWdodDtcbiAgICB9XG4gICAgaWYgKGJhIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uICYmIGJiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSB7XG4gICAgICBpZiAoYmEucG9seWdvbnMubGVuZ3RoICE9PSBiYi5wb2x5Z29ucy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmEucG9seWdvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF0aGlzLnBvbHlnb25zRXF1YWwoYmEucG9seWdvbnNbaV0sIGJiLnBvbHlnb25zW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChiYSBpbnN0YW5jZW9mIFBvbHlnb24gJiYgYmIgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb2x5Z29uc0VxdWFsKGJhLCBiYik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcG9seWdvbnNFcXVhbChwYTogUG9seWdvbiwgcGI6IFBvbHlnb24pOiBib29sZWFuIHtcbiAgICBpZiAoKHBhLmNsb3NlZCAhPT0gZmFsc2UpICE9PSAocGIuY2xvc2VkICE9PSBmYWxzZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocGEueHBvaW50cy5sZW5ndGggIT09IHBiLnhwb2ludHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYS54cG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGEueHBvaW50c1tpXSAhPT0gcGIueHBvaW50c1tpXSB8fCBwYS55cG9pbnRzW2ldICE9PSBwYi55cG9pbnRzW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhvbGVzRXF1YWwocGEuaG9sZXMsIHBiLmhvbGVzKTtcbiAgfVxuXG4gIC8qKiBDb21wYXJlIHR3byBwb2x5Z29ucycgaW50ZXJpb3ItcmluZyAoaG9sZSkgc2V0cyBmb3IgdGhlIGRlZHVwZSBwYXRoLiAqL1xuICBwcml2YXRlIGhvbGVzRXF1YWwoYTogbnVtYmVyW11bXVtdIHwgdW5kZWZpbmVkLCBiOiBudW1iZXJbXVtdW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBjb25zdCBuYSA9IGE/Lmxlbmd0aCA/PyAwLCBuYiA9IGI/Lmxlbmd0aCA/PyAwO1xuICAgIGlmIChuYSAhPT0gbmIpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBoID0gMDsgaCA8IG5hOyBoKyspIHtcbiAgICAgIGNvbnN0IHJhID0gKGEgYXMgbnVtYmVyW11bXVtdKVtoXSwgcmIgPSAoYiBhcyBudW1iZXJbXVtdW10pW2hdO1xuICAgICAgaWYgKHJhLmxlbmd0aCAhPT0gcmIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyYVtpXVswXSAhPT0gcmJbaV1bMF0gfHwgcmFbaV1bMV0gIT09IHJiW2ldWzFdKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=