@tolle_/tolle-ui 18.3.0 → 18.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -74,6 +74,12 @@ export class ChartService {
74
74
  margin = { top: 8, right: 8, bottom: 24, left: 40 };
75
75
  /** Fraction of a band's step spent on padding, split either side. */
76
76
  bandPadding = 0.2;
77
+ /**
78
+ * Which physical axis is the category axis. Bars flip this via `configure()`;
79
+ * every other geometry getter branches on it internally, defaulting to the
80
+ * exact vertical formula when unset, so existing vertical charts are unaffected.
81
+ */
82
+ orientation = 'vertical';
77
83
  scaleMode = 'point';
78
84
  zeroRequired = false;
79
85
  domainMin = 0;
@@ -206,21 +212,36 @@ export class ChartService {
206
212
  return total;
207
213
  }
208
214
  /**
209
- * Maps a data value to an svg y. SVG y grows downward, so the domain maximum
210
- * lands on `plotTop` and the minimum on `plotBottom`.
215
+ * Maps a data value to a position along the *value* axis svg y when
216
+ * vertical (svg y grows downward, so the domain maximum lands on `plotTop`),
217
+ * svg x when horizontal (the domain maximum lands on `plotRight`).
211
218
  */
212
219
  yFor(value) {
213
220
  const span = this.domainMax - this.domainMin;
221
+ if (this.orientation === 'horizontal') {
222
+ if (span <= 0)
223
+ return this.plotLeft;
224
+ const ratio = (value - this.domainMin) / span;
225
+ return this.plotLeft + ratio * this.plotWidth;
226
+ }
214
227
  if (span <= 0)
215
228
  return this.plotBottom;
216
229
  const ratio = (value - this.domainMin) / span;
217
230
  return this.plotBottom - ratio * this.plotHeight;
218
231
  }
219
- /** The svg y of the zero line, clamped into the plot. */
232
+ /** The value-axis position of the zero line, clamped into the plot. */
220
233
  get baselineY() {
221
234
  const zero = Math.min(Math.max(0, this.domainMin), this.domainMax);
222
235
  return this.yFor(zero);
223
236
  }
237
+ /** Length of the plot along the category axis: `plotHeight` when horizontal, else `plotWidth`. */
238
+ get categoryAxisLength() {
239
+ return this.orientation === 'horizontal' ? this.plotHeight : this.plotWidth;
240
+ }
241
+ /** Origin of the plot along the category axis: `plotTop` when horizontal, else `plotLeft`. */
242
+ get categoryAxisOrigin() {
243
+ return this.orientation === 'horizontal' ? this.plotTop : this.plotLeft;
244
+ }
224
245
  /** Width of one band, excluding its padding. Meaningful in band mode. */
225
246
  get bandWidth() {
226
247
  if (this.count === 0)
@@ -231,13 +252,16 @@ export class ChartService {
231
252
  get bandStep() {
232
253
  if (this.count === 0)
233
254
  return 0;
234
- return this.plotWidth / this.count;
255
+ return this.categoryAxisLength / this.count;
235
256
  }
236
- /** Geometry of the band at `index`. */
257
+ /**
258
+ * Geometry of the band at `index`, along the category axis — x when
259
+ * vertical (today's meaning), y when horizontal.
260
+ */
237
261
  bandFor(index) {
238
262
  const step = this.bandStep;
239
263
  const width = this.bandWidth;
240
- const start = this.plotLeft + index * step + (step - width) / 2;
264
+ const start = this.categoryAxisOrigin + index * step + (step - width) / 2;
241
265
  return { start, centre: start + width / 2, width };
242
266
  }
243
267
  /** x of the data point at `index` on the point scale. */
@@ -260,7 +284,7 @@ export class ChartService {
260
284
  hitBandFor(index) {
261
285
  if (this.scaleMode === 'band') {
262
286
  const step = this.bandStep;
263
- const start = this.plotLeft + index * step;
287
+ const start = this.categoryAxisOrigin + index * step;
264
288
  return { start, centre: start + step / 2, width: step };
265
289
  }
266
290
  const x = this.pointX(index);
@@ -334,6 +358,7 @@ export class ChartService {
334
358
  this.height,
335
359
  this.bandPadding,
336
360
  this.scaleMode,
361
+ this.orientation,
337
362
  this.zeroRequired,
338
363
  this.margin.top, this.margin.right, this.margin.bottom, this.margin.left,
339
364
  this.domainMin, this.domainMax, this.tickStep,
@@ -552,4 +577,4 @@ export function buildPath(points, smooth) {
552
577
  }
553
578
  return d;
554
579
  }
555
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvY2hhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBaUN2QyxvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRW5DOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyw4QkFBOEIsQ0FBQztBQUVuRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDVCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUVqQiw0RUFBNEU7SUFDNUUsUUFBUSxDQUFDLElBQWM7UUFDckIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxRQUFRLENBQUMsR0FBVztRQUNsQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENB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QzVFLE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBa0MsRUFBRSxNQUFlO0lBQzNFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDbkMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0MsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLENBQUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqIE9uZSBwbG90dGVkIHNlcmllczogd2hpY2gga2V5IHRvIHJlYWQgb2ZmIGVhY2ggcm93LCBhbmQgaG93IHRvIG5hbWUgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0U2VyaWVzIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbi8qKiBTcGFjZSByZXNlcnZlZCBhcm91bmQgdGhlIHBsb3QgYXJlYSBmb3IgYXhlcyBhbmQgbGFiZWxzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFydE1hcmdpbiB7XG4gIHRvcDogbnVtYmVyO1xuICByaWdodDogbnVtYmVyO1xuICBib3R0b206IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xufVxuXG4vKiogQSB5LWF4aXMgdGljazogaXRzIGRhdGEgdmFsdWUsIGl0cyByZXNvbHZlZCBzdmcgeSwgYW5kIGl0cyBmb3JtYXR0ZWQgbGFiZWwuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0VGljayB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuLyoqIEEgaG9yaXpvbnRhbCBzbGljZSBvZiB0aGUgcGxvdCBiZWxvbmdpbmcgdG8gb25lIHggcG9zaXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0QmFuZCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGNlbnRyZTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG4vKiogSG93IHggcG9zaXRpb25zIGFyZSByZXNvbHZlZDogZGlzY3JldGUgYmFuZHMgKGJhcnMpIG9yIHBvaW50cyAobGluZS9hcmVhKS4gKi9cbmV4cG9ydCB0eXBlIENoYXJ0U2NhbGVNb2RlID0gJ3BvaW50JyB8ICdiYW5kJztcblxuLyoqIE51bWJlciBvZiBjaGFydCBwYWxldHRlIHN0ZXBzIHRoYXQgZXhpc3QuIEEgNnRoIHNlcmllcyBkb2VzIG5vdCBnZXQgYSBjb2xvdXIuICovXG5leHBvcnQgY29uc3QgQ0hBUlRfQ09MT1JfTElNSVQgPSA1O1xuXG4vKipcbiAqIFRoZSBwYWludCB1c2VkIGZvciBhIHNlcmllcyBwYXN0IGBDSEFSVF9DT0xPUl9MSU1JVGAuXG4gKlxuICogVGhlIHBhbGV0dGUgaXMgdmFsaWRhdGVkIGZvciBsaWdodG5lc3MsIGNocm9tYSBhbmQgY29sb3VyLWJsaW5kIHNlcGFyYXRpb24gYXRcbiAqIGV4YWN0bHkgZml2ZSBzdGVwczsgZ2VuZXJhdGluZyBhIHNpeHRoIHdvdWxkIGxhbmQgb3V0c2lkZSB0aGF0IHZhbGlkYXRpb24sIGFuZFxuICogd3JhcHBpbmcgYmFjayB0byBzdGVwIDEgd291bGQgbWFrZSB0d28gc2VyaWVzIHNoYXJlIGFuIGlkZW50aXR5LiBCb3RoIGFyZVxuICogd29yc2UgdGhhbiBkcm9wcGluZyB0byBhIG5ldXRyYWwsIHNvIHRoZSBvdmVyZmxvdyBpcyBleHBsaWNpdGx5IHVuY29sb3VyZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFSVF9PVkVSRkxPV19DT0xPUiA9ICdyZ2IodmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkpJztcblxuLyoqXG4gKiBIYW5kcyBvdXQgcGFsZXR0ZSBzdGVwcyBieSBlbnRpdHkga2V5IHJhdGhlciB0aGFuIGJ5IHBvc2l0aW9uLlxuICpcbiAqIEEga2V5IGtlZXBzIGl0cyBzbG90IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHNjYWxlLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiBjb2xvdXIgZm9sbG93IHRoZSBlbnRpdHk6IGZpbHRlcmluZyBhIHNlcmllcyBvdXQgYW5kIGJhY2sgaW4sIG9yIHJlbW92aW5nIGFuXG4gKiBlYXJsaWVyIG9uZSwgbXVzdCBuZXZlciByZXBhaW50IHRoZSBzdXJ2aXZvcnMuIFBhc3QgdGhlIGZpZnRoIGRpc3RpbmN0IGtleVxuICogdGhlIHNjYWxlIHN0b3BzIGNvbG91cmluZyByYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBzdGVwIG9yIHdyYXBwaW5nIGFyb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYXJ0Q29sb3JTY2FsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2xvdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIG5leHQgPSAwO1xuXG4gIC8qKiBSZXNlcnZlcyBzbG90cyBmb3IgYGtleXNgIGluIG9yZGVyLCBsZWF2aW5nIGFscmVhZHkta25vd24ga2V5cyBhbG9uZS4gKi9cbiAgcmVnaXN0ZXIoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoIXRoaXMuc2xvdHMuaGFzKGtleSkpIHRoaXMuc2xvdHMuc2V0KGtleSwgdGhpcy5uZXh0KyspO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQYWludCBmb3IgYGtleWAsIHJlZ2lzdGVyaW5nIGl0IG9uIGZpcnN0IHNpZ2h0LiAqL1xuICBjb2xvckZvcihrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RzLmdldChrZXkpO1xuICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNsb3QgPSB0aGlzLm5leHQrKztcbiAgICAgIHRoaXMuc2xvdHMuc2V0KGtleSwgc2xvdCk7XG4gICAgfVxuICAgIGlmIChzbG90ID49IENIQVJUX0NPTE9SX0xJTUlUKSByZXR1cm4gQ0hBUlRfT1ZFUkZMT1dfQ09MT1I7XG4gICAgcmV0dXJuICdyZ2IodmFyKC0tY2hhcnQtJyArIChzbG90ICsgMSkgKyAnKSknO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBga2V5YCBmZWxsIHBhc3QgdGhlIHBhbGV0dGUgYW5kIHJlbmRlcnMgbmV1dHJhbC4gKi9cbiAgaXNPdmVyZmxvdyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNsb3RzLmdldChrZXkpO1xuICAgIHJldHVybiBzbG90ICE9PSB1bmRlZmluZWQgJiYgc2xvdCA+PSBDSEFSVF9DT0xPUl9MSU1JVDtcbiAgfVxuXG4gIC8qKiBTbG90IGluZGV4IGFzc2lnbmVkIHRvIGBrZXlgLCBvciB1bmRlZmluZWQgd2hlbiBpdCBpcyB1bmtub3duLiAqL1xuICBzbG90T2Yoa2V5OiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNsb3RzLmdldChrZXkpO1xuICB9XG59XG5cbi8qKlxuICogT3ducyBsYXlvdXQsIHNjYWxlcyBhbmQgY29sb3VyIGFzc2lnbm1lbnQgZm9yIG9uZSBgdG9sbGUtY2hhcnRgLCBzbyBldmVyeVxuICogY2hpbGQgZHJhd3MgaW50byB0aGUgc2FtZSBjb29yZGluYXRlIHNwYWNlLiBSZW5kZXJzIG5vdGhpbmcgaXRzZWxmLlxuICpcbiAqIFByb3ZpZGVkIG9uIGBDaGFydENvbXBvbmVudGAsIHNvIGVhY2ggY2hhcnQgZ2V0cyBpdHMgb3duIGluc3RhbmNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ2hhcnRTZXJ2aWNlIHtcbiAgLyoqIFJvd3MgYmVpbmcgcGxvdHRlZCwgaW4geCBvcmRlci4gKi9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PltdID0gW107XG4gIC8qKiBTZXJpZXMgZGVmaW5pdGlvbnMsIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCB0YWtlIHBhbGV0dGUgc3RlcHMuICovXG4gIHNlcmllczogQ2hhcnRTZXJpZXNbXSA9IFtdO1xuICAvKiogUm93IGtleSBob2xkaW5nIHRoZSB4IGNhdGVnb3J5L2xhYmVsLiAqL1xuICB4S2V5ID0gJyc7XG4gIC8qKiBXaGV0aGVyIG1hcmtzIHN0YWNrIG9uIGEgc2hhcmVkIGJhc2VsaW5lIHJhdGhlciB0aGFuIHNpdHRpbmcgc2lkZSBieSBzaWRlLiAqL1xuICBzdGFja2VkID0gZmFsc2U7XG4gIC8qKiBGdWxsIHN2ZyB3aWR0aCBpbiBweCwgdHJhY2tlZCBmcm9tIHRoZSBjb250YWluZXIncyBSZXNpemVPYnNlcnZlci4gKi9cbiAgd2lkdGggPSAwO1xuICAvKiogRnVsbCBzdmcgaGVpZ2h0IGluIHB4LiAqL1xuICBoZWlnaHQgPSAyNjA7XG4gIC8qKiBTcGFjZSByZXNlcnZlZCBhcm91bmQgdGhlIHBsb3QgYXJlYS4gKi9cbiAgbWFyZ2luOiBDaGFydE1hcmdpbiA9IHsgdG9wOiA4LCByaWdodDogOCwgYm90dG9tOiAyNCwgbGVmdDogNDAgfTtcbiAgLyoqIEZyYWN0aW9uIG9mIGEgYmFuZCdzIHN0ZXAgc3BlbnQgb24gcGFkZGluZywgc3BsaXQgZWl0aGVyIHNpZGUuICovXG4gIGJhbmRQYWRkaW5nID0gMC4yO1xuXG4gIHByaXZhdGUgc2NhbGVNb2RlOiBDaGFydFNjYWxlTW9kZSA9ICdwb2ludCc7XG4gIHByaXZhdGUgemVyb1JlcXVpcmVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkb21haW5NaW4gPSAwO1xuICBwcml2YXRlIGRvbWFpbk1heCA9IDE7XG4gIHByaXZhdGUgdGlja1ZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSB0aWNrU3RlcCA9IDE7XG5cbiAgLyoqIFBhbGV0dGUgYXNzaWdubWVudCwga2V5ZWQgYnkgc2VyaWVzIGlkZW50aXR5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbG9ycyA9IG5ldyBDaGFydENvbG9yU2NhbGUoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxheW91dFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIC8qKiBFbWl0cyBhIHZlcnNpb24gbnVtYmVyIHdoZW5ldmVyIHNjYWxlcywgZGltZW5zaW9ucyBvciBkYXRhIGNoYW5nZS4gKi9cbiAgcmVhZG9ubHkgbGF5b3V0JCA9IHRoaXMubGF5b3V0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZUluZGV4U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBJbmRleCBvZiB0aGUgeCBwb3NpdGlvbiB1bmRlciB0aGUgcG9pbnRlciwgb3IgbnVsbCB3aGVuIG5vdCBob3ZlcmluZy4gKi9cbiAgcmVhZG9ubHkgYWN0aXZlSW5kZXgkID0gdGhpcy5hY3RpdmVJbmRleFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBsYXlvdXRWZXJzaW9uID0gMDtcbiAgcHJpdmF0ZSBlbWl0U2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZW9tZXRyeVxuXG4gIGdldCBwbG90TGVmdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1hcmdpbi5sZWZ0O1xuICB9XG5cbiAgZ2V0IHBsb3RUb3AoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXJnaW4udG9wO1xuICB9XG5cbiAgZ2V0IHBsb3RXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLndpZHRoIC0gdGhpcy5tYXJnaW4ubGVmdCAtIHRoaXMubWFyZ2luLnJpZ2h0KTtcbiAgfVxuXG4gIGdldCBwbG90SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMuaGVpZ2h0IC0gdGhpcy5tYXJnaW4udG9wIC0gdGhpcy5tYXJnaW4uYm90dG9tKTtcbiAgfVxuXG4gIGdldCBwbG90UmlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wbG90TGVmdCArIHRoaXMucGxvdFdpZHRoO1xuICB9XG5cbiAgZ2V0IHBsb3RCb3R0b20oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wbG90VG9wICsgdGhpcy5wbG90SGVpZ2h0O1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiB4IHBvc2l0aW9ucy4gKi9cbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGg7XG4gIH1cblxuICAvKiogSG93IHggaXMgY3VycmVudGx5IHJlc29sdmVkLiBCYXJzIGZsaXAgdGhpcyB0byAnYmFuZCcuICovXG4gIGdldCBtb2RlKCk6IENoYXJ0U2NhbGVNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5zY2FsZU1vZGU7XG4gIH1cblxuICAvKiogUmVzb2x2ZWQgeSB0aWNrcywgd2l0aCBzdmcgY29vcmRpbmF0ZXMgYW5kIGZvcm1hdHRlZCBsYWJlbHMuICovXG4gIGdldCB0aWNrcygpOiBDaGFydFRpY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMudGlja1ZhbHVlcy5tYXAoKHZhbHVlKSA9PiAoe1xuICAgICAgdmFsdWUsXG4gICAgICB5OiB0aGlzLnlGb3IodmFsdWUpLFxuICAgICAgbGFiZWw6IHRoaXMuZm9ybWF0VmFsdWUodmFsdWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IHkgZG9tYWluIGFzIFttaW4sIG1heF0uICovXG4gIGdldCBkb21haW4oKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIFt0aGlzLmRvbWFpbk1pbiwgdGhpcy5kb21haW5NYXhdO1xuICB9XG5cbiAgLyoqIFRoZSB4LWF4aXMgY2F0ZWdvcnkgbGFiZWxzLCBvbmUgcGVyIHJvdy4gKi9cbiAgZ2V0IHhMYWJlbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IHJhdyA9IHJvdz8uW3RoaXMueEtleV07XG4gICAgICByZXR1cm4gcmF3ID09IG51bGwgPyAnJyA6IFN0cmluZyhyYXcpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlZ2lzdHJhdGlvblxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgY2hhcnQncyBjb25maWd1cmF0aW9uIGFuZCByZWNvbXB1dGVzIHRoZSBzY2FsZXMuXG4gICAqIENhbGxlZCBieSB0aGUgY29udGFpbmVyIG9uIGlucHV0IGNoYW5nZXMgYW5kIG9uIHJlc2l6ZS5cbiAgICovXG4gIGNvbmZpZ3VyZShjb25maWc6IFBhcnRpYWw8UGljazxDaGFydFNlcnZpY2UsXG4gICAgJ2RhdGEnIHwgJ3NlcmllcycgfCAneEtleScgfCAnc3RhY2tlZCcgfCAnd2lkdGgnIHwgJ2hlaWdodCcgfCAnbWFyZ2luJyB8ICdiYW5kUGFkZGluZyc+Pik6IHZvaWQge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLnNlcmllcykgdGhpcy5zeW5jQ29sb3JTbG90cyhjb25maWcuc2VyaWVzKTtcbiAgICB0aGlzLnJlY29tcHV0ZSgpO1xuICB9XG5cbiAgLyoqIFN3aXRjaGVzIHggdG8gYSBiYW5kIHNjYWxlLiBCYXJzIGNhbGwgdGhpczsgaXQgYWxzbyBmb3JjZXMgemVybyBpbnRvIHRoZSBkb21haW4uICovXG4gIHVzZUJhbmRTY2FsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zY2FsZU1vZGUgPT09ICdiYW5kJyAmJiB0aGlzLnplcm9SZXF1aXJlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2NhbGVNb2RlID0gJ2JhbmQnO1xuICAgIHRoaXMuemVyb1JlcXVpcmVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlY29tcHV0ZSgpO1xuICB9XG5cbiAgLyoqIEZvcmNlcyB6ZXJvIGludG8gdGhlIHkgZG9tYWluLCBmb3IgbWFya3MgYW5jaG9yZWQgdG8gYSBiYXNlbGluZS4gKi9cbiAgcmVxdWlyZVplcm8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuemVyb1JlcXVpcmVkKSByZXR1cm47XG4gICAgdGhpcy56ZXJvUmVxdWlyZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjb21wdXRlKCk7XG4gIH1cblxuICAvKiogUmVzZXJ2ZXMgcGFsZXR0ZSBzbG90cyBpbiBzZXJpZXMgb3JkZXIsIGxlYXZpbmcga25vd24ga2V5cyB1bnRvdWNoZWQuICovXG4gIHByaXZhdGUgc3luY0NvbG9yU2xvdHMoc2VyaWVzOiBDaGFydFNlcmllc1tdKTogdm9pZCB7XG4gICAgdGhpcy5jb2xvcnMucmVnaXN0ZXIoc2VyaWVzLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYWludCBmb3IgYSBzZXJpZXMsIGtleWVkIGJ5IGlkZW50aXR5IHJhdGhlciB0aGFuIGJ5IGluZGV4IGluIHRoZSB2aXNpYmxlXG4gICAqIGFycmF5LiBQYXN0IHRoZSBmaWZ0aCBkaXN0aW5jdCBrZXkgdGhpcyByZXR1cm5zIHRoZSBuZXV0cmFsIG92ZXJmbG93IGNvbG91ci5cbiAgICovXG4gIGNvbG9yRm9yKHNlcmllc0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2xvcnMuY29sb3JGb3Ioc2VyaWVzS2V5KTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBzZXJpZXMgZmVsbCBwYXN0IHRoZSBwYWxldHRlIGFuZCByZW5kZXJzIG5ldXRyYWwuICovXG4gIGlzT3ZlcmZsb3dTZXJpZXMoc2VyaWVzS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb2xvcnMuaXNPdmVyZmxvdyhzZXJpZXNLZXkpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGhlIHNjYWxlc1xuXG4gIC8qKiBSZWFkcyBhIHNlcmllcyB2YWx1ZSBvZmYgYSByb3csIG9yIG51bGwgd2hlbiBpdCBpcyBtaXNzaW5nL25vbi1udW1lcmljLiAqL1xuICB2YWx1ZUF0KHNlcmllc0tleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5kYXRhW2luZGV4XT8uW3Nlcmllc0tleV07XG4gICAgaWYgKHJhdyA9PSBudWxsIHx8IHJhdyA9PT0gJycpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG51bSA9IE51bWJlcihyYXcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtKSA/IG51bSA6IG51bGw7XG4gIH1cblxuICAvKiogU3VtIG9mIGV2ZXJ5IHNlcmllcyBiZWxvdyBgc2VyaWVzS2V5YCBhdCBgaW5kZXhgLCBmb3Igc3RhY2tlZCBtYXJrcy4gKi9cbiAgc3RhY2tCYXNlKHNlcmllc0tleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuc3RhY2tlZCkgcmV0dXJuIDA7XG4gICAgbGV0IGJhc2UgPSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnNlcmllcykge1xuICAgICAgaWYgKGl0ZW0ua2V5ID09PSBzZXJpZXNLZXkpIGJyZWFrO1xuICAgICAgYmFzZSArPSB0aGlzLnZhbHVlQXQoaXRlbS5rZXksIGluZGV4KSA/PyAwO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIC8qKiBTdW0gb2YgZXZlcnkgc2VyaWVzIGF0IGBpbmRleGAuICovXG4gIHN0YWNrVG90YWwoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5zZXJpZXMpIHRvdGFsICs9IHRoaXMudmFsdWVBdChpdGVtLmtleSwgaW5kZXgpID8/IDA7XG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBkYXRhIHZhbHVlIHRvIGFuIHN2ZyB5LiBTVkcgeSBncm93cyBkb3dud2FyZCwgc28gdGhlIGRvbWFpbiBtYXhpbXVtXG4gICAqIGxhbmRzIG9uIGBwbG90VG9wYCBhbmQgdGhlIG1pbmltdW0gb24gYHBsb3RCb3R0b21gLlxuICAgKi9cbiAgeUZvcih2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzcGFuID0gdGhpcy5kb21haW5NYXggLSB0aGlzLmRvbWFpbk1pbjtcbiAgICBpZiAoc3BhbiA8PSAwKSByZXR1cm4gdGhpcy5wbG90Qm90dG9tO1xuICAgIGNvbnN0IHJhdGlvID0gKHZhbHVlIC0gdGhpcy5kb21haW5NaW4pIC8gc3BhbjtcbiAgICByZXR1cm4gdGhpcy5wbG90Qm90dG9tIC0gcmF0aW8gKiB0aGlzLnBsb3RIZWlnaHQ7XG4gIH1cblxuICAvKiogVGhlIHN2ZyB5IG9mIHRoZSB6ZXJvIGxpbmUsIGNsYW1wZWQgaW50byB0aGUgcGxvdC4gKi9cbiAgZ2V0IGJhc2VsaW5lWSgpOiBudW1iZXIge1xuICAgIGNvbnN0IHplcm8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCB0aGlzLmRvbWFpbk1pbiksIHRoaXMuZG9tYWluTWF4KTtcbiAgICByZXR1cm4gdGhpcy55Rm9yKHplcm8pO1xuICB9XG5cbiAgLyoqIFdpZHRoIG9mIG9uZSBiYW5kLCBleGNsdWRpbmcgaXRzIHBhZGRpbmcuIE1lYW5pbmdmdWwgaW4gYmFuZCBtb2RlLiAqL1xuICBnZXQgYmFuZFdpZHRoKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY291bnQgPT09IDApIHJldHVybiAwO1xuICAgIHJldHVybiB0aGlzLmJhbmRTdGVwICogKDEgLSB0aGlzLmJhbmRQYWRkaW5nKTtcbiAgfVxuXG4gIC8qKiBEaXN0YW5jZSBiZXR3ZWVuIGFkamFjZW50IGJhbmQgc3RhcnRzLiBCYW5kcyB0aWxlIHRoZSBwbG90IGV4YWN0bHkuICovXG4gIGdldCBiYW5kU3RlcCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5wbG90V2lkdGggLyB0aGlzLmNvdW50O1xuICB9XG5cbiAgLyoqIEdlb21ldHJ5IG9mIHRoZSBiYW5kIGF0IGBpbmRleGAuICovXG4gIGJhbmRGb3IoaW5kZXg6IG51bWJlcik6IENoYXJ0QmFuZCB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuYmFuZFN0ZXA7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmJhbmRXaWR0aDtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMucGxvdExlZnQgKyBpbmRleCAqIHN0ZXAgKyAoc3RlcCAtIHdpZHRoKSAvIDI7XG4gICAgcmV0dXJuIHsgc3RhcnQsIGNlbnRyZTogc3RhcnQgKyB3aWR0aCAvIDIsIHdpZHRoIH07XG4gIH1cblxuICAvKiogeCBvZiB0aGUgZGF0YSBwb2ludCBhdCBgaW5kZXhgIG9uIHRoZSBwb2ludCBzY2FsZS4gKi9cbiAgcG9pbnRYKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSByZXR1cm4gdGhpcy5wbG90TGVmdDtcbiAgICBpZiAodGhpcy5jb3VudCA9PT0gMSkgcmV0dXJuIHRoaXMucGxvdExlZnQgKyB0aGlzLnBsb3RXaWR0aCAvIDI7XG4gICAgcmV0dXJuIHRoaXMucGxvdExlZnQgKyAoaW5kZXggKiB0aGlzLnBsb3RXaWR0aCkgLyAodGhpcy5jb3VudCAtIDEpO1xuICB9XG5cbiAgLyoqIHggb2YgYGluZGV4YCB1bmRlciB3aGljaGV2ZXIgc2NhbGUgdGhlIGNoYXJ0IGlzIGN1cnJlbnRseSB1c2luZy4gKi9cbiAgeEZvcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zY2FsZU1vZGUgPT09ICdiYW5kJyA/IHRoaXMuYmFuZEZvcihpbmRleCkuY2VudHJlIDogdGhpcy5wb2ludFgoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb2ludGVyIGNhdGNobWVudCBhcmVhIGZvciBgaW5kZXhgIOKAlCBkZWxpYmVyYXRlbHkgd2lkZXIgdGhhbiB0aGUgbWFyay5cbiAgICogSW4gYmFuZCBtb2RlIGl0IGlzIHRoZSB3aG9sZSBiYW5kIHN0ZXA7IG9uIHRoZSBwb2ludCBzY2FsZSBpdCBydW5zIHRvIHRoZVxuICAgKiBtaWRwb2ludHMgb2YgdGhlIG5laWdoYm91cmluZyBwb2ludHMsIHNvIHRoZSBwb2ludGVyIG9ubHkgaGFzIHRvIGJlIG5lYXJlc3QuXG4gICAqL1xuICBoaXRCYW5kRm9yKGluZGV4OiBudW1iZXIpOiBDaGFydEJhbmQge1xuICAgIGlmICh0aGlzLnNjYWxlTW9kZSA9PT0gJ2JhbmQnKSB7XG4gICAgICBjb25zdCBzdGVwID0gdGhpcy5iYW5kU3RlcDtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wbG90TGVmdCArIGluZGV4ICogc3RlcDtcbiAgICAgIHJldHVybiB7IHN0YXJ0LCBjZW50cmU6IHN0YXJ0ICsgc3RlcCAvIDIsIHdpZHRoOiBzdGVwIH07XG4gICAgfVxuICAgIGNvbnN0IHggPSB0aGlzLnBvaW50WChpbmRleCk7XG4gICAgY29uc3QgcHJldiA9IGluZGV4ID4gMCA/IHRoaXMucG9pbnRYKGluZGV4IC0gMSkgOiB0aGlzLnBsb3RMZWZ0IC0gKHRoaXMucGxvdFJpZ2h0IC0gdGhpcy5wbG90TGVmdCk7XG4gICAgY29uc3QgbmV4dCA9XG4gICAgICBpbmRleCA8IHRoaXMuY291bnQgLSAxID8gdGhpcy5wb2ludFgoaW5kZXggKyAxKSA6IHRoaXMucGxvdFJpZ2h0ICsgKHRoaXMucGxvdFJpZ2h0IC0gdGhpcy5wbG90TGVmdCk7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCh0aGlzLnBsb3RMZWZ0LCAocHJldiArIHgpIC8gMik7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4odGhpcy5wbG90UmlnaHQsICh4ICsgbmV4dCkgLyAyKTtcbiAgICByZXR1cm4geyBzdGFydCwgY2VudHJlOiB4LCB3aWR0aDogTWF0aC5tYXgoMCwgZW5kIC0gc3RhcnQpIH07XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaG92ZXJpbmdcblxuICAvKiogSW5kZXggY3VycmVudGx5IHVuZGVyIHRoZSBwb2ludGVyLCBvciBudWxsLiAqL1xuICBnZXQgYWN0aXZlSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlSW5kZXhTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgc2V0QWN0aXZlSW5kZXgoaW5kZXg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVJbmRleFN1YmplY3QudmFsdWUgPT09IGluZGV4KSByZXR1cm47XG4gICAgdGhpcy5hY3RpdmVJbmRleFN1YmplY3QubmV4dChpbmRleCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkb21haW5zXG5cbiAgcHJpdmF0ZSByZWNvbXB1dGUoKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuc3RhY2tlZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50OyBpKyspIHZhbHVlcy5wdXNoKHRoaXMuc3RhY2tUb3RhbChpKSk7XG4gICAgICAvLyBBIHN0YWNrIHN0aWxsIGhhcyB0byBzaG93IGl0cyBvd24gZmxvb3Igd2hlbiBhIHNlcmllcyBnb2VzIG5lZ2F0aXZlLlxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc2VyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHRoaXMudmFsdWVBdChpdGVtLmtleSwgaSk7XG4gICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2IDwgMCkgdmFsdWVzLnB1c2godik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc2VyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHRoaXMudmFsdWVBdChpdGVtLmtleSwgaSk7XG4gICAgICAgICAgaWYgKHYgIT0gbnVsbCkgdmFsdWVzLnB1c2godik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy56ZXJvUmVxdWlyZWQpIHZhbHVlcy5wdXNoKDApO1xuXG4gICAgY29uc3QgW21pbiwgbWF4LCBzdGVwLCB0aWNrc10gPSBuaWNlU2NhbGUodmFsdWVzKTtcbiAgICB0aGlzLmRvbWFpbk1pbiA9IG1pbjtcbiAgICB0aGlzLmRvbWFpbk1heCA9IG1heDtcbiAgICB0aGlzLnRpY2tTdGVwID0gc3RlcDtcbiAgICB0aGlzLnRpY2tWYWx1ZXMgPSB0aWNrcztcblxuICAgIC8vIE9ubHkgdGVsbCBzdWJzY3JpYmVycyB3aGVuIHNvbWV0aGluZyB0aGV5IHdvdWxkIGRyYXcgZGlmZmVyZW50bHkgYWN0dWFsbHlcbiAgICAvLyBjaGFuZ2VkLiBgY29uZmlndXJlKClgIGlzIGNhbGxlZCBmcm9tIG5nT25DaGFuZ2VzLCBhbmQgYW4gYXBwIGJpbmRpbmdcbiAgICAvLyBgW2RhdGFdPVwiaXRlbXMuZmlsdGVyKC4uLilcImAgaGFuZHMgdXMgYSBmcmVzaCBhcnJheSByZWZlcmVuY2Ugb24gZXZlcnlcbiAgICAvLyBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3Mg4oCUIGFuIG9yZGluYXJ5IHRoaW5nIHRvIHdyaXRlLiBFbWl0dGluZyBvbiBldmVyeSBjYWxsXG4gICAgLy8gbWFkZSBzdWJzY3JpYmVycyBtYXJrRm9yQ2hlY2ssIHdoaWNoIHNjaGVkdWxlZCBhbm90aGVyIHBhc3MsIHdoaWNoIGNhbGxlZFxuICAgIC8vIGNvbmZpZ3VyZSBhZ2FpbjogdGhlIGN5Y2xlIG5ldmVyIGNsb3NlZCBhbmQgdGhlIHBhZ2UgbG9ja2VkIHVwLlxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMubGF5b3V0U2lnbmF0dXJlKHZhbHVlcyk7XG4gICAgaWYgKHNpZ25hdHVyZSA9PT0gdGhpcy5sYXN0U2lnbmF0dXJlKSByZXR1cm47XG4gICAgdGhpcy5sYXN0U2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuXG4gICAgdGhpcy5zY2hlZHVsZUVtaXQoKTtcbiAgfVxuXG4gIC8qKiBFdmVyeXRoaW5nIGEgc3Vic2NyaWJlciB3b3VsZCByZW5kZXIgZGlmZmVyZW50bHksIGZsYXR0ZW5lZCBmb3IgY29tcGFyaXNvbi4gKi9cbiAgcHJpdmF0ZSBsYXN0U2lnbmF0dXJlID0gJyc7XG5cbiAgcHJpdmF0ZSBsYXlvdXRTaWduYXR1cmUodmFsdWVzOiBudW1iZXJbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY291bnQsXG4gICAgICB0aGlzLnhLZXksXG4gICAgICB0aGlzLnN0YWNrZWQsXG4gICAgICB0aGlzLndpZHRoLFxuICAgICAgdGhpcy5oZWlnaHQsXG4gICAgICB0aGlzLmJhbmRQYWRkaW5nLFxuICAgICAgdGhpcy5zY2FsZU1vZGUsXG4gICAgICB0aGlzLnplcm9SZXF1aXJlZCxcbiAgICAgIHRoaXMubWFyZ2luLnRvcCwgdGhpcy5tYXJnaW4ucmlnaHQsIHRoaXMubWFyZ2luLmJvdHRvbSwgdGhpcy5tYXJnaW4ubGVmdCxcbiAgICAgIHRoaXMuZG9tYWluTWluLCB0aGlzLmRvbWFpbk1heCwgdGhpcy50aWNrU3RlcCxcbiAgICAgIHRoaXMudGlja1ZhbHVlcy5qb2luKCcsJyksXG4gICAgICB0aGlzLnNlcmllcy5tYXAoKHMpID0+IHMua2V5ICsgJzonICsgcy5sYWJlbCkuam9pbignLCcpLFxuICAgICAgdGhpcy54TGFiZWxzLmpvaW4oJ1x1MDAwMScpLFxuICAgICAgdmFsdWVzLmpvaW4oJywnKSxcbiAgICBdLmpvaW4oJ1x1MDAwMCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvYWxlc2NlcyBsYXlvdXQgbm90aWZpY2F0aW9ucyBpbnRvIGEgbWljcm90YXNrLCBzbyBzZXZlcmFsIGNoaWxkcmVuXG4gICAqIHJlZ2lzdGVyaW5nIGluIHRoZSBzYW1lIGNoYW5nZS1kZXRlY3Rpb24gcGFzcyBwcm9kdWNlIG9uZSBlbWlzc2lvbiBhZnRlclxuICAgKiB0aGV5IGhhdmUgYWxsIHNldHRsZWQgcmF0aGVyIHRoYW4gb25lIGVhY2ggbWlkLXBhc3MuXG4gICAqL1xuICBwcml2YXRlIHNjaGVkdWxlRW1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxheW91dFZlcnNpb24rKztcbiAgICBpZiAodGhpcy5lbWl0U2NoZWR1bGVkKSByZXR1cm47XG4gICAgdGhpcy5lbWl0U2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzLmVtaXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMubGF5b3V0U3ViamVjdC5uZXh0KHRoaXMubGF5b3V0VmVyc2lvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKiogRm9ybWF0cyBhIHZhbHVlIGZvciBhIHRpY2sgbGFiZWwgYXQgdGhlIGN1cnJlbnQgdGljayBzdGVwJ3MgcHJlY2lzaW9uLiAqL1xuICBmb3JtYXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNpbWFscyA9IGRlY2ltYWxzRm9yKHRoaXMudGlja1N0ZXApO1xuICAgIHJldHVybiB2YWx1ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7XG4gICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IGRlY2ltYWxzLFxuICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkZWNpbWFscyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGF0aHNcblxuICAvKiogU3RyYWlnaHQtc2VnbWVudCBwYXRoIHRocm91Z2ggdGhlIHNlcmllcycgZGVmaW5lZCBwb2ludHMuICovXG4gIGxpbmVQYXRoKHNlcmllc0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoKHRoaXMucG9pbnRzRm9yKHNlcmllc0tleSksIGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBNb25vdG9uZS1jdWJpYyBwYXRoIHRocm91Z2ggdGhlIHNlcmllcycgZGVmaW5lZCBwb2ludHMuICovXG4gIHNtb290aFBhdGgoc2VyaWVzS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZFBhdGgodGhpcy5wb2ludHNGb3Ioc2VyaWVzS2V5KSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmlsbGVkLWFyZWEgcGF0aDogdGhlIHNlcmllcycgbGluZSwgY2xvc2VkIGJhY2sgYWxvbmcgaXRzIGJhc2VsaW5lLiBXaGVuXG4gICAqIHN0YWNrZWQsIHRoZSBmbG9vciBpcyB0aGUgdG9wIG9mIHRoZSBzZXJpZXMgYmVsb3cgcmF0aGVyIHRoYW4gemVyby5cbiAgICovXG4gIGFyZWFQYXRoKHNlcmllc0tleTogc3RyaW5nLCBzbW9vdGg6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzRm9yKHNlcmllc0tleSk7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHJldHVybiAnJztcblxuICAgIGNvbnN0IHRvcCA9IGJ1aWxkUGF0aChwb2ludHMsIHNtb290aCk7XG4gICAgY29uc3QgZmxvb3IgPSBwb2ludHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMuc3RhY2tlZCA/IHRoaXMuc3RhY2tCYXNlKHNlcmllc0tleSwgcC5pbmRleCkgOiAwO1xuICAgICAgICByZXR1cm4geyB4OiBwLngsIHk6IHRoaXMueUZvcihiYXNlKSwgaW5kZXg6IHAuaW5kZXggfTtcbiAgICAgIH0pXG4gICAgICAucmV2ZXJzZSgpO1xuICAgIGNvbnN0IGJvdHRvbSA9IGJ1aWxkUGF0aChmbG9vciwgc21vb3RoKTtcbiAgICAvLyBSZS1lbnRlciB0aGUgcmV2ZXJzZWQgZmxvb3Igd2l0aCBhIGxpbmUsIHRoZW4gY2xvc2UuXG4gICAgcmV0dXJuIHRvcCArICcgTCAnICsgZmxvb3JbMF0ueCArICcgJyArIGZsb29yWzBdLnkgKyAnICcgKyBib3R0b20ucmVwbGFjZSgvXk0vLCAnTCcpICsgJyBaJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlZCBzdmcgcG9pbnRzIGZvciBhIHNlcmllcywgc2tpcHBpbmcgcm93cyB3aGVyZSBpdCBoYXMgbm8gdmFsdWUuICovXG4gIHBvaW50c0ZvcihzZXJpZXNLZXk6IHN0cmluZyk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdIHtcbiAgICBjb25zdCBwb2ludHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlQXQoc2VyaWVzS2V5LCBpKTtcbiAgICAgIGlmICh2ID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgc3RhY2tlZCA9IHRoaXMuc3RhY2tlZCA/IHRoaXMuc3RhY2tCYXNlKHNlcmllc0tleSwgaSkgKyB2IDogdjtcbiAgICAgIHBvaW50cy5wdXNoKHsgeDogdGhpcy54Rm9yKGkpLCB5OiB0aGlzLnlGb3Ioc3RhY2tlZCksIGluZGV4OiBpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHVyZSBoZWxwZXJzXG5cbi8qKiBEZWNpbWFsIHBsYWNlcyB3b3J0aCBzaG93aW5nIGZvciBhIGdpdmVuIHRpY2sgc3RlcC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNpbWFsc0ZvcihzdGVwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShzdGVwKSB8fCBzdGVwIDw9IDApIHJldHVybiAwO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oNiwgLU1hdGguZmxvb3IoTWF0aC5sb2cxMChzdGVwKSkpKTtcbn1cblxuLyoqXG4gKiBSb3VuZHMgYSByYXcgc3RlcCB1cCB0byB0aGUgbmV4dCAxLzIvNSB4IDEwXm4uXG4gKlxuICogRGl2aWRpbmcgdGhlIHJhbmdlIGJ5IGEgdGljayBjb3VudCBpbnN0ZWFkIHdvdWxkIHByb2R1Y2Ugc3RlcHMgbGlrZSAxOS40IGFuZFxuICogc28gYXhpcyBsYWJlbHMgbGlrZSAxOS40IC8gMzguOCAvIDU4LjIsIHdoaWNoIG5vYm9keSBjYW4gcmVhZCBhIHZhbHVlIG9mZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5pY2VTdGVwKHJhd1N0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHJhd1N0ZXApIHx8IHJhd1N0ZXAgPD0gMCkgcmV0dXJuIDE7XG4gIGNvbnN0IG1hZ25pdHVkZSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAocmF3U3RlcCkpKTtcbiAgY29uc3Qgbm9ybWFsaXNlZCA9IHJhd1N0ZXAgLyBtYWduaXR1ZGU7XG4gIGxldCBtdWx0aXBsaWVyOiBudW1iZXI7XG4gIGlmIChub3JtYWxpc2VkIDw9IDEpIG11bHRpcGxpZXIgPSAxO1xuICBlbHNlIGlmIChub3JtYWxpc2VkIDw9IDIpIG11bHRpcGxpZXIgPSAyO1xuICBlbHNlIGlmIChub3JtYWxpc2VkIDw9IDUpIG11bHRpcGxpZXIgPSA1O1xuICBlbHNlIG11bHRpcGxpZXIgPSAxMDtcbiAgcmV0dXJuIG11bHRpcGxpZXIgKiBtYWduaXR1ZGU7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgcmVhZGFibGUgeSBzY2FsZSBvdmVyIGB2YWx1ZXNgOiByZXR1cm5zIGBbbWluLCBtYXgsIHN0ZXAsIHRpY2tzXWBcbiAqIHdpdGggdGhlIGRvbWFpbiBzbmFwcGVkIG91dHdhcmQgdG8gd2hvbGUgc3RlcHMuXG4gKlxuICogRGVnZW5lcmF0ZSBpbnB1dHMgKGVtcHR5LCBhbGwtaWRlbnRpY2FsKSBzdGlsbCBwcm9kdWNlIGEgdXNhYmxlIG9uZS11bml0XG4gKiBkb21haW4gcmF0aGVyIHRoYW4gYSB6ZXJvLWhlaWdodCBwbG90LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmljZVNjYWxlKHZhbHVlczogbnVtYmVyW10sIHRhcmdldFRpY2tzID0gNSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJbXV0ge1xuICBjb25zdCBmaW5pdGUgPSB2YWx1ZXMuZmlsdGVyKCh2KSA9PiBOdW1iZXIuaXNGaW5pdGUodikpO1xuXG4gIGxldCBtaW4gPSBmaW5pdGUubGVuZ3RoID8gTWF0aC5taW4oLi4uZmluaXRlKSA6IDA7XG4gIGxldCBtYXggPSBmaW5pdGUubGVuZ3RoID8gTWF0aC5tYXgoLi4uZmluaXRlKSA6IDE7XG5cbiAgaWYgKG1pbiA9PT0gbWF4KSB7XG4gICAgLy8gQSBmbGF0IG9yIHNpbmdsZS1wb2ludCBkb21haW4gaGFzIG5vIHNwYW4gdG8gZGl2aWRlOyBvcGVuIGl0IHRvIG9uZSB1bml0XG4gICAgLy8gYXJvdW5kIHRoZSB2YWx1ZSBzbyB0aGUgbWFyayBzaXRzIG9uIGEgcmVhbCBheGlzIGluc3RlYWQgb2Ygb24gdGhlIGZsb29yLlxuICAgIGlmIChtaW4gPT09IDApIHtcbiAgICAgIG1pbiA9IDA7XG4gICAgICBtYXggPSAxO1xuICAgIH0gZWxzZSBpZiAobWluID4gMCkge1xuICAgICAgbWluID0gTWF0aC5taW4oMCwgbWluKTtcbiAgICAgIG1heCA9IG1heCA9PT0gMCA/IDEgOiBtYXg7XG4gICAgICBpZiAobWluID09PSBtYXgpIG1heCA9IG1pbiArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1heCA9IE1hdGgubWF4KDAsIG1heCk7XG4gICAgICBpZiAobWluID09PSBtYXgpIG1pbiA9IG1heCAtIDE7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RlcCA9IG5pY2VTdGVwKChtYXggLSBtaW4pIC8gdGFyZ2V0VGlja3MpO1xuICAvLyBOdWRnZSBiZWZvcmUgcm91bmRpbmcgb3V0d2FyZDogMTAwLzIwIGxhbmRzIGEgaGFpciBhYm92ZSA1IGluIGJpbmFyeVxuICAvLyBmbG9hdGluZyBwb2ludCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGFkZCBhIHBoYW50b20gdGljayBhdCAxMjAuXG4gIGNvbnN0IGVwc2lsb24gPSAxZS05O1xuICBjb25zdCBuaWNlTWluID0gTWF0aC5mbG9vcihtaW4gLyBzdGVwICsgZXBzaWxvbikgKiBzdGVwO1xuICBjb25zdCBuaWNlTWF4ID0gTWF0aC5jZWlsKG1heCAvIHN0ZXAgLSBlcHNpbG9uKSAqIHN0ZXA7XG4gIGNvbnN0IGRlY2ltYWxzID0gZGVjaW1hbHNGb3Ioc3RlcCk7XG5cbiAgY29uc3QgdGlja3M6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHRvdGFsID0gTWF0aC5yb3VuZCgobmljZU1heCAtIG5pY2VNaW4pIC8gc3RlcCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IHRvdGFsOyBpKyspIHtcbiAgICB0aWNrcy5wdXNoKE51bWJlcigobmljZU1pbiArIGkgKiBzdGVwKS50b0ZpeGVkKGRlY2ltYWxzKSkpO1xuICB9XG5cbiAgcmV0dXJuIFtOdW1iZXIobmljZU1pbi50b0ZpeGVkKGRlY2ltYWxzKSksIE51bWJlcihuaWNlTWF4LnRvRml4ZWQoZGVjaW1hbHMpKSwgc3RlcCwgdGlja3NdO1xufVxuXG4vKipcbiAqIE1vbm90b25lLWN1YmljIHRhbmdlbnRzIChGcml0c2NoLUNhcmxzb24pLiBMaW1pdGluZyBlYWNoIHRhbmdlbnQgdG8gdGhlXG4gKiBuZWlnaGJvdXJpbmcgc2VjYW50cyBpcyB3aGF0IHN0b3BzIHRoZSBjdXJ2ZSBvdmVyc2hvb3Rpbmc6IGEgcGxhaW5cbiAqIENhdG11bGwtUm9tIHNwbGluZSBidWxnZXMgcGFzdCB0aGUgZGF0YSBhbmQgaW52ZW50cyBwZWFrcyB0aGF0IHdlcmUgbmV2ZXJcbiAqIG1lYXN1cmVkLCB3aGljaCBvbiBhIGNoYXJ0IGlzIGEgZmFsc2Ugc3RhdGVtZW50IGFib3V0IHRoZSBudW1iZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ub3RvbmVUYW5nZW50cyh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgbiA9IHhzLmxlbmd0aDtcbiAgaWYgKG4gPCAyKSByZXR1cm4gbmV3IEFycmF5KG4pLmZpbGwoMCk7XG5cbiAgY29uc3Qgc2VjYW50czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgZHggPSB4c1tpICsgMV0gLSB4c1tpXTtcbiAgICBzZWNhbnRzLnB1c2goZHggPT09IDAgPyAwIDogKHlzW2kgKyAxXSAtIHlzW2ldKSAvIGR4KTtcbiAgfVxuXG4gIGNvbnN0IG06IG51bWJlcltdID0gbmV3IEFycmF5KG4pO1xuICBtWzBdID0gc2VjYW50c1swXTtcbiAgbVtuIC0gMV0gPSBzZWNhbnRzW24gLSAyXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBuIC0gMTsgaSsrKSBtW2ldID0gKHNlY2FudHNbaSAtIDFdICsgc2VjYW50c1tpXSkgLyAyO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykge1xuICAgIGlmIChzZWNhbnRzW2ldID09PSAwKSB7XG4gICAgICAvLyBGbGF0IHNlZ21lbnQ6IGJvdGggZW5kcyBtdXN0IGJlIGZsYXQgb3IgdGhlIGN1cnZlIGxlYXZlcyB0aGUgZGF0YSByYW5nZS5cbiAgICAgIG1baV0gPSAwO1xuICAgICAgbVtpICsgMV0gPSAwO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGEgPSBtW2ldIC8gc2VjYW50c1tpXTtcbiAgICBjb25zdCBiID0gbVtpICsgMV0gLyBzZWNhbnRzW2ldO1xuICAgIC8vIE5lZ2F0aXZlIHJhdGlvcyBtZWFuIHRoZSB0YW5nZW50IHBvaW50cyBhd2F5IGZyb20gdGhlIHNlY2FudC5cbiAgICBpZiAoYSA8IDApIG1baV0gPSAwO1xuICAgIGlmIChiIDwgMCkgbVtpICsgMV0gPSAwO1xuICAgIGNvbnN0IHN1bSA9IGEgKiBhICsgYiAqIGI7XG4gICAgaWYgKHN1bSA+IDkpIHtcbiAgICAgIGNvbnN0IHQgPSAzIC8gTWF0aC5zcXJ0KHN1bSk7XG4gICAgICBtW2ldID0gdCAqIGEgKiBzZWNhbnRzW2ldO1xuICAgICAgbVtpICsgMV0gPSB0ICogYiAqIHNlY2FudHNbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG07XG59XG5cbi8qKiBUdXJucyByZXNvbHZlZCBwb2ludHMgaW50byBhbiBzdmcgcGF0aCwgb3B0aW9uYWxseSBtb25vdG9uZS1zbW9vdGhlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBhdGgocG9pbnRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH1bXSwgc21vb3RoOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgaWYgKHBvaW50cy5sZW5ndGggPT09IDEpIHJldHVybiAnTSAnICsgcG9pbnRzWzBdLnggKyAnICcgKyBwb2ludHNbMF0ueTtcblxuICBjb25zdCBoZWFkID0gJ00gJyArIHBvaW50c1swXS54ICsgJyAnICsgcG9pbnRzWzBdLnk7XG4gIGlmICghc21vb3RoKSB7XG4gICAgcmV0dXJuIGhlYWQgKyBwb2ludHMuc2xpY2UoMSkubWFwKChwKSA9PiAnIEwgJyArIHAueCArICcgJyArIHAueSkuam9pbignJyk7XG4gIH1cblxuICBjb25zdCB4cyA9IHBvaW50cy5tYXAoKHApID0+IHAueCk7XG4gIGNvbnN0IHlzID0gcG9pbnRzLm1hcCgocCkgPT4gcC55KTtcbiAgY29uc3QgbSA9IG1vbm90b25lVGFuZ2VudHMoeHMsIHlzKTtcblxuICBsZXQgZCA9IGhlYWQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGR4ID0geHNbaSArIDFdIC0geHNbaV07XG4gICAgY29uc3QgYzF4ID0geHNbaV0gKyBkeCAvIDM7XG4gICAgY29uc3QgYzF5ID0geXNbaV0gKyAobVtpXSAqIGR4KSAvIDM7XG4gICAgY29uc3QgYzJ4ID0geHNbaSArIDFdIC0gZHggLyAzO1xuICAgIGNvbnN0IGMyeSA9IHlzW2kgKyAxXSAtIChtW2kgKyAxXSAqIGR4KSAvIDM7XG4gICAgZCArPSAnIEMgJyArIGMxeCArICcgJyArIGMxeSArICcgJyArIGMyeCArICcgJyArIGMyeSArICcgJyArIHhzW2kgKyAxXSArICcgJyArIHlzW2kgKyAxXTtcbiAgfVxuICByZXR1cm4gZDtcbn1cbiJdfQ==
580
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvY2hhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBd0N2QyxvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRW5DOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyw4QkFBOEIsQ0FBQztBQUVuRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDVCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUVqQiw0RUFBNEU7SUFDNUUsUUFBUSxDQUFDLElBQWM7UUFDckIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxRQUFRLENBQUMsR0FBVztRQUNsQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENB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R0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0MsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLENBQUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqIE9uZSBwbG90dGVkIHNlcmllczogd2hpY2gga2V5IHRvIHJlYWQgb2ZmIGVhY2ggcm93LCBhbmQgaG93IHRvIG5hbWUgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0U2VyaWVzIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbi8qKiBTcGFjZSByZXNlcnZlZCBhcm91bmQgdGhlIHBsb3QgYXJlYSBmb3IgYXhlcyBhbmQgbGFiZWxzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFydE1hcmdpbiB7XG4gIHRvcDogbnVtYmVyO1xuICByaWdodDogbnVtYmVyO1xuICBib3R0b206IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xufVxuXG4vKiogQSB5LWF4aXMgdGljazogaXRzIGRhdGEgdmFsdWUsIGl0cyByZXNvbHZlZCBzdmcgeSwgYW5kIGl0cyBmb3JtYXR0ZWQgbGFiZWwuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0VGljayB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuLyoqIEEgaG9yaXpvbnRhbCBzbGljZSBvZiB0aGUgcGxvdCBiZWxvbmdpbmcgdG8gb25lIHggcG9zaXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0QmFuZCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGNlbnRyZTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG4vKiogSG93IHggcG9zaXRpb25zIGFyZSByZXNvbHZlZDogZGlzY3JldGUgYmFuZHMgKGJhcnMpIG9yIHBvaW50cyAobGluZS9hcmVhKS4gKi9cbmV4cG9ydCB0eXBlIENoYXJ0U2NhbGVNb2RlID0gJ3BvaW50JyB8ICdiYW5kJztcblxuLyoqXG4gKiBXaGljaCBwaHlzaWNhbCBheGlzIGNhcnJpZXMgdGhlIGNhdGVnb3J5IHZzIHRoZSB2YWx1ZS4gT25seSB0aGUgYmFuZCBzY2FsZVxuICogKGJhcnMpIHN1cHBvcnRzICdob3Jpem9udGFsJyDigJQgbGluZS9hcmVhIHN0YXkgcG9pbnQtc2NhbGUgYW5kIHZlcnRpY2FsLFxuICogc2FtZSBhcyBUcmVtb3IgbmV2ZXIgb2ZmZXJzIGEgaG9yaXpvbnRhbCBsaW5lL2FyZWEgY2hhcnQgZWl0aGVyLlxuICovXG5leHBvcnQgdHlwZSBDaGFydE9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJztcblxuLyoqIE51bWJlciBvZiBjaGFydCBwYWxldHRlIHN0ZXBzIHRoYXQgZXhpc3QuIEEgNnRoIHNlcmllcyBkb2VzIG5vdCBnZXQgYSBjb2xvdXIuICovXG5leHBvcnQgY29uc3QgQ0hBUlRfQ09MT1JfTElNSVQgPSA1O1xuXG4vKipcbiAqIFRoZSBwYWludCB1c2VkIGZvciBhIHNlcmllcyBwYXN0IGBDSEFSVF9DT0xPUl9MSU1JVGAuXG4gKlxuICogVGhlIHBhbGV0dGUgaXMgdmFsaWRhdGVkIGZvciBsaWdodG5lc3MsIGNocm9tYSBhbmQgY29sb3VyLWJsaW5kIHNlcGFyYXRpb24gYXRcbiAqIGV4YWN0bHkgZml2ZSBzdGVwczsgZ2VuZXJhdGluZyBhIHNpeHRoIHdvdWxkIGxhbmQgb3V0c2lkZSB0aGF0IHZhbGlkYXRpb24sIGFuZFxuICogd3JhcHBpbmcgYmFjayB0byBzdGVwIDEgd291bGQgbWFrZSB0d28gc2VyaWVzIHNoYXJlIGFuIGlkZW50aXR5LiBCb3RoIGFyZVxuICogd29yc2UgdGhhbiBkcm9wcGluZyB0byBhIG5ldXRyYWwsIHNvIHRoZSBvdmVyZmxvdyBpcyBleHBsaWNpdGx5IHVuY29sb3VyZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFSVF9PVkVSRkxPV19DT0xPUiA9ICdyZ2IodmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkpJztcblxuLyoqXG4gKiBIYW5kcyBvdXQgcGFsZXR0ZSBzdGVwcyBieSBlbnRpdHkga2V5IHJhdGhlciB0aGFuIGJ5IHBvc2l0aW9uLlxuICpcbiAqIEEga2V5IGtlZXBzIGl0cyBzbG90IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHNjYWxlLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiBjb2xvdXIgZm9sbG93IHRoZSBlbnRpdHk6IGZpbHRlcmluZyBhIHNlcmllcyBvdXQgYW5kIGJhY2sgaW4sIG9yIHJlbW92aW5nIGFuXG4gKiBlYXJsaWVyIG9uZSwgbXVzdCBuZXZlciByZXBhaW50IHRoZSBzdXJ2aXZvcnMuIFBhc3QgdGhlIGZpZnRoIGRpc3RpbmN0IGtleVxuICogdGhlIHNjYWxlIHN0b3BzIGNvbG91cmluZyByYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBzdGVwIG9yIHdyYXBwaW5nIGFyb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYXJ0Q29sb3JTY2FsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2xvdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIG5leHQgPSAwO1xuXG4gIC8qKiBSZXNlcnZlcyBzbG90cyBmb3IgYGtleXNgIGluIG9yZGVyLCBsZWF2aW5nIGFscmVhZHkta25vd24ga2V5cyBhbG9uZS4gKi9cbiAgcmVnaXN0ZXIoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoIXRoaXMuc2xvdHMuaGFzKGtleSkpIHRoaXMuc2xvdHMuc2V0KGtleSwgdGhpcy5uZXh0KyspO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQYWludCBmb3IgYGtleWAsIHJlZ2lzdGVyaW5nIGl0IG9uIGZpcnN0IHNpZ2h0LiAqL1xuICBjb2xvckZvcihrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RzLmdldChrZXkpO1xuICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNsb3QgPSB0aGlzLm5leHQrKztcbiAgICAgIHRoaXMuc2xvdHMuc2V0KGtleSwgc2xvdCk7XG4gICAgfVxuICAgIGlmIChzbG90ID49IENIQVJUX0NPTE9SX0xJTUlUKSByZXR1cm4gQ0hBUlRfT1ZFUkZMT1dfQ09MT1I7XG4gICAgcmV0dXJuICdyZ2IodmFyKC0tY2hhcnQtJyArIChzbG90ICsgMSkgKyAnKSknO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBga2V5YCBmZWxsIHBhc3QgdGhlIHBhbGV0dGUgYW5kIHJlbmRlcnMgbmV1dHJhbC4gKi9cbiAgaXNPdmVyZmxvdyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNsb3RzLmdldChrZXkpO1xuICAgIHJldHVybiBzbG90ICE9PSB1bmRlZmluZWQgJiYgc2xvdCA+PSBDSEFSVF9DT0xPUl9MSU1JVDtcbiAgfVxuXG4gIC8qKiBTbG90IGluZGV4IGFzc2lnbmVkIHRvIGBrZXlgLCBvciB1bmRlZmluZWQgd2hlbiBpdCBpcyB1bmtub3duLiAqL1xuICBzbG90T2Yoa2V5OiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNsb3RzLmdldChrZXkpO1xuICB9XG59XG5cbi8qKlxuICogT3ducyBsYXlvdXQsIHNjYWxlcyBhbmQgY29sb3VyIGFzc2lnbm1lbnQgZm9yIG9uZSBgdG9sbGUtY2hhcnRgLCBzbyBldmVyeVxuICogY2hpbGQgZHJhd3MgaW50byB0aGUgc2FtZSBjb29yZGluYXRlIHNwYWNlLiBSZW5kZXJzIG5vdGhpbmcgaXRzZWxmLlxuICpcbiAqIFByb3ZpZGVkIG9uIGBDaGFydENvbXBvbmVudGAsIHNvIGVhY2ggY2hhcnQgZ2V0cyBpdHMgb3duIGluc3RhbmNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ2hhcnRTZXJ2aWNlIHtcbiAgLyoqIFJvd3MgYmVpbmcgcGxvdHRlZCwgaW4geCBvcmRlci4gKi9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PltdID0gW107XG4gIC8qKiBTZXJpZXMgZGVmaW5pdGlvbnMsIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCB0YWtlIHBhbGV0dGUgc3RlcHMuICovXG4gIHNlcmllczogQ2hhcnRTZXJpZXNbXSA9IFtdO1xuICAvKiogUm93IGtleSBob2xkaW5nIHRoZSB4IGNhdGVnb3J5L2xhYmVsLiAqL1xuICB4S2V5ID0gJyc7XG4gIC8qKiBXaGV0aGVyIG1hcmtzIHN0YWNrIG9uIGEgc2hhcmVkIGJhc2VsaW5lIHJhdGhlciB0aGFuIHNpdHRpbmcgc2lkZSBieSBzaWRlLiAqL1xuICBzdGFja2VkID0gZmFsc2U7XG4gIC8qKiBGdWxsIHN2ZyB3aWR0aCBpbiBweCwgdHJhY2tlZCBmcm9tIHRoZSBjb250YWluZXIncyBSZXNpemVPYnNlcnZlci4gKi9cbiAgd2lkdGggPSAwO1xuICAvKiogRnVsbCBzdmcgaGVpZ2h0IGluIHB4LiAqL1xuICBoZWlnaHQgPSAyNjA7XG4gIC8qKiBTcGFjZSByZXNlcnZlZCBhcm91bmQgdGhlIHBsb3QgYXJlYS4gKi9cbiAgbWFyZ2luOiBDaGFydE1hcmdpbiA9IHsgdG9wOiA4LCByaWdodDogOCwgYm90dG9tOiAyNCwgbGVmdDogNDAgfTtcbiAgLyoqIEZyYWN0aW9uIG9mIGEgYmFuZCdzIHN0ZXAgc3BlbnQgb24gcGFkZGluZywgc3BsaXQgZWl0aGVyIHNpZGUuICovXG4gIGJhbmRQYWRkaW5nID0gMC4yO1xuICAvKipcbiAgICogV2hpY2ggcGh5c2ljYWwgYXhpcyBpcyB0aGUgY2F0ZWdvcnkgYXhpcy4gQmFycyBmbGlwIHRoaXMgdmlhIGBjb25maWd1cmUoKWA7XG4gICAqIGV2ZXJ5IG90aGVyIGdlb21ldHJ5IGdldHRlciBicmFuY2hlcyBvbiBpdCBpbnRlcm5hbGx5LCBkZWZhdWx0aW5nIHRvIHRoZVxuICAgKiBleGFjdCB2ZXJ0aWNhbCBmb3JtdWxhIHdoZW4gdW5zZXQsIHNvIGV4aXN0aW5nIHZlcnRpY2FsIGNoYXJ0cyBhcmUgdW5hZmZlY3RlZC5cbiAgICovXG4gIG9yaWVudGF0aW9uOiBDaGFydE9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJztcblxuICBwcml2YXRlIHNjYWxlTW9kZTogQ2hhcnRTY2FsZU1vZGUgPSAncG9pbnQnO1xuICBwcml2YXRlIHplcm9SZXF1aXJlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZG9tYWluTWluID0gMDtcbiAgcHJpdmF0ZSBkb21haW5NYXggPSAxO1xuICBwcml2YXRlIHRpY2tWYWx1ZXM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgdGlja1N0ZXAgPSAxO1xuXG4gIC8qKiBQYWxldHRlIGFzc2lnbm1lbnQsIGtleWVkIGJ5IHNlcmllcyBpZGVudGl0eS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb2xvcnMgPSBuZXcgQ2hhcnRDb2xvclNjYWxlKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsYXlvdXRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICAvKiogRW1pdHMgYSB2ZXJzaW9uIG51bWJlciB3aGVuZXZlciBzY2FsZXMsIGRpbWVuc2lvbnMgb3IgZGF0YSBjaGFuZ2UuICovXG4gIHJlYWRvbmx5IGxheW91dCQgPSB0aGlzLmxheW91dFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVJbmRleFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICAvKiogSW5kZXggb2YgdGhlIHggcG9zaXRpb24gdW5kZXIgdGhlIHBvaW50ZXIsIG9yIG51bGwgd2hlbiBub3QgaG92ZXJpbmcuICovXG4gIHJlYWRvbmx5IGFjdGl2ZUluZGV4JCA9IHRoaXMuYWN0aXZlSW5kZXhTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgbGF5b3V0VmVyc2lvbiA9IDA7XG4gIHByaXZhdGUgZW1pdFNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2VvbWV0cnlcblxuICBnZXQgcGxvdExlZnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXJnaW4ubGVmdDtcbiAgfVxuXG4gIGdldCBwbG90VG9wKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWFyZ2luLnRvcDtcbiAgfVxuXG4gIGdldCBwbG90V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy53aWR0aCAtIHRoaXMubWFyZ2luLmxlZnQgLSB0aGlzLm1hcmdpbi5yaWdodCk7XG4gIH1cblxuICBnZXQgcGxvdEhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmhlaWdodCAtIHRoaXMubWFyZ2luLnRvcCAtIHRoaXMubWFyZ2luLmJvdHRvbSk7XG4gIH1cblxuICBnZXQgcGxvdFJpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGxvdExlZnQgKyB0aGlzLnBsb3RXaWR0aDtcbiAgfVxuXG4gIGdldCBwbG90Qm90dG9tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGxvdFRvcCArIHRoaXMucGxvdEhlaWdodDtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgeCBwb3NpdGlvbnMuICovXG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoO1xuICB9XG5cbiAgLyoqIEhvdyB4IGlzIGN1cnJlbnRseSByZXNvbHZlZC4gQmFycyBmbGlwIHRoaXMgdG8gJ2JhbmQnLiAqL1xuICBnZXQgbW9kZSgpOiBDaGFydFNjYWxlTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuc2NhbGVNb2RlO1xuICB9XG5cbiAgLyoqIFJlc29sdmVkIHkgdGlja3MsIHdpdGggc3ZnIGNvb3JkaW5hdGVzIGFuZCBmb3JtYXR0ZWQgbGFiZWxzLiAqL1xuICBnZXQgdGlja3MoKTogQ2hhcnRUaWNrW10ge1xuICAgIHJldHVybiB0aGlzLnRpY2tWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gKHtcbiAgICAgIHZhbHVlLFxuICAgICAgeTogdGhpcy55Rm9yKHZhbHVlKSxcbiAgICAgIGxhYmVsOiB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogQ3VycmVudCB5IGRvbWFpbiBhcyBbbWluLCBtYXhdLiAqL1xuICBnZXQgZG9tYWluKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbdGhpcy5kb21haW5NaW4sIHRoaXMuZG9tYWluTWF4XTtcbiAgfVxuXG4gIC8qKiBUaGUgeC1heGlzIGNhdGVnb3J5IGxhYmVscywgb25lIHBlciByb3cuICovXG4gIGdldCB4TGFiZWxzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCByYXcgPSByb3c/Llt0aGlzLnhLZXldO1xuICAgICAgcmV0dXJuIHJhdyA9PSBudWxsID8gJycgOiBTdHJpbmcocmF3KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpc3RyYXRpb25cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIGNoYXJ0J3MgY29uZmlndXJhdGlvbiBhbmQgcmVjb21wdXRlcyB0aGUgc2NhbGVzLlxuICAgKiBDYWxsZWQgYnkgdGhlIGNvbnRhaW5lciBvbiBpbnB1dCBjaGFuZ2VzIGFuZCBvbiByZXNpemUuXG4gICAqL1xuICBjb25maWd1cmUoY29uZmlnOiBQYXJ0aWFsPFBpY2s8Q2hhcnRTZXJ2aWNlLFxuICAgICdkYXRhJyB8ICdzZXJpZXMnIHwgJ3hLZXknIHwgJ3N0YWNrZWQnIHwgJ3dpZHRoJyB8ICdoZWlnaHQnIHwgJ21hcmdpbicgfCAnYmFuZFBhZGRpbmcnIHwgJ29yaWVudGF0aW9uJz4+KTogdm9pZCB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjb25maWcpO1xuICAgIGlmIChjb25maWcuc2VyaWVzKSB0aGlzLnN5bmNDb2xvclNsb3RzKGNvbmZpZy5zZXJpZXMpO1xuICAgIHRoaXMucmVjb21wdXRlKCk7XG4gIH1cblxuICAvKiogU3dpdGNoZXMgeCB0byBhIGJhbmQgc2NhbGUuIEJhcnMgY2FsbCB0aGlzOyBpdCBhbHNvIGZvcmNlcyB6ZXJvIGludG8gdGhlIGRvbWFpbi4gKi9cbiAgdXNlQmFuZFNjYWxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNjYWxlTW9kZSA9PT0gJ2JhbmQnICYmIHRoaXMuemVyb1JlcXVpcmVkKSByZXR1cm47XG4gICAgdGhpcy5zY2FsZU1vZGUgPSAnYmFuZCc7XG4gICAgdGhpcy56ZXJvUmVxdWlyZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjb21wdXRlKCk7XG4gIH1cblxuICAvKiogRm9yY2VzIHplcm8gaW50byB0aGUgeSBkb21haW4sIGZvciBtYXJrcyBhbmNob3JlZCB0byBhIGJhc2VsaW5lLiAqL1xuICByZXF1aXJlWmVybygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy56ZXJvUmVxdWlyZWQpIHJldHVybjtcbiAgICB0aGlzLnplcm9SZXF1aXJlZCA9IHRydWU7XG4gICAgdGhpcy5yZWNvbXB1dGUoKTtcbiAgfVxuXG4gIC8qKiBSZXNlcnZlcyBwYWxldHRlIHNsb3RzIGluIHNlcmllcyBvcmRlciwgbGVhdmluZyBrbm93biBrZXlzIHVudG91Y2hlZC4gKi9cbiAgcHJpdmF0ZSBzeW5jQ29sb3JTbG90cyhzZXJpZXM6IENoYXJ0U2VyaWVzW10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9ycy5yZWdpc3RlcihzZXJpZXMubWFwKChpdGVtKSA9PiBpdGVtLmtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhaW50IGZvciBhIHNlcmllcywga2V5ZWQgYnkgaWRlbnRpdHkgcmF0aGVyIHRoYW4gYnkgaW5kZXggaW4gdGhlIHZpc2libGVcbiAgICogYXJyYXkuIFBhc3QgdGhlIGZpZnRoIGRpc3RpbmN0IGtleSB0aGlzIHJldHVybnMgdGhlIG5ldXRyYWwgb3ZlcmZsb3cgY29sb3VyLlxuICAgKi9cbiAgY29sb3JGb3Ioc2VyaWVzS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbG9ycy5jb2xvckZvcihzZXJpZXNLZXkpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGlzIHNlcmllcyBmZWxsIHBhc3QgdGhlIHBhbGV0dGUgYW5kIHJlbmRlcnMgbmV1dHJhbC4gKi9cbiAgaXNPdmVyZmxvd1NlcmllcyhzZXJpZXNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbG9ycy5pc092ZXJmbG93KHNlcmllc0tleSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0aGUgc2NhbGVzXG5cbiAgLyoqIFJlYWRzIGEgc2VyaWVzIHZhbHVlIG9mZiBhIHJvdywgb3IgbnVsbCB3aGVuIGl0IGlzIG1pc3Npbmcvbm9uLW51bWVyaWMuICovXG4gIHZhbHVlQXQoc2VyaWVzS2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmRhdGFbaW5kZXhdPy5bc2VyaWVzS2V5XTtcbiAgICBpZiAocmF3ID09IG51bGwgfHwgcmF3ID09PSAnJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHJhdyk7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShudW0pID8gbnVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBTdW0gb2YgZXZlcnkgc2VyaWVzIGJlbG93IGBzZXJpZXNLZXlgIGF0IGBpbmRleGAsIGZvciBzdGFja2VkIG1hcmtzLiAqL1xuICBzdGFja0Jhc2Uoc2VyaWVzS2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5zdGFja2VkKSByZXR1cm4gMDtcbiAgICBsZXQgYmFzZSA9IDA7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc2VyaWVzKSB7XG4gICAgICBpZiAoaXRlbS5rZXkgPT09IHNlcmllc0tleSkgYnJlYWs7XG4gICAgICBiYXNlICs9IHRoaXMudmFsdWVBdChpdGVtLmtleSwgaW5kZXgpID8/IDA7XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgLyoqIFN1bSBvZiBldmVyeSBzZXJpZXMgYXQgYGluZGV4YC4gKi9cbiAgc3RhY2tUb3RhbChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnNlcmllcykgdG90YWwgKz0gdGhpcy52YWx1ZUF0KGl0ZW0ua2V5LCBpbmRleCkgPz8gMDtcbiAgICByZXR1cm4gdG90YWw7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIGRhdGEgdmFsdWUgdG8gYSBwb3NpdGlvbiBhbG9uZyB0aGUgKnZhbHVlKiBheGlzIOKAlCBzdmcgeSB3aGVuXG4gICAqIHZlcnRpY2FsIChzdmcgeSBncm93cyBkb3dud2FyZCwgc28gdGhlIGRvbWFpbiBtYXhpbXVtIGxhbmRzIG9uIGBwbG90VG9wYCksXG4gICAqIHN2ZyB4IHdoZW4gaG9yaXpvbnRhbCAodGhlIGRvbWFpbiBtYXhpbXVtIGxhbmRzIG9uIGBwbG90UmlnaHRgKS5cbiAgICovXG4gIHlGb3IodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3BhbiA9IHRoaXMuZG9tYWluTWF4IC0gdGhpcy5kb21haW5NaW47XG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgaWYgKHNwYW4gPD0gMCkgcmV0dXJuIHRoaXMucGxvdExlZnQ7XG4gICAgICBjb25zdCByYXRpbyA9ICh2YWx1ZSAtIHRoaXMuZG9tYWluTWluKSAvIHNwYW47XG4gICAgICByZXR1cm4gdGhpcy5wbG90TGVmdCArIHJhdGlvICogdGhpcy5wbG90V2lkdGg7XG4gICAgfVxuICAgIGlmIChzcGFuIDw9IDApIHJldHVybiB0aGlzLnBsb3RCb3R0b207XG4gICAgY29uc3QgcmF0aW8gPSAodmFsdWUgLSB0aGlzLmRvbWFpbk1pbikgLyBzcGFuO1xuICAgIHJldHVybiB0aGlzLnBsb3RCb3R0b20gLSByYXRpbyAqIHRoaXMucGxvdEhlaWdodDtcbiAgfVxuXG4gIC8qKiBUaGUgdmFsdWUtYXhpcyBwb3NpdGlvbiBvZiB0aGUgemVybyBsaW5lLCBjbGFtcGVkIGludG8gdGhlIHBsb3QuICovXG4gIGdldCBiYXNlbGluZVkoKTogbnVtYmVyIHtcbiAgICBjb25zdCB6ZXJvID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgdGhpcy5kb21haW5NaW4pLCB0aGlzLmRvbWFpbk1heCk7XG4gICAgcmV0dXJuIHRoaXMueUZvcih6ZXJvKTtcbiAgfVxuXG4gIC8qKiBMZW5ndGggb2YgdGhlIHBsb3QgYWxvbmcgdGhlIGNhdGVnb3J5IGF4aXM6IGBwbG90SGVpZ2h0YCB3aGVuIGhvcml6b250YWwsIGVsc2UgYHBsb3RXaWR0aGAuICovXG4gIHByaXZhdGUgZ2V0IGNhdGVnb3J5QXhpc0xlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyB0aGlzLnBsb3RIZWlnaHQgOiB0aGlzLnBsb3RXaWR0aDtcbiAgfVxuXG4gIC8qKiBPcmlnaW4gb2YgdGhlIHBsb3QgYWxvbmcgdGhlIGNhdGVnb3J5IGF4aXM6IGBwbG90VG9wYCB3aGVuIGhvcml6b250YWwsIGVsc2UgYHBsb3RMZWZ0YC4gKi9cbiAgcHJpdmF0ZSBnZXQgY2F0ZWdvcnlBeGlzT3JpZ2luKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IHRoaXMucGxvdFRvcCA6IHRoaXMucGxvdExlZnQ7XG4gIH1cblxuICAvKiogV2lkdGggb2Ygb25lIGJhbmQsIGV4Y2x1ZGluZyBpdHMgcGFkZGluZy4gTWVhbmluZ2Z1bCBpbiBiYW5kIG1vZGUuICovXG4gIGdldCBiYW5kV2lkdGgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5jb3VudCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMuYmFuZFN0ZXAgKiAoMSAtIHRoaXMuYmFuZFBhZGRpbmcpO1xuICB9XG5cbiAgLyoqIERpc3RhbmNlIGJldHdlZW4gYWRqYWNlbnQgYmFuZCBzdGFydHMuIEJhbmRzIHRpbGUgdGhlIHBsb3QgZXhhY3RseS4gKi9cbiAgZ2V0IGJhbmRTdGVwKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY291bnQgPT09IDApIHJldHVybiAwO1xuICAgIHJldHVybiB0aGlzLmNhdGVnb3J5QXhpc0xlbmd0aCAvIHRoaXMuY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VvbWV0cnkgb2YgdGhlIGJhbmQgYXQgYGluZGV4YCwgYWxvbmcgdGhlIGNhdGVnb3J5IGF4aXMg4oCUIHggd2hlblxuICAgKiB2ZXJ0aWNhbCAodG9kYXkncyBtZWFuaW5nKSwgeSB3aGVuIGhvcml6b250YWwuXG4gICAqL1xuICBiYW5kRm9yKGluZGV4OiBudW1iZXIpOiBDaGFydEJhbmQge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmJhbmRTdGVwO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5iYW5kV2lkdGg7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmNhdGVnb3J5QXhpc09yaWdpbiArIGluZGV4ICogc3RlcCArIChzdGVwIC0gd2lkdGgpIC8gMjtcbiAgICByZXR1cm4geyBzdGFydCwgY2VudHJlOiBzdGFydCArIHdpZHRoIC8gMiwgd2lkdGggfTtcbiAgfVxuXG4gIC8qKiB4IG9mIHRoZSBkYXRhIHBvaW50IGF0IGBpbmRleGAgb24gdGhlIHBvaW50IHNjYWxlLiAqL1xuICBwb2ludFgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY291bnQgPT09IDApIHJldHVybiB0aGlzLnBsb3RMZWZ0O1xuICAgIGlmICh0aGlzLmNvdW50ID09PSAxKSByZXR1cm4gdGhpcy5wbG90TGVmdCArIHRoaXMucGxvdFdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy5wbG90TGVmdCArIChpbmRleCAqIHRoaXMucGxvdFdpZHRoKSAvICh0aGlzLmNvdW50IC0gMSk7XG4gIH1cblxuICAvKiogeCBvZiBgaW5kZXhgIHVuZGVyIHdoaWNoZXZlciBzY2FsZSB0aGUgY2hhcnQgaXMgY3VycmVudGx5IHVzaW5nLiAqL1xuICB4Rm9yKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNjYWxlTW9kZSA9PT0gJ2JhbmQnID8gdGhpcy5iYW5kRm9yKGluZGV4KS5jZW50cmUgOiB0aGlzLnBvaW50WChpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBvaW50ZXIgY2F0Y2htZW50IGFyZWEgZm9yIGBpbmRleGAg4oCUIGRlbGliZXJhdGVseSB3aWRlciB0aGFuIHRoZSBtYXJrLlxuICAgKiBJbiBiYW5kIG1vZGUgaXQgaXMgdGhlIHdob2xlIGJhbmQgc3RlcDsgb24gdGhlIHBvaW50IHNjYWxlIGl0IHJ1bnMgdG8gdGhlXG4gICAqIG1pZHBvaW50cyBvZiB0aGUgbmVpZ2hib3VyaW5nIHBvaW50cywgc28gdGhlIHBvaW50ZXIgb25seSBoYXMgdG8gYmUgbmVhcmVzdC5cbiAgICovXG4gIGhpdEJhbmRGb3IoaW5kZXg6IG51bWJlcik6IENoYXJ0QmFuZCB7XG4gICAgaWYgKHRoaXMuc2NhbGVNb2RlID09PSAnYmFuZCcpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmJhbmRTdGVwO1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmNhdGVnb3J5QXhpc09yaWdpbiArIGluZGV4ICogc3RlcDtcbiAgICAgIHJldHVybiB7IHN0YXJ0LCBjZW50cmU6IHN0YXJ0ICsgc3RlcCAvIDIsIHdpZHRoOiBzdGVwIH07XG4gICAgfVxuICAgIGNvbnN0IHggPSB0aGlzLnBvaW50WChpbmRleCk7XG4gICAgY29uc3QgcHJldiA9IGluZGV4ID4gMCA/IHRoaXMucG9pbnRYKGluZGV4IC0gMSkgOiB0aGlzLnBsb3RMZWZ0IC0gKHRoaXMucGxvdFJpZ2h0IC0gdGhpcy5wbG90TGVmdCk7XG4gICAgY29uc3QgbmV4dCA9XG4gICAgICBpbmRleCA8IHRoaXMuY291bnQgLSAxID8gdGhpcy5wb2ludFgoaW5kZXggKyAxKSA6IHRoaXMucGxvdFJpZ2h0ICsgKHRoaXMucGxvdFJpZ2h0IC0gdGhpcy5wbG90TGVmdCk7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCh0aGlzLnBsb3RMZWZ0LCAocHJldiArIHgpIC8gMik7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4odGhpcy5wbG90UmlnaHQsICh4ICsgbmV4dCkgLyAyKTtcbiAgICByZXR1cm4geyBzdGFydCwgY2VudHJlOiB4LCB3aWR0aDogTWF0aC5tYXgoMCwgZW5kIC0gc3RhcnQpIH07XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaG92ZXJpbmdcblxuICAvKiogSW5kZXggY3VycmVudGx5IHVuZGVyIHRoZSBwb2ludGVyLCBvciBudWxsLiAqL1xuICBnZXQgYWN0aXZlSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlSW5kZXhTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgc2V0QWN0aXZlSW5kZXgoaW5kZXg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVJbmRleFN1YmplY3QudmFsdWUgPT09IGluZGV4KSByZXR1cm47XG4gICAgdGhpcy5hY3RpdmVJbmRleFN1YmplY3QubmV4dChpbmRleCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkb21haW5zXG5cbiAgcHJpdmF0ZSByZWNvbXB1dGUoKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuc3RhY2tlZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50OyBpKyspIHZhbHVlcy5wdXNoKHRoaXMuc3RhY2tUb3RhbChpKSk7XG4gICAgICAvLyBBIHN0YWNrIHN0aWxsIGhhcyB0byBzaG93IGl0cyBvd24gZmxvb3Igd2hlbiBhIHNlcmllcyBnb2VzIG5lZ2F0aXZlLlxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc2VyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHRoaXMudmFsdWVBdChpdGVtLmtleSwgaSk7XG4gICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2IDwgMCkgdmFsdWVzLnB1c2godik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc2VyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHRoaXMudmFsdWVBdChpdGVtLmtleSwgaSk7XG4gICAgICAgICAgaWYgKHYgIT0gbnVsbCkgdmFsdWVzLnB1c2godik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy56ZXJvUmVxdWlyZWQpIHZhbHVlcy5wdXNoKDApO1xuXG4gICAgY29uc3QgW21pbiwgbWF4LCBzdGVwLCB0aWNrc10gPSBuaWNlU2NhbGUodmFsdWVzKTtcbiAgICB0aGlzLmRvbWFpbk1pbiA9IG1pbjtcbiAgICB0aGlzLmRvbWFpbk1heCA9IG1heDtcbiAgICB0aGlzLnRpY2tTdGVwID0gc3RlcDtcbiAgICB0aGlzLnRpY2tWYWx1ZXMgPSB0aWNrcztcblxuICAgIC8vIE9ubHkgdGVsbCBzdWJzY3JpYmVycyB3aGVuIHNvbWV0aGluZyB0aGV5IHdvdWxkIGRyYXcgZGlmZmVyZW50bHkgYWN0dWFsbHlcbiAgICAvLyBjaGFuZ2VkLiBgY29uZmlndXJlKClgIGlzIGNhbGxlZCBmcm9tIG5nT25DaGFuZ2VzLCBhbmQgYW4gYXBwIGJpbmRpbmdcbiAgICAvLyBgW2RhdGFdPVwiaXRlbXMuZmlsdGVyKC4uLilcImAgaGFuZHMgdXMgYSBmcmVzaCBhcnJheSByZWZlcmVuY2Ugb24gZXZlcnlcbiAgICAvLyBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3Mg4oCUIGFuIG9yZGluYXJ5IHRoaW5nIHRvIHdyaXRlLiBFbWl0dGluZyBvbiBldmVyeSBjYWxsXG4gICAgLy8gbWFkZSBzdWJzY3JpYmVycyBtYXJrRm9yQ2hlY2ssIHdoaWNoIHNjaGVkdWxlZCBhbm90aGVyIHBhc3MsIHdoaWNoIGNhbGxlZFxuICAgIC8vIGNvbmZpZ3VyZSBhZ2FpbjogdGhlIGN5Y2xlIG5ldmVyIGNsb3NlZCBhbmQgdGhlIHBhZ2UgbG9ja2VkIHVwLlxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMubGF5b3V0U2lnbmF0dXJlKHZhbHVlcyk7XG4gICAgaWYgKHNpZ25hdHVyZSA9PT0gdGhpcy5sYXN0U2lnbmF0dXJlKSByZXR1cm47XG4gICAgdGhpcy5sYXN0U2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuXG4gICAgdGhpcy5zY2hlZHVsZUVtaXQoKTtcbiAgfVxuXG4gIC8qKiBFdmVyeXRoaW5nIGEgc3Vic2NyaWJlciB3b3VsZCByZW5kZXIgZGlmZmVyZW50bHksIGZsYXR0ZW5lZCBmb3IgY29tcGFyaXNvbi4gKi9cbiAgcHJpdmF0ZSBsYXN0U2lnbmF0dXJlID0gJyc7XG5cbiAgcHJpdmF0ZSBsYXlvdXRTaWduYXR1cmUodmFsdWVzOiBudW1iZXJbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY291bnQsXG4gICAgICB0aGlzLnhLZXksXG4gICAgICB0aGlzLnN0YWNrZWQsXG4gICAgICB0aGlzLndpZHRoLFxuICAgICAgdGhpcy5oZWlnaHQsXG4gICAgICB0aGlzLmJhbmRQYWRkaW5nLFxuICAgICAgdGhpcy5zY2FsZU1vZGUsXG4gICAgICB0aGlzLm9yaWVudGF0aW9uLFxuICAgICAgdGhpcy56ZXJvUmVxdWlyZWQsXG4gICAgICB0aGlzLm1hcmdpbi50b3AsIHRoaXMubWFyZ2luLnJpZ2h0LCB0aGlzLm1hcmdpbi5ib3R0b20sIHRoaXMubWFyZ2luLmxlZnQsXG4gICAgICB0aGlzLmRvbWFpbk1pbiwgdGhpcy5kb21haW5NYXgsIHRoaXMudGlja1N0ZXAsXG4gICAgICB0aGlzLnRpY2tWYWx1ZXMuam9pbignLCcpLFxuICAgICAgdGhpcy5zZXJpZXMubWFwKChzKSA9PiBzLmtleSArICc6JyArIHMubGFiZWwpLmpvaW4oJywnKSxcbiAgICAgIHRoaXMueExhYmVscy5qb2luKCdcdTAwMDEnKSxcbiAgICAgIHZhbHVlcy5qb2luKCcsJyksXG4gICAgXS5qb2luKCdcdTAwMDAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2FsZXNjZXMgbGF5b3V0IG5vdGlmaWNhdGlvbnMgaW50byBhIG1pY3JvdGFzaywgc28gc2V2ZXJhbCBjaGlsZHJlblxuICAgKiByZWdpc3RlcmluZyBpbiB0aGUgc2FtZSBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3MgcHJvZHVjZSBvbmUgZW1pc3Npb24gYWZ0ZXJcbiAgICogdGhleSBoYXZlIGFsbCBzZXR0bGVkIHJhdGhlciB0aGFuIG9uZSBlYWNoIG1pZC1wYXNzLlxuICAgKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZUVtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sYXlvdXRWZXJzaW9uKys7XG4gICAgaWYgKHRoaXMuZW1pdFNjaGVkdWxlZCkgcmV0dXJuO1xuICAgIHRoaXMuZW1pdFNjaGVkdWxlZCA9IHRydWU7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgdGhpcy5lbWl0U2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmxheW91dFN1YmplY3QubmV4dCh0aGlzLmxheW91dFZlcnNpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEZvcm1hdHMgYSB2YWx1ZSBmb3IgYSB0aWNrIGxhYmVsIGF0IHRoZSBjdXJyZW50IHRpY2sgc3RlcCdzIHByZWNpc2lvbi4gKi9cbiAgZm9ybWF0VmFsdWUodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZGVjaW1hbHMgPSBkZWNpbWFsc0Zvcih0aGlzLnRpY2tTdGVwKTtcbiAgICByZXR1cm4gdmFsdWUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkZWNpbWFscyxcbiAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZGVjaW1hbHMsXG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBhdGhzXG5cbiAgLyoqIFN0cmFpZ2h0LXNlZ21lbnQgcGF0aCB0aHJvdWdoIHRoZSBzZXJpZXMnIGRlZmluZWQgcG9pbnRzLiAqL1xuICBsaW5lUGF0aChzZXJpZXNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aCh0aGlzLnBvaW50c0ZvcihzZXJpZXNLZXkpLCBmYWxzZSk7XG4gIH1cblxuICAvKiogTW9ub3RvbmUtY3ViaWMgcGF0aCB0aHJvdWdoIHRoZSBzZXJpZXMnIGRlZmluZWQgcG9pbnRzLiAqL1xuICBzbW9vdGhQYXRoKHNlcmllc0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoKHRoaXMucG9pbnRzRm9yKHNlcmllc0tleSksIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbGxlZC1hcmVhIHBhdGg6IHRoZSBzZXJpZXMnIGxpbmUsIGNsb3NlZCBiYWNrIGFsb25nIGl0cyBiYXNlbGluZS4gV2hlblxuICAgKiBzdGFja2VkLCB0aGUgZmxvb3IgaXMgdGhlIHRvcCBvZiB0aGUgc2VyaWVzIGJlbG93IHJhdGhlciB0aGFuIHplcm8uXG4gICAqL1xuICBhcmVhUGF0aChzZXJpZXNLZXk6IHN0cmluZywgc21vb3RoOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50c0ZvcihzZXJpZXNLZXkpO1xuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCB0b3AgPSBidWlsZFBhdGgocG9pbnRzLCBzbW9vdGgpO1xuICAgIGNvbnN0IGZsb29yID0gcG9pbnRzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLnN0YWNrZWQgPyB0aGlzLnN0YWNrQmFzZShzZXJpZXNLZXksIHAuaW5kZXgpIDogMDtcbiAgICAgICAgcmV0dXJuIHsgeDogcC54LCB5OiB0aGlzLnlGb3IoYmFzZSksIGluZGV4OiBwLmluZGV4IH07XG4gICAgICB9KVxuICAgICAgLnJldmVyc2UoKTtcbiAgICBjb25zdCBib3R0b20gPSBidWlsZFBhdGgoZmxvb3IsIHNtb290aCk7XG4gICAgLy8gUmUtZW50ZXIgdGhlIHJldmVyc2VkIGZsb29yIHdpdGggYSBsaW5lLCB0aGVuIGNsb3NlLlxuICAgIHJldHVybiB0b3AgKyAnIEwgJyArIGZsb29yWzBdLnggKyAnICcgKyBmbG9vclswXS55ICsgJyAnICsgYm90dG9tLnJlcGxhY2UoL15NLywgJ0wnKSArICcgWic7XG4gIH1cblxuICAvKiogUmVzb2x2ZWQgc3ZnIHBvaW50cyBmb3IgYSBzZXJpZXMsIHNraXBwaW5nIHJvd3Mgd2hlcmUgaXQgaGFzIG5vIHZhbHVlLiAqL1xuICBwb2ludHNGb3Ioc2VyaWVzS2V5OiBzdHJpbmcpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBpbmRleDogbnVtYmVyIH1bXSB7XG4gICAgY29uc3QgcG9pbnRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBpbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZUF0KHNlcmllc0tleSwgaSk7XG4gICAgICBpZiAodiA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHN0YWNrZWQgPSB0aGlzLnN0YWNrZWQgPyB0aGlzLnN0YWNrQmFzZShzZXJpZXNLZXksIGkpICsgdiA6IHY7XG4gICAgICBwb2ludHMucHVzaCh7IHg6IHRoaXMueEZvcihpKSwgeTogdGhpcy55Rm9yKHN0YWNrZWQpLCBpbmRleDogaSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHB1cmUgaGVscGVyc1xuXG4vKiogRGVjaW1hbCBwbGFjZXMgd29ydGggc2hvd2luZyBmb3IgYSBnaXZlbiB0aWNrIHN0ZXAuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjaW1hbHNGb3Ioc3RlcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc3RlcCkgfHwgc3RlcCA8PSAwKSByZXR1cm4gMDtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDYsIC1NYXRoLmZsb29yKE1hdGgubG9nMTAoc3RlcCkpKSk7XG59XG5cbi8qKlxuICogUm91bmRzIGEgcmF3IHN0ZXAgdXAgdG8gdGhlIG5leHQgMS8yLzUgeCAxMF5uLlxuICpcbiAqIERpdmlkaW5nIHRoZSByYW5nZSBieSBhIHRpY2sgY291bnQgaW5zdGVhZCB3b3VsZCBwcm9kdWNlIHN0ZXBzIGxpa2UgMTkuNCBhbmRcbiAqIHNvIGF4aXMgbGFiZWxzIGxpa2UgMTkuNCAvIDM4LjggLyA1OC4yLCB3aGljaCBub2JvZHkgY2FuIHJlYWQgYSB2YWx1ZSBvZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuaWNlU3RlcChyYXdTdGVwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShyYXdTdGVwKSB8fCByYXdTdGVwIDw9IDApIHJldHVybiAxO1xuICBjb25zdCBtYWduaXR1ZGUgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZzEwKHJhd1N0ZXApKSk7XG4gIGNvbnN0IG5vcm1hbGlzZWQgPSByYXdTdGVwIC8gbWFnbml0dWRlO1xuICBsZXQgbXVsdGlwbGllcjogbnVtYmVyO1xuICBpZiAobm9ybWFsaXNlZCA8PSAxKSBtdWx0aXBsaWVyID0gMTtcbiAgZWxzZSBpZiAobm9ybWFsaXNlZCA8PSAyKSBtdWx0aXBsaWVyID0gMjtcbiAgZWxzZSBpZiAobm9ybWFsaXNlZCA8PSA1KSBtdWx0aXBsaWVyID0gNTtcbiAgZWxzZSBtdWx0aXBsaWVyID0gMTA7XG4gIHJldHVybiBtdWx0aXBsaWVyICogbWFnbml0dWRlO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHJlYWRhYmxlIHkgc2NhbGUgb3ZlciBgdmFsdWVzYDogcmV0dXJucyBgW21pbiwgbWF4LCBzdGVwLCB0aWNrc11gXG4gKiB3aXRoIHRoZSBkb21haW4gc25hcHBlZCBvdXR3YXJkIHRvIHdob2xlIHN0ZXBzLlxuICpcbiAqIERlZ2VuZXJhdGUgaW5wdXRzIChlbXB0eSwgYWxsLWlkZW50aWNhbCkgc3RpbGwgcHJvZHVjZSBhIHVzYWJsZSBvbmUtdW5pdFxuICogZG9tYWluIHJhdGhlciB0aGFuIGEgemVyby1oZWlnaHQgcGxvdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5pY2VTY2FsZSh2YWx1ZXM6IG51bWJlcltdLCB0YXJnZXRUaWNrcyA9IDUpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyW11dIHtcbiAgY29uc3QgZmluaXRlID0gdmFsdWVzLmZpbHRlcigodikgPT4gTnVtYmVyLmlzRmluaXRlKHYpKTtcblxuICBsZXQgbWluID0gZmluaXRlLmxlbmd0aCA/IE1hdGgubWluKC4uLmZpbml0ZSkgOiAwO1xuICBsZXQgbWF4ID0gZmluaXRlLmxlbmd0aCA/IE1hdGgubWF4KC4uLmZpbml0ZSkgOiAxO1xuXG4gIGlmIChtaW4gPT09IG1heCkge1xuICAgIC8vIEEgZmxhdCBvciBzaW5nbGUtcG9pbnQgZG9tYWluIGhhcyBubyBzcGFuIHRvIGRpdmlkZTsgb3BlbiBpdCB0byBvbmUgdW5pdFxuICAgIC8vIGFyb3VuZCB0aGUgdmFsdWUgc28gdGhlIG1hcmsgc2l0cyBvbiBhIHJlYWwgYXhpcyBpbnN0ZWFkIG9mIG9uIHRoZSBmbG9vci5cbiAgICBpZiAobWluID09PSAwKSB7XG4gICAgICBtaW4gPSAwO1xuICAgICAgbWF4ID0gMTtcbiAgICB9IGVsc2UgaWYgKG1pbiA+IDApIHtcbiAgICAgIG1pbiA9IE1hdGgubWluKDAsIG1pbik7XG4gICAgICBtYXggPSBtYXggPT09IDAgPyAxIDogbWF4O1xuICAgICAgaWYgKG1pbiA9PT0gbWF4KSBtYXggPSBtaW4gKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXggPSBNYXRoLm1heCgwLCBtYXgpO1xuICAgICAgaWYgKG1pbiA9PT0gbWF4KSBtaW4gPSBtYXggLSAxO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0ZXAgPSBuaWNlU3RlcCgobWF4IC0gbWluKSAvIHRhcmdldFRpY2tzKTtcbiAgLy8gTnVkZ2UgYmVmb3JlIHJvdW5kaW5nIG91dHdhcmQ6IDEwMC8yMCBsYW5kcyBhIGhhaXIgYWJvdmUgNSBpbiBiaW5hcnlcbiAgLy8gZmxvYXRpbmcgcG9pbnQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBhZGQgYSBwaGFudG9tIHRpY2sgYXQgMTIwLlxuICBjb25zdCBlcHNpbG9uID0gMWUtOTtcbiAgY29uc3QgbmljZU1pbiA9IE1hdGguZmxvb3IobWluIC8gc3RlcCArIGVwc2lsb24pICogc3RlcDtcbiAgY29uc3QgbmljZU1heCA9IE1hdGguY2VpbChtYXggLyBzdGVwIC0gZXBzaWxvbikgKiBzdGVwO1xuICBjb25zdCBkZWNpbWFscyA9IGRlY2ltYWxzRm9yKHN0ZXApO1xuXG4gIGNvbnN0IHRpY2tzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB0b3RhbCA9IE1hdGgucm91bmQoKG5pY2VNYXggLSBuaWNlTWluKSAvIHN0ZXApO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSB0b3RhbDsgaSsrKSB7XG4gICAgdGlja3MucHVzaChOdW1iZXIoKG5pY2VNaW4gKyBpICogc3RlcCkudG9GaXhlZChkZWNpbWFscykpKTtcbiAgfVxuXG4gIHJldHVybiBbTnVtYmVyKG5pY2VNaW4udG9GaXhlZChkZWNpbWFscykpLCBOdW1iZXIobmljZU1heC50b0ZpeGVkKGRlY2ltYWxzKSksIHN0ZXAsIHRpY2tzXTtcbn1cblxuLyoqXG4gKiBNb25vdG9uZS1jdWJpYyB0YW5nZW50cyAoRnJpdHNjaC1DYXJsc29uKS4gTGltaXRpbmcgZWFjaCB0YW5nZW50IHRvIHRoZVxuICogbmVpZ2hib3VyaW5nIHNlY2FudHMgaXMgd2hhdCBzdG9wcyB0aGUgY3VydmUgb3ZlcnNob290aW5nOiBhIHBsYWluXG4gKiBDYXRtdWxsLVJvbSBzcGxpbmUgYnVsZ2VzIHBhc3QgdGhlIGRhdGEgYW5kIGludmVudHMgcGVha3MgdGhhdCB3ZXJlIG5ldmVyXG4gKiBtZWFzdXJlZCwgd2hpY2ggb24gYSBjaGFydCBpcyBhIGZhbHNlIHN0YXRlbWVudCBhYm91dCB0aGUgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbm90b25lVGFuZ2VudHMoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IG4gPSB4cy5sZW5ndGg7XG4gIGlmIChuIDwgMikgcmV0dXJuIG5ldyBBcnJheShuKS5maWxsKDApO1xuXG4gIGNvbnN0IHNlY2FudHM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykge1xuICAgIGNvbnN0IGR4ID0geHNbaSArIDFdIC0geHNbaV07XG4gICAgc2VjYW50cy5wdXNoKGR4ID09PSAwID8gMCA6ICh5c1tpICsgMV0gLSB5c1tpXSkgLyBkeCk7XG4gIH1cblxuICBjb25zdCBtOiBudW1iZXJbXSA9IG5ldyBBcnJheShuKTtcbiAgbVswXSA9IHNlY2FudHNbMF07XG4gIG1bbiAtIDFdID0gc2VjYW50c1tuIC0gMl07XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbiAtIDE7IGkrKykgbVtpXSA9IChzZWNhbnRzW2kgLSAxXSArIHNlY2FudHNbaV0pIC8gMjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHtcbiAgICBpZiAoc2VjYW50c1tpXSA9PT0gMCkge1xuICAgICAgLy8gRmxhdCBzZWdtZW50OiBib3RoIGVuZHMgbXVzdCBiZSBmbGF0IG9yIHRoZSBjdXJ2ZSBsZWF2ZXMgdGhlIGRhdGEgcmFuZ2UuXG4gICAgICBtW2ldID0gMDtcbiAgICAgIG1baSArIDFdID0gMDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhID0gbVtpXSAvIHNlY2FudHNbaV07XG4gICAgY29uc3QgYiA9IG1baSArIDFdIC8gc2VjYW50c1tpXTtcbiAgICAvLyBOZWdhdGl2ZSByYXRpb3MgbWVhbiB0aGUgdGFuZ2VudCBwb2ludHMgYXdheSBmcm9tIHRoZSBzZWNhbnQuXG4gICAgaWYgKGEgPCAwKSBtW2ldID0gMDtcbiAgICBpZiAoYiA8IDApIG1baSArIDFdID0gMDtcbiAgICBjb25zdCBzdW0gPSBhICogYSArIGIgKiBiO1xuICAgIGlmIChzdW0gPiA5KSB7XG4gICAgICBjb25zdCB0ID0gMyAvIE1hdGguc3FydChzdW0pO1xuICAgICAgbVtpXSA9IHQgKiBhICogc2VjYW50c1tpXTtcbiAgICAgIG1baSArIDFdID0gdCAqIGIgKiBzZWNhbnRzW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtO1xufVxuXG4vKiogVHVybnMgcmVzb2x2ZWQgcG9pbnRzIGludG8gYW4gc3ZnIHBhdGgsIG9wdGlvbmFsbHkgbW9ub3RvbmUtc21vb3RoZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQYXRoKHBvaW50czogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9W10sIHNtb290aDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChwb2ludHMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSByZXR1cm4gJ00gJyArIHBvaW50c1swXS54ICsgJyAnICsgcG9pbnRzWzBdLnk7XG5cbiAgY29uc3QgaGVhZCA9ICdNICcgKyBwb2ludHNbMF0ueCArICcgJyArIHBvaW50c1swXS55O1xuICBpZiAoIXNtb290aCkge1xuICAgIHJldHVybiBoZWFkICsgcG9pbnRzLnNsaWNlKDEpLm1hcCgocCkgPT4gJyBMICcgKyBwLnggKyAnICcgKyBwLnkpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgeHMgPSBwb2ludHMubWFwKChwKSA9PiBwLngpO1xuICBjb25zdCB5cyA9IHBvaW50cy5tYXAoKHApID0+IHAueSk7XG4gIGNvbnN0IG0gPSBtb25vdG9uZVRhbmdlbnRzKHhzLCB5cyk7XG5cbiAgbGV0IGQgPSBoZWFkO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBkeCA9IHhzW2kgKyAxXSAtIHhzW2ldO1xuICAgIGNvbnN0IGMxeCA9IHhzW2ldICsgZHggLyAzO1xuICAgIGNvbnN0IGMxeSA9IHlzW2ldICsgKG1baV0gKiBkeCkgLyAzO1xuICAgIGNvbnN0IGMyeCA9IHhzW2kgKyAxXSAtIGR4IC8gMztcbiAgICBjb25zdCBjMnkgPSB5c1tpICsgMV0gLSAobVtpICsgMV0gKiBkeCkgLyAzO1xuICAgIGQgKz0gJyBDICcgKyBjMXggKyAnICcgKyBjMXkgKyAnICcgKyBjMnggKyAnICcgKyBjMnkgKyAnICcgKyB4c1tpICsgMV0gKyAnICcgKyB5c1tpICsgMV07XG4gIH1cbiAgcmV0dXJuIGQ7XG59XG4iXX0=
@@ -0,0 +1,138 @@
1
+ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cn } from './utils/cn';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Radial counterpart to `tolle-progress`: a ring that fills clockwise from
7
+ * 12 o'clock. Project content to label the centre — a percentage, an icon,
8
+ * whatever the caller wants; the ring renders nothing there on its own.
9
+ * @new
10
+ */
11
+ export class ProgressCircleComponent {
12
+ /**
13
+ * Angular writes a bound `class` input through its styling path, which does
14
+ * not mark an OnPush component dirty — without this hook the component keeps
15
+ * rendering the class it was born with.
16
+ */
17
+ ngOnChanges() {
18
+ this.cdr.markForCheck();
19
+ }
20
+ /** Percent complete, 0-100. @default 0 */
21
+ value = 0;
22
+ /** Diameter of the ring in px. @default 120 */
23
+ size = 120;
24
+ /** Thickness of the ring in px. @default 8 */
25
+ strokeWidth = 8;
26
+ /** Extra Tailwind classes merged onto the ring via `cn()` (last-wins). */
27
+ class = '';
28
+ cdr = inject(ChangeDetectorRef);
29
+ get clampedValue() {
30
+ return Math.min(100, Math.max(0, this.value ?? 0));
31
+ }
32
+ get viewBox() {
33
+ return '0 0 ' + this.size + ' ' + this.size;
34
+ }
35
+ get center() {
36
+ return this.size / 2;
37
+ }
38
+ /** Leaves half the stroke width as margin so the ring never clips the frame. */
39
+ get radius() {
40
+ return Math.max(0, (this.size - this.strokeWidth) / 2);
41
+ }
42
+ get circumference() {
43
+ return 2 * Math.PI * this.radius;
44
+ }
45
+ get dashOffset() {
46
+ return this.circumference * (1 - this.clampedValue / 100);
47
+ }
48
+ get computedClass() {
49
+ return cn('relative inline-flex shrink-0 items-center justify-center', this.class);
50
+ }
51
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProgressCircleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
52
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProgressCircleComponent, isStandalone: true, selector: "tolle-progress-circle", inputs: { value: "value", size: "size", strokeWidth: "strokeWidth", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
53
+ <div
54
+ [class]="computedClass"
55
+ [style.width.px]="size"
56
+ [style.height.px]="size"
57
+ role="progressbar"
58
+ [attr.aria-valuemin]="0"
59
+ [attr.aria-valuemax]="100"
60
+ [attr.aria-valuenow]="clampedValue"
61
+ >
62
+ <svg [attr.width]="size" [attr.height]="size" [attr.viewBox]="viewBox" class="block">
63
+ <svg:circle
64
+ [attr.cx]="center"
65
+ [attr.cy]="center"
66
+ [attr.r]="radius"
67
+ fill="none"
68
+ [attr.stroke-width]="strokeWidth"
69
+ class="stroke-primary/20"
70
+ ></svg:circle>
71
+ <svg:circle
72
+ [attr.cx]="center"
73
+ [attr.cy]="center"
74
+ [attr.r]="radius"
75
+ fill="none"
76
+ [attr.stroke-width]="strokeWidth"
77
+ stroke-linecap="round"
78
+ [attr.stroke-dasharray]="circumference"
79
+ [attr.stroke-dashoffset]="dashOffset"
80
+ [attr.transform]="'rotate(-90 ' + center + ' ' + center + ')'"
81
+ class="stroke-primary transition-[stroke-dashoffset] duration-300 ease-in-out"
82
+ ></svg:circle>
83
+ </svg>
84
+ <div class="absolute inset-0 flex items-center justify-center text-sm font-medium tabular-nums text-foreground">
85
+ <ng-content></ng-content>
86
+ </div>
87
+ </div>
88
+ `, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
89
+ }
90
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProgressCircleComponent, decorators: [{
91
+ type: Component,
92
+ args: [{ selector: 'tolle-progress-circle', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
93
+ <div
94
+ [class]="computedClass"
95
+ [style.width.px]="size"
96
+ [style.height.px]="size"
97
+ role="progressbar"
98
+ [attr.aria-valuemin]="0"
99
+ [attr.aria-valuemax]="100"
100
+ [attr.aria-valuenow]="clampedValue"
101
+ >
102
+ <svg [attr.width]="size" [attr.height]="size" [attr.viewBox]="viewBox" class="block">
103
+ <svg:circle
104
+ [attr.cx]="center"
105
+ [attr.cy]="center"
106
+ [attr.r]="radius"
107
+ fill="none"
108
+ [attr.stroke-width]="strokeWidth"
109
+ class="stroke-primary/20"
110
+ ></svg:circle>
111
+ <svg:circle
112
+ [attr.cx]="center"
113
+ [attr.cy]="center"
114
+ [attr.r]="radius"
115
+ fill="none"
116
+ [attr.stroke-width]="strokeWidth"
117
+ stroke-linecap="round"
118
+ [attr.stroke-dasharray]="circumference"
119
+ [attr.stroke-dashoffset]="dashOffset"
120
+ [attr.transform]="'rotate(-90 ' + center + ' ' + center + ')'"
121
+ class="stroke-primary transition-[stroke-dashoffset] duration-300 ease-in-out"
122
+ ></svg:circle>
123
+ </svg>
124
+ <div class="absolute inset-0 flex items-center justify-center text-sm font-medium tabular-nums text-foreground">
125
+ <ng-content></ng-content>
126
+ </div>
127
+ </div>
128
+ `, styles: [":host{display:inline-flex}\n"] }]
129
+ }], propDecorators: { value: [{
130
+ type: Input
131
+ }], size: [{
132
+ type: Input
133
+ }], strokeWidth: [{
134
+ type: Input
135
+ }], class: [{
136
+ type: Input
137
+ }] } });
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MtY2lyY2xlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvcHJvZ3Jlc3MtY2lyY2xlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBRWhDOzs7OztHQUtHO0FBNkNILE1BQU0sT0FBTyx1QkFBdUI7SUFDbEM7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCwwQ0FBMEM7SUFDakMsS0FBSyxHQUFrQixDQUFDLENBQUM7SUFDbEMsK0NBQStDO0lBQ3RDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDcEIsOENBQThDO0lBQ3JDLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDekIsMEVBQTBFO0lBQ2pFLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFSCxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFakQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sRUFBRSxDQUFDLDJEQUEyRCxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRixDQUFDO3dHQWhEVSx1QkFBdUI7NEZBQXZCLHVCQUF1Qiw0TEF0Q3hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ1QscUdBdENTLFlBQVk7OzRGQXdDWCx1QkFBdUI7a0JBNUNuQyxTQUFTOytCQUNFLHVCQUF1QixjQUVyQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBQ04sdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NUOzhCQWFRLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuLyoqXG4gKiBSYWRpYWwgY291bnRlcnBhcnQgdG8gYHRvbGxlLXByb2dyZXNzYDogYSByaW5nIHRoYXQgZmlsbHMgY2xvY2t3aXNlIGZyb21cbiAqIDEyIG8nY2xvY2suIFByb2plY3QgY29udGVudCB0byBsYWJlbCB0aGUgY2VudHJlIOKAlCBhIHBlcmNlbnRhZ2UsIGFuIGljb24sXG4gKiB3aGF0ZXZlciB0aGUgY2FsbGVyIHdhbnRzOyB0aGUgcmluZyByZW5kZXJzIG5vdGhpbmcgdGhlcmUgb24gaXRzIG93bi5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtcHJvZ3Jlc3MtY2lyY2xlJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogaW5saW5lLWZsZXg7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzaXplXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2l6ZVwiXG4gICAgICByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgW2F0dHIuYXJpYS12YWx1ZW1pbl09XCIwXCJcbiAgICAgIFthdHRyLmFyaWEtdmFsdWVtYXhdPVwiMTAwXCJcbiAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwiY2xhbXBlZFZhbHVlXCJcbiAgICA+XG4gICAgICA8c3ZnIFthdHRyLndpZHRoXT1cInNpemVcIiBbYXR0ci5oZWlnaHRdPVwic2l6ZVwiIFthdHRyLnZpZXdCb3hdPVwidmlld0JveFwiIGNsYXNzPVwiYmxvY2tcIj5cbiAgICAgICAgPHN2ZzpjaXJjbGVcbiAgICAgICAgICBbYXR0ci5jeF09XCJjZW50ZXJcIlxuICAgICAgICAgIFthdHRyLmN5XT1cImNlbnRlclwiXG4gICAgICAgICAgW2F0dHIucl09XCJyYWRpdXNcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwic3Ryb2tlV2lkdGhcIlxuICAgICAgICAgIGNsYXNzPVwic3Ryb2tlLXByaW1hcnkvMjBcIlxuICAgICAgICA+PC9zdmc6Y2lyY2xlPlxuICAgICAgICA8c3ZnOmNpcmNsZVxuICAgICAgICAgIFthdHRyLmN4XT1cImNlbnRlclwiXG4gICAgICAgICAgW2F0dHIuY3ldPVwiY2VudGVyXCJcbiAgICAgICAgICBbYXR0ci5yXT1cInJhZGl1c1wiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJzdHJva2VXaWR0aFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJjaXJjdW1mZXJlbmNlXCJcbiAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaG9mZnNldF09XCJkYXNoT2Zmc2V0XCJcbiAgICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiJ3JvdGF0ZSgtOTAgJyArIGNlbnRlciArICcgJyArIGNlbnRlciArICcpJ1wiXG4gICAgICAgICAgY2xhc3M9XCJzdHJva2UtcHJpbWFyeSB0cmFuc2l0aW9uLVtzdHJva2UtZGFzaG9mZnNldF0gZHVyYXRpb24tMzAwIGVhc2UtaW4tb3V0XCJcbiAgICAgICAgPjwvc3ZnOmNpcmNsZT5cbiAgICAgIDwvc3ZnPlxuICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGluc2V0LTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSB0YWJ1bGFyLW51bXMgdGV4dC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc0NpcmNsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogUGVyY2VudCBjb21wbGV0ZSwgMC0xMDAuIEBkZWZhdWx0IDAgKi9cbiAgQElucHV0KCkgdmFsdWU6IG51bWJlciB8IG51bGwgPSAwO1xuICAvKiogRGlhbWV0ZXIgb2YgdGhlIHJpbmcgaW4gcHguIEBkZWZhdWx0IDEyMCAqL1xuICBASW5wdXQoKSBzaXplID0gMTIwO1xuICAvKiogVGhpY2tuZXNzIG9mIHRoZSByaW5nIGluIHB4LiBAZGVmYXVsdCA4ICovXG4gIEBJbnB1dCgpIHN0cm9rZVdpZHRoID0gODtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHJpbmcgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgZ2V0IGNsYW1wZWRWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIHRoaXMudmFsdWUgPz8gMCkpO1xuICB9XG5cbiAgZ2V0IHZpZXdCb3goKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJzAgMCAnICsgdGhpcy5zaXplICsgJyAnICsgdGhpcy5zaXplO1xuICB9XG5cbiAgZ2V0IGNlbnRlcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNpemUgLyAyO1xuICB9XG5cbiAgLyoqIExlYXZlcyBoYWxmIHRoZSBzdHJva2Ugd2lkdGggYXMgbWFyZ2luIHNvIHRoZSByaW5nIG5ldmVyIGNsaXBzIHRoZSBmcmFtZS4gKi9cbiAgZ2V0IHJhZGl1cygpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCAodGhpcy5zaXplIC0gdGhpcy5zdHJva2VXaWR0aCkgLyAyKTtcbiAgfVxuXG4gIGdldCBjaXJjdW1mZXJlbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDIgKiBNYXRoLlBJICogdGhpcy5yYWRpdXM7XG4gIH1cblxuICBnZXQgZGFzaE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNpcmN1bWZlcmVuY2UgKiAoMSAtIHRoaXMuY2xhbXBlZFZhbHVlIC8gMTAwKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbigncmVsYXRpdmUgaW5saW5lLWZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,84 @@
1
+ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cn } from './utils/cn';
4
+ import { TooltipDirective } from './tooltip.directive';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ const STATUS_COLOR = {
8
+ success: 'rgb(var(--success))',
9
+ warning: 'rgb(var(--warning))',
10
+ error: 'rgb(var(--destructive))',
11
+ neutral: 'rgb(var(--muted))',
12
+ };
13
+ /**
14
+ * A row of equal-width blocks, one per period — an uptime or activity strip.
15
+ * Each block is a real `<button>` so its tooltip is reachable by keyboard and
16
+ * has a screen-reader name of its own, not just a hover affordance.
17
+ * @new
18
+ */
19
+ export class TrackerComponent {
20
+ /**
21
+ * Angular writes a bound `class` input through its styling path, which does
22
+ * not mark an OnPush component dirty — without this hook the component keeps
23
+ * rendering the class it was born with.
24
+ */
25
+ ngOnChanges() {
26
+ this.cdr.markForCheck();
27
+ }
28
+ /** Identity for `*ngFor`, so a redraw patches nodes instead of replacing them. */
29
+ trackByIndex = (index) => index;
30
+ /** One block per period, in chronological order. @default [] */
31
+ data = [];
32
+ /** Height of each block in px. @default 32 */
33
+ blockHeight = 32;
34
+ /** Accessible name for the whole strip. @default '' */
35
+ ariaLabel = '';
36
+ /** Extra Tailwind classes merged onto the strip via `cn()` (last-wins). */
37
+ class = '';
38
+ cdr = inject(ChangeDetectorRef);
39
+ colorFor(block) {
40
+ return block.color || STATUS_COLOR[block.status ?? 'neutral'];
41
+ }
42
+ get computedClass() {
43
+ return cn('flex w-full items-stretch gap-0.5', this.class);
44
+ }
45
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TrackerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
46
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TrackerComponent, isStandalone: true, selector: "tolle-tracker", inputs: { data: "data", blockHeight: "blockHeight", ariaLabel: "ariaLabel", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
47
+ <div [class]="computedClass" role="group" [attr.aria-label]="ariaLabel || null">
48
+ <button
49
+ *ngFor="let block of data; let i = index; trackBy: trackByIndex"
50
+ type="button"
51
+ class="flex-1 rounded-[2px] transition-opacity hover:opacity-80 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring"
52
+ [style.height.px]="blockHeight"
53
+ [style.background]="colorFor(block)"
54
+ [tolleTooltip]="block.tooltip || ''"
55
+ [attr.aria-label]="block.tooltip || 'Period ' + (i + 1)"
56
+ ></button>
57
+ </div>
58
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: TooltipDirective, selector: "[tolleTooltip]", inputs: ["tolleTooltip", "placement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TrackerComponent, decorators: [{
61
+ type: Component,
62
+ args: [{ selector: 'tolle-tracker', standalone: true, imports: [CommonModule, TooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: `
63
+ <div [class]="computedClass" role="group" [attr.aria-label]="ariaLabel || null">
64
+ <button
65
+ *ngFor="let block of data; let i = index; trackBy: trackByIndex"
66
+ type="button"
67
+ class="flex-1 rounded-[2px] transition-opacity hover:opacity-80 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring"
68
+ [style.height.px]="blockHeight"
69
+ [style.background]="colorFor(block)"
70
+ [tolleTooltip]="block.tooltip || ''"
71
+ [attr.aria-label]="block.tooltip || 'Period ' + (i + 1)"
72
+ ></button>
73
+ </div>
74
+ `, styles: [":host{display:block}\n"] }]
75
+ }], propDecorators: { data: [{
76
+ type: Input
77
+ }], blockHeight: [{
78
+ type: Input
79
+ }], ariaLabel: [{
80
+ type: Input
81
+ }], class: [{
82
+ type: Input
83
+ }] } });
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL3RyYWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBWXZELE1BQU0sWUFBWSxHQUFrQztJQUNsRCxPQUFPLEVBQUUscUJBQXFCO0lBQzlCLE9BQU8sRUFBRSxxQkFBcUI7SUFDOUIsS0FBSyxFQUFFLHlCQUF5QjtJQUNoQyxPQUFPLEVBQUUsbUJBQW1CO0NBQzdCLENBQUM7QUFFRjs7Ozs7R0FLRztBQXFCSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO0lBRWhELGdFQUFnRTtJQUN2RCxJQUFJLEdBQW1CLEVBQUUsQ0FBQztJQUNuQyw4Q0FBOEM7SUFDckMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUMxQix1REFBdUQ7SUFDOUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QiwyRUFBMkU7SUFDbEUsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVILEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVqRCxRQUFRLENBQUMsS0FBbUI7UUFDMUIsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsQ0FBQzt3R0E5QlUsZ0JBQWdCOzRGQUFoQixnQkFBZ0IsNExBZGpCOzs7Ozs7Ozs7Ozs7R0FZVCwrRkFkUyxZQUFZLDRKQUFFLGdCQUFnQjs7NEZBZ0I3QixnQkFBZ0I7a0JBcEI1QixTQUFTOytCQUNFLGVBQWUsY0FFYixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsbUJBQ3hCLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7OztHQVlUOzhCQWdCUSxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25DaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4vdG9vbHRpcC5kaXJlY3RpdmUnO1xuXG4vKiogSGVhbHRoIG9mIG9uZSBwZXJpb2QgaW4gdGhlIHN0cmlwLiBNYXBzIHRvIHRoZSB0aGVtZSdzIHNlbWFudGljIHN0YXR1cyB0b2tlbnMsIG5vdCB0aGUgY2hhcnQgcGFsZXR0ZS4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrZXJTdGF0dXMgPSAnc3VjY2VzcycgfCAnd2FybmluZycgfCAnZXJyb3InIHwgJ25ldXRyYWwnO1xuXG4vKiogT25lIGJsb2NrOiBpdHMgaGVhbHRoLCBhbiBvcHRpb25hbCBwZXItYmxvY2sgY29sb3VyIG92ZXJyaWRlLCBhbmQgdGhlIHRvb2x0aXAgbmFtaW5nIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFja2VyQmxvY2sge1xuICBzdGF0dXM/OiBUcmFja2VyU3RhdHVzO1xuICBjb2xvcj86IHN0cmluZztcbiAgdG9vbHRpcD86IHN0cmluZztcbn1cblxuY29uc3QgU1RBVFVTX0NPTE9SOiBSZWNvcmQ8VHJhY2tlclN0YXR1cywgc3RyaW5nPiA9IHtcbiAgc3VjY2VzczogJ3JnYih2YXIoLS1zdWNjZXNzKSknLFxuICB3YXJuaW5nOiAncmdiKHZhcigtLXdhcm5pbmcpKScsXG4gIGVycm9yOiAncmdiKHZhcigtLWRlc3RydWN0aXZlKSknLFxuICBuZXV0cmFsOiAncmdiKHZhcigtLW11dGVkKSknLFxufTtcblxuLyoqXG4gKiBBIHJvdyBvZiBlcXVhbC13aWR0aCBibG9ja3MsIG9uZSBwZXIgcGVyaW9kIOKAlCBhbiB1cHRpbWUgb3IgYWN0aXZpdHkgc3RyaXAuXG4gKiBFYWNoIGJsb2NrIGlzIGEgcmVhbCBgPGJ1dHRvbj5gIHNvIGl0cyB0b29sdGlwIGlzIHJlYWNoYWJsZSBieSBrZXlib2FyZCBhbmRcbiAqIGhhcyBhIHNjcmVlbi1yZWFkZXIgbmFtZSBvZiBpdHMgb3duLCBub3QganVzdCBhIGhvdmVyIGFmZm9yZGFuY2UuXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRyYWNrZXInLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBUb29sdGlwRGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiIHJvbGU9XCJncm91cFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsIHx8IG51bGxcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nRm9yPVwibGV0IGJsb2NrIG9mIGRhdGE7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImZsZXgtMSByb3VuZGVkLVsycHhdIHRyYW5zaXRpb24tb3BhY2l0eSBob3ZlcjpvcGFjaXR5LTgwIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLXJpbmdcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImJsb2NrSGVpZ2h0XCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JGb3IoYmxvY2spXCJcbiAgICAgICAgW3RvbGxlVG9vbHRpcF09XCJibG9jay50b29sdGlwIHx8ICcnXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJibG9jay50b29sdGlwIHx8ICdQZXJpb2QgJyArIChpICsgMSlcIlxuICAgICAgPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBUcmFja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBJZGVudGl0eSBmb3IgYCpuZ0ZvcmAsIHNvIGEgcmVkcmF3IHBhdGNoZXMgbm9kZXMgaW5zdGVhZCBvZiByZXBsYWNpbmcgdGhlbS4gKi9cbiAgdHJhY2tCeUluZGV4ID0gKGluZGV4OiBudW1iZXIpOiBudW1iZXIgPT4gaW5kZXg7XG5cbiAgLyoqIE9uZSBibG9jayBwZXIgcGVyaW9kLCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLiBAZGVmYXVsdCBbXSAqL1xuICBASW5wdXQoKSBkYXRhOiBUcmFja2VyQmxvY2tbXSA9IFtdO1xuICAvKiogSGVpZ2h0IG9mIGVhY2ggYmxvY2sgaW4gcHguIEBkZWZhdWx0IDMyICovXG4gIEBJbnB1dCgpIGJsb2NrSGVpZ2h0ID0gMzI7XG4gIC8qKiBBY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZSB3aG9sZSBzdHJpcC4gQGRlZmF1bHQgJycgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsID0gJyc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBzdHJpcCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBjb2xvckZvcihibG9jazogVHJhY2tlckJsb2NrKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYmxvY2suY29sb3IgfHwgU1RBVFVTX0NPTE9SW2Jsb2NrLnN0YXR1cyA/PyAnbmV1dHJhbCddO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKCdmbGV4IHctZnVsbCBpdGVtcy1zdHJldGNoIGdhcC0wLjUnLCB0aGlzLmNsYXNzKTtcbiAgfVxufVxuIl19