@one-grid-core/angular 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -155,6 +155,11 @@ export class OneGridApi {
155
155
  }
156
156
  const validRowIds = new Set();
157
157
  this.buildRowNodes(rowData, null, 0, validRowIds);
158
+ // Prune BEFORE sorting and filtering: both read `_originalRowNodes`, and
159
+ // with the prune last, a data swap while a sort was active resurrected
160
+ // the removed rows into `_rowNodes` for one whole render — the old and
161
+ // the new dataset on screen together until the next rebuild.
162
+ this.pruneRemovedNodes(validRowIds);
158
163
  // Re-apply the active sort. `buildRowNodes` rebuilds the row list in the
159
164
  // order the data arrived, so without this a data update silently returned
160
165
  // the rows to that order while `sortModel` — and therefore the header's
@@ -163,12 +168,11 @@ export class OneGridApi {
163
168
  if (this._sortModel.length > 0)
164
169
  this.applySorting();
165
170
  this.applyFilters();
166
- this.pruneRemovedNodes(validRowIds);
167
171
  }
168
172
  /**
169
173
  * Recursive Build Row Nodes (Optimized)
170
174
  */
171
- buildRowNodes(rowData, parent = null, level = 0, validRowIds = new Set(), expandedIds = new Set(this.expansionService.getExpandedIds()), collapsedIds = new Set(this.expansionService.getCollapsedIds()), selectedIds = new Set(this.selectionService.getSelectedIds())) {
175
+ buildRowNodes(rowData, parent = null, level = 0, validRowIds = new Set(), expandedIds = new Set(this.expansionService.getExpandedIds()), collapsedIds = new Set(this.expansionService.getCollapsedIds()), selectedIds = new Set(this.selectionService.getSelectedIds()), visitedData = new Set()) {
172
176
  if (parent === null) {
173
177
  this._rowNodes = [];
174
178
  this._currentIndex = 0;
@@ -178,6 +182,16 @@ export class OneGridApi {
178
182
  const nodes = [];
179
183
  for (const data of rowData) {
180
184
  const rowId = this.rowService.generateRowId(data, this._currentIndex);
185
+ // A cycle in the children graph — a row reachable from its own subtree,
186
+ // the classic ORM back-reference — used to recurse until the stack blew,
187
+ // freezing the app; and with generated row ids it did so while minting
188
+ // nodes the whole way down. The same guard also drops a duplicate row id
189
+ // (or the same row object appearing twice): first occurrence wins.
190
+ if (visitedData.has(data) || validRowIds.has(rowId)) {
191
+ console.warn(`[one-grid] cyclic or duplicate row (id "${rowId}") — skipped, first occurrence wins. Tree data must be acyclic and row ids unique.`);
192
+ continue;
193
+ }
194
+ visitedData.add(data);
181
195
  const children = data[this.treeDataChildrenField] || null;
182
196
  let node = this._originalRowNodes.get(rowId);
183
197
  validRowIds.add(rowId);
@@ -214,7 +228,7 @@ export class OneGridApi {
214
228
  this._currentIndex++;
215
229
  this._rowNodes.push(node);
216
230
  nodes.push(node);
217
- node.children = this.treeData && childrenExist ? this.buildRowNodes(children || [], node, level + 1, validRowIds, expandedIds, collapsedIds, selectedIds) : [];
231
+ node.children = this.treeData && childrenExist ? this.buildRowNodes(children || [], node, level + 1, validRowIds, expandedIds, collapsedIds, selectedIds, visitedData) : [];
218
232
  }
219
233
  return nodes;
220
234
  }
@@ -413,7 +427,7 @@ export class OneGridApi {
413
427
  this._rowNodes = [...this._originalRowNodes.values()];
414
428
  return;
415
429
  }
416
- this._rowNodes = [...this._originalRowNodes.values()].sort((a, b) => {
430
+ const comparator = (a, b) => {
417
431
  for (const sortItem of this._sortModel) {
418
432
  const { colId, sort } = sortItem;
419
433
  const valA = getFieldValue(a.data, colId);
@@ -424,7 +438,31 @@ export class OneGridApi {
424
438
  }
425
439
  }
426
440
  return 0;
427
- });
441
+ };
442
+ if (!this.treeData) {
443
+ this._rowNodes = [...this._originalRowNodes.values()].sort(comparator);
444
+ return;
445
+ }
446
+ // A tree sorts siblings within their parent, never across it — a flat
447
+ // sort of the whole list interleaved parents with other parents' children
448
+ // and scrambled the hierarchy. Sorting the sibling arrays and re-walking
449
+ // depth-first keeps every parent immediately above its own children,
450
+ // which `refreshVisibleNodes` also depends on for its visibility cache.
451
+ // Group rows carry their aggregates in `data`, so sorting a grouped grid
452
+ // on an aggregated column orders the groups by their aggregate.
453
+ const flattened = [];
454
+ const walk = (siblings) => {
455
+ const sorted = [...siblings].sort(comparator);
456
+ for (const node of sorted) {
457
+ flattened.push(node);
458
+ if (node.children?.length) {
459
+ node.children = walk(node.children);
460
+ }
461
+ }
462
+ return sorted;
463
+ };
464
+ walk([...this._originalRowNodes.values()].filter(node => !node.parent));
465
+ this._rowNodes = flattened;
428
466
  }
429
467
  compareValues(valA, valB, sortDirection) {
430
468
  // `undefined` has to be treated as empty alongside `null`: getFieldValue
@@ -1144,4 +1182,4 @@ export class OneGridApi {
1144
1182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridApi, decorators: [{
1145
1183
  type: Injectable
1146
1184
  }], ctorParameters: () => [{ type: i1.OgColumnService }, { type: i2.OneGridRowService }, { type: i3.OneGridCellService }, { type: i4.OneGridEventService }, { type: i5.OneGridSelectionService }, { type: i6.OneGridExpansionService }] });
1147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFNakQsTUFBTSxPQUFPLFVBQVU7SUFxQnJCLHdEQUF3RDtJQUN4RCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3RUFBd0U7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L21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiwgT25lQ29sdW1uU3RhdGVFbnRyeSB9IGZyb20gJy4uL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSBcIi4vb25lLXJvdy1ub2RlLmNsYXNzXCI7XG5pbXBvcnQgeyBPbmVHcmlkSW5pdE9wdGlvbnMsIE9uZUdyaWRUeXBlLCBPbmVTb3J0TW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lR3JpZFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzLCBPbmVWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vbW9kZWxzL29uZS12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IE9uZUZpbHRlck1vZGVsIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtZmlsdGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkRXhwYW5zaW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWV4cGFuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcywgT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcyB9IGZyb20gXCIuLi9tb2RlbHMvb25lLW1hc3Rlci1kZXRhaWwubW9kZWxcIjtcbmltcG9ydCB7IE9uZUdyaWRSb3dTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL29uZS1ncmlkLXJvdy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBmaWx0ZXJUcmVlTm9kZSwgaXNGaWx0ZXJBY3RpdmUgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtZmlsdGVyLmhlbHBlclwiO1xuaW1wb3J0IHsgYnVpbGRDc3YsIE9uZUNzdkV4cG9ydE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtY3N2LmhlbHBlclwiO1xuaW1wb3J0IHsgYnVpbGRHcm91cGVkUm93cywgT25lQWdnQ29sdW1uLCBPTkVfR1JPVVBfSURfRklFTEQgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtcm93LWdyb3VwaW5nLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1yb3ctZHJhZy5tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgT25lUGlubmVkUm93U2lkZSwgUm93U2VsZWN0aW9uTW9kZSB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWxcIjtcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vZy1jb2x1bW4uc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT25lR3JpZEFwaTxUID0gYW55PiB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFB1YmxpYyBzdGF0ZVxuICAvL1xuICAvLyBFeHBvc2VkIGFzIGdldHRlcnMsIG5vdCBmaWVsZHMuIFRoZXNlIHdlcmUgd3JpdGFibGUsIHNvIGEgY29uc3VtZXIgY291bGRcbiAgLy8gY29ycnVwdCB0aGUgZ3JpZCBieSBhc3NpZ25pbmcgdG8gdGhlbSDigJQgc3dhcHBpbmcgYHJvd05vZGVzYCBmb3IgYW5cbiAgLy8gdW5yZWxhdGVkIGFycmF5LCBvciBzZXR0aW5nIGBzb3J0TW9kZWxgIHdpdGhvdXQgdGhlIHJvd3MgZXZlciBiZWluZ1xuICAvLyByZS1zb3J0ZWQuIFJlYWRzIGFyZSB1bmNoYW5nZWQ7IG9ubHkgYXNzaWdubWVudCBpcyBub3cgYSBjb21waWxlIGVycm9yLlxuICAvL1xuICAvLyBUaGUgYXJyYXktdmFsdWVkIG9uZXMgYXJlIHR5cGVkIGByZWFkb25seSBUW11gLCB3aGljaCBzdG9wcyBgcHVzaGAgYW5kXG4gIC8vIGBzcGxpY2VgIGF0IGNvbXBpbGUgdGltZSB3aXRob3V0IGNvcHlpbmcgb24gZXZlcnkgcmVhZC4gVXNlXG4gIC8vIGBnZXRBbGxSb3dOb2RlcygpYCB3aGVuIHlvdSB3YW50IGEgY29weSB5b3Ugb3duLlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfcm93U2VsZWN0aW9uOiBSb3dTZWxlY3Rpb25Nb2RlID0gbnVsbDtcbiAgcHJpdmF0ZSBfYXBpVHlwZTogT25lR3JpZFR5cGUgPSBudWxsO1xuICBwcml2YXRlIF9yb3dOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHByaXZhdGUgX3NvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10gPSBbXTtcblxuICAvKiogVW5pcXVlIHBlciBncmlkIGluc3RhbmNlLCBhc3NpZ25lZCBkdXJpbmcgYGluaXRgLiAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqIFRoZSBgW2NvbnRleHRdYCB0aGUgZ3JpZCB3YXMgZ2l2ZW4uICovXG4gIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgLyoqIFNlbGVjdGlvbiBtb2RlLCBjYXB0dXJlZCBkdXJpbmcgYGluaXRgLiBDaGFuZ2luZyB0aGUgaW5wdXQgbGF0ZXIgaGFzIG5vIGVmZmVjdC4gKi9cbiAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKTogUm93U2VsZWN0aW9uTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdGlvbjtcbiAgfVxuXG4gIC8qKiBXaGljaCByb2xlIHRoaXMgaW5zdGFuY2UgcGxheXM6IHNpbXBsZSwgbWFzdGVyLCBkZXRhaWwgb3IgdHJlZS4gKi9cbiAgcHVibGljIGdldCBhcGlUeXBlKCk6IE9uZUdyaWRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVHlwZTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBub2RlIHRoZSBncmlkIGhvbGRzLCBpbiBmbGF0dGVuZWQgb3JkZXIuICovXG4gIHB1YmxpYyBnZXQgcm93Tm9kZXMoKTogcmVhZG9ubHkgT25lUm93Tm9kZTxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM7XG4gIH1cblxuICAvKiogVGhlIHNvcnQgbW9kZWwgY3VycmVudGx5IGFwcGxpZWQuIENoYW5nZSBpdCB3aXRoIGBvblNvcnRDaGFuZ2VkYC4gKi9cbiAgcHVibGljIGdldCBzb3J0TW9kZWwoKTogcmVhZG9ubHkgT25lU29ydE1vZGVsPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0TW9kZWw7XG4gIH1cblxuXG4gIHByaXZhdGUgcm93SGVpZ2h0OiBudW1iZXIgPSAyNjtcbiAgcHJpdmF0ZSBoZWFkZXJSb3dIZWlnaHQ6IG51bWJlciA9IDMyO1xuICBwcml2YXRlIF9jdXJyZW50SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3F1aWNrRmlsdGVyVmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlcnM6IE9uZUZpbHRlck1vZGVsW10gPSBbXTtcblxuICBwcml2YXRlIF92aXNpYmxlUm93Tm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9waW5uZWRSb3dOb2RlczogUmVjb3JkPE9uZVBpbm5lZFJvd1NpZGUsIE9uZVJvd05vZGU8VD5bXT4gPSB7IHRvcDogW10sIGJvdHRvbTogW10gfTtcbiAgcHJpdmF0ZSBfb3JpZ2luYWxSb3dOb2RlczogTWFwPHN0cmluZywgT25lUm93Tm9kZTxUPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX25vZGVDbGVhbnVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PCgpID0+IHZvaWQ+PigpOyAvLyBDbGVhbnVwIHJlZ2lzdHJ5IChwcmV2ZW50cyBtZW1vcnkgbGVha3MpXG4gIHByaXZhdGUgX2Rlc3Ryb3llZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEFkdmFuY2VkIEZlYXR1cmVzXG4gIHByaXZhdGUgdHJlZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgZ3JvdXBEZWZhdWx0RXhwYW5kZWQ6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgcHJpdmF0ZSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudD86IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogU3VwcGxpZXMgYSBtYXN0ZXIgcm93J3MgZGV0YWlsIHJvd3MuIFNldCB0aHJvdWdoIGBzZXRHZXREZXRhaWxSb3dEYXRhYDtcbiAgICogcHJldmlvdXNseSBhIHdyaXRhYmxlIHB1YmxpYyBmaWVsZCB3aXRoIGEgc2V0dGVyIGJlc2lkZSBpdCwgd2hpY2ggbGVmdCB0d29cbiAgICogd2F5cyB0byBkbyB0aGUgc2FtZSB0aGluZyBhbmQgb25lIG9mIHRoZW0gdW5jaGVja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGV0YWlsUm93RGF0YTogKHBhcmFtczogT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcykgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbHVtblNlcnZpY2U6IE9nQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIHJvd1NlcnZpY2U6IE9uZUdyaWRSb3dTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2VsbFNlcnZpY2U6IE9uZUdyaWRDZWxsU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHNlbGVjdGlvblNlcnZpY2U6IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZXhwYW5zaW9uU2VydmljZTogT25lR3JpZEV4cGFuc2lvblNlcnZpY2VcbiAgKSB7IH1cblxuICAvKipcbiAgICogU3RhbmQgdGhlIGdyaWQgdXAuIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudGAgZnJvbSBgbmdPbkluaXRgLlxuICAgKlxuICAgKiBUYWtlcyBhIHNpbmdsZSBgT25lR3JpZEluaXRPcHRpb25zYCByYXRoZXIgdGhhbiB0aGUgdGVuIHBvc2l0aW9uYWxcbiAgICogYXJndW1lbnRzIGl0IHVzZWQgdG8sIHNvIGEgY2FsbCBzaXRlIHJlYWRzIGFzIHRoZSBjb25maWd1cmF0aW9uIGl0IGlzIGFuZFxuICAgKiBhIG5ldyBvcHRpb24gbm8gbG9uZ2VyIG1lYW5zIGVkaXRpbmcgZXZlcnkgY2FsbGVyLlxuICAgKlxuICAgKiBAaW50ZXJuYWwgQXBwbGljYXRpb25zIG9idGFpbiBhIHJlYWR5LW1hZGUgQVBJIGZyb20gYChvbkdyaWRSZWFkeSlgOyB0aGV5XG4gICAqIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgdGhlbXNlbHZlcy5cbiAgICovXG4gIGluaXQob3B0aW9uczogT25lR3JpZEluaXRPcHRpb25zPFQ+KTogdm9pZCB7XG5cbiAgICBjb25zdCB7XG4gICAgICBncmlkVHlwZSxcbiAgICAgIGNvbHVtbkRlZnMsXG4gICAgICBkZWZhdWx0Q29sdW1uRGVmID0ge30sXG4gICAgICBncm91cENvbHVtbkRlZnMgPSBbXSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgcm93U2VsZWN0aW9uID0gbnVsbCxcbiAgICAgIG1hc3RlckRldGFpbCA9IGZhbHNlLFxuICAgICAgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gbnVsbCxcbiAgICAgIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gbnVsbCxcbiAgICAgIHRyZWVEYXRhID0gZmFsc2UsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICB0aGlzLl9pZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuX2FwaVR5cGUgPSBncmlkVHlwZTtcbiAgICB0aGlzLl9yb3dTZWxlY3Rpb24gPSByb3dTZWxlY3Rpb247XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBtYXN0ZXJEZXRhaWw7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM7XG4gICAgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IGRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuICAgIHRoaXMudHJlZURhdGEgPSB0cmVlRGF0YTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZXRTZWxlY3Rpb25Nb2RlKHJvd1NlbGVjdGlvbik7XG5cbiAgICAvLyBTeW50aGV0aWMgZ3JvdXAgcm93cyBjYXJyeSB0aGVpciBvd24gc3RhYmxlIGlkIOKAlCB0aGUgcGF0aCBvZiBncm91cFxuICAgIC8vIHZhbHVlcyDigJQgd2hpY2ggbm8gaG9zdCBnZXRSb3dJZCBrbm93cyBob3cgdG8gZGVyaXZlLiBUaGUgd3JhcHBlciByZWFkc1xuICAgIC8vIGl0IGZpcnN0IGFuZCBkZWZlcnMgdG8gdGhlIGhvc3QncyBmdW5jdGlvbiAob3IgdGhlIHV1aWQgZmFsbGJhY2spIGZvclxuICAgIC8vIHJlYWwgcm93cywgc28gZ3JvdXBpbmcga2VlcHMgZXhwYW5zaW9uIGFjcm9zcyByZWJ1aWxkcyBldmVuIHdoZW4gdGhlXG4gICAgLy8gaG9zdCBwcm92aWRlZCBubyBpZCBmdW5jdGlvbiBhdCBhbGwuXG4gICAgY29uc3QgaG9zdEdldFJvd0lkID0gY29udGV4dD8uY29tcG9uZW50UGFyZW50Py5nZXRSb3dJZCA/PyBudWxsO1xuXG4gICAgdGhpcy5yb3dTZXJ2aWNlLnNldEdldFJvd0lkRm4oKHBhcmFtczogeyBkYXRhOiBhbnk7IHJvd0luZGV4OiBudW1iZXIgfSkgPT5cbiAgICAgIHBhcmFtcz8uZGF0YT8uW09ORV9HUk9VUF9JRF9GSUVMRF0gPz8gaG9zdEdldFJvd0lkPy4ocGFyYW1zKSA/PyBudWxsKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtbkRlZnMsIGNvbnRleHQpO1xuICAgIHRoaXMuY2VsbFNlcnZpY2Uuc2V0R3JpZEFwaSh0aGlzKTtcbiAgICB0aGlzLmNvbHVtblNlcnZpY2UuaW5pdENvbHVtbkRlZnMoZGVmYXVsdENvbHVtbkRlZiwgY29sdW1uRGVmcywgZ3JvdXBDb2x1bW5EZWZzLCBjb250ZXh0KTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSBhcyBDb2x1bW5DaGFuZ2VkRXZlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGV2ZXJ5IHJvdywgZGlzY2FyZGluZyBzZWxlY3Rpb24gYW5kIGV4cGFuc2lvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB0aGUgcm93cyByZXByZXNlbnQgc29tZXRoaW5nIG5ldy4gVG8gc3dhcCB0aGUgZGF0YSB3aGlsZVxuICAgKiBrZWVwaW5nIHdoYXQgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIGFuZCBvcGVuZWQsIHVzZSBgdXBkYXRlUm93RGF0YWAuXG4gICAqL1xuICBwdWJsaWMgc2V0Um93RGF0YShyb3dEYXRhOiBUW10pIHtcblxuICAgIHRoaXMucmVidWlsZFJvd3Mocm93RGF0YSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBldmVyeSByb3csIGtlZXBpbmcgc2VsZWN0aW9uIGFuZCBleHBhbnNpb24uXG4gICAqXG4gICAqIFN0YXRlIGlzIGtleWVkIGJ5IHJvdyBpZCwgc28gdGhpcyBvbmx5IHByZXNlcnZlcyBhbnl0aGluZyBpZiB0aGUgZ3JpZCBoYXMgYVxuICAgKiBgY29udGV4dC5jb21wb25lbnRQYXJlbnQuZ2V0Um93SWRgIOKAlCBvdGhlcndpc2UgZWFjaCByZWJ1aWxkIG1pbnRzIG5ldyBpZHNcbiAgICogYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJvd0RhdGEocm93RGF0YTogVFtdKSB7XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvd0RhdGEsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb25lIHJvdy1sb2FkaW5nIHBhdGguIGBzZXRSb3dEYXRhYCBhbmQgYHVwZGF0ZVJvd0RhdGFgIGRpZmZlcmVkIG9ubHkgaW5cbiAgICogd2hldGhlciB0aGV5IGNsZWFyZWQgdGhlIHN0YXRlIHNlcnZpY2VzIGZpcnN0LCBzbyBldmVyeXRoaW5nIGVsc2Ug4oCUIGJ1aWxkLFxuICAgKiBmaWx0ZXIsIHBydW5lIOKAlCBsaXZlcyBoZXJlIG9uY2UuXG4gICAqL1xuICBwcml2YXRlIHJlYnVpbGRSb3dzKHJvd0RhdGE6IFRbXSwgcmVzZXRTdGF0ZTogYm9vbGVhbik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgaWYgKHJlc2V0U3RhdGUpIHtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG4gICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBSb3cgZ3JvdXBpbmcgaXMgYSB0cmFuc2Zvcm0gb24gdGhlIHdheSBpbjogdGhlIGhvc3Qga2VlcHMgaGFuZGluZyB0aGVcbiAgICAvLyBncmlkIGZsYXQgcm93cywgYW5kIHRoZSB0cmVlIHBpcGVsaW5lIGJlbG93IHNlZXMgc3ludGhldGljIGdyb3VwIHJvd3NcbiAgICAvLyB3aXRoIGNoaWxkcmVuIOKAlCB0aGUgc2FtZSBzaGFwZSB0cmVlIGRhdGEgYXJyaXZlcyBpbi5cbiAgICBpZiAodGhpcy5fcm93R3JvdXBGaWVsZHMubGVuZ3RoKSB7XG5cbiAgICAgIHJvd0RhdGEgPSBidWlsZEdyb3VwZWRSb3dzKHJvd0RhdGEsIHRoaXMuX3Jvd0dyb3VwRmllbGRzLCB0aGlzLl9hZ2dDb2x1bW5zKSBhcyBUW107XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRoaXMuYnVpbGRSb3dOb2Rlcyhyb3dEYXRhLCBudWxsLCAwLCB2YWxpZFJvd0lkcyk7XG5cbiAgICAvLyBSZS1hcHBseSB0aGUgYWN0aXZlIHNvcnQuIGBidWlsZFJvd05vZGVzYCByZWJ1aWxkcyB0aGUgcm93IGxpc3QgaW4gdGhlXG4gICAgLy8gb3JkZXIgdGhlIGRhdGEgYXJyaXZlZCwgc28gd2l0aG91dCB0aGlzIGEgZGF0YSB1cGRhdGUgc2lsZW50bHkgcmV0dXJuZWRcbiAgICAvLyB0aGUgcm93cyB0byB0aGF0IG9yZGVyIHdoaWxlIGBzb3J0TW9kZWxgIOKAlCBhbmQgdGhlcmVmb3JlIHRoZSBoZWFkZXInc1xuICAgIC8vIHNvcnQgYXJyb3cg4oCUIHN0aWxsIHNhaWQgdGhleSB3ZXJlIHNvcnRlZC4gU29ydGluZyBiZWZvcmUgZmlsdGVyaW5nXG4gICAgLy8gYmVjYXVzZSBmaWx0ZXJpbmcgb25seSBzZXRzIHZpc2liaWxpdHkgb24gd2hhdGV2ZXIgb3JkZXIgdGhpcyBsZWF2ZXMuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPiAwKSB0aGlzLmFwcGx5U29ydGluZygpO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcblxuICAgIHRoaXMucHJ1bmVSZW1vdmVkTm9kZXModmFsaWRSb3dJZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBCdWlsZCBSb3cgTm9kZXMgKE9wdGltaXplZClcbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dOb2RlcyhcbiAgICByb3dEYXRhOiBUW10sXG4gICAgcGFyZW50OiBPbmVSb3dOb2RlPFQ+IHwgbnVsbCA9IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlciA9IDAsXG4gICAgdmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuICAgIGV4cGFuZGVkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5leHBhbnNpb25TZXJ2aWNlLmdldEV4cGFuZGVkSWRzKCkpLFxuICAgIGNvbGxhcHNlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuZXhwYW5zaW9uU2VydmljZS5nZXRDb2xsYXBzZWRJZHMoKSksXG4gICAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRJZHMoKSlcbiAgKTogT25lUm93Tm9kZVtdIHtcblxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbXTtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKCFyb3dEYXRhPy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG5vZGVzOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZGF0YSBvZiByb3dEYXRhKSB7XG5cbiAgICAgIGNvbnN0IHJvd0lkID0gdGhpcy5yb3dTZXJ2aWNlLmdlbmVyYXRlUm93SWQoZGF0YSwgdGhpcy5fY3VycmVudEluZGV4KTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGRhdGEgYXMgYW55KVt0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZF0gfHwgbnVsbDtcblxuICAgICAgbGV0IG5vZGU6IE9uZVJvd05vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgIHZhbGlkUm93SWRzLmFkZChyb3dJZCk7XG5cbiAgICAgIGlmIChub2RlKSB7XG5cbiAgICAgICAgbm9kZS5kYXRhID0gZGF0YTtcbiAgICAgICAgbm9kZS5zZXRSb3dJbmRleCh0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUgPSBuZXcgT25lUm93Tm9kZTxUPihyb3dJZCwgZGF0YSwgdGhpcy5fY3VycmVudEluZGV4KTtcbiAgICAgICAgbm9kZS5sZXZlbCA9IGxldmVsO1xuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgbm9kZS5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5zZXQocm93SWQsIG5vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FeGlzdCA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+PSAwO1xuXG4gICAgICAvLyBDb2VyY2VkLCBiZWNhdXNlIGBjaGlsZHJlbkV4aXN0YCBpcyBgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID49IDBgXG4gICAgICAvLyDigJQgd2hpY2ggaXMgYG51bGxgIGZvciBhIHJvdyB3aXRoIG5vIGNoaWxkcmVuIGZpZWxkLCBub3QgYGZhbHNlYC4gVGhlc2VcbiAgICAgIC8vIGFyZSBkZWNsYXJlZCBgYm9vbGVhbmAsIGFuZCBhc3NpZ25pbmcgbnVsbCBtYWRlIGV2ZXJ5IGNvbnN1bWVyIGNvbXBhcmVcbiAgICAgIC8vIHRydXRoaW5lc3MgaW5zdGVhZCBvZiB0aGUgdmFsdWUuXG4gICAgICBub2RlLmdyb3VwID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyBmYWxzZSA6ICEhY2hpbGRyZW5FeGlzdDtcbiAgICAgIG5vZGUubGVhZiA9IHRoaXMubWFzdGVyRGV0YWlsID8gdHJ1ZSA6ICFub2RlLmdyb3VwO1xuICAgICAgbm9kZS5sZWFmR3JvdXAgPSB0aGlzLm1hc3RlckRldGFpbCA/IGZhbHNlIDogKG5vZGUuZ3JvdXAgJiYgIWNoaWxkcmVuRXhpc3QpO1xuICAgICAgbm9kZS5leHBhbmRhYmxlID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyB0cnVlIDogKG5vZGUuZ3JvdXAgJiYgIW5vZGUubGVhZkdyb3VwKTtcblxuICAgICAgY29uc3QgZGVmYXVsdEV4cGFuZGVkID0gbm9kZS5leHBhbmRhYmxlICYmIChsZXZlbCA8IHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgfHwgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9PT0gLTEpO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkSWRzLmhhcyhyb3dJZCkgPyB0cnVlIDogY29sbGFwc2VkSWRzLmhhcyhyb3dJZCkgPyBmYWxzZSA6IGRlZmF1bHRFeHBhbmRlZCk7XG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkSWRzLmhhcyhyb3dJZCkpO1xuICAgICAgbm9kZS5zZXRDZWxsU3RhdGVzKHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGUpKTtcblxuICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsICYmIHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5fZ2V0RGV0YWlsUm93RGF0YSh7IGRhdGEsIG5vZGU6IG5vZGUsIHN1Y2Nlc3NDYWxsYmFjazogKGRldGFpbFJvd0RhdGEpID0+IG5vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxSb3dEYXRhKSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudEluZGV4Kys7XG4gICAgICB0aGlzLl9yb3dOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2RlLmNoaWxkcmVuID0gdGhpcy50cmVlRGF0YSAmJiBjaGlsZHJlbkV4aXN0ID8gdGhpcy5idWlsZFJvd05vZGVzKGNoaWxkcmVuIHx8IFtdLCBub2RlLCBsZXZlbCArIDEsIHZhbGlkUm93SWRzLCBleHBhbmRlZElkcywgY29sbGFwc2VkSWRzLCBzZWxlY3RlZElkcykgOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZXM7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIEZlYXR1cmVcbiAgICovXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2FjdGl2ZUZpbHRlcnM7XG5cbiAgICBjb25zdCBxdWljayA9IHRoaXMuX3F1aWNrRmlsdGVyVmFsdWU/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG5cbiAgICAvLyBUaGUgZmllbGRzIHRoZSBncmlkIGFjdHVhbGx5IHNob3dzLiBXaXRob3V0IHRoZW0gdGhlIHF1aWNrIGZpbHRlciBmYWxsc1xuICAgIC8vIGJhY2sgdG8gZXZlcnkgcHJvcGVydHkgb24gdGhlIHJvdywgd2hpY2ggbGV0cyBhIHVzZXIgbWF0Y2ggb24gZGF0YSB0aGF0XG4gICAgLy8gaGFzIG5vIGNvbHVtbiBhbmQgbmV2ZXIgYXBwZWFycyBvbiBzY3JlZW4uXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5xdWlja0ZpbHRlckZpZWxkcygpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChub2RlID0+IGZpbHRlclRyZWVOb2RlKG5vZGUsIGZpbHRlcnMsIHF1aWNrLCBmaWVsZHMpKTtcblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIGZpZWxkcyB0aGUgcXVpY2sgZmlsdGVyIHNlYXJjaGVzOiBldmVyeSBjb2x1bW4gdGhhdCBoYXMgb25lLlxuICAgKlxuICAgKiBFbXB0eSB3aGlsZSB0aGUgY29sdW1ucyBhcmUgc3RpbGwgYmVpbmcgcmVnaXN0ZXJlZCwgaW4gd2hpY2ggY2FzZSB0aGVcbiAgICogaGVscGVyIGZhbGxzIGJhY2sgdG8gc2VhcmNoaW5nIHRoZSByb3cg4oCUIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBiZWZvcmUsIGFuZFxuICAgKiB0aGUgb25seSBzZW5zaWJsZSBhbnN3ZXIgd2hlbiB0aGUgZ3JpZCBkb2VzIG5vdCB5ZXQga25vdyBpdHMgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgcXVpY2tGaWx0ZXJGaWVsZHMoKTogc3RyaW5nW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZVxuICAgICAgLmdldENvbHVtblN0YXRlKClcbiAgICAgIC5jb2x1bW5zXG4gICAgICAubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQgYXMgc3RyaW5nKVxuICAgICAgLmZpbHRlcigoZmllbGQpOiBmaWVsZCBpcyBzdHJpbmcgPT4gISFmaWVsZCAmJiBmaWVsZCAhPT0gJ19vbmVSb3dOdW1iZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgUm93IE5vZGVzIERpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaFZpc2libGVOb2RlcyhkaXNwYXRjaDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHZpc2libGVOb2RlczogT25lUm93Tm9kZVtdID0gW107XG5cbiAgICBsZXQgcm93TnVtYmVyID0gMTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Jvd05vZGVzKSB7XG5cbiAgICAgIGNvbnN0IHBhcmVudFZpc2libGUgPSBub2RlLnBhcmVudCA/IHZpc2liaWxpdHlDYWNoZS5nZXQobm9kZS5wYXJlbnQucm93SWQpIDogdHJ1ZTtcblxuICAgICAgY29uc3QgaXNWaXNpYmxlID0gbm9kZS52aXNpYmxlICYmIHBhcmVudFZpc2libGUgJiYgKCFub2RlLnBhcmVudCB8fCBub2RlLnBhcmVudC5leHBhbmRlZCk7XG5cbiAgICAgIHZpc2liaWxpdHlDYWNoZS5zZXQobm9kZS5yb3dJZCwgaXNWaXNpYmxlKTtcblxuICAgICAgaWYgKGlzVmlzaWJsZSkge1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlc1snX29uZVJvd051bWJlciddID0geyB0eXBlOiAndGV4dCcsIHZhbHVlOiByb3dOdW1iZXIrKyB9O1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG5cbiAgICAgICAgdmlzaWJsZU5vZGVzLnB1c2gobm9kZSk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbm9kZS5jZWxsU3RhdGVzWydfb25lUm93TnVtYmVyJ10gPSB7IHR5cGU6ICdub25lJywgdmFsdWU6IG51bGwgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl92aXNpYmxlUm93Tm9kZXMgPSBbLi4udmlzaWJsZU5vZGVzXTtcblxuICAgIGlmIChkaXNwYXRjaCkgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgncm93RGF0YUNoYW5nZWQnLCB7IG5vZGVzOiB2aXNpYmxlTm9kZXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgcm93cyBhbmNob3JlZCB0byBvbmUgZWRnZSBvZiB0aGUgZ3JpZC5cbiAgICpcbiAgICogUGlubmVkIHJvd3MgYXJlIGRlbGliZXJhdGVseSBrZXB0IG91dCBvZiBgcm93Tm9kZXNgIGFuZFxuICAgKiBgX29yaWdpbmFsUm93Tm9kZXNgOiB0aGV5IGFyZSBub3QgZGF0YS4gU29ydGluZywgZmlsdGVyaW5nLCBzZWxlY3Rpb24sXG4gICAqIGV4cGFuc2lvbiwgcGFnaW5hdGlvbiBhbmQgdGhlIHZpc2libGUgcm93IGNvdW50IGFsbCBpZ25vcmUgdGhlbSwgd2hpY2ggaXNcbiAgICogdGhlIHdob2xlIHBvaW50IG9mIGEgc3VtbWFyeSByb3cuIFRoZXkgcmVuZGVyIHdpdGggdGhlIHNhbWUgY29sdW1uXG4gICAqIGRlZmluaXRpb25zLCBzbyByZW5kZXJlcnMgYW5kIHZhbHVlIGdldHRlcnMgd29yayBhcyB0aGV5IGRvIGV2ZXJ5d2hlcmVcbiAgICogZWxzZS5cbiAgICovXG4gIHB1YmxpYyBzZXRQaW5uZWRSb3dEYXRhKHNpZGU6IE9uZVBpbm5lZFJvd1NpZGUsIHJvd0RhdGE6IFRbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdKSBub2RlLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdID0gKHJvd0RhdGEgPz8gW10pLm1hcCgoZGF0YSwgaW5kZXgpID0+IHtcblxuICAgICAgLy8gSWRzIGFyZSBuYW1lc3BhY2VkIGJ5IHNpZGUgYW5kIHBvc2l0aW9uLiBUaGV5IG5ldmVyIGNvbGxpZGUgd2l0aCBhIGRhdGFcbiAgICAgIC8vIHJvdydzIGlkLCBhbmQgdGhleSBhcmUgc3RhYmxlIGFjcm9zcyByZWJ1aWxkcywgd2hpY2gga2VlcHMgdGhlIHJlbmRlcmVkXG4gICAgICAvLyBgZGF0YS1jZWxsLWlkYCBhdHRyaWJ1dGVzIHN0YWJsZSB0b28uXG4gICAgICBjb25zdCBub2RlID0gbmV3IE9uZVJvd05vZGU8VD4oYG9uZS1waW5uZWQtJHtzaWRlfS0ke2luZGV4fWAsIGRhdGEsIGluZGV4KTtcblxuICAgICAgbm9kZS5sZXZlbCA9IDA7XG4gICAgICBub2RlLmxlYWYgPSB0cnVlO1xuICAgICAgbm9kZS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIG5vZGUuc2V0Q2VsbFN0YXRlcyh0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlKSk7XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgncGlubmVkUm93RGF0YUNoYW5nZWQnLCB7XG4gICAgICBzaWRlLFxuICAgICAgbm9kZXM6IHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSByb3dzIGFuY2hvcmVkIHRvIG9uZSBlZGdlLiBSZWFkLW9ubHk7IGNoYW5nZSB0aGVtIHdpdGggYHNldFBpbm5lZFJvd0RhdGFgLiAqL1xuICBwdWJsaWMgZ2V0UGlubmVkUm93Tm9kZXMoc2lkZTogT25lUGlubmVkUm93U2lkZSk6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcGlubmVkUm93Tm9kZXNbc2lkZV07XG4gIH1cblxuICAvKipcbiAgICogUm93IHJlb3JkZXJpbmdcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICpcbiAgICogYF9vcmlnaW5hbFJvd05vZGVzYCBpcyB0aGUgc291cmNlIG9mIHRydXRoIGZvciByb3cgb3JkZXI6IGl0cyBpbnNlcnRpb25cbiAgICogb3JkZXIgaXMgd2hhdCBgYXBwbHlTb3J0aW5nYCBmYWxscyBiYWNrIHRvIHdoZW4gdGhlIHNvcnQgbW9kZWwgZW1wdGllcywgYW5kXG4gICAqIHdoYXQgYSByZWJ1aWxkIHdhbGtzLiBgX3Jvd05vZGVzYCBpcyBvbmx5IHRoZSBjdXJyZW50IGRpc3BsYXkgb3JkZXIuIEEgbW92ZVxuICAgKiB0aGF0IHRvdWNoZWQgb25lIGFuZCBub3QgdGhlIG90aGVyIHdvdWxkIGVpdGhlciBiZSB1bmRvbmUgYnkgdGhlIG5leHQgc29ydFxuICAgKiBjaGFuZ2Ugb3IgaW52aXNpYmxlIHVudGlsIG9uZSBoYXBwZW5lZCwgc28gYm90aCBhcmUgcmV3cml0dGVuIHRvZ2V0aGVyLlxuICAgKi9cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGlzcGxheWVkIG9yZGVyIGlzIHRoZSBkYXRhIG9yZGVyLCBhbmQgc28gd2hldGhlciBhIG1hbnVhbCBtb3ZlXG4gICAqIHdvdWxkIHN1cnZpdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSByZWFzb24gcmVvcmRlcmluZyBpcyB1bmF2YWlsYWJsZSwgb3IgYG51bGxgIHdoZW4gaXQgaXMgZmluZS5cbiAgICovXG4gIHB1YmxpYyBnZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbigpOiBPbmVSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbiB8IG51bGwge1xuXG4gICAgaWYgKHRoaXMudHJlZURhdGEpIHJldHVybiAndHJlZURhdGEnO1xuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPiAwKSByZXR1cm4gJ3NvcnRlZCc7XG5cbiAgICBpZiAoaXNGaWx0ZXJBY3RpdmUodGhpcy5fYWN0aXZlRmlsdGVycywgdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZSA/PyAnJykpIHJldHVybiAnZmlsdGVyZWQnO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQ29udmVuaWVuY2UgaW52ZXJzZSBvZiB7QGxpbmsgZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb259LiAqL1xuICBwdWJsaWMgY2FuUmVvcmRlclJvd3MoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbigpID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSByb3cgZnJvbSBvbmUgcG9zaXRpb24gdG8gYW5vdGhlci5cbiAgICpcbiAgICogSW5kaWNlcyBhcmUgcG9zaXRpb25zIGluIHRoZSBncmlkJ3Mgcm93IG9yZGVyLCB0aGUgc2FtZSBvcmRlclxuICAgKiBgZ2V0QWxsUm93Tm9kZXMoKWAgcmV0dXJucy4gYHRhcmdldEluZGV4YCBpcyB3aGVyZSB0aGUgcm93IGVuZHMgdXAgKmFmdGVyKlxuICAgKiBpdCBoYXMgYmVlbiBsaWZ0ZWQgb3V0IG9mIGBzb3VyY2VJbmRleGAg4oCUIGRyYWdnaW5nIHJvdyAwIHRvIHRoZSBib3R0b20gb2YgYVxuICAgKiA1LXJvdyBncmlkIGlzIGBtb3ZlUm93KDAsIDQpYCwgbm90IGBtb3ZlUm93KDAsIDUpYC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByb3dzIG1vdmVkLiBgZmFsc2VgIHdoZW4gdGhlIG1vdmUgd2FzIHJlamVjdGVkIOKAlFxuICAgKiAgICAgICAgICBvdXQtb2YtcmFuZ2UgaW5kaWNlcywgYSBuby1vcCwgb3IgYW4gb3JkZXIgdGhlIGdyaWQgZG9lcyBub3Qgb3duXG4gICAqICAgICAgICAgIChzZWUge0BsaW5rIGdldFJvd0RyYWdTdXBwcmVzc2VkUmVhc29ufSkg4oCUIHNvIGEgY2FsbGVyIGNhbiB0ZWxsIGFcbiAgICogICAgICAgICAgcmVmdXNlZCBtb3ZlIGZyb20gYW4gYXBwbGllZCBvbmUuXG4gICAqL1xuICBwdWJsaWMgbW92ZVJvdyhzb3VyY2VJbmRleDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuY2FuUmVvcmRlclJvd3MoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgb3JkZXIgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV07XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc291cmNlSW5kZXgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHRhcmdldEluZGV4KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNvdXJjZUluZGV4IDwgMCB8fCBzb3VyY2VJbmRleCA+PSBvcmRlci5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YXJnZXRJbmRleCA8IDAgfHwgdGFyZ2V0SW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoc291cmNlSW5kZXggPT09IHRhcmdldEluZGV4KSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBbbW92ZWRdID0gb3JkZXIuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcblxuICAgIG9yZGVyLnNwbGljZSh0YXJnZXRJbmRleCwgMCwgbW92ZWQpO1xuXG4gICAgLy8gUmVidWlsdCByYXRoZXIgdGhhbiBtdXRhdGVkOiBhIE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyLCBhbmQgdGhlcmVcbiAgICAvLyBpcyBubyB3YXkgdG8gcmVwb3NpdGlvbiBhIGtleSB3aXRoaW4gb25lLlxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMgPSBuZXcgTWFwKG9yZGVyLm1hcChub2RlID0+IFtub2RlLnJvd0lkLCBub2RlXSkpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMgPSBvcmRlcjtcblxuICAgIHRoaXMucmVpbmRleFJvd3MoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Jvd09yZGVyQ2hhbmdlZCcsIHsgbm9kZXM6IHRoaXMuX3Zpc2libGVSb3dOb2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10sIG5vZGU6IG1vdmVkLCBmcm9tSW5kZXg6IHNvdXJjZUluZGV4LCB0b0luZGV4OiB0YXJnZXRJbmRleCB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSByb3cgaWRlbnRpZmllZCBieSBpZC4gQ29udmVuaWVudCB3aGVuIHRoZSBjYWxsZXIgaG9sZHMgYSBub2RlIHJhdGhlclxuICAgKiB0aGFuIGEgcG9zaXRpb24g4oCUIHRoZSBpbmRleCBpdCB3YXMgYnVpbHQgd2l0aCBnb2VzIHN0YWxlIGFmdGVyIGFueSBtb3ZlLlxuICAgKi9cbiAgcHVibGljIG1vdmVSb3dCeUlkKHJvd0lkOiBzdHJpbmcsIHRhcmdldEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcblxuICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldLmZpbmRJbmRleChub2RlID0+IG5vZGUucm93SWQgPT09IHJvd0lkKTtcblxuICAgIHJldHVybiBzb3VyY2VJbmRleCA9PT0gLTEgPyBmYWxzZSA6IHRoaXMubW92ZVJvdyhzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXN0YW1wIGByb3dJbmRleGAgZnJvbSB0aGUgY3VycmVudCBvcmRlci5cbiAgICpcbiAgICogUm93IGluZGV4IGlzIGRlbm9ybWFsaXNlZCBvbnRvIGV2ZXJ5IG5vZGUsIGFuZCBoYWxmIHRoZSBncmlkIHJlYWRzIGl0IOKAlFxuICAgKiBjZWxsIHBhcmFtcywgdGhlIHJhbmdlIHNlbGVjdGlvbiwgdGhlIGRldGFpbCBsb29rdXAuIExlYXZpbmcgaXQgc3RhbGUgYWZ0ZXJcbiAgICogYSBtb3ZlIHB1dHMgZXZlcnkgcm93IGJlbG93IHRoZSBkcm9wIHBvaW50IG9uZSBvdXQuXG4gICAqL1xuICBwcml2YXRlIHJlaW5kZXhSb3dzKCk6IHZvaWQge1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IG5vZGUuc2V0Um93SW5kZXgoaW5kZXgpKTtcblxuICAgIC8vIFNpbGVudDogcm93IG51bWJlcnMgYW5kIHRoZSB2aXNpYmxlIGxpc3QgaGF2ZSB0byBiZSByZWJ1aWx0LCBidXQgdGhlXG4gICAgLy8gYHJvd0RhdGFDaGFuZ2VkYCB0aGF0IG5vcm1hbGx5IGZvbGxvd3MgZGVmZXJzIGEgZnJhbWUgYW5kIHJlLXNlZWRzIGRldGFpbFxuICAgIC8vIHJvd3MuIEEga2V5Ym9hcmQgZHJhZyBmaXJlcyBvbmUgb2YgdGhlc2UgcGVyIGFycm93IGtleSwgYW5kIGBtb3ZlUm93YFxuICAgIC8vIGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCBgcm93T3JkZXJDaGFuZ2VkYCBpbnN0ZWFkLlxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcyhmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzaWJsZVJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZVJvd05vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRpbmcgTW9kZWwgRmVhdHVyZVxuICAgKi9cbiAgcHVibGljIG9uU29ydENoYW5nZWQoc29ydE1vZGVsOiBPbmVTb3J0TW9kZWw8VD5bXSkge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fc29ydE1vZGVsID0gc29ydE1vZGVsO1xuXG4gICAgdGhpcy5hcHBseVNvcnRpbmcoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NvcnRDaGFuZ2VkJywgeyBub2RlczogdGhpcy5fcm93Tm9kZXMsIHNvcnRNb2RlbDogdGhpcy5fc29ydE1vZGVsIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNvcnRpbmcoKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fc29ydE1vZGVsLmxlbmd0aCA9PT0gMCkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd05vZGVzID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IHtcblxuICAgICAgZm9yIChjb25zdCBzb3J0SXRlbSBvZiB0aGlzLl9zb3J0TW9kZWwpIHtcblxuICAgICAgICBjb25zdCB7IGNvbElkLCBzb3J0IH0gPSBzb3J0SXRlbTtcbiAgICAgICAgY29uc3QgdmFsQSA9IGdldEZpZWxkVmFsdWUoYS5kYXRhLCBjb2xJZCBhcyBzdHJpbmcpO1xuICAgICAgICBjb25zdCB2YWxCID0gZ2V0RmllbGRWYWx1ZShiLmRhdGEsIGNvbElkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IGNvbXBhcmlzb25SZXN1bHQgPSB0aGlzLmNvbXBhcmVWYWx1ZXModmFsQSwgdmFsQiwgc29ydCk7XG5cbiAgICAgICAgaWYgKGNvbXBhcmlzb25SZXN1bHQgIT09IDApIHtcblxuICAgICAgICAgIHJldHVybiBjb21wYXJpc29uUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyh2YWxBOiBhbnksIHZhbEI6IGFueSwgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycpOiBudW1iZXIge1xuXG4gICAgLy8gYHVuZGVmaW5lZGAgaGFzIHRvIGJlIHRyZWF0ZWQgYXMgZW1wdHkgYWxvbmdzaWRlIGBudWxsYDogZ2V0RmllbGRWYWx1ZVxuICAgIC8vIHJldHVybnMgdW5kZWZpbmVkIGZvciBhIG1pc3NpbmcgZmllbGQgb3IgYW4gdW5yZXNvbHZlZCBkb3R0ZWQgcGF0aCwgYW5kXG4gICAgLy8gY29tcGFyaW5nIHVuZGVmaW5lZCB3aXRoIDwgLyA+IHlpZWxkcyBmYWxzZSBib3RoIHdheXMsIHdoaWNoIG1hZGUgc3VjaFxuICAgIC8vIHJvd3Mgc2V0dGxlIGluIHdoYXRldmVyIG9yZGVyIHRoZSBzb3J0IGhhcHBlbmVkIHRvIGVuY291bnRlciB0aGVtLlxuICAgIGNvbnN0IGFFbXB0eSA9IHZhbEEgPT09IG51bGwgfHwgdmFsQSA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJFbXB0eSA9IHZhbEIgPT09IG51bGwgfHwgdmFsQiA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFFbXB0eSAmJiBiRW1wdHkpIHJldHVybiAwO1xuICAgIGlmIChhRW1wdHkpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcbiAgICBpZiAoYkVtcHR5KSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XG5cbiAgICBpZiAodHlwZW9mIHZhbEEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJykge1xuXG4gICAgICBjb25zdCBjb21wYXJpc29uID0gdmFsQS5sb2NhbGVDb21wYXJlKHZhbEIsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gY29tcGFyaXNvbiA6IC1jb21wYXJpc29uO1xuICAgIH1cblxuICAgIGlmICh2YWxBIDwgdmFsQikgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gLTEgOiAxO1xuICAgIGlmICh2YWxBID4gdmFsQikgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyBTZWxlY3Rpb24gRmVhdHVyZSAoT3B0aW1pemVkKVxuICAgKi9cbiAgcHVibGljIHNlbGVjdEFsbCgpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd0lkczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZCh0cnVlKTtcblxuICAgICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgICAgcm93SWRzLnB1c2gobm9kZS5yb3dJZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0QWxsKHJvd0lkcyk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBhbGxOb2Rlc05vdFNlbGVjdGVkOiBmYWxzZSwgYWxsTm9kZXNTZWxlY3RlZDogdHJ1ZSwgc2VsZWN0ZWQ6IHRydWUsIG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3QgYWxsIG5vZGVzIChvcHRpbWl6ZWQpXG4gICAqL1xuICBwdWJsaWMgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiB7XG5cbiAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoZmFsc2UpO1xuXG4gICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGlvbk1vZGUoKSA9PT0gJ211bHRpcGxlJykge1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywge1xuICAgICAgICBhbGxOb2Rlc05vdFNlbGVjdGVkOiB0cnVlLFxuICAgICAgICBhbGxOb2Rlc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBub2RlOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IG9yIGRlc2VsZWN0IG9uZSByb3csIGhvbm91cmluZyB0aGUgZ3JpZCdzIHNlbGVjdGlvbiBtb2RlLlxuICAgKlxuICAgKiBUaGUgbW9kZSBydWxlIHVzZWQgdG8gbGl2ZSBpbiB0aGUgY2hlY2tib3ggY29tcG9uZW50LCB3aGljaCBtZWFudCB0aGUgb25seVxuICAgKiB3YXkgdG8gc2VsZWN0IGEgcm93IHdhcyB0byBjbGljayB0aGF0IGNoZWNrYm94IOKAlCBhbnl0aGluZyBlbHNlIHJlYWNoaW5nIGZvclxuICAgKiBgdG9nZ2xlU2VsZWN0aW9uYCBnb3QgbXVsdGktc2VsZWN0IGJlaGF2aW91ciBvbiBhIHNpbmdsZS1zZWxlY3QgZ3JpZC4gSXRcbiAgICogbGl2ZXMgaGVyZSBzbyBldmVyeSBwYXRoIGludG8gc2VsZWN0aW9uIG9iZXlzIHRoZSBzYW1lIHJ1bGUuXG4gICAqXG4gICAqIEByZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGUgZ3JpZCBoYXMgbm8gc2VsZWN0aW9uIG1vZGUsIHNvIGEgY2FsbGVyIGNhbiB0ZWxsXG4gICAqICAgICAgICAgIGEgcmVmdXNlZCByZXF1ZXN0IGZyb20gYW4gYXBwbGllZCBvbmUuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlUm93U2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkIHx8ICF0aGlzLl9yb3dTZWxlY3Rpb24pIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKHJvd0lkKTtcblxuICAgIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gU2luZ2xlIHNlbGVjdCBpcyBcInRoaXMgcm93IGFuZCBubyBvdGhlclwiLCB3aGljaCBtZWFucyBjbGVhcmluZyBmaXJzdC5cbiAgICBpZiAodGhpcy5fcm93U2VsZWN0aW9uID09PSAnc2luZ2xlJykgdGhpcy5kZXNlbGVjdEFsbCgpO1xuXG4gICAgdGhpcy50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcblxuICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgZXZlcnkgcm93IGJldHdlZW4gdHdvLCBpbmNsdXNpdmUsIGluIGRpc3BsYXkgb3JkZXIuXG4gICAqXG4gICAqIFdoYXQgYSBzaGlmdC1leHRlbmRlZCBrZXlib2FyZCBzZWxlY3Rpb24gbmVlZHMuIE11bHRpLXNlbGVjdCBvbmx5IOKAlCBhXG4gICAqIHNpbmdsZS1zZWxlY3QgZ3JpZCBoYXMgbm8gbWVhbmluZ2Z1bCByYW5nZS5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RSb3dSYW5nZShmcm9tUm93SWQ6IHN0cmluZywgdG9Sb3dJZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkIHx8IHRoaXMuX3Jvd1NlbGVjdGlvbiAhPT0gJ211bHRpcGxlJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgb3JkZXIgPSB0aGlzLl92aXNpYmxlUm93Tm9kZXMubGVuZ3RoID8gdGhpcy5fdmlzaWJsZVJvd05vZGVzIDogdGhpcy5fcm93Tm9kZXM7XG5cbiAgICBjb25zdCBmcm9tID0gb3JkZXIuZmluZEluZGV4KG5vZGUgPT4gbm9kZS5yb3dJZCA9PT0gZnJvbVJvd0lkKTtcbiAgICBjb25zdCB0byA9IG9yZGVyLmZpbmRJbmRleChub2RlID0+IG5vZGUucm93SWQgPT09IHRvUm93SWQpO1xuXG4gICAgaWYgKGZyb20gPT09IC0xIHx8IHRvID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgaWRzID0gb3JkZXJcbiAgICAgIC5zbGljZShNYXRoLm1pbihmcm9tLCB0byksIE1hdGgubWF4KGZyb20sIHRvKSArIDEpXG4gICAgICAubWFwKG5vZGUgPT4gbm9kZS5yb3dJZCk7XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkQnlJZHMoaWRzLCB0cnVlKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVNlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBzZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZChzZWxlY3RlZCk7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc2VsZWN0aW9uQ2hhbmdlZCcsIHsgbm9kZSwgZGF0YTogbm9kZS5kYXRhLCBzZWxlY3RlZCB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWRCeUlkKHJvd0lkOiBzdHJpbmcpIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKHJvd0lkKTtcblxuICAgIGlmIChub2RlKSB7XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uTW9kZSgpID09PSAnc2luZ2xlJykge1xuXG4gICAgICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKHJvd05vZGUucm93SWQgPT09IG5vZGUucm93SWQpKTtcblxuICAgICAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKHJvd05vZGUucm93SWQgPT09IG5vZGUucm93SWQpKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBub2RlLnNldFNlbGVjdGVkKHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UudG9nZ2xlU2VsZWN0aW9uKHJvd0lkLCB0cnVlKTtcblxuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc2VsZWN0aW9uQ2hhbmdlZCcsIHsgbm9kZSwgc2VsZWN0ZWQ6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFNlbGVjdGVkQnlJZHMocm93SWRzOiBzdHJpbmdbXSwgc2VsZWN0ZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG5cbiAgICByb3dJZHMuZm9yRWFjaChyb3dJZCA9PiB7XG5cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgIGlmIChub2RlKSB7XG5cbiAgICAgICAgbm9kZS5zZXRTZWxlY3RlZChzZWxlY3RlZCk7XG5cbiAgICAgICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UudG9nZ2xlU2VsZWN0aW9uKHJvd0lkLCBzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlOiBudWxsIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCAmIFNldCBGdW5jdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jvd05vZGVzPy5sZW5ndGggPiAwID8gWy4uLnRoaXMuX3Jvd05vZGVzXSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGdldFJvd0RhdGFTZWxlY3RlZCgpOiBUW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUuc2VsZWN0ZWQpLm1hcChub2RlID0+ICh7IC4uLm5vZGUuZGF0YSB9KSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9yb3dOb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLnNlbGVjdGVkKTtcblxuICAgIHJldHVybiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPiAwID8gWy4uLm5vZGVzXSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbHVtbiBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyTW9kZWwoKTogT25lRmlsdGVyTW9kZWxbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWx0ZXJNb2RlbChtb2RlbDogT25lRmlsdGVyTW9kZWxbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fYWN0aXZlRmlsdGVycyA9IG1vZGVsO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJBY3RpdmUoZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlcnMuc29tZShmID0+IGYuZmllbGQgPT09IGZpZWxkICYmIGYuY29uZGl0aW9ucy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWljayBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBzZXRRdWlja0ZpbHRlcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9xdWlja0ZpbHRlclZhbHVlID0gKHZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGNvbHVtbiB2YWxpZGF0b3JzIG92ZXIgb25lIHJvdy5cbiAgICpcbiAgICogUnVsZXMgcnVuIGluIG9yZGVyIGFuZCBzdG9wIGF0IHRoZSBmaXJzdCBmYWlsdXJlLCBzbyBhIGZpZWxkIGFwcGVhcnMgYXRcbiAgICogbW9zdCBvbmNlLiBGaWVsZHMgdGhhdCBwYXNzZWQgYXJlIGFic2VudCByYXRoZXIgdGhhbiBtYXBwZWQgdG8gYG51bGxgLlxuICAgKlxuICAgKiBUaGUgcm93IHR5cGUgY29tZXMgZnJvbSB0aGUgZ3JpZCdzIG93biBgVGAg4oCUIHRoaXMgdXNlZCB0byBkZWNsYXJlIGl0cyBvd25cbiAgICogYDxUPmAsIHdoaWNoIHNoYWRvd2VkIHRoZSBjbGFzcyBwYXJhbWV0ZXIgYW5kIGxldCBhbiBgT25lR3JpZEFwaTxFbXBsb3llZT5gXG4gICAqIGhhcHBpbHkgdmFsaWRhdGUgYW4gdW5yZWxhdGVkIHNoYXBlIGFnYWluc3QgZW1wbG95ZWUgY29sdW1ucy5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZVJvdyhyb3c6IFQsIGNvbHVtbnM6IE9uZUNvbHVtbkRlZjxUPltdKTogT25lUm93VmFsaWRhdGlvbkVycm9yczxUPiB7XG5cbiAgICBjb25zdCBlcnJvcnM6IE9uZVJvd1ZhbGlkYXRpb25FcnJvcnM8VD4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblxuICAgICAgLy8gQSBjb2x1bW4gY2FuIG9ubHkgY29udHJpYnV0ZSBhbiBlcnJvciBpZiBpdCBoYXMgYm90aCBydWxlcyBhbmQgYSBmaWVsZFxuICAgICAgLy8gdG8ga2V5IHRoZW0gdW5kZXIuXG4gICAgICBpZiAoIWNvbHVtbi5maWVsZCB8fCAhY29sdW1uLnZhbGlkYXRpb25SdWxlcz8ubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNvbHVtbi52YWxpZGF0aW9uUnVsZXMpIHtcblxuICAgICAgICBjb25zdCBlcnJvciA9IHJ1bGUocm93W2NvbHVtbi5maWVsZF0sIHJvdyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG5cbiAgICAgICAgICBlcnJvcnNbY29sdW1uLmZpZWxkXSA9IGVycm9yO1xuXG4gICAgICAgICAgYnJlYWs7IC8vIGZpcnN0IGZhaWx1cmUgcGVyIGNvbHVtbiB3aW5zXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgY29sdW1uIHZhbGlkYXRvcnMgb3ZlciBhIHdob2xlIGRhdGFzZXQuXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byBgdmFsaWRhdGVSb3dgIHNvIHRoZSB0d28gY2FuIG5ldmVyIGRpc2FncmVlIGFib3V0IHdoYXQgY291bnRzXG4gICAqIGFzIGludmFsaWQg4oCUIHRoZXkgcHJldmlvdXNseSBjYXJyaWVkIHNlcGFyYXRlIGNvcGllcyBvZiB0aGUgc2FtZSBsb29wLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlQWxsUm93cyhyb3dEYXRhOiBUW10sIGNvbHVtbnM6IE9uZUNvbHVtbkRlZjxUPltdKTogT25lVmFsaWRhdGlvblJlc3VsdDxUPiB7XG5cbiAgICBjb25zdCBhbGxFcnJvcnMgPSByb3dEYXRhLm1hcChyb3cgPT4gdGhpcy52YWxpZGF0ZVJvdyhyb3csIGNvbHVtbnMpKTtcblxuICAgIGNvbnN0IGhhc0Vycm9ycyA9IGFsbEVycm9ycy5zb21lKGVycm9ycyA9PiBPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApO1xuXG4gICAgcmV0dXJuIHsgZXJyb3JzOiBhbGxFcnJvcnMsIHZhbGlkOiAhaGFzRXJyb3JzLCBpbnZhbGlkOiBoYXNFcnJvcnMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZSBldmVyeSBub2RlLCBkZXB0aC1maXJzdCwgb25jZSBlYWNoLlxuICAgKlxuICAgKiBgcm93Tm9kZXNgIGlzIGFscmVhZHkgdGhlIGZsYXR0ZW5lZCB0cmVlIOKAlCBgYnVpbGRSb3dOb2Rlc2AgcHVzaGVzIGV2ZXJ5XG4gICAqIG5vZGUgaW50byBpdCBhcyBpdCBkZXNjZW5kcyDigJQgc28gd2Fsa2luZyBpdCBpcyB0aGUgd2hvbGUgdHJhdmVyc2FsLiBUaGVcbiAgICogcHJldmlvdXMgaW1wbGVtZW50YXRpb24gd2Fsa2VkIHRoYXQgZmxhdCBsaXN0ICphbmQqIHJlY3Vyc2VkIGludG9cbiAgICogYGNoaWxkcmVuYCwgdmlzaXRpbmcgZXZlcnkgbmVzdGVkIG5vZGUgdHdpY2UgYW5kIGV2ZXJ5IGRlcHRoLTMgbm9kZSB0aHJlZVxuICAgKiB0aW1lcy4gYGluZGV4YCBpcyB0aGUgbm9kZSdzIHBvc2l0aW9uIGluIHRoZSBmbGF0dGVuZWQgb3JkZXIsIG1hdGNoaW5nXG4gICAqIGBub2RlLnJvd0luZGV4YCwgcmF0aGVyIHRoYW4gaXRzIHBvc2l0aW9uIGFtb25nIGl0cyBzaWJsaW5ncy5cbiAgICovXG4gIHB1YmxpYyBmb3JFYWNoTm9kZShjYWxsYmFjazogKG5vZGU6IE9uZVJvd05vZGU8VD4sIGluZGV4OiBudW1iZXIpID0+IHZvaWQpIHtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiBjYWxsYmFjayhub2RlLCBpbmRleCkpO1xuICB9XG5cbiAgLyoqIFRyYXZlcnNlIG9ubHkgbGVhZiBub2Rlcywgb25jZSBlYWNoLCBpbiBmbGF0dGVuZWQgb3JkZXIuICovXG4gIHB1YmxpYyBmb3JFYWNoTGVhZk5vZGUoY2FsbGJhY2s6IChub2RlOiBPbmVSb3dOb2RlPFQ+LCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKSB7XG5cbiAgICBsZXQgbGVhZkluZGV4ID0gMDtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9yb3dOb2Rlcykge1xuXG4gICAgICBpZiAobm9kZS5sZWFmKSBjYWxsYmFjayhub2RlLCBsZWFmSW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFJvd05vZGVCeUlkKHJvd0lkOiBzdHJpbmcpOiBPbmVSb3dOb2RlPFQ+IHtcblxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kL2NvbGxhcHNlIGEgbm9kZVxuICAgKi9cbiAgcHVibGljIHNldFRyZWVEYXRhQ2hpbGRyZW5GaWVsZChmaWVsZDogc3RyaW5nKSB7XG5cbiAgICB0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCA9IGZpZWxkO1xuICB9XG5cbiAgcHVibGljIHNldEdyb3VwRGVmYXVsdEV4cGFuZGVkKGRlZmF1bHRFeHBhbmRlZDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkID0gZGVmYXVsdEV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuc2lvbiBzdGF0ZSBsaXZlcyBpbiB0d28gcGxhY2VzLCBhbmQgdGhleSBhbnN3ZXIgZGlmZmVyZW50IHF1ZXN0aW9ucy5cbiAgICpcbiAgICogYE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlYCByZWNvcmRzIG9ubHkgKmRlbGliZXJhdGUqIGNoYW5nZXMg4oCUIGEgY2xpY2ssIG9yXG4gICAqIG9uZSBvZiB0aGUgbWV0aG9kcyBiZWxvdy4gSXQgaXMgYW4gb3ZlcnJpZGUgbGF5ZXI6IGBidWlsZFJvd05vZGVzYCBjb25zdWx0c1xuICAgKiBpdCBmaXJzdCBhbmQgZmFsbHMgYmFjayB0byBgZ3JvdXBEZWZhdWx0RXhwYW5kZWRgIGZvciBldmVyeSByb3cgdGhlIHVzZXJcbiAgICogaGFzIG5vdCB0b3VjaGVkLiBUaGF0IGlzIHdoYXQgbGV0cyBhIGxhdGVyIGBncm91cERlZmF1bHRFeHBhbmRlZGAgY2hhbmdlXG4gICAqIHRha2UgZWZmZWN0LCBhbmQgd2hhdCBsZXRzIGEgY29sbGFwc2Ugc3Vydml2ZSBhIHJlYnVpbGQuXG4gICAqXG4gICAqIGBub2RlLmV4cGFuZGVkYCBpcyB0aGUgcmVzb2x2ZWQgdHJ1dGggZm9yIGEgcm93LCBkZWZhdWx0cyBpbmNsdWRlZC4gUHVibGljXG4gICAqIHJlYWRzIHJlcG9ydCB0aGF0OyB0aGUgb3ZlcnJpZGUgc2V0cyBzdGF5IGludGVybmFsLlxuICAgKlxuICAgKiBUaGUgaW52YXJpYW50IHRoZSBzZXR0ZXJzIGJlbG93IG1haW50YWluOiBgZXhwYW5kZWRgIGlzIG9ubHkgZXZlciB0cnVlIGZvclxuICAgKiBhIG5vZGUgdGhhdCBjYW4gZXhwYW5kLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZUV4cGFuZEFsbChleHBhbmRlZDogYm9vbGVhbikge1xuXG4gICAgdGhpcy5mb3JFYWNoTm9kZShub2RlID0+IHtcblxuICAgICAgaWYgKCFub2RlLmV4cGFuZGFibGUpIHJldHVybjtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChub2RlLnJvd0lkLCBleHBhbmRlZClcbiAgICB9KTtcblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgcHVibGljIHNldEV4cGFuZGVkQnlJZChyb3dJZDogc3RyaW5nLCBleHBhbmRlZDogYm9vbGVhbikge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgIGlmIChub2RlPy5leHBhbmRhYmxlKSB7XG5cbiAgICAgIG5vZGUuc2V0RXhwYW5kZWQoZXhwYW5kZWQpO1xuXG4gICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQocm93SWQsIGV4cGFuZGVkKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHBhbmRlZEJ5SWRzKHJvd0lkczogc3RyaW5nW10sIGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICBpZiAocm93SWRzICYmIHJvd0lkcy5sZW5ndGggPiAwKSB7XG5cbiAgICAgIGZvciAobGV0IHJvd0lkIG9mIHJvd0lkcykge1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgICAgaWYgKG5vZGU/LmV4cGFuZGFibGUpIHtcblxuICAgICAgICAgIG5vZGUuc2V0RXhwYW5kZWQoZXhwYW5kZWQpO1xuXG4gICAgICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKHJvd0lkLCBleHBhbmRlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGN1cnJlbnRseSBleHBhbmRlZCByb3csIGluIHRyZWUgb3JkZXIuXG4gICAqXG4gICAqIERlcml2ZWQgZnJvbSB0aGUgbm9kZXMgcmF0aGVyIHRoYW4gcmVhZCBvZmYgdGhlIG92ZXJyaWRlIHJlY29yZCwgc28gcm93c1xuICAgKiBvcGVuZWQgYnkgYGdyb3VwRGVmYXVsdEV4cGFuZGVkYCBhcmUgaW5jbHVkZWQg4oCUIHByZXZpb3VzbHkgdGhpcyByZXR1cm5lZFxuICAgKiBvbmx5IHJvd3Mgc29tZW9uZSBoYWQgZXhwbGljaXRseSB0b2dnbGVkLCBhbmQgY2FtZSBiYWNrIGVtcHR5IG9uIGZpcnN0IGxvYWRcbiAgICogd2hpbGUgdGhlIGZpcnN0IGxldmVsIHdhcyB2aXNpYmx5IG9wZW4uXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhwYW5kZWRCeUlkcygpOiBzdHJpbmdbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXNcblxuICAgICAgLmZpbHRlcihub2RlID0+IG5vZGUuZXhwYW5kYWJsZSAmJiBub2RlLmV4cGFuZGVkKVxuXG4gICAgICAubWFwKG5vZGUgPT4gbm9kZS5yb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBGZWF0dXJlXG4gICAqL1xuICBwdWJsaWMgc2V0RGV0YWlsUm93RGF0YShub2RlOiBPbmVSb3dOb2RlPFQ+LCBkZXRhaWxEYXRhOiBhbnlbXSkge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93Tm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICByb3dOb2RlLnNldERldGFpbFJvd0RhdGEoZGV0YWlsRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEdldERldGFpbFJvd0RhdGEoZ2V0RGV0YWlsUm93RGF0YTogKHBhcmFtczogT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcykgPT4gdm9pZCkge1xuXG4gICAgdGhpcy5fZ2V0RGV0YWlsUm93RGF0YSA9IGdldERldGFpbFJvd0RhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1ucyBTdGF0ZVxuICAgKi9cbiAgcHVibGljIGdldENvbHVtblN0YXRlKCk6IENvbHVtbkNoYW5nZWRFdmVudCB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWY8VD5bXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnNldENvbHVtbkRlZnMoY29sdW1uRGVmcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBDZWxsIHN0YXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgY29sdW1ucywgc28gcmVwbGFjaW5nIHRoZW0gd2hvbGVzYWxlXG4gICAgLy8gc3RhbGVzIGV2ZXJ5IG5vZGUgYnVpbHQgYmVmb3JlIHRoaXMgcmFuLiBUcmVlIGFuZCBncm91cGluZyBtb2RlIGhpdFxuICAgIC8vIHRoaXMgb24gZXZlcnkgbG9hZDogdGhlIGdyb3VwIGNvbHVtbiByZWdpc3RlcnMgZnJvbSBhIGRlZmVycmVkXG4gICAgLy8gc2V0Q29sdW1uRGVmcywgYWZ0ZXIgdGhlIGhvc3QgaGFzIHR5cGljYWxseSBhbHJlYWR5IGxvYWRlZCByb3dzIOKAlFxuICAgIC8vIGhvc3RzIHVzZWQgdG8gaGF2ZSB0byBkZWZlciBzZXRSb3dEYXRhIHRoZW1zZWx2ZXMgdG8gZG9kZ2UgaXQuXG4gICAgdGhpcy5yZWdlbmVyYXRlQ2VsbFN0YXRlcygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDb2x1bW4oaWQ6IHN0cmluZywgY2hhbmdlczogUGFydGlhbDxPbmVDb2x1bW5EZWY8VD4+KTogdm9pZCB7XG5cbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnZpc2libGVDb2x1bW5GaWVsZHMoKTtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS51cGRhdGVDb2x1bW5EZWYoaWQsIGNoYW5nZXMpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgLy8gT25seSB3aGVuIHRoZSBzZXQgb2YgdmlzaWJsZSBjb2x1bW5zIGNoYW5nZWQgKGEgaGlkZSwgYSBzaG93KTogYSBjZWxsXG4gICAgLy8gc3RhdGUgY2FuIGFwcGVhciBvciBkaXNhcHBlYXIgdGhlbi4gV2lkdGggcGF0Y2hlcyDigJQgdGhpcyBtZXRob2QgcnVuc1xuICAgIC8vIHBlciBtb3VzZW1vdmUgZHVyaW5nIGEgcmVzaXplIOKAlCBza2lwIHRoZSBPKHJvd3Mgw5cgY29sdW1ucykgcGFzcy5cbiAgICBpZiAodGhpcy52aXNpYmxlQ29sdW1uRmllbGRzKCkgIT09IGJlZm9yZSkgdGhpcy5yZWdlbmVyYXRlQ2VsbFN0YXRlcygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKiBUaGUgdmlzaWJsZSBmaWVsZHMgYXMgb25lIGNvbXBhcmFibGUga2V5LiAqL1xuICBwcml2YXRlIHZpc2libGVDb2x1bW5GaWVsZHMoKTogc3RyaW5nIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zPy5tYXAoY29sdW1uID0+IGNvbHVtbi5maWVsZCkuam9pbignfCcpID8/ICcnO1xuICB9XG5cbiAgLyoqIFJlY29tcHV0ZSBldmVyeSBub2RlJ3MgY2VsbCBzdGF0ZXMgYWdhaW5zdCB0aGUgY3VycmVudCBjb2x1bW5zLiAqL1xuICBwcml2YXRlIHJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk6IHZvaWQge1xuXG4gICAgY29uc3QgcmVmcmVzaCA9IChub2RlOiBPbmVSb3dOb2RlKSA9PiBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChyZWZyZXNoKTtcbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlcy50b3AuZm9yRWFjaChyZWZyZXNoKTtcbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlcy5ib3R0b20uZm9yRWFjaChyZWZyZXNoKTtcbiAgfVxuXG4gIHB1YmxpYyByZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2UucmVvcmRlckNvbHVtbkRlZnMoZnJvbUluZGV4LCB0b0luZGV4KTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFJvdyBncm91cGluZ1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF9yb3dHcm91cEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWdnQ29sdW1uczogT25lQWdnQ29sdW1uPFQ+W10gPSBbXTtcblxuICAvKiogVGhlIGZpZWxkcyB0aGUgcm93cyBhcmUgZ3JvdXBlZCBieSwgaW4gbmVzdGluZyBvcmRlci4gRW1wdHkgd2hlbiBvZmYuICovXG4gIHB1YmxpYyBnZXQgcm93R3JvdXBGaWVsZHMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jvd0dyb3VwRmllbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gcm93IGdyb3VwaW5nIG9uLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnRgIHdoZW4gY29sdW1uXG4gICAqIGRlZmluaXRpb25zIGRlY2xhcmUgYHJvd0dyb3VwYDsgdGhlIGdyaWQgdGhlbiBiZWhhdmVzIGFzIGEgdHJlZSBvdmVyXG4gICAqIHN5bnRoZXRpYyBncm91cCByb3dzLCBhbmQgYHNldFJvd0RhdGFgIC8gYHVwZGF0ZVJvd0RhdGFgIGtlZXAgdGFraW5nIHRoZVxuICAgKiBmbGF0IHJvd3MgdGhleSBhbHdheXMgdG9vay5cbiAgICovXG4gIHB1YmxpYyBzZXRSb3dHcm91cGluZyhncm91cEZpZWxkczogc3RyaW5nW10sIGFnZ3JlZ2F0aW9uczogT25lQWdnQ29sdW1uPFQ+W10gPSBbXSk6IHZvaWQge1xuXG4gICAgdGhpcy5fcm93R3JvdXBGaWVsZHMgPSBncm91cEZpZWxkcyA/PyBbXTtcbiAgICB0aGlzLl9hZ2dDb2x1bW5zID0gYWdncmVnYXRpb25zID8/IFtdO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFVuZG8gLyByZWRvIG9mIGNlbGwgZWRpdHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfdW5kb0xpbWl0ID0gMDtcbiAgcHJpdmF0ZSBfdW5kb1N0YWNrOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdID0gW107XG4gIHByaXZhdGUgX3JlZG9TdGFjazogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTdGFydCByZWNvcmRpbmcgY29tbWl0dGVkIGNlbGwgZWRpdHMgZm9yIHVuZG8vcmVkby4gQ2FsbGVkIGJ5XG4gICAqIGBPbmVHcmlkQ29tcG9uZW50YCBmcm9tIGBbdW5kb1JlZG9DZWxsRWRpdGluZ11gOyB0aGUgc3RhY2sga2VlcHMgdGhlIGxhc3RcbiAgICogYGxpbWl0YCBlZGl0cy4gUHJvZ3JhbW1hdGljIGBzZXREYXRhVmFsdWVgIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkIOKAlCBvbmx5XG4gICAqIGNvbW1pdHMsIHRoZSBvbmVzIHRoYXQgcmFpc2UgYGNlbGxWYWx1ZUNoYW5nZWRgIHdpdGhvdXQgYSBzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlVW5kb1JlZG9DZWxsRWRpdGluZyhsaW1pdDogbnVtYmVyID0gMTApOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl91bmRvTGltaXQgPiAwKSByZXR1cm47XG5cbiAgICB0aGlzLl91bmRvTGltaXQgPSBNYXRoLm1heChNYXRoLmZsb29yKGxpbWl0KSwgMSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjZWxsVmFsdWVDaGFuZ2VkJywgKGV2ZW50OiBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgaWYgKGV2ZW50LnNvdXJjZSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLl91bmRvU3RhY2sucHVzaCh7IHJvd0lkOiBldmVudC5ub2RlLnJvd0lkLCBmaWVsZDogZXZlbnQuZmllbGQsIG9sZFZhbHVlOiBldmVudC5vbGRWYWx1ZSwgbmV3VmFsdWU6IGV2ZW50Lm5ld1ZhbHVlIH0pO1xuXG4gICAgICBpZiAodGhpcy5fdW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMuX3VuZG9MaW1pdCkgdGhpcy5fdW5kb1N0YWNrLnNoaWZ0KCk7XG5cbiAgICAgIC8vIEEgbmV3IGVkaXQgZm9ya3MgaGlzdG9yeTsgd2hhdCB3YXMgdW5kb25lIGNhbiBubyBsb25nZXIgYmUgcmVkb25lLlxuICAgICAgdGhpcy5fcmVkb1N0YWNrID0gW107XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV2ZXJ0IHRoZSBtb3N0IHJlY2VudCBjb21taXR0ZWQgZWRpdC4gUmV0dXJucyB3aGV0aGVyIG9uZSB3YXMgdW5kb25lLiAqL1xuICBwdWJsaWMgdW5kb0NlbGxFZGl0aW5nKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMucmVwbGF5RWRpdCh0aGlzLl91bmRvU3RhY2ssIHRoaXMuX3JlZG9TdGFjaywgJ3VuZG8nKTtcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgZWRpdC4gUmV0dXJucyB3aGV0aGVyIG9uZSB3YXMgcmVkb25lLiAqL1xuICBwdWJsaWMgcmVkb0NlbGxFZGl0aW5nKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMucmVwbGF5RWRpdCh0aGlzLl9yZWRvU3RhY2ssIHRoaXMuX3VuZG9TdGFjaywgJ3JlZG8nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50VW5kb1NpemUoKTogbnVtYmVyIHtcblxuICAgIHJldHVybiB0aGlzLl91bmRvU3RhY2subGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRSZWRvU2l6ZSgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlZG9TdGFjay5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHJlcGxheUVkaXQoXG4gICAgZnJvbTogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSxcbiAgICB0bzogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSxcbiAgICBzb3VyY2U6ICd1bmRvJyB8ICdyZWRvJyxcbiAgKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBlZGl0ID0gZnJvbS5wb3AoKTtcblxuICAgIGlmICghZWRpdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQoZWRpdC5yb3dJZCk7XG5cbiAgICAvLyBUaGUgcm93IGNhbiBiZSBnb25lIOKAlCBhIHNldFJvd0RhdGEgcmVwbGFjZWQgdGhlIGRhdGEgdW5kZXIgdGhlIHN0YWNrLlxuICAgIC8vIFRoZSBlZGl0IGlzIGRyb3BwZWQgcmF0aGVyIHRoYW4gcmVwbGF5ZWQgb250byBub3RoaW5nLlxuICAgIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2UgPT09ICd1bmRvJyA/IGVkaXQub2xkVmFsdWUgOiBlZGl0Lm5ld1ZhbHVlO1xuICAgIGNvbnN0IHByZXZpb3VzID0gc291cmNlID09PSAndW5kbycgPyBlZGl0Lm5ld1ZhbHVlIDogZWRpdC5vbGRWYWx1ZTtcblxuICAgIChub2RlLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2VkaXQuZmllbGRdID0gdmFsdWU7XG5cbiAgICB0aGlzLnVwZGF0ZUNlbGxTdGF0ZXMobm9kZSk7XG5cbiAgICB0by5wdXNoKGVkaXQpO1xuXG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCkuY29sdW1ucz8uZmluZChjb2wgPT4gY29sLmZpZWxkID09PSBlZGl0LmZpZWxkKSA/PyBudWxsO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFZhbHVlQ2hhbmdlZCcsIHtcbiAgICAgIG5vZGUsXG4gICAgICBkYXRhOiBub2RlLmRhdGEsXG4gICAgICBjb2x1bW46IGNvbHVtbiBhcyBPbmVDb2x1bW5EZWY8VD4sXG4gICAgICBmaWVsZDogZWRpdC5maWVsZCxcbiAgICAgIG9sZFZhbHVlOiBwcmV2aW91cyxcbiAgICAgIG5ld1ZhbHVlOiB2YWx1ZSxcbiAgICAgIHNvdXJjZSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENsaWVudC1zaWRlIHBhZ2luYXRpb25cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfY2xpZW50UGFnaW5hdGlvbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wYWdlU2l6ZSA9IDI1O1xuICBwcml2YXRlIF9jdXJyZW50UGFnZSA9IDE7XG5cbiAgLyoqIFRoZSBwYWdpbmcgc3RhdGUsIHdoZW4gdGhlIGdyaWQgcGFnZXMgaXRzIG93biByb3dzLiAqL1xuICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25TdGF0ZSgpOiBSZWFkb25seTx7IGVuYWJsZWQ6IGJvb2xlYW47IHBhZ2VTaXplOiBudW1iZXI7IGN1cnJlbnRQYWdlOiBudW1iZXIgfT4ge1xuXG4gICAgcmV0dXJuIHsgZW5hYmxlZDogdGhpcy5fY2xpZW50UGFnaW5hdGlvbiwgcGFnZVNpemU6IHRoaXMuX3BhZ2VTaXplLCBjdXJyZW50UGFnZTogdGhpcy5fY3VycmVudFBhZ2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJuIGdyaWQtb3duZWQgcGFnaW5nIG9uIG9yIG9mZi4gQ2FsbGVkIGJ5IGBPbmVHcmlkQ29tcG9uZW50YCBmcm9tIGl0c1xuICAgKiBgY2xpZW50U2lkZVBhZ2luYXRpb25gIGlucHV0OyB0aGUgZGlzcGxheSBzbGljZSBpcyB3aGF0IGNoYW5nZXMg4oCUIHRoZVxuICAgKiBmdWxsIGRhdGFzZXQgc3RheXMgYmVoaW5kIHRoZSBBUEkgKHNlbGVjdGlvbiwgZmlsdGVycyBhbmQgc29ydGluZyBrZWVwXG4gICAqIG9wZXJhdGluZyBvbiBhbGwgb2YgaXQpLlxuICAgKi9cbiAgcHVibGljIHNldENsaWVudFNpZGVQYWdpbmF0aW9uKGVuYWJsZWQ6IGJvb2xlYW4sIHBhZ2VTaXplPzogbnVtYmVyKTogdm9pZCB7XG5cbiAgICB0aGlzLl9jbGllbnRQYWdpbmF0aW9uID0gZW5hYmxlZDtcblxuICAgIGlmIChwYWdlU2l6ZSAmJiBwYWdlU2l6ZSA+IDApIHRoaXMuX3BhZ2VTaXplID0gcGFnZVNpemU7XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDE7XG4gIH1cblxuICAvKiogQ2hhbmdlIHRoZSBwYWdlIHNpemUgYW5kIHJldHVybiB0byB0aGUgZmlyc3QgcGFnZS4gKi9cbiAgcHVibGljIHNldFBhZ2VTaXplKHBhZ2VTaXplOiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgIShwYWdlU2l6ZSA+IDApKSByZXR1cm47XG5cbiAgICB0aGlzLl9wYWdlU2l6ZSA9IE1hdGguZmxvb3IocGFnZVNpemUpO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gMTtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKiogTW92ZSB0byBhIHBhZ2UgKDEtYmFzZWQpLiBDbGFtcGVkIHRvIGF0IGxlYXN0IDE7IHRoZSB0b3AgZW5kIGNsYW1wcyB3aGVuIHRoZSBzbGljZSBpcyB0YWtlbi4gKi9cbiAgcHVibGljIHNldEN1cnJlbnRQYWdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5tYXgoTWF0aC5mbG9vcihwYWdlKSwgMSk7XG5cbiAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9jdXJyZW50UGFnZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSB0YXJnZXQ7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzbGljZSBvZiByb3dzIHRoZSBjdXJyZW50IHBhZ2Ugc2hvd3Mg4oCUIGEgcGFzc3Rocm91Z2ggd2hpbGUgcGFnaW5nIGlzXG4gICAqIG9mZi4gVGhlIGJvZHkgcm91dGVzIGl0cyByZW5kZXIgbGlzdCB0aHJvdWdoIGhlcmUsIGFmdGVyIHJlcG9ydGluZyB0aGVcbiAgICogZnVsbCBjb3VudCwgc28gYHJvd0NvdW50Q2hhbmdlZGAga2VlcHMgbWVhbmluZyBcInJvd3MgYWZ0ZXIgZmlsdGVyaW5nXCJcbiAgICogd2hldGhlciBvciBub3QgdGhlIGdyaWQgcGFnZXMuXG4gICAqL1xuICBwdWJsaWMgcGFnZU5vZGVzKG5vZGVzOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10pOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgaWYgKCF0aGlzLl9jbGllbnRQYWdpbmF0aW9uKSByZXR1cm4gKG5vZGVzID8/IFtdKSBhcyBPbmVSb3dOb2RlPFQ+W107XG5cbiAgICBjb25zdCBsYXN0UGFnZSA9IE1hdGgubWF4KE1hdGguY2VpbCgobm9kZXM/Lmxlbmd0aCA/PyAwKSAvIHRoaXMuX3BhZ2VTaXplKSwgMSk7XG5cbiAgICAvLyBBIHNocmlua2luZyBkYXRhc2V0IChhIGZpbHRlciwgYSBkZWxldGUpIGNhbiBzdHJhbmQgdGhlIHBhZ2UgcGFzdCB0aGVcbiAgICAvLyBlbmQ7IGNsYW1waW5nIGhlcmUgc2hvd3MgdGhlIGxhc3QgcGFnZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IG9uZS5cbiAgICBpZiAodGhpcy5fY3VycmVudFBhZ2UgPiBsYXN0UGFnZSkgdGhpcy5fY3VycmVudFBhZ2UgPSBsYXN0UGFnZTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMuX2N1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLl9wYWdlU2l6ZTtcblxuICAgIHJldHVybiAobm9kZXMgPz8gW10pLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMuX3BhZ2VTaXplKSBhcyBPbmVSb3dOb2RlPFQ+W107XG4gIH1cblxuICAvKipcbiAgICogU2l6ZSB0aGUgZmxleCBjb2x1bW5zIGludG8gdGhlIGdpdmVuIHdpZHRoLlxuICAgKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyaWQgYm9keSB3aXRoIGl0cyBvd24gdmlld3BvcnQgd2lkdGgg4oCUIG9uIGZpcnN0IHJlbmRlciwgb25cbiAgICogY29udGFpbmVyIHJlc2l6ZSBhbmQgYWZ0ZXIgY29sdW1uIGNoYW5nZXMg4oCUIHNvIGBjb2x1bW5EZWYuZmxleGAgd29ya3NcbiAgICogd2l0aG91dCB0aGUgaG9zdCBkb2luZyBhbnl0aGluZy4gQWxzbyBjYWxsYWJsZSBkaXJlY3RseSB3aXRoIGFueSB3aWR0aC5cbiAgICogQSBuby1vcCB3aGVuIG5vIHZpc2libGUgY29sdW1uIGRlY2xhcmVzIGBmbGV4YCBvciBub3RoaW5nIHdvdWxkIGNoYW5nZS5cbiAgICovXG4gIHB1YmxpYyBhcHBseUZsZXhXaWR0aHMoYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmNvbHVtblNlcnZpY2UuYXBwbHlGbGV4V2lkdGhzKGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBncmlkIGFzIENTVjogdmlzaWJsZSBjb2x1bW5zIGluIGRpc3BsYXkgb3JkZXIsIHZpc2libGUgcm93c1xuICAgKiBpbiBjdXJyZW50IHNvcnQgb3JkZXIsIHZhbHVlcyB0aHJvdWdoIHRoZSBzYW1lIGdldHRlci9mb3JtYXR0ZXIgcGlwZWxpbmVcbiAgICogdGhlIGNlbGxzIHJlbmRlciB3aXRoLiBQaW5uZWQgcm93cyBhbmQgZGV0YWlsIGdyaWRzIGFyZSBub3QgZGF0YSBhbmQgYXJlXG4gICAqIG5vdCBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXREYXRhQXNDc3Yob3B0aW9uczogT25lQ3N2RXhwb3J0T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcblxuICAgIGNvbnN0IG5vZGVzID0gb3B0aW9ucy5vbmx5U2VsZWN0ZWQgPyB0aGlzLmdldFNlbGVjdGVkUm93Tm9kZXMoKSA6IHRoaXMuX3Zpc2libGVSb3dOb2RlcztcblxuICAgIHJldHVybiBidWlsZENzdihub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10sIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnMgYXMgT25lQ29sdW1uRGVmPFQ+W10sIHRoaXMuX2NvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBDU1YgYW5kIGhhbmQgaXQgdG8gdGhlIGJyb3dzZXIgYXMgYSBkb3dubG9hZC4gKi9cbiAgcHVibGljIGV4cG9ydERhdGFBc0NzdihvcHRpb25zOiBPbmVDc3ZFeHBvcnRPcHRpb25zID0ge30pOiB2b2lkIHtcblxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3RoaXMuZ2V0RGF0YUFzQ3N2KG9wdGlvbnMpXSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xuXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblxuICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgbGluay5kb3dubG9hZCA9IG9wdGlvbnMuZmlsZU5hbWUgPz8gJ2V4cG9ydC5jc3YnO1xuICAgIGxpbmsuY2xpY2soKTtcblxuICAgIFVSTC5yZXZva2VPYmplY3RVUkwobGluay5ocmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IG9yIGhpZGUgb25lIGNvbHVtbi4gQSBoaWRkZW4gY29sdW1uIGtlZXBzIGl0cyBvcmRlciwgd2lkdGggYW5kIHBpbixcbiAgICogc28gc2hvd2luZyBpdCBhZ2FpbiByZXN0b3JlcyBpdCBleGFjdGx5LlxuICAgKi9cbiAgcHVibGljIHNldENvbHVtblZpc2libGUoaWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuXG4gICAgdGhpcy51cGRhdGVDb2x1bW4oaWQsIHsgaGlkZTogIXZpc2libGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdGFibGUgbGF5b3V0IHN0YXRlOiBvbmUgSlNPTi1zYWZlIGVudHJ5IHBlciBjb2x1bW4g4oCUIGhpZGRlbiBvbmVzXG4gICAqIGluY2x1ZGVkIOKAlCBpbiBkaXNwbGF5IG9yZGVyLiBGZWVkIGl0IGJhY2sgdGhyb3VnaCBgYXBwbHlDb2x1bW5TdGF0ZWAuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGVTbmFwc2hvdCgpOiBPbmVDb2x1bW5TdGF0ZUVudHJ5W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZVNuYXBzaG90KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIHNuYXBzaG90IGZyb20gYGdldENvbHVtblN0YXRlU25hcHNob3RgOiBvcmRlciwgd2lkdGgsIHBpbiBhbmRcbiAgICogdmlzaWJpbGl0eS4gSWRzIHRoZSBncmlkIG5vIGxvbmdlciBoYXMgYXJlIHNraXBwZWQsIHNvIGEgc3RhbGUgc25hcHNob3RcbiAgICogZGVncmFkZXMgdG8gYSBwYXJ0aWFsIHJlc3RvcmUgcmF0aGVyIHRoYW4gYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgYXBwbHlDb2x1bW5TdGF0ZShlbnRyaWVzOiBPbmVDb2x1bW5TdGF0ZUVudHJ5W10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5hcHBseUNvbHVtblN0YXRlKGVudHJpZXMpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgLy8gQSByZXN0b3JlIGNhbiBzaG93IGNvbHVtbnMgdGhhdCB3ZXJlIGhpZGRlbiB3aGVuIHRoZSByb3dzIHdlcmUgYnVpbHQsXG4gICAgLy8gYW5kIHRoZWlyIGNlbGxzIGhhdmUgbm8gc3RhdGUgeWV0LlxuICAgIHRoaXMucmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNoZWNrYm94IHNlbGVjdGlvbiBmZWF0dXJlc1xuICAgKi9cbiAgcHVibGljIHNldE5vZGVBbmRDaGlsZHJlblNlbGVjdGVkKG5vZGU6IE9uZVJvd05vZGUsIHNlbGVjdGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCByb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IGNvbGxlY3QgPSAobjogT25lUm93Tm9kZSkgPT4ge1xuXG4gICAgICByb3dJZHMuYWRkKG4ucm93SWQpO1xuXG4gICAgICBpZiAobi5jaGlsZHJlbiAmJiBuLmNoaWxkcmVuLmxlbmd0aCkge1xuXG4gICAgICAgIG4uY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjb2xsZWN0KGNoaWxkKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbGxlY3Qobm9kZSk7XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkQnlJZHMoQXJyYXkuZnJvbShyb3dJZHMpLCBzZWxlY3RlZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgSWRlbnRpY2FsIHRvIGB1cGRhdGVDZWxsU3RhdGVzYC4gS2VwdCBhcyBhbiBhbGlhcyBzbyBleGlzdGluZ1xuICAgKiBjYWxsZXJzIGtlZXAgd29ya2luZzsgcHJlZmVyIGB1cGRhdGVDZWxsU3RhdGVzYCwgd2hpY2ggc2F5cyB3aGF0IGl0IGRvZXMuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTm9kZVN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKSB7XG5cbiAgICB0aGlzLnVwZGF0ZUNlbGxTdGF0ZXMobm9kZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogdm9pZCB7XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZShyb3dOb2RlLCBjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGUgZXZlcnkgY2VsbCBvZiBvbmUgcm93IGFuZCByZXBhaW50IGl0LlxuICAgKlxuICAgKiBUaGUgcmVwYWludCBpcyB0aGUgcG9pbnQ6IHRoaXMgaXMgd2hhdCBhIGNhbGxlciByZWFjaGVzIGZvciBhZnRlciBtdXRhdGluZ1xuICAgKiBhIHJvdyBpbiBwbGFjZSwgYW5kIGl0IHVzZWQgdG8gcmVnZW5lcmF0ZSB0aGUgc3RhdGUgYW5kIHN0b3AgdGhlcmUuIFRoZVxuICAgKiBib2R5IHJlbmRlcnMgd2l0aCBPblB1c2gsIHNvIG5vdGhpbmcgbWFya2VkIGl0IGRpcnR5IGFuZCB0aGUgbmV3IHN0YXRlIHNhdFxuICAgKiB1bnJlYWQgdW50aWwgc29tZSB1bnJlbGF0ZWQgZXZlbnQgaGFwcGVuZWQgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIOKAlFxuICAgKiB3aGljaCBpcyB3aHkgY2FsbGVycyBlbmRlZCB1cCBudWRnaW5nIHRoZSBncmlkIHdpdGggYSBzeW50aGV0aWMgRE9NIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNlbGxTdGF0ZXMobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93Tm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAoIXJvd05vZGUpIHJldHVybjtcblxuICAgIHJvd05vZGUuY2VsbFN0YXRlcyA9IHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKHJvd05vZGUpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFN0YXRlQ2hhbmdlZCcsIHsgZGF0YTogcm93Tm9kZS5kYXRhLCBub2RlOiByb3dOb2RlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgdGhhdCBSZWFjdHMgdG8gRGV0YWlsIENoYW5nZXNcbiAgICovXG4gIC8qKlxuICAgKiBLZWVwIGEgbWFzdGVyIHJvdydzIHJlc2VydmVkIGhlaWdodCBpbiBzdGVwIHdpdGggaXRzIGRldGFpbCByb3dzLlxuICAgKlxuICAgKiBUd28gbGlzdGVuZXJzIHVzZWQgdG8gYmUgcmVnaXN0ZXJlZCBoZXJlIGFuZCB0aHJvd24gYXdheTogYW4gZW1wdHlcbiAgICogYHJvd0RhdGFDaGFuZ2VkYCBoYW5kbGVyIHdob3NlIHVuc3Vic2NyaWJlIHdhcyBuZXZlciBrZXB0LCBhbmQgYW5cbiAgICogYGV4cGFuZGVkQ2hhbmdlZGAgaGFuZGxlciB3aG9zZSBib2R5IHdhcyBlbnRpcmVseSBjb21tZW50ZWQgb3V0LiBCb3RoIGFyZVxuICAgKiBnb25lIOKAlCBhIGxpc3RlbmVyIHdpdGggbm8gYmVoYXZpb3VyIGlzIGEgbGVhayB3aXRoIG5vIHVwc2lkZS5cbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9EZXRhaWxDaGFuZ2VzKG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlRGV0YWlsID0gbm9kZS5vbignZGV0YWlsUm93RGF0YUNoYW5nZWQnLCAoeyBub2RlIH0pID0+IHtcblxuICAgICAgaWYgKHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5yZXNvbHZlRGV0YWlsUm93SGVpZ2h0KG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3Rlck5vZGVDbGVhbnVwKG5vZGUucm93SWQsIFt1bnN1YnNjcmliZURldGFpbF0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck5vZGVDbGVhbnVwKHJvd0lkOiBzdHJpbmcsIHVuc3ViczogQXJyYXk8KCkgPT4gdm9pZD4pOiB2b2lkIHtcblxuICAgIC8vIE1lcmdlIHdpdGggYW55IGV4aXN0aW5nIGNsZWFudXBzIGZvciB0aGlzIHJvd0lkXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9ub2RlQ2xlYW51cE1hcC5nZXQocm93SWQpID8/IFtdO1xuXG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuc2V0KHJvd0lkLCBbLi4uZXhpc3RpbmcsIC4uLnVuc3Vic10pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwTm9kZShyb3dJZDogc3RyaW5nKTogdm9pZCB7XG5cbiAgICBjb25zdCBjbGVhbnVwcyA9IHRoaXMuX25vZGVDbGVhbnVwTWFwLmdldChyb3dJZCk7XG5cbiAgICBjbGVhbnVwcz8uZm9yRWFjaChmbiA9PiBmbigpKTtcblxuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLmRlbGV0ZShyb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRhdGEsIHJlbGVhc2luZyB3aGF0IHRoZXkgaG9sZC5cbiAgICpcbiAgICogVGhpcyBleGlzdGVkIGJ1dCB3YXMgbmV2ZXIgY2FsbGVkOiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBlYWNoXG4gICAqIGRlbGV0ZWQgc3RyYWlnaHQgb3V0IG9mIGBfb3JpZ2luYWxSb3dOb2Rlc2AsIHNvIGEgcmVtb3ZlZCBub2RlIGtlcHQgaXRzXG4gICAqIGxpc3RlbmVycyBhbmQgaXRzIGVudHJ5IGluIGBfbm9kZUNsZWFudXBNYXBgIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGdyaWQuXG4gICAqIEJvdGggbm93IGNvbWUgdGhyb3VnaCBoZXJlLCB3aGljaCB1bnN1YnNjcmliZXMgYW5kIGNsZWFycyB0aGUgbm9kZSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgcHJ1bmVSZW1vdmVkTm9kZXModmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG5cbiAgICBmb3IgKGNvbnN0IFtyb3dJZCwgbm9kZV0gb2YgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcykge1xuXG4gICAgICBpZiAoIXZhbGlkUm93SWRzLmhhcyhyb3dJZCkpIHtcblxuICAgICAgICB0aGlzLmNsZWFudXBOb2RlKHJvd0lkKTsgIC8vIHVuc3Vic2NyaWJlIGxpc3RlbmVyc1xuXG4gICAgICAgIG5vZGUuZGVzdHJveSgpOyAgICAgICAgICAgLy8gY2xlYXIgbm9kZSdzIG93biBsaXN0ZW5lciBtYXBcblxuICAgICAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmRlbGV0ZShyb3dJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlaWdodCBhIG1hc3RlciByb3cgbXVzdCByZXNlcnZlIGZvciBpdHMgZGV0YWlsIGdyaWQ6XG4gICAqIHJvd0hlaWdodCB4IGNsYW1wKHJvd3MsIG1pblJvd3MsIG1heFJvd3MpICsgaGVhZGVySGVpZ2h0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGV0YWlsUm93SGVpZ2h0KG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IGhlaWdodE9wdGlvbnMgPSB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcz8uZGV0YWlsR3JpZE9wdGlvbnM/LmRldGFpbFJvd0hlaWdodE9wdGlvbnM7XG5cbiAgICAvLyBSZWFjaGFibGUgd2hlbmV2ZXIgbWFzdGVyRGV0YWlsIGlzIG9uIGJ1dCBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgaXNcbiAgICAvLyBpbmNvbXBsZXRlOyB3aXRob3V0IHRoZSBndWFyZCB0aGlzIHRocmV3IGZyb20gaW5zaWRlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgIGlmICghaGVpZ2h0T3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgbWluUm93cyA9IGhlaWdodE9wdGlvbnMubWluUm93cztcbiAgICBjb25zdCBtYXhSb3dzID0gaGVpZ2h0T3B0aW9ucy5tYXhSb3dzO1xuXG4gICAgY29uc3QgbWluSGVpZ2h0ID0gKHRoaXMucm93SGVpZ2h0ICogbWluUm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtYXhSb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuXG4gICAgY29uc3Qgcm93cyA9IG5vZGUuZGV0YWlsUm93RGF0YSAmJiBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoID8gbm9kZS5kZXRhaWxSb3dEYXRhLmxlbmd0aCA6IDA7XG5cbiAgICBub2RlLmRldGFpbFJvd0hlaWdodCA9IHJvd3MgPD0gbWluUm93cyA/IG1pbkhlaWdodCA6IHJvd3MgPj0gbWF4Um93cyA/IG1heEhlaWdodCA6ICh0aGlzLnJvd0hlaWdodCAqIHJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBldmVyeXRoaW5nIHRoZSBncmlkIGhvbGRzLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnQubmdPbkRlc3Ryb3lgLlxuICAgKlxuICAgKiBUaGUgc2VydmljZXMgYXJlIGRlbGliZXJhdGVseSAqbm90KiBudWxsZWQgb3V0IGFueSBtb3JlLiBUaGV5IGFyZSBpbmplY3RlZCxcbiAgICogQW5ndWxhciBvd25zIHRoZWlyIGxpZmV0aW1lLCBhbmQgbnVsbGluZyB0aGVtIG9ubHkgZ3VhcmFudGVlZCBhXG4gICAqIGBUeXBlRXJyb3JgIGZvciBhbnkgY2FsbGJhY2sgdGhhdCBhcnJpdmVkIGFmdGVyIHRlYXJkb3duIOKAlCBhIGRldGFpbC1yb3dcbiAgICogZmV0Y2ggcmVzb2x2aW5nIGxhdGUsIG9yIHRoZSBib2R5J3MgZGVmZXJyZWQgdXBkYXRlLiBgX2Rlc3Ryb3llZGAgbWFrZXNcbiAgICogdGhvc2UgY2FsbHMgbm8tb3BzIGluc3RlYWQsIHdoaWNoIGlzIHdoYXQgYSB0b3JuLWRvd24gb2JqZWN0IHNob3VsZCBkby5cbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGV2ZXJ5IHBlci1ub2RlIGxpc3RlbmVyIGJlZm9yZSBkcm9wcGluZyB0aGUgbm9kZXMuXG4gICAgZm9yIChjb25zdCByb3dJZCBvZiBBcnJheS5mcm9tKHRoaXMuX25vZGVDbGVhbnVwTWFwLmtleXMoKSkpIHtcblxuICAgICAgdGhpcy5jbGVhbnVwTm9kZShyb3dJZCk7XG4gICAgfVxuXG4gICAgLy8gYGRlc3Ryb3lgIGRyb3BzIHRoZSB0cmVlIGxpbmtzIGFuZCB0aGUgbGlzdGVuZXJzOyB0aGUgQVBJIG5vIGxvbmdlciBoYXNcbiAgICAvLyB0byByZWFjaCBpbiBhbmQgdW5waWNrIGVhY2ggbm9kZSBpdHNlbGYuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gbm9kZS5kZXN0cm95KCkpO1xuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG5cbiAgICBmb3IgKGNvbnN0IHNpZGUgb2YgWyd0b3AnLCAnYm90dG9tJ10gYXMgT25lUGlubmVkUm93U2lkZVtdKSB7XG5cbiAgICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG4gICAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd05vZGVzID0gW107XG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gW107XG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5jbGVhcigpO1xuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5fY3VycmVudEluZGV4ID0gMDtcblxuICAgIC8vIFJlbGVhc2UgdGhlIGJhY2stcmVmZXJlbmNlIHRoZSBjZWxsIHNlcnZpY2UgaG9sZHMsIHNvIGEgdG9ybi1kb3duIGFwaSBpc1xuICAgIC8vIG5vdCBrZXB0IGFsaXZlIGJ5IHRoZSBzZXJ2aWNlIHRoYXQgb3V0bGl2ZXMgdGhpcyBjYWxsLlxuICAgIHRoaXMuY2VsbFNlcnZpY2Uuc2V0R3JpZEFwaShudWxsKTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS5jbGVhcigpO1xuXG4gICAgdGhpcy5fYWN0aXZlRmlsdGVycyA9IFtdO1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSBudWxsO1xuICAgIHRoaXMuX3NvcnRNb2RlbCA9IFtdO1xuICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuXG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBmYWxzZTtcbiAgICB0aGlzLnRyZWVEYXRhID0gZmFsc2U7XG4gICAgdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQgPSBudWxsO1xuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSAwO1xuICAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gbnVsbDtcbiAgICB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gbnVsbDtcbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBkZXN0cm95YCBoYXMgcnVuLiBMYXRlIGNhbGxiYWNrcyBjaGVjayB0aGlzIGJlZm9yZSBkb2luZyB3b3JrLiAqL1xuICBwdWJsaWMgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcblxuICAgIHJldHVybiB0aGlzLl9kZXN0cm95ZWQ7XG4gIH1cbn1cbiJdfQ==
1185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFNakQsTUFBTSxPQUFPLFVBQVU7SUFxQnJCLHdEQUF3RDtJQUN4RCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3RUFBd0U7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R0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxJQUFXLFNBQVM7UUFFbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7K0dBdGxEVSxVQUFVO21IQUFWLFVBQVU7OzRGQUFWLFVBQVU7a0JBRHRCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9tb2RlbHMvb25lLXRyZWUtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBPbmVDb2x1bW5EZWYsIE9uZUNvbHVtblN0YXRlRW50cnkgfSBmcm9tICcuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gXCIuL29uZS1yb3ctbm9kZS5jbGFzc1wiO1xuaW1wb3J0IHsgT25lR3JpZEluaXRPcHRpb25zLCBPbmVHcmlkVHlwZSwgT25lU29ydE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lUm93VmFsaWRhdGlvbkVycm9ycywgT25lVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uL21vZGVscy9vbmUtdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBPbmVGaWx0ZXJNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1leHBhbnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMsIE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkUm93U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZVwiO1xuaW1wb3J0IHsgZmlsdGVyVHJlZU5vZGUsIGlzRmlsdGVyQWN0aXZlIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLWZpbHRlci5oZWxwZXJcIjtcbmltcG9ydCB7IGJ1aWxkQ3N2LCBPbmVDc3ZFeHBvcnRPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLWNzdi5oZWxwZXJcIjtcbmltcG9ydCB7IGJ1aWxkR3JvdXBlZFJvd3MsIE9uZUFnZ0NvbHVtbiwgT05FX0dST1VQX0lEX0ZJRUxEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLXJvdy1ncm91cGluZy5oZWxwZXJcIjtcbmltcG9ydCB7IE9uZVJvd0RyYWdTdXBwcmVzc2VkUmVhc29uIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtcm93LWRyYWcubW9kZWxcIjtcbmltcG9ydCB7IGdldEZpZWxkVmFsdWUgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtY2VsbC5oZWxwZXJcIjtcbmltcG9ydCB7IE9uZUdyaWRDZWxsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IEluamVjdGFibGUsIFR5cGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ2VsbFZhbHVlQ2hhbmdlZEV2ZW50LCBDb2x1bW5DaGFuZ2VkRXZlbnQsIE9uZVBpbm5lZFJvd1NpZGUsIFJvd1NlbGVjdGlvbk1vZGUgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbFwiO1xuaW1wb3J0IHsgT25lR3JvdXBDb2x1bW5EZWYgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2VcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRBcGk8VCA9IGFueT4ge1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQdWJsaWMgc3RhdGVcbiAgLy9cbiAgLy8gRXhwb3NlZCBhcyBnZXR0ZXJzLCBub3QgZmllbGRzLiBUaGVzZSB3ZXJlIHdyaXRhYmxlLCBzbyBhIGNvbnN1bWVyIGNvdWxkXG4gIC8vIGNvcnJ1cHQgdGhlIGdyaWQgYnkgYXNzaWduaW5nIHRvIHRoZW0g4oCUIHN3YXBwaW5nIGByb3dOb2Rlc2AgZm9yIGFuXG4gIC8vIHVucmVsYXRlZCBhcnJheSwgb3Igc2V0dGluZyBgc29ydE1vZGVsYCB3aXRob3V0IHRoZSByb3dzIGV2ZXIgYmVpbmdcbiAgLy8gcmUtc29ydGVkLiBSZWFkcyBhcmUgdW5jaGFuZ2VkOyBvbmx5IGFzc2lnbm1lbnQgaXMgbm93IGEgY29tcGlsZSBlcnJvci5cbiAgLy9cbiAgLy8gVGhlIGFycmF5LXZhbHVlZCBvbmVzIGFyZSB0eXBlZCBgcmVhZG9ubHkgVFtdYCwgd2hpY2ggc3RvcHMgYHB1c2hgIGFuZFxuICAvLyBgc3BsaWNlYCBhdCBjb21waWxlIHRpbWUgd2l0aG91dCBjb3B5aW5nIG9uIGV2ZXJ5IHJlYWQuIFVzZVxuICAvLyBgZ2V0QWxsUm93Tm9kZXMoKWAgd2hlbiB5b3Ugd2FudCBhIGNvcHkgeW91IG93bi5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRleHQ6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgX3Jvd1NlbGVjdGlvbjogUm93U2VsZWN0aW9uTW9kZSA9IG51bGw7XG4gIHByaXZhdGUgX2FwaVR5cGU6IE9uZUdyaWRUeXBlID0gbnVsbDtcbiAgcHJpdmF0ZSBfcm93Tm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcml2YXRlIF9zb3J0TW9kZWw6IE9uZVNvcnRNb2RlbDxUPltdID0gW107XG5cbiAgLyoqIFVuaXF1ZSBwZXIgZ3JpZCBpbnN0YW5jZSwgYXNzaWduZWQgZHVyaW5nIGBpbml0YC4gKi9cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8qKiBUaGUgYFtjb250ZXh0XWAgdGhlIGdyaWQgd2FzIGdpdmVuLiAqL1xuICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dDtcbiAgfVxuXG4gIC8qKiBTZWxlY3Rpb24gbW9kZSwgY2FwdHVyZWQgZHVyaW5nIGBpbml0YC4gQ2hhbmdpbmcgdGhlIGlucHV0IGxhdGVyIGhhcyBubyBlZmZlY3QuICovXG4gIHB1YmxpYyBnZXQgcm93U2VsZWN0aW9uKCk6IFJvd1NlbGVjdGlvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3Rpb247XG4gIH1cblxuICAvKiogV2hpY2ggcm9sZSB0aGlzIGluc3RhbmNlIHBsYXlzOiBzaW1wbGUsIG1hc3RlciwgZGV0YWlsIG9yIHRyZWUuICovXG4gIHB1YmxpYyBnZXQgYXBpVHlwZSgpOiBPbmVHcmlkVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaVR5cGU7XG4gIH1cblxuICAvKiogRXZlcnkgbm9kZSB0aGUgZ3JpZCBob2xkcywgaW4gZmxhdHRlbmVkIG9yZGVyLiAqL1xuICBwdWJsaWMgZ2V0IHJvd05vZGVzKCk6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd05vZGVzO1xuICB9XG5cbiAgLyoqIFRoZSBzb3J0IG1vZGVsIGN1cnJlbnRseSBhcHBsaWVkLiBDaGFuZ2UgaXQgd2l0aCBgb25Tb3J0Q2hhbmdlZGAuICovXG4gIHB1YmxpYyBnZXQgc29ydE1vZGVsKCk6IHJlYWRvbmx5IE9uZVNvcnRNb2RlbDxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydE1vZGVsO1xuICB9XG5cblxuICBwcml2YXRlIHJvd0hlaWdodDogbnVtYmVyID0gMjY7XG4gIHByaXZhdGUgaGVhZGVyUm93SGVpZ2h0OiBudW1iZXIgPSAzMjtcbiAgcHJpdmF0ZSBfY3VycmVudEluZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9xdWlja0ZpbHRlclZhbHVlOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIF9hY3RpdmVGaWx0ZXJzOiBPbmVGaWx0ZXJNb2RlbFtdID0gW107XG5cbiAgcHJpdmF0ZSBfdmlzaWJsZVJvd05vZGVzOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGlubmVkUm93Tm9kZXM6IFJlY29yZDxPbmVQaW5uZWRSb3dTaWRlLCBPbmVSb3dOb2RlPFQ+W10+ID0geyB0b3A6IFtdLCBib3R0b206IFtdIH07XG4gIHByaXZhdGUgX29yaWdpbmFsUm93Tm9kZXM6IE1hcDxzdHJpbmcsIE9uZVJvd05vZGU8VD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9ub2RlQ2xlYW51cE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTwoKSA9PiB2b2lkPj4oKTsgLy8gQ2xlYW51cCByZWdpc3RyeSAocHJldmVudHMgbWVtb3J5IGxlYWtzKVxuICBwcml2YXRlIF9kZXN0cm95ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBBZHZhbmNlZCBGZWF0dXJlc1xuICBwcml2YXRlIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgdHJlZURhdGFDaGlsZHJlbkZpZWxkOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAwO1xuXG4gIHByaXZhdGUgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zOiBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM7XG4gIHByaXZhdGUgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ/OiBUeXBlPE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIFN1cHBsaWVzIGEgbWFzdGVyIHJvdydzIGRldGFpbCByb3dzLiBTZXQgdGhyb3VnaCBgc2V0R2V0RGV0YWlsUm93RGF0YWA7XG4gICAqIHByZXZpb3VzbHkgYSB3cml0YWJsZSBwdWJsaWMgZmllbGQgd2l0aCBhIHNldHRlciBiZXNpZGUgaXQsIHdoaWNoIGxlZnQgdHdvXG4gICAqIHdheXMgdG8gZG8gdGhlIHNhbWUgdGhpbmcgYW5kIG9uZSBvZiB0aGVtIHVuY2hlY2tlZC5cbiAgICovXG4gIHByaXZhdGUgX2dldERldGFpbFJvd0RhdGE6IChwYXJhbXM6IE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb2x1bW5TZXJ2aWNlOiBPZ0NvbHVtblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3dTZXJ2aWNlOiBPbmVHcmlkUm93U2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZXJ2aWNlOiBPbmVHcmlkQ2VsbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlOiBPbmVHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGV4cGFuc2lvblNlcnZpY2U6IE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIFN0YW5kIHRoZSBncmlkIHVwLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnRgIGZyb20gYG5nT25Jbml0YC5cbiAgICpcbiAgICogVGFrZXMgYSBzaW5nbGUgYE9uZUdyaWRJbml0T3B0aW9uc2AgcmF0aGVyIHRoYW4gdGhlIHRlbiBwb3NpdGlvbmFsXG4gICAqIGFyZ3VtZW50cyBpdCB1c2VkIHRvLCBzbyBhIGNhbGwgc2l0ZSByZWFkcyBhcyB0aGUgY29uZmlndXJhdGlvbiBpdCBpcyBhbmRcbiAgICogYSBuZXcgb3B0aW9uIG5vIGxvbmdlciBtZWFucyBlZGl0aW5nIGV2ZXJ5IGNhbGxlci5cbiAgICpcbiAgICogQGludGVybmFsIEFwcGxpY2F0aW9ucyBvYnRhaW4gYSByZWFkeS1tYWRlIEFQSSBmcm9tIGAob25HcmlkUmVhZHkpYDsgdGhleVxuICAgKiBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBpbml0KG9wdGlvbnM6IE9uZUdyaWRJbml0T3B0aW9uczxUPik6IHZvaWQge1xuXG4gICAgY29uc3Qge1xuICAgICAgZ3JpZFR5cGUsXG4gICAgICBjb2x1bW5EZWZzLFxuICAgICAgZGVmYXVsdENvbHVtbkRlZiA9IHt9LFxuICAgICAgZ3JvdXBDb2x1bW5EZWZzID0gW10sXG4gICAgICBjb250ZXh0ID0gbnVsbCxcbiAgICAgIHJvd1NlbGVjdGlvbiA9IG51bGwsXG4gICAgICBtYXN0ZXJEZXRhaWwgPSBmYWxzZSxcbiAgICAgIGRldGFpbENlbGxSZW5kZXJlclBhcmFtcyA9IG51bGwsXG4gICAgICBkZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IG51bGwsXG4gICAgICB0cmVlRGF0YSA9IGZhbHNlLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgdGhpcy5faWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLl9hcGlUeXBlID0gZ3JpZFR5cGU7XG4gICAgdGhpcy5fcm93U2VsZWN0aW9uID0gcm93U2VsZWN0aW9uO1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMubWFzdGVyRGV0YWlsID0gbWFzdGVyRGV0YWlsO1xuICAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICAgIHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDtcbiAgICB0aGlzLnRyZWVEYXRhID0gdHJlZURhdGE7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2V0U2VsZWN0aW9uTW9kZShyb3dTZWxlY3Rpb24pO1xuXG4gICAgLy8gU3ludGhldGljIGdyb3VwIHJvd3MgY2FycnkgdGhlaXIgb3duIHN0YWJsZSBpZCDigJQgdGhlIHBhdGggb2YgZ3JvdXBcbiAgICAvLyB2YWx1ZXMg4oCUIHdoaWNoIG5vIGhvc3QgZ2V0Um93SWQga25vd3MgaG93IHRvIGRlcml2ZS4gVGhlIHdyYXBwZXIgcmVhZHNcbiAgICAvLyBpdCBmaXJzdCBhbmQgZGVmZXJzIHRvIHRoZSBob3N0J3MgZnVuY3Rpb24gKG9yIHRoZSB1dWlkIGZhbGxiYWNrKSBmb3JcbiAgICAvLyByZWFsIHJvd3MsIHNvIGdyb3VwaW5nIGtlZXBzIGV4cGFuc2lvbiBhY3Jvc3MgcmVidWlsZHMgZXZlbiB3aGVuIHRoZVxuICAgIC8vIGhvc3QgcHJvdmlkZWQgbm8gaWQgZnVuY3Rpb24gYXQgYWxsLlxuICAgIGNvbnN0IGhvc3RHZXRSb3dJZCA9IGNvbnRleHQ/LmNvbXBvbmVudFBhcmVudD8uZ2V0Um93SWQgPz8gbnVsbDtcblxuICAgIHRoaXMucm93U2VydmljZS5zZXRHZXRSb3dJZEZuKChwYXJhbXM6IHsgZGF0YTogYW55OyByb3dJbmRleDogbnVtYmVyIH0pID0+XG4gICAgICBwYXJhbXM/LmRhdGE/LltPTkVfR1JPVVBfSURfRklFTERdID8/IGhvc3RHZXRSb3dJZD8uKHBhcmFtcykgPz8gbnVsbCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5EZWZzLCBjb250ZXh0KTtcbiAgICB0aGlzLmNlbGxTZXJ2aWNlLnNldEdyaWRBcGkodGhpcyk7XG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLmluaXRDb2x1bW5EZWZzKGRlZmF1bHRDb2x1bW5EZWYsIGNvbHVtbkRlZnMsIGdyb3VwQ29sdW1uRGVmcywgY29udGV4dCk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUgYXMgQ29sdW1uQ2hhbmdlZEV2ZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBldmVyeSByb3csIGRpc2NhcmRpbmcgc2VsZWN0aW9uIGFuZCBleHBhbnNpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4gdGhlIHJvd3MgcmVwcmVzZW50IHNvbWV0aGluZyBuZXcuIFRvIHN3YXAgdGhlIGRhdGEgd2hpbGVcbiAgICoga2VlcGluZyB3aGF0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBhbmQgb3BlbmVkLCB1c2UgYHVwZGF0ZVJvd0RhdGFgLlxuICAgKi9cbiAgcHVibGljIHNldFJvd0RhdGEocm93RGF0YTogVFtdKSB7XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvd0RhdGEsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgZXZlcnkgcm93LCBrZWVwaW5nIHNlbGVjdGlvbiBhbmQgZXhwYW5zaW9uLlxuICAgKlxuICAgKiBTdGF0ZSBpcyBrZXllZCBieSByb3cgaWQsIHNvIHRoaXMgb25seSBwcmVzZXJ2ZXMgYW55dGhpbmcgaWYgdGhlIGdyaWQgaGFzIGFcbiAgICogYGNvbnRleHQuY29tcG9uZW50UGFyZW50LmdldFJvd0lkYCDigJQgb3RoZXJ3aXNlIGVhY2ggcmVidWlsZCBtaW50cyBuZXcgaWRzXG4gICAqIGFuZCB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVSb3dEYXRhKHJvd0RhdGE6IFRbXSkge1xuXG4gICAgdGhpcy5yZWJ1aWxkUm93cyhyb3dEYXRhLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9uZSByb3ctbG9hZGluZyBwYXRoLiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBkaWZmZXJlZCBvbmx5IGluXG4gICAqIHdoZXRoZXIgdGhleSBjbGVhcmVkIHRoZSBzdGF0ZSBzZXJ2aWNlcyBmaXJzdCwgc28gZXZlcnl0aGluZyBlbHNlIOKAlCBidWlsZCxcbiAgICogZmlsdGVyLCBwcnVuZSDigJQgbGl2ZXMgaGVyZSBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkUm93cyhyb3dEYXRhOiBUW10sIHJlc2V0U3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGlmIChyZXNldFN0YXRlKSB7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gUm93IGdyb3VwaW5nIGlzIGEgdHJhbnNmb3JtIG9uIHRoZSB3YXkgaW46IHRoZSBob3N0IGtlZXBzIGhhbmRpbmcgdGhlXG4gICAgLy8gZ3JpZCBmbGF0IHJvd3MsIGFuZCB0aGUgdHJlZSBwaXBlbGluZSBiZWxvdyBzZWVzIHN5bnRoZXRpYyBncm91cCByb3dzXG4gICAgLy8gd2l0aCBjaGlsZHJlbiDigJQgdGhlIHNhbWUgc2hhcGUgdHJlZSBkYXRhIGFycml2ZXMgaW4uXG4gICAgaWYgKHRoaXMuX3Jvd0dyb3VwRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICByb3dEYXRhID0gYnVpbGRHcm91cGVkUm93cyhyb3dEYXRhLCB0aGlzLl9yb3dHcm91cEZpZWxkcywgdGhpcy5fYWdnQ29sdW1ucykgYXMgVFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0aGlzLmJ1aWxkUm93Tm9kZXMocm93RGF0YSwgbnVsbCwgMCwgdmFsaWRSb3dJZHMpO1xuXG4gICAgLy8gUHJ1bmUgQkVGT1JFIHNvcnRpbmcgYW5kIGZpbHRlcmluZzogYm90aCByZWFkIGBfb3JpZ2luYWxSb3dOb2Rlc2AsIGFuZFxuICAgIC8vIHdpdGggdGhlIHBydW5lIGxhc3QsIGEgZGF0YSBzd2FwIHdoaWxlIGEgc29ydCB3YXMgYWN0aXZlIHJlc3VycmVjdGVkXG4gICAgLy8gdGhlIHJlbW92ZWQgcm93cyBpbnRvIGBfcm93Tm9kZXNgIGZvciBvbmUgd2hvbGUgcmVuZGVyIOKAlCB0aGUgb2xkIGFuZFxuICAgIC8vIHRoZSBuZXcgZGF0YXNldCBvbiBzY3JlZW4gdG9nZXRoZXIgdW50aWwgdGhlIG5leHQgcmVidWlsZC5cbiAgICB0aGlzLnBydW5lUmVtb3ZlZE5vZGVzKHZhbGlkUm93SWRzKTtcblxuICAgIC8vIFJlLWFwcGx5IHRoZSBhY3RpdmUgc29ydC4gYGJ1aWxkUm93Tm9kZXNgIHJlYnVpbGRzIHRoZSByb3cgbGlzdCBpbiB0aGVcbiAgICAvLyBvcmRlciB0aGUgZGF0YSBhcnJpdmVkLCBzbyB3aXRob3V0IHRoaXMgYSBkYXRhIHVwZGF0ZSBzaWxlbnRseSByZXR1cm5lZFxuICAgIC8vIHRoZSByb3dzIHRvIHRoYXQgb3JkZXIgd2hpbGUgYHNvcnRNb2RlbGAg4oCUIGFuZCB0aGVyZWZvcmUgdGhlIGhlYWRlcidzXG4gICAgLy8gc29ydCBhcnJvdyDigJQgc3RpbGwgc2FpZCB0aGV5IHdlcmUgc29ydGVkLiBTb3J0aW5nIGJlZm9yZSBmaWx0ZXJpbmdcbiAgICAvLyBiZWNhdXNlIGZpbHRlcmluZyBvbmx5IHNldHMgdmlzaWJpbGl0eSBvbiB3aGF0ZXZlciBvcmRlciB0aGlzIGxlYXZlcy5cbiAgICBpZiAodGhpcy5fc29ydE1vZGVsLmxlbmd0aCA+IDApIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBCdWlsZCBSb3cgTm9kZXMgKE9wdGltaXplZClcbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dOb2RlcyhcbiAgICByb3dEYXRhOiBUW10sXG4gICAgcGFyZW50OiBPbmVSb3dOb2RlPFQ+IHwgbnVsbCA9IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlciA9IDAsXG4gICAgdmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuICAgIGV4cGFuZGVkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5leHBhbnNpb25TZXJ2aWNlLmdldEV4cGFuZGVkSWRzKCkpLFxuICAgIGNvbGxhcHNlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuZXhwYW5zaW9uU2VydmljZS5nZXRDb2xsYXBzZWRJZHMoKSksXG4gICAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRJZHMoKSksXG4gICAgdmlzaXRlZERhdGE6IFNldDx1bmtub3duPiA9IG5ldyBTZXQoKVxuICApOiBPbmVSb3dOb2RlW10ge1xuXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFtdO1xuICAgICAgdGhpcy5fY3VycmVudEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIXJvd0RhdGE/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkYXRhIG9mIHJvd0RhdGEpIHtcblxuICAgICAgY29uc3Qgcm93SWQgPSB0aGlzLnJvd1NlcnZpY2UuZ2VuZXJhdGVSb3dJZChkYXRhLCB0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICAvLyBBIGN5Y2xlIGluIHRoZSBjaGlsZHJlbiBncmFwaCDigJQgYSByb3cgcmVhY2hhYmxlIGZyb20gaXRzIG93biBzdWJ0cmVlLFxuICAgICAgLy8gdGhlIGNsYXNzaWMgT1JNIGJhY2stcmVmZXJlbmNlIOKAlCB1c2VkIHRvIHJlY3Vyc2UgdW50aWwgdGhlIHN0YWNrIGJsZXcsXG4gICAgICAvLyBmcmVlemluZyB0aGUgYXBwOyBhbmQgd2l0aCBnZW5lcmF0ZWQgcm93IGlkcyBpdCBkaWQgc28gd2hpbGUgbWludGluZ1xuICAgICAgLy8gbm9kZXMgdGhlIHdob2xlIHdheSBkb3duLiBUaGUgc2FtZSBndWFyZCBhbHNvIGRyb3BzIGEgZHVwbGljYXRlIHJvdyBpZFxuICAgICAgLy8gKG9yIHRoZSBzYW1lIHJvdyBvYmplY3QgYXBwZWFyaW5nIHR3aWNlKTogZmlyc3Qgb2NjdXJyZW5jZSB3aW5zLlxuICAgICAgaWYgKHZpc2l0ZWREYXRhLmhhcyhkYXRhKSB8fCB2YWxpZFJvd0lkcy5oYXMocm93SWQpKSB7XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBbb25lLWdyaWRdIGN5Y2xpYyBvciBkdXBsaWNhdGUgcm93IChpZCBcIiR7cm93SWR9XCIpIOKAlCBza2lwcGVkLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMuIFRyZWUgZGF0YSBtdXN0IGJlIGFjeWNsaWMgYW5kIHJvdyBpZHMgdW5pcXVlLmApO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aXNpdGVkRGF0YS5hZGQoZGF0YSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGRhdGEgYXMgYW55KVt0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZF0gfHwgbnVsbDtcblxuICAgICAgbGV0IG5vZGU6IE9uZVJvd05vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgIHZhbGlkUm93SWRzLmFkZChyb3dJZCk7XG5cbiAgICAgIGlmIChub2RlKSB7XG5cbiAgICAgICAgbm9kZS5kYXRhID0gZGF0YTtcbiAgICAgICAgbm9kZS5zZXRSb3dJbmRleCh0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUgPSBuZXcgT25lUm93Tm9kZTxUPihyb3dJZCwgZGF0YSwgdGhpcy5fY3VycmVudEluZGV4KTtcbiAgICAgICAgbm9kZS5sZXZlbCA9IGxldmVsO1xuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgbm9kZS5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5zZXQocm93SWQsIG5vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FeGlzdCA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+PSAwO1xuXG4gICAgICAvLyBDb2VyY2VkLCBiZWNhdXNlIGBjaGlsZHJlbkV4aXN0YCBpcyBgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID49IDBgXG4gICAgICAvLyDigJQgd2hpY2ggaXMgYG51bGxgIGZvciBhIHJvdyB3aXRoIG5vIGNoaWxkcmVuIGZpZWxkLCBub3QgYGZhbHNlYC4gVGhlc2VcbiAgICAgIC8vIGFyZSBkZWNsYXJlZCBgYm9vbGVhbmAsIGFuZCBhc3NpZ25pbmcgbnVsbCBtYWRlIGV2ZXJ5IGNvbnN1bWVyIGNvbXBhcmVcbiAgICAgIC8vIHRydXRoaW5lc3MgaW5zdGVhZCBvZiB0aGUgdmFsdWUuXG4gICAgICBub2RlLmdyb3VwID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyBmYWxzZSA6ICEhY2hpbGRyZW5FeGlzdDtcbiAgICAgIG5vZGUubGVhZiA9IHRoaXMubWFzdGVyRGV0YWlsID8gdHJ1ZSA6ICFub2RlLmdyb3VwO1xuICAgICAgbm9kZS5sZWFmR3JvdXAgPSB0aGlzLm1hc3RlckRldGFpbCA/IGZhbHNlIDogKG5vZGUuZ3JvdXAgJiYgIWNoaWxkcmVuRXhpc3QpO1xuICAgICAgbm9kZS5leHBhbmRhYmxlID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyB0cnVlIDogKG5vZGUuZ3JvdXAgJiYgIW5vZGUubGVhZkdyb3VwKTtcblxuICAgICAgY29uc3QgZGVmYXVsdEV4cGFuZGVkID0gbm9kZS5leHBhbmRhYmxlICYmIChsZXZlbCA8IHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgfHwgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9PT0gLTEpO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkSWRzLmhhcyhyb3dJZCkgPyB0cnVlIDogY29sbGFwc2VkSWRzLmhhcyhyb3dJZCkgPyBmYWxzZSA6IGRlZmF1bHRFeHBhbmRlZCk7XG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkSWRzLmhhcyhyb3dJZCkpO1xuICAgICAgbm9kZS5zZXRDZWxsU3RhdGVzKHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGUpKTtcblxuICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsICYmIHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5fZ2V0RGV0YWlsUm93RGF0YSh7IGRhdGEsIG5vZGU6IG5vZGUsIHN1Y2Nlc3NDYWxsYmFjazogKGRldGFpbFJvd0RhdGEpID0+IG5vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxSb3dEYXRhKSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudEluZGV4Kys7XG4gICAgICB0aGlzLl9yb3dOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2RlLmNoaWxkcmVuID0gdGhpcy50cmVlRGF0YSAmJiBjaGlsZHJlbkV4aXN0ID8gdGhpcy5idWlsZFJvd05vZGVzKGNoaWxkcmVuIHx8IFtdLCBub2RlLCBsZXZlbCArIDEsIHZhbGlkUm93SWRzLCBleHBhbmRlZElkcywgY29sbGFwc2VkSWRzLCBzZWxlY3RlZElkcywgdmlzaXRlZERhdGEpIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBGZWF0dXJlXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuXG4gICAgY29uc3QgcXVpY2sgPSB0aGlzLl9xdWlja0ZpbHRlclZhbHVlPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuXG4gICAgLy8gVGhlIGZpZWxkcyB0aGUgZ3JpZCBhY3R1YWxseSBzaG93cy4gV2l0aG91dCB0aGVtIHRoZSBxdWljayBmaWx0ZXIgZmFsbHNcbiAgICAvLyBiYWNrIHRvIGV2ZXJ5IHByb3BlcnR5IG9uIHRoZSByb3csIHdoaWNoIGxldHMgYSB1c2VyIG1hdGNoIG9uIGRhdGEgdGhhdFxuICAgIC8vIGhhcyBubyBjb2x1bW4gYW5kIG5ldmVyIGFwcGVhcnMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucXVpY2tGaWx0ZXJGaWVsZHMoKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBmaWx0ZXJUcmVlTm9kZShub2RlLCBmaWx0ZXJzLCBxdWljaywgZmllbGRzKSk7XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCBmaWVsZHMgdGhlIHF1aWNrIGZpbHRlciBzZWFyY2hlczogZXZlcnkgY29sdW1uIHRoYXQgaGFzIG9uZS5cbiAgICpcbiAgICogRW1wdHkgd2hpbGUgdGhlIGNvbHVtbnMgYXJlIHN0aWxsIGJlaW5nIHJlZ2lzdGVyZWQsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAqIGhlbHBlciBmYWxscyBiYWNrIHRvIHNlYXJjaGluZyB0aGUgcm93IOKAlCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgYmVmb3JlLCBhbmRcbiAgICogdGhlIG9ubHkgc2Vuc2libGUgYW5zd2VyIHdoZW4gdGhlIGdyaWQgZG9lcyBub3QgeWV0IGtub3cgaXRzIGNvbHVtbnMuXG4gICAqL1xuICBwcml2YXRlIHF1aWNrRmlsdGVyRmllbGRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2VcbiAgICAgIC5nZXRDb2x1bW5TdGF0ZSgpXG4gICAgICAuY29sdW1uc1xuICAgICAgLm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkIGFzIHN0cmluZylcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+ICEhZmllbGQgJiYgZmllbGQgIT09ICdfb25lUm93TnVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIFJvdyBOb2RlcyBEaXNwbGF5XG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hWaXNpYmxlTm9kZXMoZGlzcGF0Y2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB2aXNpYmxlTm9kZXM6IE9uZVJvd05vZGVbXSA9IFtdO1xuXG4gICAgbGV0IHJvd051bWJlciA9IDE7XG5cbiAgICBjb25zdCB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9yb3dOb2Rlcykge1xuXG4gICAgICBjb25zdCBwYXJlbnRWaXNpYmxlID0gbm9kZS5wYXJlbnQgPyB2aXNpYmlsaXR5Q2FjaGUuZ2V0KG5vZGUucGFyZW50LnJvd0lkKSA6IHRydWU7XG5cbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IG5vZGUudmlzaWJsZSAmJiBwYXJlbnRWaXNpYmxlICYmICghbm9kZS5wYXJlbnQgfHwgbm9kZS5wYXJlbnQuZXhwYW5kZWQpO1xuXG4gICAgICB2aXNpYmlsaXR5Q2FjaGUuc2V0KG5vZGUucm93SWQsIGlzVmlzaWJsZSk7XG5cbiAgICAgIGlmIChpc1Zpc2libGUpIHtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXNbJ19vbmVSb3dOdW1iZXInXSA9IHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogcm93TnVtYmVyKysgfTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHZpc2libGVOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlc1snX29uZVJvd051bWJlciddID0geyB0eXBlOiAnbm9uZScsIHZhbHVlOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gWy4uLnZpc2libGVOb2Rlc107XG5cbiAgICBpZiAoZGlzcGF0Y2gpIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Jvd0RhdGFDaGFuZ2VkJywgeyBub2RlczogdmlzaWJsZU5vZGVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHJvd3MgYW5jaG9yZWQgdG8gb25lIGVkZ2Ugb2YgdGhlIGdyaWQuXG4gICAqXG4gICAqIFBpbm5lZCByb3dzIGFyZSBkZWxpYmVyYXRlbHkga2VwdCBvdXQgb2YgYHJvd05vZGVzYCBhbmRcbiAgICogYF9vcmlnaW5hbFJvd05vZGVzYDogdGhleSBhcmUgbm90IGRhdGEuIFNvcnRpbmcsIGZpbHRlcmluZywgc2VsZWN0aW9uLFxuICAgKiBleHBhbnNpb24sIHBhZ2luYXRpb24gYW5kIHRoZSB2aXNpYmxlIHJvdyBjb3VudCBhbGwgaWdub3JlIHRoZW0sIHdoaWNoIGlzXG4gICAqIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN1bW1hcnkgcm93LiBUaGV5IHJlbmRlciB3aXRoIHRoZSBzYW1lIGNvbHVtblxuICAgKiBkZWZpbml0aW9ucywgc28gcmVuZGVyZXJzIGFuZCB2YWx1ZSBnZXR0ZXJzIHdvcmsgYXMgdGhleSBkbyBldmVyeXdoZXJlXG4gICAqIGVsc2UuXG4gICAqL1xuICBwdWJsaWMgc2V0UGlubmVkUm93RGF0YShzaWRlOiBPbmVQaW5uZWRSb3dTaWRlLCByb3dEYXRhOiBUW10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSkgbm9kZS5kZXN0cm95KCk7XG5cbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IChyb3dEYXRhID8/IFtdKS5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG5cbiAgICAgIC8vIElkcyBhcmUgbmFtZXNwYWNlZCBieSBzaWRlIGFuZCBwb3NpdGlvbi4gVGhleSBuZXZlciBjb2xsaWRlIHdpdGggYSBkYXRhXG4gICAgICAvLyByb3cncyBpZCwgYW5kIHRoZXkgYXJlIHN0YWJsZSBhY3Jvc3MgcmVidWlsZHMsIHdoaWNoIGtlZXBzIHRoZSByZW5kZXJlZFxuICAgICAgLy8gYGRhdGEtY2VsbC1pZGAgYXR0cmlidXRlcyBzdGFibGUgdG9vLlxuICAgICAgY29uc3Qgbm9kZSA9IG5ldyBPbmVSb3dOb2RlPFQ+KGBvbmUtcGlubmVkLSR7c2lkZX0tJHtpbmRleH1gLCBkYXRhLCBpbmRleCk7XG5cbiAgICAgIG5vZGUubGV2ZWwgPSAwO1xuICAgICAgbm9kZS5sZWFmID0gdHJ1ZTtcbiAgICAgIG5vZGUudmlzaWJsZSA9IHRydWU7XG4gICAgICBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Bpbm5lZFJvd0RhdGFDaGFuZ2VkJywge1xuICAgICAgc2lkZSxcbiAgICAgIG5vZGVzOiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgcm93cyBhbmNob3JlZCB0byBvbmUgZWRnZS4gUmVhZC1vbmx5OyBjaGFuZ2UgdGhlbSB3aXRoIGBzZXRQaW5uZWRSb3dEYXRhYC4gKi9cbiAgcHVibGljIGdldFBpbm5lZFJvd05vZGVzKHNpZGU6IE9uZVBpbm5lZFJvd1NpZGUpOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyByZW9yZGVyaW5nXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqXG4gICAqIGBfb3JpZ2luYWxSb3dOb2Rlc2AgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3Igcm93IG9yZGVyOiBpdHMgaW5zZXJ0aW9uXG4gICAqIG9yZGVyIGlzIHdoYXQgYGFwcGx5U29ydGluZ2AgZmFsbHMgYmFjayB0byB3aGVuIHRoZSBzb3J0IG1vZGVsIGVtcHRpZXMsIGFuZFxuICAgKiB3aGF0IGEgcmVidWlsZCB3YWxrcy4gYF9yb3dOb2Rlc2AgaXMgb25seSB0aGUgY3VycmVudCBkaXNwbGF5IG9yZGVyLiBBIG1vdmVcbiAgICogdGhhdCB0b3VjaGVkIG9uZSBhbmQgbm90IHRoZSBvdGhlciB3b3VsZCBlaXRoZXIgYmUgdW5kb25lIGJ5IHRoZSBuZXh0IHNvcnRcbiAgICogY2hhbmdlIG9yIGludmlzaWJsZSB1bnRpbCBvbmUgaGFwcGVuZWQsIHNvIGJvdGggYXJlIHJld3JpdHRlbiB0b2dldGhlci5cbiAgICovXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRpc3BsYXllZCBvcmRlciBpcyB0aGUgZGF0YSBvcmRlciwgYW5kIHNvIHdoZXRoZXIgYSBtYW51YWwgbW92ZVxuICAgKiB3b3VsZCBzdXJ2aXZlLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgcmVhc29uIHJlb3JkZXJpbmcgaXMgdW5hdmFpbGFibGUsIG9yIGBudWxsYCB3aGVuIGl0IGlzIGZpbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKTogT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfCBudWxsIHtcblxuICAgIGlmICh0aGlzLnRyZWVEYXRhKSByZXR1cm4gJ3RyZWVEYXRhJztcblxuICAgIGlmICh0aGlzLl9zb3J0TW9kZWwubGVuZ3RoID4gMCkgcmV0dXJuICdzb3J0ZWQnO1xuXG4gICAgaWYgKGlzRmlsdGVyQWN0aXZlKHRoaXMuX2FjdGl2ZUZpbHRlcnMsIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPz8gJycpKSByZXR1cm4gJ2ZpbHRlcmVkJztcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIENvbnZlbmllbmNlIGludmVyc2Ugb2Yge0BsaW5rIGdldFJvd0RyYWdTdXBwcmVzc2VkUmVhc29ufS4gKi9cbiAgcHVibGljIGNhblJlb3JkZXJSb3dzKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKSA9PT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGZyb20gb25lIHBvc2l0aW9uIHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEluZGljZXMgYXJlIHBvc2l0aW9ucyBpbiB0aGUgZ3JpZCdzIHJvdyBvcmRlciwgdGhlIHNhbWUgb3JkZXJcbiAgICogYGdldEFsbFJvd05vZGVzKClgIHJldHVybnMuIGB0YXJnZXRJbmRleGAgaXMgd2hlcmUgdGhlIHJvdyBlbmRzIHVwICphZnRlcipcbiAgICogaXQgaGFzIGJlZW4gbGlmdGVkIG91dCBvZiBgc291cmNlSW5kZXhgIOKAlCBkcmFnZ2luZyByb3cgMCB0byB0aGUgYm90dG9tIG9mIGFcbiAgICogNS1yb3cgZ3JpZCBpcyBgbW92ZVJvdygwLCA0KWAsIG5vdCBgbW92ZVJvdygwLCA1KWAuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcm93cyBtb3ZlZC4gYGZhbHNlYCB3aGVuIHRoZSBtb3ZlIHdhcyByZWplY3RlZCDigJRcbiAgICogICAgICAgICAgb3V0LW9mLXJhbmdlIGluZGljZXMsIGEgbm8tb3AsIG9yIGFuIG9yZGVyIHRoZSBncmlkIGRvZXMgbm90IG93blxuICAgKiAgICAgICAgICAoc2VlIHtAbGluayBnZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbn0pIOKAlCBzbyBhIGNhbGxlciBjYW4gdGVsbCBhXG4gICAqICAgICAgICAgIHJlZnVzZWQgbW92ZSBmcm9tIGFuIGFwcGxpZWQgb25lLlxuICAgKi9cbiAgcHVibGljIG1vdmVSb3coc291cmNlSW5kZXg6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmNhblJlb3JkZXJSb3dzKCkpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG9yZGVyID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZUluZGV4KSB8fCAhTnVtYmVyLmlzSW50ZWdlcih0YXJnZXRJbmRleCkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChzb3VyY2VJbmRleCA8IDAgfHwgc291cmNlSW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IG9yZGVyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgW21vdmVkXSA9IG9yZGVyLnNwbGljZShzb3VyY2VJbmRleCwgMSk7XG5cbiAgICBvcmRlci5zcGxpY2UodGFyZ2V0SW5kZXgsIDAsIG1vdmVkKTtcblxuICAgIC8vIFJlYnVpbHQgcmF0aGVyIHRoYW4gbXV0YXRlZDogYSBNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciwgYW5kIHRoZXJlXG4gICAgLy8gaXMgbm8gd2F5IHRvIHJlcG9zaXRpb24gYSBrZXkgd2l0aGluIG9uZS5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzID0gbmV3IE1hcChvcmRlci5tYXAobm9kZSA9PiBbbm9kZS5yb3dJZCwgbm9kZV0pKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gb3JkZXI7XG5cbiAgICB0aGlzLnJlaW5kZXhSb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdyb3dPcmRlckNoYW5nZWQnLCB7IG5vZGVzOiB0aGlzLl92aXNpYmxlUm93Tm9kZXMgYXMgT25lUm93Tm9kZTxUPltdLCBub2RlOiBtb3ZlZCwgZnJvbUluZGV4OiBzb3VyY2VJbmRleCwgdG9JbmRleDogdGFyZ2V0SW5kZXggfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGlkZW50aWZpZWQgYnkgaWQuIENvbnZlbmllbnQgd2hlbiB0aGUgY2FsbGVyIGhvbGRzIGEgbm9kZSByYXRoZXJcbiAgICogdGhhbiBhIHBvc2l0aW9uIOKAlCB0aGUgaW5kZXggaXQgd2FzIGJ1aWx0IHdpdGggZ29lcyBzdGFsZSBhZnRlciBhbnkgbW92ZS5cbiAgICovXG4gIHB1YmxpYyBtb3ZlUm93QnlJZChyb3dJZDogc3RyaW5nLCB0YXJnZXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cbiAgICBjb25zdCBzb3VyY2VJbmRleCA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSByb3dJZCk7XG5cbiAgICByZXR1cm4gc291cmNlSW5kZXggPT09IC0xID8gZmFsc2UgOiB0aGlzLm1vdmVSb3coc291cmNlSW5kZXgsIHRhcmdldEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zdGFtcCBgcm93SW5kZXhgIGZyb20gdGhlIGN1cnJlbnQgb3JkZXIuXG4gICAqXG4gICAqIFJvdyBpbmRleCBpcyBkZW5vcm1hbGlzZWQgb250byBldmVyeSBub2RlLCBhbmQgaGFsZiB0aGUgZ3JpZCByZWFkcyBpdCDigJRcbiAgICogY2VsbCBwYXJhbXMsIHRoZSByYW5nZSBzZWxlY3Rpb24sIHRoZSBkZXRhaWwgbG9va3VwLiBMZWF2aW5nIGl0IHN0YWxlIGFmdGVyXG4gICAqIGEgbW92ZSBwdXRzIGV2ZXJ5IHJvdyBiZWxvdyB0aGUgZHJvcCBwb2ludCBvbmUgb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWluZGV4Um93cygpOiB2b2lkIHtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiBub2RlLnNldFJvd0luZGV4KGluZGV4KSk7XG5cbiAgICAvLyBTaWxlbnQ6IHJvdyBudW1iZXJzIGFuZCB0aGUgdmlzaWJsZSBsaXN0IGhhdmUgdG8gYmUgcmVidWlsdCwgYnV0IHRoZVxuICAgIC8vIGByb3dEYXRhQ2hhbmdlZGAgdGhhdCBub3JtYWxseSBmb2xsb3dzIGRlZmVycyBhIGZyYW1lIGFuZCByZS1zZWVkcyBkZXRhaWxcbiAgICAvLyByb3dzLiBBIGtleWJvYXJkIGRyYWcgZmlyZXMgb25lIG9mIHRoZXNlIHBlciBhcnJvdyBrZXksIGFuZCBgbW92ZVJvd2BcbiAgICAvLyBhbm5vdW5jZXMgaXRzZWxmIHRocm91Z2ggYHJvd09yZGVyQ2hhbmdlZGAgaW5zdGVhZC5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldFZpc2libGVSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVSb3dOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0aW5nIE1vZGVsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBvblNvcnRDaGFuZ2VkKHNvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10pIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3NvcnRNb2RlbCA9IHNvcnRNb2RlbDtcblxuICAgIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzb3J0Q2hhbmdlZCcsIHsgbm9kZXM6IHRoaXMuX3Jvd05vZGVzLCBzb3J0TW9kZWw6IHRoaXMuX3NvcnRNb2RlbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTb3J0aW5nKCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPT09IDApIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV07XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJhdG9yID0gKGE6IE9uZVJvd05vZGU8VD4sIGI6IE9uZVJvd05vZGU8VD4pOiBudW1iZXIgPT4ge1xuXG4gICAgICBmb3IgKGNvbnN0IHNvcnRJdGVtIG9mIHRoaXMuX3NvcnRNb2RlbCkge1xuXG4gICAgICAgIGNvbnN0IHsgY29sSWQsIHNvcnQgfSA9IHNvcnRJdGVtO1xuICAgICAgICBjb25zdCB2YWxBID0gZ2V0RmllbGRWYWx1ZShhLmRhdGEsIGNvbElkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IHZhbEIgPSBnZXRGaWVsZFZhbHVlKGIuZGF0YSwgY29sSWQgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgY29tcGFyaXNvblJlc3VsdCA9IHRoaXMuY29tcGFyZVZhbHVlcyh2YWxBLCB2YWxCLCBzb3J0KTtcblxuICAgICAgICBpZiAoY29tcGFyaXNvblJlc3VsdCAhPT0gMCkge1xuXG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25SZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMudHJlZURhdGEpIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV0uc29ydChjb21wYXJhdG9yKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdHJlZSBzb3J0cyBzaWJsaW5ncyB3aXRoaW4gdGhlaXIgcGFyZW50LCBuZXZlciBhY3Jvc3MgaXQg4oCUIGEgZmxhdFxuICAgIC8vIHNvcnQgb2YgdGhlIHdob2xlIGxpc3QgaW50ZXJsZWF2ZWQgcGFyZW50cyB3aXRoIG90aGVyIHBhcmVudHMnIGNoaWxkcmVuXG4gICAgLy8gYW5kIHNjcmFtYmxlZCB0aGUgaGllcmFyY2h5LiBTb3J0aW5nIHRoZSBzaWJsaW5nIGFycmF5cyBhbmQgcmUtd2Fsa2luZ1xuICAgIC8vIGRlcHRoLWZpcnN0IGtlZXBzIGV2ZXJ5IHBhcmVudCBpbW1lZGlhdGVseSBhYm92ZSBpdHMgb3duIGNoaWxkcmVuLFxuICAgIC8vIHdoaWNoIGByZWZyZXNoVmlzaWJsZU5vZGVzYCBhbHNvIGRlcGVuZHMgb24gZm9yIGl0cyB2aXNpYmlsaXR5IGNhY2hlLlxuICAgIC8vIEdyb3VwIHJvd3MgY2FycnkgdGhlaXIgYWdncmVnYXRlcyBpbiBgZGF0YWAsIHNvIHNvcnRpbmcgYSBncm91cGVkIGdyaWRcbiAgICAvLyBvbiBhbiBhZ2dyZWdhdGVkIGNvbHVtbiBvcmRlcnMgdGhlIGdyb3VwcyBieSB0aGVpciBhZ2dyZWdhdGUuXG4gICAgY29uc3QgZmxhdHRlbmVkOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcblxuICAgIGNvbnN0IHdhbGsgPSAoc2libGluZ3M6IE9uZVJvd05vZGU8VD5bXSk6IE9uZVJvd05vZGU8VD5bXSA9PiB7XG5cbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5zaWJsaW5nc10uc29ydChjb21wYXJhdG9yKTtcblxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHNvcnRlZCkge1xuXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcblxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSB3YWxrKG5vZGUuY2hpbGRyZW4gYXMgT25lUm93Tm9kZTxUPltdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc29ydGVkO1xuICAgIH07XG5cbiAgICB3YWxrKFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maWx0ZXIobm9kZSA9PiAhbm9kZS5wYXJlbnQpKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gZmxhdHRlbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKHZhbEE6IGFueSwgdmFsQjogYW55LCBzb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyk6IG51bWJlciB7XG5cbiAgICAvLyBgdW5kZWZpbmVkYCBoYXMgdG8gYmUgdHJlYXRlZCBhcyBlbXB0eSBhbG9uZ3NpZGUgYG51bGxgOiBnZXRGaWVsZFZhbHVlXG4gICAgLy8gcmV0dXJucyB1bmRlZmluZWQgZm9yIGEgbWlzc2luZyBmaWVsZCBvciBhbiB1bnJlc29sdmVkIGRvdHRlZCBwYXRoLCBhbmRcbiAgICAvLyBjb21wYXJpbmcgdW5kZWZpbmVkIHdpdGggPCAvID4geWllbGRzIGZhbHNlIGJvdGggd2F5cywgd2hpY2ggbWFkZSBzdWNoXG4gICAgLy8gcm93cyBzZXR0bGUgaW4gd2hhdGV2ZXIgb3JkZXIgdGhlIHNvcnQgaGFwcGVuZWQgdG8gZW5jb3VudGVyIHRoZW0uXG4gICAgY29uc3QgYUVtcHR5ID0gdmFsQSA9PT0gbnVsbCB8fCB2YWxBID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgYkVtcHR5ID0gdmFsQiA9PT0gbnVsbCB8fCB2YWxCID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYUVtcHR5ICYmIGJFbXB0eSkgcmV0dXJuIDA7XG4gICAgaWYgKGFFbXB0eSkgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIGlmIChiRW1wdHkpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcblxuICAgIGlmICh0eXBlb2YgdmFsQSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbEIgPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSB2YWxBLmxvY2FsZUNvbXBhcmUodmFsQiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyBjb21wYXJpc29uIDogLWNvbXBhcmlzb247XG4gICAgfVxuXG4gICAgaWYgKHZhbEEgPCB2YWxCKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XG4gICAgaWYgKHZhbEEgPiB2YWxCKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogUm93IFNlbGVjdGlvbiBGZWF0dXJlIChPcHRpbWl6ZWQpXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuXG4gICAgY29uc3Qgcm93SWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHRydWUpO1xuXG4gICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICByb3dJZHMucHVzaChub2RlLnJvd0lkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGwocm93SWRzKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IGFsbE5vZGVzTm90U2VsZWN0ZWQ6IGZhbHNlLCBhbGxOb2Rlc1NlbGVjdGVkOiB0cnVlLCBzZWxlY3RlZDogdHJ1ZSwgbm9kZTogbnVsbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdCBhbGwgbm9kZXMgKG9wdGltaXplZClcbiAgICovXG4gIHB1YmxpYyBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcblxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZChmYWxzZSk7XG5cbiAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RBbGwoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnKSB7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7XG4gICAgICAgIGFsbE5vZGVzTm90U2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIGFsbE5vZGVzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIG5vZGU6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Qgb3IgZGVzZWxlY3Qgb25lIHJvdywgaG9ub3VyaW5nIHRoZSBncmlkJ3Mgc2VsZWN0aW9uIG1vZGUuXG4gICAqXG4gICAqIFRoZSBtb2RlIHJ1bGUgdXNlZCB0byBsaXZlIGluIHRoZSBjaGVja2JveCBjb21wb25lbnQsIHdoaWNoIG1lYW50IHRoZSBvbmx5XG4gICAqIHdheSB0byBzZWxlY3QgYSByb3cgd2FzIHRvIGNsaWNrIHRoYXQgY2hlY2tib3gg4oCUIGFueXRoaW5nIGVsc2UgcmVhY2hpbmcgZm9yXG4gICAqIGB0b2dnbGVTZWxlY3Rpb25gIGdvdCBtdWx0aS1zZWxlY3QgYmVoYXZpb3VyIG9uIGEgc2luZ2xlLXNlbGVjdCBncmlkLiBJdFxuICAgKiBsaXZlcyBoZXJlIHNvIGV2ZXJ5IHBhdGggaW50byBzZWxlY3Rpb24gb2JleXMgdGhlIHNhbWUgcnVsZS5cbiAgICpcbiAgICogQHJldHVybnMgYGZhbHNlYCB3aGVuIHRoZSBncmlkIGhhcyBubyBzZWxlY3Rpb24gbW9kZSwgc28gYSBjYWxsZXIgY2FuIHRlbGxcbiAgICogICAgICAgICAgYSByZWZ1c2VkIHJlcXVlc3QgZnJvbSBhbiBhcHBsaWVkIG9uZS5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dTZWxlY3Rpb24ocm93SWQ6IHN0cmluZywgc2VsZWN0ZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgIXRoaXMuX3Jvd1NlbGVjdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBTaW5nbGUgc2VsZWN0IGlzIFwidGhpcyByb3cgYW5kIG5vIG90aGVyXCIsIHdoaWNoIG1lYW5zIGNsZWFyaW5nIGZpcnN0LlxuICAgIGlmICh0aGlzLl9yb3dTZWxlY3Rpb24gPT09ICdzaW5nbGUnKSB0aGlzLmRlc2VsZWN0QWxsKCk7XG5cbiAgICB0aGlzLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBldmVyeSByb3cgYmV0d2VlbiB0d28sIGluY2x1c2l2ZSwgaW4gZGlzcGxheSBvcmRlci5cbiAgICpcbiAgICogV2hhdCBhIHNoaWZ0LWV4dGVuZGVkIGtleWJvYXJkIHNlbGVjdGlvbiBuZWVkcy4gTXVsdGktc2VsZWN0IG9ubHkg4oCUIGFcbiAgICogc2luZ2xlLXNlbGVjdCBncmlkIGhhcyBubyBtZWFuaW5nZnVsIHJhbmdlLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdFJvd1JhbmdlKGZyb21Sb3dJZDogc3RyaW5nLCB0b1Jvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgdGhpcy5fcm93U2VsZWN0aW9uICE9PSAnbXVsdGlwbGUnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBvcmRlciA9IHRoaXMuX3Zpc2libGVSb3dOb2Rlcy5sZW5ndGggPyB0aGlzLl92aXNpYmxlUm93Tm9kZXMgOiB0aGlzLl9yb3dOb2RlcztcblxuICAgIGNvbnN0IGZyb20gPSBvcmRlci5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSBmcm9tUm93SWQpO1xuICAgIGNvbnN0IHRvID0gb3JkZXIuZmluZEluZGV4KG5vZGUgPT4gbm9kZS5yb3dJZCA9PT0gdG9Sb3dJZCk7XG5cbiAgICBpZiAoZnJvbSA9PT0gLTEgfHwgdG8gPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBpZHMgPSBvcmRlclxuICAgICAgLnNsaWNlKE1hdGgubWluKGZyb20sIHRvKSwgTWF0aC5tYXgoZnJvbSwgdG8pICsgMSlcbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRCeUlkcyhpZHMsIHRydWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSkge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIHNlbGVjdGVkIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZEJ5SWQocm93SWQ6IHN0cmluZykge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb25Nb2RlKCkgPT09ICdzaW5nbGUnKSB7XG5cbiAgICAgICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHRydWUpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBzZWxlY3RlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWRCeUlkcyhyb3dJZHM6IHN0cmluZ1tdLCBzZWxlY3RlZDogYm9vbGVhbiA9IHRydWUpIHtcblxuICAgIHJvd0lkcy5mb3JFYWNoKHJvd0lkID0+IHtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgaWYgKG5vZGUpIHtcblxuICAgICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICYgU2V0IEZ1bmN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldEFsbFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM/Lmxlbmd0aCA+IDAgPyBbLi4udGhpcy5fcm93Tm9kZXNdIDogW107XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93RGF0YVNlbGVjdGVkKCk6IFRbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXMuZmlsdGVyKG5vZGUgPT4gbm9kZS5zZWxlY3RlZCkubWFwKG5vZGUgPT4gKHsgLi4ubm9kZS5kYXRhIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUuc2VsZWN0ZWQpO1xuXG4gICAgcmV0dXJuIG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+IDAgPyBbLi4ubm9kZXNdIDogW107XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1uIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJNb2RlbCgpOiBPbmVGaWx0ZXJNb2RlbFtdIHtcblxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldEZpbHRlck1vZGVsKG1vZGVsOiBPbmVGaWx0ZXJNb2RlbFtdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gbW9kZWw7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgcHVibGljIGZpbHRlckFjdGl2ZShmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVycy5zb21lKGYgPT4gZi5maWVsZCA9PT0gZmllbGQgJiYgZi5jb25kaXRpb25zLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aWNrIGZpbHRlclxuICAgKi9cbiAgcHVibGljIHNldFF1aWNrRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSAodmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgY29sdW1uIHZhbGlkYXRvcnMgb3ZlciBvbmUgcm93LlxuICAgKlxuICAgKiBSdWxlcyBydW4gaW4gb3JkZXIgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IGZhaWx1cmUsIHNvIGEgZmllbGQgYXBwZWFycyBhdFxuICAgKiBtb3N0IG9uY2UuIEZpZWxkcyB0aGF0IHBhc3NlZCBhcmUgYWJzZW50IHJhdGhlciB0aGFuIG1hcHBlZCB0byBgbnVsbGAuXG4gICAqXG4gICAqIFRoZSByb3cgdHlwZSBjb21lcyBmcm9tIHRoZSBncmlkJ3Mgb3duIGBUYCDigJQgdGhpcyB1c2VkIHRvIGRlY2xhcmUgaXRzIG93blxuICAgKiBgPFQ+YCwgd2hpY2ggc2hhZG93ZWQgdGhlIGNsYXNzIHBhcmFtZXRlciBhbmQgbGV0IGFuIGBPbmVHcmlkQXBpPEVtcGxveWVlPmBcbiAgICogaGFwcGlseSB2YWxpZGF0ZSBhbiB1bnJlbGF0ZWQgc2hhcGUgYWdhaW5zdCBlbXBsb3llZSBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlUm93KHJvdzogVCwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzPFQ+IHtcblxuICAgIGNvbnN0IGVycm9yczogT25lUm93VmFsaWRhdGlvbkVycm9yczxUPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXG4gICAgICAvLyBBIGNvbHVtbiBjYW4gb25seSBjb250cmlidXRlIGFuIGVycm9yIGlmIGl0IGhhcyBib3RoIHJ1bGVzIGFuZCBhIGZpZWxkXG4gICAgICAvLyB0byBrZXkgdGhlbSB1bmRlci5cbiAgICAgIGlmICghY29sdW1uLmZpZWxkIHx8ICFjb2x1bW4udmFsaWRhdGlvblJ1bGVzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY29sdW1uLnZhbGlkYXRpb25SdWxlcykge1xuXG4gICAgICAgIGNvbnN0IGVycm9yID0gcnVsZShyb3dbY29sdW1uLmZpZWxkXSwgcm93KTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcblxuICAgICAgICAgIGVycm9yc1tjb2x1bW4uZmllbGRdID0gZXJyb3I7XG5cbiAgICAgICAgICBicmVhazsgLy8gZmlyc3QgZmFpbHVyZSBwZXIgY29sdW1uIHdpbnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBjb2x1bW4gdmFsaWRhdG9ycyBvdmVyIGEgd2hvbGUgZGF0YXNldC5cbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIGB2YWxpZGF0ZVJvd2Agc28gdGhlIHR3byBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hhdCBjb3VudHNcbiAgICogYXMgaW52YWxpZCDigJQgdGhleSBwcmV2aW91c2x5IGNhcnJpZWQgc2VwYXJhdGUgY29waWVzIG9mIHRoZSBzYW1lIGxvb3AuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVBbGxSb3dzKHJvd0RhdGE6IFRbXSwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVWYWxpZGF0aW9uUmVzdWx0PFQ+IHtcblxuICAgIGNvbnN0IGFsbEVycm9ycyA9IHJvd0RhdGEubWFwKHJvdyA9PiB0aGlzLnZhbGlkYXRlUm93KHJvdywgY29sdW1ucykpO1xuXG4gICAgY29uc3QgaGFzRXJyb3JzID0gYWxsRXJyb3JzLnNvbWUoZXJyb3JzID0+IE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4geyBlcnJvcnM6IGFsbEVycm9ycywgdmFsaWQ6ICFoYXNFcnJvcnMsIGludmFsaWQ6IGhhc0Vycm9ycyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlIGV2ZXJ5IG5vZGUsIGRlcHRoLWZpcnN0LCBvbmNlIGVhY2guXG4gICAqXG4gICAqIGByb3dOb2Rlc2AgaXMgYWxyZWFkeSB0aGUgZmxhdHRlbmVkIHRyZWUg4oCUIGBidWlsZFJvd05vZGVzYCBwdXNoZXMgZXZlcnlcbiAgICogbm9kZSBpbnRvIGl0IGFzIGl0IGRlc2NlbmRzIOKAlCBzbyB3YWxraW5nIGl0IGlzIHRoZSB3aG9sZSB0cmF2ZXJzYWwuIFRoZVxuICAgKiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB3YWxrZWQgdGhhdCBmbGF0IGxpc3QgKmFuZCogcmVjdXJzZWQgaW50b1xuICAgKiBgY2hpbGRyZW5gLCB2aXNpdGluZyBldmVyeSBuZXN0ZWQgbm9kZSB0d2ljZSBhbmQgZXZlcnkgZGVwdGgtMyBub2RlIHRocmVlXG4gICAqIHRpbWVzLiBgaW5kZXhgIGlzIHRoZSBub2RlJ3MgcG9zaXRpb24gaW4gdGhlIGZsYXR0ZW5lZCBvcmRlciwgbWF0Y2hpbmdcbiAgICogYG5vZGUucm93SW5kZXhgLCByYXRoZXIgdGhhbiBpdHMgcG9zaXRpb24gYW1vbmcgaXRzIHNpYmxpbmdzLlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hOb2RlKGNhbGxiYWNrOiAobm9kZTogT25lUm93Tm9kZTxUPiwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCkge1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IGNhbGxiYWNrKG5vZGUsIGluZGV4KSk7XG4gIH1cblxuICAvKiogVHJhdmVyc2Ugb25seSBsZWFmIG5vZGVzLCBvbmNlIGVhY2gsIGluIGZsYXR0ZW5lZCBvcmRlci4gKi9cbiAgcHVibGljIGZvckVhY2hMZWFmTm9kZShjYWxsYmFjazogKG5vZGU6IE9uZVJvd05vZGU8VD4sIGluZGV4OiBudW1iZXIpID0+IHZvaWQpIHtcblxuICAgIGxldCBsZWFmSW5kZXggPSAwO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Jvd05vZGVzKSB7XG5cbiAgICAgIGlmIChub2RlLmxlYWYpIGNhbGxiYWNrKG5vZGUsIGxlYWZJbmRleCsrKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93Tm9kZUJ5SWQocm93SWQ6IHN0cmluZyk6IE9uZVJvd05vZGU8VD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQvY29sbGFwc2UgYSBub2RlXG4gICAqL1xuICBwdWJsaWMgc2V0VHJlZURhdGFDaGlsZHJlbkZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gZmllbGQ7XG4gIH1cblxuICBwdWJsaWMgc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQoZGVmYXVsdEV4cGFuZGVkOiBudW1iZXIpIHtcblxuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSBkZWZhdWx0RXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5zaW9uIHN0YXRlIGxpdmVzIGluIHR3byBwbGFjZXMsIGFuZCB0aGV5IGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zLlxuICAgKlxuICAgKiBgT25lR3JpZEV4cGFuc2lvblNlcnZpY2VgIHJlY29yZHMgb25seSAqZGVsaWJlcmF0ZSogY2hhbmdlcyDigJQgYSBjbGljaywgb3JcbiAgICogb25lIG9mIHRoZSBtZXRob2RzIGJlbG93LiBJdCBpcyBhbiBvdmVycmlkZSBsYXllcjogYGJ1aWxkUm93Tm9kZXNgIGNvbnN1bHRzXG4gICAqIGl0IGZpcnN0IGFuZCBmYWxscyBiYWNrIHRvIGBncm91cERlZmF1bHRFeHBhbmRlZGAgZm9yIGV2ZXJ5IHJvdyB0aGUgdXNlclxuICAgKiBoYXMgbm90IHRvdWNoZWQuIFRoYXQgaXMgd2hhdCBsZXRzIGEgbGF0ZXIgYGdyb3VwRGVmYXVsdEV4cGFuZGVkYCBjaGFuZ2VcbiAgICogdGFrZSBlZmZlY3QsIGFuZCB3aGF0IGxldHMgYSBjb2xsYXBzZSBzdXJ2aXZlIGEgcmVidWlsZC5cbiAgICpcbiAgICogYG5vZGUuZXhwYW5kZWRgIGlzIHRoZSByZXNvbHZlZCB0cnV0aCBmb3IgYSByb3csIGRlZmF1bHRzIGluY2x1ZGVkLiBQdWJsaWNcbiAgICogcmVhZHMgcmVwb3J0IHRoYXQ7IHRoZSBvdmVycmlkZSBzZXRzIHN0YXkgaW50ZXJuYWwuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdGhlIHNldHRlcnMgYmVsb3cgbWFpbnRhaW46IGBleHBhbmRlZGAgaXMgb25seSBldmVyIHRydWUgZm9yXG4gICAqIGEgbm9kZSB0aGF0IGNhbiBleHBhbmQuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlRXhwYW5kQWxsKGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICB0aGlzLmZvckVhY2hOb2RlKG5vZGUgPT4ge1xuXG4gICAgICBpZiAoIW5vZGUuZXhwYW5kYWJsZSkgcmV0dXJuO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTtcblxuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKG5vZGUucm93SWQsIGV4cGFuZGVkKVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhwYW5kZWRCeUlkKHJvd0lkOiBzdHJpbmcsIGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgaWYgKG5vZGU/LmV4cGFuZGFibGUpIHtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChyb3dJZCwgZXhwYW5kZWQpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgcHVibGljIHNldEV4cGFuZGVkQnlJZHMocm93SWRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcblxuICAgIGlmIChyb3dJZHMgJiYgcm93SWRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgZm9yIChsZXQgcm93SWQgb2Ygcm93SWRzKSB7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgICBpZiAobm9kZT8uZXhwYW5kYWJsZSkge1xuXG4gICAgICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQocm93SWQsIGV4cGFuZGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgY3VycmVudGx5IGV4cGFuZGVkIHJvdywgaW4gdHJlZSBvcmRlci5cbiAgICpcbiAgICogRGVyaXZlZCBmcm9tIHRoZSBub2RlcyByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgb3ZlcnJpZGUgcmVjb3JkLCBzbyByb3dzXG4gICAqIG9wZW5lZCBieSBgZ3JvdXBEZWZhdWx0RXhwYW5kZWRgIGFyZSBpbmNsdWRlZCDigJQgcHJldmlvdXNseSB0aGlzIHJldHVybmVkXG4gICAqIG9ubHkgcm93cyBzb21lb25lIGhhZCBleHBsaWNpdGx5IHRvZ2dsZWQsIGFuZCBjYW1lIGJhY2sgZW1wdHkgb24gZmlyc3QgbG9hZFxuICAgKiB3aGlsZSB0aGUgZmlyc3QgbGV2ZWwgd2FzIHZpc2libHkgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBhbmRlZEJ5SWRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLl9yb3dOb2Rlc1xuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS5leHBhbmRhYmxlICYmIG5vZGUuZXhwYW5kZWQpXG5cbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBzZXREZXRhaWxSb3dEYXRhKG5vZGU6IE9uZVJvd05vZGU8VD4sIGRldGFpbERhdGE6IGFueVtdKSB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0R2V0RGV0YWlsUm93RGF0YShnZXREZXRhaWxSb3dEYXRhOiAocGFyYW1zOiBPbmVHZXREZXRhaWxSb3dEYXRhUGFyYW1zKSA9PiB2b2lkKSB7XG5cbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gZ2V0RGV0YWlsUm93RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW5zIFN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2Uuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5TdGF0ZS5jb2x1bW5zLCB0aGlzLl9jb250ZXh0KTtcblxuICAgIC8vIENlbGwgc3RhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb2x1bW5zLCBzbyByZXBsYWNpbmcgdGhlbSB3aG9sZXNhbGVcbiAgICAvLyBzdGFsZXMgZXZlcnkgbm9kZSBidWlsdCBiZWZvcmUgdGhpcyByYW4uIFRyZWUgYW5kIGdyb3VwaW5nIG1vZGUgaGl0XG4gICAgLy8gdGhpcyBvbiBldmVyeSBsb2FkOiB0aGUgZ3JvdXAgY29sdW1uIHJlZ2lzdGVycyBmcm9tIGEgZGVmZXJyZWRcbiAgICAvLyBzZXRDb2x1bW5EZWZzLCBhZnRlciB0aGUgaG9zdCBoYXMgdHlwaWNhbGx5IGFscmVhZHkgbG9hZGVkIHJvd3Mg4oCUXG4gICAgLy8gaG9zdHMgdXNlZCB0byBoYXZlIHRvIGRlZmVyIHNldFJvd0RhdGEgdGhlbXNlbHZlcyB0byBkb2RnZSBpdC5cbiAgICB0aGlzLnJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbihpZDogc3RyaW5nLCBjaGFuZ2VzOiBQYXJ0aWFsPE9uZUNvbHVtbkRlZjxUPj4pOiB2b2lkIHtcblxuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMudmlzaWJsZUNvbHVtbkZpZWxkcygpO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnVwZGF0ZUNvbHVtbkRlZihpZCwgY2hhbmdlcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBPbmx5IHdoZW4gdGhlIHNldCBvZiB2aXNpYmxlIGNvbHVtbnMgY2hhbmdlZCAoYSBoaWRlLCBhIHNob3cpOiBhIGNlbGxcbiAgICAvLyBzdGF0ZSBjYW4gYXBwZWFyIG9yIGRpc2FwcGVhciB0aGVuLiBXaWR0aCBwYXRjaGVzIOKAlCB0aGlzIG1ldGhvZCBydW5zXG4gICAgLy8gcGVyIG1vdXNlbW92ZSBkdXJpbmcgYSByZXNpemUg4oCUIHNraXAgdGhlIE8ocm93cyDDlyBjb2x1bW5zKSBwYXNzLlxuICAgIGlmICh0aGlzLnZpc2libGVDb2x1bW5GaWVsZHMoKSAhPT0gYmVmb3JlKSB0aGlzLnJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXNpYmxlIGZpZWxkcyBhcyBvbmUgY29tcGFyYWJsZSBrZXkuICovXG4gIHByaXZhdGUgdmlzaWJsZUNvbHVtbkZpZWxkcygpOiBzdHJpbmcge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnM/Lm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkKS5qb2luKCd8JykgPz8gJyc7XG4gIH1cblxuICAvKiogUmVjb21wdXRlIGV2ZXJ5IG5vZGUncyBjZWxsIHN0YXRlcyBhZ2FpbnN0IHRoZSBjdXJyZW50IGNvbHVtbnMuICovXG4gIHByaXZhdGUgcmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTogdm9pZCB7XG5cbiAgICBjb25zdCByZWZyZXNoID0gKG5vZGU6IE9uZVJvd05vZGUpID0+IG5vZGUuc2V0Q2VsbFN0YXRlcyh0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlKSk7XG5cbiAgICB0aGlzLl9yb3dOb2Rlcy5mb3JFYWNoKHJlZnJlc2gpO1xuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzLnRvcC5mb3JFYWNoKHJlZnJlc2gpO1xuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzLmJvdHRvbS5mb3JFYWNoKHJlZnJlc2gpO1xuICB9XG5cbiAgcHVibGljIHJlb3JkZXJDb2x1bW5EZWZzKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5yZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUm93IGdyb3VwaW5nXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgX3Jvd0dyb3VwRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9hZ2dDb2x1bW5zOiBPbmVBZ2dDb2x1bW48VD5bXSA9IFtdO1xuXG4gIC8qKiBUaGUgZmllbGRzIHRoZSByb3dzIGFyZSBncm91cGVkIGJ5LCBpbiBuZXN0aW5nIG9yZGVyLiBFbXB0eSB3aGVuIG9mZi4gKi9cbiAgcHVibGljIGdldCByb3dHcm91cEZpZWxkcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93R3JvdXBGaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogVHVybiByb3cgZ3JvdXBpbmcgb24uIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudGAgd2hlbiBjb2x1bW5cbiAgICogZGVmaW5pdGlvbnMgZGVjbGFyZSBgcm93R3JvdXBgOyB0aGUgZ3JpZCB0aGVuIGJlaGF2ZXMgYXMgYSB0cmVlIG92ZXJcbiAgICogc3ludGhldGljIGdyb3VwIHJvd3MsIGFuZCBgc2V0Um93RGF0YWAgLyBgdXBkYXRlUm93RGF0YWAga2VlcCB0YWtpbmcgdGhlXG4gICAqIGZsYXQgcm93cyB0aGV5IGFsd2F5cyB0b29rLlxuICAgKi9cbiAgcHVibGljIHNldFJvd0dyb3VwaW5nKGdyb3VwRmllbGRzOiBzdHJpbmdbXSwgYWdncmVnYXRpb25zOiBPbmVBZ2dDb2x1bW48VD5bXSA9IFtdKTogdm9pZCB7XG5cbiAgICB0aGlzLl9yb3dHcm91cEZpZWxkcyA9IGdyb3VwRmllbGRzID8/IFtdO1xuICAgIHRoaXMuX2FnZ0NvbHVtbnMgPSBhZ2dyZWdhdGlvbnMgPz8gW107XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVW5kbyAvIHJlZG8gb2YgY2VsbCBlZGl0c1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF91bmRvTGltaXQgPSAwO1xuICBwcml2YXRlIF91bmRvU3RhY2s6IHsgcm93SWQ6IHN0cmluZzsgZmllbGQ6IHN0cmluZzsgb2xkVmFsdWU6IGFueTsgbmV3VmFsdWU6IGFueSB9W10gPSBbXTtcbiAgcHJpdmF0ZSBfcmVkb1N0YWNrOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHJlY29yZGluZyBjb21taXR0ZWQgY2VsbCBlZGl0cyBmb3IgdW5kby9yZWRvLiBDYWxsZWQgYnlcbiAgICogYE9uZUdyaWRDb21wb25lbnRgIGZyb20gYFt1bmRvUmVkb0NlbGxFZGl0aW5nXWA7IHRoZSBzdGFjayBrZWVwcyB0aGUgbGFzdFxuICAgKiBgbGltaXRgIGVkaXRzLiBQcm9ncmFtbWF0aWMgYHNldERhdGFWYWx1ZWAgd3JpdGVzIGFyZSBub3QgcmVjb3JkZWQg4oCUIG9ubHlcbiAgICogY29tbWl0cywgdGhlIG9uZXMgdGhhdCByYWlzZSBgY2VsbFZhbHVlQ2hhbmdlZGAgd2l0aG91dCBhIHNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBlbmFibGVVbmRvUmVkb0NlbGxFZGl0aW5nKGxpbWl0OiBudW1iZXIgPSAxMCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX3VuZG9MaW1pdCA+IDApIHJldHVybjtcblxuICAgIHRoaXMuX3VuZG9MaW1pdCA9IE1hdGgubWF4KE1hdGguZmxvb3IobGltaXQpLCAxKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NlbGxWYWx1ZUNoYW5nZWQnLCAoZXZlbnQ6IENlbGxWYWx1ZUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICBpZiAoZXZlbnQuc291cmNlKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX3VuZG9TdGFjay5wdXNoKHsgcm93SWQ6IGV2ZW50Lm5vZGUucm93SWQsIGZpZWxkOiBldmVudC5maWVsZCwgb2xkVmFsdWU6IGV2ZW50Lm9sZFZhbHVlLCBuZXdWYWx1ZTogZXZlbnQubmV3VmFsdWUgfSk7XG5cbiAgICAgIGlmICh0aGlzLl91bmRvU3RhY2subGVuZ3RoID4gdGhpcy5fdW5kb0xpbWl0KSB0aGlzLl91bmRvU3RhY2suc2hpZnQoKTtcblxuICAgICAgLy8gQSBuZXcgZWRpdCBmb3JrcyBoaXN0b3J5OyB3aGF0IHdhcyB1bmRvbmUgY2FuIG5vIGxvbmdlciBiZSByZWRvbmUuXG4gICAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXZlcnQgdGhlIG1vc3QgcmVjZW50IGNvbW1pdHRlZCBlZGl0LiBSZXR1cm5zIHdoZXRoZXIgb25lIHdhcyB1bmRvbmUuICovXG4gIHB1YmxpYyB1bmRvQ2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYXlFZGl0KHRoaXMuX3VuZG9TdGFjaywgdGhpcy5fcmVkb1N0YWNrLCAndW5kbycpO1xuICB9XG5cbiAgLyoqIFJlLWFwcGx5IHRoZSBtb3N0IHJlY2VudGx5IHVuZG9uZSBlZGl0LiBSZXR1cm5zIHdoZXRoZXIgb25lIHdhcyByZWRvbmUuICovXG4gIHB1YmxpYyByZWRvQ2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYXlFZGl0KHRoaXMuX3JlZG9TdGFjaywgdGhpcy5fdW5kb1N0YWNrLCAncmVkbycpO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRVbmRvU2l6ZSgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3VuZG9TdGFjay5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFJlZG9TaXplKCk6IG51bWJlciB7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVkb1N0YWNrLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGF5RWRpdChcbiAgICBmcm9tOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdLFxuICAgIHRvOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdLFxuICAgIHNvdXJjZTogJ3VuZG8nIHwgJ3JlZG8nLFxuICApOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGVkaXQgPSBmcm9tLnBvcCgpO1xuXG4gICAgaWYgKCFlZGl0KSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChlZGl0LnJvd0lkKTtcblxuICAgIC8vIFRoZSByb3cgY2FuIGJlIGdvbmUg4oCUIGEgc2V0Um93RGF0YSByZXBsYWNlZCB0aGUgZGF0YSB1bmRlciB0aGUgc3RhY2suXG4gICAgLy8gVGhlIGVkaXQgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiByZXBsYXllZCBvbnRvIG5vdGhpbmcuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZSA9PT0gJ3VuZG8nID8gZWRpdC5vbGRWYWx1ZSA6IGVkaXQubmV3VmFsdWU7XG4gICAgY29uc3QgcHJldmlvdXMgPSBzb3VyY2UgPT09ICd1bmRvJyA/IGVkaXQubmV3VmFsdWUgOiBlZGl0Lm9sZFZhbHVlO1xuXG4gICAgKG5vZGUuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbZWRpdC5maWVsZF0gPSB2YWx1ZTtcblxuICAgIHRoaXMudXBkYXRlQ2VsbFN0YXRlcyhub2RlKTtcblxuICAgIHRvLnB1c2goZWRpdCk7XG5cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zPy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGVkaXQuZmllbGQpID8/IG51bGw7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsVmFsdWVDaGFuZ2VkJywge1xuICAgICAgbm9kZSxcbiAgICAgIGRhdGE6IG5vZGUuZGF0YSxcbiAgICAgIGNvbHVtbjogY29sdW1uIGFzIE9uZUNvbHVtbkRlZjxUPixcbiAgICAgIGZpZWxkOiBlZGl0LmZpZWxkLFxuICAgICAgb2xkVmFsdWU6IHByZXZpb3VzLFxuICAgICAgbmV3VmFsdWU6IHZhbHVlLFxuICAgICAgc291cmNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ2xpZW50LXNpZGUgcGFnaW5hdGlvblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF9jbGllbnRQYWdpbmF0aW9uID0gZmFsc2U7XG4gIHByaXZhdGUgX3BhZ2VTaXplID0gMjU7XG4gIHByaXZhdGUgX2N1cnJlbnRQYWdlID0gMTtcblxuICAvKiogVGhlIHBhZ2luZyBzdGF0ZSwgd2hlbiB0aGUgZ3JpZCBwYWdlcyBpdHMgb3duIHJvd3MuICovXG4gIHB1YmxpYyBnZXQgcGFnaW5hdGlvblN0YXRlKCk6IFJlYWRvbmx5PHsgZW5hYmxlZDogYm9vbGVhbjsgcGFnZVNpemU6IG51bWJlcjsgY3VycmVudFBhZ2U6IG51bWJlciB9PiB7XG5cbiAgICByZXR1cm4geyBlbmFibGVkOiB0aGlzLl9jbGllbnRQYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5fcGFnZVNpemUsIGN1cnJlbnRQYWdlOiB0aGlzLl9jdXJyZW50UGFnZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gZ3JpZC1vd25lZCBwYWdpbmcgb24gb3Igb2ZmLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnRgIGZyb20gaXRzXG4gICAqIGBjbGllbnRTaWRlUGFnaW5hdGlvbmAgaW5wdXQ7IHRoZSBkaXNwbGF5IHNsaWNlIGlzIHdoYXQgY2hhbmdlcyDigJQgdGhlXG4gICAqIGZ1bGwgZGF0YXNldCBzdGF5cyBiZWhpbmQgdGhlIEFQSSAoc2VsZWN0aW9uLCBmaWx0ZXJzIGFuZCBzb3J0aW5nIGtlZXBcbiAgICogb3BlcmF0aW5nIG9uIGFsbCBvZiBpdCkuXG4gICAqL1xuICBwdWJsaWMgc2V0Q2xpZW50U2lkZVBhZ2luYXRpb24oZW5hYmxlZDogYm9vbGVhbiwgcGFnZVNpemU/OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuX2NsaWVudFBhZ2luYXRpb24gPSBlbmFibGVkO1xuXG4gICAgaWYgKHBhZ2VTaXplICYmIHBhZ2VTaXplID4gMCkgdGhpcy5fcGFnZVNpemUgPSBwYWdlU2l6ZTtcblxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gMTtcbiAgfVxuXG4gIC8qKiBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBhbmQgcmV0dXJuIHRvIHRoZSBmaXJzdCBwYWdlLiAqL1xuICBwdWJsaWMgc2V0UGFnZVNpemUocGFnZVNpemU6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCB8fCAhKHBhZ2VTaXplID4gMCkpIHJldHVybjtcblxuICAgIHRoaXMuX3BhZ2VTaXplID0gTWF0aC5mbG9vcihwYWdlU2l6ZSk7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSAxO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIHRvIGEgcGFnZSAoMS1iYXNlZCkuIENsYW1wZWQgdG8gYXQgbGVhc3QgMTsgdGhlIHRvcCBlbmQgY2xhbXBzIHdoZW4gdGhlIHNsaWNlIGlzIHRha2VuLiAqL1xuICBwdWJsaWMgc2V0Q3VycmVudFBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLm1heChNYXRoLmZsb29yKHBhZ2UpLCAxKTtcblxuICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2N1cnJlbnRQYWdlKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IHRhcmdldDtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNsaWNlIG9mIHJvd3MgdGhlIGN1cnJlbnQgcGFnZSBzaG93cyDigJQgYSBwYXNzdGhyb3VnaCB3aGlsZSBwYWdpbmcgaXNcbiAgICogb2ZmLiBUaGUgYm9keSByb3V0ZXMgaXRzIHJlbmRlciBsaXN0IHRocm91Z2ggaGVyZSwgYWZ0ZXIgcmVwb3J0aW5nIHRoZVxuICAgKiBmdWxsIGNvdW50LCBzbyBgcm93Q291bnRDaGFuZ2VkYCBrZWVwcyBtZWFuaW5nIFwicm93cyBhZnRlciBmaWx0ZXJpbmdcIlxuICAgKiB3aGV0aGVyIG9yIG5vdCB0aGUgZ3JpZCBwYWdlcy5cbiAgICovXG4gIHB1YmxpYyBwYWdlTm9kZXMobm9kZXM6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBpZiAoIXRoaXMuX2NsaWVudFBhZ2luYXRpb24pIHJldHVybiAobm9kZXMgPz8gW10pIGFzIE9uZVJvd05vZGU8VD5bXTtcblxuICAgIGNvbnN0IGxhc3RQYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKChub2Rlcz8ubGVuZ3RoID8/IDApIC8gdGhpcy5fcGFnZVNpemUpLCAxKTtcblxuICAgIC8vIEEgc2hyaW5raW5nIGRhdGFzZXQgKGEgZmlsdGVyLCBhIGRlbGV0ZSkgY2FuIHN0cmFuZCB0aGUgcGFnZSBwYXN0IHRoZVxuICAgIC8vIGVuZDsgY2xhbXBpbmcgaGVyZSBzaG93cyB0aGUgbGFzdCBwYWdlIGluc3RlYWQgb2YgYW4gZW1wdHkgb25lLlxuICAgIGlmICh0aGlzLl9jdXJyZW50UGFnZSA+IGxhc3RQYWdlKSB0aGlzLl9jdXJyZW50UGFnZSA9IGxhc3RQYWdlO1xuXG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuX3BhZ2VTaXplO1xuXG4gICAgcmV0dXJuIChub2RlcyA/PyBbXSkuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5fcGFnZVNpemUpIGFzIE9uZVJvd05vZGU8VD5bXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaXplIHRoZSBmbGV4IGNvbHVtbnMgaW50byB0aGUgZ2l2ZW4gd2lkdGguXG4gICAqXG4gICAqIENhbGxlZCBieSB0aGUgZ3JpZCBib2R5IHdpdGggaXRzIG93biB2aWV3cG9ydCB3aWR0aCDigJQgb24gZmlyc3QgcmVuZGVyLCBvblxuICAgKiBjb250YWluZXIgcmVzaXplIGFuZCBhZnRlciBjb2x1bW4gY2hhbmdlcyDigJQgc28gYGNvbHVtbkRlZi5mbGV4YCB3b3Jrc1xuICAgKiB3aXRob3V0IHRoZSBob3N0IGRvaW5nIGFueXRoaW5nLiBBbHNvIGNhbGxhYmxlIGRpcmVjdGx5IHdpdGggYW55IHdpZHRoLlxuICAgKiBBIG5vLW9wIHdoZW4gbm8gdmlzaWJsZSBjb2x1bW4gZGVjbGFyZXMgYGZsZXhgIG9yIG5vdGhpbmcgd291bGQgY2hhbmdlLlxuICAgKi9cbiAgcHVibGljIGFwcGx5RmxleFdpZHRocyhhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuY29sdW1uU2VydmljZS5hcHBseUZsZXhXaWR0aHMoYXZhaWxhYmxlV2lkdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGdyaWQgYXMgQ1NWOiB2aXNpYmxlIGNvbHVtbnMgaW4gZGlzcGxheSBvcmRlciwgdmlzaWJsZSByb3dzXG4gICAqIGluIGN1cnJlbnQgc29ydCBvcmRlciwgdmFsdWVzIHRocm91Z2ggdGhlIHNhbWUgZ2V0dGVyL2Zvcm1hdHRlciBwaXBlbGluZVxuICAgKiB0aGUgY2VsbHMgcmVuZGVyIHdpdGguIFBpbm5lZCByb3dzIGFuZCBkZXRhaWwgZ3JpZHMgYXJlIG5vdCBkYXRhIGFuZCBhcmVcbiAgICogbm90IGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGdldERhdGFBc0NzdihvcHRpb25zOiBPbmVDc3ZFeHBvcnRPcHRpb25zID0ge30pOiBzdHJpbmcge1xuXG4gICAgY29uc3Qgbm9kZXMgPSBvcHRpb25zLm9ubHlTZWxlY3RlZCA/IHRoaXMuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpIDogdGhpcy5fdmlzaWJsZVJvd05vZGVzO1xuXG4gICAgcmV0dXJuIGJ1aWxkQ3N2KG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXSwgdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCkuY29sdW1ucyBhcyBPbmVDb2x1bW5EZWY8VD5bXSwgdGhpcy5fY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIENTViBhbmQgaGFuZCBpdCB0byB0aGUgYnJvd3NlciBhcyBhIGRvd25sb2FkLiAqL1xuICBwdWJsaWMgZXhwb3J0RGF0YUFzQ3N2KG9wdGlvbnM6IE9uZUNzdkV4cG9ydE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdGhpcy5nZXREYXRhQXNDc3Yob3B0aW9ucyldLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XG5cbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgbGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBsaW5rLmRvd25sb2FkID0gb3B0aW9ucy5maWxlTmFtZSA/PyAnZXhwb3J0LmNzdic7XG4gICAgbGluay5jbGljaygpO1xuXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChsaW5rLmhyZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgb3IgaGlkZSBvbmUgY29sdW1uLiBBIGhpZGRlbiBjb2x1bW4ga2VlcHMgaXRzIG9yZGVyLCB3aWR0aCBhbmQgcGluLFxuICAgKiBzbyBzaG93aW5nIGl0IGFnYWluIHJlc3RvcmVzIGl0IGV4YWN0bHkuXG4gICAqL1xuICBwdWJsaWMgc2V0Q29sdW1uVmlzaWJsZShpZDogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbihpZCwgeyBoaWRlOiAhdmlzaWJsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0YWJsZSBsYXlvdXQgc3RhdGU6IG9uZSBKU09OLXNhZmUgZW50cnkgcGVyIGNvbHVtbiDigJQgaGlkZGVuIG9uZXNcbiAgICogaW5jbHVkZWQg4oCUIGluIGRpc3BsYXkgb3JkZXIuIEZlZWQgaXQgYmFjayB0aHJvdWdoIGBhcHBseUNvbHVtblN0YXRlYC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5TdGF0ZVNuYXBzaG90KCk6IE9uZUNvbHVtblN0YXRlRW50cnlbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlU25hcHNob3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgc25hcHNob3QgZnJvbSBgZ2V0Q29sdW1uU3RhdGVTbmFwc2hvdGA6IG9yZGVyLCB3aWR0aCwgcGluIGFuZFxuICAgKiB2aXNpYmlsaXR5LiBJZHMgdGhlIGdyaWQgbm8gbG9uZ2VyIGhhcyBhcmUgc2tpcHBlZCwgc28gYSBzdGFsZSBzbmFwc2hvdFxuICAgKiBkZWdyYWRlcyB0byBhIHBhcnRpYWwgcmVzdG9yZSByYXRoZXIgdGhhbiBhbiBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBhcHBseUNvbHVtblN0YXRlKGVudHJpZXM6IE9uZUNvbHVtblN0YXRlRW50cnlbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLmFwcGx5Q29sdW1uU3RhdGUoZW50cmllcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBBIHJlc3RvcmUgY2FuIHNob3cgY29sdW1ucyB0aGF0IHdlcmUgaGlkZGVuIHdoZW4gdGhlIHJvd3Mgd2VyZSBidWlsdCxcbiAgICAvLyBhbmQgdGhlaXIgY2VsbHMgaGF2ZSBubyBzdGF0ZSB5ZXQuXG4gICAgdGhpcy5yZWdlbmVyYXRlQ2VsbFN0YXRlcygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hlY2tib3ggc2VsZWN0aW9uIGZlYXR1cmVzXG4gICAqL1xuICBwdWJsaWMgc2V0Tm9kZUFuZENoaWxkcmVuU2VsZWN0ZWQobm9kZTogT25lUm93Tm9kZSwgc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcblxuICAgIGNvbnN0IHJvd0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgY29sbGVjdCA9IChuOiBPbmVSb3dOb2RlKSA9PiB7XG5cbiAgICAgIHJvd0lkcy5hZGQobi5yb3dJZCk7XG5cbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKSB7XG5cbiAgICAgICAgbi5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNvbGxlY3QoY2hpbGQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29sbGVjdChub2RlKTtcblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRCeUlkcyhBcnJheS5mcm9tKHJvd0lkcyksIHNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBJZGVudGljYWwgdG8gYHVwZGF0ZUNlbGxTdGF0ZXNgLiBLZXB0IGFzIGFuIGFsaWFzIHNvIGV4aXN0aW5nXG4gICAqIGNhbGxlcnMga2VlcCB3b3JraW5nOyBwcmVmZXIgYHVwZGF0ZUNlbGxTdGF0ZXNgLCB3aGljaCBzYXlzIHdoYXQgaXQgZG9lcy5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVOb2RlU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpIHtcblxuICAgIHRoaXMudXBkYXRlQ2VsbFN0YXRlcyhub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDZWxsU3RhdGUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd05vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgcm93Tm9kZS5jZWxsU3RhdGVzW2NvbHVtbi5maWVsZF0gPSB0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlKHJvd05vZGUsIGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZSBldmVyeSBjZWxsIG9mIG9uZSByb3cgYW5kIHJlcGFpbnQgaXQuXG4gICAqXG4gICAqIFRoZSByZXBhaW50IGlzIHRoZSBwb2ludDogdGhpcyBpcyB3aGF0IGEgY2FsbGVyIHJlYWNoZXMgZm9yIGFmdGVyIG11dGF0aW5nXG4gICAqIGEgcm93IGluIHBsYWNlLCBhbmQgaXQgdXNlZCB0byByZWdlbmVyYXRlIHRoZSBzdGF0ZSBhbmQgc3RvcCB0aGVyZS4gVGhlXG4gICAqIGJvZHkgcmVuZGVycyB3aXRoIE9uUHVzaCwgc28gbm90aGluZyBtYXJrZWQgaXQgZGlydHkgYW5kIHRoZSBuZXcgc3RhdGUgc2F0XG4gICAqIHVucmVhZCB1bnRpbCBzb21lIHVucmVsYXRlZCBldmVudCBoYXBwZW5lZCB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24g4oCUXG4gICAqIHdoaWNoIGlzIHdoeSBjYWxsZXJzIGVuZGVkIHVwIG51ZGdpbmcgdGhlIGdyaWQgd2l0aCBhIHN5bnRoZXRpYyBET00gZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmICghcm93Tm9kZSkgcmV0dXJuO1xuXG4gICAgcm93Tm9kZS5jZWxsU3RhdGVzID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMocm93Tm9kZSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsU3RhdGVDaGFuZ2VkJywgeyBkYXRhOiByb3dOb2RlLmRhdGEsIG5vZGU6IHJvd05vZGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlciB0aGF0IFJlYWN0cyB0byBEZXRhaWwgQ2hhbmdlc1xuICAgKi9cbiAgLyoqXG4gICAqIEtlZXAgYSBtYXN0ZXIgcm93J3MgcmVzZXJ2ZWQgaGVpZ2h0IGluIHN0ZXAgd2l0aCBpdHMgZGV0YWlsIHJvd3MuXG4gICAqXG4gICAqIFR3byBsaXN0ZW5lcnMgdXNlZCB0byBiZSByZWdpc3RlcmVkIGhlcmUgYW5kIHRocm93biBhd2F5OiBhbiBlbXB0eVxuICAgKiBgcm93RGF0YUNoYW5nZWRgIGhhbmRsZXIgd2hvc2UgdW5zdWJzY3JpYmUgd2FzIG5ldmVyIGtlcHQsIGFuZCBhblxuICAgKiBgZXhwYW5kZWRDaGFuZ2VkYCBoYW5kbGVyIHdob3NlIGJvZHkgd2FzIGVudGlyZWx5IGNvbW1lbnRlZCBvdXQuIEJvdGggYXJlXG4gICAqIGdvbmUg4oCUIGEgbGlzdGVuZXIgd2l0aCBubyBiZWhhdmlvdXIgaXMgYSBsZWFrIHdpdGggbm8gdXBzaWRlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgY29uc3QgdW5zdWJzY3JpYmVEZXRhaWwgPSBub2RlLm9uKCdkZXRhaWxSb3dEYXRhQ2hhbmdlZCcsICh7IG5vZGUgfSkgPT4ge1xuXG4gICAgICBpZiAodGhpcy5fYXBpVHlwZSA9PT0gJ21hc3RlcicpIHtcblxuICAgICAgICB0aGlzLnJlc29sdmVEZXRhaWxSb3dIZWlnaHQobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTm9kZUNsZWFudXAobm9kZS5yb3dJZCwgW3Vuc3Vic2NyaWJlRGV0YWlsXSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTm9kZUNsZWFudXAocm93SWQ6IHN0cmluZywgdW5zdWJzOiBBcnJheTwoKSA9PiB2b2lkPik6IHZvaWQge1xuXG4gICAgLy8gTWVyZ2Ugd2l0aCBhbnkgZXhpc3RpbmcgY2xlYW51cHMgZm9yIHRoaXMgcm93SWRcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX25vZGVDbGVhbnVwTWFwLmdldChyb3dJZCkgPz8gW107XG5cbiAgICB0aGlzLl9ub2RlQ2xlYW51cE1hcC5zZXQocm93SWQsIFsuLi5leGlzdGluZywgLi4udW5zdWJzXSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBOb2RlKHJvd0lkOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGNvbnN0IGNsZWFudXBzID0gdGhpcy5fbm9kZUNsZWFudXBNYXAuZ2V0KHJvd0lkKTtcblxuICAgIGNsZWFudXBzPy5mb3JFYWNoKGZuID0+IGZuKCkpO1xuXG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuZGVsZXRlKHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZGF0YSwgcmVsZWFzaW5nIHdoYXQgdGhleSBob2xkLlxuICAgKlxuICAgKiBUaGlzIGV4aXN0ZWQgYnV0IHdhcyBuZXZlciBjYWxsZWQ6IGBzZXRSb3dEYXRhYCBhbmQgYHVwZGF0ZVJvd0RhdGFgIGVhY2hcbiAgICogZGVsZXRlZCBzdHJhaWdodCBvdXQgb2YgYF9vcmlnaW5hbFJvd05vZGVzYCwgc28gYSByZW1vdmVkIG5vZGUga2VwdCBpdHNcbiAgICogbGlzdGVuZXJzIGFuZCBpdHMgZW50cnkgaW4gYF9ub2RlQ2xlYW51cE1hcGAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgZ3JpZC5cbiAgICogQm90aCBub3cgY29tZSB0aHJvdWdoIGhlcmUsIHdoaWNoIHVuc3Vic2NyaWJlcyBhbmQgY2xlYXJzIHRoZSBub2RlIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBwcnVuZVJlbW92ZWROb2Rlcyh2YWxpZFJvd0lkczogU2V0PHN0cmluZz4pOiB2b2lkIHtcblxuICAgIGZvciAoY29uc3QgW3Jvd0lkLCBub2RlXSBvZiB0aGlzLl9vcmlnaW5hbFJvd05vZGVzKSB7XG5cbiAgICAgIGlmICghdmFsaWRSb3dJZHMuaGFzKHJvd0lkKSkge1xuXG4gICAgICAgIHRoaXMuY2xlYW51cE5vZGUocm93SWQpOyAgLy8gdW5zdWJzY3JpYmUgbGlzdGVuZXJzXG5cbiAgICAgICAgbm9kZS5kZXN0cm95KCk7ICAgICAgICAgICAvLyBjbGVhciBub2RlJ3Mgb3duIGxpc3RlbmVyIG1hcFxuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVpZ2h0IGEgbWFzdGVyIHJvdyBtdXN0IHJlc2VydmUgZm9yIGl0cyBkZXRhaWwgZ3JpZDpcbiAgICogcm93SGVpZ2h0IHggY2xhbXAocm93cywgbWluUm93cywgbWF4Um93cykgKyBoZWFkZXJIZWlnaHQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZXRhaWxSb3dIZWlnaHQobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgY29uc3QgaGVpZ2h0T3B0aW9ucyA9IHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zPy5kZXRhaWxHcmlkT3B0aW9ucz8uZGV0YWlsUm93SGVpZ2h0T3B0aW9ucztcblxuICAgIC8vIFJlYWNoYWJsZSB3aGVuZXZlciBtYXN0ZXJEZXRhaWwgaXMgb24gYnV0IGRldGFpbENlbGxSZW5kZXJlclBhcmFtcyBpc1xuICAgIC8vIGluY29tcGxldGU7IHdpdGhvdXQgdGhlIGd1YXJkIHRoaXMgdGhyZXcgZnJvbSBpbnNpZGUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgaWYgKCFoZWlnaHRPcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBtaW5Sb3dzID0gaGVpZ2h0T3B0aW9ucy5taW5Sb3dzO1xuICAgIGNvbnN0IG1heFJvd3MgPSBoZWlnaHRPcHRpb25zLm1heFJvd3M7XG5cbiAgICBjb25zdCBtaW5IZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtaW5Sb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuICAgIGNvbnN0IG1heEhlaWdodCA9ICh0aGlzLnJvd0hlaWdodCAqIG1heFJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG5cbiAgICBjb25zdCByb3dzID0gbm9kZS5kZXRhaWxSb3dEYXRhICYmIG5vZGUuZGV0YWlsUm93RGF0YS5sZW5ndGggPyBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoIDogMDtcblxuICAgIG5vZGUuZGV0YWlsUm93SGVpZ2h0ID0gcm93cyA8PSBtaW5Sb3dzID8gbWluSGVpZ2h0IDogcm93cyA+PSBtYXhSb3dzID8gbWF4SGVpZ2h0IDogKHRoaXMucm93SGVpZ2h0ICogcm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIGV2ZXJ5dGhpbmcgdGhlIGdyaWQgaG9sZHMuIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudC5uZ09uRGVzdHJveWAuXG4gICAqXG4gICAqIFRoZSBzZXJ2aWNlcyBhcmUgZGVsaWJlcmF0ZWx5ICpub3QqIG51bGxlZCBvdXQgYW55IG1vcmUuIFRoZXkgYXJlIGluamVjdGVkLFxuICAgKiBBbmd1bGFyIG93bnMgdGhlaXIgbGlmZXRpbWUsIGFuZCBudWxsaW5nIHRoZW0gb25seSBndWFyYW50ZWVkIGFcbiAgICogYFR5cGVFcnJvcmAgZm9yIGFueSBjYWxsYmFjayB0aGF0IGFycml2ZWQgYWZ0ZXIgdGVhcmRvd24g4oCUIGEgZGV0YWlsLXJvd1xuICAgKiBmZXRjaCByZXNvbHZpbmcgbGF0ZSwgb3IgdGhlIGJvZHkncyBkZWZlcnJlZCB1cGRhdGUuIGBfZGVzdHJveWVkYCBtYWtlc1xuICAgKiB0aG9zZSBjYWxscyBuby1vcHMgaW5zdGVhZCwgd2hpY2ggaXMgd2hhdCBhIHRvcm4tZG93biBvYmplY3Qgc2hvdWxkIGRvLlxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZXZlcnkgcGVyLW5vZGUgbGlzdGVuZXIgYmVmb3JlIGRyb3BwaW5nIHRoZSBub2Rlcy5cbiAgICBmb3IgKGNvbnN0IHJvd0lkIG9mIEFycmF5LmZyb20odGhpcy5fbm9kZUNsZWFudXBNYXAua2V5cygpKSkge1xuXG4gICAgICB0aGlzLmNsZWFudXBOb2RlKHJvd0lkKTtcbiAgICB9XG5cbiAgICAvLyBgZGVzdHJveWAgZHJvcHMgdGhlIHRyZWUgbGlua3MgYW5kIHRoZSBsaXN0ZW5lcnM7IHRoZSBBUEkgbm8gbG9uZ2VyIGhhc1xuICAgIC8vIHRvIHJlYWNoIGluIGFuZCB1bnBpY2sgZWFjaCBub2RlIGl0c2VsZi5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcblxuICAgIGZvciAoY29uc3Qgc2lkZSBvZiBbJ3RvcCcsICdib3R0b20nXSBhcyBPbmVQaW5uZWRSb3dTaWRlW10pIHtcblxuICAgICAgdGhpcy5fcGlubmVkUm93Tm9kZXNbc2lkZV0uZm9yRWFjaChub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcbiAgICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5fcm93Tm9kZXMgPSBbXTtcbiAgICB0aGlzLl92aXNpYmxlUm93Tm9kZXMgPSBbXTtcbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmNsZWFyKCk7XG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuY2xlYXIoKTtcbiAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuXG4gICAgLy8gUmVsZWFzZSB0aGUgYmFjay1yZWZlcmVuY2UgdGhlIGNlbGwgc2VydmljZSBob2xkcywgc28gYSB0b3JuLWRvd24gYXBpIGlzXG4gICAgLy8gbm90IGtlcHQgYWxpdmUgYnkgdGhlIHNlcnZpY2UgdGhhdCBvdXRsaXZlcyB0aGlzIGNhbGwuXG4gICAgdGhpcy5jZWxsU2VydmljZS5zZXRHcmlkQXBpKG51bGwpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG4gICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gW107XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fc29ydE1vZGVsID0gW107XG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG5cbiAgICB0aGlzLm1hc3RlckRldGFpbCA9IGZhbHNlO1xuICAgIHRoaXMudHJlZURhdGEgPSBmYWxzZTtcbiAgICB0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCA9IG51bGw7XG4gICAgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9IDA7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBudWxsO1xuICAgIHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuX2dldERldGFpbFJvd0RhdGEgPSBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYGRlc3Ryb3lgIGhhcyBydW4uIExhdGUgY2FsbGJhY2tzIGNoZWNrIHRoaXMgYmVmb3JlIGRvaW5nIHdvcmsuICovXG4gIHB1YmxpYyBnZXQgZGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3llZDtcbiAgfVxufVxuIl19