@edugouvfr/ngx-dsfr-ext
Version:
NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)
229 lines • 54.3 kB
JavaScript
import { CommonModule } from '@angular/common';
import { afterNextRender, ChangeDetectionStrategy, Component, computed, ContentChild, contentChildren, ElementRef, EventEmitter, Input, Output, signal, viewChild, viewChildren, ViewEncapsulation, } from '@angular/core';
import { DsfrButtonModule, DsfrLinkModule, newUniqueId } from '@edugouvfr/ngx-dsfr';
import { EduClickOutsideDirective } from '../shared';
import { DsfrDropdownPositionDirective } from '../shared/components/dropdown-container/dropdown-position.directive';
import { DropdownUtils } from '../shared/components/dropdown-container/dropdown.utils';
import { DsfrDropdownMenuGroupComponent } from './component/dropdownmenu-group.component';
import { DsfrDropdownMenuItemComponent } from './component/dropdownmenu-item.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@edugouvfr/ngx-dsfr";
export class DsfrDropdownMenuComponent {
constructor() {
/** Taille du menu déroulant (SM, MD ou LG). MD par défaut. */
this.size = 'MD';
/** Fermer le menu après un clic sur bouton ou lien. */
this.closeOnAction = false;
/** Evènement sélection d'un bouton */
this.buttonSelect = new EventEmitter();
/** Evènement sélection d'un lien */
this.linkSelect = new EventEmitter();
/** Cacher les séparateurs de groupe (dans le cas d'utilisation de menus) */
this.hideGroupSeparator = false;
/**
* Indique la valeur de la propriété css z-index de la modale du composant.
*/
this.zIndex = undefined;
/**@internal */
this.btnMenuRef = viewChild('btnMenu', { read: ElementRef });
/**@internal */
this.dropdownWidth = computed(() => {
return this.btnMenuRef()?.nativeElement.offsetWidth;
});
this.menusView = [];
this.isOpen = signal(false);
this.itemsC = contentChildren(DsfrDropdownMenuItemComponent, { descendants: true }); // slot
this.itemsV = viewChildren(DsfrDropdownMenuItemComponent); // interne
this.indexFocusedElement = -1;
// Recherche du container parent apres initialisation complete du DOM (= afterViewInit non suffisant)
afterNextRender(() => {
if (this.appendTo && this.btnMenuRef()?.nativeElement) {
this.containerToAttach = DropdownUtils.setParentContainer(this.appendTo, this.btnMenuRef()?.nativeElement);
}
});
}
/** Items de menu, liens, boutons ou groupe de liens ou boutons */
set menus(value) {
this.menusView = [];
if (value && value.length) {
this.menusView = value.map((m) => {
if (Array.isArray(m)) {
// Type groupe
return {
menuType: 'group',
items: m.map((item) => {
if (item.link || item.route || item.routerLink) {
return { menuType: 'link', ...item }; // Type lien
}
else {
return { menuType: 'button', ...item }; // Type bouton
}
}),
};
}
else if (m.link || m.route || m.routerLink) {
return { menuType: 'link', ...m }; // Type lien
}
else {
return { menuType: 'button', ...m }; // Type bouton
}
});
}
}
ngOnInit() {
this.menuId ??= newUniqueId();
}
onDropdownAttached() {
this.setInitialFocusOnList();
}
toggleMenu() {
this.isOpen.set(!this.isOpen());
if (this.isOpen()) {
this.indexFocusedElement = -1;
}
}
onButtonClick(button) {
if (button.callback) {
button.callback();
}
if (this.closeOnAction) {
this.isOpen.set(false);
}
this.buttonSelect.emit(button);
}
onClickOutside() {
this.isOpen.set(false);
}
onLinkSelect(link) {
if (link.route) {
this.linkSelect.emit(link);
}
if (this.closeOnAction) {
this.isOpen.set(false);
}
}
/**
* Gestion des interactions clavier sur la liste
* - positionnement du focus sur les éléments précédents/suivants à la navigation flèches
* - fermeture de la liste sur les touches définies, et repositonnement du focus sur le bouton d'ouverture
* @param event keyboard event
*/
doKeyEvent(event) {
switch (event.key) {
case 'ArrowDown':
this.focusToElement(1);
event.preventDefault();
break;
case 'ArrowUp':
this.focusToElement(-1);
event.preventDefault();
break;
case ' ':
this.emitKeyEventElement(event, true);
break;
case 'Enter':
this.emitKeyEventElement(event, false);
if (this.closeOnAction) {
event.preventDefault();
this.closeMenuAndFocusButton();
}
break;
case 'Tab':
case 'Escape':
event.preventDefault();
this.closeMenuAndFocusButton();
break;
default:
}
}
closeMenuAndFocusButton() {
this.isOpen.set(false);
this.btnMenuRef()?.nativeElement.focus();
}
/** Focus sur le premier élément de la liste à l'ouverture de celle-ci */
setInitialFocusOnList() {
this.focusedElement = this.itemsV().length > 0 ? this.itemsV()[0]._anchorElement : this.itemsC()[0]?._anchorElement;
if (this.focusedElement) {
this.focusedElement.setAttribute('tabIndex', '0');
this.focusedElement.focus();
this.indexFocusedElement = 0;
}
}
/**
* Si entrée est pressé / ou espace et que l'élément de liste est de type 'checkbox' ou 'radio'
* Envoi de l'evenement selectItem
*/
emitKeyEventElement(event, onlySelection) {
if (!onlySelection || (this.focusedElement && this.focusedElement.getAttribute('aria-checked'))) {
const items = [...this.itemsC(), ...this.itemsV()];
items[this.indexFocusedElement].selectItem?.emit(event);
}
}
focusToElement(direction) {
const items = [...this.itemsC(), ...this.itemsV()];
const totalItems = items.length;
if (items.length === 0)
return;
let nextIndex = this.indexFocusedElement + direction;
if (nextIndex >= totalItems) {
nextIndex = 0;
}
else if (nextIndex < 0) {
nextIndex = totalItems - 1;
}
this.indexFocusedElement = nextIndex;
this.setFocusElement(items[nextIndex]._anchorElement);
}
/** Gestion des tabindex pour le focus sur le nouvel élément de la liste */
setFocusElement(newElement) {
this.focusedElement.setAttribute('tabIndex', '-1');
this.focusedElement = newElement;
this.focusedElement.setAttribute('tabIndex', '0');
this.focusedElement.focus();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDropdownMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrDropdownMenuComponent, isStandalone: true, selector: "dsfr-ext-dropdownmenu, dsfrx-dropdownmenu", inputs: { labelMenu: "labelMenu", ariaLabelMenu: "ariaLabelMenu", menuId: "menuId", iconMenu: "iconMenu", size: "size", disabled: "disabled", closeOnAction: "closeOnAction", hideGroupSeparator: "hideGroupSeparator", appendTo: "appendTo", zIndex: "zIndex", menus: "menus" }, outputs: { buttonSelect: "buttonSelect", linkSelect: "linkSelect" }, queries: [{ propertyName: "itemsC", predicate: DsfrDropdownMenuItemComponent, descendants: true, isSignal: true }, { propertyName: "contentTemplate", first: true, predicate: ["contentTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "btnMenuRef", first: true, predicate: ["btnMenu"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "itemsV", predicate: DsfrDropdownMenuItemComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div clickOutside data-expanded=\"true\" class=\"dsfrx-menu-dropdown\" (clickOutsideEvent)=\"onClickOutside()\">\n <!-- ajouter ariaLabel ?-->\n <button\n #btnMenu\n [id]=\"menuId\"\n type=\"button\"\n class=\"dsfrx-menu-dropdown__btn fr-btn--tertiary fr-btn\"\n [ngClass]=\"{\n 'fr-btn--sm': size === 'SM',\n 'fr-btn--lg': size === 'LG',\n 'fr-btn--icon-left': !!iconMenu\n }\"\n [disabled]=\"disabled || null\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-controls]=\"menuId + '-menu'\"\n [attr.aria-label]=\"ariaLabelMenu ?? null\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggleMenu()\">\n {{ labelMenu }}\n </button>\n\n @if (isOpen()) {\n <ul\n dsfrxDropdown\n [autoWidth]=\"true\"\n [ngStyle]=\"{ 'z-index': zIndex }\"\n [comboBox]=\"btnMenuRef()?.nativeElement\"\n [parentContainer]=\"containerToAttach\"\n (appendDropdown)=\"onDropdownAttached()\"\n class=\"dsfrx-menu-dropdown__list\"\n [ngClass]=\"containerToAttach ? 'dsfrx-menu-dropdown__list--attach' : ''\"\n tabindex=\"-1\"\n (keydown)=\"doKeyEvent($event)\"\n [id]=\"menuId + '-menu'\"\n role=\"menu\"\n [attr.aria-labelledby]=\"menuId\"\n [style.min-width.px]=\"dropdownWidth()\">\n <!-- Affichage mode programmatique des items de menu -->\n @for (menu of menusView; track menu; let i = $index) {\n @if (menu.menuType === 'group') {\n @if (menusView[i - 1] && !hideGroupSeparator) {\n <li role=\"separator\"></li>\n }\n <dsfrx-dropdownmenu-group>\n @for (item of $any(menu).items; track item) {\n @if (item.menuType === 'link') {\n <ng-container\n [ngTemplateOutlet]=\"linkTemplate\"\n [ngTemplateOutletContext]=\"{ link: item }\"></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"buttonTemplate\"\n [ngTemplateOutletContext]=\"{ action: item }\"></ng-container>\n }\n }\n </dsfrx-dropdownmenu-group>\n } @else if (menu.menuType === 'link') {\n <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ link: menu }\"></ng-container>\n } @else {\n <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ action: menu }\"></ng-container>\n }\n }\n\n @if (menusView.length === 0 && contentTemplate) {\n <!-- Affichage du slot -->\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\n }\n </ul>\n }\n</div>\n\n<ng-template #linkTemplate let-link=\"link\">\n <dsfrx-dropdownmenu-item>\n <dsfr-link\n [customClass]=\"'fr-sidemenu__link'\"\n [tooltipMessage]=\"link.tooltipMessage\"\n [ariaLabel]=\"link.label ? link.ariaLabel : link.label\"\n [link]=\"link.link\"\n [size]=\"size\"\n iconPosition=\"left\"\n [ariaCurrent]=\"link.active\"\n [icon]=\"link.icon\"\n [targetLink]=\"link.linkTarget\"\n [route]=\"link.route\"\n [routePath]=\"link.routerLink\"\n [routerLinkActive]=\"link.routerLinkActive ?? ''\"\n [routerLinkExtras]=\"link.routerLinkExtras\"\n [label]=\"link.label\"\n (linkSelect)=\"onLinkSelect(link)\"\n [disabled]=\"disabled\">\n </dsfr-link>\n </dsfrx-dropdownmenu-item>\n</ng-template>\n\n<ng-template #buttonTemplate let-action=\"action\">\n <dsfrx-dropdownmenu-item>\n <dsfr-button\n [customClass]=\"'dsfrx-menu-item'\"\n [ariaLabel]=\"action.ariaLabel ?? ''\"\n [disabled]=\"!!action.disabled\"\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [type]=\"action.type ?? 'button'\"\n [tooltipMessage]=\"action.tooltipMessage ?? ''\"\n [disabled]=\"action.disabled ?? false\"\n [uppercase]=\"action.uppercase ?? false\"\n [size]=\"size\"\n variant=\"tertiary\"\n (click)=\"onButtonClick(action)\">\n </dsfr-button>\n </dsfrx-dropdownmenu-item>\n</ng-template>\n", styles: [".dsfrx-menu-dropdown__btn{font-size:inherit;padding:.5rem 1rem;--icon-size: 1rem}.dsfrx-menu-dropdown__btn:after{--data-uri-svg: url(\"data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 24 24' ><path fill='%23929292' d='M12,13.1l5-4.9l1.4,1.4L12,15.9L5.6,9.5l1.4-1.4L12,13.1z'/></svg>\");flex:0 0 auto;display:inline-block;vertical-align:calc((.75em - var(--icon-size)) * .5);background-color:currentColor;width:var(--icon-size);height:var(--icon-size);mask-size:100% 100%;mask-image:var(--data-uri-svg);content:\"\";margin-left:.5rem;margin-right:-.125rem;transition:transform .3s}.dsfrx-menu-dropdown__btn.fr-btn--sm{padding:.25rem .75rem;--icon-size: 1rem;font-size:.875rem}.dsfrx-menu-dropdown__btn.fr-btn--sm:after{--icon-size: 1rem;font-size:.875rem}.dsfrx-menu-dropdown__btn.fr-btn--lg{--icon-size: 1.25rem;font-size:1.125rem}.dsfrx-menu-dropdown__btn[aria-expanded=true]{background-color:var(--background-action-low-blue-france)}.dsfrx-menu-dropdown__btn[aria-expanded=true]:after{transform:rotate(-180deg)}\n", ".dsfrx-menu-dropdown{width:fit-content;position:relative;display:block}.dsfrx-menu-dropdown__list{background-color:var(--background-overlap-grey);box-shadow:inset 0 1px 0 0 var(--border-open-blue-france);filter:drop-shadow(var(--overlap-shadow));clip-path:inset(-1px -8px -10px -10px);margin:0;padding:0;position:absolute;z-index:calc(var(--ground) + 2000)}.dsfrx-menu-dropdown__list--attach{width:auto!important}ul.dsfrx-menu-dropdown__list{list-style:none}ul.dsfrx-menu-dropdown__list ul[role=group]{list-style-type:none;padding:0;margin:0}ul.dsfrx-menu-dropdown__list li{border-bottom:1px solid var(--background-contrast-grey);padding:0;white-space:nowrap}ul.dsfrx-menu-dropdown__list li[role=menuitem],ul.dsfrx-menu-dropdown__list li[role=menuitemcheckbox]{padding:.5rem 1rem;cursor:pointer;width:100%}ul.dsfrx-menu-dropdown__list li[role=menuitem]:focus,ul.dsfrx-menu-dropdown__list li[role=menuitemcheckbox]:focus{outline-offset:-1px}ul.dsfrx-menu-dropdown__list li[role=menuitem]:hover,ul.dsfrx-menu-dropdown__list li[role=menuitemcheckbox]:hover{background-color:var(--hover)}ul.dsfrx-menu-dropdown__list li[role=menuitem][aria-checked=true],ul.dsfrx-menu-dropdown__list li[role=menuitemcheckbox][aria-checked=true]{box-shadow:inset 0 0 0 1px var(--border-active-blue-france);color:var(--text-active-blue-france)}ul.dsfrx-menu-dropdown__list li:last-child{border-bottom:none}ul.dsfrx-menu-dropdown__list a.fr-sidemenu__link{background-size:0;font-weight:400;color:var(--text-default-grey);padding:.5rem 1rem}ul.dsfrx-menu-dropdown__list a.fr-sidemenu__link.fr-link--sm{font-size:.875rem;line-height:1.5rem}ul.dsfrx-menu-dropdown__list a.fr-sidemenu__link.fr-link--lg{font-size:1.125rem}ul.dsfrx-menu-dropdown__list a.fr-sidemenu__link:focus{outline-offset:-1px}ul.dsfrx-menu-dropdown__list .dsfrx-menu-item{padding:.5rem 1rem;box-shadow:none;width:100%}ul.dsfrx-menu-dropdown__list .dsfrx-menu-item:focus{outline-offset:-1px}ul.dsfrx-menu-dropdown__list li[role=separator]{border-bottom:1px solid #d0d0d1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: DsfrButtonModule }, { kind: "component", type: i2.DsfrButtonComponent, selector: "dsfr-button", inputs: ["label", "type", "tooltipMessage", "variant", "buttonSize", "icon", "iconPosition", "disabled", "uppercase", "loader", "ariaLabel", "invertedOutlineContrast", "id", "buttonId", "ariaControls", "ariaPressed", "ariaHasPopup", "ariaExpanded", "tabIndex", "customClass", "buttonRole", "labelSrOnly", "size"] }, { kind: "ngmodule", type: DsfrLinkModule }, { kind: "component", type: i2.DsfrLinkComponent, selector: "dsfr-link", inputs: ["ariaCurrent", "ariaLabel", "ariaControls", "customClass", "disabled", "icon", "iconPosition", "linkId", "label", "link", "linkTarget", "route", "routePath", "routerLinkActive", "routerLinkActiveOptions", "routerLinkExtras", "linkSize", "tooltipMessage", "mode", "ariaCurrentWhenActive", "size", "targetLink", "routerLink"], outputs: ["linkSelect"] }, { kind: "directive", type: EduClickOutsideDirective, selector: "[clickOutside]", outputs: ["clickOutsideEvent"] }, { kind: "component", type: DsfrDropdownMenuItemComponent, selector: "dsfrx-dropdownmenu-item, dsfr-ext-dropdownmenu-item", inputs: ["type", "checked"], outputs: ["selectItem"] }, { kind: "component", type: DsfrDropdownMenuGroupComponent, selector: "dsfrx-dropdownmenu-group, dsfr-ext-dropdownmenu-group", inputs: ["showSeparator"] }, { kind: "directive", type: DsfrDropdownPositionDirective, selector: "[dsfrxDropdown]", inputs: ["autoWidth", "parentContainer", "comboBox"], outputs: ["appendDropdown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDropdownMenuComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-ext-dropdownmenu, dsfrx-dropdownmenu', standalone: true, imports: [
CommonModule,
DsfrButtonModule,
DsfrLinkModule,
EduClickOutsideDirective,
DsfrDropdownMenuItemComponent,
DsfrDropdownMenuGroupComponent,
DsfrDropdownPositionDirective,
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div clickOutside data-expanded=\"true\" class=\"dsfrx-menu-dropdown\" (clickOutsideEvent)=\"onClickOutside()\">\n <!-- ajouter ariaLabel ?-->\n <button\n #btnMenu\n [id]=\"menuId\"\n type=\"button\"\n class=\"dsfrx-menu-dropdown__btn fr-btn--tertiary fr-btn\"\n [ngClass]=\"{\n 'fr-btn--sm': size === 'SM',\n 'fr-btn--lg': size === 'LG',\n 'fr-btn--icon-left': !!iconMenu\n }\"\n [disabled]=\"disabled || null\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-controls]=\"menuId + '-menu'\"\n [attr.aria-label]=\"ariaLabelMenu ?? null\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggleMenu()\">\n {{ labelMenu }}\n </button>\n\n @if (isOpen()) {\n <ul\n dsfrxDropdown\n [autoWidth]=\"true\"\n [ngStyle]=\"{ 'z-index': zIndex }\"\n [comboBox]=\"btnMenuRef()?.nativeElement\"\n [parentContainer]=\"containerToAttach\"\n (appendDropdown)=\"onDropdownAttached()\"\n class=\"dsfrx-menu-dropdown__list\"\n [ngClass]=\"containerToAttach ? 'dsfrx-menu-dropdown__list--attach' : ''\"\n tabindex=\"-1\"\n (keydown)=\"doKeyEvent($event)\"\n [id]=\"menuId + '-menu'\"\n role=\"menu\"\n [attr.aria-labelledby]=\"menuId\"\n [style.min-width.px]=\"dropdownWidth()\">\n <!-- Affichage mode programmatique des items de menu -->\n @for (menu of menusView; track menu; let i = $index) {\n @if (menu.menuType === 'group') {\n @if (menusView[i - 1] && !hideGroupSeparator) {\n <li role=\"separator\"></li>\n }\n <dsfrx-dropdownmenu-group>\n @for (item of $any(menu).items; track item) {\n @if (item.menuType === 'link') {\n <ng-container\n [ngTemplateOutlet]=\"linkTemplate\"\n [ngTemplateOutletContext]=\"{ link: item }\"></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"buttonTemplate\"\n [ngTemplateOutletContext]=\"{ action: item }\"></ng-container>\n }\n }\n </dsfrx-dropdownmenu-group>\n } @else if (menu.menuType === 'link') {\n <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ link: menu }\"></ng-container>\n } @else {\n <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ action: menu }\"></ng-container>\n }\n }\n\n @if (menusView.length === 0 && contentTemplate) {\n <!-- Affichage du slot -->\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\n }\n </ul>\n }\n</div>\n\n<ng-template #linkTemplate let-link=\"link\">\n <dsfrx-dropdownmenu-item>\n <dsfr-link\n [customClass]=\"'fr-sidemenu__link'\"\n [tooltipMessage]=\"link.tooltipMessage\"\n [ariaLabel]=\"link.label ? link.ariaLabel : link.label\"\n [link]=\"link.link\"\n [size]=\"size\"\n iconPosition=\"left\"\n [ariaCurrent]=\"link.active\"\n [icon]=\"link.icon\"\n [targetLink]=\"link.linkTarget\"\n [route]=\"link.route\"\n [routePath]=\"link.routerLink\"\n [routerLinkActive]=\"link.routerLinkActive ?? ''\"\n [routerLinkExtras]=\"link.routerLinkExtras\"\n [label]=\"link.label\"\n (linkSelect)=\"onLinkSelect(link)\"\n [disabled]=\"disabled\">\n </dsfr-link>\n </dsfrx-dropdownmenu-item>\n</ng-template>\n\n<ng-template #buttonTemplate let-action=\"action\">\n <dsfrx-dropdownmenu-item>\n <dsfr-button\n [customClass]=\"'dsfrx-menu-item'\"\n [ariaLabel]=\"action.ariaLabel ?? ''\"\n [disabled]=\"!!action.disabled\"\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [type]=\"action.type ?? 'button'\"\n [tooltipMessage]=\"action.tooltipMessage ?? ''\"\n [disabled]=\"action.disabled ?? false\"\n [uppercase]=\"action.uppercase ?? false\"\n [size]=\"size\"\n variant=\"tertiary\"\n (click)=\"onButtonClick(action)\">\n </dsfr-button>\n </dsfrx-dropdownmenu-item>\n</ng-template>\n", styles: [".dsfrx-menu-dropdown__btn{font-size:inherit;padding:.5rem 1rem;--icon-size: 1rem}.dsfrx-menu-dropdown__btn:after{--data-uri-svg: url(\"data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 24 24' ><path fill='%23929292' d='M12,13.1l5-4.9l1.4,1.4L12,15.9L5.6,9.5l1.4-1.4L12,13.1z'/></svg>\");flex:0 0 auto;display:inline-block;vertical-align:calc((.75em - var(--icon-size)) * .5);background-color:currentColor;width:var(--icon-size);height:var(--icon-size);mask-size:100% 100%;mask-image:var(--data-uri-svg);content:\"\";margin-left:.5rem;margin-right:-.125rem;transition:transform .3s}.dsfrx-menu-dropdown__btn.fr-btn--sm{padding:.25rem .75rem;--icon-size: 1rem;font-size:.875rem}.dsfrx-menu-dropdown__btn.fr-btn--sm:after{--icon-size: 1rem;font-size:.875rem}.dsfrx-menu-dropdown__btn.fr-btn--lg{--icon-size: 1.25rem;font-size:1.125rem}.dsfrx-menu-dropdown__btn[aria-expanded=true]{background-color:var(--background-action-low-blue-france)}.dsfrx-menu-dropdown__btn[aria-expanded=true]:after{transform:rotate(-180deg)}\n", ".dsfrx-menu-dropdown{width:fit-content;position:relative;display:block}.dsfrx-menu-dropdown__list{background-color:var(--background-overlap-grey);box-shadow:inset 0 1px 0 0 var(--border-open-blue-france);filter:drop-shadow(var(--overlap-shadow));clip-path:inset(-1px -8px -10px -10px);margin:0;padding:0;position:absolute;z-index:calc(var(--ground) + 2000)}.dsfrx-menu-dropdown__list--attach{width:auto!important}ul.dsfrx-menu-dropdown__list{list-style:none}ul.dsfrx-menu-dropdown__list ul[role=group]{list-style-type:none;padding:0;margin:0}ul.dsfrx-menu-dropdown__list li{border-bottom:1px solid var(--background-contrast-grey);padding:0;white-space:nowrap}ul.dsfrx-menu-dropdown__list li[role=menuitem],ul.dsfrx-menu-dropdown__list li[role=menuitemcheckbox]{padding:.5rem 1rem;cursor:pointer;width:100%}ul.dsfrx-menu-dropdown__list li[role=menuitem]:focus,ul.dsfrx-menu-dropdown__list li[role=menuitemcheckbox]:focus{outline-offset:-1px}ul.dsfrx-menu-dropdown__list li[role=menuitem]:hover,ul.dsfrx-menu-dropdown__list li[role=menuitemcheckbox]:hover{background-color:var(--hover)}ul.dsfrx-menu-dropdown__list li[role=menuitem][aria-checked=true],ul.dsfrx-menu-dropdown__list li[role=menuitemcheckbox][aria-checked=true]{box-shadow:inset 0 0 0 1px var(--border-active-blue-france);color:var(--text-active-blue-france)}ul.dsfrx-menu-dropdown__list li:last-child{border-bottom:none}ul.dsfrx-menu-dropdown__list a.fr-sidemenu__link{background-size:0;font-weight:400;color:var(--text-default-grey);padding:.5rem 1rem}ul.dsfrx-menu-dropdown__list a.fr-sidemenu__link.fr-link--sm{font-size:.875rem;line-height:1.5rem}ul.dsfrx-menu-dropdown__list a.fr-sidemenu__link.fr-link--lg{font-size:1.125rem}ul.dsfrx-menu-dropdown__list a.fr-sidemenu__link:focus{outline-offset:-1px}ul.dsfrx-menu-dropdown__list .dsfrx-menu-item{padding:.5rem 1rem;box-shadow:none;width:100%}ul.dsfrx-menu-dropdown__list .dsfrx-menu-item:focus{outline-offset:-1px}ul.dsfrx-menu-dropdown__list li[role=separator]{border-bottom:1px solid #d0d0d1}\n"] }]
}], ctorParameters: () => [], propDecorators: { labelMenu: [{
type: Input
}], ariaLabelMenu: [{
type: Input
}], menuId: [{
type: Input
}], iconMenu: [{
type: Input
}], size: [{
type: Input
}], disabled: [{
type: Input
}], closeOnAction: [{
type: Input
}], buttonSelect: [{
type: Output
}], linkSelect: [{
type: Output
}], hideGroupSeparator: [{
type: Input
}], appendTo: [{
type: Input
}], zIndex: [{
type: Input
}], contentTemplate: [{
type: ContentChild,
args: ['contentTemplate', { static: true }]
}], menus: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd25tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWV4dC9zcmMvbGliL2Ryb3Bkb3dubWVudS9kcm9wZG93bm1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L3NyYy9saWIvZHJvcGRvd25tZW51L2Ryb3Bkb3dubWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLGVBQWUsRUFFZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLGdCQUFnQixFQUFZLGNBQWMsRUFBWSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7O0FBeUN4RixNQUFNLE9BQU8seUJBQXlCO0lBOERwQztRQWpEQSw4REFBOEQ7UUFDckQsU0FBSSxHQUFhLElBQUksQ0FBQztRQUsvQix3REFBd0Q7UUFDL0Msa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFFeEMsc0NB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QWE7c0JBQXJCLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUdHLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0Usa0JBQWtCO3NCQUExQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUc2QyxlQUFlO3NCQUFqRSxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpQzdDLEtBQUs7c0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBhZnRlck5leHRSZW5kZXIsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBDb250ZW50Q2hpbGQsXG4gIGNvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIHNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIHZpZXdDaGlsZCxcbiAgdmlld0NoaWxkcmVuLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEc2ZyQnV0dG9uLCBEc2ZyQnV0dG9uTW9kdWxlLCBEc2ZyTGluaywgRHNmckxpbmtNb2R1bGUsIERzZnJTaXplLCBuZXdVbmlxdWVJZCB9IGZyb20gJ0BlZHVnb3V2ZnIvbmd4LWRzZnInO1xuaW1wb3J0IHsgRWR1Q2xpY2tPdXRzaWRlRGlyZWN0aXZlIH0gZnJvbSAnLi4vc2hhcmVkJztcbmltcG9ydCB7IERzZnJEcm9wZG93blBvc2l0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vc2hhcmVkL2NvbXBvbmVudHMvZHJvcGRvd24tY29udGFpbmVyL2Ryb3Bkb3duLXBvc2l0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEcm9wZG93blV0aWxzIH0gZnJvbSAnLi4vc2hhcmVkL2NvbXBvbmVudHMvZHJvcGRvd24tY29udGFpbmVyL2Ryb3Bkb3duLnV0aWxzJztcbmltcG9ydCB7IERzZnJEcm9wZG93bk1lbnVHcm91cENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50L2Ryb3Bkb3dubWVudS1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHNmckRyb3Bkb3duTWVudUl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudC9kcm9wZG93bm1lbnUtaXRlbS5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERzZnJNZW51QnV0dG9uXG4gIGV4dGVuZHMgT21pdDxEc2ZyQnV0dG9uLCAnc2l6ZScgfCAndmFyaWFudCcgfCAnaWNvblBvc2l0aW9uJyB8ICdsb2FkZXInIHwgJ2ludmVydGVkT3V0bGluZUNvbnRyYXN0Jz4ge1xuICAvKiogQWN0aW9uIGFwcGVsw6llIGxvcnMgZHUgJ2NsaWNrJyBzdXIgbGUgYm91dG9uLiAqL1xuICBjYWxsYmFjaz86ICgpID0+IHZvaWQ7XG59XG5cbi8qKiBEw6lmaW5pdGlvbiBkZXMgaW50ZXJmYWNlcyBpbnRlcm5lcyBwb3VyIGNyw6llciBsZSB2aWV3IG1vZGVsIGRlIERzZnJEcm9wZG93bk1lbnVJdGVtICovXG5pbnRlcmZhY2UgTWVudUJ1dHRvblZpZXdNb2RlbCBleHRlbmRzIERzZnJNZW51QnV0dG9uIHtcbiAgbWVudVR5cGU6ICdidXR0b24nIHwgJ2xpbmsnIHwgJ2dyb3VwJztcbn1cbmludGVyZmFjZSBNZW51TGlua1ZpZXdNb2RlbCBleHRlbmRzIERzZnJNZW51QnV0dG9uIHtcbiAgbWVudVR5cGU6ICdidXR0b24nIHwgJ2xpbmsnIHwgJ2dyb3VwJztcbn1cblxuaW50ZXJmYWNlIE1lbnVHcm91cFZpZXdNb2RlbCB7XG4gIG1lbnVUeXBlOiAnYnV0dG9uJyB8ICdsaW5rJyB8ICdncm91cCc7XG4gIGl0ZW1zOiBNZW51QnV0dG9uVmlld01vZGVsW10gfCBNZW51TGlua1ZpZXdNb2RlbFtdO1xufVxuXG4vKiogQWxpYXMgcG91ciBsZSB0eXBlIGQnZW50csOpZSBkZSBtZW51ICovXG5leHBvcnQgdHlwZSBEc2ZyRHJvcGRvd25NZW51SXRlbSA9IChEc2ZyTWVudUJ1dHRvbiB8IERzZnJMaW5rIHwgKERzZnJNZW51QnV0dG9uIHwgRHNmckxpbmspW10pW107XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZXh0LWRyb3Bkb3dubWVudSwgZHNmcngtZHJvcGRvd25tZW51JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBEc2ZyQnV0dG9uTW9kdWxlLFxuICAgIERzZnJMaW5rTW9kdWxlLFxuICAgIEVkdUNsaWNrT3V0c2lkZURpcmVjdGl2ZSxcbiAgICBEc2ZyRHJvcGRvd25NZW51SXRlbUNvbXBvbmVudCxcbiAgICBEc2ZyRHJvcGRvd25NZW51R3JvdXBDb21wb25lbnQsXG4gICAgRHNmckRyb3Bkb3duUG9zaXRpb25EaXJlY3RpdmUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bm1lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi4vc2hhcmVkL2NvbXBvbmVudHMvZHJvcGRvd24tYnV0dG9uL2Ryb3Bkb3duLWJ1dHRvbi5jb21wb25lbnQuc2NzcycsICcuL2Ryb3Bkb3dubWVudS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRHNmckRyb3Bkb3duTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKiBMaWJlbGzDqSBkdSBib3V0b24gZHUgbWVudSBkw6lyb3VsYW50ICovXG4gIEBJbnB1dCgpIGxhYmVsTWVudTogc3RyaW5nO1xuXG4gIC8qKiBBdHRyaWJ1dCBhcmlhLWxhYmVsIGR1IGJvdXRvbiBkdSBtZW51IGTDqXJvdWxhbnQgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsTWVudTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBJZGVudGlmaWFudCBkdSBib3V0b24gZHUgbWVudSBkw6lyb3VsYW50IChnw6luw6lyw6kgc2kgbm9uIHJlbnNlaWduw6kpICovXG4gIEBJbnB1dCgpIG1lbnVJZDogc3RyaW5nO1xuXG4gIC8qKiBJY8O0bmUgb3B0aW9ubmVsbGUgZHUgbWVudSBkw6lyb3VsYW50ICAqL1xuICBASW5wdXQoKSBpY29uTWVudTogc3RyaW5nO1xuXG4gIC8qKiBUYWlsbGUgZHUgbWVudSBkw6lyb3VsYW50IChTTSwgTUQgb3UgTEcpLiBNRCBwYXIgZMOpZmF1dC4gKi9cbiAgQElucHV0KCkgc2l6ZTogRHNmclNpemUgPSAnTUQnO1xuXG4gIC8qKiBEw6lzYWN0aXZlciBsZSBtZW51ICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuXG4gIC8qKiBGZXJtZXIgbGUgbWVudSBhcHLDqHMgdW4gY2xpYyBzdXIgYm91dG9uIG91IGxpZW4uICAqL1xuICBASW5wdXQoKSBjbG9zZU9uQWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEV2w6huZW1lbnQgc8OpbGVjdGlvbiBkJ3VuIGJvdXRvbiAqL1xuICBAT3V0cHV0KCkgYnV0dG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8RHNmckJ1dHRvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqIEV2w6huZW1lbnQgc8OpbGVjdGlvbiBkJ3VuIGxpZW4gKi9cbiAgQE91dHB1dCgpIGxpbmtTZWxlY3Q6IEV2ZW50RW1pdHRlcjxEc2ZyTGluaz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqIENhY2hlciBsZXMgc8OpcGFyYXRldXJzIGRlIGdyb3VwZSAoZGFucyBsZSBjYXMgZCd1dGlsaXNhdGlvbiBkZSBtZW51cykgKi9cbiAgQElucHV0KCkgaGlkZUdyb3VwU2VwYXJhdG9yOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEF0dGFjaGVyIGwnw6lsw6ltZW50IGRlIGxpc3RlIGTDqXJvdWxhbnRlIGF1ICdib2R5JyBvdSBhIHVuIGNvbnRhaW5lciAocsOpZi4gdmVycyB1biDDqWzDqW1lbnQgI2RpdiBvdSBub20gZGUgbGEgY2xhc3NlIGR1IHBhcmVudCkgKi9cbiAgQElucHV0KCkgYXBwZW5kVG86ICdib2R5JyB8IEhUTUxFbGVtZW50IHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpcXVlIGxhIHZhbGV1ciBkZSBsYSBwcm9wcmnDqXTDqSBjc3Mgei1pbmRleCBkZSBsYSBtb2RhbGUgZHUgY29tcG9zYW50LlxuICAgKi9cbiAgQElucHV0KCkgekluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqIENvbnRlbnUgcGVyc29ubmFsaXPDqSBkdSBtZW51ICovXG4gIEBDb250ZW50Q2hpbGQoJ2NvbnRlbnRUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKipAaW50ZXJuYWwgKi9cbiAgYnRuTWVudVJlZiA9IHZpZXdDaGlsZCgnYnRuTWVudScsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICAvKipAaW50ZXJuYWwgKi9cbiAgZHJvcGRvd25XaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5idG5NZW51UmVmKCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBtZW51c1ZpZXc6IChNZW51QnV0dG9uVmlld01vZGVsIHwgTWVudUxpbmtWaWV3TW9kZWwgfCBNZW51R3JvdXBWaWV3TW9kZWwpW10gPSBbXTtcbiAgcHJvdGVjdGVkIGlzT3BlbiA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJvdGVjdGVkIGl0ZW1zQyA9IGNvbnRlbnRDaGlsZHJlbihEc2ZyRHJvcGRvd25NZW51SXRlbUNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KTsgLy8gc2xvdFxuICBwcm90ZWN0ZWQgaXRlbXNWID0gdmlld0NoaWxkcmVuKERzZnJEcm9wZG93bk1lbnVJdGVtQ29tcG9uZW50KTsgLy8gaW50ZXJuZVxuXG4gIC8qKiBFbGVtZW50IGF1cXVlbCBsYSBsaXN0ZSBlc3QgYXR0YWNow6llIHByb2dyYW1tYXRpcXVlbWVudCBzaSBhcHBlbmRUbyBkw6lmaW5pICovXG4gIHByb3RlY3RlZCBjb250YWluZXJUb0F0dGFjaDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBmb2N1c2VkRWxlbWVudDogYW55OyAvLyDDqWzDqW1lbnQgZGUgbGEgbGlzdGUgcG9zc8OpZGFudCBsZSBmb2N1c1xuICBwcml2YXRlIGluZGV4Rm9jdXNlZEVsZW1lbnQ6IG51bWJlciA9IC0xO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFJlY2hlcmNoZSBkdSBjb250YWluZXIgcGFyZW50IGFwcmVzIGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlIGR1IERPTSAoPSBhZnRlclZpZXdJbml0IG5vbiBzdWZmaXNhbnQpXG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmFwcGVuZFRvICYmIHRoaXMuYnRuTWVudVJlZigpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyVG9BdHRhY2ggPSBEcm9wZG93blV0aWxzLnNldFBhcmVudENvbnRhaW5lcih0aGlzLmFwcGVuZFRvLCB0aGlzLmJ0bk1lbnVSZWYoKT8ubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogSXRlbXMgZGUgbWVudSwgbGllbnMsIGJvdXRvbnMgb3UgZ3JvdXBlIGRlIGxpZW5zIG91IGJvdXRvbnMgKi9cbiAgQElucHV0KClcbiAgc2V0IG1lbnVzKHZhbHVlOiBEc2ZyRHJvcGRvd25NZW51SXRlbSkge1xuICAgIHRoaXMubWVudXNWaWV3ID0gW107XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5tZW51c1ZpZXcgPSB2YWx1ZS5tYXAoKG0pID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobSkpIHtcbiAgICAgICAgICAvLyBUeXBlIGdyb3VwZVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZW51VHlwZTogJ2dyb3VwJyxcbiAgICAgICAgICAgIGl0ZW1zOiBtLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoKGl0ZW0gYXMgRHNmckxpbmspLmxpbmsgfHwgKGl0ZW0gYXMgRHNmckxpbmspLnJvdXRlIHx8IChpdGVtIGFzIERzZnJMaW5rKS5yb3V0ZXJMaW5rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWVudVR5cGU6ICdsaW5rJywgLi4uaXRlbSB9IGFzIE1lbnVMaW5rVmlld01vZGVsOyAvLyBUeXBlIGxpZW5cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtZW51VHlwZTogJ2J1dHRvbicsIC4uLml0ZW0gfSBhcyBNZW51QnV0dG9uVmlld01vZGVsOyAvLyBUeXBlIGJvdXRvblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9IGFzIE1lbnVHcm91cFZpZXdNb2RlbDtcbiAgICAgICAgfSBlbHNlIGlmICgobSBhcyBEc2ZyTGluaykubGluayB8fCAobSBhcyBEc2ZyTGluaykucm91dGUgfHwgKG0gYXMgRHNmckxpbmspLnJvdXRlckxpbmspIHtcbiAgICAgICAgICByZXR1cm4geyBtZW51VHlwZTogJ2xpbmsnLCAuLi5tIH0gYXMgTWVudUxpbmtWaWV3TW9kZWw7IC8vIFR5cGUgbGllblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IG1lbnVUeXBlOiAnYnV0dG9uJywgLi4ubSB9IGFzIE1lbnVCdXR0b25WaWV3TW9kZWw7IC8vIFR5cGUgYm91dG9uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVJZCA/Pz0gbmV3VW5pcXVlSWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRyb3Bkb3duQXR0YWNoZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRJbml0aWFsRm9jdXNPbkxpc3QoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVNZW51KCkge1xuICAgIHRoaXMuaXNPcGVuLnNldCghdGhpcy5pc09wZW4oKSk7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMuaW5kZXhGb2N1c2VkRWxlbWVudCA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogRHNmck1lbnVCdXR0b24pOiB2b2lkIHtcbiAgICBpZiAoYnV0dG9uLmNhbGxiYWNrKSB7XG4gICAgICBidXR0b24uY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbG9zZU9uQWN0aW9uKSB7XG4gICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuYnV0dG9uU2VsZWN0LmVtaXQoYnV0dG9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsaWNrT3V0c2lkZSgpIHtcbiAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTGlua1NlbGVjdChsaW5rOiBEc2ZyTGluayk6IHZvaWQge1xuICAgIGlmIChsaW5rLnJvdXRlKSB7XG4gICAgICB0aGlzLmxpbmtTZWxlY3QuZW1pdChsaW5rKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VPbkFjdGlvbikge1xuICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VzdGlvbiBkZXMgaW50ZXJhY3Rpb25zIGNsYXZpZXIgc3VyIGxhIGxpc3RlXG4gICAqIC0gcG9zaXRpb25uZW1lbnQgZHUgZm9jdXMgc3VyIGxlcyDDqWzDqW1lbnRzIHByw6ljw6lkZW50cy9zdWl2YW50cyDDoCBsYSBuYXZpZ2F0aW9uIGZsw6hjaGVzXG4gICAqIC0gZmVybWV0dXJlIGRlIGxhIGxpc3RlIHN1ciBsZXMgdG91Y2hlcyBkw6lmaW5pZXMsIGV0IHJlcG9zaXRvbm5lbWVudCBkdSBmb2N1cyBzdXIgbGUgYm91dG9uIGQnb3V2ZXJ0dXJlXG4gICAqIEBwYXJhbSBldmVudCBrZXlib2FyZCBldmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvS2V5RXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgdGhpcy5mb2N1c1RvRWxlbWVudCgxKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICB0aGlzLmZvY3VzVG9FbGVtZW50KC0xKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICB0aGlzLmVtaXRLZXlFdmVudEVsZW1lbnQoZXZlbnQsIHRydWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICB0aGlzLmVtaXRLZXlFdmVudEVsZW1lbnQoZXZlbnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VPbkFjdGlvbikge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5jbG9zZU1lbnVBbmRGb2N1c0J1dHRvbigpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VNZW51QW5kRm9jdXNCdXR0b24oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZU1lbnVBbmRGb2N1c0J1dHRvbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuYnRuTWVudVJlZigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKiogRm9jdXMgc3VyIGxlIHByZW1pZXIgw6lsw6ltZW50IGRlIGxhIGxpc3RlIMOgIGwnb3V2ZXJ0dXJlIGRlIGNlbGxlLWNpICovXG4gIHByaXZhdGUgc2V0SW5pdGlhbEZvY3VzT25MaXN0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNlZEVsZW1lbnQgPSB0aGlzLml0ZW1zVigpLmxlbmd0aCA+IDAgPyB0aGlzLml0ZW1zVigpWzBdLl9hbmNob3JFbGVtZW50IDogdGhpcy5pdGVtc0MoKVswXT8uX2FuY2hvckVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkRWxlbWVudCkge1xuICAgICAgdGhpcy5mb2N1c2VkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJzAnKTtcbiAgICAgIHRoaXMuZm9jdXNlZEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIHRoaXMuaW5kZXhGb2N1c2VkRWxlbWVudCA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpIGVudHLDqWUgZXN0IHByZXNzw6kgLyBvdSBlc3BhY2UgZXQgcXVlIGwnw6lsw6ltZW50IGRlIGxpc3RlIGVzdCBkZSB0eXBlICdjaGVja2JveCcgb3UgJ3JhZGlvJ1xuICAgKiBFbnZvaSBkZSBsJ2V2ZW5lbWVudCBzZWxlY3RJdGVtXG4gICAqL1xuICBwcml2YXRlIGVtaXRLZXlFdmVudEVsZW1lbnQoZXZlbnQ6IEV2ZW50LCBvbmx5U2VsZWN0aW9uOiBib29sZWFuKSB7XG4gICAgaWYgKCFvbmx5U2VsZWN0aW9uIHx8ICh0aGlzLmZvY3VzZWRFbGVtZW50ICYmIHRoaXMuZm9jdXNlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnKSkpIHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMuaXRlbXNDKCksIC4uLnRoaXMuaXRlbXNWKCldO1xuICAgICAgaXRlbXNbdGhpcy5pbmRleEZvY3VzZWRFbGVtZW50XS5zZWxlY3RJdGVtPy5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzVG9FbGVtZW50KGRpcmVjdGlvbjogbnVtYmVyKSB7XG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5pdGVtc0MoKSwgLi4udGhpcy5pdGVtc1YoKV07XG4gICAgY29uc3QgdG90YWxJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5pbmRleEZvY3VzZWRFbGVtZW50ICsgZGlyZWN0aW9uO1xuXG4gICAgaWYgKG5leHRJbmRleCA+PSB0b3RhbEl0ZW1zKSB7XG4gICAgICBuZXh0SW5kZXggPSAwO1xuICAgIH0gZWxzZSBpZiAobmV4dEluZGV4IDwgMCkge1xuICAgICAgbmV4dEluZGV4ID0gdG90YWxJdGVtcyAtIDE7XG4gICAgfVxuXG4gICAgdGhpcy5pbmRleEZvY3VzZWRFbGVtZW50ID0gbmV4dEluZGV4O1xuICAgIHRoaXMuc2V0Rm9jdXNFbGVtZW50KGl0ZW1zW25leHRJbmRleF0uX2FuY2hvckVsZW1lbnQpO1xuICB9XG5cbiAgLyoqIEdlc3Rpb24gZGVzIHRhYmluZGV4IHBvdXIgbGUgZm9jdXMgc3VyIGxlIG5vdXZlbCDDqWzDqW1lbnQgZGUgbGEgbGlzdGUgKi9cbiAgcHJpdmF0ZSBzZXRGb2N1c0VsZW1lbnQobmV3RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLmZvY3VzZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnLTEnKTtcbiAgICB0aGlzLmZvY3VzZWRFbGVtZW50ID0gbmV3RWxlbWVudDtcbiAgICB0aGlzLmZvY3VzZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnMCcpO1xuICAgIHRoaXMuZm9jdXNlZEVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGlja091dHNpZGUgZGF0YS1leHBhbmRlZD1cInRydWVcIiBjbGFzcz1cImRzZnJ4LW1lbnUtZHJvcGRvd25cIiAoY2xpY2tPdXRzaWRlRXZlbnQpPVwib25DbGlja091dHNpZGUoKVwiPlxuICA8IS0tIGFqb3V0ZXIgYXJpYUxhYmVsID8tLT5cbiAgPGJ1dHRvblxuICAgICNidG5NZW51XG4gICAgW2lkXT1cIm1lbnVJZFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJkc2ZyeC1tZW51LWRyb3Bkb3duX19idG4gZnItYnRuLS10ZXJ0aWFyeSBmci1idG5cIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICdmci1idG4tLXNtJzogc2l6ZSA9PT0gJ1NNJyxcbiAgICAgICdmci1idG4tLWxnJzogc2l6ZSA9PT0gJ0xHJyxcbiAgICAgICdmci1idG4tLWljb24tbGVmdCc6ICEhaWNvbk1lbnVcbiAgICB9XCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJ0cnVlXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIm1lbnVJZCArICctbWVudSdcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsTWVudSA/PyBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgpXCI+XG4gICAge3sgbGFiZWxNZW51IH19XG4gIDwvYnV0dG9uPlxuXG4gIEBpZiAoaXNPcGVuKCkpIHtcbiAgICA8dWxcbiAgICAgIGRzZnJ4RHJvcGRvd25cbiAgICAgIFthdXRvV2lkdGhdPVwidHJ1ZVwiXG4gICAgICBbbmdTdHlsZV09XCJ7ICd6LWluZGV4JzogekluZGV4IH1cIlxuICAgICAgW2NvbWJvQm94XT1cImJ0bk1lbnVSZWYoKT8ubmF0aXZlRWxlbWVudFwiXG4gICAgICBbcGFyZW50Q29udGFpbmVyXT1cImNvbnRhaW5lc