UNPKG

angular2-collapsible

Version:

Angular collapsible component styled with Materialize CSS.

486 lines 53.1 kB
/** * @fileoverview added by tsickle * Generated from: lib/collapsible-table-row/collapsible-table-row.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, HostBinding, HostListener, ElementRef } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { CollapsibleTableRowDetailComponent } from '../collapsible-table-row-detail/collapsible-table-row-detail.component'; import { CollapsibleService } from '../services/collapsible.service'; var CollapsibleTableRowComponent = /** @class */ (function () { function CollapsibleTableRowComponent(el, sanitizer, collapsibleService) { this.el = el; this.sanitizer = sanitizer; this.collapsibleService = collapsibleService; this.backgroundTransitionDuration = '0.3s'; // transition-timing-function: easeInQuad this.backgroundTransitionTimingFunction = this.sanitizer .bypassSecurityTrustStyle(CollapsibleTableRowComponent.EASE_OUT_QUAD); this.isHeadRow = false; this.isBodyRow = false; this.isOddRow = false; this.isEvenRow = false; this.isParentStriped = false; this.isParentHighlight = false; this.parentAllowsSelect = false; this.parentAllowsSelectMultipleRows = false; this.parentAllowsDeselectingRows = false; this.dragSelection = false; } /** * @return {?} */ CollapsibleTableRowComponent.prototype.ngOnInit = /** * @return {?} */ function () { /** @type {?} */ var elem = this.el.nativeElement; /** @type {?} */ var tbody = elem.parentElement; if (tbody.tagName === 'TBODY') { /** @type {?} */ var collapsibleTableRows = tbody.querySelectorAll('collapsible-table-row'); for (var i = 0; i < collapsibleTableRows.length; i++) { /** @type {?} */ var collapsibleTableRow = collapsibleTableRows[i]; if (collapsibleTableRow === elem) { this.index = i + 1; break; } } } // retrieve parent CollapsibleTableComponent through the CollapsibleService this.parentCollapsibleTable = this.collapsibleService.getCollapsibleTable(); if (this.parentCollapsibleTable != null) { // check if collapsible-table is marked to show striped table this.isParentStriped = this.parentCollapsibleTable.striped; // check if collapsible-table is marked to highlight current row this.isParentHighlight = this.parentCollapsibleTable.highlight; this.parentHighlightRowBackgroundColor = this.parentCollapsibleTable.highlightColor || CollapsibleTableRowComponent.DEFAULT_HIGHLIGHT_ROW_COLOR; this.parentHighlightRowTextColor = this.parentCollapsibleTable.highlightTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; // check if collapsible-table specifies the active row color this.activeRowBackgroundColor = this.parentCollapsibleTable.activeColor || CollapsibleTableRowComponent.DEFAULT_ACTIVE_ROW_COLOR; this.activeRowTextColor = this.parentCollapsibleTable.activeTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; // check if collapsible-table allows selecting rows this.parentAllowsSelect = this.parentCollapsibleTable.select; this.parentAllowsSelectMultipleRows = this.parentCollapsibleTable.selectMultipleRows; // check if collapsible-table specifies a color for the selected row this.selectedRowBackgroundColor = this.parentCollapsibleTable.selectColor || CollapsibleTableRowComponent.DEFAULT_SELECTED_ROW_COLOR; this.selectedRowTextColor = this.parentCollapsibleTable.selectTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; // check if collapsible-table allows to deselect rows this.parentAllowsDeselectingRows = this.parentCollapsibleTable.allowDeselectingRows != null ? this.parentCollapsibleTable.allowDeselectingRows : false; } }; /** * @return {?} */ CollapsibleTableRowComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { this.updateRow(); }; /** * @return {?} */ CollapsibleTableRowComponent.prototype.updateRow = /** * @return {?} */ function () { /** @type {?} */ var elem = this.el.nativeElement; // determine if the row is inside the 'thead' /** @type {?} */ var th = elem.querySelector('th'); if (th != null) { this.isHeadRow = true; } // determine if the row is inside the 'tbody' /** @type {?} */ var td = elem.querySelector('td'); if (td != null) { this.isBodyRow = true; // determine if the row is 'odd' or 'event' if (this.index % 2 === 0) { this.isEvenRow = true; this.parentStripedRowBackgroundColor = this.parentCollapsibleTable.stripedEvenColor || CollapsibleTableRowComponent.DEFAULT_STRIPED_EVEN_ROW_COLOR; this.parentStripedRowTextColor = this.parentCollapsibleTable.stripedEvenTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; } else { this.isOddRow = true; this.parentStripedRowBackgroundColor = this.parentCollapsibleTable.stripedOddColor || CollapsibleTableRowComponent.DEFAULT_STRIPED_ODD_ROW_COLOR; this.parentStripedRowTextColor = this.parentCollapsibleTable.stripedOddTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; } switch (true) { case this.parentAllowsSelect && this.selected: this.rowBackgroundColor = this.selectedRowBackgroundColor; this.rowTextColor = this.selectedRowTextColor; break; case this.isParentStriped: this.rowBackgroundColor = this.parentStripedRowBackgroundColor; this.rowTextColor = this.parentStripedRowTextColor; break; } } }; /** * @return {?} */ CollapsibleTableRowComponent.prototype.getHeight = /** * @return {?} */ function () { return this.el.nativeElement.offsetHeight; }; /** * @private * @param {?} event * @return {?} */ CollapsibleTableRowComponent.prototype.isLeftMouseButton = /** * @private * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var button = event.button; /** @type {?} */ var which = event['which']; /** @type {?} */ var target = (/** @type {?} */ ((event.target || event.srcElement || event.currentTarget))); if (['TR', 'TD'].indexOf(target.tagName) > -1) { if ('button' in event) { return button === 0; } else { return (which || button) === 1; } } return false; }; /** * @param {?} event * @return {?} */ CollapsibleTableRowComponent.prototype.mousedown = /** * @param {?} event * @return {?} */ function (event) { // handle only if the Left mouse button pressed // and the row is a body row if (this.isLeftMouseButton(event) && this.isBodyRow) { if (this.parentCollapsibleTable.noTextSelect) { event.preventDefault(); } if (this.isBodyRow) { if (this.parentAllowsSelect && !this.parentAllowsDeselectingRows) { this.prevSelectedRows = this.parentCollapsibleTable.selectedRows; this.parentCollapsibleTable.clearSelectedRows(); this.parentCollapsibleTable.deselectAllRows(); } this.rowBackgroundColor = this.activeRowBackgroundColor; this.rowTextColor = this.activeRowTextColor; } } }; /** * @param {?} event * @return {?} */ CollapsibleTableRowComponent.prototype.mouseup = /** * @param {?} event * @return {?} */ function (event) { // handle only if the Left mouse button pressed // and the row is a body row if (this.isLeftMouseButton(event) && this.isBodyRow) { // handle selection if (this.parentAllowsSelect) { if (!this.parentAllowsDeselectingRows) { this.parentCollapsibleTable.selectRow(this.index); } else { if (!this.dragSelection) { this.parentCollapsibleTable.toggleRowSelection(this.index); } } } // check row state this.parentCollapsibleTable.updateTable(); /*switch (true) { // parent allows selecting rows and the row is selected case this.parentAllowsSelect && this.selected: this.rowBackgroundColor = this.selectedRowBackgroundColor; this.rowTextColor = this.selectedRowTextColor; this.parentCollapsibleTable.updateTable(); break; // highlighted case this.isParentHighlight: this.rowBackgroundColor = this.parentHighlightRowBackgroundColor; this.rowTextColor = this.parentHighlightRowTextColor; break; // striped case this.isParentStriped: this.rowBackgroundColor = this.parentStripedRowBackgroundColor; this.rowTextColor = this.parentStripedRowTextColor; break; default: this.rowBackgroundColor = undefined; this.rowTextColor = undefined; break; }*/ // select multiple rows using the 'Shift' key if (this.parentAllowsSelect && this.parentAllowsSelectMultipleRows && event != null && event.shiftKey) { if (this.prevSelectedRows != null && this.prevSelectedRows.length > 0 && this.parentCollapsibleTable.selectedRows.length > 0) { /** @type {?} */ var rangeSelectedRows = this.prevSelectedRows.concat(this.parentCollapsibleTable.selectedRows); rangeSelectedRows.sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a - b; })); /** @type {?} */ var firstRowIndex = Math.min.apply(null, rangeSelectedRows); /** @type {?} */ var lastRowIndex = Math.max.apply(null, rangeSelectedRows); this.parentCollapsibleTable.selectRows(firstRowIndex, lastRowIndex); } } // set dragSelection flag to false. Prevents selection drag behavior this.dragSelection = false; // focus the collapsible table this.parentCollapsibleTable.focus(); } }; /** * @param {?} event * @return {?} */ CollapsibleTableRowComponent.prototype.mouseenter = /** * @param {?} event * @return {?} */ function (event) { // handle only if the row is a body row if (this.isBodyRow) { switch (true) { // the use is trying to select multiple rows by holding a mouse button case this.parentAllowsSelect && this.parentAllowsSelectMultipleRows && this.parentCollapsibleTable.mouseDownHold: this.parentCollapsibleTable.selectRow(this.index); this.dragSelection = true; break; // parent allows selecting rows and the row is selected case this.parentAllowsSelect && this.selected: break; // highlighted case this.isParentHighlight: this.rowBackgroundColor = this.parentHighlightRowBackgroundColor; this.rowTextColor = this.parentHighlightRowTextColor; break; } } }; /** * @param {?} event * @return {?} */ CollapsibleTableRowComponent.prototype.mouseleave = /** * @param {?} event * @return {?} */ function (event) { // handle only if the row is a body row if (this.isBodyRow) { // check row state switch (true) { // the use is trying to select multiple rows by holding a mouse button case this.parentAllowsSelect && this.parentAllowsSelectMultipleRows && this.parentCollapsibleTable.mouseDownHold: this.parentCollapsibleTable.selectRow(this.index); this.dragSelection = false; break; // parent allows selecting rows and the row is selected case this.parentAllowsSelect && this.selected: break; // stripped case this.isParentStriped: this.rowBackgroundColor = this.parentStripedRowBackgroundColor; this.rowTextColor = this.parentStripedRowTextColor; break; default: this.rowBackgroundColor = undefined; this.rowTextColor = undefined; break; } } }; /** * @param {?} event * @return {?} */ CollapsibleTableRowComponent.prototype.click = /** * @param {?} event * @return {?} */ function (event) { if (this.detail != null) { /** @type {?} */ var target = (/** @type {?} */ ((event.target || event.srcElement || event.currentTarget))); if (target != null && ['TR', 'TD'].indexOf(target.tagName) > -1) { this.detail.subject.next(); } } }; CollapsibleTableRowComponent.EASE_OUT_QUAD = 'cubic-bezier(0.25, 0.46, 0.45, 0.94)'; CollapsibleTableRowComponent.DEFAULT_STRIPED_ODD_ROW_COLOR = 'rgba(242,242,242,0.8)'; CollapsibleTableRowComponent.DEFAULT_STRIPED_EVEN_ROW_COLOR = 'transparent'; CollapsibleTableRowComponent.DEFAULT_HIGHLIGHT_ROW_COLOR = 'rgba(222,222,222, 0.8)'; CollapsibleTableRowComponent.DEFAULT_ACTIVE_ROW_COLOR = 'rgba(212,212,212, 0.8)'; CollapsibleTableRowComponent.DEFAULT_SELECTED_ROW_COLOR = 'rgba(212,212,212, 0.8)'; CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR = 'black'; CollapsibleTableRowComponent.decorators = [ { type: Component, args: [{ selector: 'collapsible-table-row', template: "<ng-content></ng-content>", styles: ["\n :host {\n display: table-row;\n transition-property: background-color, color;\n }\n "] }] } ]; /** @nocollapse */ CollapsibleTableRowComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: DomSanitizer }, { type: CollapsibleService } ]; }; CollapsibleTableRowComponent.propDecorators = { detail: [{ type: Input }], rowTextColor: [{ type: HostBinding, args: ['style.color',] }], rowBackgroundColor: [{ type: HostBinding, args: ['style.background-color',] }], backgroundTransitionDuration: [{ type: HostBinding, args: ['style.transition-duration',] }], backgroundTransitionTimingFunction: [{ type: HostBinding, args: ['style.transition-timing-function',] }], selected: [{ type: HostBinding, args: ['class.selected',] }], mousedown: [{ type: HostListener, args: ['mousedown', ['$event'],] }], mouseup: [{ type: HostListener, args: ['mouseup', ['$event'],] }], mouseenter: [{ type: HostListener, args: ['mouseenter', ['$event'],] }], mouseleave: [{ type: HostListener, args: ['mouseleave', ['$event'],] }], click: [{ type: HostListener, args: ['click', ['$event'],] }] }; return CollapsibleTableRowComponent; }()); export { CollapsibleTableRowComponent }; if (false) { /** * @type {?} * @private */ CollapsibleTableRowComponent.EASE_OUT_QUAD; /** @type {?} */ CollapsibleTableRowComponent.DEFAULT_STRIPED_ODD_ROW_COLOR; /** @type {?} */ CollapsibleTableRowComponent.DEFAULT_STRIPED_EVEN_ROW_COLOR; /** @type {?} */ CollapsibleTableRowComponent.DEFAULT_HIGHLIGHT_ROW_COLOR; /** @type {?} */ CollapsibleTableRowComponent.DEFAULT_ACTIVE_ROW_COLOR; /** @type {?} */ CollapsibleTableRowComponent.DEFAULT_SELECTED_ROW_COLOR; /** @type {?} */ CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; /** @type {?} */ CollapsibleTableRowComponent.prototype.detail; /** @type {?} */ CollapsibleTableRowComponent.prototype.rowTextColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.rowBackgroundColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.backgroundTransitionDuration; /** @type {?} */ CollapsibleTableRowComponent.prototype.backgroundTransitionTimingFunction; /** @type {?} */ CollapsibleTableRowComponent.prototype.selected; /** @type {?} */ CollapsibleTableRowComponent.prototype.isHeadRow; /** @type {?} */ CollapsibleTableRowComponent.prototype.isBodyRow; /** @type {?} */ CollapsibleTableRowComponent.prototype.isOddRow; /** @type {?} */ CollapsibleTableRowComponent.prototype.isEvenRow; /** @type {?} */ CollapsibleTableRowComponent.prototype.isParentStriped; /** @type {?} */ CollapsibleTableRowComponent.prototype.isParentHighlight; /** @type {?} */ CollapsibleTableRowComponent.prototype.parentAllowsSelect; /** @type {?} */ CollapsibleTableRowComponent.prototype.parentAllowsSelectMultipleRows; /** @type {?} */ CollapsibleTableRowComponent.prototype.parentStripedRowBackgroundColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.parentStripedRowTextColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.parentHighlightRowBackgroundColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.parentHighlightRowTextColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.activeRowBackgroundColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.activeRowTextColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.selectedRowBackgroundColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.selectedRowTextColor; /** @type {?} */ CollapsibleTableRowComponent.prototype.parentAllowsDeselectingRows; /** @type {?} */ CollapsibleTableRowComponent.prototype.index; /** * @type {?} * @private */ CollapsibleTableRowComponent.prototype.parentCollapsibleTable; /** * @type {?} * @private */ CollapsibleTableRowComponent.prototype.prevSelectedRows; /** * @type {?} * @private */ CollapsibleTableRowComponent.prototype.dragSelection; /** * @type {?} * @private */ CollapsibleTableRowComponent.prototype.el; /** * @type {?} * @private */ CollapsibleTableRowComponent.prototype.sanitizer; /** * @type {?} * @private */ CollapsibleTableRowComponent.prototype.collapsibleService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFwc2libGUtdGFibGUtcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIyLWNvbGxhcHNpYmxlLyIsInNvdXJjZXMiOlsibGliL2NvbGxhcHNpYmxlLXRhYmxlLXJvdy9jb2xsYXBzaWJsZS10YWJsZS1yb3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFDaEMsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQztBQUU1SCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVyRTtJQTZESSxzQ0FDWSxFQUFjLEVBQ2QsU0FBdUIsRUFDdkIsa0JBQXNDO1FBRnRDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFwQ1IsaUNBQTRCLEdBQUcsTUFBTSxDQUFDOztRQUdoRix1Q0FBa0MsR0FBRyxJQUFJLENBQUMsU0FBUzthQUM5Qyx3QkFBd0IsQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUkxRSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsbUNBQThCLEdBQUcsS0FBSyxDQUFDO1FBVXZDLGdDQUEyQixHQUFHLEtBQUssQ0FBQztRQU01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WSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzswQkFvQnBDLFlBQVksU0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7NkJBaUVsQyxZQUFZLFNBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDOzZCQXNCckMsWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQzt3QkEyQnJDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBV3JDLG1DQUFDO0NBQUEsQUF2VUQsSUF1VUM7U0E3VFksNEJBQTRCOzs7Ozs7SUFFckMsMkNBQXNFOztJQUV0RSwyREFBc0U7O0lBQ3RFLDREQUE2RDs7SUFDN0QseURBQXFFOztJQUNyRSxzREFBa0U7O0lBQ2xFLHdEQUFvRTs7SUFFcEUsb0RBQStDOztJQUUvQyw4Q0FBb0Q7O0lBRXBELG9EQUFpRDs7SUFFakQsMERBQWtFOztJQUVsRSxvRUFBZ0Y7O0lBRWhGLDBFQUUwRTs7SUFFMUUsZ0RBQWlEOztJQUVqRCxpREFBa0I7O0lBQ2xCLGlEQUFrQjs7SUFDbEIsZ0RBQWlCOztJQUNqQixpREFBa0I7O0lBQ2xCLHVEQUF3Qjs7SUFDeEIseURBQTBCOztJQUMxQiwwREFBMkI7O0lBQzNCLHNFQUF1Qzs7SUFFdkMsdUVBQXdDOztJQUN4QyxpRUFBa0M7O0lBQ2xDLHlFQUEwQzs7SUFDMUMsbUVBQW9DOztJQUNwQyxnRUFBaUM7O0lBQ2pDLDBEQUEyQjs7SUFDM0Isa0VBQW1DOztJQUNuQyw0REFBNkI7O0lBQzdCLG1FQUFvQzs7SUFFcEMsNkNBQWM7Ozs7O0lBRWQsOERBQTBEOzs7OztJQUMxRCx3REFBd0M7Ozs7O0lBQ3hDLHFEQUE4Qjs7Ozs7SUFHMUIsMENBQXNCOzs7OztJQUN0QixpREFBK0I7Ozs7O0lBQy9CLDBEQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsXHJcbiAgICBJbnB1dCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lcixcclxuICAgIEVsZW1lbnRSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5pbXBvcnQgeyBDb2xsYXBzaWJsZVRhYmxlUm93RGV0YWlsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sbGFwc2libGUtdGFibGUtcm93LWRldGFpbC9jb2xsYXBzaWJsZS10YWJsZS1yb3ctZGV0YWlsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbGxhcHNpYmxlVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb2xsYXBzaWJsZS10YWJsZS9jb2xsYXBzaWJsZS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb2xsYXBzaWJsZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb2xsYXBzaWJsZS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjb2xsYXBzaWJsZS10YWJsZS1yb3cnLFxyXG4gICAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcclxuICAgIHN0eWxlczogW2BcclxuICAgICAgICA6aG9zdCB7XHJcbiAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdztcclxuICAgICAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvciwgY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgYF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBFQVNFX09VVF9RVUFEID0gJ2N1YmljLWJlemllcigwLjI1LCAwLjQ2LCAwLjQ1LCAwLjk0KSc7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NUUklQRURfT0REX1JPV19DT0xPUiA9ICdyZ2JhKDI0MiwyNDIsMjQyLDAuOCknO1xyXG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NUUklQRURfRVZFTl9ST1dfQ09MT1IgPSAndHJhbnNwYXJlbnQnO1xyXG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX0hJR0hMSUdIVF9ST1dfQ09MT1IgPSAncmdiYSgyMjIsMjIyLDIyMiwgMC44KSc7XHJcbiAgICBwdWJsaWMgc3RhdGljIERFRkFVTFRfQUNUSVZFX1JPV19DT0xPUiA9ICdyZ2JhKDIxMiwyMTIsMjEyLCAwLjgpJztcclxuICAgIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9TRUxFQ1RFRF9ST1dfQ09MT1IgPSAncmdiYSgyMTIsMjEyLDIxMiwgMC44KSc7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX1JPV19URVhUX0NPTE9SID0gJ2JsYWNrJztcclxuXHJcbiAgICBASW5wdXQoKSBkZXRhaWw6IENvbGxhcHNpYmxlVGFibGVSb3dEZXRhaWxDb21wb25lbnQ7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5jb2xvcicpIHJvd1RleHRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuYmFja2dyb3VuZC1jb2xvcicpIHJvd0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnc3R5bGUudHJhbnNpdGlvbi1kdXJhdGlvbicpIGJhY2tncm91bmRUcmFuc2l0aW9uRHVyYXRpb24gPSAnMC4zcyc7XHJcbiAgICAvLyB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZUluUXVhZFxyXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS50cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicpXHJcbiAgICBiYWNrZ3JvdW5kVHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uID0gdGhpcy5zYW5pdGl6ZXJcclxuICAgICAgICAuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKENvbGxhcHNpYmxlVGFibGVSb3dDb21wb25lbnQuRUFTRV9PVVRfUVVBRCk7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZWxlY3RlZCcpIHNlbGVjdGVkOiBib29sZWFuO1xyXG5cclxuICAgIGlzSGVhZFJvdyA9IGZhbHNlO1xyXG4gICAgaXNCb2R5Um93ID0gZmFsc2U7XHJcbiAgICBpc09kZFJvdyA9IGZhbHNlO1xyXG4gICAgaXNFdmVuUm93ID0gZmFsc2U7XHJcbiAgICBpc1BhcmVudFN0cmlwZWQgPSBmYWxzZTtcclxuICAgIGlzUGFyZW50SGlnaGxpZ2h0ID0gZmFsc2U7XHJcbiAgICBwYXJlbnRBbGxvd3NTZWxlY3QgPSBmYWxzZTtcclxuICAgIHBhcmVudEFsbG93c1NlbGVjdE11bHRpcGxlUm93cyA9IGZhbHNlO1xyXG5cclxuICAgIHBhcmVudFN0cmlwZWRSb3dCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcclxuICAgIHBhcmVudFN0cmlwZWRSb3dUZXh0Q29sb3I6IHN0cmluZztcclxuICAgIHBhcmVudEhpZ2hsaWdodFJvd0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xyXG4gICAgcGFyZW50SGlnaGxpZ2h0Um93VGV4dENvbG9yOiBzdHJpbmc7XHJcbiAgICBhY3RpdmVSb3dCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcclxuICAgIGFjdGl2ZVJvd1RleHRDb2xvcjogc3RyaW5nO1xyXG4gICAgc2VsZWN0ZWRSb3dCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcclxuICAgIHNlbGVjdGVkUm93VGV4dENvbG9yOiBzdHJpbmc7XHJcbiAgICBwYXJlbnRBbGxvd3NEZXNlbGVjdGluZ1Jvd3MgPSBmYWxzZTtcclxuXHJcbiAgICBpbmRleDogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgcGFyZW50Q29sbGFwc2libGVUYWJsZTogQ29sbGFwc2libGVUYWJsZUNvbXBvbmVudDtcclxuICAgIHByaXZhdGUgcHJldlNlbGVjdGVkUm93czogQXJyYXk8bnVtYmVyPjtcclxuICAgIHByaXZhdGUgZHJhZ1NlbGVjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICBwcml2YXRlIGNvbGxhcHNpYmxlU2VydmljZTogQ29sbGFwc2libGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBjb25zdCBlbGVtOiBFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRib2R5OiBFbGVtZW50ID0gZWxlbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGlmICh0Ym9keS50YWdOYW1lID09PSAnVEJPRFknKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNpYmxlVGFibGVSb3dzOiBOb2RlTGlzdE9mPEVsZW1lbnQ+ID0gdGJvZHkucXVlcnlTZWxlY3RvckFsbCgnY29sbGFwc2libGUtdGFibGUtcm93Jyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbGFwc2libGVUYWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNpYmxlVGFibGVSb3c6IEVsZW1lbnQgPSBjb2xsYXBzaWJsZVRhYmxlUm93c1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsYXBzaWJsZVRhYmxlUm93ID09PSBlbGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZXRyaWV2ZSBwYXJlbnQgQ29sbGFwc2libGVUYWJsZUNvbXBvbmVudCB0aHJvdWdoIHRoZSBDb2xsYXBzaWJsZVNlcnZpY2VcclxuICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUgPSB0aGlzLmNvbGxhcHNpYmxlU2VydmljZS5nZXRDb2xsYXBzaWJsZVRhYmxlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2xsYXBzaWJsZS10YWJsZSBpcyBtYXJrZWQgdG8gc2hvdyBzdHJpcGVkIHRhYmxlXHJcbiAgICAgICAgICAgIHRoaXMuaXNQYXJlbnRTdHJpcGVkID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnN0cmlwZWQ7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2xsYXBzaWJsZS10YWJsZSBpcyBtYXJrZWQgdG8gaGlnaGxpZ2h0IGN1cnJlbnQgcm93XHJcbiAgICAgICAgICAgIHRoaXMuaXNQYXJlbnRIaWdobGlnaHQgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuaGlnaGxpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudEhpZ2hsaWdodFJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5oaWdobGlnaHRDb2xvciB8fFxyXG4gICAgICAgICAgICAgICAgQ29sbGFwc2libGVUYWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX0hJR0hMSUdIVF9ST1dfQ09MT1I7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50SGlnaGxpZ2h0Um93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLmhpZ2hsaWdodFRleHRDb2xvciB8fFxyXG4gICAgICAgICAgICAgICAgQ29sbGFwc2libGVUYWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX1JPV19URVhUX0NPTE9SO1xyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29sbGFwc2libGUtdGFibGUgc3BlY2lmaWVzIHRoZSBhY3RpdmUgcm93IGNvbG9yXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlUm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLmFjdGl2ZUNvbG9yIHx8XHJcbiAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfQUNUSVZFX1JPV19DT0xPUjtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVSb3dUZXh0Q29sb3IgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuYWN0aXZlVGV4dENvbG9yIHx8XHJcbiAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfUk9XX1RFWFRfQ09MT1I7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2xsYXBzaWJsZS10YWJsZSBhbGxvd3Mgc2VsZWN0aW5nIHJvd3NcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnRBbGxvd3NTZWxlY3QgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuc2VsZWN0O1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudEFsbG93c1NlbGVjdE11bHRpcGxlUm93cyA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5zZWxlY3RNdWx0aXBsZVJvd3M7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2xsYXBzaWJsZS10YWJsZSBzcGVjaWZpZXMgYSBjb2xvciBmb3IgdGhlIHNlbGVjdGVkIHJvd1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnNlbGVjdENvbG9yIHx8XHJcbiAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfU0VMRUNURURfUk9XX0NPTE9SO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnNlbGVjdFRleHRDb2xvciB8fFxyXG4gICAgICAgICAgICAgICAgQ29sbGFwc2libGVUYWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX1JPV19URVhUX0NPTE9SO1xyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29sbGFwc2libGUtdGFibGUgYWxsb3dzIHRvIGRlc2VsZWN0IHJvd3NcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnRBbGxvd3NEZXNlbGVjdGluZ1Jvd3MgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuYWxsb3dEZXNlbGVjdGluZ1Jvd3MgIT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuYWxsb3dEZXNlbGVjdGluZ1Jvd3MgOiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlUm93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUm93KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVsZW06IEVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIGRldGVybWluZSBpZiB0aGUgcm93IGlzIGluc2lkZSB0aGUgJ3RoZWFkJ1xyXG4gICAgICAgIGNvbnN0IHRoID0gZWxlbS5xdWVyeVNlbGVjdG9yKCd0aCcpO1xyXG4gICAgICAgIGlmICh0aCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZWFkUm93ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGRldGVybWluZSBpZiB0aGUgcm93IGlzIGluc2lkZSB0aGUgJ3Rib2R5J1xyXG4gICAgICAgIGNvbnN0IHRkID0gZWxlbS5xdWVyeVNlbGVjdG9yKCd0ZCcpO1xyXG4gICAgICAgIGlmICh0ZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNCb2R5Um93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoZSByb3cgaXMgJ29kZCcgb3IgJ2V2ZW50J1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCAlIDIgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNFdmVuUm93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50U3RyaXBlZFJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5zdHJpcGVkRXZlbkNvbG9yIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgQ29sbGFwc2libGVUYWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX1NUUklQRURfRVZFTl9ST1dfQ09MT1I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFN0cmlwZWRSb3dUZXh0Q29sb3IgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuc3RyaXBlZEV2ZW5UZXh0Q29sb3IgfHxcclxuICAgICAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfUk9XX1RFWFRfQ09MT1I7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzT2RkUm93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50U3RyaXBlZFJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5zdHJpcGVkT2RkQ29sb3IgfHxcclxuICAgICAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfU1RSSVBFRF9PRERfUk9XX0NPTE9SO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRTdHJpcGVkUm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnN0cmlwZWRPZGRUZXh0Q29sb3IgfHxcclxuICAgICAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfUk9XX1RFWFRfQ09MT1I7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLnBhcmVudEFsbG93c1NlbGVjdCAmJiB0aGlzLnNlbGVjdGVkOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5zZWxlY3RlZFJvd0JhY2tncm91bmRDb2xvcjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1RleHRDb2xvciA9IHRoaXMuc2VsZWN0ZWRSb3dUZXh0Q29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuaXNQYXJlbnRTdHJpcGVkOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5wYXJlbnRTdHJpcGVkUm93QmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRTdHJpcGVkUm93VGV4dENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRIZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzTGVmdE1vdXNlQnV0dG9uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uOiBudW1iZXIgPSBldmVudC5idXR0b247XHJcbiAgICAgICAgY29uc3Qgd2hpY2g6IG51bWJlciA9IGV2ZW50Wyd3aGljaCddO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IDxIVE1MRWxlbWVudD4oZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQgfHwgZXZlbnQuY3VycmVudFRhcmdldCk7XHJcblxyXG4gICAgICAgIGlmIChbJ1RSJywgJ1REJ10uaW5kZXhPZih0YXJnZXQudGFnTmFtZSkgPiAtMSkge1xyXG4gICAgICAgICAgICBpZiAoJ2J1dHRvbicgaW4gZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBidXR0b24gPT09IDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHdoaWNoIHx8IGJ1dHRvbikgPT09IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgbW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gaGFuZGxlIG9ubHkgaWYgdGhlIExlZnQgbW91c2UgYnV0dG9uIHByZXNzZWRcclxuICAgICAgICAvLyBhbmQgdGhlIHJvdyBpcyBhIGJvZHkgcm93XHJcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0TW91c2VCdXR0b24oZXZlbnQpICYmIHRoaXMuaXNCb2R5Um93KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUubm9UZXh0U2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQm9keVJvdykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50QWxsb3dzU2VsZWN0ICYmICF0aGlzLnBhcmVudEFsbG93c0Rlc2VsZWN0aW5nUm93cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldlNlbGVjdGVkUm93cyA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5zZWxlY3RlZFJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLmNsZWFyU2VsZWN0ZWRSb3dzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLmRlc2VsZWN0QWxsUm93cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmFjdGl2ZVJvd0JhY2tncm91bmRDb2xvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMucm93VGV4dENvbG9yID0gdGhpcy5hY3RpdmVSb3dUZXh0Q29sb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgICBtb3VzZXVwKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gaGFuZGxlIG9ubHkgaWYgdGhlIExlZnQgbW91c2UgYnV0dG9uIHByZXNzZWRcclxuICAgICAgICAvLyBhbmQgdGhlIHJvdyBpcyBhIGJvZHkgcm93XHJcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0TW91c2VCdXR0b24oZXZlbnQpICYmIHRoaXMuaXNCb2R5Um93KSB7XHJcbiAgICAgICAgICAgIC8vIGhhbmRsZSBzZWxlY3Rpb25cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50QWxsb3dzU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50QWxsb3dzRGVzZWxlY3RpbmdSb3dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnNlbGVjdFJvdyh0aGlzLmluZGV4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRyYWdTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbih0aGlzLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIHJvdyBzdGF0ZVxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUudXBkYXRlVGFibGUoKTtcclxuICAgICAgICAgICAgLypzd2l0Y2ggKHRydWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHBhcmVudCBhbGxvd3Mgc2VsZWN0aW5nIHJvd3MgYW5kIHRoZSByb3cgaXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5wYXJlbnRBbGxvd3NTZWxlY3QgJiYgdGhpcy5zZWxlY3RlZDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMuc2VsZWN0ZWRSb3dCYWNrZ3JvdW5kQ29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dUZXh0Q29sb3IgPSB0aGlzLnNlbGVjdGVkUm93VGV4dENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS51cGRhdGVUYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgLy8gaGlnaGxpZ2h0ZWRcclxuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5pc1BhcmVudEhpZ2hsaWdodDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMucGFyZW50SGlnaGxpZ2h0Um93QmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRIaWdobGlnaHRSb3dUZXh0Q29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAvLyBzdHJpcGVkXHJcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuaXNQYXJlbnRTdHJpcGVkOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5wYXJlbnRTdHJpcGVkUm93QmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRTdHJpcGVkUm93VGV4dENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0JhY2tncm91bmRDb2xvciA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1RleHRDb2xvciA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfSovXHJcblxyXG4gICAgICAgICAgICAvLyBzZWxlY3QgbXVsdGlwbGUgcm93cyB1c2luZyB0aGUgJ1NoaWZ0JyBrZXlcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50QWxsb3dzU2VsZWN0ICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEFsbG93c1NlbGVjdE11bHRpcGxlUm93cyAmJlxyXG4gICAgICAgICAgICAgICAgZXZlbnQgIT0gbnVsbCAmJiBldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldlNlbGVjdGVkUm93cyAhPSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2U2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5nZVNlbGVjdGVkUm93cyA9IHRoaXMucHJldlNlbGVjdGVkUm93cy5jb25jYXQodGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnNlbGVjdGVkUm93cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VTZWxlY3RlZFJvd3Muc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Um93SW5kZXggPSBNYXRoLm1pbi5hcHBseShudWxsLCByYW5nZVNlbGVjdGVkUm93cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdFJvd0luZGV4ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgcmFuZ2VTZWxlY3RlZFJvd3MpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuc2VsZWN0Um93cyhmaXJzdFJvd0luZGV4LCBsYXN0Um93SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgZHJhZ1NlbGVjdGlvbiBmbGFnIHRvIGZhbHNlLiBQcmV2ZW50cyBzZWxlY3Rpb24gZHJhZyBiZWhhdmlvclxyXG4gICAgICAgICAgICB0aGlzLmRyYWdTZWxlY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGZvY3VzIHRoZSBjb2xsYXBzaWJsZSB0YWJsZVxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicsIFsnJGV2ZW50J10pXHJcbiAgICBtb3VzZWVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gaGFuZGxlIG9ubHkgaWYgdGhlIHJvdyBpcyBhIGJvZHkgcm93XHJcbiAgICAgICAgaWYgKHRoaXMuaXNCb2R5Um93KSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHVzZSBpcyB0cnlpbmcgdG8gc2VsZWN0IG11bHRpcGxlIHJvd3MgYnkgaG9sZGluZyBhIG1vdXNlIGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLnBhcmVudEFsbG93c1NlbGVjdCAmJiB0aGlzLnBhcmVudEFsbG93c1NlbGVjdE11bHRpcGxlUm93cyAmJiB0aGlzLnBhcmVudENvbGx