@edugouvfr/ngx-dsfr
Version:
NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).
180 lines • 27.6 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { DsfrTagModeConst } from './tag.model';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
import * as i3 from "../link/link.component";
export class DsfrTagComponent {
/** @internal */
constructor(i18n) {
this.i18n = i18n;
/** État d'un tag 'selectable'. */
// 1.3 Non automatiquement modifié lorsque l'état du bouton 'aria-pressed' change, 'aria-pressed' est géré
// le JavaScript du DSFR, d'où la gestion de l'événement '(click)' pour synchroniser 'selected' et 'aria-pressed'.
this.selected = false;
/** Taille du tag (small ou médium). */
this.small = false;
/**
* Événement émis suite au click sur un tag, le contenu de l'événement est soit le lien, la route ou à défaut le label du tag.
* @since 1.4.0, si l'id du tag est renseigné, l'événement émet un objet de type DsfrTagEvent.
*/
this.tagSelect = new EventEmitter();
}
get mode() {
if (!this._mode) {
if (this.selected)
this._mode = DsfrTagModeConst.SELECTABLE;
else if (this.link || this.route || this.routePath)
this._mode = DsfrTagModeConst.CLICKABLE;
}
return this._mode;
}
/** Mode spécifique : default / selectable / clickable / deletable (les modes exclusifs entre eux). */
set mode(value) {
this._mode = value;
}
/**
* @deprecated (@since 1.5) utiliser tagId.
* Attention en cas d'utilisation de cet attribut, il doit être utilisé en tant que propriété et non en attribut,
* ex. [id]="'monid'"
*/
set id(value) {
if (value) {
this._id = value;
this.tagId ??= this._id;
}
}
/**
* @deprecated (@since 1.11.5) utiliser `routePath` à la place.
* routerLink provoque un bug accessibilité sur la navigation au clavier (ajout d'un tabindex=0)
**/
set routerLink(value) {
if (value)
this.routePath = value;
}
ngOnChanges({ selected }) {
// On ne se préoccupe pas trop du mode qui à l'initialisation est 'default' (comme ça chacun porte ses responsabilités)
if (selected) {
// On synchronise l'attribut 'aria-pressed' avec la nouvelle valeur de selected
this.ariaPressed = this.selected || false; // || false au cas où on reçoit undefined ou null
// On n'émet pas d'événement
}
}
/**
* Valeur pour le 'href' dans le template.
* @internal
*/
getHrefValue() {
return this.route || this.link;
}
/**
* Tag `selectable` : événement `tagSelect()` avec le contenu de du lien ou à défaut son label.
* @internal
*/
onSelectable() {
this.selected = !this.selected; // @since 1.3.2
this.emitTagSelect(this.getHrefValue() || this.label);
}
/**
* Événement (click) sur un lien.
* @internal
*/
onClickable(event) {
if (this.route) {
event.preventDefault();
this.emitTagSelect(this.route);
}
}
/**
* Tag `selectable` : événement `tagSelect()` avec le contenu de `link` ou à défaut son `label`.
* @internal
*/
onDeletable() {
this.emitTagSelect(this.getHrefValue() || this.label);
}
/** @internal */
getSelectableClasses() {
return this.getDefaultClasses();
}
/** @internal */
getClickableClasses() {
const classes = this.getDefaultClasses();
if (this.customClass)
classes.push(this.customClass);
return classes.join(' ');
}
/** @internal */
getNotClickableClasses() {
return this.getDefaultClasses();
}
/** @since 1.4.0 Emission de DsfrTagEvent */
emitTagSelect(value) {
if (!this.tagId)
this.tagSelect.emit(value);
else {
this.tagSelect.emit({
id: this.tagId,
label: this.label,
link: this.link,
route: this.route,
selected: this.selected,
});
}
}
getDefaultClasses() {
const classes = ['fr-tag'];
if (this.small)
classes.push('fr-tag--sm');
if (this.icon) {
classes.push('fr-tag--icon-left');
classes.push(this.icon);
}
// Un tag non cliquable ne peut pas avoir de custom class
return classes;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrTagComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrTagComponent, selector: "dsfr-tag", inputs: { tagId: "tagId", customClass: "customClass", disabled: "disabled", icon: "icon", label: "label", link: "link", linkTarget: "linkTarget", route: "route", routePath: "routePath", routerLinkActive: "routerLinkActive", routerLinkExtras: "routerLinkExtras", selected: "selected", small: "small", tooltipMessage: "tooltipMessage", ariaLabel: "ariaLabel", mode: "mode", id: "id", routerLink: "routerLink" }, outputs: { tagSelect: "tagSelect" }, usesOnChanges: true, ngImport: i0, template: "<ng-container [ngSwitch]=\"mode\">\n <!-- Tag supprimable -->\n <ng-container *ngSwitchCase=\"'deletable'\">\n <button\n type=\"button\"\n [attr.id]=\"tagId || null\"\n [ngClass]=\"{\n 'fr-tag fr-tag--dismiss': true,\n 'fr-tag--sm': small\n }\"\n [attr.title]=\"tooltipMessage || null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : i18n.t('tag.removeFilter') + ' ' + label\"\n [disabled]=\"disabled || null\"\n (click)=\"onDeletable()\">\n {{ label }}\n </button>\n </ng-container>\n\n <!-- Tag s\u00E9lectionnable -->\n <ng-container *ngSwitchCase=\"'selectable'\">\n <button\n type=\"button\"\n [attr.id]=\"tagId || null\"\n [ngClass]=\"getSelectableClasses()\"\n [attr.class]=\"icon || null\"\n [attr.title]=\"tooltipMessage || null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : i18n.t('tag.selectFilter') + ' ' + label\"\n [attr.aria-pressed]=\"ariaPressed\"\n (click)=\"onSelectable()\"\n [disabled]=\"disabled || null\">\n {{ label }}\n </button>\n </ng-container>\n\n <!-- Tag cliquable -->\n <ng-container *ngSwitchCase=\"'clickable'\">\n <dsfr-link\n [linkId]=\"tagId\"\n [customClass]=\"getClickableClasses()\"\n [tooltipMessage]=\"tooltipMessage\"\n [ariaLabel]=\"ariaLabel ? ariaLabel : label\"\n (click)=\"onClickable($event)\"\n [link]=\"link\"\n [targetLink]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n [label]=\"label\"></dsfr-link>\n </ng-container>\n\n <!-- Tag non cliquable -->\n <ng-container *ngSwitchDefault>\n <p [attr.id]=\"tagId || null\" [ngClass]=\"getNotClickableClasses()\" [attr.title]=\"tooltipMessage || null\">\n {{ label }}\n </p>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.DsfrLinkComponent, selector: "dsfr-link", inputs: ["ariaCurrent", "ariaLabel", "ariaControls", "customClass", "disabled", "icon", "iconPosition", "linkId", "label", "link", "linkTarget", "route", "routePath", "routerLinkActive", "routerLinkActiveOptions", "routerLinkExtras", "size", "tooltipMessage", "mode", "targetLink", "routerLink"], outputs: ["linkSelect"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrTagComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-tag', encapsulation: ViewEncapsulation.None, template: "<ng-container [ngSwitch]=\"mode\">\n <!-- Tag supprimable -->\n <ng-container *ngSwitchCase=\"'deletable'\">\n <button\n type=\"button\"\n [attr.id]=\"tagId || null\"\n [ngClass]=\"{\n 'fr-tag fr-tag--dismiss': true,\n 'fr-tag--sm': small\n }\"\n [attr.title]=\"tooltipMessage || null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : i18n.t('tag.removeFilter') + ' ' + label\"\n [disabled]=\"disabled || null\"\n (click)=\"onDeletable()\">\n {{ label }}\n </button>\n </ng-container>\n\n <!-- Tag s\u00E9lectionnable -->\n <ng-container *ngSwitchCase=\"'selectable'\">\n <button\n type=\"button\"\n [attr.id]=\"tagId || null\"\n [ngClass]=\"getSelectableClasses()\"\n [attr.class]=\"icon || null\"\n [attr.title]=\"tooltipMessage || null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : i18n.t('tag.selectFilter') + ' ' + label\"\n [attr.aria-pressed]=\"ariaPressed\"\n (click)=\"onSelectable()\"\n [disabled]=\"disabled || null\">\n {{ label }}\n </button>\n </ng-container>\n\n <!-- Tag cliquable -->\n <ng-container *ngSwitchCase=\"'clickable'\">\n <dsfr-link\n [linkId]=\"tagId\"\n [customClass]=\"getClickableClasses()\"\n [tooltipMessage]=\"tooltipMessage\"\n [ariaLabel]=\"ariaLabel ? ariaLabel : label\"\n (click)=\"onClickable($event)\"\n [link]=\"link\"\n [targetLink]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n [label]=\"label\"></dsfr-link>\n </ng-container>\n\n <!-- Tag non cliquable -->\n <ng-container *ngSwitchDefault>\n <p [attr.id]=\"tagId || null\" [ngClass]=\"getNotClickableClasses()\" [attr.title]=\"tooltipMessage || null\">\n {{ label }}\n </p>\n </ng-container>\n</ng-container>\n" }]
}], ctorParameters: function () { return [{ type: i1.I18nService }]; }, propDecorators: { tagId: [{
type: Input
}], customClass: [{
type: Input
}], disabled: [{
type: Input
}], icon: [{
type: Input
}], label: [{
type: Input
}], link: [{
type: Input
}], linkTarget: [{
type: Input
}], route: [{
type: Input
}], routePath: [{
type: Input
}], routerLinkActive: [{
type: Input
}], routerLinkExtras: [{
type: Input
}], selected: [{
type: Input
}], small: [{
type: Input
}], tooltipMessage: [{
type: Input
}], ariaLabel: [{
type: Input
}], tagSelect: [{
type: Output
}], mode: [{
type: Input
}], id: [{
type: Input
}], routerLink: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RhZy90YWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdGFnL3RhZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdwSCxPQUFPLEVBQXNDLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQU9uRixNQUFNLE9BQU8sZ0JBQWdCO0lBbUUzQixnQkFBZ0I7SUFDaEIsWUFBbUIsSUFBaUI7UUFBakIsU0FBSSxHQUFKLElBQUksQ0FBYTtRQTVCcEMsa0NBQWtDO1FBQ2xDLDBHQUEwRztRQUMxRyxrSEFBa0g7UUFDekcsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQix1Q0FBdUM7UUFDOUIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQU92Qjs7O1dBR0c7UUFDTyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7SUFXekIsQ0FBQztJQUV4QyxJQUFJLElBQUk7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7aUJBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1NBQzdGO1FBQ0QsT0FB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Q0FBQyxRQUFRLENBQUMsQ0FBQztRQUVyQyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFDRCx5REFBeUQ7UUFFekQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzsrR0E5TFUsZ0JBQWdCO21HQUFoQixnQkFBZ0Isb2dCQ1Y3QixxNERBMERBOzs0RkRoRGEsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLFVBQVUsaUJBRUwsaUJBQWlCLENBQUMsSUFBSTtrR0FJNUIsS0FBSztzQkFBYixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQU1JLFNBQVM7c0JBQWxCLE1BQU07Z0JBc0JNLElBQUk7c0JBQWhCLEtBQUs7Z0JBU08sRUFBRTtzQkFBZCxLQUFLO2dCQVdPLFVBQVU7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkV4dHJhcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEc2ZyTGlua1RhcmdldCwgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRHNmclRhZywgRHNmclRhZ0V2ZW50LCBEc2ZyVGFnTW9kZSwgRHNmclRhZ01vZGVDb25zdCB9IGZyb20gJy4vdGFnLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci10YWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFnLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRHNmclRhZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9taXQ8RHNmclRhZywgJ3RpdGxlJz4sIE9uQ2hhbmdlcyB7XG4gIC8qKiBpZCBkdSB0YWcsIG9wdGlvbm5lbCAqL1xuICBASW5wdXQoKSB0YWdJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgcGVyc29ubmFsaXNlciBsYSBjb3VsZXVyIGR1IHRhZy4gSWwgZmF1dCBkb25uZXIgbGEgY2xhc3NlIGV4YWN0ZSAoZXggOiBgZnItdGFnLS1ncmVlbi1lbWVyYXVkZWApIHF1ZSB2b3VzIHRyb3V2ZXJlelxuICAgKiBbaWNpXShodHRwczovL2dvdXZmci5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL0RCL3BhZ2VzLzMxMDcwNjMwNS9UYWcjUGVyc29ubmFsaXNhdGlvbikuXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21DbGFzczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZCdhdm9pciB1biB0YWcgY2xpcXVhYmxlIGRpc2FibGVkLlxuICAgKiBAc2luY2UgMS4zXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKiogQ2xhc3NlIGRlIGwnaWPDtG5lIChjZi4gRFNGUiBUQUcpLiAqL1xuICBASW5wdXQoKSBpY29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIHVuZGVmaW5lZCBjYXIgcGV1dCBwcm92ZW5pciBkJ3VuIERzZnJUYWcuaWNvbiBkYW5zIGxlIGNhcyBkJ3VuIGdyb3VwZVxuXG4gIC8qKiBMaWJlbGxlIGR1IHRhZy4gKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcblxuICAvKiogTGllbiBocmVmIGV4dGVybmUsIGV4Y2x1c2lmIGF2ZWMgcm91dGUgZXQgcm91dGVQYXRoLiAqL1xuICBASW5wdXQoKSBsaW5rOiBzdHJpbmc7XG5cbiAgLyoqIFRhcmdldCBkdSBsaWVuLiBUYXJnZXQgcGFyIGTDqWZhdXQgZGUgbCdhcHBsaWNhdGlvbiBzaSBsYSBwcm9wcmnDqXTDqSBlc3Qgbm9uIHJlbnNlaWduw6llLiAqL1xuICBASW5wdXQoKSBsaW5rVGFyZ2V0OiBEc2ZyTGlua1RhcmdldDtcblxuICAvKiogUGF0aCBpbnRlcm5lLiBFeGNsdXNpZiBhdmVjIGxpbmsgZXQgcm91dGVQYXRoICovXG4gIEBJbnB1dCgpIHJvdXRlOiBzdHJpbmc7XG5cbiAgLyoqIFBhdGggYW5ndWxhciBnw6lyw6kgZW4gdGFudCBxdWUgZGlyZWN0aXZlIHJvdXRlckxpbmsuIEV4Y2x1c2lmIGF2ZWMgbGluayBldCByb3V0ZS4gKi9cbiAgQElucHV0KCkgcm91dGVQYXRoOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKiogUm91dGVyTGluayA6IGNsYXNzZSB1dGlsaXPDqWUgcG91ciBsYSBkaXJlY3RpdmUgcm91dGVyTGluayBhY3RpdmUuICovXG4gIEBJbnB1dCgpIHJvdXRlckxpbmtBY3RpdmU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBSb3V0ZXJMaW5rIDogdmFsZXVycyBhZGRpdGlvbm5lbGxlcyBkZSBuYXZpZ2F0aW9uIHBvdXIgbGUgcm91dGVyTGluayAocXVlcnlQYXJhbXMsIHN0YXRlIGV0Yy4pICovXG4gIEBJbnB1dCgpIHJvdXRlckxpbmtFeHRyYXM6IE5hdmlnYXRpb25FeHRyYXM7XG5cbiAgLyoqIMOJdGF0IGQndW4gdGFnICdzZWxlY3RhYmxlJy4gKi9cbiAgLy8gMS4zIE5vbiBhdXRvbWF0aXF1ZW1lbnQgbW9kaWZpw6kgbG9yc3F1ZSBsJ8OpdGF0IGR1IGJvdXRvbiAnYXJpYS1wcmVzc2VkJyBjaGFuZ2UsICdhcmlhLXByZXNzZWQnIGVzdCBnw6lyw6lcbiAgLy8gbGUgSmF2YVNjcmlwdCBkdSBEU0ZSLCBkJ2/DuSBsYSBnZXN0aW9uIGRlIGwnw6l2w6luZW1lbnQgJyhjbGljayknIHBvdXIgc3luY2hyb25pc2VyICdzZWxlY3RlZCcgZXQgJ2FyaWEtcHJlc3NlZCcuXG4gIEBJbnB1dCgpIHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgLyoqIFRhaWxsZSBkdSB0YWcgKHNtYWxsIG91IG3DqWRpdW0pLiAqL1xuICBASW5wdXQoKSBzbWFsbCA9IGZhbHNlO1xuXG4gIC8qKiBEb25uZSBsJ2F0dHJpYnV0IHRpdGxlIHBvdXIgbGVzIGxpZW5zLiAqL1xuICBASW5wdXQoKSB0b29sdGlwTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGFyaWFMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiDDiXbDqW5lbWVudCDDqW1pcyBzdWl0ZSBhdSBjbGljayBzdXIgdW4gdGFnLCBsZSBjb250ZW51IGRlIGwnw6l2w6luZW1lbnQgZXN0IHNvaXQgbGUgbGllbiwgbGEgcm91dGUgb3Ugw6AgZMOpZmF1dCBsZSBsYWJlbCBkdSB0YWcuXG4gICAqIEBzaW5jZSAxLjQuMCwgc2kgbCdpZCBkdSB0YWcgZXN0IHJlbnNlaWduw6ksIGwnw6l2w6luZW1lbnQgw6ltZXQgdW4gb2JqZXQgZGUgdHlwZSBEc2ZyVGFnRXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KCkgdGFnU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBEc2ZyVGFnRXZlbnQ+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhcmlhUHJlc3NlZDogYm9vbGVhbjtcblxuICAvKiogTW9kZSBzcMOpY2lmaXF1ZSA6IGRlZmF1bHQgLyBzZWxlY3RhYmxlIC8gY2xpY2thYmxlIC8gZGVsZXRhYmxlIChsZXMgbW9kZXMgZXhjbHVzaWZzIGVudHJlIGV1eCkuICovXG4gIHByaXZhdGUgX21vZGU6IERzZnJUYWdNb2RlO1xuXG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaTE4bjogSTE4blNlcnZpY2UpIHt9XG5cbiAgZ2V0IG1vZGUoKTogRHNmclRhZ01vZGUge1xuICAgIGlmICghdGhpcy5fbW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHRoaXMuX21vZGUgPSBEc2ZyVGFnTW9kZUNvbnN0LlNFTEVDVEFCTEU7XG4gICAgICBlbHNlIGlmICh0aGlzLmxpbmsgfHwgdGhpcy5yb3V0ZSB8fCB0aGlzLnJvdXRlUGF0aCkgdGhpcy5fbW9kZSA9IERzZnJUYWdNb2RlQ29uc3QuQ0xJQ0tBQkxFO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIC8qKiBNb2RlIHNww6ljaWZpcXVlIDogZGVmYXVsdCAvIHNlbGVjdGFibGUgLyBjbGlja2FibGUgLyBkZWxldGFibGUgKGxlcyBtb2RlcyBleGNsdXNpZnMgZW50cmUgZXV4KS4gKi9cbiAgQElucHV0KCkgc2V0IG1vZGUodmFsdWU6IERzZnJUYWdNb2RlKSB7XG4gICAgdGhpcy5fbW9kZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIChAc2luY2UgMS41KSB1dGlsaXNlciB0YWdJZC5cbiAgICogQXR0ZW50aW9uIGVuIGNhcyBkJ3V0aWxpc2F0aW9uIGRlIGNldCBhdHRyaWJ1dCwgaWwgZG9pdCDDqnRyZSB1dGlsaXPDqSBlbiB0YW50IHF1ZSBwcm9wcmnDqXTDqSBldCBub24gZW4gYXR0cmlidXQsXG4gICAqIGV4LiBbaWRdPVwiJ21vbmlkJ1wiXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgICAgIHRoaXMudGFnSWQgPz89IHRoaXMuX2lkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAoQHNpbmNlIDEuMTEuNSkgdXRpbGlzZXIgYHJvdXRlUGF0aGAgw6AgbGEgcGxhY2UuXG4gICAqIHJvdXRlckxpbmsgcHJvdm9xdWUgdW4gYnVnIGFjY2Vzc2liaWxpdMOpIHN1ciBsYSBuYXZpZ2F0aW9uIGF1IGNsYXZpZXIgKGFqb3V0IGQndW4gdGFiaW5kZXg9MClcbiAgICoqL1xuICBASW5wdXQoKSBzZXQgcm91dGVyTGluayh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUpIHRoaXMucm91dGVQYXRoID0gdmFsdWU7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyh7IHNlbGVjdGVkIH06IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyBPbiBuZSBzZSBwcsOpb2NjdXBlIHBhcyB0cm9wIGR1IG1vZGUgcXVpIMOgIGwnaW5pdGlhbGlzYXRpb24gZXN0ICdkZWZhdWx0JyAoY29tbWUgw6dhIGNoYWN1biBwb3J0ZSBzZXMgcmVzcG9uc2FiaWxpdMOpcylcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIC8vIE9uIHN5bmNocm9uaXNlIGwnYXR0cmlidXQgJ2FyaWEtcHJlc3NlZCcgYXZlYyBsYSBub3V2ZWxsZSB2YWxldXIgZGUgc2VsZWN0ZWRcbiAgICAgIHRoaXMuYXJpYVByZXNzZWQgPSB0aGlzLnNlbGVjdGVkIHx8IGZhbHNlOyAvLyB8fCBmYWxzZSBhdSBjYXMgb8O5IG9uIHJlw6dvaXQgdW5kZWZpbmVkIG91IG51bGxcbiAgICAgIC8vIE9uIG4nw6ltZXQgcGFzIGQnw6l2w6luZW1lbnRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsZXVyIHBvdXIgbGUgJ2hyZWYnIGRhbnMgbGUgdGVtcGxhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0SHJlZlZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm91dGUgfHwgdGhpcy5saW5rO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhZyBgc2VsZWN0YWJsZWAgOiDDqXbDqW5lbWVudCBgdGFnU2VsZWN0KClgIGF2ZWMgbGUgY29udGVudSBkZSBkdSBsaWVuIG91IMOgIGTDqWZhdXQgc29uIGxhYmVsLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uU2VsZWN0YWJsZSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gIXRoaXMuc2VsZWN0ZWQ7IC8vIEBzaW5jZSAxLjMuMlxuICAgIHRoaXMuZW1pdFRhZ1NlbGVjdCh0aGlzLmdldEhyZWZWYWx1ZSgpIHx8IHRoaXMubGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIMOJdsOpbmVtZW50IChjbGljaykgc3VyIHVuIGxpZW4uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25DbGlja2FibGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMucm91dGUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmVtaXRUYWdTZWxlY3QodGhpcy5yb3V0ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRhZyBgc2VsZWN0YWJsZWAgOiDDqXbDqW5lbWVudCBgdGFnU2VsZWN0KClgIGF2ZWMgbGUgY29udGVudSBkZSBgbGlua2Agb3Ugw6AgZMOpZmF1dCBzb24gYGxhYmVsYC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbkRlbGV0YWJsZSgpIHtcbiAgICB0aGlzLmVtaXRUYWdTZWxlY3QodGhpcy5nZXRIcmVmVmFsdWUoKSB8fCB0aGlzLmxhYmVsKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U2VsZWN0YWJsZUNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRDbGFzc2VzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldENsaWNrYWJsZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc2VzID0gdGhpcy5nZXREZWZhdWx0Q2xhc3NlcygpO1xuICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzKSBjbGFzc2VzLnB1c2godGhpcy5jdXN0b21DbGFzcyk7XG4gICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXROb3RDbGlja2FibGVDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0Q2xhc3NlcygpO1xuICB9XG5cbiAgLyoqIEBzaW5jZSAxLjQuMCBFbWlzc2lvbiBkZSBEc2ZyVGFnRXZlbnQgKi9cbiAgcHJpdmF0ZSBlbWl0VGFnU2VsZWN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMudGFnSWQpIHRoaXMudGFnU2VsZWN0LmVtaXQodmFsdWUpO1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy50YWdTZWxlY3QuZW1pdCh7XG4gICAgICAgIGlkOiB0aGlzLnRhZ0lkLFxuICAgICAgICBsYWJlbDogdGhpcy5sYWJlbCxcbiAgICAgICAgbGluazogdGhpcy5saW5rLFxuICAgICAgICByb3V0ZTogdGhpcy5yb3V0ZSxcbiAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0ZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFsnZnItdGFnJ107XG5cbiAgICBpZiAodGhpcy5zbWFsbCkgY2xhc3Nlcy5wdXNoKCdmci10YWctLXNtJyk7XG4gICAgaWYgKHRoaXMuaWNvbikge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdmci10YWctLWljb24tbGVmdCcpO1xuICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuaWNvbik7XG4gICAgfVxuICAgIC8vIFVuIHRhZyBub24gY2xpcXVhYmxlIG5lIHBldXQgcGFzIGF2b2lyIGRlIGN1c3RvbSBjbGFzc1xuXG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIm1vZGVcIj5cbiAgPCEtLSBUYWcgc3VwcHJpbWFibGUgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkZWxldGFibGUnXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbYXR0ci5pZF09XCJ0YWdJZCB8fCBudWxsXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ2ZyLXRhZyBmci10YWctLWRpc21pc3MnOiB0cnVlLFxuICAgICAgICAnZnItdGFnLS1zbSc6IHNtYWxsXG4gICAgICB9XCJcbiAgICAgIFthdHRyLnRpdGxlXT1cInRvb2x0aXBNZXNzYWdlIHx8IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgPyBhcmlhTGFiZWwgOiBpMThuLnQoJ3RhZy5yZW1vdmVGaWx0ZXInKSArICcgJyArIGxhYmVsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBudWxsXCJcbiAgICAgIChjbGljayk9XCJvbkRlbGV0YWJsZSgpXCI+XG4gICAgICB7eyBsYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIFRhZyBzw6lsZWN0aW9ubmFibGUgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWxlY3RhYmxlJ1wiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuaWRdPVwidGFnSWQgfHwgbnVsbFwiXG4gICAgICBbbmdDbGFzc109XCJnZXRTZWxlY3RhYmxlQ2xhc3NlcygpXCJcbiAgICAgIFthdHRyLmNsYXNzXT1cImljb24gfHwgbnVsbFwiXG4gICAgICBbYXR0ci50aXRsZV09XCJ0b29sdGlwTWVzc2FnZSB8fCBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsID8gYXJpYUxhYmVsIDogaTE4bi50KCd0YWcuc2VsZWN0RmlsdGVyJykgKyAnICcgKyBsYWJlbFwiXG4gICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiYXJpYVByZXNzZWRcIlxuICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0YWJsZSgpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBudWxsXCI+XG4gICAgICB7eyBsYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIFRhZyBjbGlxdWFibGUgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjbGlja2FibGUnXCI+XG4gICAgPGRzZnItbGlua1xuICAgICAgW2xpbmtJZF09XCJ0YWdJZFwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiZ2V0Q2xpY2thYmxlQ2xhc3NlcygpXCJcbiAgICAgIFt0b29sdGlwTWVzc2FnZV09XCJ0b29sdGlwTWVzc2FnZVwiXG4gICAgICBbYXJpYUxhYmVsXT1cImFyaWFMYWJlbCA/IGFyaWFMYWJlbCA6IGxhYmVsXCJcbiAgICAgIChjbGljayk9XCJvbkNsaWNrYWJsZSgkZXZlbnQpXCJcbiAgICAgIFtsaW5rXT1cImxpbmtcIlxuICAgICAgW3RhcmdldExpbmtdPVwibGlua1RhcmdldFwiXG4gICAgICBbcm91dGVdPVwicm91dGVcIlxuICAgICAgW3JvdXRlUGF0aF09XCJyb3V0ZVBhdGhcIlxuICAgICAgW3JvdXRlckxpbmtBY3RpdmVdPVwicm91dGVyTGlua0FjdGl2ZSA/PyAnJ1wiXG4gICAgICBbcm91dGVyTGlua0V4dHJhc109XCJyb3V0ZXJMaW5rRXh0cmFzXCJcbiAgICAgIFtsYWJlbF09XCJsYWJlbFwiPjwvZHNmci1saW5rPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIFRhZyBub24gY2xpcXVhYmxlIC0tPlxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgPHAgW2F0dHIuaWRdPVwidGFnSWQgfHwgbnVsbFwiIFtuZ0NsYXNzXT1cImdldE5vdENsaWNrYWJsZUNsYXNzZXMoKVwiIFthdHRyLnRpdGxlXT1cInRvb2x0aXBNZXNzYWdlIHx8IG51bGxcIj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgPC9wPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19