ng-material-multilevel-menu
Version:
Material Multi-Level Menu for Angular Projects.
68 lines • 19.8 kB
JavaScript
import { Component, Input } from '@angular/core';
import { ExpandedLTR, ExpandedRTL } from '../../animation';
import { CommonUtils } from '../../common-utils';
import { CONSTANT } from '../../constants';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/material/icon";
import * as i3 from "@angular/cdk/bidi";
import * as i4 from "@angular/router";
export class ListItemContentComponent {
constructor() {
this.nodeConfiguration = null;
// NOOP
}
ngOnInit() {
// NOOP
}
getListIcon(node) {
if (!CommonUtils.isNullOrUndefinedOrEmpty(node.icon)) {
return `icon`;
}
else if (!CommonUtils.isNullOrUndefinedOrEmpty(node.faIcon)) {
return `faIcon`;
}
else if (!CommonUtils.isNullOrUndefinedOrEmpty(node.imageIcon)) {
return `imageIcon`;
}
else if (!CommonUtils.isNullOrUndefinedOrEmpty(node.svgIcon)) {
return `svgIcon`;
}
else {
return ``;
}
}
getHrefTargetType() {
return this.node.hrefTargetType ? this.node.hrefTargetType : CONSTANT.DEFAULT_HREF_TARGET_TYPE;
}
getSelectedSvgIcon() {
return this.node.isSelected && this.node.activeSvgIcon ? this.node.activeSvgIcon : this.node.svgIcon;
}
getSelectedIcon() {
return this.node.isSelected && this.node.activeIcon ? this.node.activeIcon : this.node.icon;
}
getSelectedFaIcon() {
return this.node.isSelected && this.node.activeFaIcon ? this.node.activeFaIcon : this.node.faIcon;
}
getSelectedImageIcon() {
return this.node.isSelected && this.node.activeImageIcon ? this.node.activeImageIcon : this.node.imageIcon;
}
nodeExpandStatus() {
return this.node.expanded ? CONSTANT.YES : CONSTANT.NO;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: ListItemContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.1", type: ListItemContentComponent, selector: "ng-list-item-content", inputs: { node: "node", isRtlLayout: "isRtlLayout", listContentStyle: "listContentStyle", nodeConfiguration: "nodeConfiguration" }, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"node.externalRedirect ? redirectLinkTemplate : routerLinkTemplate\"></ng-container>\n\n<ng-template #redirectLinkTemplate>\n <a class=\"anml-link\" [href]=\"node.link\" [target]=\"getHrefTargetType()\" [ngStyle]=\"listContentStyle\">\n <ng-container *ngTemplateOutlet=\"isRtlLayout ? linkLabelRtlOutlet : linkLabelLtrOutlet\"></ng-container>\n </a>\n</ng-template>\n\n<ng-template #routerLinkTemplate>\n <ng-container *ngIf=\"node.link && nodeConfiguration.interfaceWithRoute; else defaultContentContainer\">\n <a class=\"anml-link\" [routerLink]=\"node.link\" [ngStyle]=\"listContentStyle\">\n <ng-container *ngTemplateOutlet=\"isRtlLayout ? linkLabelRtlOutlet : linkLabelLtrOutlet\"></ng-container>\n </a>\n </ng-container>\n</ng-template>\n\n<ng-template #defaultContentContainer>\n <a class=\"anml-link\" [ngStyle]=\"listContentStyle\">\n <ng-container *ngTemplateOutlet=\"isRtlLayout ? linkLabelRtlOutlet : linkLabelLtrOutlet\"></ng-container>\n </a>\n</ng-template>\n\n<ng-template #linkLabelLtrOutlet>\n <div class=\"anml-data\" [dir]=\"'ltr'\">\n <ng-container *ngTemplateOutlet=\"iconContainer\"></ng-container>\n <span class=\"label\">{{node.label}}</span>\n </div>\n <div class=\"amml-icon-arrow-container\" *ngIf='node.hasChildren'>\n <mat-icon [@ExpandedLTR]=\"nodeExpandStatus()\">\n keyboard_arrow_down\n </mat-icon>\n </div>\n</ng-template>\n\n<ng-template #linkLabelRtlOutlet>\n <div class=\"anml-data\" [dir]=\"'rtl'\">\n <ng-container *ngTemplateOutlet=\"iconContainer\"></ng-container>\n <span class=\"label\">{{node.label}}</span>\n </div>\n <div class=\"amml-icon-arrow-container\" *ngIf='node.hasChildren'>\n <mat-icon [@ExpandedRTL]=\"nodeExpandStatus()\">\n keyboard_arrow_down\n </mat-icon>\n </div>\n</ng-template>\n\n<ng-template #iconContainer>\n <div class=\"icon-container\" [ngSwitch]=\"getListIcon(node)\">\n <span *ngSwitchCase=\"'faIcon'\" class=\"amml-icon amml-icon-fa\">\n <i [ngClass]=\"getSelectedFaIcon()\"></i>\n </span>\n <mat-icon *ngSwitchCase=\"'icon'\" class=\"amml-icon\">\n {{getSelectedIcon()}}\n </mat-icon>\n <mat-icon *ngSwitchCase=\"'svgIcon'\" class=\"amml-icon amml-svg-icon\"\n svgIcon=\"{{getSelectedSvgIcon()}}\">\n </mat-icon>\n <img *ngSwitchCase=\"'imageIcon'\" class=\"amml-icon amml-img-icon\"\n src=\"{{getSelectedImageIcon()}}\" alt=\"{{node.label}}\"/>\n </div>\n</ng-template>\n\n", styles: [".amml-item{position:relative;cursor:pointer}.anml-link{width:100%;display:flex;justify-content:flex-start;text-transform:capitalize;text-decoration:none}.anml-data{width:100%;height:48px;display:flex;justify-content:flex-start}.icon-container{display:flex;flex-direction:column;justify-content:center}.amml-icon-fa{font-size:20px}.label{line-height:48px;font-weight:400}.amml-svg-icon{width:22px;height:22px;margin-top:-12px}.amml-img-icon{flex-shrink:0;width:40px;height:40px;border-radius:50%;-o-object-fit:cover;object-fit:cover}.amml-icon-arrow-container{direction:ltr;display:flex;align-items:center}div[dir=ltr] .amml-icon{margin-right:16px}div[dir=rtl] .amml-icon{margin-left:16px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], animations: [ExpandedLTR, ExpandedRTL] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: ListItemContentComponent, decorators: [{
type: Component,
args: [{ selector: 'ng-list-item-content', animations: [ExpandedLTR, ExpandedRTL], template: "<ng-container *ngTemplateOutlet=\"node.externalRedirect ? redirectLinkTemplate : routerLinkTemplate\"></ng-container>\n\n<ng-template #redirectLinkTemplate>\n <a class=\"anml-link\" [href]=\"node.link\" [target]=\"getHrefTargetType()\" [ngStyle]=\"listContentStyle\">\n <ng-container *ngTemplateOutlet=\"isRtlLayout ? linkLabelRtlOutlet : linkLabelLtrOutlet\"></ng-container>\n </a>\n</ng-template>\n\n<ng-template #routerLinkTemplate>\n <ng-container *ngIf=\"node.link && nodeConfiguration.interfaceWithRoute; else defaultContentContainer\">\n <a class=\"anml-link\" [routerLink]=\"node.link\" [ngStyle]=\"listContentStyle\">\n <ng-container *ngTemplateOutlet=\"isRtlLayout ? linkLabelRtlOutlet : linkLabelLtrOutlet\"></ng-container>\n </a>\n </ng-container>\n</ng-template>\n\n<ng-template #defaultContentContainer>\n <a class=\"anml-link\" [ngStyle]=\"listContentStyle\">\n <ng-container *ngTemplateOutlet=\"isRtlLayout ? linkLabelRtlOutlet : linkLabelLtrOutlet\"></ng-container>\n </a>\n</ng-template>\n\n<ng-template #linkLabelLtrOutlet>\n <div class=\"anml-data\" [dir]=\"'ltr'\">\n <ng-container *ngTemplateOutlet=\"iconContainer\"></ng-container>\n <span class=\"label\">{{node.label}}</span>\n </div>\n <div class=\"amml-icon-arrow-container\" *ngIf='node.hasChildren'>\n <mat-icon [@ExpandedLTR]=\"nodeExpandStatus()\">\n keyboard_arrow_down\n </mat-icon>\n </div>\n</ng-template>\n\n<ng-template #linkLabelRtlOutlet>\n <div class=\"anml-data\" [dir]=\"'rtl'\">\n <ng-container *ngTemplateOutlet=\"iconContainer\"></ng-container>\n <span class=\"label\">{{node.label}}</span>\n </div>\n <div class=\"amml-icon-arrow-container\" *ngIf='node.hasChildren'>\n <mat-icon [@ExpandedRTL]=\"nodeExpandStatus()\">\n keyboard_arrow_down\n </mat-icon>\n </div>\n</ng-template>\n\n<ng-template #iconContainer>\n <div class=\"icon-container\" [ngSwitch]=\"getListIcon(node)\">\n <span *ngSwitchCase=\"'faIcon'\" class=\"amml-icon amml-icon-fa\">\n <i [ngClass]=\"getSelectedFaIcon()\"></i>\n </span>\n <mat-icon *ngSwitchCase=\"'icon'\" class=\"amml-icon\">\n {{getSelectedIcon()}}\n </mat-icon>\n <mat-icon *ngSwitchCase=\"'svgIcon'\" class=\"amml-icon amml-svg-icon\"\n svgIcon=\"{{getSelectedSvgIcon()}}\">\n </mat-icon>\n <img *ngSwitchCase=\"'imageIcon'\" class=\"amml-icon amml-img-icon\"\n src=\"{{getSelectedImageIcon()}}\" alt=\"{{node.label}}\"/>\n </div>\n</ng-template>\n\n", styles: [".amml-item{position:relative;cursor:pointer}.anml-link{width:100%;display:flex;justify-content:flex-start;text-transform:capitalize;text-decoration:none}.anml-data{width:100%;height:48px;display:flex;justify-content:flex-start}.icon-container{display:flex;flex-direction:column;justify-content:center}.amml-icon-fa{font-size:20px}.label{line-height:48px;font-weight:400}.amml-svg-icon{width:22px;height:22px;margin-top:-12px}.amml-img-icon{flex-shrink:0;width:40px;height:40px;border-radius:50%;-o-object-fit:cover;object-fit:cover}.amml-icon-arrow-container{direction:ltr;display:flex;align-items:center}div[dir=ltr] .amml-icon{margin-right:16px}div[dir=rtl] .amml-icon{margin-left:16px}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { node: [{
type: Input
}], isRtlLayout: [{
type: Input
}], listContentStyle: [{
type: Input
}], nodeConfiguration: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1pdGVtLWNvbnRlbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0ZXJpYWwtbXVsdGlsZXZlbC1tZW51L3NyYy9saWIvbGlzdC1pdGVtL2xpc3QtaXRlbS1jb250ZW50L2xpc3QtaXRlbS1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1hdGVyaWFsLW11bHRpbGV2ZWwtbWVudS9zcmMvbGliL2xpc3QtaXRlbS9saXN0LWl0ZW0tY29udGVudC9saXN0LWl0ZW0tY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUV2RCxPQUFPLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7Ozs7OztBQVF6QyxNQUFNLE9BQU8sd0JBQXdCO0lBTW5DO1FBRlMsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUcvQyxPQUFPO0lBQ1QsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPO0lBQ1QsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFvQjtRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwRCxPQUFPLE1BQU0sQ0FBQztTQUNmO2FBQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDN0QsT0FBTyxRQUFRLENBQUM7U0FDakI7YUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNoRSxPQUFPLFdBQVcsQ0FBQztTQUNwQjthQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzlELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO2FBQU07WUFDTCxPQUFPLEVBQUUsQ0FBQztTQUNYO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7SUFDakcsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdkcsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDOUYsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwRyxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUM3RyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUN6RCxDQUFDOzhHQWxEVSx3QkFBd0I7a0dBQXhCLHdCQUF3QixnTUNackMsNjhFQThEQSwwMEREcERjLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQzs7MkZBRTNCLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDRSxzQkFBc0IsY0FHcEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDOzBFQUc3QixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9uLCBNdWx0aWxldmVsTm9kZSwgTGlzdFN0eWxlfSBmcm9tICcuLi8uLi9hcHAubW9kZWwnO1xuaW1wb3J0IHtFeHBhbmRlZExUUiwgRXhwYW5kZWRSVEx9IGZyb20gJy4uLy4uL2FuaW1hdGlvbic7XG5pbXBvcnQge0NvbW1vblV0aWxzfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtDT05TVEFOVH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctbGlzdC1pdGVtLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC1pdGVtLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LWl0ZW0tY29udGVudC5jb21wb25lbnQuY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtFeHBhbmRlZExUUiwgRXhwYW5kZWRSVExdXG59KVxuZXhwb3J0IGNsYXNzIExpc3RJdGVtQ29udGVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIG5vZGU6IE11bHRpbGV2ZWxOb2RlO1xuICBASW5wdXQoKSBpc1J0bExheW91dDogYm9vbGVhbjtcbiAgQElucHV0KCkgbGlzdENvbnRlbnRTdHlsZTogTGlzdFN0eWxlO1xuICBASW5wdXQoKSBub2RlQ29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gTk9PUFxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gTk9PUFxuICB9XG5cbiAgZ2V0TGlzdEljb24obm9kZTogTXVsdGlsZXZlbE5vZGUpOiBzdHJpbmcge1xuICAgIGlmICghQ29tbW9uVXRpbHMuaXNOdWxsT3JVbmRlZmluZWRPckVtcHR5KG5vZGUuaWNvbikpIHtcbiAgICAgIHJldHVybiBgaWNvbmA7XG4gICAgfSBlbHNlIGlmICghQ29tbW9uVXRpbHMuaXNOdWxsT3JVbmRlZmluZWRPckVtcHR5KG5vZGUuZmFJY29uKSkge1xuICAgICAgcmV0dXJuIGBmYUljb25gO1xuICAgIH0gZWxzZSBpZiAoIUNvbW1vblV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkT3JFbXB0eShub2RlLmltYWdlSWNvbikpIHtcbiAgICAgIHJldHVybiBgaW1hZ2VJY29uYDtcbiAgICB9IGVsc2UgaWYgKCFDb21tb25VdGlscy5pc051bGxPclVuZGVmaW5lZE9yRW1wdHkobm9kZS5zdmdJY29uKSkge1xuICAgICAgcmV0dXJuIGBzdmdJY29uYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBgO1xuICAgIH1cbiAgfVxuXG4gIGdldEhyZWZUYXJnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5ocmVmVGFyZ2V0VHlwZSA/IHRoaXMubm9kZS5ocmVmVGFyZ2V0VHlwZSA6IENPTlNUQU5ULkRFRkFVTFRfSFJFRl9UQVJHRVRfVFlQRTtcbiAgfVxuXG4gIGdldFNlbGVjdGVkU3ZnSWNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5vZGUuaXNTZWxlY3RlZCAmJiB0aGlzLm5vZGUuYWN0aXZlU3ZnSWNvbiA/IHRoaXMubm9kZS5hY3RpdmVTdmdJY29uIDogdGhpcy5ub2RlLnN2Z0ljb247XG4gIH1cblxuICBnZXRTZWxlY3RlZEljb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmlzU2VsZWN0ZWQgJiYgdGhpcy5ub2RlLmFjdGl2ZUljb24gPyB0aGlzLm5vZGUuYWN0aXZlSWNvbiA6IHRoaXMubm9kZS5pY29uO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRGYUljb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmlzU2VsZWN0ZWQgJiYgdGhpcy5ub2RlLmFjdGl2ZUZhSWNvbiA/IHRoaXMubm9kZS5hY3RpdmVGYUljb24gOiB0aGlzLm5vZGUuZmFJY29uO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRJbWFnZUljb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmlzU2VsZWN0ZWQgJiYgdGhpcy5ub2RlLmFjdGl2ZUltYWdlSWNvbiA/IHRoaXMubm9kZS5hY3RpdmVJbWFnZUljb24gOiB0aGlzLm5vZGUuaW1hZ2VJY29uO1xuICB9XG5cbiAgbm9kZUV4cGFuZFN0YXR1cygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5vZGUuZXhwYW5kZWQgPyBDT05TVEFOVC5ZRVMgOiBDT05TVEFOVC5OTztcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGUuZXh0ZXJuYWxSZWRpcmVjdCA/IHJlZGlyZWN0TGlua1RlbXBsYXRlIDogcm91dGVyTGlua1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjcmVkaXJlY3RMaW5rVGVtcGxhdGU+XG4gIDxhIGNsYXNzPVwiYW5tbC1saW5rXCIgW2hyZWZdPVwibm9kZS5saW5rXCIgW3RhcmdldF09XCJnZXRIcmVmVGFyZ2V0VHlwZSgpXCIgW25nU3R5bGVdPVwibGlzdENvbnRlbnRTdHlsZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpc1J0bExheW91dCA/IGxpbmtMYWJlbFJ0bE91dGxldCA6IGxpbmtMYWJlbEx0ck91dGxldFwiPjwvbmctY29udGFpbmVyPlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JvdXRlckxpbmtUZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGUubGluayAmJiBub2RlQ29uZmlndXJhdGlvbi5pbnRlcmZhY2VXaXRoUm91dGU7IGVsc2UgZGVmYXVsdENvbnRlbnRDb250YWluZXJcIj5cbiAgICA8YSBjbGFzcz1cImFubWwtbGlua1wiIFtyb3V0ZXJMaW5rXT1cIm5vZGUubGlua1wiIFtuZ1N0eWxlXT1cImxpc3RDb250ZW50U3R5bGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpc1J0bExheW91dCA/IGxpbmtMYWJlbFJ0bE91dGxldCA6IGxpbmtMYWJlbEx0ck91dGxldFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvYT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRDb250ZW50Q29udGFpbmVyPlxuICA8YSBjbGFzcz1cImFubWwtbGlua1wiIFtuZ1N0eWxlXT1cImxpc3RDb250ZW50U3R5bGVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXNSdGxMYXlvdXQgPyBsaW5rTGFiZWxSdGxPdXRsZXQgOiBsaW5rTGFiZWxMdHJPdXRsZXRcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9hPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaW5rTGFiZWxMdHJPdXRsZXQ+XG4gIDxkaXYgY2xhc3M9XCJhbm1sLWRhdGFcIiBbZGlyXT1cIidsdHInXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25Db250YWluZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3tub2RlLmxhYmVsfX08L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYW1tbC1pY29uLWFycm93LWNvbnRhaW5lclwiICpuZ0lmPSdub2RlLmhhc0NoaWxkcmVuJz5cbiAgICA8bWF0LWljb24gW0BFeHBhbmRlZExUUl09XCJub2RlRXhwYW5kU3RhdHVzKClcIj5cbiAgICAgIGtleWJvYXJkX2Fycm93X2Rvd25cbiAgICA8L21hdC1pY29uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGlua0xhYmVsUnRsT3V0bGV0PlxuICA8ZGl2IGNsYXNzPVwiYW5tbC1kYXRhXCIgW2Rpcl09XCIncnRsJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uQ29udGFpbmVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7bm9kZS5sYWJlbH19PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImFtbWwtaWNvbi1hcnJvdy1jb250YWluZXJcIiAqbmdJZj0nbm9kZS5oYXNDaGlsZHJlbic+XG4gICAgPG1hdC1pY29uIFtARXhwYW5kZWRSVExdPVwibm9kZUV4cGFuZFN0YXR1cygpXCI+XG4gICAgICBrZXlib2FyZF9hcnJvd19kb3duXG4gICAgPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2ljb25Db250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiIFtuZ1N3aXRjaF09XCJnZXRMaXN0SWNvbihub2RlKVwiPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidmYUljb24nXCIgY2xhc3M9XCJhbW1sLWljb24gYW1tbC1pY29uLWZhXCI+XG4gICAgICAgIDxpIFtuZ0NsYXNzXT1cImdldFNlbGVjdGVkRmFJY29uKClcIj48L2k+XG4gICAgICA8L3NwYW4+XG4gICAgPG1hdC1pY29uICpuZ1N3aXRjaENhc2U9XCInaWNvbidcIiBjbGFzcz1cImFtbWwtaWNvblwiPlxuICAgICAge3tnZXRTZWxlY3RlZEljb24oKX19XG4gICAgPC9tYXQtaWNvbj5cbiAgICA8bWF0LWljb24gKm5nU3dpdGNoQ2FzZT1cIidzdmdJY29uJ1wiIGNsYXNzPVwiYW1tbC1pY29uIGFtbWwtc3ZnLWljb25cIlxuICAgICAgICAgICAgICBzdmdJY29uPVwie3tnZXRTZWxlY3RlZFN2Z0ljb24oKX19XCI+XG4gICAgPC9tYXQtaWNvbj5cbiAgICA8aW1nICpuZ1N3aXRjaENhc2U9XCInaW1hZ2VJY29uJ1wiIGNsYXNzPVwiYW1tbC1pY29uIGFtbWwtaW1nLWljb25cIlxuICAgICAgICAgc3JjPVwie3tnZXRTZWxlY3RlZEltYWdlSWNvbigpfX1cIiBhbHQ9XCJ7e25vZGUubGFiZWx9fVwiLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=