@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
337 lines • 36.6 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Input, ViewChild, TemplateRef, } from '@angular/core';
import { DataType } from '../../data-operations/data-util';
import { GridBaseAPIService } from '../api.service';
import { IgxGridSelectionService, ISelectionNode } from '../selection/selection.service';
import { ROW_COLLAPSE_KEYS, ROW_EXPAND_KEYS, SUPPORTED_KEYS } from '../../core/utils';
var IgxGridGroupByRowComponent = /** @class */ (function () {
function IgxGridGroupByRowComponent(gridAPI, gridSelection, element, cdr) {
this.gridAPI = gridAPI;
this.gridSelection = gridSelection;
this.element = element;
this.cdr = cdr;
/**
* @hidden
*/
this.defaultCssClass = 'igx-grid__group-row';
/**
* @hidden
*/
this.paddingIndentationCssClass = 'igx-grid__group-row--padding-level';
/**
* @hidden
*/
this.isFocused = false;
/**
* @hidden
*/
this.tabindex = 0;
}
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "focused", {
/**
* Returns whether the row is focused.
* ```
* let gridRowFocused = this.grid1.rowList.first.focused;
* ```
*/
get: function () {
return this.isFocused;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "expanded", {
/**
* Returns whether the group row is expanded.
* ```typescript
* const groupRowExpanded = this.grid1.rowList.first.expanded;
* ```
*/
get: function () {
return this.grid.isExpandedGroup(this.groupRow);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "describedBy", {
/**
* @hidden
*/
get: function () {
var grRowExpr = this.groupRow.expression !== undefined ? this.groupRow.expression.fieldName : '';
return this.gridID + '_' + grRowExpr;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "dataRowIndex", {
get: function () {
return this.index;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "nativeElement", {
/**
* Returns a reference to the underlying HTML element.
* ```typescript
* const groupRowElement = this.nativeElement;
* ```
*/
get: function () {
return this.element.nativeElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "styleClasses", {
/**
* Returns the style classes applied to the group rows.
* ```typescript
* const groupCssStyles = this.grid1.rowList.first.styleClasses;
* ```
*/
get: function () {
return this.defaultCssClass + " " + (this.paddingIndentationCssClass + "-") + this.groupRow.level +
(this.focused ? " " + this.defaultCssClass + "--active" : '');
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxGridGroupByRowComponent.prototype.onFocus = function () {
this.isFocused = true;
};
/**
*@hidden
*/
IgxGridGroupByRowComponent.prototype.onBlur = function () {
this.isFocused = false;
};
/**
* Toggles the group row.
* ```typescript
* this.grid1.rowList.first.toggle()
* ```
*/
IgxGridGroupByRowComponent.prototype.toggle = function () {
var isVirtualized = !this.grid.verticalScrollContainer.dc.instance.notVirtual;
var groupRowIndex = this.index;
this.grid.toggleGroup(this.groupRow);
if (isVirtualized) {
var groupRow = this.grid.nativeElement.querySelector("[data-rowIndex=\"" + groupRowIndex + "\"]");
if (groupRow) {
groupRow.focus();
}
}
};
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "iconTemplate", {
get: function () {
if (this.expanded) {
return this.grid.rowExpandedIndicatorTemplate || this.defaultGroupByExpandedTemplate;
}
else {
return this.grid.rowCollapsedIndicatorTemplate || this.defaultGroupByCollapsedTemplate;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "selectionNode", {
get: function () {
return {
row: this.index,
column: this.gridSelection.activeElement ? this.gridSelection.activeElement.column : 0
};
},
enumerable: true,
configurable: true
});
/**
* @hidden
*/
IgxGridGroupByRowComponent.prototype.onKeydown = function (event) {
// TODO: Refactor
var key = event.key.toLowerCase();
if (!SUPPORTED_KEYS.has(key)) {
return;
}
event.stopPropagation();
var keydownArgs = { targetType: 'groupRow', target: this, event: event, cancel: false };
this.grid.onGridKeydown.emit(keydownArgs);
if (keydownArgs.cancel) {
return;
}
event.preventDefault();
if (!this.isKeySupportedInGroupRow(key, event.shiftKey, event.altKey) || event.ctrlKey) {
return;
}
if (this.isToggleKey(key, event.altKey)) {
if ((this.expanded && ROW_COLLAPSE_KEYS.has(key)) || (!this.expanded && ROW_EXPAND_KEYS.has(key))) {
this.toggle();
}
return;
}
var selection = this.gridSelection;
selection.keyboardState.shift = event.shiftKey && !(key === 'tab');
var activeNode = selection.activeElement ? Object.assign({}, selection.activeElement) : this.selectionNode;
activeNode.row = this.index;
switch (key) {
case 'arrowdown':
case 'down':
this.grid.navigation.navigateDown(this.nativeElement, activeNode);
break;
case 'arrowup':
case 'up':
this.grid.navigation.navigateUp(this.nativeElement, activeNode);
break;
case 'tab':
this.handleTabKey(event.shiftKey, activeNode);
break;
}
};
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "grid", {
/**
* Returns a reference to the `IgxGridComponent` the `IgxGridGroupByRowComponent` belongs to.
* ```typescript
* this.grid1.rowList.first.grid;
* ```
*/
get: function () {
return this.gridAPI.grid;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridGroupByRowComponent.prototype, "dataType", {
/**
* @hidden
*/
get: function () {
var column = this.grid.getColumnByName(this.groupRow.expression.fieldName);
return (column && column.dataType) || DataType.String;
},
enumerable: true,
configurable: true
});
IgxGridGroupByRowComponent.prototype.handleTabKey = function (shift, activeNode) {
if (shift) {
this.grid.navigation.performShiftTabKey(this.nativeElement, activeNode);
}
else {
if (this.index === this.grid.dataView.length - 1 && this.grid.rootSummariesEnabled) {
this.grid.navigation.onKeydownHome(0, true);
}
else {
var orderedColumns = this.grid.navigation.gridOrderedColumns;
var lastCol = orderedColumns[orderedColumns.length - 1];
activeNode.column = lastCol.columnLayoutChild ? lastCol.parent.visibleIndex : lastCol.visibleIndex;
this.grid.navigation.performTab(this.nativeElement, activeNode);
}
}
};
IgxGridGroupByRowComponent.prototype.isKeySupportedInGroupRow = function (key, shift, alt) {
if (shift === void 0) { shift = false; }
if (alt === void 0) { alt = false; }
if (shift) {
return ['down', 'up', 'arrowdown', 'arrowup', 'tab'].indexOf(key) !== -1;
}
return this.isToggleKey(key, alt) ? true : ['down', 'up', 'arrowdown', 'arrowup', 'tab'].indexOf(key) !== -1;
};
IgxGridGroupByRowComponent.prototype.isToggleKey = function (key, altKey) {
return altKey && ['left', 'right', 'up', 'down', 'arrowleft', 'arrowright', 'arrowup', 'arrowdown'].indexOf(key) !== -1;
};
IgxGridGroupByRowComponent.ctorParameters = function () { return [
{ type: GridBaseAPIService },
{ type: IgxGridSelectionService },
{ type: ElementRef },
{ type: ChangeDetectorRef }
]; };
__decorate([
ViewChild('defaultGroupByExpandedTemplate', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxGridGroupByRowComponent.prototype, "defaultGroupByExpandedTemplate", void 0);
__decorate([
ViewChild('defaultGroupByCollapsedTemplate', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxGridGroupByRowComponent.prototype, "defaultGroupByCollapsedTemplate", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridGroupByRowComponent.prototype, "isFocused", void 0);
__decorate([
Input(),
__metadata("design:type", Number)
], IgxGridGroupByRowComponent.prototype, "index", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxGridGroupByRowComponent.prototype, "gridID", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxGridGroupByRowComponent.prototype, "groupRow", void 0);
__decorate([
ViewChild('groupContent', { static: true }),
__metadata("design:type", ElementRef)
], IgxGridGroupByRowComponent.prototype, "groupContent", void 0);
__decorate([
HostBinding('attr.aria-expanded'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxGridGroupByRowComponent.prototype, "expanded", null);
__decorate([
HostBinding('attr.tabindex'),
__metadata("design:type", Object)
], IgxGridGroupByRowComponent.prototype, "tabindex", void 0);
__decorate([
HostBinding('attr.aria-describedby'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxGridGroupByRowComponent.prototype, "describedBy", null);
__decorate([
HostBinding('attr.data-rowIndex'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxGridGroupByRowComponent.prototype, "dataRowIndex", null);
__decorate([
HostBinding('class'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxGridGroupByRowComponent.prototype, "styleClasses", null);
__decorate([
HostListener('focus'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxGridGroupByRowComponent.prototype, "onFocus", null);
__decorate([
HostListener('blur'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxGridGroupByRowComponent.prototype, "onBlur", null);
__decorate([
HostListener('keydown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxGridGroupByRowComponent.prototype, "onKeydown", null);
IgxGridGroupByRowComponent = __decorate([
Component({
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
selector: 'igx-grid-groupby-row',
template: "<ng-container #defaultGroupRow>\n <div (click)=\"toggle()\" class=\"igx-grid__grouping-indicator\">\n <ng-container *ngTemplateOutlet=\"iconTemplate; context: { $implicit: this }\">\n </ng-container>\n </div>\n\n <div class=\"igx-grid__group-content\" #groupContent>\n <ng-container *ngTemplateOutlet=\"grid.groupRowTemplate ? grid.groupRowTemplate : defaultGroupByTemplate; context: { $implicit: groupRow }\">\n </ng-container>\n </div>\n\n <ng-template #defaultGroupByExpandedTemplate>\n <igx-icon fontSet=\"material\">expand_more</igx-icon>\n </ng-template>\n\n <ng-template #defaultGroupByCollapsedTemplate>\n <igx-icon fontSet=\"material\">chevron_right</igx-icon>\n </ng-template>\n\n\n <ng-template #defaultGroupByTemplate>\n <div class=\"igx-group-label\">\n <igx-icon fontSet=\"material\" class=\"igx-group-label__icon\">group_work</igx-icon>\n <span class=\"igx-group-label__column-name\">\n {{ groupRow.expression ? groupRow.expression.fieldName : '' }}:\n </span>\n\n <ng-container *ngIf=\"dataType === 'boolean' || dataType === 'string'; else default\" >\n <span class=\"igx-group-label__text\">{{ groupRow.value }}</span>\n </ng-container>\n <ng-template #default>\n <ng-container *ngIf=\"dataType === 'number'\">\n <span class=\"igx-group-label__text\">{{ groupRow.value | number }}</span>\n </ng-container>\n <ng-container *ngIf=\"dataType === 'date'\">\n <span class=\"igx-group-label__text\">{{ groupRow.value | date }}</span>\n </ng-container>\n </ng-template>\n\n <igx-badge [value]=\"groupRow.records ? groupRow.records.length : 0\" class='igx-group-label__count-badge'></igx-badge>\n </div>\n </ng-template>\n</ng-container>\n"
}),
__metadata("design:paramtypes", [GridBaseAPIService,
IgxGridSelectionService,
ElementRef,
ChangeDetectorRef])
], IgxGridGroupByRowComponent);
return IgxGridGroupByRowComponent;
}());
export { IgxGridGroupByRowComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBieS1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkL2dyb3VwYnktcm93LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVN0RjtJQUVJLG9DQUFtQixPQUE0RCxFQUNuRSxhQUFzQyxFQUN2QyxPQUFtQixFQUNuQixHQUFzQjtRQUhkLFlBQU8sR0FBUCxPQUFPLENBQXFEO1FBQ25FLGtCQUFhLEdBQWIsYUFBYSxDQUF5QjtRQUN2QyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBRWpDOztXQUVHO1FBQ08sb0JBQWUsR0FBRyxxQkFBcUIsQ0FBQztRQUVsRDs7V0FFRztRQUNPLCtCQUEwQixHQUFHLG9DQUFvQyxDQUFDO1FBYzVFOztXQUVHO1FBRU8sY0FBUyxHQUFHLEtBQUssQ0FBQztRQTJENUI7O1dBRUc7UUFFSSxhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBM0ZpQixDQUFDO0lBb0N0QyxzQkFBSSwrQ0FBTztRQU5YOzs7OztXQUtHO2FBQ0g7WUFDSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7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LG9CQUFvQixDQUFDOzs7OERBR2pDO0lBTUQ7UUFEQyxXQUFXLENBQUMsZUFBZSxDQUFDOztnRUFDVDtJQU1wQjtRQURDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQzs7O2lFQUlwQztJQUdEO1FBREMsV0FBVyxDQUFDLG9CQUFvQixDQUFDOzs7a0VBR2pDO0lBbUJEO1FBREMsV0FBVyxDQUFDLE9BQU8sQ0FBQzs7O2tFQUlwQjtJQU1EO1FBREMsWUFBWSxDQUFDLE9BQU8sQ0FBQzs7Ozs2REFHckI7SUFNRDtRQURDLFlBQVksQ0FBQyxNQUFNLENBQUM7Ozs7NERBR3BCO0lBdUNEO1FBREMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7OytEQTBDbkM7SUFwT1EsMEJBQTBCO1FBTnRDLFNBQVMsQ0FBQztZQUNQLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO1lBQy9DLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsUUFBUSxFQUFFLHNCQUFzQjtZQUNoQyw4NkRBQTJDO1NBQzlDLENBQUM7eUNBRzhCLGtCQUFrQjtZQUNuQix1QkFBdUI7WUFDOUIsVUFBVTtZQUNkLGlCQUFpQjtPQUx4QiwwQkFBMEIsQ0FrUnRDO0lBQUQsaUNBQUM7Q0FBQSxBQWxSRCxJQWtSQztTQWxSWSwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZWNvcmQgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQgeyBHcmlkQmFzZUFQSVNlcnZpY2UgfSBmcm9tICcuLi9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWQtYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZFNlbGVjdGlvblNlcnZpY2UsIElTZWxlY3Rpb25Ob2RlIH0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFJPV19DT0xMQVBTRV9LRVlTLCBST1dfRVhQQU5EX0tFWVMsIFNVUFBPUlRFRF9LRVlTIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiAnaWd4LWdyaWQtZ3JvdXBieS1yb3cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncm91cGJ5LXJvdy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEdyb3VwQnlSb3dDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPixcbiAgICAgICAgcHJpdmF0ZSBncmlkU2VsZWN0aW9uOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVmYXVsdENzc0NsYXNzID0gJ2lneC1ncmlkX19ncm91cC1yb3cnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYWRkaW5nSW5kZW50YXRpb25Dc3NDbGFzcyA9ICdpZ3gtZ3JpZF9fZ3JvdXAtcm93LS1wYWRkaW5nLWxldmVsJztcblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEdyb3VwQnlFeHBhbmRlZFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRHcm91cEJ5RXhwYW5kZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEdyb3VwQnlDb2xsYXBzZWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0R3JvdXBCeUNvbGxhcHNlZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJvdGVjdGVkIGlzRm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByb3cgaXMgZm9jdXNlZC5cbiAgICAgKiBgYGBcbiAgICAgKiBsZXQgZ3JpZFJvd0ZvY3VzZWQgPSB0aGlzLmdyaWQxLnJvd0xpc3QuZmlyc3QuZm9jdXNlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGb2N1c2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGluZGV4IG9mIHRoZSByb3cuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZC1ncm91cGJ5LXJvdyBbZ3JpZElEXT1cImlkXCIgW2luZGV4XT1cInJvd0luZGV4XCIgW2dyb3VwUm93XT1cInJvd0RhdGFcIiAjcm93PjwvaWd4LWdyaWQtZ3JvdXBieS1yb3c+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGlkIG9mIHRoZSBncmlkIHRoZSByb3cgYmVsb25ncyB0by5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkLWdyb3VwYnktcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZ3JvdXBSb3ddPVwicm93RGF0YVwiICNyb3c+PC9pZ3gtZ3JpZC1ncm91cGJ5LXJvdz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncmlkSUQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNwZWNpZmllcyB0aGUgZ3JvdXAgcmVjb3JkIHRoZSBjb21wb25lbnQgcmVuZGVycyBmb3IuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIDxpZ3gtZ3JpZC1ncm91cGJ5LXJvdyBbZ3JpZElEXT1cImlkXCIgW2luZGV4XT1cInJvd0luZGV4XCIgW2dyb3VwUm93XT1cInJvd0RhdGFcIiAjcm93PjwvaWd4LWdyaWQtZ3JvdXBieS1yb3c+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ3JvdXBSb3c6IElHcm91cEJ5UmVjb3JkO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSBvZiB0aGUgY29udGVudCBvZiB0aGUgZ3JvdXAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyb3VwUm93Q29udGVudCA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5ncm91cENvbnRlbnQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZ3JvdXBDb250ZW50JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZ3JvdXBDb250ZW50OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBncm91cCByb3cgaXMgZXhwYW5kZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyb3VwUm93RXhwYW5kZWQgPSB0aGlzLmdyaWQxLnJvd0xpc3QuZmlyc3QuZXhwYW5kZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKVxuICAgIGdldCBleHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5pc0V4cGFuZGVkR3JvdXAodGhpcy5ncm91cFJvdyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgcHVibGljIHRhYmluZGV4ID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kZXNjcmliZWRieScpXG4gICAgZ2V0IGRlc2NyaWJlZEJ5KCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGdyUm93RXhwciA9IHRoaXMuZ3JvdXBSb3cuZXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkID8gdGhpcy5ncm91cFJvdy5leHByZXNzaW9uLmZpZWxkTmFtZSA6ICcnO1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkSUQgKyAnXycgKyBnclJvd0V4cHI7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtcm93SW5kZXgnKVxuICAgIGdldCBkYXRhUm93SW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgSFRNTCBlbGVtZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncm91cFJvd0VsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0eWxlIGNsYXNzZXMgYXBwbGllZCB0byB0aGUgZ3JvdXAgcm93cy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JvdXBDc3NTdHlsZXMgPSB0aGlzLmdyaWQxLnJvd0xpc3QuZmlyc3Quc3R5bGVDbGFzc2VzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICAgIGdldCBzdHlsZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZGVmYXVsdENzc0NsYXNzfSBgICsgYCR7dGhpcy5wYWRkaW5nSW5kZW50YXRpb25Dc3NDbGFzc30tYCArIHRoaXMuZ3JvdXBSb3cubGV2ZWwgK1xuICAgICAgICAgICAgKHRoaXMuZm9jdXNlZCA/IGAgJHt0aGlzLmRlZmF1bHRDc3NDbGFzc30tLWFjdGl2ZWAgOiAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICAgIHB1YmxpYyBvbkZvY3VzKCkge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicpXG4gICAgcHVibGljIG9uQmx1cigpIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBncm91cCByb3cuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC50b2dnbGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgICAgIGNvbnN0IGlzVmlydHVhbGl6ZWQgPSAhdGhpcy5ncmlkLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRjLmluc3RhbmNlLm5vdFZpcnR1YWw7XG4gICAgICAgIGNvbnN0IGdyb3VwUm93SW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICB0aGlzLmdyaWQudG9nZ2xlR3JvdXAodGhpcy5ncm91cFJvdyk7XG4gICAgICAgIGlmIChpc1ZpcnR1YWxpemVkKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cFJvdyA9IHRoaXMuZ3JpZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXJvd0luZGV4PVwiJHtncm91cFJvd0luZGV4fVwiXWApO1xuICAgICAgICAgICAgaWYgKGdyb3VwUm93KSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBSb3cuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWNvblRlbXBsYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5leHBhbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5yb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEdyb3VwQnlFeHBhbmRlZFRlbXBsYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5yb3dDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZSB8fCB0aGlzLmRlZmF1bHRHcm91cEJ5Q29sbGFwc2VkVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHNlbGVjdGlvbk5vZGUoKTogSVNlbGVjdGlvbk5vZGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm93OiB0aGlzLmluZGV4LFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLmdyaWRTZWxlY3Rpb24uYWN0aXZlRWxlbWVudCA/IHRoaXMuZ3JpZFNlbGVjdGlvbi5hY3RpdmVFbGVtZW50LmNvbHVtbiA6IDBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bihldmVudCkge1xuICAgICAgICAvLyBUT0RPOiBSZWZhY3RvclxuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFTVVBQT1JURURfS0VZUy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCBrZXlkb3duQXJncyA9IHsgdGFyZ2V0VHlwZTogJ2dyb3VwUm93JywgdGFyZ2V0OiB0aGlzLCBldmVudDogZXZlbnQsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5ncmlkLm9uR3JpZEtleWRvd24uZW1pdChrZXlkb3duQXJncyk7XG4gICAgICAgIGlmIChrZXlkb3duQXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0tleVN1cHBvcnRlZEluR3JvdXBSb3coa2V5LCBldmVudC5zaGlmdEtleSwgZXZlbnQuYWx0S2V5KSB8fCBldmVudC5jdHJsS2V5KSB7IHJldHVybjsgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVG9nZ2xlS2V5KGtleSwgZXZlbnQuYWx0S2V5KSkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLmV4cGFuZGVkICYmIFJPV19DT0xMQVBTRV9LRVlTLmhhcyhrZXkpKSB8fCAoIXRoaXMuZXhwYW5kZWQgJiYgUk9XX0VYUEFORF9LRVlTLmhhcyhrZXkpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdyaWRTZWxlY3Rpb247XG4gICAgICAgIHNlbGVjdGlvbi5rZXlib2FyZFN0YXRlLnNoaWZ0ID0gZXZlbnQuc2hpZnRLZXkgJiYgIShrZXkgPT09ICd0YWInKTtcblxuICAgICAgICBjb25zdCBhY3RpdmVOb2RlID0gc2VsZWN0aW9uLmFjdGl2ZUVsZW1lbnQgPyBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24uYWN0aXZlRWxlbWVudCkgOiB0aGlzLnNlbGVjdGlvbk5vZGU7XG4gICAgICAgIGFjdGl2ZU5vZGUucm93ID0gdGhpcy5pbmRleDtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQubmF2aWdhdGlvbi5uYXZpZ2F0ZURvd24odGhpcy5uYXRpdmVFbGVtZW50LCBhY3RpdmVOb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICAgICAgY2FzZSAndXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLm5hdmlnYXRlVXAodGhpcy5uYXRpdmVFbGVtZW50LCBhY3RpdmVOb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RhYic6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUYWJLZXkoZXZlbnQuc2hpZnRLZXksIGFjdGl2ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYElneEdyaWRDb21wb25lbnRgIHRoZSBgSWd4R3JpZEdyb3VwQnlSb3dDb21wb25lbnRgIGJlbG9uZ3MgdG8uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5ncmlkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBncmlkKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ3JpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGRhdGFUeXBlKCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUodGhpcy5ncm91cFJvdy5leHByZXNzaW9uLmZpZWxkTmFtZSk7XG4gICAgICAgIHJldHVybiAoY29sdW1uICYmIGNvbHVtbi5kYXRhVHlwZSkgfHwgRGF0YVR5cGUuU3RyaW5nO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlVGFiS2V5KHNoaWZ0OiBib29sZWFuLCBhY3RpdmVOb2RlOiBJU2VsZWN0aW9uTm9kZSkge1xuICAgICAgICBpZiAoc2hpZnQpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLnBlcmZvcm1TaGlmdFRhYktleSh0aGlzLm5hdGl2ZUVsZW1lbnQsIGFjdGl2ZU5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IHRoaXMuZ3JpZC5kYXRhVmlldy5sZW5ndGggLSAxICYmIHRoaXMuZ3JpZC5yb290U3VtbWFyaWVzRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLm9uS2V5ZG93bkhvbWUoMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yZGVyZWRDb2x1bW5zID0gdGhpcy5ncmlkLm5hdmlnYXRpb24uZ3JpZE9yZGVyZWRDb2x1bW5zO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RDb2wgPSBvcmRlcmVkQ29sdW1uc1tvcmRlcmVkQ29sdW1ucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBhY3RpdmVOb2RlLmNvbHVtbiA9IGxhc3RDb2wuY29sdW1uTGF5b3V0Q2hpbGQgPyBsYXN0Q29sLnBhcmVudC52aXNpYmxlSW5kZXggOiBsYXN0Q29sLnZpc2libGVJbmRleDtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQubmF2aWdhdGlvbi5wZXJmb3JtVGFiKHRoaXMubmF0aXZlRWxlbWVudCwgYWN0aXZlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzS2V5U3VwcG9ydGVkSW5Hcm91cFJvdyhrZXksIHNoaWZ0ID0gZmFsc2UsIGFsdCA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChzaGlmdCkge1xuICAgICAgICAgICAgcmV0dXJuIFsnZG93bicsICd1cCcsICdhcnJvd2Rvd24nLCAnYXJyb3d1cCcsICd0YWInXS5pbmRleE9mKGtleSkgIT09IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzVG9nZ2xlS2V5KGtleSwgYWx0KSA/IHRydWUgOiBbJ2Rvd24nLCAndXAnLCAnYXJyb3dkb3duJywgJ2Fycm93dXAnLCAndGFiJ10uaW5kZXhPZihrZXkpICE9PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVG9nZ2xlS2V5KGtleSwgYWx0S2V5KSB7XG4gICAgICAgIHJldHVybiBhbHRLZXkgJiYgWydsZWZ0JywgJ3JpZ2h0JywgJ3VwJywgJ2Rvd24nLCAnYXJyb3dsZWZ0JywgJ2Fycm93cmlnaHQnLCAnYXJyb3d1cCcsICdhcnJvd2Rvd24nXS5pbmRleE9mKGtleSkgIT09IC0xO1xuICAgIH1cblxufVxuIl19