UNPKG

angular2-collapsible

Version:

Angular collapsible component styled with Materialize CSS.

644 lines 65.4 kB
/** * @fileoverview added by tsickle * Generated from: lib/collapsible-table/collapsible-table.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, HostBinding, HostListener, ElementRef, ContentChildren } from '@angular/core'; import { CollapsibleTableRowComponent } from '../collapsible-table-row/collapsible-table-row.component'; import { CollapsibleService } from '../services/collapsible.service'; var CollapsibleTableComponent = /** @class */ (function () { function CollapsibleTableComponent(el, collapsibleService) { this.el = el; this.collapsibleService = collapsibleService; // allows navigation between table rows using arrow keys this.allowKeyboardNavigation = true; this.fixedTableHeight = 'auto'; this.tabindex = 0; this.selectedRows = []; // specifies collapsible type. Can be either 'accordion' or 'expandable' this.type = 'accordion'; this.mouseDownHold = false; } /** * @return {?} */ CollapsibleTableComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @return {?} */ CollapsibleTableComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { // this.updateFixedTableHeight(); /* LOG(`CollapsibleTableComponent::ngOnInit()\n` + `this = {\n` + `bordered = ${this.bordered}\n` + `borderedHorizontally = ${this.borderedHorizontally}\n` + `borderedVertically = ${this.borderedVertically}\n` + `striped = ${this.striped}\n` + `stripedOddColor = ${this.stripedOddColor}\n` + `stripedEvenColor = ${this.stripedEvenColor}\n` + `highlight = ${this.highlight}\n` + `highlightColor = ${this.highlightColor}\n` + `highlightTextColor = ${this.highlightTextColor}\n` + `activeColor = ${this.activeColor}\n` + `activeTextColor = ${this.activeTextColor}\n` + `centered = ${this.centered}\n` + `responsive = ${this.responsive}\n` + `select = ${this.select}\n` + `selectColor = ${this.selectColor}\n` + `selectTextColor = ${this.selectTextColor}\n` + `selectMultipleRows = ${this.selectMultipleRows}\n` + `noTextSelect = ${this.noTextSelect}\n` + `}`); */ }; /** * @param {?} changes * @return {?} */ CollapsibleTableComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { for (var change in changes) { if (changes.hasOwnProperty(change)) { if (this.collapsibleTableRows != null) { switch (change) { case 'striped': case 'stripedOddColor': case 'stripedOddTextColor': case 'stripedEvenColor': case 'stripedEvenTextColor': this.updateTable('striped'); break; case 'highlight': case 'highlightColor': case 'highlightTextColor': this.updateTable('highlight'); break; case 'activeColor': case 'activeTextColor': this.updateTable('active'); break; case 'select': case 'selectColor': case 'selectTextColor': case 'selectMultipleRows': case 'allowDeselectingRows': this.updateTable('select'); break; } } // update collapsible table type in CollapsibleService if (change === 'type') { this.type = changes.type.currentValue; this.collapsibleService.setType(this.type); } } } this.collapsibleService.setCollapsibleTable(this); }; /** * @return {?} */ CollapsibleTableComponent.prototype.focus = /** * @return {?} */ function () { this.el.nativeElement.focus(); }; /** * @param {?} index * @return {?} */ CollapsibleTableComponent.prototype.addSelectedRow = /** * @param {?} index * @return {?} */ function (index) { switch (true) { case this.selectMultipleRows && this.selectedRows.indexOf(index) === -1: this.selectedRows.push(index); this.selectedRows.sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a - b; })); break; case !this.selectMultipleRows: this.selectedRows = []; this.deselectAllRows(); this.selectedRows.push(index); this.selectedRows.sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a - b; })); break; } }; /** * @param {?} index * @return {?} */ CollapsibleTableComponent.prototype.removeSelectedRow = /** * @param {?} index * @return {?} */ function (index) { if (this.selectedRows.indexOf(index) !== -1) { this.selectedRows.splice(this.selectedRows.indexOf(index), 1); } }; /** * @return {?} */ CollapsibleTableComponent.prototype.clearSelectedRows = /** * @return {?} */ function () { this.selectedRows = []; }; /** * @return {?} */ CollapsibleTableComponent.prototype.deselectAllRows = /** * @return {?} */ function () { this.collapsibleTableRows.forEach((/** * @param {?} row * @return {?} */ function (row) { row.selected = false; row.updateRow(); })); }; /** * @param {?} index * @return {?} */ CollapsibleTableComponent.prototype.selectRow = /** * @param {?} index * @return {?} */ function (index) { var _this = this; if (this.select) { switch (true) { case index === 0: this.selectRow(1); break; case index === this.collapsibleTableRows.length: this.selectRow(this.collapsibleTableRows.length - 1); break; case 0 < index && index <= this.collapsibleTableRows.length - 1: this.addSelectedRow(index); this.collapsibleTableRows.forEach((/** * @param {?} row * @param {?} i * @return {?} */ function (row, i) { if (index !== i) { if (!_this.selectMultipleRows) { row.selected = false; } } else { row.selected = true; } row.updateRow(); })); break; } } }; /** * @param {?} firstRowIndex * @param {?} lastRowIndex * @return {?} */ CollapsibleTableComponent.prototype.selectRows = /** * @param {?} firstRowIndex * @param {?} lastRowIndex * @return {?} */ function (firstRowIndex, lastRowIndex) { var _this = this; if (this.selectMultipleRows && 0 < firstRowIndex && firstRowIndex < lastRowIndex && lastRowIndex <= this.collapsibleTableRows.length - 1) { this.clearSelectedRows(); this.collapsibleTableRows.forEach((/** * @param {?} row * @param {?} i * @return {?} */ function (row, i) { if (firstRowIndex <= i && i <= lastRowIndex) { _this.addSelectedRow(i); row.selected = true; } else { row.selected = false; } row.updateRow(); })); } }; /** * @param {?} index * @return {?} */ CollapsibleTableComponent.prototype.toggleRowSelection = /** * @param {?} index * @return {?} */ function (index) { var _this = this; if (this.select && 0 < index && index <= this.collapsibleTableRows.length - 1) { this.collapsibleTableRows.forEach((/** * @param {?} row * @param {?} i * @return {?} */ function (row, i) { if (index === i) { if (row.selected) { _this.removeSelectedRow(index); } else { _this.addSelectedRow(index); } row.selected = !row.selected; row.updateRow(); } })); } }; /*updateFixedTableHeight() { this.fixedTableHeight = this.el.nativeElement.offsetHeight + 'px'; let elem: Element = this.el.nativeElement; let rowHeights = 0; if (this.collapsibleTableRowComponent != null) { this.collapsibleTableRowComponent.forEach(row => { }); } }*/ /*updateFixedTableHeight() { this.fixedTableHeight = this.el.nativeElement.offsetHeight + 'px'; let elem: Element = this.el.nativeElement; let rowHeights = 0; if (this.collapsibleTableRowComponent != null) { this.collapsibleTableRowComponent.forEach(row => { }); } }*/ /** * @param {?} row * @return {?} */ CollapsibleTableComponent.prototype.updateStriped = /*updateFixedTableHeight() { this.fixedTableHeight = this.el.nativeElement.offsetHeight + 'px'; let elem: Element = this.el.nativeElement; let rowHeights = 0; if (this.collapsibleTableRowComponent != null) { this.collapsibleTableRowComponent.forEach(row => { }); } }*/ /** * @param {?} row * @return {?} */ function (row) { if (this.striped && row.isBodyRow) { row.isParentStriped = true; if (row.isOddRow) { row.parentStripedRowBackgroundColor = this.stripedOddColor || CollapsibleTableRowComponent.DEFAULT_STRIPED_ODD_ROW_COLOR; row.parentStripedRowTextColor = this.stripedOddTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; row.rowBackgroundColor = row.parentStripedRowBackgroundColor; row.rowTextColor = row.parentStripedRowTextColor; } else { row.parentStripedRowBackgroundColor = this.stripedEvenColor || CollapsibleTableRowComponent.DEFAULT_STRIPED_EVEN_ROW_COLOR; row.parentStripedRowTextColor = this.stripedEvenTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; row.rowBackgroundColor = row.parentStripedRowBackgroundColor; row.rowTextColor = row.parentStripedRowTextColor; } } else { row.isParentStriped = false; row.rowBackgroundColor = undefined; row.rowTextColor = undefined; } }; /** * @param {?} row * @return {?} */ CollapsibleTableComponent.prototype.updateHighlight = /** * @param {?} row * @return {?} */ function (row) { row.isParentHighlight = this.highlight; row.parentHighlightRowBackgroundColor = this.highlightColor || CollapsibleTableRowComponent.DEFAULT_HIGHLIGHT_ROW_COLOR; row.parentHighlightRowTextColor = this.highlightTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; }; /** * @param {?} row * @return {?} */ CollapsibleTableComponent.prototype.updateActive = /** * @param {?} row * @return {?} */ function (row) { row.activeRowBackgroundColor = this.activeColor || CollapsibleTableRowComponent.DEFAULT_ACTIVE_ROW_COLOR; row.activeRowTextColor = this.activeTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; }; /** * @param {?} row * @return {?} */ CollapsibleTableComponent.prototype.updateSelect = /** * @param {?} row * @return {?} */ function (row) { row.parentAllowsSelect = this.select; row.parentAllowsSelectMultipleRows = this.selectMultipleRows; row.parentAllowsDeselectingRows = this.allowDeselectingRows; if (row.selected) { row.selectedRowBackgroundColor = this.selectColor || CollapsibleTableRowComponent.DEFAULT_SELECTED_ROW_COLOR; row.selectedRowTextColor = this.selectTextColor || CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR; row.rowBackgroundColor = row.selectedRowBackgroundColor; row.rowTextColor = row.selectedRowTextColor; } }; /** * @param {?=} change * @return {?} */ CollapsibleTableComponent.prototype.updateTable = /** * @param {?=} change * @return {?} */ function (change) { var _this = this; if (this.collapsibleTableRows != null) { if (change != null) { switch (change) { case 'striped': // propagate changes to each of the CollapsibleTableRowComponent children this.collapsibleTableRows.forEach((/** * @param {?} row * @return {?} */ function (row) { _this.updateStriped(row); })); break; case 'highlight': this.collapsibleTableRows.forEach((/** * @param {?} row * @return {?} */ function (row) { _this.updateHighlight(row); })); break; case 'active': this.collapsibleTableRows.forEach((/** * @param {?} row * @return {?} */ function (row) { _this.updateActive(row); })); break; case 'select': this.collapsibleTableRows.forEach((/** * @param {?} row * @return {?} */ function (row) { _this.updateSelect(row); })); break; } } else { // propagate changes to each of the CollapsibleTableRowComponent children this.collapsibleTableRows.forEach((/** * @param {?} row * @return {?} */ function (row) { _this.updateStriped(row); _this.updateHighlight(row); _this.updateSelect(row); _this.updateActive(row); })); } } }; /** * @param {?} event * @return {?} */ CollapsibleTableComponent.prototype.keydown = /** * @param {?} event * @return {?} */ function (event) { // select a row only if 'select' property is set to 'true' if (this.select && this.allowKeyboardNavigation) { /** @enum {number} */ var Key = { arrowUp: 38, arrowDown: 40, home: 36, end: 35, }; Key[Key.arrowUp] = 'arrowUp'; Key[Key.arrowDown] = 'arrowDown'; Key[Key.home] = 'home'; Key[Key.end] = 'end'; /** @type {?} */ var index = 1; /** @type {?} */ var whichKey = event['which']; if (Key[whichKey] != null) { event.preventDefault(); event.stopPropagation(); switch (whichKey) { case Key.arrowUp: // select previous row if (this.selectedRows.length > 0) { index = this.selectedRows[this.selectedRows.length - 1]; index--; } break; case Key.arrowDown: // select next row if (this.selectedRows.length > 0) { index = this.selectedRows[this.selectedRows.length - 1]; index++; } break; case Key.home: index = 1; break; case Key.end: index = this.collapsibleTableRows.length - 1; break; } this.clearSelectedRows(); this.deselectAllRows(); this.selectRow(index); this.updateTable(); } } }; /** * @return {?} */ CollapsibleTableComponent.prototype.mousedown = /** * @return {?} */ function () { this.mouseDownHold = true; }; /** * @return {?} */ CollapsibleTableComponent.prototype.mouseup = /** * @return {?} */ function () { this.mouseDownHold = false; }; CollapsibleTableComponent.decorators = [ { type: Component, args: [{ selector: 'collapsible-table', template: "<ng-content></ng-content>", providers: [ CollapsibleService ], styles: ["\n :host {\n display: table;\n position: relative;\n width: 100%;\n border-collapse: collapse;\n }\n\n :host thead {\n border-bottom: 1px solid #d0d0d0;\n }\n\n :host /deep/ tbody /deep/ collapsible-table-row {\n cursor: pointer;\n }\n\n :host /deep/ collapsible-table-row th,\n :host /deep/ collapsible-table-row td {\n border-radius: 0;\n }\n\n :host[bordered='true'] {\n border-top: 1px solid #d0d0d0;\n border-right: 1px solid #d0d0d0;\n border-left: 1px solid #d0d0d0;\n }\n\n :host[bordered='true'] /deep/ collapsible-table-row,\n :host[borderedHorizontally='true'] /deep/ collapsible-table-row {\n border-bottom: 1px solid #d0d0d0;\n }\n\n :host[bordered='true'] /deep/ collapsible-table-row th,\n :host[bordered='true'] /deep/ collapsible-table-row td,\n :host[borderedVertically='true'] /deep/ collapsible-table-row th:not(:last-child),\n :host[borderedVertically='true'] /deep/ collapsible-table-row td:not(:last-child) {\n border-right: 1px solid #d0d0d0;\n }\n\n :host(.centered) /deep/ * {\n text-align: center;\n }\n\n :host(.noTextSelect) /deep/ collapsible-table-row th,\n :host(.noTextSelect) /deep/ collapsible-table-row td {\n user-select: none;\n }\n "] }] } ]; /** @nocollapse */ CollapsibleTableComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: CollapsibleService } ]; }; CollapsibleTableComponent.propDecorators = { bordered: [{ type: Input }, { type: HostBinding, args: ['attr.bordered',] }], borderedHorizontally: [{ type: Input }, { type: HostBinding, args: ['attr.borderedHorizontally',] }], borderedVertically: [{ type: Input }, { type: HostBinding, args: ['attr.borderedVertically',] }], striped: [{ type: Input }, { type: HostBinding, args: ['attr.striped',] }], stripedOddColor: [{ type: Input }, { type: HostBinding, args: ['attr.stripedOddColor',] }], stripedOddTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.stripedOddTextColor',] }], stripedEvenColor: [{ type: Input }, { type: HostBinding, args: ['attr.stripedEvenColor',] }], stripedEvenTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.stripedEvenTextColor',] }], highlight: [{ type: Input }, { type: HostBinding, args: ['attr.highlight',] }], highlightColor: [{ type: Input }, { type: HostBinding, args: ['attr.highlightColor',] }], highlightTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.highlightTextColor',] }], activeColor: [{ type: Input }, { type: HostBinding, args: ['attr.activeColor',] }], activeTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.activeTextColor',] }], centered: [{ type: Input }, { type: HostBinding, args: ['class.centered',] }, { type: HostBinding, args: ['attr.centered',] }], responsive: [{ type: Input }, { type: HostBinding, args: ['attr.responsive',] }], select: [{ type: Input }, { type: HostBinding, args: ['attr.select',] }], selectMultipleRows: [{ type: Input }, { type: HostBinding, args: ['attr.selectMultipleRows',] }], selectColor: [{ type: Input }, { type: HostBinding, args: ['attr.selectColor',] }], selectTextColor: [{ type: Input }, { type: HostBinding, args: ['attr.selectTextColor',] }], allowDeselectingRows: [{ type: Input }, { type: HostBinding, args: ['attr.allowDeselectingRows',] }], allowKeyboardNavigation: [{ type: Input }, { type: HostBinding, args: ['attr.allowKeyboardNavigation',] }], noTextSelect: [{ type: Input }, { type: HostBinding, args: ['class.noTextSelect',] }, { type: HostBinding, args: ['attr.noTextSelect',] }], tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }], type: [{ type: Input }, { type: HostBinding, args: ['attr.type',] }], collapsibleTableRows: [{ type: ContentChildren, args: [CollapsibleTableRowComponent,] }], keydown: [{ type: HostListener, args: ['keydown', ['$event'],] }], mousedown: [{ type: HostListener, args: ['mousedown',] }], mouseup: [{ type: HostListener, args: ['mouseup',] }] }; return CollapsibleTableComponent; }()); export { CollapsibleTableComponent }; if (false) { /** @type {?} */ CollapsibleTableComponent.prototype.bordered; /** @type {?} */ CollapsibleTableComponent.prototype.borderedHorizontally; /** @type {?} */ CollapsibleTableComponent.prototype.borderedVertically; /** @type {?} */ CollapsibleTableComponent.prototype.striped; /** @type {?} */ CollapsibleTableComponent.prototype.stripedOddColor; /** @type {?} */ CollapsibleTableComponent.prototype.stripedOddTextColor; /** @type {?} */ CollapsibleTableComponent.prototype.stripedEvenColor; /** @type {?} */ CollapsibleTableComponent.prototype.stripedEvenTextColor; /** @type {?} */ CollapsibleTableComponent.prototype.highlight; /** @type {?} */ CollapsibleTableComponent.prototype.highlightColor; /** @type {?} */ CollapsibleTableComponent.prototype.highlightTextColor; /** @type {?} */ CollapsibleTableComponent.prototype.activeColor; /** @type {?} */ CollapsibleTableComponent.prototype.activeTextColor; /** @type {?} */ CollapsibleTableComponent.prototype.centered; /** @type {?} */ CollapsibleTableComponent.prototype.responsive; /** @type {?} */ CollapsibleTableComponent.prototype.select; /** @type {?} */ CollapsibleTableComponent.prototype.selectMultipleRows; /** @type {?} */ CollapsibleTableComponent.prototype.selectColor; /** @type {?} */ CollapsibleTableComponent.prototype.selectTextColor; /** @type {?} */ CollapsibleTableComponent.prototype.allowDeselectingRows; /** @type {?} */ CollapsibleTableComponent.prototype.allowKeyboardNavigation; /** @type {?} */ CollapsibleTableComponent.prototype.noTextSelect; /** @type {?} */ CollapsibleTableComponent.prototype.fixedTableHeight; /** @type {?} */ CollapsibleTableComponent.prototype.tabindex; /** @type {?} */ CollapsibleTableComponent.prototype.selectedRows; /** @type {?} */ CollapsibleTableComponent.prototype.type; /** @type {?} */ CollapsibleTableComponent.prototype.collapsibleTableRows; /** @type {?} */ CollapsibleTableComponent.prototype.mouseDownHold; /** * @type {?} * @private */ CollapsibleTableComponent.prototype.el; /** * @type {?} * @private */ CollapsibleTableComponent.prototype.collapsibleService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFwc2libGUtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhcjItY29sbGFwc2libGUvIiwic291cmNlcyI6WyJsaWIvY29sbGFwc2libGUtdGFibGUvY29sbGFwc2libGUtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFDaEMsVUFBVSxFQUFFLGVBQWUsRUFDOUIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDeEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFckU7SUFtS0ksbUNBQ1ksRUFBYyxFQUNkLGtCQUFzQztRQUR0QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjs7UUF2QmxELDRCQUF1QixHQUFHLElBQUksQ0FBQztRQU8vQixxQkFBZ0IsR0FBRyxNQUFNLENBQUM7UUFFSSxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLGlCQUFZLEdBQWtCLEVBQUUsQ0FBQzs7UUFJUCxTQUFJLEdBQStCLFdBQVcsQ0FBQztRQUl6RSxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQUlnQyxDQUFDOzs7O0lBRXZELDRDQUFROzs7SUFBUjtJQUNBLENBQUM7Ozs7SUFFRCxzREFBa0I7OztJQUFsQjtRQUNJLGlDQUFpQztRQUNqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQXNCTTtJQUNWLENBQUM7Ozs7O0lBRUQsK0NBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCO1FBQzlCLEtBQUssSUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzFCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUks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QUdyRSxxREFDK0Q7O0lBRy9ELHlEQUN1RTs7SUFHdkUsOENBQ2tEOztJQUdsRCxtREFDMkQ7O0lBRzNELHVEQUNtRTs7SUFHbkUsZ0RBQ3FEOztJQUdyRCxvREFDNkQ7O0lBRzdELDZDQUVnRDs7SUFHaEQsK0NBQ29EOztJQUdwRCwyQ0FDNEM7O0lBRzVDLHVEQUNvRTs7SUFHcEUsZ0RBQ3FEOztJQUdyRCxvREFDNkQ7O0lBRzdELHlEQUN3RTs7SUFHeEUsNERBRStCOztJQUcvQixpREFFd0Q7O0lBRXhELHFEQUEwQjs7SUFFMUIsNkNBQTJDOztJQUUzQyxpREFBaUM7O0lBR2pDLHlDQUN5RTs7SUFFekUseURBQXlHOztJQUV6RyxrREFBc0I7Ozs7O0lBR2xCLHVDQUFzQjs7Ozs7SUFDdEIsdURBQThDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LFxyXG4gICAgSW5wdXQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsXHJcbiAgICBFbGVtZW50UmVmLCBDb250ZW50Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IENvbGxhcHNpYmxlVGFibGVSb3dDb21wb25lbnQgfSBmcm9tICcuLi9jb2xsYXBzaWJsZS10YWJsZS1yb3cvY29sbGFwc2libGUtdGFibGUtcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbGxhcHNpYmxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbGxhcHNpYmxlLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NvbGxhcHNpYmxlLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXHJcbiAgICBzdHlsZXM6IFtgXHJcbiAgICAgICAgOmhvc3Qge1xyXG4gICAgICAgICAgICBkaXNwbGF5OiB0YWJsZTtcclxuICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0IHRoZWFkIHtcclxuICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkMGQwZDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdCAvZGVlcC8gdGJvZHkgL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB7XHJcbiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0IC9kZWVwLyBjb2xsYXBzaWJsZS10YWJsZS1yb3cgdGgsXHJcbiAgICAgICAgOmhvc3QgL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB0ZCB7XHJcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdFtib3JkZXJlZD0ndHJ1ZSddIHtcclxuICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkMGQwZDA7XHJcbiAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkMGQwZDA7XHJcbiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2QwZDBkMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0W2JvcmRlcmVkPSd0cnVlJ10gL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyxcclxuICAgICAgICA6aG9zdFtib3JkZXJlZEhvcml6b250YWxseT0ndHJ1ZSddIC9kZWVwLyBjb2xsYXBzaWJsZS10YWJsZS1yb3cge1xyXG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2QwZDBkMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0W2JvcmRlcmVkPSd0cnVlJ10gL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB0aCxcclxuICAgICAgICA6aG9zdFtib3JkZXJlZD0ndHJ1ZSddIC9kZWVwLyBjb2xsYXBzaWJsZS10YWJsZS1yb3cgdGQsXHJcbiAgICAgICAgOmhvc3RbYm9yZGVyZWRWZXJ0aWNhbGx5PSd0cnVlJ10gL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB0aDpub3QoOmxhc3QtY2hpbGQpLFxyXG4gICAgICAgIDpob3N0W2JvcmRlcmVkVmVydGljYWxseT0ndHJ1ZSddIC9kZWVwLyBjb2xsYXBzaWJsZS10YWJsZS1yb3cgdGQ6bm90KDpsYXN0LWNoaWxkKSB7XHJcbiAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkMGQwZDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdCguY2VudGVyZWQpIC9kZWVwLyAqIHtcclxuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgOmhvc3QoLm5vVGV4dFNlbGVjdCkgL2RlZXAvIGNvbGxhcHNpYmxlLXRhYmxlLXJvdyB0aCxcclxuICAgICAgICA6aG9zdCgubm9UZXh0U2VsZWN0KSAvZGVlcC8gY29sbGFwc2libGUtdGFibGUtcm93IHRkIHtcclxuICAgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgfVxyXG4gICAgYF0sXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBDb2xsYXBzaWJsZVNlcnZpY2VcclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbGxhcHNpYmxlVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XHJcbiAgICAvLyBjb21wb25lbnQgb3B0aW9uc1xyXG4gICAgLy9cclxuICAgIC8vIG1ha2VzIHRoZSB0YWJsZSBib3JkZXJlZFxyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5ib3JkZXJlZCcpIGJvcmRlcmVkOiBib29sZWFuO1xyXG5cclxuICAgIC8vIG1ha2VzIHRoZSB0YWJsZSBib3JkZXJlZCBob3Jpem9udGFsbHkgb25seVxyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5ib3JkZXJlZEhvcml6b250YWxseScpIGJvcmRlcmVkSG9yaXpvbnRhbGx5OiBib29sZWFuO1xyXG5cclxuICAgIC8vIG1ha2VzIHRoZSB0YWJsZSBib3JkZXJlZCB2ZXJ0aWNhbGx5IG9ubHlcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYm9yZGVyZWRWZXJ0aWNhbGx5JykgYm9yZGVyZWRWZXJ0aWNhbGx5OiBib29sZWFuO1xyXG5cclxuICAgIC8vIG1ha2VzIHRoZSB0YWJsZSBzdHJpcGVkXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnN0cmlwZWQnKSBzdHJpcGVkOiBib29sZWFuO1xyXG5cclxuICAgIC8vIGEgY29sb3Igb2YgYW4gb2RkIHN0cmlwZWQgcm93XHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnN0cmlwZWRPZGRDb2xvcicpIHN0cmlwZWRPZGRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8vIGEgdGV4dCBjb2xvciBvZiBhbiBvZGQgc3RyaXBlZCByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuc3RyaXBlZE9kZFRleHRDb2xvcicpIHN0cmlwZWRPZGRUZXh0Q29sb3I6IHN0cmluZztcclxuXHJcbiAgICAvLyBhIGNvbG9yIG9mIGFuIGV2ZW4gc3RyaXBlZCByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuc3RyaXBlZEV2ZW5Db2xvcicpIHN0cmlwZWRFdmVuQ29sb3I6IHN0cmluZztcclxuXHJcbiAgICAvLyBhIHRleHQgY29sb3Igb2YgYW4gZXZlbiBzdHJpcGVkIHJvd1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5zdHJpcGVkRXZlblRleHRDb2xvcicpIHN0cmlwZWRFdmVuVGV4dENvbG9yOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gaGlnaGxpZ2h0IHRhYmxlIHJvd3Mgb24gbW91c2UgaG92ZXJcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaGlnaGxpZ2h0JykgaGlnaGxpZ2h0OiBib29sZWFuO1xyXG5cclxuICAgIC8vIGEgY29sb3Igb2YgYSBoaWdobGlnaHRlZCByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaGlnaGxpZ2h0Q29sb3InKSBoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8vIGEgdGV4dCBjb2xvciBvZiBhIGhpZ2hsaWdodGVkIHJvd1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5oaWdobGlnaHRUZXh0Q29sb3InKSBoaWdobGlnaHRUZXh0Q29sb3I6IHN0cmluZztcclxuXHJcbiAgICAvLyBhIGNvbG9yIG9mIGFuIGFjdGl2ZSByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYWN0aXZlQ29sb3InKSBhY3RpdmVDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8vIGEgdGV4dCBjb2xvciBvZiBhbiBhY3RpdmUgcm93XHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFjdGl2ZVRleHRDb2xvcicpIGFjdGl2ZVRleHRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIC8vIGNlbnRlciBhbGlnbiBhbGwgdGhlIHRleHQgaW4gdGhlIHRhYmxlXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jZW50ZXJlZCcpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuY2VudGVyZWQnKSBjZW50ZXJlZDogYm9vbGVhbjtcclxuXHJcbiAgICAvLyBtYWtlcyB0aGUgdGFibGUgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGUgb24gc21hbGxlciBzY3JlZW4gd2lkdGhzXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJlc3BvbnNpdmUnKSByZXNwb25zaXZlOiBib29sZWFuO1xyXG5cclxuICAgIC8vIGFsbG93cyB0byBzZWxlY3Qgcm93c1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5zZWxlY3QnKSBzZWxlY3Q6IGJvb2xlYW47XHJcblxyXG4gICAgLy8gYWxsb3dzIHRvIHNlbGVjdCBtdWx0aXBsZSByb3dzXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnNlbGVjdE11bHRpcGxlUm93cycpIHNlbGVjdE11bHRpcGxlUm93czogYm9vbGVhbjtcclxuXHJcbiAgICAvLyBhIGNvbG9yIG9mIGEgc2VsZWN0ZWQgcm93XHJcbiAgICBASW5wdXQoKVxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnNlbGVjdENvbG9yJykgc2VsZWN0Q29sb3I6IHN0cmluZztcclxuXHJcbiAgICAvLyBhIHRleHQgY29sb3Igb2YgYSBzZWxlY3RlZCByb3dcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuc2VsZWN0VGV4dENvbG9yJykgc2VsZWN0VGV4dENvbG9yOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gYWxsb3dzIGRlc2VsZWN0aW5nIHNlbGVjdGVkIHJvd3NcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYWxsb3dEZXNlbGVjdGluZ1Jvd3MnKSBhbGxvd0Rlc2VsZWN0aW5nUm93czogYm9vbGVhbjtcclxuXHJcbiAgICAvLyBhbGxvd3MgbmF2aWdhdGlvbiBiZXR3ZWVuIHRhYmxlIHJvd3MgdXNpbmcgYXJyb3cga2V5c1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hbGxvd0tleWJvYXJkTmF2aWdhdGlvbicpXHJcbiAgICBhbGxvd0tleWJvYXJkTmF2aWdhdGlvbiA9IHRydWU7XHJcblxyXG4gICAgLy8gZGlzYWJsZXMgdXNlciBzZWxlY3Qgd2l0aGluZyB0aGUgdGFibGVcclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5vVGV4dFNlbGVjdCcpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIubm9UZXh0U2VsZWN0Jykgbm9UZXh0U2VsZWN0OiBib29sZWFuO1xyXG5cclxuICAgIGZpeGVkVGFibGVIZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JykgdGFiaW5kZXggPSAwO1xyXG5cclxuICAgIHNlbGVjdGVkUm93czogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG5cclxuICAgIC8vIHNwZWNpZmllcyBjb2xsYXBzaWJsZSB0eXBlLiBDYW4gYmUgZWl0aGVyICdhY2NvcmRpb24nIG9yICdleHBhbmRhYmxlJ1xyXG4gICAgQElucHV0KClcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci50eXBlJykgdHlwZTogJ2FjY29yZGlvbicgfCAnZXhwYW5kYWJsZScgPSAnYWNjb3JkaW9uJztcclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKENvbGxhcHNpYmxlVGFibGVSb3dDb21wb25lbnQpIGNvbGxhcHNpYmxlVGFibGVSb3dzOiBBcnJheTxDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50PjtcclxuXHJcbiAgICBtb3VzZURvd25Ib2xkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIGNvbGxhcHNpYmxlU2VydmljZTogQ29sbGFwc2libGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVGaXhlZFRhYmxlSGVpZ2h0KCk7XHJcbiAgICAgICAgLypcclxuICAgICAgICBMT0coYENvbGxhcHNpYmxlVGFibGVDb21wb25lbnQ6Om5nT25Jbml0KClcXG5gICtcclxuICAgICAgICAgICAgYHRoaXMgPSB7XFxuYCArXHJcbiAgICAgICAgICAgIGBib3JkZXJlZCA9ICR7dGhpcy5ib3JkZXJlZH1cXG5gICtcclxuICAgICAgICAgICAgYGJvcmRlcmVkSG9yaXpvbnRhbGx5ID0gJHt0aGlzLmJvcmRlcmVkSG9yaXpvbnRhbGx5fVxcbmAgK1xyXG4gICAgICAgICAgICBgYm9yZGVyZWRWZXJ0aWNhbGx5ID0gJHt0aGlzLmJvcmRlcmVkVmVydGljYWxseX1cXG5gICtcclxuICAgICAgICAgICAgYHN0cmlwZWQgPSAke3RoaXMuc3RyaXBlZH1cXG5gICtcclxuICAgICAgICAgICAgYHN0cmlwZWRPZGRDb2xvciA9ICR7dGhpcy5zdHJpcGVkT2RkQ29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBzdHJpcGVkRXZlbkNvbG9yID0gJHt0aGlzLnN0cmlwZWRFdmVuQ29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBoaWdobGlnaHQgPSAke3RoaXMuaGlnaGxpZ2h0fVxcbmAgK1xyXG4gICAgICAgICAgICBgaGlnaGxpZ2h0Q29sb3IgPSAke3RoaXMuaGlnaGxpZ2h0Q29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBoaWdobGlnaHRUZXh0Q29sb3IgPSAke3RoaXMuaGlnaGxpZ2h0VGV4dENvbG9yfVxcbmAgK1xyXG4gICAgICAgICAgICBgYWN0aXZlQ29sb3IgPSAke3RoaXMuYWN0aXZlQ29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBhY3RpdmVUZXh0Q29sb3IgPSAke3RoaXMuYWN0aXZlVGV4dENvbG9yfVxcbmAgK1xyXG4gICAgICAgICAgICBgY2VudGVyZWQgPSAke3RoaXMuY2VudGVyZWR9XFxuYCArXHJcbiAgICAgICAgICAgIGByZXNwb25zaXZlID0gJHt0aGlzLnJlc3BvbnNpdmV9XFxuYCArXHJcbiAgICAgICAgICAgIGBzZWxlY3QgPSAke3RoaXMuc2VsZWN0fVxcbmAgK1xyXG4gICAgICAgICAgICBgc2VsZWN0Q29sb3IgPSAke3RoaXMuc2VsZWN0Q29sb3J9XFxuYCArXHJcbiAgICAgICAgICAgIGBzZWxlY3RUZXh0Q29sb3IgPSAke3RoaXMuc2VsZWN0VGV4dENvbG9yfVxcbmAgK1xyXG4gICAgICAgICAgICBgc2VsZWN0TXVsdGlwbGVSb3dzID0gJHt0aGlzLnNlbGVjdE11bHRpcGxlUm93c31cXG5gICtcclxuICAgICAgICAgICAgYG5vVGV4dFNlbGVjdCA9ICR7dGhpcy5ub1RleHRTZWxlY3R9XFxuYCArXHJcbiAgICAgICAgICAgIGB9YCk7XHJcbiAgICAgICAgICAgICovXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgY2hhbmdlIGluIGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoY2hhbmdlKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sbGFwc2libGVUYWJsZVJvd3MgIT0gbnVsbCkge1xyXG4gI