UNPKG

@stratio/egeo

Version:
579 lines 42.5 kB
/** * @fileoverview added by tsickle * Generated from: lib/st-table/st-table.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /* * © 2017 Stratio Big Data Inc., Sucursal en España. * * This software is licensed under the Apache License, Version 2.0. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the terms of the License for more details. * * SPDX-License-Identifier: Apache-2.0. */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, OnInit, Output, TemplateRef } from '@angular/core'; import { StEgeo, StRequired } from '../decorators/require-decorators'; import { Order, ORDER_TYPE } from './shared/order'; import { cloneDeep as _cloneDeep, get as _get } from 'lodash'; import { StTableIconClasses } from './st-table.interface'; /** * \@description {Component} [Table] * * The table component has been designed to display any content like images, text, graphs, etc. * * * \@model * * [StTableHeader] {./shared/table-header.interface.ts#StTableHeader} * [StDynamicTableHeader] {./shared/table-header.interface.ts#StFilterElement} * [StFilterHeader] {./shared/table-header.interface.ts#StFilterHeader} * [StTableFilterIconClasses] {./st-table.interface.ts#StTableFilterIconClasses} * [StTableIconClasses] {./st-table.interface.ts#StTableIconClasses} * * \@example * * {html} * * ``` * <st-table [fields]="fields" [sortable]="true" (changeOrder)="yourFunctionToOrder($event)"> * <tr st-table-row *ngFor="let userData of data"> * <td st-table-cell st-table-row-content> * <label >{{userData.id}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.name}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.lastName}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.phone}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.company}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.completedProfile}}</label> * </td> * <td st-table-row-hover> * <i class="icon icon-arrow2_right"></i> * </td> * </tr> * </st-table> * ``` * */ let StTableComponent = /** * \@description {Component} [Table] * * The table component has been designed to display any content like images, text, graphs, etc. * * * \@model * * [StTableHeader] {./shared/table-header.interface.ts#StTableHeader} * [StDynamicTableHeader] {./shared/table-header.interface.ts#StFilterElement} * [StFilterHeader] {./shared/table-header.interface.ts#StFilterHeader} * [StTableFilterIconClasses] {./st-table.interface.ts#StTableFilterIconClasses} * [StTableIconClasses] {./st-table.interface.ts#StTableIconClasses} * * \@example * * {html} * * ``` * <st-table [fields]="fields" [sortable]="true" (changeOrder)="yourFunctionToOrder($event)"> * <tr st-table-row *ngFor="let userData of data"> * <td st-table-cell st-table-row-content> * <label >{{userData.id}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.name}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.lastName}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.phone}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.company}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.completedProfile}}</label> * </td> * <td st-table-row-hover> * <i class="icon icon-arrow2_right"></i> * </td> * </tr> * </st-table> * ``` * */ class StTableComponent { /** * @param {?} _cd */ constructor(_cd) { this._cd = _cd; /** * \@Input {boolean} [header=true] Boolean to show or hide the header */ this.header = true; /** * \@Input {boolean} [sortable=true] Boolean to make sortable the table, To enable sorting of columns use * the new "sortable" field inside stTableHeader model */ this.sortable = true; /** * \@Input {boolean} [filterable=true] Boolean to make filterable the table, To enable filtering of columns use * the new "filterable" field inside stTableHeader model (necessary define filterConfig). */ this.filterable = false; /** * \@Input {boolean} [selectableAll=false] Boolean to show or hide a checkbox in the header to select or * deselect all rows */ this.selectableAll = false; /** * \@Input {StTableIconClasses} [iconClasses=''] List of icon classes */ this.iconClasses = new StTableIconClasses(); /** * \@Output {Order} [changeOrder=''] Event emitted with the new order which has to be applied to the table rows */ this.changeOrder = new EventEmitter(); /** * \@Output {boolean} [selectAll=''] Event emitted when user interacts with the checkbox to select or deselect * all rows */ this.selectAll = new EventEmitter(); /** * \@Output {string} [clickFilter=] Event emitted when clicking on filters icon */ this.clickFilter = new EventEmitter(); /** * \@Output {StTableHeader[]} [selectFilters=''] Event emitted when user interacts with filter button without a custom template */ this.selectFilters = new EventEmitter(); this.tableClasses = {}; this.visibleFilter = -1; this._fixedHeader = false; this._stickyHoverMenu = false; this._hasHoverMenu = false; } /** * \@Input {boolean} [fixedHeader=false] Boolean to fix the table header * @return {?} */ get fixedHeader() { return this._fixedHeader; } /** * @param {?} newValue * @return {?} */ set fixedHeader(newValue) { this._fixedHeader = newValue; } /** * \@Input {boolean} [stickyHoverMenu=false] Boolean to fix hover menu always visible * @return {?} */ get stickyHoverMenu() { return this._stickyHoverMenu; } /** * @param {?} newValue * @return {?} */ set stickyHoverMenu(newValue) { this._stickyHoverMenu = newValue; } /** * \@Input {string} [customClasses=] Classes for adding styles to table tag from outside. These can be: separated-rows * @return {?} */ get customClasses() { return this._customClasses; } /** * @param {?} newValue * @return {?} */ set customClasses(newValue) { this.tableClasses[this._customClasses] = undefined; this._customClasses = newValue; this.tableClasses[this._customClasses] = this._customClasses; } /** * \@Input {boolean} [selectedAll=false] It specifies if all rows are selected * @return {?} */ get selectedAll() { return this._selectedAll; } /** * @param {?} newValue * @return {?} */ set selectedAll(newValue) { this._selectedAll = newValue; this._cd.markForCheck(); } /** * \@Input {boolean} [hasHoverMenu=false] It specifies if a menu has to be displayed when user puts the mouse over * the rows. Remember to add a cell with the selector st-table-row-hover for adding content to the menu * @return {?} */ get hasHoverMenu() { return this._hasHoverMenu; } /** * @param {?} newValue * @return {?} */ set hasHoverMenu(newValue) { this._hasHoverMenu = newValue; } /** * @return {?} */ ngOnInit() { if (this.filterable && !this.statusFilter) { this.statusFilter = new Array(this.fields.length); this.statusFilter.fill(false); } } /** * @param {?} field * @return {?} */ getHeaderItemClass(field) { /** @type {?} */ let isOrderAsc = this.isSortedByFieldAndDirection(field, ORDER_TYPE.ASC); return isOrderAsc ? this.iconClasses.sort.asc : this.iconClasses.sort.desc; } /** * @param {?} field * @return {?} */ isSortable(field) { return field && field.sortable !== undefined ? field.sortable : this.sortable; } /** * @param {?} field * @return {?} */ isSortedByField(field) { return this.currentOrder && this.currentOrder.orderBy === field.id; } /** * @param {?} field * @return {?} */ isFilterable(field) { return this.filterable && ((_get(field, 'filters.filterConfig')) || (this.templateContentFilter && _get(field, 'filters')) || _get(field, 'filters.templateRef')); } /** * @return {?} */ onHideFilterMenu() { this.visibleFilter = -1; this._cd.markForCheck(); } /** * @param {?} field * @return {?} */ onChangeOrder(field) { /** @type {?} */ let _currentOrder; if (field && this.isSortable(field)) { if (this.currentOrder && this.currentOrder.orderBy === field.id) { _currentOrder = this.changeOrderDirection(); } else { _currentOrder = new Order(field.id, ORDER_TYPE.ASC); } this.changeOrder.emit(_currentOrder); } } /** * @param {?} event * @return {?} */ onSelectAll(event) { this.selectAll.emit(event.checked); } /** * @return {?} */ onSelectFilters() { /** @type {?} */ let selectedFilters = _cloneDeep(this.fields); selectedFilters = selectedFilters.filter((/** * @param {?} field * @return {?} */ (field) => { if (_get(field, 'filters.filterConfig')) { field.filters.filterConfig = field.filters.filterConfig.filter((/** * @param {?} conf * @return {?} */ (conf) => conf.selected)); if (field.filters.filterConfig.length > 0) { return field; } } })); this.selectFilters.emit(selectedFilters); } /** * @param {?} event * @param {?} index * @param {?} field * @return {?} */ onChangeFilterVisibility(event, index, field) { event.stopPropagation(); this.visibleFilter = this.visibleFilter === index ? undefined : index; this.clickFilter.emit(field); this._cd.markForCheck(); } /** * @param {?} position * @return {?} */ getFilterIconClasses(position) { /** @type {?} */ const classes = {}; classes['st-table__filter-arrow'] = true; classes[this.statusFilter[position] ? this.iconClasses.filter.selected : this.iconClasses.filter.enabled] = true; return classes; } /** * @private * @return {?} */ changeOrderDirection() { /** @type {?} */ let newDirection = this.currentOrder.type === ORDER_TYPE.ASC ? ORDER_TYPE.DESC : ORDER_TYPE.ASC; return new Order(this.currentOrder.orderBy, newDirection); } /** * @private * @param {?} field * @param {?} orderType * @return {?} */ isSortedByFieldAndDirection(field, orderType) { return this.isSortedByField(field) && this.currentOrder.type === orderType; } }; StTableComponent.ctorParameters = () => [ { type: ChangeDetectorRef } ]; StTableComponent.decorators = [ { type: Component, args: [{ selector: 'st-table', template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<table class='st-table' [ngClass]=\"tableClasses\" [attr.id]='qaTag'>\n <thead>\n <tr *ngIf=\"header\" class='st-table__header'>\n\n <th *ngFor='let field of fields; let i = index' class='st-table__header-item' [ngClass]=\"{\n 'st-table__header-item--selected': isSortedByField(field),\n 'st-table__header-item--sortable': isSortable(field),\n 'st-table__header-item--filterable': isFilterable(field)}\">\n <st-checkbox *ngIf=\"i == 0 && selectableAll\" qaTag=\"select-all-checkbox\" class=\"st-table__checkbox\"\n name=\"selectAll\"\n [checked]=\"selectedAll\" (change)=\"onSelectAll($event)\">\n </st-checkbox>\n <label class='st-table__header-text' (click)=\"onChangeOrder(field)\">\n <i *ngIf=\"isSortedByField(field)\" class='st-table__order-arrow' [ngClass]=\"getHeaderItemClass(field)\">\n </i>\n {{field.label}}\n </label>\n <st-popover-filter *ngIf=\"isFilterable(field)\"\n [field]=\"field\"\n [index]=\"i\"\n [templateContentFilter]=\"templateContentFilter\"\n [hidden]=\"visibleFilter !== i\"\n (filter)=\"onSelectFilters()\"\n (close)=\"onHideFilterMenu()\">\n <i popover-filter-button\n [ngClass]=\"getFilterIconClasses(i)\"\n (click)=\"onChangeFilterVisibility($event, i, field)\">\n </i>\n </st-popover-filter>\n </th>\n <th *ngIf=\"hasHoverMenu\"></th> <!-- For hover cell -->\n </tr>\n </thead>\n <ng-content></ng-content>\n</table>\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";.st-table{width:100%}.st-table__header-item{text-transform:capitalize;position:relative;vertical-align:bottom}.st-table__header-text{position:relative;height:100%;display:inline-flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start;cursor:inherit}"] }] } ]; /** @nocollapse */ StTableComponent.ctorParameters = () => [ { type: ChangeDetectorRef } ]; StTableComponent.propDecorators = { fields: [{ type: Input }], qaTag: [{ type: Input }], header: [{ type: Input }], sortable: [{ type: Input }], filterable: [{ type: Input }], selectableAll: [{ type: Input }], currentOrder: [{ type: Input }], templateContentFilter: [{ type: Input }], statusFilter: [{ type: Input }], iconClasses: [{ type: Input }], fixedHeader: [{ type: Input }, { type: HostBinding, args: ['class.st-custom-scrollbar',] }, { type: HostBinding, args: ['class.fixed-header',] }], stickyHoverMenu: [{ type: Input }, { type: HostBinding, args: ['class.sticky-hover-menu',] }], customClasses: [{ type: Input }], selectedAll: [{ type: Input }], hasHoverMenu: [{ type: Input }], changeOrder: [{ type: Output }], selectAll: [{ type: Output }], clickFilter: [{ type: Output }], selectFilters: [{ type: Output }] }; tslib_1.__decorate([ StRequired(), tslib_1.__metadata("design:type", Array) ], StTableComponent.prototype, "fields", void 0); /** * \@description {Component} [Table] * * The table component has been designed to display any content like images, text, graphs, etc. * * * \@model * * [StTableHeader] {./shared/table-header.interface.ts#StTableHeader} * [StDynamicTableHeader] {./shared/table-header.interface.ts#StFilterElement} * [StFilterHeader] {./shared/table-header.interface.ts#StFilterHeader} * [StTableFilterIconClasses] {./st-table.interface.ts#StTableFilterIconClasses} * [StTableIconClasses] {./st-table.interface.ts#StTableIconClasses} * * \@example * * {html} * * ``` * <st-table [fields]="fields" [sortable]="true" (changeOrder)="yourFunctionToOrder($event)"> * <tr st-table-row *ngFor="let userData of data"> * <td st-table-cell st-table-row-content> * <label >{{userData.id}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.name}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.lastName}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.phone}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.company}}</label> * </td> * <td st-table-cell st-table-row-content> * <label >{{userData.completedProfile}}</label> * </td> * <td st-table-row-hover> * <i class="icon icon-arrow2_right"></i> * </td> * </tr> * </st-table> * ``` * */ StTableComponent = tslib_1.__decorate([ StEgeo(), tslib_1.__metadata("design:paramtypes", [ChangeDetectorRef]) ], StTableComponent); export { StTableComponent }; if (false) { /** * \@Input {StTableHeader[]} [fields=''] List of field displayed in the header * @type {?} */ StTableComponent.prototype.fields; /** * \@Input {string} [qaTag=''] Prefix used to generate the id values for qa tests * @type {?} */ StTableComponent.prototype.qaTag; /** * \@Input {boolean} [header=true] Boolean to show or hide the header * @type {?} */ StTableComponent.prototype.header; /** * \@Input {boolean} [sortable=true] Boolean to make sortable the table, To enable sorting of columns use * the new "sortable" field inside stTableHeader model * @type {?} */ StTableComponent.prototype.sortable; /** * \@Input {boolean} [filterable=true] Boolean to make filterable the table, To enable filtering of columns use * the new "filterable" field inside stTableHeader model (necessary define filterConfig). * @type {?} */ StTableComponent.prototype.filterable; /** * \@Input {boolean} [selectableAll=false] Boolean to show or hide a checkbox in the header to select or * deselect all rows * @type {?} */ StTableComponent.prototype.selectableAll; /** * \@Input {Order} [currentOrder=''] It specifies what is the current order applied to the table * @type {?} */ StTableComponent.prototype.currentOrder; /** * \@Input {TemplateRef} [templateContentFilter=undefined] Reference to paint a custom template inside popover content * @type {?} */ StTableComponent.prototype.templateContentFilter; /** * \@Input {boolean[]} [statusFilter=''] List of status filter by column, needed with templateContentFilter * @type {?} */ StTableComponent.prototype.statusFilter; /** * \@Input {StTableIconClasses} [iconClasses=''] List of icon classes * @type {?} */ StTableComponent.prototype.iconClasses; /** * \@Output {Order} [changeOrder=''] Event emitted with the new order which has to be applied to the table rows * @type {?} */ StTableComponent.prototype.changeOrder; /** * \@Output {boolean} [selectAll=''] Event emitted when user interacts with the checkbox to select or deselect * all rows * @type {?} */ StTableComponent.prototype.selectAll; /** * \@Output {string} [clickFilter=] Event emitted when clicking on filters icon * @type {?} */ StTableComponent.prototype.clickFilter; /** * \@Output {StTableHeader[]} [selectFilters=''] Event emitted when user interacts with filter button without a custom template * @type {?} */ StTableComponent.prototype.selectFilters; /** @type {?} */ StTableComponent.prototype.tableClasses; /** @type {?} */ StTableComponent.prototype.visibleFilter; /** * @type {?} * @private */ StTableComponent.prototype._fixedHeader; /** * @type {?} * @private */ StTableComponent.prototype._stickyHoverMenu; /** * @type {?} * @private */ StTableComponent.prototype._selectedAll; /** * @type {?} * @private */ StTableComponent.prototype._hasHoverMenu; /** * @type {?} * @private */ StTableComponent.prototype._customClasses; /** * @type {?} * @private */ StTableComponent.prototype._cd; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC10YWJsZS9zdC10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckosT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxTQUFTLElBQUksVUFBVSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBd0Q3QyxnQkFBZ0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFBaEIsZ0JBQWdCOzs7O0lBbUgxQixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjs7OztRQTdHakMsV0FBTSxHQUFZLElBQUksQ0FBQzs7Ozs7UUFLdkIsYUFBUSxHQUFZLElBQUksQ0FBQzs7Ozs7UUFLekIsZUFBVSxHQUFZLEtBQUssQ0FBQzs7Ozs7UUFLNUIsa0JBQWEsR0FBWSxLQUFLLENBQUM7Ozs7UUFZL0IsZ0JBQVcsR0FBd0IsSUFBSSxrQkFBa0IsRUFBRSxDQUFDOzs7O1FBNkQzRCxnQkFBVyxHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFDOzs7OztRQUl0RCxjQUFT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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUZyQyxnQkFBZ0I7SUFSNUIsTUFBTSxFQUFFOzZDQTJIbUIsaUJBQWlCO0dBbkhoQyxnQkFBZ0IsQ0F5TTVCO1NBek1ZLGdCQUFnQjs7Ozs7O0lBRTFCLGtDQUErQzs7Ozs7SUFFL0MsaUNBQXVCOzs7OztJQUV2QixrQ0FBZ0M7Ozs7OztJQUtoQyxvQ0FBa0M7Ozs7OztJQUtsQyxzQ0FBcUM7Ozs7OztJQUtyQyx5Q0FBd0M7Ozs7O0lBR3hDLHdDQUE2Qjs7Ozs7SUFHN0IsaURBQWtEOzs7OztJQUdsRCx3Q0FBa0M7Ozs7O0lBR2xDLHVDQUFxRTs7Ozs7SUE2RHJFLHVDQUFnRTs7Ozs7O0lBSWhFLHFDQUFnRTs7Ozs7SUFHaEUsdUNBQXdFOzs7OztJQUd4RSx5Q0FBNEU7O0lBRTVFLHdDQUE4Qjs7SUFDOUIseUNBQWtDOzs7OztJQUVsQyx3Q0FBc0M7Ozs7O0lBQ3RDLDRDQUEwQzs7Ozs7SUFDMUMsd0NBQThCOzs7OztJQUM5Qix5Q0FBdUM7Ozs7O0lBQ3ZDLDBDQUErQjs7Ozs7SUFFbkIsK0JBQThCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIMKpIDIwMTcgU3RyYXRpbyBCaWcgRGF0YSBJbmMuLCBTdWN1cnNhbCBlbiBFc3Bhw7FhLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7XG4gKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuICogU2VlIHRoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wLlxuICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdEVnZW8sIFN0UmVxdWlyZWQgfSBmcm9tICcuLi9kZWNvcmF0b3JzL3JlcXVpcmUtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBPcmRlciwgT1JERVJfVFlQRSB9IGZyb20gJy4vc2hhcmVkL29yZGVyJztcbmltcG9ydCB7IFN0VGFibGVIZWFkZXIgfSBmcm9tICcuL3NoYXJlZC90YWJsZS1oZWFkZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IGNsb25lRGVlcCBhcyBfY2xvbmVEZWVwLCBnZXQgYXMgX2dldCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTdFRhYmxlSWNvbkNsYXNzZXMgfSBmcm9tICcuL3N0LXRhYmxlLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIHtDb21wb25lbnR9IFtUYWJsZV1cbiAqXG4gKiBUaGUgdGFibGUgY29tcG9uZW50IGhhcyBiZWVuIGRlc2lnbmVkIHRvIGRpc3BsYXkgYW55IGNvbnRlbnQgbGlrZSBpbWFnZXMsIHRleHQsIGdyYXBocywgZXRjLlxuICpcbiAqICogQG1vZGVsXG4gKlxuICogICBbU3RUYWJsZUhlYWRlcl0gey4vc2hhcmVkL3RhYmxlLWhlYWRlci5pbnRlcmZhY2UudHMjU3RUYWJsZUhlYWRlcn1cbiAqICAgW1N0RHluYW1pY1RhYmxlSGVhZGVyXSB7Li9zaGFyZWQvdGFibGUtaGVhZGVyLmludGVyZmFjZS50cyNTdEZpbHRlckVsZW1lbnR9XG4gKiAgIFtTdEZpbHRlckhlYWRlcl0gey4vc2hhcmVkL3RhYmxlLWhlYWRlci5pbnRlcmZhY2UudHMjU3RGaWx0ZXJIZWFkZXJ9XG4gKiAgIFtTdFRhYmxlRmlsdGVySWNvbkNsYXNzZXNdIHsuL3N0LXRhYmxlLmludGVyZmFjZS50cyNTdFRhYmxlRmlsdGVySWNvbkNsYXNzZXN9XG4gKiAgIFtTdFRhYmxlSWNvbkNsYXNzZXNdIHsuL3N0LXRhYmxlLmludGVyZmFjZS50cyNTdFRhYmxlSWNvbkNsYXNzZXN9XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiB7aHRtbH1cbiAqXG4gKiBgYGBcbiAqIDxzdC10YWJsZSBbZmllbGRzXT1cImZpZWxkc1wiIFtzb3J0YWJsZV09XCJ0cnVlXCIgKGNoYW5nZU9yZGVyKT1cInlvdXJGdW5jdGlvblRvT3JkZXIoJGV2ZW50KVwiPlxuICogPHRyIHN0LXRhYmxlLXJvdyAqbmdGb3I9XCJsZXQgdXNlckRhdGEgb2YgZGF0YVwiPlxuICogPHRkIHN0LXRhYmxlLWNlbGwgc3QtdGFibGUtcm93LWNvbnRlbnQ+XG4gKiAgICA8bGFiZWwgPnt7dXNlckRhdGEuaWR9fTwvbGFiZWw+XG4gKiA8L3RkPlxuICogPHRkIHN0LXRhYmxlLWNlbGwgc3QtdGFibGUtcm93LWNvbnRlbnQ+XG4gKiAgICA8bGFiZWwgPnt7dXNlckRhdGEubmFtZX19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5sYXN0TmFtZX19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5waG9uZX19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5jb21wYW55fX08L2xhYmVsPlxuICogPC90ZD5cbiAqIDx0ZCBzdC10YWJsZS1jZWxsIHN0LXRhYmxlLXJvdy1jb250ZW50PlxuICogICAgPGxhYmVsID57e3VzZXJEYXRhLmNvbXBsZXRlZFByb2ZpbGV9fTwvbGFiZWw+XG4gKiA8L3RkPlxuICogPHRkIHN0LXRhYmxlLXJvdy1ob3Zlcj5cbiAqICAgIDxpIGNsYXNzPVwiaWNvbiBpY29uLWFycm93Ml9yaWdodFwiPjwvaT5cbiAqIDwvdGQ+XG4gKiA8L3RyPlxuICogPC9zdC10YWJsZT5cbiAqIGBgYFxuICpcbiAqL1xuQFN0RWdlbygpXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiAnc3QtdGFibGUnLFxuICAgdGVtcGxhdGVVcmw6ICcuL3N0LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgIHN0eWxlVXJsczogWycuL3N0LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcblxuZXhwb3J0IGNsYXNzIFN0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgLyoqIEBJbnB1dCB7U3RUYWJsZUhlYWRlcltdfSBbZmllbGRzPScnXSBMaXN0IG9mIGZpZWxkIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyICovXG4gICBASW5wdXQoKSBAU3RSZXF1aXJlZCgpIGZpZWxkczogU3RUYWJsZUhlYWRlcltdO1xuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbcWFUYWc9JyddIFByZWZpeCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBpZCB2YWx1ZXMgZm9yIHFhIHRlc3RzICovXG4gICBASW5wdXQoKSBxYVRhZzogc3RyaW5nO1xuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2hlYWRlcj10cnVlXSBCb29sZWFuIHRvIHNob3cgb3IgaGlkZSB0aGUgaGVhZGVyICovXG4gICBASW5wdXQoKSBoZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuICAgLyoqXG4gICAgKiBASW5wdXQge2Jvb2xlYW59IFtzb3J0YWJsZT10cnVlXSBCb29sZWFuIHRvIG1ha2Ugc29ydGFibGUgdGhlIHRhYmxlLCBUbyBlbmFibGUgc29ydGluZyBvZiBjb2x1bW5zIHVzZVxuICAgICogdGhlIG5ldyBcInNvcnRhYmxlXCIgZmllbGQgaW5zaWRlIHN0VGFibGVIZWFkZXIgbW9kZWxcbiAgICAqL1xuICAgQElucHV0KCkgc29ydGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICAgLyoqXG4gICAgKiBASW5wdXQge2Jvb2xlYW59IFtmaWx0ZXJhYmxlPXRydWVdIEJvb2xlYW4gdG8gbWFrZSBmaWx0ZXJhYmxlIHRoZSB0YWJsZSwgVG8gZW5hYmxlIGZpbHRlcmluZyBvZiBjb2x1bW5zIHVzZVxuICAgICogdGhlIG5ldyBcImZpbHRlcmFibGVcIiBmaWVsZCBpbnNpZGUgc3RUYWJsZUhlYWRlciBtb2RlbCAobmVjZXNzYXJ5IGRlZmluZSBmaWx0ZXJDb25maWcpLlxuICAgICovXG4gICBASW5wdXQoKSBmaWx0ZXJhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAvKipcbiAgICAqIEBJbnB1dCB7Ym9vbGVhbn0gW3NlbGVjdGFibGVBbGw9ZmFsc2VdIEJvb2xlYW4gdG8gc2hvdyBvciBoaWRlIGEgY2hlY2tib3ggaW4gdGhlIGhlYWRlciB0byBzZWxlY3Qgb3JcbiAgICAqICBkZXNlbGVjdCBhbGwgcm93c1xuICAgICovXG4gICBASW5wdXQoKSBzZWxlY3RhYmxlQWxsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgIC8qKiBASW5wdXQge09yZGVyfSBbY3VycmVudE9yZGVyPScnXSBJdCBzcGVjaWZpZXMgd2hhdCBpcyB0aGUgY3VycmVudCBvcmRlciBhcHBsaWVkIHRvIHRoZSB0YWJsZSAqL1xuICAgQElucHV0KCkgY3VycmVudE9yZGVyOiBPcmRlcjtcblxuICAgLyoqIEBJbnB1dCB7VGVtcGxhdGVSZWZ9IFt0ZW1wbGF0ZUNvbnRlbnRGaWx0ZXI9dW5kZWZpbmVkXSBSZWZlcmVuY2UgdG8gcGFpbnQgYSBjdXN0b20gdGVtcGxhdGUgaW5zaWRlIHBvcG92ZXIgY29udGVudCAqL1xuICAgQElucHV0KCkgdGVtcGxhdGVDb250ZW50RmlsdGVyPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbltdfSBbc3RhdHVzRmlsdGVyPScnXSBMaXN0IG9mIHN0YXR1cyBmaWx0ZXIgYnkgY29sdW1uLCBuZWVkZWQgd2l0aCB0ZW1wbGF0ZUNvbnRlbnRGaWx0ZXIgKi9cbiAgIEBJbnB1dCgpIHN0YXR1c0ZpbHRlcj86IGJvb2xlYW5bXTtcblxuICAgLyoqIEBJbnB1dCB7U3RUYWJsZUljb25DbGFzc2VzfSBbaWNvbkNsYXNzZXM9JyddIExpc3Qgb2YgaWNvbiBjbGFzc2VzICovXG4gICBASW5wdXQoKSBpY29uQ2xhc3Nlcz86IFN0VGFibGVJY29uQ2xhc3NlcyA9IG5ldyBTdFRhYmxlSWNvbkNsYXNzZXMoKTtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2ZpeGVkSGVhZGVyPWZhbHNlXSBCb29sZWFuIHRvIGZpeCB0aGUgdGFibGUgaGVhZGVyICovXG4gICBASW5wdXQoKVxuICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zdC1jdXN0b20tc2Nyb2xsYmFyJylcbiAgIEBIb3N0QmluZGluZygnY2xhc3MuZml4ZWQtaGVhZGVyJylcbiAgIGdldCBmaXhlZEhlYWRlcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9maXhlZEhlYWRlcjtcbiAgIH1cblxuICAgc2V0IGZpeGVkSGVhZGVyKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9maXhlZEhlYWRlciA9IG5ld1ZhbHVlO1xuICAgfVxuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbc3RpY2t5SG92ZXJNZW51PWZhbHNlXSBCb29sZWFuIHRvIGZpeCBob3ZlciBtZW51IGFsd2F5cyB2aXNpYmxlICovXG4gICBASW5wdXQoKVxuICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zdGlja3ktaG92ZXItbWVudScpXG4gICBnZXQgc3RpY2t5SG92ZXJNZW51KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0aWNreUhvdmVyTWVudTtcbiAgIH1cblxuICAgc2V0IHN0aWNreUhvdmVyTWVudShuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fc3RpY2t5SG92ZXJNZW51ID0gbmV3VmFsdWU7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW2N1c3RvbUNsYXNzZXM9XSBDbGFzc2VzIGZvciBhZGRpbmcgc3R5bGVzIHRvIHRhYmxlIHRhZyBmcm9tIG91dHNpZGUuIFRoZXNlIGNhbiBiZTogc2VwYXJhdGVkLXJvd3MgKi9cbiAgIEBJbnB1dCgpXG4gICBnZXQgY3VzdG9tQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNsYXNzZXM7XG4gICB9XG5cbiAgIHNldCBjdXN0b21DbGFzc2VzKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMudGFibGVDbGFzc2VzW3RoaXMuX2N1c3RvbUNsYXNzZXNdID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY3VzdG9tQ2xhc3NlcyA9IG5ld1ZhbHVlO1xuICAgICAgdGhpcy50YWJsZUNsYXNzZXNbdGhpcy5fY3VzdG9tQ2xhc3Nlc10gPSB0aGlzLl9jdXN0b21DbGFzc2VzO1xuICAgfVxuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbc2VsZWN0ZWRBbGw9ZmFsc2VdIEl0IHNwZWNpZmllcyBpZiBhbGwgcm93cyBhcmUgc2VsZWN0ZWQgKi9cbiAgIEBJbnB1dCgpXG4gICBnZXQgc2VsZWN0ZWRBbGwoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBbGw7XG4gICB9XG5cbiAgIHNldCBzZWxlY3RlZEFsbChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRBbGwgPSBuZXdWYWx1ZTtcbiAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbaGFzSG92ZXJNZW51PWZhbHNlXSBJdCBzcGVjaWZpZXMgaWYgYSBtZW51IGhhcyB0byBiZSBkaXNwbGF5ZWQgd2hlbiB1c2VyIHB1dHMgdGhlIG1vdXNlIG92ZXJcbiAgICAqIHRoZSByb3dzLiBSZW1lbWJlciB0byBhZGQgYSBjZWxsIHdpdGggdGhlIHNlbGVjdG9yIHN0LXRhYmxlLXJvdy1ob3ZlciBmb3IgYWRkaW5nIGNvbnRlbnQgdG8gdGhlIG1lbnVcbiAgICAqL1xuICAgQElucHV0KClcbiAgIGdldCBoYXNIb3Zlck1lbnUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5faGFzSG92ZXJNZW51O1xuICAgfVxuXG4gICBzZXQgaGFzSG92ZXJNZW51KG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9oYXNIb3Zlck1lbnUgPSBuZXdWYWx1ZTtcbiAgIH1cblxuICAgLyoqIEBPdXRwdXQge09yZGVyfSBbY2hhbmdlT3JkZXI9JyddIEV2ZW50IGVtaXR0ZWQgd2l0aCB0aGUgbmV3IG9yZGVyIHdoaWNoIGhhcyB0byBiZSBhcHBsaWVkIHRvIHRoZSB0YWJsZSByb3dzICovXG4gICBAT3V0cHV0KCkgY2hhbmdlT3JkZXI6IEV2ZW50RW1pdHRlcjxPcmRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAvKiogQE91dHB1dCB7Ym9vbGVhbn0gW3NlbGVjdEFsbD0nJ10gRXZlbnQgZW1pdHRlZCB3aGVuIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIGNoZWNrYm94IHRvIHNlbGVjdCBvciBkZXNlbGVjdFxuICAgICogYWxsIHJvd3NcbiAgICAqL1xuICAgQE91dHB1dCgpIHNlbGVjdEFsbDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAvKiogQE91dHB1dCB7c3RyaW5nfSBbY2xpY2tGaWx0ZXI9XSBFdmVudCBlbWl0dGVkIHdoZW4gY2xpY2tpbmcgb24gZmlsdGVycyBpY29uICAqL1xuICAgQE91dHB1dCgpIGNsaWNrRmlsdGVyOiBFdmVudEVtaXR0ZXI8U3RUYWJsZUhlYWRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgIC8qKiBAT3V0cHV0IHtTdFRhYmxlSGVhZGVyW119IFtzZWxlY3RGaWx0ZXJzPScnXSBFdmVudCBlbWl0dGVkICB3aGVuIHVzZXIgaW50ZXJhY3RzIHdpdGggZmlsdGVyIGJ1dHRvbiB3aXRob3V0IGEgY3VzdG9tIHRlbXBsYXRlICovXG4gICBAT3V0cHV0KCkgc2VsZWN0RmlsdGVyczogRXZlbnRFbWl0dGVyPFN0VGFibGVIZWFkZXJbXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgIHB1YmxpYyB0YWJsZUNsYXNzZXM6IGFueSA9IHt9O1xuICAgcHVibGljIHZpc2libGVGaWx0ZXI6IG51bWJlciA9IC0xO1xuXG4gICBwcml2YXRlIF9maXhlZEhlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICAgcHJpdmF0ZSBfc3RpY2t5SG92ZXJNZW51OiBib29sZWFuID0gZmFsc2U7XG4gICBwcml2YXRlIF9zZWxlY3RlZEFsbDogYm9vbGVhbjtcbiAgIHByaXZhdGUgX2hhc0hvdmVyTWVudTogYm9vbGVhbiA9IGZhbHNlO1xuICAgcHJpdmF0ZSBfY3VzdG9tQ2xhc3Nlczogc3RyaW5nO1xuXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgIH1cblxuICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmICF0aGlzLnN0YXR1c0ZpbHRlcikge1xuICAgICAgICAgdGhpcy5zdGF0dXNGaWx0ZXIgPSBuZXcgQXJyYXkodGhpcy5maWVsZHMubGVuZ3RoKTtcbiAgICAgICAgIHRoaXMuc3RhdHVzRmlsdGVyLmZpbGwoZmFsc2UpO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgZ2V0SGVhZGVySXRlbUNsYXNzKGZpZWxkOiBTdFRhYmxlSGVhZGVyKTogc3RyaW5nIHtcbiAgICAgIGxldCBpc09yZGVyQXNjID0gdGhpcy5pc1NvcnRlZEJ5RmllbGRBbmREaXJlY3Rpb24oZmllbGQsIE9SREVSX1RZUEUuQVNDKTtcbiAgICAgIHJldHVybiBpc09yZGVyQXNjID8gdGhpcy5pY29uQ2xhc3Nlcy5zb3J0LmFzYyA6IHRoaXMuaWNvbkNsYXNzZXMuc29ydC5kZXNjO1xuICAgfVxuXG4gICBwdWJsaWMgaXNTb3J0YWJsZShmaWVsZDogU3RUYWJsZUhlYWRlcik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZpZWxkICYmIGZpZWxkLnNvcnRhYmxlICE9PSB1bmRlZmluZWQgPyBmaWVsZC5zb3J0YWJsZSA6IHRoaXMuc29ydGFibGU7XG4gICB9XG5cbiAgIHB1YmxpYyBpc1NvcnRlZEJ5RmllbGQoZmllbGQ6IFN0VGFibGVIZWFkZXIpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRPcmRlciAmJiB0aGlzLmN1cnJlbnRPcmRlci5vcmRlckJ5ID09PSBmaWVsZC5pZDtcbiAgIH1cblxuICAgcHVibGljIGlzRmlsdGVyYWJsZShmaWVsZDogU3RUYWJsZUhlYWRlcik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyYWJsZSAmJiAoKF9nZXQoZmllbGQsICdmaWx0ZXJzLmZpbHRlckNvbmZpZycpKSB8fFxuICAgICAgICAgKHRoaXMudGVtcGxhdGVDb250ZW50RmlsdGVyICYmIF9nZXQoZmllbGQsICdmaWx0ZXJzJykpIHx8XG4gICAgICAgICBfZ2V0KGZpZWxkLCAnZmlsdGVycy50ZW1wbGF0ZVJlZicpKTtcbiAgIH1cblxuICAgcHVibGljIG9uSGlkZUZpbHRlck1lbnUoKTogdm9pZCB7XG4gICAgICB0aGlzLnZpc2libGVGaWx0ZXIgPSAtMTtcbiAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICBwdWJsaWMgb25DaGFuZ2VPcmRlcihmaWVsZDogU3RUYWJsZUhlYWRlcik6IHZvaWQge1xuICAgICAgbGV0IF9jdXJyZW50T3JkZXI6IE9yZGVyO1xuICAgICAgaWYgKGZpZWxkICYmIHRoaXMuaXNTb3J0YWJsZShmaWVsZCkpIHtcbiAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRPcmRlciAmJiB0aGlzLmN1cnJlbnRPcmRlci5vcmRlckJ5ID09PSBmaWVsZC5pZCkge1xuICAgICAgICAgICAgX2N1cnJlbnRPcmRlciA9IHRoaXMuY2hhbmdlT3JkZXJEaXJlY3Rpb24oKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfY3VycmVudE9yZGVyID0gbmV3IE9yZGVyKGZpZWxkLmlkLCBPUkRFUl9UWVBFLkFTQyk7XG4gICAgICAgICB9XG4gICAgICAgICB0aGlzLmNoYW5nZU9yZGVyLmVtaXQoX2N1cnJlbnRPcmRlcik7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBvblNlbGVjdEFsbChldmVudDogYW55KTogdm9pZCB7XG4gICAgICB0aGlzLnNlbGVjdEFsbC5lbWl0KGV2ZW50LmNoZWNrZWQpO1xuICAgfVxuXG4gICBwdWJsaWMgb25TZWxlY3RGaWx0ZXJzKCk6IHZvaWQge1xuICAgICAgbGV0IHNlbGVjdGVkRmlsdGVycyA9IF9jbG9uZURlZXAodGhpcy5maWVsZHMpO1xuICAgICAgc2VsZWN0ZWRGaWx0ZXJzID0gc2VsZWN0ZWRGaWx0ZXJzLmZpbHRlcigoZmllbGQpID0+IHtcbiAgICAgICAgIGlmIChfZ2V0KGZpZWxkLCAnZmlsdGVycy5maWx0ZXJDb25maWcnKSkge1xuICAgICAgICAgICAgZmllbGQuZmlsdGVycy5maWx0ZXJDb25maWcgPSBmaWVsZC5maWx0ZXJzLmZpbHRlckNvbmZpZy5maWx0ZXIoKGNvbmYpID0+IGNvbmYuc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmZpbHRlcnMuZmlsdGVyQ29uZmlnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RGaWx0ZXJzLmVtaXQoc2VsZWN0ZWRGaWx0ZXJzKTtcbiAgIH1cblxuICAgcHVibGljIG9uQ2hhbmdlRmlsdGVyVmlzaWJpbGl0eShldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlciwgZmllbGQ6IFN0VGFibGVIZWFkZXIpOiB2b2lkIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy52aXNpYmxlRmlsdGVyID0gdGhpcy52aXNpYmxlRmlsdGVyID09PSBpbmRleCA/IHVuZGVmaW5lZCA6IGluZGV4O1xuICAgICAgdGhpcy5jbGlja0ZpbHRlci5lbWl0KGZpZWxkKTtcbiAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0RmlsdGVySWNvbkNsYXNzZXMocG9zaXRpb246IG51bWJlcik6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcbiAgICAgIGNvbnN0IGNsYXNzZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gICAgICBjbGFzc2VzWydzdC10YWJsZV9fZmlsdGVyLWFycm93J10gPSB0cnVlO1xuICAgICAgY2xhc3Nlc1t0aGlzLnN0YXR1c0ZpbHRlcltwb3NpdGlvbl0gPyB0aGlzLmljb25DbGFzc2VzLmZpbHRlci5zZWxlY3RlZCA6IHRoaXMuaWNvbkNsYXNzZXMuZmlsdGVyLmVuYWJsZWRdID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hhbmdlT3JkZXJEaXJlY3Rpb24oKTogT3JkZXIge1xuICAgICAgbGV0IG5ld0RpcmVjdGlvbiA9IHRoaXMuY3VycmVudE9yZGVyLnR5cGUgPT09IE9SREVSX1RZUEUuQVNDID8gT1JERVJfVFlQRS5ERVNDIDogT1JERVJfVFlQRS5BU0M7XG4gICAgICByZXR1cm4gbmV3IE9yZGVyKHRoaXMuY3VycmVudE9yZGVyLm9yZGVyQnksIG5ld0RpcmVjdGlvbik7XG4gICB9XG5cbiAgIHByaXZhdGUgaXNTb3J0ZWRCeUZpZWxkQW5kRGlyZWN0aW9uKGZpZWxkOiBTdFRhYmxlSGVhZGVyLCBvcmRlclR5cGU6IE9SREVSX1RZUEUpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU29ydGVkQnlGaWVsZChmaWVsZCkgJiYgdGhpcy5jdXJyZW50T3JkZXIudHlwZSA9PT0gb3JkZXJUeXBlO1xuICAgfVxufVxuIl19