UNPKG

@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
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