@aquera/ngx-smart-table 0.0.10-alpha → 0.0.11-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +1 -1
- package/esm2020/lib/models/table-config.interface.mjs +3 -2
- package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +1 -1
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +48 -19
- package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +22 -3
- package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +14 -4
- package/esm2020/lib/renderer/models/table-state.class.mjs +32 -2
- package/fesm2015/aquera-ngx-smart-table.mjs +119 -29
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -1
- package/fesm2020/aquera-ngx-smart-table.mjs +116 -27
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -1
- package/lib/models/table-config.interface.d.ts +6 -0
- package/lib/renderer/components/st-table/st-table.component.d.ts +7 -2
- package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +15 -1
- package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +5 -1
- package/lib/renderer/models/table-state.class.d.ts +8 -1
- package/package.json +1 -1
|
@@ -21,6 +21,9 @@ export class TableState {
|
|
|
21
21
|
this._rowNumberWidth = 0;
|
|
22
22
|
// Settings column width for sticky offset calculation
|
|
23
23
|
this._settingsColumnWidth = 0;
|
|
24
|
+
// Pending focus position after a new row is added
|
|
25
|
+
// Set when requestAddRow is emitted, cleared when focus is applied
|
|
26
|
+
this._pendingFocusAfterRowAdd = null;
|
|
24
27
|
// Dimensions for boundary checking
|
|
25
28
|
this._rowCount = 0;
|
|
26
29
|
this._columnCount = 0;
|
|
@@ -53,6 +56,9 @@ export class TableState {
|
|
|
53
56
|
lastUpdated: new Date()
|
|
54
57
|
});
|
|
55
58
|
this.tableValidationState$ = this._tableValidationState$.asObservable();
|
|
59
|
+
// Initialize request add row subject
|
|
60
|
+
this._requestAddRow$ = new Subject();
|
|
61
|
+
this.requestAddRow$ = this._requestAddRow$.asObservable();
|
|
56
62
|
this._columnCount = columns.filter(c => c.visible !== false).length;
|
|
57
63
|
// Setup observables
|
|
58
64
|
this.paginationChange$ = this._pagination$.asObservable().pipe(distinctUntilChanged((a, b) => a.currentPage === b.currentPage &&
|
|
@@ -554,10 +560,22 @@ export class TableState {
|
|
|
554
560
|
* Set table dimensions for navigation boundaries
|
|
555
561
|
*/
|
|
556
562
|
setDimensions(rowCount, columnCount) {
|
|
563
|
+
const previousRowCount = this._rowCount;
|
|
557
564
|
this._rowCount = rowCount;
|
|
558
565
|
this._columnCount = columnCount;
|
|
559
566
|
// Update total rows in validation state
|
|
560
567
|
this.setValidationRowCount(rowCount);
|
|
568
|
+
// Check if a new row was added and we have a pending focus
|
|
569
|
+
if (this._pendingFocusAfterRowAdd && rowCount > previousRowCount) {
|
|
570
|
+
const { columnIndex } = this._pendingFocusAfterRowAdd;
|
|
571
|
+
// Focus the last row (newly added) at the pending column
|
|
572
|
+
const newRowIndex = rowCount - 1;
|
|
573
|
+
this._pendingFocusAfterRowAdd = null; // Clear pending focus
|
|
574
|
+
// Delay focus to ensure DOM is updated
|
|
575
|
+
setTimeout(() => {
|
|
576
|
+
this.focusCell(newRowIndex, columnIndex);
|
|
577
|
+
}, 0);
|
|
578
|
+
}
|
|
561
579
|
}
|
|
562
580
|
/**
|
|
563
581
|
* Focus a cell by position
|
|
@@ -604,8 +622,10 @@ export class TableState {
|
|
|
604
622
|
}
|
|
605
623
|
/**
|
|
606
624
|
* Move focus in a direction using NavigationDirection enum
|
|
625
|
+
* @param direction The navigation direction
|
|
626
|
+
* @param addRowOnNavigatePastEnd If true, emits requestAddRow when navigating past last row
|
|
607
627
|
*/
|
|
608
|
-
moveFocus(direction) {
|
|
628
|
+
moveFocus(direction, addRowOnNavigatePastEnd = false) {
|
|
609
629
|
// Block navigation if any cell is editing
|
|
610
630
|
if (this.isAnyCellEditing()) {
|
|
611
631
|
return false;
|
|
@@ -630,6 +650,16 @@ export class TableState {
|
|
|
630
650
|
newCol++;
|
|
631
651
|
break;
|
|
632
652
|
}
|
|
653
|
+
// Check if navigating past last row (arrow down at bottom)
|
|
654
|
+
if (direction === NavigationDirection.DOWN && newRow >= this._rowCount) {
|
|
655
|
+
if (addRowOnNavigatePastEnd) {
|
|
656
|
+
// Store pending focus for when the new row is added
|
|
657
|
+
this._pendingFocusAfterRowAdd = { columnIndex: current.columnIndex };
|
|
658
|
+
// Emit request to add a new row, keeping the same column for focus
|
|
659
|
+
this._requestAddRow$.next({ focusColumn: current.columnIndex });
|
|
660
|
+
}
|
|
661
|
+
return false;
|
|
662
|
+
}
|
|
633
663
|
if (newRow < 0 || newRow >= this._rowCount)
|
|
634
664
|
return false;
|
|
635
665
|
if (newCol < 0 || newCol >= this._columnCount)
|
|
@@ -838,4 +868,4 @@ export class TableState {
|
|
|
838
868
|
};
|
|
839
869
|
}
|
|
840
870
|
}
|
|
841
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc3RhdGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL21vZGVscy90YWJsZS1zdGF0ZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUVMLGFBQWEsRUFDYixjQUFjLEVBSWYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJOUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFrRHJCOzs7O09BSUc7SUFDSCxZQUFZLE9BQTRCLEVBQUUsTUFBeUI7UUExQ25FLHdEQUF3RDtRQUNoRCxvQkFBZSxHQUFXLENBQUMsQ0FBQztRQUVwQyxzREFBc0Q7UUFDOUMseUJBQW9CLEdBQVcsQ0FBQyxDQUFDO1FBY3pDLG1DQUFtQztRQUMzQixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBdUIvQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHO1lBQ3BCLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVyxJQUFJLENBQUM7WUFDckMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLElBQUksRUFBRTtTQUNqQyxDQUFDO1FBRUYsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQWtCO1lBQ3ZELFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVk7WUFDN0MsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENB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LENBQUMsSUFBSSxDQUFDO1lBQ3RCLElBQUk7WUFDSixLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQjtRQUN4QixPQUFPO1lBQ0wsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFFaEMsb0RBQW9EO1lBQ3BELGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUM7aUJBQ3ZDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVMsRUFBRSxHQUFHLENBQUMsR0FBRztnQkFDbEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLElBQUk7Z0JBQ2xELFFBQVEsRUFBRSxLQUFLLENBQUUsdUNBQXVDO2FBQ3pELENBQUMsQ0FBQztZQUVMLGtEQUFrRDtZQUNsRCxlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxLQUFLLElBQUksQ0FBQztpQkFDakQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWCxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUc7Z0JBQ2xCLFFBQVEsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsSUFBSSxjQUFjLENBQUMsUUFBUTtnQkFDL0QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsS0FBSztnQkFDOUIsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDLENBQUM7U0FDTixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUYWJsZVN0YXRlIC0gUmVhY3RpdmUgc3RhdGUgbWFuYWdlbWVudCBmb3IgdGFibGUgb3BlcmF0aW9uc1xuICogRXZlbnQtZHJpdmVuIGFyY2hpdGVjdHVyZTogdHJhY2tzIHN0YXRlLCBlbWl0cyBldmVudHMsIGNvbnN1bWVyIGhhbmRsZXMgYXN5bmMgZGF0YSBvcGVyYXRpb25zXG4gKi9cblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbHVtbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFxuICBQYWdpbmF0aW9uU3RhdGUsIFxuICBTb3J0RGlyZWN0aW9uLCBcbiAgRmlsdGVyT3BlcmF0b3IsXG4gIFRhYmxlU3RhdGVDaGFuZ2VFdmVudCxcbiAgVGFibGVTdGF0ZVNuYXBzaG90LFxuICBDZWxsRm9jdXNQb3NpdGlvblxufSBmcm9tICcuL3RhYmxlLXR5cGVzJztcbmltcG9ydCB7IFRhYmxlU3RhdGVDb25maWcgfSBmcm9tICcuL3RhYmxlLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NlbGwtdHlwZXMnO1xuaW1wb3J0IHsgUm93VmFsaWRhdGlvblN0YXRlIH0gZnJvbSAnLi9yb3ctdmFsaWRhdGlvbi1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVWYWxpZGF0aW9uU3RhdGUgfSBmcm9tICcuL3RhYmxlLXZhbGlkYXRpb24tc3RhdGUuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBUYWJsZVN0YXRlIGNsYXNzIC0gQ29sdW1uLWRyaXZlbiwgZXZlbnQtZW1pdHRpbmcgc3RhdGUgbWFuYWdlbWVudFxuICogTk8gZGF0YSBtYW5pcHVsYXRpb24gLSBvbmx5IHN0YXRlIHRyYWNraW5nIGFuZCBldmVudCBlbWlzc2lvblxuICovXG5leHBvcnQgY2xhc3MgVGFibGVTdGF0ZSB7XG4gIC8vIFJlZmVyZW5jZSB0byBjb2x1bW5zIGFycmF5IChjb2x1bW4tZHJpdmVuIGFyY2hpdGVjdHVyZSlcbiAgcHJpdmF0ZSBfY29sdW1uczogQ29sdW1uQ29uZmlnPGFueT5bXTtcbiAgXG4gIC8vIFBhZ2luYXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBfcGFnaW5hdGlvbiQ6IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uU3RhdGU+O1xuICBcbiAgLy8gU3RhdGUgY2hhbmdlIGV2ZW50c1xuICBwcml2YXRlIF9zdGF0ZUNoYW5nZSQ6IFN1YmplY3Q8VGFibGVTdGF0ZUNoYW5nZUV2ZW50PjtcbiAgXG4gIC8vIEluaXRpYWwgY29uZmlndXJhdGlvblxuICBwcml2YXRlIF9pbml0aWFsQ29uZmlnOiBUYWJsZVN0YXRlQ29uZmlnO1xuICBcbiAgLy8gUm93IG51bWJlciBjb2x1bW4gd2lkdGggZm9yIHN0aWNreSBvZmZzZXQgY2FsY3VsYXRpb25cbiAgcHJpdmF0ZSBfcm93TnVtYmVyV2lkdGg6IG51bWJlciA9IDA7XG5cbiAgLy8gU2V0dGluZ3MgY29sdW1uIHdpZHRoIGZvciBzdGlja3kgb2Zmc2V0IGNhbGN1bGF0aW9uXG4gIHByaXZhdGUgX3NldHRpbmdzQ29sdW1uV2lkdGg6IG51bWJlciA9IDA7XG4gIFxuICAvLyBGb2N1cyBwb3NpdGlvbiB0cmFja2luZ1xuICBwcml2YXRlIF9mb2N1c2VkQ2VsbFBvc2l0aW9uJDogQmVoYXZpb3JTdWJqZWN0PENlbGxGb2N1c1Bvc2l0aW9uIHwgbnVsbD47XG4gIHB1YmxpYyByZWFkb25seSBmb2N1c2VkQ2VsbFBvc2l0aW9uJDogT2JzZXJ2YWJsZTxDZWxsRm9jdXNQb3NpdGlvbiB8IG51bGw+O1xuICBcbiAgLy8gRWRpdGluZyBwb3NpdGlvbiB0cmFja2luZ1xuICBwcml2YXRlIF9lZGl0aW5nQ2VsbFBvc2l0aW9uJDogQmVoYXZpb3JTdWJqZWN0PENlbGxGb2N1c1Bvc2l0aW9uIHwgbnVsbD47XG4gIHB1YmxpYyByZWFkb25seSBlZGl0aW5nQ2VsbFBvc2l0aW9uJDogT2JzZXJ2YWJsZTxDZWxsRm9jdXNQb3NpdGlvbiB8IG51bGw+O1xuICBcbiAgLy8gVmFsaWRhdGlvbiBzdGF0ZSB0cmFja2luZ1xuICBwcml2YXRlIF90YWJsZVZhbGlkYXRpb25TdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxUYWJsZVZhbGlkYXRpb25TdGF0ZT47XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZVZhbGlkYXRpb25TdGF0ZSQ6IE9ic2VydmFibGU8VGFibGVWYWxpZGF0aW9uU3RhdGU+O1xuICBcbiAgLy8gRGltZW5zaW9ucyBmb3IgYm91bmRhcnkgY2hlY2tpbmdcbiAgcHJpdmF0ZSBfcm93Q291bnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2NvbHVtbkNvdW50OiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIGNvbXBsZXRlIHN0YXRlIHNuYXBzaG90XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGUkOiBPYnNlcnZhYmxlPFRhYmxlU3RhdGVTbmFwc2hvdD47XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlIGV2ZW50c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlQ2hhbmdlJDogT2JzZXJ2YWJsZTxUYWJsZVN0YXRlQ2hhbmdlRXZlbnQ+O1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIHBhZ2luYXRpb24gc3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2luYXRpb25DaGFuZ2UkOiBPYnNlcnZhYmxlPFBhZ2luYXRpb25TdGF0ZT47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBjb2x1bW5zIFJlZmVyZW5jZSB0byBjb2x1bW5zIGFycmF5XG4gICAqIEBwYXJhbSBjb25maWcgSW5pdGlhbCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zOiBDb2x1bW5Db25maWc8YW55PltdLCBjb25maWc/OiBUYWJsZVN0YXRlQ29uZmlnKSB7XG4gICAgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5faW5pdGlhbENvbmZpZyA9IHtcbiAgICAgIGluaXRpYWxQYWdlOiBjb25maWc/LmluaXRpYWxQYWdlID8/IDAsXG4gICAgICBwYWdlU2l6ZTogY29uZmlnPy5wYWdlU2l6ZSA/PyAyNVxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIHBhZ2luYXRpb24gc3RhdGVcbiAgICB0aGlzLl9wYWdpbmF0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFnaW5hdGlvblN0YXRlPih7XG4gICAgICBjdXJyZW50UGFnZTogdGhpcy5faW5pdGlhbENvbmZpZy5pbml0aWFsUGFnZSEsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5faW5pdGlhbENvbmZpZy5wYWdlU2l6ZSEsXG4gICAgICB0b3RhbEl0ZW1zOiAwLFxuICAgICAgdG90YWxQYWdlczogMFxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBjaGFuZ2Ugc3ViamVjdFxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PFRhYmxlU3RhdGVDaGFuZ2VFdmVudD4oKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGZvY3VzIGFuZCBlZGl0aW5nIHBvc2l0aW9uIHRyYWNraW5nXG4gICAgdGhpcy5fZm9jdXNlZENlbGxQb3NpdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENlbGxGb2N1c1Bvc2l0aW9uIHwgbnVsbD4obnVsbCk7XG4gICAgdGhpcy5mb2N1c2VkQ2VsbFBvc2l0aW9uJCA9IHRoaXMuX2ZvY3VzZWRDZWxsUG9zaXRpb24kLmFzT2JzZXJ2YWJsZSgpO1xuICAgIFxuICAgIHRoaXMuX2VkaXRpbmdDZWxsUG9zaXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDZWxsRm9jdXNQb3NpdGlvbiB8IG51bGw+KG51bGwpO1xuICAgIHRoaXMuZWRpdGluZ0NlbGxQb3NpdGlvbiQgPSB0aGlzLl9lZGl0aW5nQ2VsbFBvc2l0aW9uJC5hc09ic2VydmFibGUoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHZhbGlkYXRpb24gc3RhdGVcbiAgICB0aGlzLl90YWJsZVZhbGlkYXRpb25TdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhYmxlVmFsaWRhdGlvblN0YXRlPih7XG4gICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgdG90YWxSb3dzOiAwLFxuICAgICAgdmFsaWRSb3dzOiAwLFxuICAgICAgaW52YWxpZFJvd3M6IDAsXG4gICAgICByb3dTdGF0ZXM6IG5ldyBNYXAoKSxcbiAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpXG4gICAgfSk7XG4gICAgdGhpcy50YWJsZVZhbGlkYXRpb25TdGF0ZSQgPSB0aGlzLl90YWJsZVZhbGlkYXRpb25TdGF0ZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgXG4gICAgdGhpcy5fY29sdW1uQ291bnQgPSBjb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSAhPT0gZmFsc2UpLmxlbmd0aDtcblxuICAgIC8vIFNldHVwIG9ic2VydmFibGVzXG4gICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlJCA9IHRoaXMuX3BhZ2luYXRpb24kLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gXG4gICAgICAgIGEuY3VycmVudFBhZ2UgPT09IGIuY3VycmVudFBhZ2UgJiYgXG4gICAgICAgIGEucGFnZVNpemUgPT09IGIucGFnZVNpemUgJiZcbiAgICAgICAgYS50b3RhbEl0ZW1zID09PSBiLnRvdGFsSXRlbXNcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLl9wYWdpbmF0aW9uJC5waXBlKFxuICAgICAgbWFwKCgpID0+IHRoaXMuYnVpbGRTdGF0ZVNuYXBzaG90KCkpXG4gICAgKTtcblxuICAgIHRoaXMuc3RhdGVDaGFuZ2UkID0gdGhpcy5fc3RhdGVDaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIFxuICAgIC8vIENsZWFyIGZvY3VzL2VkaXRpbmcgb24gcGFnaW5hdGlvbiBjaGFuZ2VzXG4gICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jbGVhckZvY3VzKCk7XG4gICAgICB0aGlzLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1RBVEUgQUNDRVNTIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBzdGF0ZSBzbmFwc2hvdFxuICAgKi9cbiAgZ2V0U3RhdGUoKTogVGFibGVTdGF0ZVNuYXBzaG90IHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFN0YXRlU25hcHNob3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBwYWdpbmF0aW9uIHN0YXRlXG4gICAqL1xuICBnZXRQYWdpbmF0aW9uKCk6IFBhZ2luYXRpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fcGFnaW5hdGlvbiQudmFsdWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29sdW1ucyB3aXRoIHNvcnRpbmcgZW5hYmxlZFxuICAgKi9cbiAgZ2V0U29ydGVkQ29sdW1ucygpOiBDb2x1bW5Db25maWc8YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5zb3J0RW5hYmxlZCA9PT0gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbHVtbnMgd2l0aCBmaWx0ZXJpbmcgZW5hYmxlZFxuICAgKi9cbiAgZ2V0RmlsdGVyZWRDb2x1bW5zKCk6IENvbHVtbkNvbmZpZzxhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmZpbHRlckNvbmZpZz8uZW5hYmxlZCA9PT0gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgY29sdW1ucyByZWZlcmVuY2VcbiAgICovXG4gIGdldENvbHVtbnMoKTogQ29sdW1uQ29uZmlnPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBBR0lOQVRJT04gTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFNldCBjdXJyZW50IHBhZ2VcbiAgICogQHBhcmFtIHBhZ2UgUGFnZSBudW1iZXIgKDAtaW5kZXhlZClcbiAgICovXG4gIHNldFBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5fcGFnaW5hdGlvbiQudmFsdWU7XG4gICAgaWYgKHBhZ2UgPCAwIHx8IHBhZ2UgPj0gY3VycmVudFN0YXRlLnRvdGFsUGFnZXMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgSW52YWxpZCBwYWdlIG51bWJlcjogJHtwYWdlfS4gVmFsaWQgcmFuZ2U6IDAtJHtjdXJyZW50U3RhdGUudG90YWxQYWdlcyAtIDF9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGFnaW5hdGlvbiQubmV4dCh7XG4gICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICBjdXJyZW50UGFnZTogcGFnZVxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdwYWdpbmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhZ2Ugc2l6ZVxuICAgKiBAcGFyYW0gc2l6ZSBOdW1iZXIgb2YgaXRlbXMgcGVyIHBhZ2VcbiAgICovXG4gIHNldFBhZ2VTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChzaXplIDw9IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihgSW52YWxpZCBwYWdlIHNpemU6ICR7c2l6ZX0uIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5fcGFnaW5hdGlvbiQudmFsdWU7XG4gICAgY29uc3QgbmV3VG90YWxQYWdlcyA9IHRoaXMuY2FsY3VsYXRlVG90YWxQYWdlcyhjdXJyZW50U3RhdGUudG90YWxJdGVtcywgc2l6ZSk7XG4gICAgXG4gICAgdGhpcy5fcGFnaW5hdGlvbiQubmV4dCh7XG4gICAgICBjdXJyZW50UGFnZTogMCwgLy8gUmVzZXQgdG8gZmlyc3QgcGFnZVxuICAgICAgcGFnZVNpemU6IHNpemUsXG4gICAgICB0b3RhbEl0ZW1zOiBjdXJyZW50U3RhdGUudG90YWxJdGVtcyxcbiAgICAgIHRvdGFsUGFnZXM6IG5ld1RvdGFsUGFnZXNcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgncGFnaW5hdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0b3RhbCBpdGVtcyAoY2FsbGVkIGFmdGVyIEFQSSByZXNwb25zZSlcbiAgICogQHBhcmFtIHRvdGFsIFRvdGFsIG51bWJlciBvZiBpdGVtc1xuICAgKi9cbiAgc2V0VG90YWxJdGVtcyh0b3RhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5fcGFnaW5hdGlvbiQudmFsdWU7XG4gICAgY29uc3QgbmV3VG90YWxQYWdlcyA9IHRoaXMuY2FsY3VsYXRlVG90YWxQYWdlcyh0b3RhbCwgY3VycmVudFN0YXRlLnBhZ2VTaXplKTtcbiAgICBcbiAgICB0aGlzLl9wYWdpbmF0aW9uJC5uZXh0KHtcbiAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgIHRvdGFsSXRlbXM6IHRvdGFsLFxuICAgICAgdG90YWxQYWdlczogbmV3VG90YWxQYWdlc1xuICAgIH0pO1xuICAgIC8vIERvbid0IGVtaXQgc3RhdGUgY2hhbmdlIGhlcmUgLSB0aGlzIGlzIGNhbGxlZCBhZnRlciBkYXRhIGxvYWRcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0byBuZXh0IHBhZ2VcbiAgICovXG4gIG5leHRQYWdlKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuX3BhZ2luYXRpb24kLnZhbHVlO1xuICAgIGlmICh0aGlzLmhhc05leHRQYWdlKCkpIHtcbiAgICAgIHRoaXMuc2V0UGFnZShjdXJyZW50U3RhdGUuY3VycmVudFBhZ2UgKyAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR28gdG8gcHJldmlvdXMgcGFnZVxuICAgKi9cbiAgcHJldmlvdXNQYWdlKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuX3BhZ2luYXRpb24kLnZhbHVlO1xuICAgIGlmICh0aGlzLmhhc1ByZXZpb3VzUGFnZSgpKSB7XG4gICAgICB0aGlzLnNldFBhZ2UoY3VycmVudFN0YXRlLmN1cnJlbnRQYWdlIC0gMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdvIHRvIGZpcnN0IHBhZ2VcbiAgICovXG4gIGZpcnN0UGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFBhZ2UoMCk7XG4gIH1cblxuICAvKipcbiAgICogR28gdG8gbGFzdCBwYWdlXG4gICAqL1xuICBsYXN0UGFnZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLl9wYWdpbmF0aW9uJC52YWx1ZTtcbiAgICBpZiAoY3VycmVudFN0YXRlLnRvdGFsUGFnZXMgPiAwKSB7XG4gICAgICB0aGlzLnNldFBhZ2UoY3VycmVudFN0YXRlLnRvdGFsUGFnZXMgLSAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZXh0IHBhZ2VcbiAgICovXG4gIGhhc05leHRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuX3BhZ2luYXRpb24kLnZhbHVlO1xuICAgIHJldHVybiBjdXJyZW50U3RhdGUuY3VycmVudFBhZ2UgPCBjdXJyZW50U3RhdGUudG90YWxQYWdlcyAtIDE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBwYWdlXG4gICAqL1xuICBoYXNQcmV2aW91c1BhZ2UoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5fcGFnaW5hdGlvbiQudmFsdWU7XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZS5jdXJyZW50UGFnZSA+IDA7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNPUlRJTkcgTUVUSE9EUyAob3BlcmF0ZSBvbiBjb2x1bW4gY29uZmlncylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTZXQgc29ydCBvbiBhIGNvbHVtbiAoY2xlYXJzIG90aGVyIHNvcnRzKVxuICAgKiBAcGFyYW0gY29sdW1uS2V5IENvbHVtbiBrZXlcbiAgICogQHBhcmFtIGRpcmVjdGlvbiBTb3J0IGRpcmVjdGlvblxuICAgKi9cbiAgc2V0U29ydE9uQ29sdW1uKGNvbHVtbktleTogc3RyaW5nLCBkaXJlY3Rpb246IFNvcnREaXJlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbktleX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gJHtjb2x1bW5LZXl9IGlzIG5vdCBzb3J0YWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGFsbCBvdGhlciBzb3J0c1xuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgaWYgKGNvbC5rZXkgIT09IGNvbHVtbktleSkge1xuICAgICAgICBjb2wuc29ydERpcmVjdGlvbiA9IFNvcnREaXJlY3Rpb24uTk9ORTtcbiAgICAgICAgY29sLnNvcnRFbmFibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgc29ydCBvbiB0YXJnZXQgY29sdW1uXG4gICAgY29sdW1uLnNvcnREaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgY29sdW1uLnNvcnRFbmFibGVkID0gZGlyZWN0aW9uICE9PSBTb3J0RGlyZWN0aW9uLk5PTkU7XG5cbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnc29ydGluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzb3J0IHRvIGEgY29sdW1uIChmb3IgbXVsdGktY29sdW1uIHNvcnRpbmcpXG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFNvcnQgZGlyZWN0aW9uXG4gICAqL1xuICBhZGRTb3J0VG9Db2x1bW4oY29sdW1uS2V5OiBzdHJpbmcsIGRpcmVjdGlvbjogU29ydERpcmVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZmluZENvbHVtbihjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbHVtbiBub3QgZm91bmQ6ICR7Y29sdW1uS2V5fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW4uc29ydGFibGUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbHVtbiAke2NvbHVtbktleX0gaXMgbm90IHNvcnRhYmxlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29sdW1uLnNvcnREaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgY29sdW1uLnNvcnRFbmFibGVkID0gZGlyZWN0aW9uICE9PSBTb3J0RGlyZWN0aW9uLk5PTkU7XG5cbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnc29ydGluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBzb3J0IG9uIGEgY29sdW1uIChjeWNsZXMgdGhyb3VnaCBub25lIC0+IGFzYyAtPiBkZXNjIC0+IG5vbmUpXG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKi9cbiAgdG9nZ2xlU29ydE9uQ29sdW1uKGNvbHVtbktleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maW5kQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uIG5vdCBmb3VuZDogJHtjb2x1bW5LZXl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uICR7Y29sdW1uS2V5fSBpcyBub3Qgc29ydGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RGlyZWN0aW9uID0gY29sdW1uLnNvcnREaXJlY3Rpb24gfHwgU29ydERpcmVjdGlvbi5OT05FO1xuICAgIGxldCBuZXdEaXJlY3Rpb246IFNvcnREaXJlY3Rpb247XG5cbiAgICBzd2l0Y2ggKGN1cnJlbnREaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgU29ydERpcmVjdGlvbi5OT05FOlxuICAgICAgICBuZXdEaXJlY3Rpb24gPSBTb3J0RGlyZWN0aW9uLkFTQztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNvcnREaXJlY3Rpb24uQVNDOlxuICAgICAgICBuZXdEaXJlY3Rpb24gPSBTb3J0RGlyZWN0aW9uLkRFU0M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTb3J0RGlyZWN0aW9uLkRFU0M6XG4gICAgICAgIG5ld0RpcmVjdGlvbiA9IFNvcnREaXJlY3Rpb24uTk9ORTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBuZXdEaXJlY3Rpb24gPSBTb3J0RGlyZWN0aW9uLkFTQztcbiAgICB9XG5cbiAgICBjb2x1bW4uc29ydERpcmVjdGlvbiA9IG5ld0RpcmVjdGlvbjtcbiAgICBjb2x1bW4uc29ydEVuYWJsZWQgPSBuZXdEaXJlY3Rpb24gIT09IFNvcnREaXJlY3Rpb24uTk9ORTtcblxuICAgIHRoaXMuY2xlYXJGb2N1cygpO1xuICAgIHRoaXMuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdzb3J0aW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIHNvcnRpbmdcbiAgICovXG4gIGNsZWFyQWxsU29ydGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgIGNvbC5zb3J0RGlyZWN0aW9uID0gU29ydERpcmVjdGlvbi5OT05FO1xuICAgICAgY29sLnNvcnRFbmFibGVkID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNsZWFyRm9jdXMoKTtcbiAgICB0aGlzLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnc29ydGluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3J0IGNvbmZpZ3VyYXRpb24gZm9yIGEgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcmV0dXJucyBTb3J0IGNvbmZpZ3VyYXRpb24gb3IgbnVsbFxuICAgKi9cbiAgZ2V0U29ydEZvckNvbHVtbihjb2x1bW5LZXk6IHN0cmluZyk6IHsgZGlyZWN0aW9uOiBTb3J0RGlyZWN0aW9uOyBlbmFibGVkOiBib29sZWFuIH0gfCBudWxsIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpcmVjdGlvbjogY29sdW1uLnNvcnREaXJlY3Rpb24gfHwgU29ydERpcmVjdGlvbi5OT05FLFxuICAgICAgZW5hYmxlZDogY29sdW1uLnNvcnRFbmFibGVkIHx8IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRklMVEVSSU5HIE1FVEhPRFMgKG9wZXJhdGUgb24gY29sdW1uIGNvbmZpZ3MpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU2V0IGZpbHRlciBvbiBhIGNvbHVtblxuICAgKiBAcGFyYW0gY29sdW1uS2V5IENvbHVtbiBrZXlcbiAgICogQHBhcmFtIG9wZXJhdG9yIEZpbHRlciBvcGVyYXRvclxuICAgKiBAcGFyYW0gdmFsdWUgRmlsdGVyIHZhbHVlXG4gICAqL1xuICBzZXRGaWx0ZXJPbkNvbHVtbihjb2x1bW5LZXk6IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maW5kQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uIG5vdCBmb3VuZDogJHtjb2x1bW5LZXl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbHVtbi5maWx0ZXJhYmxlID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gJHtjb2x1bW5LZXl9IGlzIG5vdCBmaWx0ZXJhYmxlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWx0ZXJDb25maWcgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIGlmICghY29sdW1uLmZpbHRlckNvbmZpZykge1xuICAgICAgY29sdW1uLmZpbHRlckNvbmZpZyA9IHt9O1xuICAgIH1cblxuICAgIGNvbHVtbi5maWx0ZXJDb25maWcub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICBjb2x1bW4uZmlsdGVyQ29uZmlnLnZhbHVlID0gdmFsdWU7XG4gICAgY29sdW1uLmZpbHRlckNvbmZpZy5lbmFibGVkID0gdHJ1ZTtcblxuICAgIHRoaXMuY2xlYXJGb2N1cygpO1xuICAgIHRoaXMuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdmaWx0ZXJpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBmaWx0ZXIgb24gYSBjb2x1bW5cbiAgICogQHBhcmFtIGNvbHVtbktleSBDb2x1bW4ga2V5XG4gICAqL1xuICBjbGVhckZpbHRlck9uQ29sdW1uKGNvbHVtbktleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maW5kQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uIG5vdCBmb3VuZDogJHtjb2x1bW5LZXl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWx0ZXJDb25maWcgaWYgaXQgZG9lc24ndCBleGlzdCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggc2V0RmlsdGVyT25Db2x1bW4pXG4gICAgaWYgKCFjb2x1bW4uZmlsdGVyQ29uZmlnKSB7XG4gICAgICBjb2x1bW4uZmlsdGVyQ29uZmlnID0ge307XG4gICAgfVxuXG4gICAgY29sdW1uLmZpbHRlckNvbmZpZy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBjb2x1bW4uZmlsdGVyQ29uZmlnLmVuYWJsZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuY2xlYXJGb2N1cygpO1xuICAgIHRoaXMuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdmaWx0ZXJpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZmlsdGVyc1xuICAgKi9cbiAgY2xlYXJBbGxGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBmaWx0ZXJDb25maWcgaWYgaXQgZG9lc24ndCBleGlzdCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggc2V0RmlsdGVyT25Db2x1bW4pXG4gICAgICBpZiAoIWNvbC5maWx0ZXJDb25maWcpIHtcbiAgICAgICAgY29sLmZpbHRlckNvbmZpZyA9IHt9O1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb2wuZmlsdGVyQ29uZmlnLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgY29sLmZpbHRlckNvbmZpZy5lbmFibGVkID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNsZWFyRm9jdXMoKTtcbiAgICB0aGlzLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnZmlsdGVyaW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGZpbHRlciBlbmFibGVkIHN0YXRlXG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcGFyYW0gZW5hYmxlZCBXaGV0aGVyIGZpbHRlciBpcyBlbmFibGVkXG4gICAqL1xuICBzZXRGaWx0ZXJFbmFibGVkKGNvbHVtbktleTogc3RyaW5nLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maW5kQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uIG5vdCBmb3VuZDogJHtjb2x1bW5LZXl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWx0ZXJDb25maWcgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIGlmICghY29sdW1uLmZpbHRlckNvbmZpZykge1xuICAgICAgY29sdW1uLmZpbHRlckNvbmZpZyA9IHt9O1xuICAgIH1cblxuICAgIGNvbHVtbi5maWx0ZXJDb25maWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnZmlsdGVyaW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbHRlciBjb25maWd1cmF0aW9uIGZvciBhIGNvbHVtblxuICAgKiBAcGFyYW0gY29sdW1uS2V5IENvbHVtbiBrZXlcbiAgICogQHJldHVybnMgRmlsdGVyIGNvbmZpZ3VyYXRpb24gb3IgbnVsbFxuICAgKi9cbiAgZ2V0RmlsdGVyRm9yQ29sdW1uKGNvbHVtbktleTogc3RyaW5nKTogeyBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3I7IHZhbHVlOiBhbnk7IGVuYWJsZWQ6IGJvb2xlYW4gfSB8IG51bGwge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZmluZENvbHVtbihjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0b3I6IGNvbHVtbi5maWx0ZXJDb25maWc/Lm9wZXJhdG9yIHx8IEZpbHRlck9wZXJhdG9yLkNPTlRBSU5TLFxuICAgICAgdmFsdWU6IGNvbHVtbi5maWx0ZXJDb25maWc/LnZhbHVlLFxuICAgICAgZW5hYmxlZDogY29sdW1uLmZpbHRlckNvbmZpZz8uZW5hYmxlZCB8fCBmYWxzZVxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNUSUNLWSBDT0xVTU4gTUFOQUdFTUVOVFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBzdGlja3kgY29sdW1ucyBncm91cGVkIGJ5IHBvc2l0aW9uXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGxlZnQgYW5kIHJpZ2h0IHN0aWNreSBjb2x1bW4ga2V5c1xuICAgKi9cbiAgZ2V0U3RpY2t5Q29sdW1ucygpOiB7IGxlZnQ6IHN0cmluZ1tdOyByaWdodDogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgbGVmdCA9IHRoaXMuX2NvbHVtbnNcbiAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5zdGlja3kgPT09ICdsZWZ0JylcbiAgICAgIC5tYXAoY29sID0+IGNvbC5rZXkpO1xuICAgIFxuICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5fY29sdW1uc1xuICAgICAgLmZpbHRlcihjb2wgPT4gY29sLnN0aWNreSA9PT0gJ3JpZ2h0JylcbiAgICAgIC5tYXAoY29sID0+IGNvbC5rZXkpO1xuICAgIFxuICAgIHJldHVybiB7IGxlZnQsIHJpZ2h0IH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHN0aWNreSBwb3NpdGlvbiBmb3IgYSBjb2x1bW5cbiAgICogQHBhcmFtIGNvbHVtbktleSBDb2x1bW4ga2V5XG4gICAqIEBwYXJhbSBwb3NpdGlvbiBTdGlja3kgcG9zaXRpb24gKCdsZWZ0JywgJ3JpZ2h0Jywgb3IgZmFsc2UpXG4gICAqL1xuICBzZXRTdGlja3lDb2x1bW4oY29sdW1uS2V5OiBzdHJpbmcsIHBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbktleX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAoY29sdW1uIGFzIGFueSkuc3RpY2t5ID0gcG9zaXRpb247XG4gICAgdGhpcy5jYWxjdWxhdGVTdGlja3lPZmZzZXRzKCk7XG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2UoJ2NvbHVtbi1jb25maWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgc3RpY2t5IG9mZnNldHMgZm9yIGFsbCBzdGlja3kgY29sdW1uc1xuICAgKiBUaGlzIGNhbGN1bGF0ZXMgY3VtdWxhdGl2ZSB3aWR0aHMgZm9yIHBvc2l0aW9uaW5nXG4gICAqIEBwYXJhbSByb3dOdW1iZXJXaWR0aCBPcHRpb25hbCB3aWR0aCBvZiByb3cgbnVtYmVyIGNvbHVtbiB0byBhY2NvdW50IGZvciBpbiBsZWZ0IG9mZnNldFxuICAgKiBAcGFyYW0gc2V0dGluZ3NDb2x1bW5XaWR0aCBPcHRpb25hbCB3aWR0aCBvZiBzZXR0aW5ncyBjb2x1bW4gdG8gYWNjb3VudCBmb3IgaW4gcmlnaHQgb2Zmc2V0XG4gICAqL1xuICBjYWxjdWxhdGVTdGlja3lPZmZzZXRzKHJvd051bWJlcldpZHRoPzogbnVtYmVyLCBzZXR0aW5nc0NvbHVtbldpZHRoPzogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHN0b3JlZCByb3cgbnVtYmVyIHdpZHRoIGlmIHByb3ZpZGVkXG4gICAgaWYgKHJvd051bWJlcldpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3Jvd051bWJlcldpZHRoID0gcm93TnVtYmVyV2lkdGg7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgc2V0dGluZ3MgY29sdW1uIHdpZHRoIGlmIHByb3ZpZGVkXG4gICAgaWYgKHNldHRpbmdzQ29sdW1uV2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fc2V0dGluZ3NDb2x1bW5XaWR0aCA9IHNldHRpbmdzQ29sdW1uV2lkdGg7XG4gICAgfVxuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBsZWZ0IHN0aWNreSBvZmZzZXRzXG4gICAgLy8gQWNjb3VudCBmb3Igcm93IG51bWJlciBjb2x1bW4gd2lkdGhcbiAgICBsZXQgbGVmdE9mZnNldCA9IHRoaXMuX3Jvd051bWJlcldpZHRoO1xuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgaWYgKGNvbC5zdGlja3kgPT09ICdsZWZ0Jykge1xuICAgICAgICAoY29sIGFzIGFueSkuc3RpY2t5T2Zmc2V0ID0gbGVmdE9mZnNldDtcbiAgICAgICAgbGVmdE9mZnNldCArPSAoY29sLndpZHRoIGFzIG51bWJlcikgfHwgMTAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHJpZ2h0IHN0aWNreSBvZmZzZXRzXG4gICAgLy8gQWNjb3VudCBmb3Igc2V0dGluZ3MgY29sdW1uIHdpZHRoIChyb3cgYWN0aW9ucyBjb2x1bW4pXG4gICAgbGV0IHJpZ2h0T2Zmc2V0ID0gdGhpcy5fc2V0dGluZ3NDb2x1bW5XaWR0aDtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5fY29sdW1ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY29sID0gdGhpcy5fY29sdW1uc1tpXTtcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAncmlnaHQnKSB7XG4gICAgICAgIChjb2wgYXMgYW55KS5zdGlja3lPZmZzZXQgPSByaWdodE9mZnNldDtcbiAgICAgICAgcmlnaHRPZmZzZXQgKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENPTFVNTiBNQU5BR0VNRU5UXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVXBkYXRlIGNvbHVtbnMgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSBjb2x1bW5zIE5ldyBjb2x1bW5zIGFycmF5XG4gICAqL1xuICB1cGRhdGVDb2x1bW5zKGNvbHVtbnM6IENvbHVtbkNvbmZpZzxhbnk+W10pOiB2b2lkIHtcbiAgICB0aGlzLl9jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMoKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnY29sdW1uLWNvbmZpZycpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDT0xVTU4gVklTSUJJTElUWSBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVG9nZ2xlIHZpc2liaWxpdHkgb2YgYSBjb2x1bW5cbiAgICogQHBhcmFtIGNvbHVtbktleSBDb2x1bW4ga2V5XG4gICAqL1xuICB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGNvbHVtbktleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maW5kQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uIG5vdCBmb3VuZDogJHtjb2x1bW5LZXl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgY29sdW1uIGlzIGhpZGVhYmxlXG4gICAgaWYgKGNvbHVtbi5oaWRlYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uICR7Y29sdW1uS2V5fSBjYW5ub3QgYmUgaGlkZGVuIChoaWRlYWJsZSBpcyBmYWxzZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmlzaWJpbGl0eSA9IGNvbHVtbi52aXNpYmxlICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0byB0cnVlIGlmIG5vdCBzZXRcbiAgICAoY29sdW1uIGFzIGFueSkudmlzaWJsZSA9ICFjdXJyZW50VmlzaWJpbGl0eTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnY29sdW1uLXZpc2liaWxpdHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmlzaWJpbGl0eSBvZiBhIGNvbHVtblxuICAgKiBAcGFyYW0gY29sdW1uS2V5IENvbHVtbiBrZXlcbiAgICogQHBhcmFtIHZpc2libGUgV2hldGhlciBjb2x1bW4gc2hvdWxkIGJlIHZpc2libGVcbiAgICovXG4gIHNldENvbHVtblZpc2liaWxpdHkoY29sdW1uS2V5OiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbktleX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjb2x1bW4gaXMgaGlkZWFibGUgKG9ubHkgd2hlbiB0cnlpbmcgdG8gaGlkZSlcbiAgICBpZiAoIXZpc2libGUgJiYgY29sdW1uLmhpZGVhYmxlID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gJHtjb2x1bW5LZXl9IGNhbm5vdCBiZSBoaWRkZW4gKGhpZGVhYmxlIGlzIGZhbHNlKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIChjb2x1bW4gYXMgYW55KS52aXNpYmxlID0gdmlzaWJsZTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnY29sdW1uLXZpc2liaWxpdHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHZpc2libGUgY29sdW1uc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiB2aXNpYmxlIGNvbHVtbiBjb25maWdzXG4gICAqL1xuICBnZXRWaXNpYmxlQ29sdW1ucygpOiBDb2x1bW5Db25maWc8YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSk7IC8vIERlZmF1bHQgdG8gdHJ1ZSBpZiBub3Qgc2V0XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZpc2liaWxpdHkgc3RhdGUgZm9yIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNvbHVtbiB2aXNpYmlsaXR5IGluZm9cbiAgICovXG4gIGdldEFsbENvbHVtbnNWaXNpYmlsaXR5KCk6IHsga2V5OiBzdHJpbmc7IGhlYWRlcjogc3RyaW5nOyB2aXNpYmxlOiBib29sZWFuOyBoaWRlYWJsZTogYm9vbGVhbiB9W10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLm1hcChjb2wgPT4gKHtcbiAgICAgIGtleTogY29sLmtleSxcbiAgICAgIGhlYWRlcjogY29sLmhlYWRlciB8fCBjb2wua2V5LFxuICAgICAgdmlzaWJsZTogY29sLnZpc2libGUgIT09IGZhbHNlLCAvLyBEZWZhdWx0IHRvIHRydWUgaWYgbm90IHNldFxuICAgICAgaGlkZWFibGU6IGNvbC5oaWRlYWJsZSAhPT0gZmFsc2UgLy8gRGVmYXVsdCB0byB0cnVlIGlmIG5vdCBzZXRcbiAgICB9KSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEtFWUJPQVJEIE5BVklHQVRJT04gJiBGT0NVUyBNQU5BR0VNRU5UXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU2V0IHRhYmxlIGRpbWVuc2lvbnMgZm9yIG5hdmlnYXRpb24gYm91bmRhcmllc1xuICAgKi9cbiAgc2V0RGltZW5zaW9ucyhyb3dDb3VudDogbnVtYmVyLCBjb2x1bW5Db3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcm93Q291bnQgPSByb3dDb3VudDtcbiAgICB0aGlzLl9jb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50O1xuICAgIFxuICAgIC8vIFVwZGF0ZSB0b3RhbCByb3dzIGluIHZhbGlkYXRpb24gc3RhdGVcbiAgICB0aGlzLnNldFZhbGlkYXRpb25Sb3dDb3VudChyb3dDb3VudCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb2N1cyBhIGNlbGwgYnkgcG9zaXRpb25cbiAgICovXG4gIGZvY3VzQ2VsbChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHJvd0luZGV4IDwgMCB8fCByb3dJbmRleCA+PSB0aGlzLl9yb3dDb3VudCkgcmV0dXJuO1xuICAgIGlmIChjb2x1bW5JbmRleCA8IDAgfHwgY29sdW1uSW5kZXggPj0gdGhpcy5fY29sdW1uQ291bnQpIHJldHVybjtcbiAgICBcbiAgICB0aGlzLl9mb2N1c2VkQ2VsbFBvc2l0aW9uJC5uZXh0KHsgcm93SW5kZXgsIGNvbHVtbkluZGV4IH0pO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdjZWxsLWZvY3VzJyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudGx5IGZvY3VzZWQgcG9zaXRpb25cbiAgICovXG4gIGdldEZvY3VzZWRQb3NpdGlvbigpOiBDZWxsRm9jdXNQb3NpdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9mb2N1c2VkQ2VsbFBvc2l0aW9uJC52YWx1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE5vdGlmeSB0aGF0IGEgY2VsbCBlbnRlcmVkIGVkaXQgbW9kZVxuICAgKi9cbiAgc2V0RWRpdGluZ0NlbGwocm93SW5kZXg6IG51bWJlciwgY29sdW1uSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRpbmdDZWxsUG9zaXRpb24kLm5leHQoeyByb3dJbmRleCwgY29sdW1uSW5kZXggfSk7XG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2UoJ2NlbGwtZWRpdC1zdGFydCcpO1xuICB9XG4gIFxuICAvKipcbiAgICogTm90aWZ5IHRoYXQgZWRpdCBtb2RlIGVuZGVkXG4gICAqL1xuICBjbGVhckVkaXRpbmdDZWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRpbmdDZWxsUG9zaXRpb24kLm5leHQobnVsbCk7XG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2UoJ2NlbGwtZWRpdC1lbmQnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGFueSBjZWxsIGlzIGN1cnJlbnRseSBlZGl0aW5nXG4gICAqL1xuICBpc0FueUNlbGxFZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lZGl0aW5nQ2VsbFBvc2l0aW9uJC52YWx1ZSAhPT0gbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgZWRpdGluZyBwb3NpdGlvblxuICAgKi9cbiAgZ2V0RWRpdGluZ1Bvc2l0aW9uKCk6IENlbGxGb2N1c1Bvc2l0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRpbmdDZWxsUG9zaXRpb24kLnZhbHVlO1xuICB9XG4gIFxuICAvKipcbiAgICogTW92ZSBmb2N1cyBpbiBhIGRpcmVjdGlvbiB1c2luZyBOYXZpZ2F0aW9uRGlyZWN0aW9uIGVudW1cbiAgICovXG4gIG1vdmVGb2N1cyhkaXJlY3Rpb246IE5hdmlnYXRpb25EaXJlY3Rpb24pOiBib29sZWFuIHtcbiAgICAvLyBCbG9jayBuYXZpZ2F0aW9uIGlmIGFueSBjZWxsIGlzIGVkaXRpbmdcbiAgICBpZiAodGhpcy5pc0FueUNlbGxFZGl0aW5nKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZvY3VzZWRDZWxsUG9zaXRpb24kLnZhbHVlO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIGxldCBuZXdSb3cgPSBjdXJyZW50LnJvd0luZGV4O1xuICAgIGxldCBuZXdDb2wgPSBjdXJyZW50LmNvbHVtbkluZGV4O1xuICAgIFxuICAgIC8vIFVzZSBOYXZpZ2F0aW9uRGlyZWN0aW9uIGVudW0gdmFsdWVzXG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgTmF2aWdhdGlvbkRpcmVjdGlvbi5VUDogbmV3Um93LS07IGJyZWFrO1xuICAgICAgY2FzZSBOYXZpZ2F0aW9uRGlyZWN0aW9uLkRPV046IG5ld1JvdysrOyBicmVhaztcbiAgICAgIGNhc2UgTmF2aWdhdGlvbkRpcmVjdGlvbi5MRUZUOiBuZXdDb2wtLTsgYnJlYWs7XG4gICAgICBjYXNlIE5hdmlnYXRpb25EaXJlY3Rpb24uUklHSFQ6IG5ld0NvbCsrOyBicmVhaztcbiAgICB9XG4gICAgXG4gICAgaWYgKG5ld1JvdyA8IDAgfHwgbmV3Um93ID49IHRoaXMuX3Jvd0NvdW50KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG5ld0NvbCA8IDAgfHwgbmV3Q29sID49IHRoaXMuX2NvbHVtbkNvdW50KSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgdGhpcy5mb2N1c0NlbGwobmV3Um93LCBuZXdDb2wpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgZm9jdXNcbiAgICovXG4gIGNsZWFyRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9jdXNlZENlbGxQb3NpdGlvbiQubmV4dChudWxsKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnY2VsbC1mb2N1cycpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgbmF2aWdhdGlvbiBpcyBhY3RpdmVcbiAgICovXG4gIGlzTmF2aWdhdGlvbkFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZENlbGxQb3NpdGlvbiQudmFsdWUgIT09IG51bGw7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZBTElEQVRJT04gU1RBVEUgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFxuICAvKipcbiAgICogVXBkYXRlIGNlbGwgdmFsaWRhdGlvbiBhbmQgYWNjdW11bGF0ZSBpbnRvIHJvdy90YWJsZSB2YWxpZGF0aW9uIHN0YXRlXG4gICAqIE9ubHkgc3RvcmVzIGludmFsaWQgc3RhdGVzIC0gdmFsaWQgcm93cyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkXG4gICAqL1xuICB1cGRhdGVDZWxsVmFsaWRhdGlvbihyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5LZXk6IHN0cmluZywgaXNWYWxpZDogYm9vbGVhbiwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLl90YWJsZVZhbGlkYXRpb25TdGF0ZSQudmFsdWU7XG4gICAgY29uc3Qgcm93U3RhdGVzID0gbmV3IE1hcChjdXJyZW50U3RhdGUucm93U3RhdGVzKTtcbiAgICBcbiAgICAvLyBHZXQgZXhpc3Rpbmcgcm93IHN0YXRlIChvbmx5IGV4aXN0cyBpZiByb3cgaGFzIGVycm9ycylcbiAgICBsZXQgcm93U3RhdGUgPSByb3dTdGF0ZXMuZ2V0KHJvd0luZGV4KTtcbiAgICBcbiAgICBpZiAoIWlzVmFsaWQgJiYgZXJyb3IpIHtcbiAgICAgIC8vIENlbGwgaXMgaW52YWxpZCAtIGFkZCBvciB1cGRhdGUgZXJyb3JcbiAgICAgIGlmICghcm93U3RhdGUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIG5ldyByb3cgc3RhdGUgZm9yIHRoaXMgaW52YWxpZCByb3dcbiAgICAgICAgcm93U3RhdGUgPSB7XG4gICAgICAgICAgcm93SW5kZXgsXG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgaW52YWxpZENlbGxDb3VudDogMSxcbiAgICAgICAgICBjZWxsRXJyb3JzOiBuZXcgTWFwKFtbY29sdW1uS2V5LCBlcnJvcl1dKSxcbiAgICAgICAgICBsYXN0VmFsaWRhdGVkOiBuZXcgRGF0ZSgpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZXhpc3Rpbmcgcm93IHN0YXRlXG4gICAgICAgIGNvbnN0IGNlbGxFcnJvcnMgPSBuZXcgTWFwKHJvd1N0YXRlLmNlbGxFcnJvcnMpO1xuICAgICAgICBjZWxsRXJyb3JzLnNldChjb2x1bW5LZXksIGVycm9yKTtcbiAgICAgICAgXG4gICAgICAgIHJvd1N0YXRlID0ge1xuICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGludmFsaWRDZWxsQ291bnQ6IGNlbGxFcnJvcnMuc2l6ZSxcbiAgICAgICAgICBjZWxsRXJyb3JzLFxuICAgICAgICAgIGxhc3RWYWxpZGF0ZWQ6IG5ldyBEYXRlKClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJvd1N0YXRlcy5zZXQocm93SW5kZXgsIHJvd1N0YXRlKTtcbiAgICAgIFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDZWxsIGlzIHZhbGlkIC0gcmVtb3ZlIGVycm9yIGlmIGl0IGV4aXN0c1xuICAgICAgaWYgKHJvd1N0YXRlKSB7XG4gICAgICAgIGNvbnN0IGNlbGxFcnJvcnMgPSBuZXcgTWFwKHJvd1N0YXRlLmNlbGxFcnJvcnMpO1xuICAgICAgICBjZWxsRXJyb3JzLmRlbGV0ZShjb2x1bW5LZXkpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNlbGxFcnJvcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIC8vIE5vIG1vcmUgZXJyb3JzIGluIHRoaXMgcm93IC0gcmVtb3ZlIHJvdyBzdGF0ZSBjb21wbGV0ZWx5XG4gICAgICAgICAgcm93U3RhdGVzLmRlbGV0ZShyb3dJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RpbGwgaGFzIG90aGVyIGVycm9ycyAtIHVwZGF0ZSByb3cgc3RhdGVcbiAgICAgICAgICByb3dTdGF0ZSA9IHtcbiAgICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBpbnZhbGlkQ2VsbENvdW50OiBjZWxsRXJyb3JzLnNpemUsXG4gICAgICAgICAgICBjZWxsRXJyb3JzLFxuICAgICAgICAgICAgbGFzdFZhbGlkYXRlZDogbmV3IERhdGUoKVxuICAgICAgICAgIH07XG4gICAgICAgICAgcm93U3RhdGVzLnNldChyb3dJbmRleCwgcm93U3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBJZiByb3dTdGF0ZSBkb2Vzbid0IGV4aXN0LCBjZWxsIHdhcyBhbHJlYWR5IHZhbGlkIC0gZG8gbm90aGluZ1xuICAgIH1cbiAgICBcbiAgICAvLyBSZWNhbGN1bGF0ZSB0YWJsZSBzdGF0ZVxuICAgIC8vIEFsbCByb3dzIGluIHJvd1N0YXRlcyBtYXAgYXJlIGludmFsaWQgYnkgZGVmaW5pdGlvblxuICAgIGNvbnN0IGludmFsaWRSb3dzID0gcm93U3RhdGVzLnNpemU7XG4gICAgXG4gICAgY29uc3QgbmV3VGFibGVTdGF0ZTogVGFibGVWYWxpZGF0aW9uU3RhdGUgPSB7XG4gICAgICBpc1ZhbGlkOiBpbnZhbGlkUm93cyA9PT0gMCxcbiAgICAgIHRvdGFsUm93czogY3VycmVudFN0YXRlLnRvdGFsUm93cywgLy8gS2VlcCB0cmFjayBvZiB0b3RhbCByb3dzIHNlcGFyYXRlbHlcbiAgICAgIHZhbGlkUm93czogY3VycmVudFN0YXRlLnRvdGFsUm93cyAtIGludmFsaWRSb3dzLFxuICAgICAgaW52YWxpZFJvd3MsXG4gICAgICByb3dTdGF0ZXMsXG4gICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBuZXcgc3RhdGVcbiAgICB0aGlzLl90YWJsZVZhbGlkYXRpb25TdGF0ZSQubmV4dChuZXdUYWJsZVN0YXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHRhYmxlIHZhbGlkYXRpb24gc3RhdGVcbiAgICovXG4gIGdldFRhYmxlVmFsaWRhdGlvblN0YXRlKCk6IFRhYmxlVmFsaWRhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVWYWxpZGF0aW9uU3RhdGUkLnZhbHVlO1xuICB9XG4gIFxuICAvKipcbiAgICogU2V0IHRvdGFsIHJvd3MgZm9yIHZhbGlkYXRpb24gc3RhdGUgdHJhY2tpbmdcbiAgICovXG4gIHNldFZhbGlkYXRpb25Sb3dDb3VudCh0b3RhbFJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuX3RhYmxlVmFsaWRhdGlvblN0YXRlJC52YWx1ZTtcbiAgICB0aGlzLl90YWJsZVZhbGlkYXRpb25TdGF0ZSQubmV4dCh7XG4gICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICB0b3RhbFJvd3MsXG4gICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTVEFURSBSRVNFVFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRvIGluaXRpYWwgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldFBhZ2luYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0QWxsU29ydGluZygpO1xuICAgIHRoaXMucmVzZXRBbGxGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcGFnaW5hdGlvbiBvbmx5XG4gICAqL1xuICByZXNldFBhZ2luYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fcGFnaW5hdGlvbiQubmV4dCh7XG4gICAgICBjdXJyZW50UGFnZTogdGhpcy5faW5pdGlhbENvbmZpZy5pbml0aWFsUGFnZSEsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5faW5pdGlhbENvbmZpZy5wYWdlU2l6ZSEsXG4gICAgICB0b3RhbEl0ZW1zOiAwLFxuICAgICAgdG90YWxQYWdlczogMFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdwYWdpbmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIGNvbHVtbiBzb3J0c1xuICAgKi9cbiAgcmVzZXRBbGxTb3J0aW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBbGxTb3J0aW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIGNvbHVtbiBmaWx0ZXJzXG4gICAqL1xuICByZXNldEFsbEZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckFsbEZpbHRlcnMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5URVJOQUwgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBjb2x1bW4gYnkga2V5XG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcmV0dXJucyBDb2x1bW4gY29uZmlnIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kQ29sdW1uKGNvbHVtbktleTogc3RyaW5nKTogQ29sdW1uQ29uZmlnPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5rZXkgPT09IGNvbHVtbktleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqIEBwYXJhbSB0b3RhbEl0ZW1zIFRvdGFsIG51bWJlciBvZiBpdGVtc1xuICAgKiBAcGFyYW0gcGFnZVNpemUgUGFnZSBzaXplXG4gICAqIEByZXR1cm5zIFRvdGFsIG51bWJlciBvZiBwYWdlc1xuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVUb3RhbFBhZ2VzKHRvdGFsSXRlbXM6IG51bWJlciA9IDAsIHBhZ2VTaXplOiBudW1iZXIgPSAyNSk6IG51bWJlciB7XG4gICAgaWYgKHRvdGFsSXRlbXMgPT09IDAgfHwgcGFnZVNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5jZWlsKHRvdGFsSXRlbXMgLyBwYWdlU2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBzdGF0ZSBjaGFuZ2UgZXZlbnRcbiAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBjaGFuZ2VcbiAgICovXG4gIHByaXZhdGUgZW1pdFN0YXRlQ2hhbmdlKHR5cGU6IFRhYmxlU3RhdGVDaGFuZ2VFdmVudFsndHlwZSddKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJ1aWxkU3RhdGVTbmFwc2hvdCgpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlJC5uZXh0KHtcbiAgICAgIHR5cGUsXG4gICAgICBzdGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHN0YXRlIHNuYXBzaG90IGZyb20gY3VycmVudCBzdGF0ZVxuICAgKiBAcmV0dXJucyBTdGF0ZSBzbmFwc2hvdFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFN0YXRlU25hcHNob3QoKTogVGFibGVTdGF0ZVNuYXBzaG90IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnaW5hdGlvbjogdGhpcy5nZXRQYWdpbmF0aW9uKCksXG4gICAgICBcbiAgICAgIC8vIEJ1aWxkIGZ1bGwgc29ydCBzdGF0ZSB3aXRoIGRpcmVjdGlvbiBhbmQgcHJpb3JpdHlcbiAgICAgIHNvcnRlZENvbHVtbnM6IHRoaXMuX2NvbHVtbnNcbiAgICAgICAgLmZpbHRlcihjb2wgPT4gY29sLnNvcnRFbmFibGVkID09PSB0cnVlKVxuICAgICAgICAubWFwKChjb2wsIGluZGV4KSA9PiAoe1xuICAgICAgICAgIGNvbHVtbktleTogY29sLmtleSxcbiAgICAgICAgICBkaXJlY3Rpb246IGNvbC5zb3J0RGlyZWN0aW9uIHx8IFNvcnREaXJlY3Rpb24uTk9ORSxcbiAgICAgICAgICBwcmlvcml0eTogaW5kZXggIC8vIFNvcnQgb3JkZXIgYmFzZWQgb24gZW5hYmxlbWVudCBvcmRlclxuICAgICAgICB9KSksXG4gICAgICBcbiAgICAgIC8vIEJ1aWxkIGZ1bGwgZmlsdGVyIHN0YXRlIHdpdGggb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAgICBmaWx0ZXJlZENvbHVtbnM6IHRoaXMuX2NvbHVtbnNcbiAgICAgICAgLmZpbHRlcihjb2wgPT4gY29sLmZpbHRlckNvbmZpZz8uZW5hYmxlZCA9PT0gdHJ1ZSlcbiAgICAgICAgLm1hcChjb2wgPT4gKHtcbiAgICAgICAgICBjb2x1bW5LZXk6IGNvbC5rZXksXG4gICAgICAgICAgb3BlcmF0b3I6IGNvbC5maWx0ZXJDb25maWc/Lm9wZXJhdG9yIHx8IEZpbHRlck9wZXJhdG9yLkNPTlRBSU5TLFxuICAgICAgICAgIHZhbHVlOiBjb2wuZmlsdGVyQ29uZmlnPy52YWx1ZSxcbiAgICAgICAgICBlbmFibGVkOiB0cnVlXG4gICAgICAgIH0pKVxuICAgIH07XG4gIH1cbn1cblxuIl19
|
|
871
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc3RhdGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL21vZGVscy90YWJsZS1zdGF0ZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUVMLGFBQWEsRUFDYixjQUFjLEVBSWYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJOUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUEwRHJCOzs7O09BSUc7SUFDSCxZQUFZLE9BQTRCLEVBQUUsTUFBeUI7UUFsRG5FLHdEQUF3RDtRQUNoRCxvQkFBZSxHQUFXLENBQUMsQ0FBQztRQUVwQyxzREFBc0Q7UUFDOUMseUJBQW9CLEdBQVcsQ0FBQyxDQUFDO1FBa0J6QyxrREFBa0Q7UUFDbEQsbUVBQW1FO1FBQzNELDZCQUF3QixHQUFtQyxJQUFJLENBQUM7UUFFeEUsbUNBQW1DO1FBQzNCLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFDdEIsaUJBQVksR0FBVyxDQUFDLENBQUM7UUF1Qi9CLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDcEIsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLElBQUksQ0FBQztZQUNyQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsSUFBSSxFQUFFO1NBQ2pDLENBQUM7UUFFRiw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBa0I7WUFDdkQsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBWTtZQUM3QyxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFTO1lBQ3ZDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsVUFBVSxFQUFFLENBQUM7U0FDZCxDQUFDLENBQUM7UUFFSCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztRQUUxRCxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksZUFBZSxDQUEyQixJQUFJLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXRFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLGVBQWUsQ0FBMkIsSUFBSSxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV0RSw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUF1QjtZQUN0RSxPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osU0FBUyxFQUFFLENBQUM7WUFDWixXQUFXLEVBQUUsQ0FBQztZQUNkLFNBQVMsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNwQixXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV4RSxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBMkIsQ0FBQztRQUM5RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFMUQsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFcEUsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FDNUQsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDNUIsQ0FBQyxDQUFDLFdBQVcsS0FBSyxDQUFDLENBQUMsV0FBVztZQUMvQixDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRO1lBQ3pCLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FDOUIsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDbEMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQ3JDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFdEQsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsdUJBQXVCO0lBQ3ZCLCtFQUErRTtJQUUvRTs7T0FFRztJQUNILFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLHFCQUFxQjtJQUNyQiwrRUFBK0U7SUFFL0U7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLElBQVk7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDN0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLElBQUksb0JBQW9CLFlBQVksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNyQixHQUFHLFlBQVk7WUFDZixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsSUFBWTtRQUN0QixJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLDJCQUEyQixDQUFDLENBQUM7WUFDcEUsT0FBTztTQUNSO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDckIsV0FBVyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVTtZQUNuQyxVQUFVLEVBQUUsYUFBYTtTQUMxQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsS0FBYTtRQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNyQixHQUFHLFlBQVk7WUFDZixVQUFVLEVBQUUsS0FBSztZQUNqQixVQUFVLEVBQUUsYUFBYTtTQUMxQixDQUFDLENBQUM7UUFDSCxnRUFBZ0U7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDN0MsSUFBSSxZQUFZLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDM0M7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDN0MsT0FBTyxZQUFZLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUM3QyxPQUFPLFlBQVksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsOENBQThDO0lBQzlDLCtFQUErRTtJQUUvRTs7OztPQUlHO0lBQ0gsZUFBZSxDQUFDLFNBQWlCLEVBQUUsU0FBd0I7UUFDekQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMvQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxTQUFTLGtCQUFrQixDQUFDLENBQUM7WUFDcEQsT0FBTztTQUNSO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pCLEdBQUcsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDdkMsR0FBRyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7YUFDekI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixNQUFNLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUNqQyxNQUFNLENBQUMsV0FBVyxHQUFHLFNBQVMsS0FBSyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBRXRELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsU0FBaUIsRUFBRSxTQUF3QjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLE9BQU87U0FDUjtRQUVELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7WUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLFNBQVMsa0JBQWtCLENBQUMsQ0FBQztZQUNwRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUNqQyxNQUFNLENBQUMsV0FBVyxHQUFHLFNBQVMsS0FBSyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBRXRELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQixDQUFDLFNBQWlCO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDL0MsT0FBTztTQUNSO1FBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRTtZQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3BELE9BQU87U0FDUjtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ3BFLElBQUksWUFBMkIsQ0FBQztRQUVoQyxRQUFRLGdCQUFnQixFQUFFO1lBQ3hCLEtBQUssYUFBYSxDQUFDLElBQUk7Z0JBQ3JCLFlBQVksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO2dCQUNqQyxNQUFNO1lBQ1IsS0FBSyxhQUFhLENBQUMsR0FBRztnQkFDcEIsWUFBWSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xDLE1BQU07WUFDUixLQUFLLGFBQWEsQ0FBQyxJQUFJO2dCQUNyQixZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDbEMsTUFBTTtZQUNSO2dCQUNFLFlBQVksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO1NBQ3BDO1FBRUQsTUFBTSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDcEMsTUFBTSxDQUFDLFdBQVcsR0FBRyxZQUFZLEtBQUssYUFBYSxDQUFDLElBQUksQ0FBQztRQUV6RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUIsR0FBRyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTztZQUNMLFNBQVMsRUFBRSxNQUFNLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxJQUFJO1lBQ3JELE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxJQUFJLEtBQUs7U0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsZ0RBQWdEO0lBQ2hELCtFQUErRTtJQUUvRTs7Ozs7T0FLRztJQUNILGlCQUFpQixDQUFDLFNBQWlCLEVBQUUsUUFBd0IsRUFBRSxLQUFVO1FBQ3ZFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDL0MsT0FBTztTQUNSO1FBRUQsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRTtZQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3RELE9BQU87U0FDUjtRQUVELDhDQUE4QztRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtZQUN4QixNQUFNLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztTQUMxQjtRQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN4QyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRW5DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUIsQ0FBQyxTQUFpQjtRQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLE9BQU87U0FDUjtRQUVELHVGQUF1RjtRQUN2RixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtZQUN4QixNQUFNLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztTQUMxQjtRQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUN0QyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFcEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLHVGQUF1RjtZQUN2RixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRTtnQkFDckIsR0FBRyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7YUFDdkI7WUFFRCxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7WUFDbkMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLE9BQWdCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDL0MsT0FBTztTQUNSO1FBRUQsOENBQThDO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1NBQzFCO1FBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXRDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxTQUFpQjtRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTztZQUNMLFFBQVEsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLFFBQVEsSUFBSSxjQUFjLENBQUMsUUFBUTtZQUNsRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLO1lBQ2pDLE9BQU8sRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sSUFBSSxLQUFLO1NBQy9DLENBQUM7SUFDSixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLDJCQUEyQjtJQUMzQiwrRUFBK0U7SUFFL0U7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUM7YUFDcEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDO2FBQ3JDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZUFBZSxDQUFDLFNBQWlCLEVBQUUsUUFBa0M7UUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMvQyxPQUFPO1NBQ1I7UUFFQSxNQUFjLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHNCQUFzQixDQUFDLGNBQXVCLEVBQUUsbUJBQTRCO1FBQzFFLDZDQUE2QztRQUM3QyxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7U0FDdkM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7WUFDckMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDO1NBQ2pEO1FBRUQsZ0NBQWdDO1FBQ2hDLHNDQUFzQztRQUN0QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUU7Z0JBQ3hCLEdBQVcsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDO2dCQUN2QyxVQUFVLElBQUssR0FBRyxDQUFDLEtBQWdCLElBQUksR0FBRyxDQUFDO2FBQzVDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxpQ0FBaUM7UUFDakMseURBQXlEO1FBQ3pELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRTtnQkFDekIsR0FBVyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7Z0JBQ3hDLFdBQVcsSUFBSyxHQUFHLENBQUMsS0FBZ0IsSUFBSSxHQUFHLENBQUM7YUFDN0M7U0FDRjtJQUNILENBQUM7SUFFRCwrRUFBK0U7SUFDL0Usb0JBQW9CO0lBQ3BCLCtFQUErRTtJQUUvRTs7O09BR0c7SUFDSCxhQUFhLENBQUMsT0FBNEI7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsK0VBQStFO0lBQy9FLDRCQUE0QjtJQUM1QiwrRUFBK0U7SUFFL0U7OztPQUdHO0lBQ0gsc0JBQXNCLENBQUMsU0FBaUI7UUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMvQyxPQUFPO1NBQ1I7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRTtZQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsU0FBUyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ3pFLE9BQU87U0FDUjtRQUVELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDaEYsTUFBYyxDQUFDLE9BQU8sR0FBRyxDQUFDLGlCQUFpQixDQUFDO1FBQzdDLElBQUksQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFNBQWlCLEVBQUUsT0FBZ0I7UUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMvQyxPQUFPO1NBQ1I7UUFFRCx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRTtZQUN6QyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsU0FBUyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ3pFLE9BQU87U0FDUjtRQUVBLE1BQWMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7SUFDMUYsQ0FBQztJQUVEOzs7T0FHRztJQUNILHVCQUF1QjtRQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvQixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDWixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRztZQUM3QixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sS0FBSyxLQUFLO1lBQzlCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyw2QkFBNkI7U0FDL0QsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLHlDQUF5QztJQUN6QywrRUFBK0U7SUFFL0U7O09BRUc7SUFDSCxhQUFhLENBQUMsUUFBZ0IsRUFBRSxXQUFtQjtRQUNqRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFFaEMsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVyQywyREFBMkQ7UUFDM0QsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksUUFBUSxHQUFHLGdCQUFnQixFQUFFO1lBQ2hFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDdEQseURBQXlEO1lBQ3pELE1BQU0sV0FBVyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxDQUFDLHNCQUFzQjtZQUU1RCx1Q0FBdUM7WUFDdkMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDUDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO1FBQzdDLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQ3ZELElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBRWhFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLFFBQWdCLEVBQUUsV0FBbUI7UUFDbEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLFNBQThCLEVBQUUsMEJBQW1DLEtBQUs7UUFDaEYsMENBQTBDO1FBQzFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUzQixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFFakMsc0NBQXNDO1FBQ3RDLFFBQVEsU0FBUyxFQUFFO1lBQ2pCLEtBQUssbUJBQW1CLENBQUMsRUFBRTtnQkFBRSxNQUFNLEVBQUUsQ0FBQztnQkFBQyxNQUFNO1lBQzdDLEtBQUssbUJBQW1CLENBQUMsSUFBSTtnQkFBRSxNQUFNLEVBQUUsQ0FBQztnQkFBQyxNQUFNO1lBQy9DLEtBQUssbUJBQW1CLENBQUMsSUFBSTtnQkFBRSxNQUFNLEVBQUUsQ0FBQztnQkFBQyxNQUFNO1lBQy9DLEtBQUssbUJBQW1CLENBQUMsS0FBSztnQkFBRSxNQUFNLEVBQUUsQ0FBQztnQkFBQyxNQUFNO1NBQ2pEO1FBRUQsMkRBQTJEO1FBQzNELElBQUksU0FBUyxLQUFLLG1CQUFtQixDQUFDLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN0RSxJQUFJLHVCQUF1QixFQUFFO2dCQUMzQixvREFBb0Q7Z0JBQ3BELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JFLG1FQUFtRTtnQkFDbkUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDakU7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3pELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU1RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssS0FBSyxJQUFJLENBQUM7SUFDbkQsQ0FBQztJQUVELCtFQUErRTtJQUMvRSwyQkFBMkI7SUFDM0IsK0VBQStFO0lBRS9FOzs7T0FHRztJQUNILG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxPQUFnQixFQUFFLEtBQWM7UUFDeEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQztRQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEQseURBQXlEO1FBQ3pELElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUU7WUFDckIsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsNENBQTRDO2dCQUM1QyxRQUFRLEdBQUc7b0JBQ1QsUUFBUTtvQkFDUixPQUFPLEVBQUUsS0FBSztvQkFDZCxnQkFBZ0IsRUFBRSxDQUFDO29CQUNuQixVQUFVLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUU7aUJBQzFCLENBQUM7YUFDSDtpQkFBTTtnQkFDTCw0QkFBNEI7Z0JBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDaEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRWpDLFFBQVEsR0FBRztvQkFDVCxRQUFRO29CQUNSLE9BQU8sRUFBRSxLQUFLO29CQUNkLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxJQUFJO29CQUNqQyxVQUFVO29CQUNWLGFBQWEsRUFBRSxJQUFJLElBQUksRUFBRTtpQkFDMUIsQ0FBQzthQUNIO1lBQ0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FFbkM7YUFBTTtZQUNMLDRDQUE0QztZQUM1QyxJQUFJLFFBQVEsRUFBRTtnQkFDWixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2hELFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRTdCLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLDJEQUEyRDtvQkFDM0QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0wsNENBQTRDO29CQUM1QyxRQUFRLEdBQUc7d0JBQ1QsUUFBUTt3QkFDUixPQUFPLEVBQUUsS0FBSzt3QkFDZCxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsSUFBSTt3QkFDakMsVUFBVTt3QkFDVixhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUU7cUJBQzFCLENBQUM7b0JBQ0YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ25DO2FBQ0Y7WUFDRCxpRUFBaUU7U0FDbEU7UUFFRCwwQkFBMEI7UUFDMUIsc0RBQXNEO1FBQ3RELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFFbkMsTUFBTSxhQUFhLEdBQXlCO1lBQzFDLE9BQU8sRUFBRSxXQUFXLEtBQUssQ0FBQztZQUMxQixTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7WUFDakMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLEdBQUcsV0FBVztZQUMvQyxXQUFXO1lBQ1gsU0FBUztZQUNULFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtTQUN4QixDQUFDO1FBRUYsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBcUIsQ0FBQyxTQUFpQjtRQUNyQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7WUFDL0IsR0FBRyxZQUFZO1lBQ2YsU0FBUztZQUNULFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtTQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsK0VBQStFO0lBQy9FLGNBQWM7SUFDZCwrRUFBK0U7SUFFL0U7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVk7WUFDN0MsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUztZQUN2QyxVQUFVLEVBQUUsQ0FBQztZQUNiLFVBQVUsRUFBRSxDQUFDO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxtQkFBbUI7SUFDbkIsK0VBQStFO0lBRS9FOzs7O09BSUc7SUFDSyxVQUFVLENBQUMsU0FBaUI7UUFDbEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssbUJBQW1CLENBQUMsYUFBcUIsQ0FBQyxFQUFFLFdBQW1CLEVBQUU7UUFDdkUsSUFBSSxVQUFVLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDdEMsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGVBQWUsQ0FBQyxJQUFtQztRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUN0QixJQUFJO1lBQ0osS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxrQkFBa0I7UUFDeEIsT0FBTztZQUNMLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBRWhDLG9EQUFvRDtZQUNwRCxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDO2lCQUN2QyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUc7Z0JBQ2xCLFNBQVMsRUFBRSxHQUFHLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxJQUFJO2dCQUNsRCxRQUFRLEVBQUUsS0FBSyxDQUFFLHVDQUF1QzthQUN6RCxDQUFDLENBQUM7WUFFTCxrREFBa0Q7WUFDbEQsZUFBZSxFQUFFLElBQUksQ0FBQyxRQUFRO2lCQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sS0FBSyxJQUFJLENBQUM7aUJBQ2pELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1gsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHO2dCQUNsQixRQUFRLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxRQUFRLElBQUksY0FBYyxDQUFDLFFBQVE7Z0JBQy9ELEtBQUssRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLEtBQUs7Z0JBQzlCLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQyxDQUFDO1NBQ04sQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGFibGVTdGF0ZSAtIFJlYWN0aXZlIHN0YXRlIG1hbmFnZW1lbnQgZm9yIHRhYmxlIG9wZXJhdGlvbnNcbiAqIEV2ZW50LWRyaXZlbiBhcmNoaXRlY3R1cmU6IHRyYWNrcyBzdGF0ZSwgZW1pdHMgZXZlbnRzLCBjb25zdW1lciBoYW5kbGVzIGFzeW5jIGRhdGEgb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy9jb2x1bW4tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBcbiAgUGFnaW5hdGlvblN0YXRlLCBcbiAgU29ydERpcmVjdGlvbiwgXG4gIEZpbHRlck9wZXJhdG9yLFxuICBUYWJsZVN0YXRlQ2hhbmdlRXZlbnQsXG4gIFRhYmxlU3RhdGVTbmFwc2hvdCxcbiAgQ2VsbEZvY3VzUG9zaXRpb25cbn0gZnJvbSAnLi90YWJsZS10eXBlcyc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlQ29uZmlnIH0gZnJvbSAnLi90YWJsZS1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkRpcmVjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9jZWxsLXR5cGVzJztcbmltcG9ydCB7IFJvd1ZhbGlkYXRpb25TdGF0ZSB9IGZyb20gJy4vcm93LXZhbGlkYXRpb24tc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRhYmxlVmFsaWRhdGlvblN0YXRlIH0gZnJvbSAnLi90YWJsZS12YWxpZGF0aW9uLXN0YXRlLmludGVyZmFjZSc7XG5cbi8qKlxuICogVGFibGVTdGF0ZSBjbGFzcyAtIENvbHVtbi1kcml2ZW4sIGV2ZW50LWVtaXR0aW5nIHN0YXRlIG1hbmFnZW1lbnRcbiAqIE5PIGRhdGEgbWFuaXB1bGF0aW9uIC0gb25seSBzdGF0ZSB0cmFja2luZyBhbmQgZXZlbnQgZW1pc3Npb25cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlU3RhdGUge1xuICAvLyBSZWZlcmVuY2UgdG8gY29sdW1ucyBhcnJheSAoY29sdW1uLWRyaXZlbiBhcmNoaXRlY3R1cmUpXG4gIHByaXZhdGUgX2NvbHVtbnM6IENvbHVtbkNvbmZpZzxhbnk+W107XG4gIFxuICAvLyBQYWdpbmF0aW9uIHN0YXRlXG4gIHByaXZhdGUgX3BhZ2luYXRpb24kOiBCZWhhdmlvclN1YmplY3Q8UGFnaW5hdGlvblN0YXRlPjtcbiAgXG4gIC8vIFN0YXRlIGNoYW5nZSBldmVudHNcbiAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2UkOiBTdWJqZWN0PFRhYmxlU3RhdGVDaGFuZ2VFdmVudD47XG4gIFxuICAvLyBJbml0aWFsIGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbmZpZzogVGFibGVTdGF0ZUNvbmZpZztcbiAgXG4gIC8vIFJvdyBudW1iZXIgY29sdW1uIHdpZHRoIGZvciBzdGlja3kgb2Zmc2V0IGNhbGN1bGF0aW9uXG4gIHByaXZhdGUgX3Jvd051bWJlcldpZHRoOiBudW1iZXIgPSAwO1xuXG4gIC8vIFNldHRpbmdzIGNvbHVtbiB3aWR0aCBmb3Igc3RpY2t5IG9mZnNldCBjYWxjdWxhdGlvblxuICBwcml2YXRlIF9zZXR0aW5nc0NvbHVtbldpZHRoOiBudW1iZXIgPSAwO1xuICBcbiAgLy8gRm9jdXMgcG9zaXRpb24gdHJhY2tpbmdcbiAgcHJpdmF0ZSBfZm9jdXNlZENlbGxQb3NpdGlvbiQ6IEJlaGF2aW9yU3ViamVjdDxDZWxsRm9jdXNQb3NpdGlvbiB8IG51bGw+O1xuICBwdWJsaWMgcmVhZG9ubHkgZm9jdXNlZENlbGxQb3NpdGlvbiQ6IE9ic2VydmFibGU8Q2VsbEZvY3VzUG9zaXRpb24gfCBudWxsPjtcbiAgXG4gIC8vIEVkaXRpbmcgcG9zaXRpb24gdHJhY2tpbmdcbiAgcHJpdmF0ZSBfZWRpdGluZ0NlbGxQb3NpdGlvbiQ6IEJlaGF2aW9yU3ViamVjdDxDZWxsRm9jdXNQb3NpdGlvbiB8IG51bGw+O1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdGluZ0NlbGxQb3NpdGlvbiQ6IE9ic2VydmFibGU8Q2VsbEZvY3VzUG9zaXRpb24gfCBudWxsPjtcbiAgXG4gIC8vIFZhbGlkYXRpb24gc3RhdGUgdHJhY2tpbmdcbiAgcHJpdmF0ZSBfdGFibGVWYWxpZGF0aW9uU3RhdGUkOiBCZWhhdmlvclN1YmplY3Q8VGFibGVWYWxpZGF0aW9uU3RhdGU+O1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVWYWxpZGF0aW9uU3RhdGUkOiBPYnNlcnZhYmxlPFRhYmxlVmFsaWRhdGlvblN0YXRlPjtcbiAgXG4gIC8vIFJlcXVlc3QgdG8gYWRkIGEgbmV3IHJvdyAoZW1pdHRlZCB3aGVuIG5hdmlnYXRpbmcgcGFzdCBsYXN0IHJvdylcbiAgcHJpdmF0ZSBfcmVxdWVzdEFkZFJvdyQ6IFN1YmplY3Q8eyBmb2N1c0NvbHVtbjogbnVtYmVyIH0+O1xuICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdEFkZFJvdyQ6IE9ic2VydmFibGU8eyBmb2N1c0NvbHVtbjogbnVtYmVyIH0+O1xuICBcbiAgLy8gUGVuZGluZyBmb2N1cyBwb3NpdGlvbiBhZnRlciBhIG5ldyByb3cgaXMgYWRkZWRcbiAgLy8gU2V0IHdoZW4gcmVxdWVzdEFkZFJvdyBpcyBlbWl0dGVkLCBjbGVhcmVkIHdoZW4gZm9jdXMgaXMgYXBwbGllZFxuICBwcml2YXRlIF9wZW5kaW5nRm9jdXNBZnRlclJvd0FkZDogeyBjb2x1bW5JbmRleDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIERpbWVuc2lvbnMgZm9yIGJvdW5kYXJ5IGNoZWNraW5nXG4gIHByaXZhdGUgX3Jvd0NvdW50OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jb2x1bW5Db3VudDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBvZiBjb21wbGV0ZSBzdGF0ZSBzbmFwc2hvdFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlJDogT2JzZXJ2YWJsZTxUYWJsZVN0YXRlU25hcHNob3Q+O1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIHN0YXRlIGNoYW5nZSBldmVudHNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZUNoYW5nZSQ6IE9ic2VydmFibGU8VGFibGVTdGF0ZUNoYW5nZUV2ZW50PjtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBvZiBwYWdpbmF0aW9uIHN0YXRlIGNoYW5nZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdpbmF0aW9uQ2hhbmdlJDogT2JzZXJ2YWJsZTxQYWdpbmF0aW9uU3RhdGU+O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gY29sdW1ucyBSZWZlcmVuY2UgdG8gY29sdW1ucyBhcnJheVxuICAgKiBAcGFyYW0gY29uZmlnIEluaXRpYWwgY29uZmlndXJhdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3IoY29sdW1uczogQ29sdW1uQ29uZmlnPGFueT5bXSwgY29uZmlnPzogVGFibGVTdGF0ZUNvbmZpZykge1xuICAgIHRoaXMuX2NvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMuX2luaXRpYWxDb25maWcgPSB7XG4gICAgICBpbml0aWFsUGFnZTogY29uZmlnPy5pbml0aWFsUGFnZSA/PyAwLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZz8ucGFnZVNpemUgPz8gMjVcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBwYWdpbmF0aW9uIHN0YXRlXG4gICAgdGhpcy5fcGFnaW5hdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhZ2luYXRpb25TdGF0ZT4oe1xuICAgICAgY3VycmVudFBhZ2U6IHRoaXMuX2luaXRpYWxDb25maWcuaW5pdGlhbFBhZ2UhLFxuICAgICAgcGFnZVNpemU6IHRoaXMuX2luaXRpYWxDb25maWcucGFnZVNpemUhLFxuICAgICAgdG90YWxJdGVtczogMCxcbiAgICAgIHRvdGFsUGFnZXM6IDBcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhdGUgY2hhbmdlIHN1YmplY3RcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZSQgPSBuZXcgU3ViamVjdDxUYWJsZVN0YXRlQ2hhbmdlRXZlbnQ+KCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBmb2N1cyBhbmQgZWRpdGluZyBwb3NpdGlvbiB0cmFja2luZ1xuICAgIHRoaXMuX2ZvY3VzZWRDZWxsUG9zaXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDZWxsRm9jdXNQb3NpdGlvbiB8IG51bGw+KG51bGwpO1xuICAgIHRoaXMuZm9jdXNlZENlbGxQb3NpdGlvbiQgPSB0aGlzLl9mb2N1c2VkQ2VsbFBvc2l0aW9uJC5hc09ic2VydmFibGUoKTtcbiAgICBcbiAgICB0aGlzLl9lZGl0aW5nQ2VsbFBvc2l0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2VsbEZvY3VzUG9zaXRpb24gfCBudWxsPihudWxsKTtcbiAgICB0aGlzLmVkaXRpbmdDZWxsUG9zaXRpb24kID0gdGhpcy5fZWRpdGluZ0NlbGxQb3NpdGlvbiQuYXNPYnNlcnZhYmxlKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB2YWxpZGF0aW9uIHN0YXRlXG4gICAgdGhpcy5fdGFibGVWYWxpZGF0aW9uU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVZhbGlkYXRpb25TdGF0ZT4oe1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIHRvdGFsUm93czogMCxcbiAgICAgIHZhbGlkUm93czogMCxcbiAgICAgIGludmFsaWRSb3dzOiAwLFxuICAgICAgcm93U3RhdGVzOiBuZXcgTWFwKCksXG4gICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH0pO1xuICAgIHRoaXMudGFibGVWYWxpZGF0aW9uU3RhdGUkID0gdGhpcy5fdGFibGVWYWxpZGF0aW9uU3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgcmVxdWVzdCBhZGQgcm93IHN1YmplY3RcbiAgICB0aGlzLl9yZXF1ZXN0QWRkUm93JCA9IG5ldyBTdWJqZWN0PHsgZm9jdXNDb2x1bW46IG51bWJlciB9PigpO1xuICAgIHRoaXMucmVxdWVzdEFkZFJvdyQgPSB0aGlzLl9yZXF1ZXN0QWRkUm93JC5hc09ic2VydmFibGUoKTtcbiAgICBcbiAgICB0aGlzLl9jb2x1bW5Db3VudCA9IGNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlICE9PSBmYWxzZSkubGVuZ3RoO1xuXG4gICAgLy8gU2V0dXAgb2JzZXJ2YWJsZXNcbiAgICB0aGlzLnBhZ2luYXRpb25DaGFuZ2UkID0gdGhpcy5fcGFnaW5hdGlvbiQuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBcbiAgICAgICAgYS5jdXJyZW50UGFnZSA9PT0gYi5jdXJyZW50UGFnZSAmJiBcbiAgICAgICAgYS5wYWdlU2l6ZSA9PT0gYi5wYWdlU2l6ZSAmJlxuICAgICAgICBhLnRvdGFsSXRlbXMgPT09IGIudG90YWxJdGVtc1xuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLnN0YXRlJCA9IHRoaXMuX3BhZ2luYXRpb24kLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gdGhpcy5idWlsZFN0YXRlU25hcHNob3QoKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdGF0ZUNoYW5nZSQgPSB0aGlzLl9zdGF0ZUNoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgXG4gICAgLy8gQ2xlYXIgZm9jdXMvZWRpdGluZyBvbiBwYWdpbmF0aW9uIGNoYW5nZXNcbiAgICB0aGlzLnBhZ2luYXRpb25DaGFuZ2UkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNsZWFyRm9jdXMoKTtcbiAgICAgIHRoaXMuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTVEFURSBBQ0NFU1MgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHN0YXRlIHNuYXBzaG90XG4gICAqL1xuICBnZXRTdGF0ZSgpOiBUYWJsZVN0YXRlU25hcHNob3Qge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkU3RhdGVTbmFwc2hvdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHBhZ2luYXRpb24gc3RhdGVcbiAgICovXG4gIGdldFBhZ2luYXRpb24oKTogUGFnaW5hdGlvblN0YXRlIHtcbiAgICByZXR1cm4geyAuLi50aGlzLl9wYWdpbmF0aW9uJC52YWx1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2x1bW5zIHdpdGggc29ydGluZyBlbmFibGVkXG4gICAqL1xuICBnZXRTb3J0ZWRDb2x1bW5zKCk6IENvbHVtbkNvbmZpZzxhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnNvcnRFbmFibGVkID09PSB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29sdW1ucyB3aXRoIGZpbHRlcmluZyBlbmFibGVkXG4gICAqL1xuICBnZXRGaWx0ZXJlZENvbHVtbnMoKTogQ29sdW1uQ29uZmlnPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZmlsdGVyQ29uZmlnPy5lbmFibGVkID09PSB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBjb2x1bW5zIHJlZmVyZW5jZVxuICAgKi9cbiAgZ2V0Q29sdW1ucygpOiBDb2x1bW5Db25maWc8YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUEFHSU5BVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgcGFnZVxuICAgKiBAcGFyYW0gcGFnZSBQYWdlIG51bWJlciAoMC1pbmRleGVkKVxuICAgKi9cbiAgc2V0UGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLl9wYWdpbmF0aW9uJC52YWx1ZTtcbiAgICBpZiAocGFnZSA8IDAgfHwgcGFnZSA+PSBjdXJyZW50U3RhdGUudG90YWxQYWdlcykge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHBhZ2UgbnVtYmVyOiAke3BhZ2V9LiBWYWxpZCByYW5nZTogMC0ke2N1cnJlbnRTdGF0ZS50b3RhbFBhZ2VzIC0gMX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYWdpbmF0aW9uJC5uZXh0KHtcbiAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiBwYWdlXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2UoJ3BhZ2luYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGFnZSBzaXplXG4gICAqIEBwYXJhbSBzaXplIE51bWJlciBvZiBpdGVtcyBwZXIgcGFnZVxuICAgKi9cbiAgc2V0UGFnZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHNpemUgPD0gMCkge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHBhZ2Ugc2l6ZTogJHtzaXplfS4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLl9wYWdpbmF0aW9uJC52YWx1ZTtcbiAgICBjb25zdCBuZXdUb3RhbFBhZ2VzID0gdGhpcy5jYWxjdWxhdGVUb3RhbFBhZ2VzKGN1cnJlbnRTdGF0ZS50b3RhbEl0ZW1zLCBzaXplKTtcbiAgICBcbiAgICB0aGlzLl9wYWdpbmF0aW9uJC5uZXh0KHtcbiAgICAgIGN1cnJlbnRQYWdlOiAwLCAvLyBSZXNldCB0byBmaXJzdCBwYWdlXG4gICAgICBwYWdlU2l6ZTogc2l6ZSxcbiAgICAgIHRvdGFsSXRlbXM6IGN1cnJlbnRTdGF0ZS50b3RhbEl0ZW1zLFxuICAgICAgdG90YWxQYWdlczogbmV3VG90YWxQYWdlc1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdwYWdpbmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvdGFsIGl0ZW1zIChjYWxsZWQgYWZ0ZXIgQVBJIHJlc3BvbnNlKVxuICAgKiBAcGFyYW0gdG90YWwgVG90YWwgbnVtYmVyIG9mIGl0ZW1zXG4gICAqL1xuICBzZXRUb3RhbEl0ZW1zKHRvdGFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLl9wYWdpbmF0aW9uJC52YWx1ZTtcbiAgICBjb25zdCBuZXdUb3RhbFBhZ2VzID0gdGhpcy5jYWxjdWxhdGVUb3RhbFBhZ2VzKHRvdGFsLCBjdXJyZW50U3RhdGUucGFnZVNpemUpO1xuICAgIFxuICAgIHRoaXMuX3BhZ2luYXRpb24kLm5leHQoe1xuICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgdG90YWxJdGVtczogdG90YWwsXG4gICAgICB0b3RhbFBhZ2VzOiBuZXdUb3RhbFBhZ2VzXG4gICAgfSk7XG4gICAgLy8gRG9uJ3QgZW1pdCBzdGF0ZSBjaGFuZ2UgaGVyZSAtIHRoaXMgaXMgY2FsbGVkIGFmdGVyIGRhdGEgbG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIEdvIHRvIG5leHQgcGFnZVxuICAgKi9cbiAgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5fcGFnaW5hdGlvbiQudmFsdWU7XG4gICAgaWYgKHRoaXMuaGFzTmV4dFBhZ2UoKSkge1xuICAgICAgdGhpcy5zZXRQYWdlKGN1cnJlbnRTdGF0ZS5jdXJyZW50UGFnZSArIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0byBwcmV2aW91cyBwYWdlXG4gICAqL1xuICBwcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5fcGFnaW5hdGlvbiQudmFsdWU7XG4gICAgaWYgKHRoaXMuaGFzUHJldmlvdXNQYWdlKCkpIHtcbiAgICAgIHRoaXMuc2V0UGFnZShjdXJyZW50U3RhdGUuY3VycmVudFBhZ2UgLSAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR28gdG8gZmlyc3QgcGFnZVxuICAgKi9cbiAgZmlyc3RQYWdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0UGFnZSgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0byBsYXN0IHBhZ2VcbiAgICovXG4gIGxhc3RQYWdlKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuX3BhZ2luYXRpb24kLnZhbHVlO1xuICAgIGlmIChjdXJyZW50U3RhdGUudG90YWxQYWdlcyA+IDApIHtcbiAgICAgIHRoaXMuc2V0UGFnZShjdXJyZW50U3RhdGUudG90YWxQYWdlcyAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIG5leHQgcGFnZVxuICAgKi9cbiAgaGFzTmV4dFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5fcGFnaW5hdGlvbiQudmFsdWU7XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZS5jdXJyZW50UGFnZSA8IGN1cnJlbnRTdGF0ZS50b3RhbFBhZ2VzIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHBhZ2VcbiAgICovXG4gIGhhc1ByZXZpb3VzUGFnZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLl9wYWdpbmF0aW9uJC52YWx1ZTtcbiAgICByZXR1cm4gY3VycmVudFN0YXRlLmN1cnJlbnRQYWdlID4gMDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU09SVElORyBNRVRIT0RTIChvcGVyYXRlIG9uIGNvbHVtbiBjb25maWdzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFNldCBzb3J0IG9uIGEgY29sdW1uIChjbGVhcnMgb3RoZXIgc29ydHMpXG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFNvcnQgZGlyZWN0aW9uXG4gICAqL1xuICBzZXRTb3J0T25Db2x1bW4oY29sdW1uS2V5OiBzdHJpbmcsIGRpcmVjdGlvbjogU29ydERpcmVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZmluZENvbHVtbihjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbHVtbiBub3QgZm91bmQ6ICR7Y29sdW1uS2V5fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW4uc29ydGFibGUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbHVtbiAke2NvbHVtbktleX0gaXMgbm90IHNvcnRhYmxlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgYWxsIG90aGVyIHNvcnRzXG4gICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICBpZiAoY29sLmtleSAhPT0gY29sdW1uS2V5KSB7XG4gICAgICAgIGNvbC5zb3J0RGlyZWN0aW9uID0gU29ydERpcmVjdGlvbi5OT05FO1xuICAgICAgICBjb2wuc29ydEVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNldCBzb3J0IG9uIHRhcmdldCBjb2x1bW5cbiAgICBjb2x1bW4uc29ydERpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICBjb2x1bW4uc29ydEVuYWJsZWQgPSBkaXJlY3Rpb24gIT09IFNvcnREaXJlY3Rpb24uTk9ORTtcblxuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdzb3J0aW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHNvcnQgdG8gYSBjb2x1bW4gKGZvciBtdWx0aS1jb2x1bW4gc29ydGluZylcbiAgICogQHBhcmFtIGNvbHVtbktleSBDb2x1bW4ga2V5XG4gICAqIEBwYXJhbSBkaXJlY3Rpb24gU29ydCBkaXJlY3Rpb25cbiAgICovXG4gIGFkZFNvcnRUb0NvbHVtbihjb2x1bW5LZXk6IHN0cmluZywgZGlyZWN0aW9uOiBTb3J0RGlyZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maW5kQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uIG5vdCBmb3VuZDogJHtjb2x1bW5LZXl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29sdW1uICR7Y29sdW1uS2V5fSBpcyBub3Qgc29ydGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb2x1bW4uc29ydERpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICBjb2x1bW4uc29ydEVuYWJsZWQgPSBkaXJlY3Rpb24gIT09IFNvcnREaXJlY3Rpb24uTk9ORTtcblxuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdzb3J0aW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHNvcnQgb24gYSBjb2x1bW4gKGN5Y2xlcyB0aHJvdWdoIG5vbmUgLT4gYXNjIC0+IGRlc2MgLT4gbm9uZSlcbiAgICogQHBhcmFtIGNvbHVtbktleSBDb2x1bW4ga2V5XG4gICAqL1xuICB0b2dnbGVTb3J0T25Db2x1bW4oY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbktleX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gJHtjb2x1bW5LZXl9IGlzIG5vdCBzb3J0YWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnREaXJlY3Rpb24gPSBjb2x1bW4uc29ydERpcmVjdGlvbiB8fCBTb3J0RGlyZWN0aW9uLk5PTkU7XG4gICAgbGV0IG5ld0RpcmVjdGlvbjogU29ydERpcmVjdGlvbjtcblxuICAgIHN3aXRjaCAoY3VycmVudERpcmVjdGlvbikge1xuICAgICAgY2FzZSBTb3J0RGlyZWN0aW9uLk5PTkU6XG4gICAgICAgIG5ld0RpcmVjdGlvbiA9IFNvcnREaXJlY3Rpb24uQVNDO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU29ydERpcmVjdGlvbi5BU0M6XG4gICAgICAgIG5ld0RpcmVjdGlvbiA9IFNvcnREaXJlY3Rpb24uREVTQztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNvcnREaXJlY3Rpb24uREVTQzpcbiAgICAgICAgbmV3RGlyZWN0aW9uID0gU29ydERpcmVjdGlvbi5OT05FO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG5ld0RpcmVjdGlvbiA9IFNvcnREaXJlY3Rpb24uQVNDO1xuICAgIH1cblxuICAgIGNvbHVtbi5zb3J0RGlyZWN0aW9uID0gbmV3RGlyZWN0aW9uO1xuICAgIGNvbHVtbi5zb3J0RW5hYmxlZCA9IG5ld0RpcmVjdGlvbiAhPT0gU29ydERpcmVjdGlvbi5OT05FO1xuXG4gICAgdGhpcy5jbGVhckZvY3VzKCk7XG4gICAgdGhpcy5jbGVhckVkaXRpbmdDZWxsKCk7XG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2UoJ3NvcnRpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgc29ydGluZ1xuICAgKi9cbiAgY2xlYXJBbGxTb3J0aW5nKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgY29sLnNvcnREaXJlY3Rpb24gPSBTb3J0RGlyZWN0aW9uLk5PTkU7XG4gICAgICBjb2wuc29ydEVuYWJsZWQgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2xlYXJGb2N1cygpO1xuICAgIHRoaXMuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdzb3J0aW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvcnQgY29uZmlndXJhdGlvbiBmb3IgYSBjb2x1bW5cbiAgICogQHBhcmFtIGNvbHVtbktleSBDb2x1bW4ga2V5XG4gICAqIEByZXR1cm5zIFNvcnQgY29uZmlndXJhdGlvbiBvciBudWxsXG4gICAqL1xuICBnZXRTb3J0Rm9yQ29sdW1uKGNvbHVtbktleTogc3RyaW5nKTogeyBkaXJlY3Rpb246IFNvcnREaXJlY3Rpb247IGVuYWJsZWQ6IGJvb2xlYW4gfSB8IG51bGwge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZmluZENvbHVtbihjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlyZWN0aW9uOiBjb2x1bW4uc29ydERpcmVjdGlvbiB8fCBTb3J0RGlyZWN0aW9uLk5PTkUsXG4gICAgICBlbmFibGVkOiBjb2x1bW4uc29ydEVuYWJsZWQgfHwgZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGSUxURVJJTkcgTUVUSE9EUyAob3BlcmF0ZSBvbiBjb2x1bW4gY29uZmlncylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTZXQgZmlsdGVyIG9uIGEgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcGFyYW0gb3BlcmF0b3IgRmlsdGVyIG9wZXJhdG9yXG4gICAqIEBwYXJhbSB2YWx1ZSBGaWx0ZXIgdmFsdWVcbiAgICovXG4gIHNldEZpbHRlck9uQ29sdW1uKGNvbHVtbktleTogc3RyaW5nLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbktleX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29sdW1uLmZpbHRlcmFibGUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbHVtbiAke2NvbHVtbktleX0gaXMgbm90IGZpbHRlcmFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGZpbHRlckNvbmZpZyBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCFjb2x1bW4uZmlsdGVyQ29uZmlnKSB7XG4gICAgICBjb2x1bW4uZmlsdGVyQ29uZmlnID0ge307XG4gICAgfVxuXG4gICAgY29sdW1uLmZpbHRlckNvbmZpZy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgIGNvbHVtbi5maWx0ZXJDb25maWcudmFsdWUgPSB2YWx1ZTtcbiAgICBjb2x1bW4uZmlsdGVyQ29uZmlnLmVuYWJsZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5jbGVhckZvY3VzKCk7XG4gICAgdGhpcy5jbGVhckVkaXRpbmdDZWxsKCk7XG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2UoJ2ZpbHRlcmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGZpbHRlciBvbiBhIGNvbHVtblxuICAgKiBAcGFyYW0gY29sdW1uS2V5IENvbHVtbiBrZXlcbiAgICovXG4gIGNsZWFyRmlsdGVyT25Db2x1bW4oY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbktleX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGZpbHRlckNvbmZpZyBpZiBpdCBkb2Vzbid0IGV4aXN0IChmb3IgY29uc2lzdGVuY3kgd2l0aCBzZXRGaWx0ZXJPbkNvbHVtbilcbiAgICBpZiAoIWNvbHVtbi5maWx0ZXJDb25maWcpIHtcbiAgICAgIGNvbHVtbi5maWx0ZXJDb25maWcgPSB7fTtcbiAgICB9XG5cbiAgICBjb2x1bW4uZmlsdGVyQ29uZmlnLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIGNvbHVtbi5maWx0ZXJDb25maWcuZW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5jbGVhckZvY3VzKCk7XG4gICAgdGhpcy5jbGVhckVkaXRpbmdDZWxsKCk7XG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2UoJ2ZpbHRlcmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBmaWx0ZXJzXG4gICAqL1xuICBjbGVhckFsbEZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIGZpbHRlckNvbmZpZyBpZiBpdCBkb2Vzbid0IGV4aXN0IChmb3IgY29uc2lzdGVuY3kgd2l0aCBzZXRGaWx0ZXJPbkNvbHVtbilcbiAgICAgIGlmICghY29sLmZpbHRlckNvbmZpZykge1xuICAgICAgICBjb2wuZmlsdGVyQ29uZmlnID0ge307XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbC5maWx0ZXJDb25maWcudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICBjb2wuZmlsdGVyQ29uZmlnLmVuYWJsZWQgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2xlYXJGb2N1cygpO1xuICAgIHRoaXMuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdmaWx0ZXJpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmlsdGVyIGVuYWJsZWQgc3RhdGVcbiAgICogQHBhcmFtIGNvbHVtbktleSBDb2x1bW4ga2V5XG4gICAqIEBwYXJhbSBlbmFibGVkIFdoZXRoZXIgZmlsdGVyIGlzIGVuYWJsZWRcbiAgICovXG4gIHNldEZpbHRlckVuYWJsZWQoY29sdW1uS2V5OiBzdHJpbmcsIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbktleX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGZpbHRlckNvbmZpZyBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCFjb2x1bW4uZmlsdGVyQ29uZmlnKSB7XG4gICAgICBjb2x1bW4uZmlsdGVyQ29uZmlnID0ge307XG4gICAgfVxuXG4gICAgY29sdW1uLmZpbHRlckNvbmZpZy5lbmFibGVkID0gZW5hYmxlZDtcblxuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdmaWx0ZXJpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmlsdGVyIGNvbmZpZ3VyYXRpb24gZm9yIGEgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcmV0dXJucyBGaWx0ZXIgY29uZmlndXJhdGlvbiBvciBudWxsXG4gICAqL1xuICBnZXRGaWx0ZXJGb3JDb2x1bW4oY29sdW1uS2V5OiBzdHJpbmcpOiB7IG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcjsgdmFsdWU6IGFueTsgZW5hYmxlZDogYm9vbGVhbiB9IHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maW5kQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogY29sdW1uLmZpbHRlckNvbmZpZz8ub3BlcmF0b3IgfHwgRmlsdGVyT3BlcmF0b3IuQ09OVEFJTlMsXG4gICAgICB2YWx1ZTogY29sdW1uLmZpbHRlckNvbmZpZz8udmFsdWUsXG4gICAgICBlbmFibGVkOiBjb2x1bW4uZmlsdGVyQ29uZmlnPy5lbmFibGVkIHx8IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1RJQ0tZIENPTFVNTiBNQU5BR0VNRU5UXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHN0aWNreSBjb2x1bW5zIGdyb3VwZWQgYnkgcG9zaXRpb25cbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggbGVmdCBhbmQgcmlnaHQgc3RpY2t5IGNvbHVtbiBrZXlzXG4gICAqL1xuICBnZXRTdGlja3lDb2x1bW5zKCk6IHsgbGVmdDogc3RyaW5nW107IHJpZ2h0OiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBsZWZ0ID0gdGhpcy5fY29sdW1uc1xuICAgICAgLmZpbHRlcihjb2wgPT4gY29sLnN0aWNreSA9PT0gJ2xlZnQnKVxuICAgICAgLm1hcChjb2wgPT4gY29sLmtleSk7XG4gICAgXG4gICAgY29uc3QgcmlnaHQgPSB0aGlzLl9jb2x1bW5zXG4gICAgICAuZmlsdGVyKGNvbCA9PiBjb2wuc3RpY2t5ID09PSAncmlnaHQnKVxuICAgICAgLm1hcChjb2wgPT4gY29sLmtleSk7XG4gICAgXG4gICAgcmV0dXJuIHsgbGVmdCwgcmlnaHQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc3RpY2t5IHBvc2l0aW9uIGZvciBhIGNvbHVtblxuICAgKiBAcGFyYW0gY29sdW1uS2V5IENvbHVtbiBrZXlcbiAgICogQHBhcmFtIHBvc2l0aW9uIFN0aWNreSBwb3NpdGlvbiAoJ2xlZnQnLCAncmlnaHQnLCBvciBmYWxzZSlcbiAgICovXG4gIHNldFN0aWNreUNvbHVtbihjb2x1bW5LZXk6IHN0cmluZywgcG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCcgfCBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZmluZENvbHVtbihjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbHVtbiBub3QgZm91bmQ6ICR7Y29sdW1uS2V5fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIChjb2x1bW4gYXMgYW55KS5zdGlja3kgPSBwb3NpdGlvbjtcbiAgICB0aGlzLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMoKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnY29sdW1uLWNvbmZpZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0cyBmb3IgYWxsIHN0aWNreSBjb2x1bW5zXG4gICAqIFRoaXMgY2FsY3VsYXRlcyBjdW11bGF0aXZlIHdpZHRocyBmb3IgcG9zaXRpb25pbmdcbiAgICogQHBhcmFtIHJvd051bWJlcldpZHRoIE9wdGlvbmFsIHdpZHRoIG9mIHJvdyBudW1iZXIgY29sdW1uIHRvIGFjY291bnQgZm9yIGluIGxlZnQgb2Zmc2V0XG4gICAqIEBwYXJhbSBzZXR0aW5nc0NvbHVtbldpZHRoIE9wdGlvbmFsIHdpZHRoIG9mIHNldHRpbmdzIGNvbHVtbiB0byBhY2NvdW50IGZvciBpbiByaWdodCBvZmZzZXRcbiAgICovXG4gIGNhbGN1bGF0ZVN0aWNreU9mZnNldHMocm93TnVtYmVyV2lkdGg/OiBudW1iZXIsIHNldHRpbmdzQ29sdW1uV2lkdGg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgc3RvcmVkIHJvdyBudW1iZXIgd2lkdGggaWYgcHJvdmlkZWRcbiAgICBpZiAocm93TnVtYmVyV2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcm93TnVtYmVyV2lkdGggPSByb3dOdW1iZXJXaWR0aDtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHN0b3JlZCBzZXR0aW5ncyBjb2x1bW4gd2lkdGggaWYgcHJvdmlkZWRcbiAgICBpZiAoc2V0dGluZ3NDb2x1bW5XaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zZXR0aW5nc0NvbHVtbldpZHRoID0gc2V0dGluZ3NDb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIGxlZnQgc3RpY2t5IG9mZnNldHNcbiAgICAvLyBBY2NvdW50IGZvciByb3cgbnVtYmVyIGNvbHVtbiB3aWR0aFxuICAgIGxldCBsZWZ0T2Zmc2V0ID0gdGhpcy5fcm93TnVtYmVyV2lkdGg7XG4gICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICBpZiAoY29sLnN0aWNreSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIChjb2wgYXMgYW55KS5zdGlja3lPZmZzZXQgPSBsZWZ0T2Zmc2V0O1xuICAgICAgICBsZWZ0T2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgcmlnaHQgc3RpY2t5IG9mZnNldHNcbiAgICAvLyBBY2NvdW50IGZvciBzZXR0aW5ncyBjb2x1bW4gd2lkdGggKHJvdyBhY3Rpb25zIGNvbHVtbilcbiAgICBsZXQgcmlnaHRPZmZzZXQgPSB0aGlzLl9zZXR0aW5nc0NvbHVtbldpZHRoO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLl9jb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2wgPSB0aGlzLl9jb2x1bW5zW2ldO1xuICAgICAgaWYgKGNvbC5zdGlja3kgPT09ICdyaWdodCcpIHtcbiAgICAgICAgKGNvbCBhcyBhbnkpLnN0aWNreU9mZnNldCA9IHJpZ2h0T2Zmc2V0O1xuICAgICAgICByaWdodE9mZnNldCArPSAoY29sLndpZHRoIGFzIG51bWJlcikgfHwgMTAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09MVU1OIE1BTkFHRU1FTlRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29sdW1ucyByZWZlcmVuY2VcbiAgICogQHBhcmFtIGNvbHVtbnMgTmV3IGNvbHVtbnMgYXJyYXlcbiAgICovXG4gIHVwZGF0ZUNvbHVtbnMoY29sdW1uczogQ29sdW1uQ29uZmlnPGFueT5bXSk6IHZvaWQge1xuICAgIHRoaXMuX2NvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMuY2FsY3VsYXRlU3RpY2t5T2Zmc2V0cygpO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdjb2x1bW4tY29uZmlnJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENPTFVNTiBWSVNJQklMSVRZIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGNvbHVtblxuICAgKiBAcGFyYW0gY29sdW1uS2V5IENvbHVtbiBrZXlcbiAgICovXG4gIHRvZ2dsZUNvbHVtblZpc2liaWxpdHkoY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbmRDb2x1bW4oY29sdW1uS2V5KTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbktleX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjb2x1bW4gaXMgaGlkZWFibGVcbiAgICBpZiAoY29sdW1uLmhpZGVhYmxlID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBDb2x1bW4gJHtjb2x1bW5LZXl9IGNhbm5vdCBiZSBoaWRkZW4gKGhpZGVhYmxlIGlzIGZhbHNlKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWaXNpYmlsaXR5ID0gY29sdW1uLnZpc2libGUgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRvIHRydWUgaWYgbm90IHNldFxuICAgIChjb2x1bW4gYXMgYW55KS52aXNpYmxlID0gIWN1cnJlbnRWaXNpYmlsaXR5O1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdjb2x1bW4tdmlzaWJpbGl0eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2aXNpYmlsaXR5IG9mIGEgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcGFyYW0gdmlzaWJsZSBXaGV0aGVyIGNvbHVtbiBzaG91bGQgYmUgdmlzaWJsZVxuICAgKi9cbiAgc2V0Q29sdW1uVmlzaWJpbGl0eShjb2x1bW5LZXk6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZmluZENvbHVtbihjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbHVtbiBub3QgZm91bmQ6ICR7Y29sdW1uS2V5fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNvbHVtbiBpcyBoaWRlYWJsZSAob25seSB3aGVuIHRyeWluZyB0byBoaWRlKVxuICAgIGlmICghdmlzaWJsZSAmJiBjb2x1bW4uaGlkZWFibGUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbHVtbiAke2NvbHVtbktleX0gY2Fubm90IGJlIGhpZGRlbiAoaGlkZWFibGUgaXMgZmFsc2UpYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgKGNvbHVtbiBhcyBhbnkpLnZpc2libGUgPSB2aXNpYmxlO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdjb2x1bW4tdmlzaWJpbGl0eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdmlzaWJsZSBjb2x1bW5zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHZpc2libGUgY29sdW1uIGNvbmZpZ3NcbiAgICovXG4gIGdldFZpc2libGVDb2x1bW5zKCk6IENvbHVtbkNvbmZpZzxhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnZpc2libGUgIT09IGZhbHNlKTsgLy8gRGVmYXVsdCB0byB0cnVlIGlmIG5vdCBzZXRcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmlzaWJpbGl0eSBzdGF0ZSBmb3IgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgY29sdW1uIHZpc2liaWxpdHkgaW5mb1xuICAgKi9cbiAgZ2V0QWxsQ29sdW1uc1Zpc2liaWxpdHkoKTogeyBrZXk6IHN0cmluZzsgaGVhZGVyOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IGhpZGVhYmxlOiBib29sZWFuIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMubWFwKGNvbCA9PiAoe1xuICAgICAga2V5OiBjb2wua2V5LFxuICAgICAgaGVhZGVyOiBjb2wuaGVhZGVyIHx8IGNvbC5rZXksXG4gICAgICB2aXNpYmxlOiBjb2wudmlzaWJsZSAhPT0gZmFsc2UsIC8vIERlZmF1bHQgdG8gdHJ1ZSBpZiBub3Qgc2V0XG4gICAgICBoaWRlYWJsZTogY29sLmhpZGVhYmxlICE9PSBmYWxzZSAvLyBEZWZhdWx0IHRvIHRydWUgaWYgbm90IHNldFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gS0VZQk9BUkQgTkFWSUdBVElPTiAmIEZPQ1VTIE1BTkFHRU1FTlRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTZXQgdGFibGUgZGltZW5zaW9ucyBmb3IgbmF2aWdhdGlvbiBib3VuZGFyaWVzXG4gICAqL1xuICBzZXREaW1lbnNpb25zKHJvd0NvdW50OiBudW1iZXIsIGNvbHVtbkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1Jvd0NvdW50ID0gdGhpcy5fcm93Q291bnQ7XG4gICAgdGhpcy5fcm93Q291bnQgPSByb3dDb3VudDtcbiAgICB0aGlzLl9jb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50O1xuICAgIFxuICAgIC8vIFVwZGF0ZSB0b3RhbCByb3dzIGluIHZhbGlkYXRpb24gc3RhdGVcbiAgICB0aGlzLnNldFZhbGlkYXRpb25Sb3dDb3VudChyb3dDb3VudCk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgYSBuZXcgcm93IHdhcyBhZGRlZCBhbmQgd2UgaGF2ZSBhIHBlbmRpbmcgZm9jdXNcbiAgICBpZiAodGhpcy5fcGVuZGluZ0ZvY3VzQWZ0ZXJSb3dBZGQgJiYgcm93Q291bnQgPiBwcmV2aW91c1Jvd0NvdW50KSB7XG4gICAgICBjb25zdCB7IGNvbHVtbkluZGV4IH0gPSB0aGlzLl9wZW5kaW5nRm9jdXNBZnRlclJvd0FkZDtcbiAgICAgIC8vIEZvY3VzIHRoZSBsYXN0IHJvdyAobmV3bHkgYWRkZWQpIGF0IHRoZSBwZW5kaW5nIGNvbHVtblxuICAgICAgY29uc3QgbmV3Um93SW5kZXggPSByb3dDb3VudCAtIDE7XG4gICAgICB0aGlzLl9wZW5kaW5nRm9jdXNBZnRlclJvd0FkZCA9IG51bGw7IC8vIENsZWFyIHBlbmRpbmcgZm9jdXNcbiAgICAgIFxuICAgICAgLy8gRGVsYXkgZm9jdXMgdG8gZW5zdXJlIERPTSBpcyB1cGRhdGVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c0NlbGwobmV3Um93SW5kZXgsIGNvbHVtbkluZGV4KTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEZvY3VzIGEgY2VsbCBieSBwb3NpdGlvblxuICAgKi9cbiAgZm9jdXNDZWxsKHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocm93SW5kZXggPCAwIHx8IHJvd0luZGV4ID49IHRoaXMuX3Jvd0NvdW50KSByZXR1cm47XG4gICAgaWYgKGNvbHVtbkluZGV4IDwgMCB8fCBjb2x1bW5JbmRleCA+PSB0aGlzLl9jb2x1bW5Db3VudCkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuX2ZvY3VzZWRDZWxsUG9zaXRpb24kLm5leHQoeyByb3dJbmRleCwgY29sdW1uSW5kZXggfSk7XG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2UoJ2NlbGwtZm9jdXMnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgZm9jdXNlZCBwb3NpdGlvblxuICAgKi9cbiAgZ2V0Rm9jdXNlZFBvc2l0aW9uKCk6IENlbGxGb2N1c1Bvc2l0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWRDZWxsUG9zaXRpb24kLnZhbHVlO1xuICB9XG4gIFxuICAvKipcbiAgICogTm90aWZ5IHRoYXQgYSBjZWxsIGVudGVyZWQgZWRpdCBtb2RlXG4gICAqL1xuICBzZXRFZGl0aW5nQ2VsbChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdGluZ0NlbGxQb3NpdGlvbiQubmV4dCh7IHJvd0luZGV4LCBjb2x1bW5JbmRleCB9KTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnY2VsbC1lZGl0LXN0YXJ0Jyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBOb3RpZnkgdGhhdCBlZGl0IG1vZGUgZW5kZWRcbiAgICovXG4gIGNsZWFyRWRpdGluZ0NlbGwoKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdGluZ0NlbGxQb3NpdGlvbiQubmV4dChudWxsKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnY2VsbC1lZGl0LWVuZCcpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IGNlbGwgaXMgY3VycmVudGx5IGVkaXRpbmdcbiAgICovXG4gIGlzQW55Q2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRpbmdDZWxsUG9zaXRpb24kLnZhbHVlICE9PSBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGN1cnJlbnRseSBlZGl0aW5nIHBvc2l0aW9uXG4gICAqL1xuICBnZXRFZGl0aW5nUG9zaXRpb24oKTogQ2VsbEZvY3VzUG9zaXRpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdGluZ0NlbGxQb3NpdGlvbiQudmFsdWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNb3ZlIGZvY3VzIGluIGEgZGlyZWN0aW9uIHVzaW5nIE5hdmlnYXRpb25EaXJlY3Rpb24gZW51bVxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBuYXZpZ2F0aW9uIGRpcmVjdGlvblxuICAgKiBAcGFyYW0gYWRkUm93T25OYXZpZ2F0ZVBhc3RFbmQgSWYgdHJ1ZSwgZW1pdHMgcmVxdWVzdEFkZFJvdyB3aGVuIG5hdmlnYXRpbmcgcGFzdCBsYXN0IHJvd1xuICAgKi9cbiAgbW92ZUZvY3VzKGRpcmVjdGlvbjogTmF2aWdhdGlvbkRpcmVjdGlvbiwgYWRkUm93T25OYXZpZ2F0ZVBhc3RFbmQ6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIC8vIEJsb2NrIG5hdmlnYXRpb24gaWYgYW55IGNlbGwgaXMgZWRpdGluZ1xuICAgIGlmICh0aGlzLmlzQW55Q2VsbEVkaXRpbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZm9jdXNlZENlbGxQb3NpdGlvbiQudmFsdWU7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgbGV0IG5ld1JvdyA9IGN1cnJlbnQucm93SW5kZXg7XG4gICAgbGV0IG5ld0NvbCA9IGN1cnJlbnQuY29sdW1uSW5kZXg7XG4gICAgXG4gICAgLy8gVXNlIE5hdmlnYXRpb25EaXJlY3Rpb24gZW51bSB2YWx1ZXNcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSBOYXZpZ2F0aW9uRGlyZWN0aW9uLlVQOiBuZXdSb3ctLTsgYnJlYWs7XG4gICAgICBjYXNlIE5hdmlnYXRpb25EaXJlY3Rpb24uRE9XTjogbmV3Um93Kys7IGJyZWFrO1xuICAgICAgY2FzZSBOYXZpZ2F0aW9uRGlyZWN0aW9uLkxFRlQ6IG5ld0NvbC0tOyBicmVhaztcbiAgICAgIGNhc2UgTmF2aWdhdGlvbkRpcmVjdGlvbi5SSUdIVDogbmV3Q29sKys7IGJyZWFrO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBuYXZpZ2F0aW5nIHBhc3QgbGFzdCByb3cgKGFycm93IGRvd24gYXQgYm90dG9tKVxuICAgIGlmIChkaXJlY3Rpb24gPT09IE5hdmlnYXRpb25EaXJlY3Rpb24uRE9XTiAmJiBuZXdSb3cgPj0gdGhpcy5fcm93Q291bnQpIHtcbiAgICAgIGlmIChhZGRSb3dPbk5hdmlnYXRlUGFzdEVuZCkge1xuICAgICAgICAvLyBTdG9yZSBwZW5kaW5nIGZvY3VzIGZvciB3aGVuIHRoZSBuZXcgcm93IGlzIGFkZGVkXG4gICAgICAgIHRoaXMuX3BlbmRpbmdGb2N1c0FmdGVyUm93QWRkID0geyBjb2x1bW5JbmRleDogY3VycmVudC5jb2x1bW5JbmRleCB9O1xuICAgICAgICAvLyBFbWl0IHJlcXVlc3QgdG8gYWRkIGEgbmV3IHJvdywga2VlcGluZyB0aGUgc2FtZSBjb2x1bW4gZm9yIGZvY3VzXG4gICAgICAgIHRoaXMuX3JlcXVlc3RBZGRSb3ckLm5leHQoeyBmb2N1c0NvbHVtbjogY3VycmVudC5jb2x1bW5JbmRleCB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKG5ld1JvdyA8IDAgfHwgbmV3Um93ID49IHRoaXMuX3Jvd0NvdW50KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG5ld0NvbCA8IDAgfHwgbmV3Q29sID49IHRoaXMuX2NvbHVtbkNvdW50KSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgdGhpcy5mb2N1c0NlbGwobmV3Um93LCBuZXdDb2wpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgZm9jdXNcbiAgICovXG4gIGNsZWFyRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9jdXNlZENlbGxQb3NpdGlvbiQubmV4dChudWxsKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgnY2VsbC1mb2N1cycpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgbmF2aWdhdGlvbiBpcyBhY3RpdmVcbiAgICovXG4gIGlzTmF2aWdhdGlvbkFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZENlbGxQb3NpdGlvbiQudmFsdWUgIT09IG51bGw7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZBTElEQVRJT04gU1RBVEUgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFxuICAvKipcbiAgICogVXBkYXRlIGNlbGwgdmFsaWRhdGlvbiBhbmQgYWNjdW11bGF0ZSBpbnRvIHJvdy90YWJsZSB2YWxpZGF0aW9uIHN0YXRlXG4gICAqIE9ubHkgc3RvcmVzIGludmFsaWQgc3RhdGVzIC0gdmFsaWQgcm93cyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkXG4gICAqL1xuICB1cGRhdGVDZWxsVmFsaWRhdGlvbihyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5LZXk6IHN0cmluZywgaXNWYWxpZDogYm9vbGVhbiwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLl90YWJsZVZhbGlkYXRpb25TdGF0ZSQudmFsdWU7XG4gICAgY29uc3Qgcm93U3RhdGVzID0gbmV3IE1hcChjdXJyZW50U3RhdGUucm93U3RhdGVzKTtcbiAgICBcbiAgICAvLyBHZXQgZXhpc3Rpbmcgcm93IHN0YXRlIChvbmx5IGV4aXN0cyBpZiByb3cgaGFzIGVycm9ycylcbiAgICBsZXQgcm93U3RhdGUgPSByb3dTdGF0ZXMuZ2V0KHJvd0luZGV4KTtcbiAgICBcbiAgICBpZiAoIWlzVmFsaWQgJiYgZXJyb3IpIHtcbiAgICAgIC8vIENlbGwgaXMgaW52YWxpZCAtIGFkZCBvciB1cGRhdGUgZXJyb3JcbiAgICAgIGlmICghcm93U3RhdGUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIG5ldyByb3cgc3RhdGUgZm9yIHRoaXMgaW52YWxpZCByb3dcbiAgICAgICAgcm93U3RhdGUgPSB7XG4gICAgICAgICAgcm93SW5kZXgsXG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgaW52YWxpZENlbGxDb3VudDogMSxcbiAgICAgICAgICBjZWxsRXJyb3JzOiBuZXcgTWFwKFtbY29sdW1uS2V5LCBlcnJvcl1dKSxcbiAgICAgICAgICBsYXN0VmFsaWRhdGVkOiBuZXcgRGF0ZSgpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZXhpc3Rpbmcgcm93IHN0YXRlXG4gICAgICAgIGNvbnN0IGNlbGxFcnJvcnMgPSBuZXcgTWFwKHJvd1N0YXRlLmNlbGxFcnJvcnMpO1xuICAgICAgICBjZWxsRXJyb3JzLnNldChjb2x1bW5LZXksIGVycm9yKTtcbiAgICAgICAgXG4gICAgICAgIHJvd1N0YXRlID0ge1xuICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGludmFsaWRDZWxsQ291bnQ6IGNlbGxFcnJvcnMuc2l6ZSxcbiAgICAgICAgICBjZWxsRXJyb3JzLFxuICAgICAgICAgIGxhc3RWYWxpZGF0ZWQ6IG5ldyBEYXRlKClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJvd1N0YXRlcy5zZXQocm93SW5kZXgsIHJvd1N0YXRlKTtcbiAgICAgIFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDZWxsIGlzIHZhbGlkIC0gcmVtb3ZlIGVycm9yIGlmIGl0IGV4aXN0c1xuICAgICAgaWYgKHJvd1N0YXRlKSB7XG4gICAgICAgIGNvbnN0IGNlbGxFcnJvcnMgPSBuZXcgTWFwKHJvd1N0YXRlLmNlbGxFcnJvcnMpO1xuICAgICAgICBjZWxsRXJyb3JzLmRlbGV0ZShjb2x1bW5LZXkpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNlbGxFcnJvcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIC8vIE5vIG1vcmUgZXJyb3JzIGluIHRoaXMgcm93IC0gcmVtb3ZlIHJvdyBzdGF0ZSBjb21wbGV0ZWx5XG4gICAgICAgICAgcm93U3RhdGVzLmRlbGV0ZShyb3dJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RpbGwgaGFzIG90aGVyIGVycm9ycyAtIHVwZGF0ZSByb3cgc3RhdGVcbiAgICAgICAgICByb3dTdGF0ZSA9IHtcbiAgICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBpbnZhbGlkQ2VsbENvdW50OiBjZWxsRXJyb3JzLnNpemUsXG4gICAgICAgICAgICBjZWxsRXJyb3JzLFxuICAgICAgICAgICAgbGFzdFZhbGlkYXRlZDogbmV3IERhdGUoKVxuICAgICAgICAgIH07XG4gICAgICAgICAgcm93U3RhdGVzLnNldChyb3dJbmRleCwgcm93U3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBJZiByb3dTdGF0ZSBkb2Vzbid0IGV4aXN0LCBjZWxsIHdhcyBhbHJlYWR5IHZhbGlkIC0gZG8gbm90aGluZ1xuICAgIH1cbiAgICBcbiAgICAvLyBSZWNhbGN1bGF0ZSB0YWJsZSBzdGF0ZVxuICAgIC8vIEFsbCByb3dzIGluIHJvd1N0YXRlcyBtYXAgYXJlIGludmFsaWQgYnkgZGVmaW5pdGlvblxuICAgIGNvbnN0IGludmFsaWRSb3dzID0gcm93U3RhdGVzLnNpemU7XG4gICAgXG4gICAgY29uc3QgbmV3VGFibGVTdGF0ZTogVGFibGVWYWxpZGF0aW9uU3RhdGUgPSB7XG4gICAgICBpc1ZhbGlkOiBpbnZhbGlkUm93cyA9PT0gMCxcbiAgICAgIHRvdGFsUm93czogY3VycmVudFN0YXRlLnRvdGFsUm93cywgLy8gS2VlcCB0cmFjayBvZiB0b3RhbCByb3dzIHNlcGFyYXRlbHlcbiAgICAgIHZhbGlkUm93czogY3VycmVudFN0YXRlLnRvdGFsUm93cyAtIGludmFsaWRSb3dzLFxuICAgICAgaW52YWxpZFJvd3MsXG4gICAgICByb3dTdGF0ZXMsXG4gICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBuZXcgc3RhdGVcbiAgICB0aGlzLl90YWJsZVZhbGlkYXRpb25TdGF0ZSQubmV4dChuZXdUYWJsZVN0YXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHRhYmxlIHZhbGlkYXRpb24gc3RhdGVcbiAgICovXG4gIGdldFRhYmxlVmFsaWRhdGlvblN0YXRlKCk6IFRhYmxlVmFsaWRhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVWYWxpZGF0aW9uU3RhdGUkLnZhbHVlO1xuICB9XG4gIFxuICAvKipcbiAgICogU2V0IHRvdGFsIHJvd3MgZm9yIHZhbGlkYXRpb24gc3RhdGUgdHJhY2tpbmdcbiAgICovXG4gIHNldFZhbGlkYXRpb25Sb3dDb3VudCh0b3RhbFJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuX3RhYmxlVmFsaWRhdGlvblN0YXRlJC52YWx1ZTtcbiAgICB0aGlzLl90YWJsZVZhbGlkYXRpb25TdGF0ZSQubmV4dCh7XG4gICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICB0b3RhbFJvd3MsXG4gICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTVEFURSBSRVNFVFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRvIGluaXRpYWwgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldFBhZ2luYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0QWxsU29ydGluZygpO1xuICAgIHRoaXMucmVzZXRBbGxGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcGFnaW5hdGlvbiBvbmx5XG4gICAqL1xuICByZXNldFBhZ2luYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fcGFnaW5hdGlvbiQubmV4dCh7XG4gICAgICBjdXJyZW50UGFnZTogdGhpcy5faW5pdGlhbENvbmZpZy5pbml0aWFsUGFnZSEsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5faW5pdGlhbENvbmZpZy5wYWdlU2l6ZSEsXG4gICAgICB0b3RhbEl0ZW1zOiAwLFxuICAgICAgdG90YWxQYWdlczogMFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlKCdwYWdpbmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIGNvbHVtbiBzb3J0c1xuICAgKi9cbiAgcmVzZXRBbGxTb3J0aW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBbGxTb3J0aW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIGNvbHVtbiBmaWx0ZXJzXG4gICAqL1xuICByZXNldEFsbEZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckFsbEZpbHRlcnMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5URVJOQUwgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBjb2x1bW4gYnkga2V5XG4gICAqIEBwYXJhbSBjb2x1bW5LZXkgQ29sdW1uIGtleVxuICAgKiBAcmV0dXJucyBDb2x1bW4gY29uZmlnIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kQ29sdW1uKGNvbHVtbktleTogc3RyaW5nKTogQ29sdW1uQ29uZmlnPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5rZXkgPT09IGNvbHVtbktleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqIEBwYXJhbSB0b3RhbEl0ZW1zIFRvdGFsIG51bWJlciBvZiBpdGVtc1xuICAgKiBAcGFyYW0gcGFnZVNpemUgUGFnZSBzaXplXG4gICAqIEByZXR1cm5zIFRvdGFsIG51bWJlciBvZiBwYWdlc1xuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVUb3RhbFBhZ2VzKHRvdGFsSXRlbXM6IG51bWJlciA9IDAsIHBhZ2VTaXplOiBudW1iZXIgPSAyNSk6IG51bWJlciB7XG4gICAgaWYgKHRvdGFsSXRlbXMgPT09IDAgfHwgcGFnZVNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5jZWlsKHRvdGFsSXRlbXMgLyBwYWdlU2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBzdGF0ZSBjaGFuZ2UgZXZlbnRcbiAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBjaGFuZ2VcbiAgICovXG4gIHByaXZhdGUgZW1pdFN0YXRlQ2hhbmdlKHR5cGU6IFRhYmxlU3RhdGVDaGFuZ2VFdmVudFsndHlwZSddKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJ1aWxkU3RhdGVTbmFwc2hvdCgpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlJC5uZXh0KHtcbiAgICAgIHR5cGUsXG4gICAgICBzdGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHN0YXRlIHNuYXBzaG90IGZyb20gY3VycmVudCBzdGF0ZVxuICAgKiBAcmV0dXJucyBTdGF0ZSBzbmFwc2hvdFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFN0YXRlU25hcHNob3QoKTogVGFibGVTdGF0ZVNuYXBzaG90IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnaW5hdGlvbjogdGhpcy5nZXRQYWdpbmF0aW9uKCksXG4gICAgICBcbiAgICAgIC8vIEJ1aWxkIGZ1bGwgc29ydCBzdGF0ZSB3aXRoIGRpcmVjdGlvbiBhbmQgcHJpb3JpdHlcbiAgICAgIHNvcnRlZENvbHVtbnM6IHRoaXMuX2NvbHVtbnNcbiAgICAgICAgLmZpbHRlcihjb2wgPT4gY29sLnNvcnRFbmFibGVkID09PSB0cnVlKVxuICAgICAgICAubWFwKChjb2wsIGluZGV4KSA9PiAoe1xuICAgICAgICAgIGNvbHVtbktleTogY29sLmtleSxcbiAgICAgICAgICBkaXJlY3Rpb246IGNvbC5zb3J0RGlyZWN0aW9uIHx8IFNvcnREaXJlY3Rpb24uTk9ORSxcbiAgICAgICAgICBwcmlvcml0eTogaW5kZXggIC8vIFNvcnQgb3JkZXIgYmFzZWQgb24gZW5hYmxlbWVudCBvcmRlclxuICAgICAgICB9KSksXG4gICAgICBcbiAgICAgIC8vIEJ1aWxkIGZ1bGwgZmlsdGVyIHN0YXRlIHdpdGggb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAgICBmaWx0ZXJlZENvbHVtbnM6IHRoaXMuX2NvbHVtbnNcbiAgICAgICAgLmZpbHRlcihjb2wgPT4gY29sLmZpbHRlckNvbmZpZz8uZW5hYmxlZCA9PT0gdHJ1ZSlcbiAgICAgICAgLm1hcChjb2wgPT4gKHtcbiAgICAgICAgICBjb2x1bW5LZXk6IGNvbC5rZXksXG4gICAgICAgICAgb3BlcmF0b3I6IGNvbC5maWx0ZXJDb25maWc/Lm9wZXJhdG9yIHx8IEZpbHRlck9wZXJhdG9yLkNPTlRBSU5TLFxuICAgICAgICAgIHZhbHVlOiBjb2wuZmlsdGVyQ29uZmlnPy52YWx1ZSxcbiAgICAgICAgICBlbmFibGVkOiB0cnVlXG4gICAgICAgIH0pKVxuICAgIH07XG4gIH1cbn1cblxuIl19
|