@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
149 lines • 19.8 kB
JavaScript
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListener, inject, Input, Output, Renderer2 } from '@angular/core';
import { BehaviorSubject, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { isKeyboardTrigger } from '../../../common/index';
import { FocusIndicatorService } from '../../../directives/accessibility/index';
import { MenuComponent } from '../menu/menu.component';
import { MenuItemType } from './menu-item-type.enum';
import * as i0 from "@angular/core";
export class MenuItemComponent {
constructor() {
this._menu = inject(MenuComponent);
this._elementRef = inject(ElementRef);
this._focusIndicatorService = inject(FocusIndicatorService);
this._renderer = inject(Renderer2);
/** Define the role of the element */
this.role = 'menuitem';
/** Emits when the menu item is clicked or the enter key is pressed. */
this.activate = new EventEmitter();
/** Indicate the type of the menu item */
this.type = MenuItemType.Default;
/** Store the current hover state */
this.isHovered$ = new BehaviorSubject(false);
/** Store the current focus state */
this.isFocused$ = new BehaviorSubject(false);
/** Store the current expanded state */
this.isExpanded$ = new BehaviorSubject(false);
/** Emit when an item is clicked */
this.onClick$ = new Subject();
/** Automatically unsubscribe from observables on destroy */
this._onDestroy$ = new Subject();
this._disabled = false;
this._closeOnSelect = true;
}
/** Define if this item is disabled or not */
set disabled(disabled) {
this._disabled = coerceBooleanProperty(disabled);
}
get disabled() {
return this._disabled;
}
/** Determine if the menu should close on item click/enter.*/
set closeOnSelect(value) {
this._closeOnSelect = coerceBooleanProperty(value);
}
get closeOnSelect() {
return this._closeOnSelect;
}
/** Access the open state */
get isOpen() {
return this._menu.isMenuOpen;
}
ngOnInit() {
// register this item in the MenuComponent
this._menu._addItem(this);
// we only want to show the focus indicator whenever the keyboard is used
this._focusIndicator = this._focusIndicatorService.monitor(this._elementRef.nativeElement);
// subscribe to active item changes
this._menu._activeItem$.pipe(takeUntil(this._onDestroy$))
.subscribe(item => this.setTabIndex(item === this));
}
ngOnDestroy() {
this._menu._removeItem(this);
this.isHovered$.complete();
this.isExpanded$.complete();
this.isFocused$.complete();
this.onClick$.complete();
this._focusIndicator.destroy();
this._onDestroy$.next();
this._onDestroy$.complete();
}
focus(origin) {
this._focusIndicator.focus(origin);
}
/** This function is built into the CDK manager to allow jumping to items based on text content */
getLabel() {
return this._elementRef.nativeElement.textContent.trim();
}
_onMouseEnter() {
this.isHovered$.next(true);
}
_onMouseLeave() {
this.isHovered$.next(false);
}
_onFocus() {
this.isFocused$.next(true);
}
_onBlur() {
this.isFocused$.next(false);
}
_onClick(event) {
if (!this.disabled) {
if (this.closeOnSelect) {
this.onClick$.next(isKeyboardTrigger(event) ? 'keyboard' : 'mouse');
}
this.activate.emit(event);
}
}
/** Forward any keyboard events to the MenuComponent for accessibility */
_onKeydown(event) {
this._menu._onKeydown(event);
}
/** Update the tab index on this item */
setTabIndex(isTabbable) {
this._renderer.setAttribute(this._elementRef.nativeElement, 'tabindex', isTabbable ? '0' : '-1');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: MenuItemComponent, selector: "[uxMenuItem]", inputs: { disabled: "disabled", closeOnSelect: "closeOnSelect", role: "role" }, outputs: { activate: "activate" }, host: { listeners: { "mouseenter": "_onMouseEnter()", "mouseleave": "_onMouseLeave()", "focus": "_onFocus()", "blur": "_onBlur()", "click": "_onClick($event)", "keydown.enter": "_onClick($event)", "keydown": "_onKeydown($event)" }, properties: { "attr.disabled": "disabled ? \"disabled\" : null", "attr.role": "role", "class.disabled": "disabled", "class.ux-menu-item": "true", "class.open": "isOpen" } }, ngImport: i0, template: "<ng-content></ng-content>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MenuItemComponent, decorators: [{
type: Component,
args: [{ selector: '[uxMenuItem]', changeDetection: ChangeDetectionStrategy.OnPush, host: {
'[attr.disabled]': 'disabled ? "disabled" : null',
'[attr.role]': 'role',
'[class.disabled]': 'disabled',
'[class.ux-menu-item]': 'true',
'[class.open]': 'isOpen'
}, template: "<ng-content></ng-content>\n" }]
}], propDecorators: { disabled: [{
type: Input
}], closeOnSelect: [{
type: Input
}], role: [{
type: Input
}], activate: [{
type: Output
}], _onMouseEnter: [{
type: HostListener,
args: ['mouseenter']
}], _onMouseLeave: [{
type: HostListener,
args: ['mouseleave']
}], _onFocus: [{
type: HostListener,
args: ['focus']
}], _onBlur: [{
type: HostListener,
args: ['blur']
}], _onClick: [{
type: HostListener,
args: ['click', ['$event']]
}, {
type: HostListener,
args: ['keydown.enter', ['$event']]
}], _onKeydown: [{
type: HostListener,
args: ['keydown', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21lbnUvbWVudS1pdGVtL21lbnUtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tZW51L21lbnUtaXRlbS9tZW51LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFrQixxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBY3JELE1BQU0sT0FBTyxpQkFBaUI7SUFaOUI7UUFhcUIsVUFBSyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU5QixnQkFBVyxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFFMUQsMkJBQXNCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFdkQsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQW9CL0MscUNBQXFDO1FB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UCx1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDO3dCQUNGLGlCQUFpQixFQUFFLDhCQUE4Qjt3QkFDakQsYUFBYSxFQUFFLE1BQU07d0JBQ3JCLGtCQUFrQixFQUFFLFVBQVU7d0JBQzlCLHNCQUFzQixFQUFFLE1BQU07d0JBQzlCLGNBQWMsRUFBRSxRQUFRO3FCQUMzQjs4QkFZWSxRQUFRO3NCQUFwQixLQUFLO2dCQVNPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBU0csSUFBSTtzQkFBWixLQUFLO2dCQUdJLFFBQVE7c0JBQWpCLE1BQU07Z0JBaUVQLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxZQUFZO2dCQU0xQixhQUFhO3NCQURaLFlBQVk7dUJBQUMsWUFBWTtnQkFNMUIsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLE9BQU87Z0JBTXJCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxNQUFNO2dCQU9wQixRQUFRO3NCQUZQLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDaEMsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBWXpDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c2FibGVPcHRpb24sIEZvY3VzT3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc0tleWJvYXJkVHJpZ2dlciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9pbmRleCc7XG5pbXBvcnQgeyBGb2N1c0luZGljYXRvciwgRm9jdXNJbmRpY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5L2luZGV4JztcbmltcG9ydCB7IE1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9tZW51L21lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE1lbnVJdGVtVHlwZSB9IGZyb20gJy4vbWVudS1pdGVtLXR5cGUuZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnW3V4TWVudUl0ZW1dJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbYXR0ci5kaXNhYmxlZF0nOiAnZGlzYWJsZWQgPyBcImRpc2FibGVkXCIgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLnJvbGVdJzogJ3JvbGUnLFxuICAgICAgICAnW2NsYXNzLmRpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgICAgICdbY2xhc3MudXgtbWVudS1pdGVtXSc6ICd0cnVlJyxcbiAgICAgICAgJ1tjbGFzcy5vcGVuXSc6ICdpc09wZW4nXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBNZW51SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBGb2N1c2FibGVPcHRpb24ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lbnUgPSBpbmplY3QoTWVudUNvbXBvbmVudCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZvY3VzSW5kaWNhdG9yU2VydmljZSA9IGluamVjdChGb2N1c0luZGljYXRvclNlcnZpY2UpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICAgIC8qKiBEZWZpbmUgaWYgdGhpcyBpdGVtIGlzIGRpc2FibGVkIG9yIG5vdCAqL1xuICAgIEBJbnB1dCgpIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqIERldGVybWluZSBpZiB0aGUgbWVudSBzaG91bGQgY2xvc2Ugb24gaXRlbSBjbGljay9lbnRlci4qL1xuICAgIEBJbnB1dCgpIHNldCBjbG9zZU9uU2VsZWN0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlT25TZWxlY3QgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIGdldCBjbG9zZU9uU2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VPblNlbGVjdDtcbiAgICB9XG5cbiAgICAvKiogRGVmaW5lIHRoZSByb2xlIG9mIHRoZSBlbGVtZW50ICovXG4gICAgQElucHV0KCkgcm9sZTogJ21lbnVpdGVtJyB8ICdtZW51aXRlbXJhZGlvJyB8ICdtZW51aXRlbWNoZWNrYm94JyA9ICdtZW51aXRlbSc7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgbWVudSBpdGVtIGlzIGNsaWNrZWQgb3IgdGhlIGVudGVyIGtleSBpcyBwcmVzc2VkLiAqL1xuICAgIEBPdXRwdXQoKSBhY3RpdmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQ+KCk7XG5cbiAgICAvKiogQWNjZXNzIHRoZSBvcGVuIHN0YXRlICovXG4gICAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnUuaXNNZW51T3BlbjtcbiAgICB9XG5cbiAgICAvKiogSW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIG1lbnUgaXRlbSAqL1xuICAgIHJlYWRvbmx5IHR5cGU6IE1lbnVJdGVtVHlwZSA9IE1lbnVJdGVtVHlwZS5EZWZhdWx0O1xuXG4gICAgLyoqIFN0b3JlIHRoZSBjdXJyZW50IGhvdmVyIHN0YXRlICovXG4gICAgcmVhZG9ubHkgaXNIb3ZlcmVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFN0b3JlIHRoZSBjdXJyZW50IGZvY3VzIHN0YXRlICovXG4gICAgcmVhZG9ubHkgaXNGb2N1c2VkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFN0b3JlIHRoZSBjdXJyZW50IGV4cGFuZGVkIHN0YXRlICovXG4gICAgcmVhZG9ubHkgaXNFeHBhbmRlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBFbWl0IHdoZW4gYW4gaXRlbSBpcyBjbGlja2VkICovXG4gICAgcmVhZG9ubHkgb25DbGljayQgPSBuZXcgU3ViamVjdDxGb2N1c09yaWdpbj4oKTtcblxuICAgIC8qKiBTdG9yZSB0aGUgZm9jdXMgaW5kaWNhdG9yIGluc3RhbmNlICovXG4gICAgcHJpdmF0ZSBfZm9jdXNJbmRpY2F0b3I6IEZvY3VzSW5kaWNhdG9yO1xuXG4gICAgLyoqIEF1dG9tYXRpY2FsbHkgdW5zdWJzY3JpYmUgZnJvbSBvYnNlcnZhYmxlcyBvbiBkZXN0cm95ICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfY2xvc2VPblNlbGVjdDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gcmVnaXN0ZXIgdGhpcyBpdGVtIGluIHRoZSBNZW51Q29tcG9uZW50XG4gICAgICAgIHRoaXMuX21lbnUuX2FkZEl0ZW0odGhpcyk7XG5cbiAgICAgICAgLy8gd2Ugb25seSB3YW50IHRvIHNob3cgdGhlIGZvY3VzIGluZGljYXRvciB3aGVuZXZlciB0aGUga2V5Ym9hcmQgaXMgdXNlZFxuICAgICAgICB0aGlzLl9mb2N1c0luZGljYXRvciA9IHRoaXMuX2ZvY3VzSW5kaWNhdG9yU2VydmljZS5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIGFjdGl2ZSBpdGVtIGNoYW5nZXNcbiAgICAgICAgdGhpcy5fbWVudS5fYWN0aXZlSXRlbSQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGl0ZW0gPT4gdGhpcy5zZXRUYWJJbmRleChpdGVtID09PSB0aGlzKSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21lbnUuX3JlbW92ZUl0ZW0odGhpcyk7XG4gICAgICAgIHRoaXMuaXNIb3ZlcmVkJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmlzRXhwYW5kZWQkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLm9uQ2xpY2skLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2ZvY3VzSW5kaWNhdG9yLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBmb2N1cyhvcmlnaW46IEZvY3VzT3JpZ2luKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvY3VzSW5kaWNhdG9yLmZvY3VzKG9yaWdpbik7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgYnVpbHQgaW50byB0aGUgQ0RLIG1hbmFnZXIgdG8gYWxsb3cganVtcGluZyB0byBpdGVtcyBiYXNlZCBvbiB0ZXh0IGNvbnRlbnQgKi9cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcbiAgICBfb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzSG92ZXJlZCQubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgICBfb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzSG92ZXJlZCQubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICAgIF9vbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCQubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBfb25CbHVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCQubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW50ZXInLCBbJyRldmVudCddKVxuICAgIF9vbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xpY2skLm5leHQoaXNLZXlib2FyZFRyaWdnZXIoZXZlbnQpID8gJ2tleWJvYXJkJyA6ICdtb3VzZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBGb3J3YXJkIGFueSBrZXlib2FyZCBldmVudHMgdG8gdGhlIE1lbnVDb21wb25lbnQgZm9yIGFjY2Vzc2liaWxpdHkgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBfb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21lbnUuX29uS2V5ZG93bihldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIFVwZGF0ZSB0aGUgdGFiIGluZGV4IG9uIHRoaXMgaXRlbSAqL1xuICAgIHByaXZhdGUgc2V0VGFiSW5kZXgoaXNUYWJiYWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndGFiaW5kZXgnLCBpc1RhYmJhYmxlID8gJzAnIDogJy0xJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBib29sZWFuIHwgc3RyaW5nO1xuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9jbG9zZU9uU2VsZWN0OiBCb29sZWFuSW5wdXQ7XG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=