UNPKG

ng-material-multilevel-menu-2

Version:
291 lines 31.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter } from '@angular/core'; import { Router } from '@angular/router'; import { trigger, style, transition, animate, state, group } from '@angular/animations'; import { MultilevelMenuService } from './../multilevel-menu.service'; import { CONSTANT } from './../constants'; var ListItemComponent = /** @class */ (function () { function ListItemComponent(router, multilevelMenuService) { var _a; this.router = router; this.multilevelMenuService = multilevelMenuService; this.level = 1; this.nodeConfiguration = null; this.selectedItem = new EventEmitter(); this.hasDivider = true; this.isSelected = false; this.expanded = false; this.firstInitializer = false; this.selectedListClasses = (_a = {}, _a[CONSTANT.DEFAULT_LIST_CLASS_NAME] = true, _a[CONSTANT.SELECTED_LIST_CLASS_NAME] = false, _a); } /** * @return {?} */ ListItemComponent.prototype.ngOnChanges = /** * @return {?} */ function () { this.nodeChildren = this.node && this.node.items ? this.node.items.filter(function (n) { return !n.hidden; }) : []; if (this.selectedNode !== undefined && this.selectedNode !== null) { this.setSelectedClass(this.multilevelMenuService.recursiveCheckId(this.node, this.selectedNode.id)); } }; /** * @param {?} isFound * @return {?} */ ListItemComponent.prototype.setSelectedClass = /** * @param {?} isFound * @return {?} */ function (isFound) { var _a; if (isFound) { if (!this.firstInitializer) { this.expanded = true; } this.isSelected = this.nodeConfiguration.highlightOnSelect || this.selectedNode.items === undefined ? true : false; } else { this.isSelected = false; if (this.nodeConfiguration.collapseOnSelect) { this.expanded = false; } } this.selectedListClasses = (_a = {}, _a[CONSTANT.DEFAULT_LIST_CLASS_NAME] = true, _a[CONSTANT.SELECTED_LIST_CLASS_NAME] = this.isSelected, _a); this.setClasses(); }; /** * @return {?} */ ListItemComponent.prototype.getPaddingAtStart = /** * @return {?} */ function () { return this.nodeConfiguration.paddingAtStart ? true : false; }; /** * @return {?} */ ListItemComponent.prototype.getListStyle = /** * @return {?} */ function () { /** @type {?} */ var styles = { background: CONSTANT.DEFAULT_LIST_BACKGROUND_COLOR, color: CONSTANT.DEFAULT_LIST_FONT_COLOR }; if (this.nodeConfiguration.listBackgroundColor !== null) { styles.background = this.nodeConfiguration.listBackgroundColor; } if (this.isSelected) { this.nodeConfiguration.selectedListFontColor !== null ? (styles.color = this.nodeConfiguration.selectedListFontColor) : (styles.color = CONSTANT.DEFAULT_SELECTED_FONT_COLOR); } else if (this.nodeConfiguration.fontColor !== null) { styles.color = this.nodeConfiguration.fontColor; } return styles; }; /** * @param {?} node * @return {?} */ ListItemComponent.prototype.getListIcon = /** * @param {?} node * @return {?} */ function (node) { if (node.icon !== null && node.icon !== undefined && node.icon !== '') { return "icon"; } else if (node.faIcon !== null && node.faIcon !== undefined && node.faIcon !== '') { return "faicon"; } else if (node.imageIcon !== null && node.imageIcon !== undefined && node.imageIcon !== '') { return "imageicon"; } else { return ""; } }; /** * @return {?} */ ListItemComponent.prototype.hasItems = /** * @return {?} */ function () { return this.nodeChildren.length > 0 ? true : false; }; /** * @return {?} */ ListItemComponent.prototype.isRtlLayout = /** * @return {?} */ function () { return this.nodeConfiguration.rtlLayout; }; /** * @return {?} */ ListItemComponent.prototype.setClasses = /** * @return {?} */ function () { var _a; this.classes = (_a = {}, _a['level-' + this.level] = true, _a['amml-submenu'] = this.hasItems() && this.getPaddingAtStart(), _a); }; /** * @param {?} node * @return {?} */ ListItemComponent.prototype.expand = /** * @param {?} node * @return {?} */ function (node) { this.expanded = !this.expanded; this.firstInitializer = true; this.setClasses(); if (this.nodeConfiguration.interfaceWithRoute !== null && this.nodeConfiguration.interfaceWithRoute && node.link !== undefined && node.link) { if (node.externalRedirect !== undefined && node.externalRedirect) { window.location.href = node.link; } else { this.router.navigate([node.link]); } } else if (node.onSelected && typeof node.onSelected === 'function') { node.onSelected(node); this.selectedListItem(node); } else if (node.items === undefined || this.nodeConfiguration.collapseOnSelect) { this.selectedListItem(node); } }; /** * @param {?} node * @return {?} */ ListItemComponent.prototype.selectedListItem = /** * @param {?} node * @return {?} */ function (node) { this.selectedItem.emit(node); }; ListItemComponent.decorators = [ { type: Component, args: [{ selector: 'ng-list-item', template: "<mat-list-item matRipple [ngClass]=\"selectedListClasses\" *ngIf=\"!node.hidden\" (click)=\"expand(node)\" title=\"{{node.label}}\" [ngStyle]=\"getListStyle()\">\n <div class=\"anml-data\" [dir]=\"isRtlLayout() ? 'rtl' : 'ltr'\">\n <div class=\"icon-container\" [ngSwitch]=\"getListIcon(node)\">\n <span *ngSwitchCase=\"'faicon'\" class=\"amml-icon amml-icon-fa\">\n <i [ngClass]=\"node.faIcon\"></i>\n </span>\n <mat-icon *ngSwitchCase=\"'icon'\" class=\"amml-icon\">\n {{node.icon}}\n </mat-icon>\n <img matListAvatar *ngSwitchCase=\"'imageicon'\" class=\"amml-icon\" src=\"{{node.imageIcon}}\" alt=\"{{node.label}}\" />\n </div>\n <span class=\"label\">{{node.label}}</span>\n </div>\n <ng-container *ngIf='hasItems()'>\n <mat-icon *ngIf='!isRtlLayout()' [@isExpandedLTR]=\"hasItems() && expanded ? 'yes' : 'no'\">\n keyboard_arrow_down\n </mat-icon>\n <mat-icon *ngIf='isRtlLayout()' [@isExpandedRTL]=\"hasItems() && expanded ? 'yes' : 'no'\">\n keyboard_arrow_down\n </mat-icon>\n </ng-container>\n</mat-list-item>\n\n<mat-divider *ngIf=\"hasDivider\"></mat-divider>\n\n<div *ngIf=\"hasItems() && expanded\" [@slideInOut] [dir]=\"isRtlLayout() ? 'rtl' : 'ltr'\" [ngClass]=\"classes\">\n <ng-list-item *ngFor=\"let singleNode of nodeChildren\" [hasDivider]=\"hasDivider\" [nodeConfiguration]='nodeConfiguration' [node]='singleNode' [level]=\"level + 1\" [selectedNode]='selectedNode' (selectedItem)=\"selectedListItem($event)\">\n </ng-list-item>\n</div>", styles: [".amml-item{line-height:48px;position:relative;cursor:pointer}.anml-data{width:100%;text-transform:capitalize;display:flex;justify-content:start;height:48px}.amml-icon-fa{font-size:20px}.amml-icon,.label{line-height:48px}div[dir=ltr] .amml-icon{margin-right:16px}div[dir=ltr].amml-submenu,div[dir=rtl] .amml-icon{margin-left:16px}div[dir=rtl].amml-submenu{margin-right:16px}"], animations: [ trigger('slideInOut', [ state('in', style({ height: '*', opacity: 0 })), transition(':leave', [ style({ height: '*', opacity: 0.2 }), group([ animate(200, style({ height: 0 })), animate('200ms ease-out', style({ opacity: 0 })) ]) ]), transition(':enter', [ style({ height: '0', opacity: 0 }), group([ animate(200, style({ height: '*' })), animate('400ms ease-out', style({ opacity: 1 })) ]) ]) ]), trigger('isExpandedLTR', [ state('no', style({ transform: 'rotate(-90deg)' })), state('yes', style({ transform: 'rotate(0deg)' })), transition('no => yes', animate(200)), transition('yes => no', animate(200)) ]), trigger('isExpandedRTL', [ state('no', style({ transform: 'rotate(90deg)' })), state('yes', style({ transform: 'rotate(0deg)' })), transition('no => yes', animate(200)), transition('yes => no', animate(200)) ]) ] },] }, ]; ListItemComponent.ctorParameters = function () { return [ { type: Router }, { type: MultilevelMenuService } ]; }; ListItemComponent.propDecorators = { node: [{ type: Input }], level: [{ type: Input }], selectedNode: [{ type: Input }], nodeConfiguration: [{ type: Input }], selectedItem: [{ type: Output }], hasDivider: [{ type: Input }] }; return ListItemComponent; }()); export { ListItemComponent }; if (false) { /** @type {?} */ ListItemComponent.prototype.node; /** @type {?} */ ListItemComponent.prototype.level; /** @type {?} */ ListItemComponent.prototype.selectedNode; /** @type {?} */ ListItemComponent.prototype.nodeConfiguration; /** @type {?} */ ListItemComponent.prototype.selectedItem; /** @type {?} */ ListItemComponent.prototype.hasDivider; /** @type {?} */ ListItemComponent.prototype.isSelected; /** @type {?} */ ListItemComponent.prototype.nodeChildren; /** @type {?} */ ListItemComponent.prototype.classes; /** @type {?} */ ListItemComponent.prototype.selectedListClasses; /** @type {?} */ ListItemComponent.prototype.expanded; /** @type {?} */ ListItemComponent.prototype.firstInitializer; /** @type {?} */ ListItemComponent.prototype.router; /** @type {?} */ ListItemComponent.prototype.multilevelMenuService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLW1hdGVyaWFsLW11bHRpbGV2ZWwtbWVudS0yLyIsInNvdXJjZXMiOlsibGliL2xpc3QtaXRlbS9saXN0LWl0ZW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ04sTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUM7SUErRUUsMkJBQ1UsTUFBYyxFQUNkLHFCQUE0Qzs7UUFENUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFiN0MsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUVWLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFDdkMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNwRCxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzNCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFJbkIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxDQUFDLG1CQUFtQjtZQUN0QixHQUFDLFFBQVEsQ0FBQyx1QkFBdUIsSUFBRyxJQUFJO1lBQ3hDLEdBQUMsUUFBUSxDQUFDLHdCQUF3QixJQUFHLEtBQUs7ZUFDM0MsQ0FBQztJQUNKLENBQUM7Ozs7SUFDRCx1Q0FBVzs7O0lBQVg7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Q0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDdEMsQ0FBQzt3QkFDRixPQUFPLENBQUMsZUFBZSxFQUFFOzRCQUN2QixLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDOzRCQUNsRCxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDOzRCQUVsRCxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDckMsVUFBVSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQ3RDLENBQUM7cUJBQ0g7aUJBQ0Y7OztnQkFoRlEsTUFBTTtnQkFVTixxQkFBcUI7Ozt1QkF3RTNCLEtBQUs7d0JBQ0wsS0FBSzsrQkFDTCxLQUFLO29DQUNMLEtBQUs7K0JBQ0wsTUFBTTs2QkFDTixLQUFLOztJQW1JUix3QkFBQztDQUFBLEFBM01ELElBMk1DO1NBeklZLGlCQUFpQjs7O0lBQzVCLGlDQUErQjs7SUFDL0Isa0NBQW1COztJQUNuQix5Q0FBdUM7O0lBQ3ZDLDhDQUFpRDs7SUFDakQseUNBQTZEOztJQUM3RCx1Q0FBMkI7O0lBQzNCLHVDQUFtQjs7SUFDbkIseUNBQWdDOztJQUNoQyxvQ0FBc0M7O0lBQ3RDLGdEQUFrRDs7SUFDbEQscUNBQWlCOztJQUNqQiw2Q0FBeUI7O0lBRXZCLG1DQUFzQjs7SUFDdEIsa0RBQW9EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHtcclxuICB0cmlnZ2VyLFxyXG4gIHN0eWxlLFxyXG4gIHRyYW5zaXRpb24sXHJcbiAgYW5pbWF0ZSxcclxuICBzdGF0ZSxcclxuICBncm91cFxyXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5cclxuaW1wb3J0IHsgTXVsdGlsZXZlbE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi8uLi9tdWx0aWxldmVsLW1lbnUuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uLCBNdWx0aWxldmVsTm9kZXMsIExpc3RTdHlsZSB9IGZyb20gJy4vLi4vYXBwLm1vZGVsJztcclxuaW1wb3J0IHsgQ09OU1RBTlQgfSBmcm9tICcuLy4uL2NvbnN0YW50cyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25nLWxpc3QtaXRlbScsXHJcbiAgdGVtcGxhdGU6IGA8bWF0LWxpc3QtaXRlbSBtYXRSaXBwbGUgW25nQ2xhc3NdPVwic2VsZWN0ZWRMaXN0Q2xhc3Nlc1wiICpuZ0lmPVwiIW5vZGUuaGlkZGVuXCIgKGNsaWNrKT1cImV4cGFuZChub2RlKVwiIHRpdGxlPVwie3tub2RlLmxhYmVsfX1cIiBbbmdTdHlsZV09XCJnZXRMaXN0U3R5bGUoKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFubWwtZGF0YVwiIFtkaXJdPVwiaXNSdGxMYXlvdXQoKSA/ICdydGwnIDogJ2x0cidcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIiBbbmdTd2l0Y2hdPVwiZ2V0TGlzdEljb24obm9kZSlcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidmYWljb24nXCIgY2xhc3M9XCJhbW1sLWljb24gYW1tbC1pY29uLWZhXCI+XHJcbiAgICAgICAgPGkgW25nQ2xhc3NdPVwibm9kZS5mYUljb25cIj48L2k+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ1N3aXRjaENhc2U9XCInaWNvbidcIiBjbGFzcz1cImFtbWwtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAge3tub2RlLmljb259fVxyXG4gICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8aW1nIG1hdExpc3RBdmF0YXIgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZWljb24nXCIgY2xhc3M9XCJhbW1sLWljb25cIiBzcmM9XCJ7e25vZGUuaW1hZ2VJY29ufX1cIiBhbHQ9XCJ7e25vZGUubGFiZWx9fVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7bm9kZS5sYWJlbH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPSdoYXNJdGVtcygpJz5cclxuICAgICAgICA8bWF0LWljb24gKm5nSWY9JyFpc1J0bExheW91dCgpJyBbQGlzRXhwYW5kZWRMVFJdPVwiaGFzSXRlbXMoKSAmJiBleHBhbmRlZCA/ICd5ZXMnIDogJ25vJ1wiPlxyXG4gICAgICAgICAgICBrZXlib2FyZF9hcnJvd19kb3duXHJcbiAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICA8bWF0LWljb24gKm5nSWY9J2lzUnRsTGF5b3V0KCknIFtAaXNFeHBhbmRlZFJUTF09XCJoYXNJdGVtcygpICYmIGV4cGFuZGVkID8gJ3llcycgOiAnbm8nXCI+XHJcbiAgICAgICAgICAgIGtleWJvYXJkX2Fycm93X2Rvd25cclxuICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbWF0LWxpc3QtaXRlbT5cclxuXHJcbjxtYXQtZGl2aWRlciAqbmdJZj1cImhhc0RpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxyXG5cclxuPGRpdiAqbmdJZj1cImhhc0l0ZW1zKCkgJiYgZXhwYW5kZWRcIiBbQHNsaWRlSW5PdXRdIFtkaXJdPVwiaXNSdGxMYXlvdXQoKSA/ICdydGwnIDogJ2x0cidcIiBbbmdDbGFzc109XCJjbGFzc2VzXCI+XHJcbiAgICA8bmctbGlzdC1pdGVtICpuZ0Zvcj1cImxldCBzaW5nbGVOb2RlIG9mIG5vZGVDaGlsZHJlblwiIFtoYXNEaXZpZGVyXT1cImhhc0RpdmlkZXJcIiBbbm9kZUNvbmZpZ3VyYXRpb25dPSdub2RlQ29uZmlndXJhdGlvbicgW25vZGVdPSdzaW5nbGVOb2RlJyBbbGV2ZWxdPVwibGV2ZWwgKyAxXCIgW3NlbGVjdGVkTm9kZV09J3NlbGVjdGVkTm9kZScgKHNlbGVjdGVkSXRlbSk9XCJzZWxlY3RlZExpc3RJdGVtKCRldmVudClcIj5cclxuICAgIDwvbmctbGlzdC1pdGVtPlxyXG48L2Rpdj5gLFxyXG4gIHN0eWxlczogW2AuYW1tbC1pdGVte2xpbmUtaGVpZ2h0OjQ4cHg7cG9zaXRpb246cmVsYXRpdmU7Y3Vyc29yOnBvaW50ZXJ9LmFubWwtZGF0YXt3aWR0aDoxMDAlO3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemU7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzdGFydDtoZWlnaHQ6NDhweH0uYW1tbC1pY29uLWZhe2ZvbnQtc2l6ZToyMHB4fS5hbW1sLWljb24sLmxhYmVse2xpbmUtaGVpZ2h0OjQ4cHh9ZGl2W2Rpcj1sdHJdIC5hbW1sLWljb257bWFyZ2luLXJpZ2h0OjE2cHh9ZGl2W2Rpcj1sdHJdLmFtbWwtc3VibWVudSxkaXZbZGlyPXJ0bF0gLmFtbWwtaWNvbnttYXJnaW4tbGVmdDoxNnB4fWRpdltkaXI9cnRsXS5hbW1sLXN1Ym1lbnV7bWFyZ2luLXJpZ2h0OjE2cHh9YF0sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignc2xpZGVJbk91dCcsIFtcclxuICAgICAgc3RhdGUoJ2luJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgb3BhY2l0eTogMCB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcclxuICAgICAgICBzdHlsZSh7IGhlaWdodDogJyonLCBvcGFjaXR5OiAwLjIgfSksXHJcbiAgICAgICAgZ3JvdXAoW1xyXG4gICAgICAgICAgYW5pbWF0ZSgyMDAsIHN0eWxlKHsgaGVpZ2h0OiAwIH0pKSxcclxuICAgICAgICAgIGFuaW1hdGUoJzIwMG1zIGVhc2Utb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKVxyXG4gICAgICAgIF0pXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXHJcbiAgICAgICAgc3R5bGUoeyBoZWlnaHQ6ICcwJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBncm91cChbXHJcbiAgICAgICAgICBhbmltYXRlKDIwMCwgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXHJcbiAgICAgICAgICBhbmltYXRlKCc0MDBtcyBlYXNlLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSlcclxuICAgICAgICBdKVxyXG4gICAgICBdKVxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdpc0V4cGFuZGVkTFRSJywgW1xyXG4gICAgICBzdGF0ZSgnbm8nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3JvdGF0ZSgtOTBkZWcpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd5ZXMnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3JvdGF0ZSgwZGVnKScgfSkpLFxyXG5cclxuICAgICAgdHJhbnNpdGlvbignbm8gPT4geWVzJywgYW5pbWF0ZSgyMDApKSxcclxuICAgICAgdHJhbnNpdGlvbigneWVzID0+IG5vJywgYW5pbWF0ZSgyMDApKVxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdpc0V4cGFuZGVkUlRMJywgW1xyXG4gICAgICBzdGF0ZSgnbm8nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3JvdGF0ZSg5MGRlZyknIH0pKSxcclxuICAgICAgc3RhdGUoJ3llcycsIHN0eWxlKHsgdHJhbnNmb3JtOiAncm90YXRlKDBkZWcpJyB9KSksXHJcblxyXG4gICAgICB0cmFuc2l0aW9uKCdubyA9PiB5ZXMnLCBhbmltYXRlKDIwMCkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd5ZXMgPT4gbm8nLCBhbmltYXRlKDIwMCkpXHJcbiAgICBdKVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIExpc3RJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBub2RlOiBNdWx0aWxldmVsTm9kZXM7XHJcbiAgQElucHV0KCkgbGV2ZWwgPSAxO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkTm9kZTogTXVsdGlsZXZlbE5vZGVzO1xyXG4gIEBJbnB1dCgpIG5vZGVDb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uID0gbnVsbDtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxNdWx0aWxldmVsTm9kZXM+KCk7XHJcbiAgQElucHV0KCkgaGFzRGl2aWRlciA9IHRydWU7XHJcbiAgaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gIG5vZGVDaGlsZHJlbjogTXVsdGlsZXZlbE5vZGVzW107XHJcbiAgY2xhc3NlczogeyBbaW5kZXg6IHN0cmluZ106IGJvb2xlYW4gfTtcclxuICBzZWxlY3RlZExpc3RDbGFzc2VzOiB7IFtpbmRleDogc3RyaW5nXTogYm9vbGVhbiB9O1xyXG4gIGV4cGFuZGVkID0gZmFsc2U7XHJcbiAgZmlyc3RJbml0aWFsaXplciA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbXVsdGlsZXZlbE1lbnVTZXJ2aWNlOiBNdWx0aWxldmVsTWVudVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMaXN0Q2xhc3NlcyA9IHtcclxuICAgICAgW0NPTlNUQU5ULkRFRkFVTFRfTElTVF9DTEFTU19OQU1FXTogdHJ1ZSxcclxuICAgICAgW0NPTlNUQU5ULlNFTEVDVEVEX0xJU1RfQ0xBU1NfTkFNRV06IGZhbHNlXHJcbiAgICB9O1xyXG4gIH1cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIHRoaXMubm9kZUNoaWxkcmVuID1cclxuICAgICAgdGhpcy5ub2RlICYmIHRoaXMubm9kZS5pdGVtc1xyXG4gICAgICAgID8gdGhpcy5ub2RlLml0ZW1zLmZpbHRlcihuID0+ICFuLmhpZGRlbilcclxuICAgICAgICA6IFtdO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RlZE5vZGUgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zZXRTZWxlY3RlZENsYXNzKFxyXG4gICAgICAgIHRoaXMubXVsdGlsZXZlbE1lbnVTZXJ2aWNlLnJlY3Vyc2l2ZUNoZWNrSWQoXHJcbiAgICAgICAgICB0aGlzLm5vZGUsXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5pZFxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0U2VsZWN0ZWRDbGFzcyhpc0ZvdW5kOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoaXNGb3VuZCkge1xyXG4gICAgICBpZiAoIXRoaXMuZmlyc3RJbml0aWFsaXplcikge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNTZWxlY3RlZCA9XHJcbiAgICAgICAgdGhpcy5ub2RlQ29uZmlndXJhdGlvbi5oaWdobGlnaHRPblNlbGVjdCB8fFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLml0ZW1zID09PSB1bmRlZmluZWRcclxuICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgOiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5ub2RlQ29uZmlndXJhdGlvbi5jb2xsYXBzZU9uU2VsZWN0KSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkTGlzdENsYXNzZXMgPSB7XHJcbiAgICAgIFtDT05TVEFOVC5ERUZBVUxUX0xJU1RfQ0xBU1NfTkFNRV06IHRydWUsXHJcbiAgICAgIFtDT05TVEFOVC5TRUxFQ1RFRF9MSVNUX0NMQVNTX05BTUVdOiB0aGlzLmlzU2VsZWN0ZWRcclxuICAgIH07XHJcbiAgICB0aGlzLnNldENsYXNzZXMoKTtcclxuICB9XHJcbiAgZ2V0UGFkZGluZ0F0U3RhcnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5ub2RlQ29uZmlndXJhdGlvbi5wYWRkaW5nQXRTdGFydCA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0TGlzdFN0eWxlKCk6IExpc3RTdHlsZSB7XHJcbiAgICBjb25zdCBzdHlsZXMgPSB7XHJcbiAgICAgIGJhY2tncm91bmQ6IENPTlNUQU5ULkRFRkFVTFRfTElTVF9CQUNLR1JPVU5EX0NPTE9SLFxyXG4gICAgICBjb2xvcjogQ09OU1RBTlQuREVGQVVMVF9MSVNUX0ZPTlRfQ09MT1JcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5ub2RlQ29uZmlndXJhdGlvbi5saXN0QmFja2dyb3VuZENvbG9yICE9PSBudWxsKSB7XHJcbiAgICAgIHN0eWxlcy5iYWNrZ3JvdW5kID0gdGhpcy5ub2RlQ29uZmlndXJhdGlvbi5saXN0QmFja2dyb3VuZENvbG9yO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLm5vZGVDb25maWd1cmF0aW9uLnNlbGVjdGVkTGlzdEZvbnRDb2xvciAhPT0gbnVsbFxyXG4gICAgICAgID8gKHN0eWxlcy5jb2xvciA9IHRoaXMubm9kZUNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRMaXN0Rm9udENvbG9yKVxyXG4gICAgICAgIDogKHN0eWxlcy5jb2xvciA9IENPTlNUQU5ULkRFRkFVTFRfU0VMRUNURURfRk9OVF9DT0xPUik7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZUNvbmZpZ3VyYXRpb24uZm9udENvbG9yICE9PSBudWxsKSB7XHJcbiAgICAgIHN0eWxlcy5jb2xvciA9IHRoaXMubm9kZUNvbmZpZ3VyYXRpb24uZm9udENvbG9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0eWxlcztcclxuICB9XHJcbiAgZ2V0TGlzdEljb24obm9kZTogTXVsdGlsZXZlbE5vZGVzKTogc3RyaW5nIHtcclxuICAgIGlmIChub2RlLmljb24gIT09IG51bGwgJiYgbm9kZS5pY29uICE9PSB1bmRlZmluZWQgJiYgbm9kZS5pY29uICE9PSAnJykge1xyXG4gICAgICByZXR1cm4gYGljb25gO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgbm9kZS5mYUljb24gIT09IG51bGwgJiZcclxuICAgICAgbm9kZS5mYUljb24gIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICBub2RlLmZhSWNvbiAhPT0gJydcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gYGZhaWNvbmA7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBub2RlLmltYWdlSWNvbiAhPT0gbnVsbCAmJlxyXG4gICAgICBub2RlLmltYWdlSWNvbiAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIG5vZGUuaW1hZ2VJY29uICE9PSAnJ1xyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBgaW1hZ2VpY29uYDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBgYDtcclxuICAgIH1cclxuICB9XHJcbiAgaGFzSXRlbXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5ub2RlQ2hpbGRyZW4ubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcbiAgaXNSdGxMYXlvdXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5ub2RlQ29uZmlndXJhdGlvbi5ydGxMYXlvdXQ7XHJcbiAgfVxyXG4gIHNldENsYXNzZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsYXNzZXMgPSB7XHJcbiAgICAgIFsnbGV2ZWwtJyArIHRoaXMubGV2ZWxdOiB0cnVlLFxyXG4gICAgICAnYW1tbC1zdWJtZW51JzogdGhpcy5oYXNJdGVtcygpICYmIHRoaXMuZ2V0UGFkZGluZ0F0U3RhcnQoKVxyXG4gICAgfTtcclxuICB9XHJcbiAgZXhwYW5kKG5vZGU6IE11bHRpbGV2ZWxOb2Rlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xyXG4gICAgdGhpcy5maXJzdEluaXRpYWxpemVyID0gdHJ1ZTtcclxuICAgIHRoaXMuc2V0Q2xhc3NlcygpO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm5vZGVDb25maWd1cmF0aW9uLmludGVyZmFjZVdpdGhSb3V0ZSAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm5vZGVDb25maWd1cmF0aW9uLmludGVyZmFjZVdpdGhSb3V0ZSAmJlxyXG4gICAgICBub2RlLmxpbmsgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICBub2RlLmxpbmtcclxuICAgICkge1xyXG4gICAgICBpZiAobm9kZS5leHRlcm5hbFJlZGlyZWN0ICE9PSB1bmRlZmluZWQgJiYgbm9kZS5leHRlcm5hbFJlZGlyZWN0KSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBub2RlLmxpbms7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25vZGUubGlua10pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG5vZGUub25TZWxlY3RlZCAmJiB0eXBlb2Ygbm9kZS5vblNlbGVjdGVkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIG5vZGUub25TZWxlY3RlZChub2RlKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZExpc3RJdGVtKG5vZGUpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgbm9kZS5pdGVtcyA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgIHRoaXMubm9kZUNvbmZpZ3VyYXRpb24uY29sbGFwc2VPblNlbGVjdFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMaXN0SXRlbShub2RlKTtcclxuICAgIH1cclxuICB9XHJcbiAgc2VsZWN0ZWRMaXN0SXRlbShub2RlOiBNdWx0aWxldmVsTm9kZXMpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtLmVtaXQobm9kZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==