@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).
108 lines • 26 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { DsfrLinkComponent } from '../../components';
import { DefaultControlComponent, DsfrI18nPipe, DsfrSeverityConst, newUniqueId, } from '../../shared';
import { EduMessageSeverityDirective } from '../../shared/directives/message-severity.directive';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
export class DsfrFormPasswordComponent extends DefaultControlComponent {
/** @internal */
constructor() {
super();
/** @since 1.6 'current-password' par défaut */
this.autocomplete = 'current-password';
/**
* Cache le label visuellement en le laissant disponible aux lecteurs d'écran.
*/
this.labelSrOnly = false;
/**
* Indique si le champ est obligatoire ou non, faux par défaut.
*/
this.required = false;
/**
* Message d'information lié au composant
*/
this.message = undefined;
/** Propage l'évènement Event du DOM à la sélection d'un lien. */
this.recoveryRouteSelect = new EventEmitter();
this.DsfrSeverity = DsfrSeverityConst;
}
/** @internal */
ngOnInit() {
super.ngOnInit();
this.checkboxId = newUniqueId();
this.messagesGroupId = newUniqueId();
}
/** @internal */
getIdRule(rule, i) {
let status = 'info';
if (rule.onError === false) {
status = 'error';
}
else if (rule.onError === true) {
status = 'error';
}
return `password-${this.inputId}-input-message-${status}-${i}`;
}
/** @internal */
hasRecovery() {
return this.recoveryLink || this.recoveryRoute || this.recoveryRouterLink;
}
/** @internal */
onRecovery() {
if (this.recoveryRoute) {
this.recoveryRouteSelect.emit(this.recoveryRoute);
}
}
/** @internal */
hasMessages() {
return this.validationRules && this.validationRules.length > 0;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFormPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrFormPasswordComponent, isStandalone: true, selector: "dsfr-form-password", inputs: { autocomplete: "autocomplete", labelSrOnly: "labelSrOnly", required: "required", message: "message", messageSeverity: "messageSeverity", validationRules: "validationRules", recoveryLink: "recoveryLink", recoveryTargetLink: "recoveryTargetLink", recoveryRouterLink: "recoveryRouterLink", recoveryRouterLinkActive: "recoveryRouterLinkActive", recoveryRouterLinkExtras: "recoveryRouterLinkExtras", recoveryRoute: "recoveryRoute" }, outputs: { recoveryRouteSelect: "recoveryRouteSelect" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: DsfrFormPasswordComponent,
multi: true,
},
], usesInheritance: true, ngImport: i0, template: "<div class=\"fr-password\">\n <label\n class=\"fr-label\"\n [ngClass]=\"{\n 'fr-sr-only': labelSrOnly,\n 'fr-input-group--error': message && messageSeverity === DsfrSeverity.ERROR,\n 'fr-input-group--valid':\n message && (messageSeverity === DsfrSeverity.SUCCESS || messageSeverity === DsfrSeverity.VALID),\n 'fr-input-group--info': message && messageSeverity === DsfrSeverity.INFO,\n 'fr-input-group--warning': message && messageSeverity === DsfrSeverity.WARNING,\n }\"\n [for]=\"inputId\">\n @if (label) {\n {{ label }}\n } @else {\n <ng-content select=\"[label]\"></ng-content>\n }\n @if (hint) {\n <span class=\"fr-hint-text\">{{ hint }}</span>\n }\n </label>\n\n <div class=\"fr-input-wrap\">\n <input\n class=\"fr-password__input fr-input\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n [attr.aria-describedby]=\"hasMessages() ? messagesGroupId : null\"\n aria-required=\"true\"\n [required]=\"required\"\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [attr.name]=\"name || null\"\n [autocomplete]=\"autocomplete\"\n [id]=\"inputId\"\n type=\"password\" />\n </div>\n\n <div class=\"fr-messages-group\" [id]=\"messagesGroupId\" aria-live=\"polite\">\n <!-- prettier-ignore -->\n @if (message) {\n <p\n class=\"fr-message\"\n [eduMessageSeverity]=\"messageSeverity\"\n >{{ message }}</p>\n }\n\n @if (hasMessages()) {\n <p class=\"fr-message\">{{ 'password.message' | dsfrI18n }}</p>\n }\n @for (rule of validationRules; track rule; let i = $index) {\n <p\n class=\"fr-message\"\n [id]=\"getIdRule(rule, i)\"\n [ngClass]=\"{\n 'fr-message--error': rule.onError,\n 'fr-message--info': rule.onError === undefined,\n 'fr-message--valid': rule.onError === false,\n }\">\n {{ rule.message }}\n @if (rule.onError === true) {\n <span class=\"fr-sr-only\"> - {{ 'password.invalidCriteria' | dsfrI18n }}</span>\n } @else if (rule.onError === false) {\n <span class=\"fr-sr-only\"> - {{ 'password.validCriteria' | dsfrI18n }}</span>\n }\n </p>\n }\n </div>\n\n <div class=\"fr-password__checkbox fr-checkbox-group fr-checkbox-group--sm\">\n <input [attr.aria-label]=\"'password.aria.label' | dsfrI18n\" [id]=\"checkboxId\" type=\"checkbox\" />\n <!-- fr--password utilis\u00E9 sur la d\u00E9mo DSFR et permet de fixer le padding avec la checkbox mais illogique -->\n <label class=\"fr--password__checkbox fr-label\" [for]=\"checkboxId\">\n {{ 'password.show' | dsfrI18n }}\n </label>\n </div>\n\n @if (hasRecovery()) {\n <p>\n <dsfr-link\n [link]=\"recoveryLink\"\n [targetLink]=\"recoveryTargetLink\"\n [route]=\"recoveryRoute\"\n [routePath]=\"recoveryRouterLink\"\n [routerLinkActive]=\"recoveryRouterLinkActive ?? ''\"\n [routerLinkExtras]=\"recoveryRouterLinkExtras\"\n (linkSelect)=\"onRecovery()\"\n >{{ 'password.forgotPassword' | dsfrI18n }}</dsfr-link\n >\n </p>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: 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: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }, { kind: "directive", type: EduMessageSeverityDirective, selector: "[eduMessageSeverity]", inputs: ["eduMessageSeverity"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFormPasswordComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-form-password', encapsulation: ViewEncapsulation.None, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: DsfrFormPasswordComponent,
multi: true,
},
], standalone: true, imports: [CommonModule, FormsModule, DsfrLinkComponent, DsfrI18nPipe, EduMessageSeverityDirective], template: "<div class=\"fr-password\">\n <label\n class=\"fr-label\"\n [ngClass]=\"{\n 'fr-sr-only': labelSrOnly,\n 'fr-input-group--error': message && messageSeverity === DsfrSeverity.ERROR,\n 'fr-input-group--valid':\n message && (messageSeverity === DsfrSeverity.SUCCESS || messageSeverity === DsfrSeverity.VALID),\n 'fr-input-group--info': message && messageSeverity === DsfrSeverity.INFO,\n 'fr-input-group--warning': message && messageSeverity === DsfrSeverity.WARNING,\n }\"\n [for]=\"inputId\">\n @if (label) {\n {{ label }}\n } @else {\n <ng-content select=\"[label]\"></ng-content>\n }\n @if (hint) {\n <span class=\"fr-hint-text\">{{ hint }}</span>\n }\n </label>\n\n <div class=\"fr-input-wrap\">\n <input\n class=\"fr-password__input fr-input\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n [attr.aria-describedby]=\"hasMessages() ? messagesGroupId : null\"\n aria-required=\"true\"\n [required]=\"required\"\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [attr.name]=\"name || null\"\n [autocomplete]=\"autocomplete\"\n [id]=\"inputId\"\n type=\"password\" />\n </div>\n\n <div class=\"fr-messages-group\" [id]=\"messagesGroupId\" aria-live=\"polite\">\n <!-- prettier-ignore -->\n @if (message) {\n <p\n class=\"fr-message\"\n [eduMessageSeverity]=\"messageSeverity\"\n >{{ message }}</p>\n }\n\n @if (hasMessages()) {\n <p class=\"fr-message\">{{ 'password.message' | dsfrI18n }}</p>\n }\n @for (rule of validationRules; track rule; let i = $index) {\n <p\n class=\"fr-message\"\n [id]=\"getIdRule(rule, i)\"\n [ngClass]=\"{\n 'fr-message--error': rule.onError,\n 'fr-message--info': rule.onError === undefined,\n 'fr-message--valid': rule.onError === false,\n }\">\n {{ rule.message }}\n @if (rule.onError === true) {\n <span class=\"fr-sr-only\"> - {{ 'password.invalidCriteria' | dsfrI18n }}</span>\n } @else if (rule.onError === false) {\n <span class=\"fr-sr-only\"> - {{ 'password.validCriteria' | dsfrI18n }}</span>\n }\n </p>\n }\n </div>\n\n <div class=\"fr-password__checkbox fr-checkbox-group fr-checkbox-group--sm\">\n <input [attr.aria-label]=\"'password.aria.label' | dsfrI18n\" [id]=\"checkboxId\" type=\"checkbox\" />\n <!-- fr--password utilis\u00E9 sur la d\u00E9mo DSFR et permet de fixer le padding avec la checkbox mais illogique -->\n <label class=\"fr--password__checkbox fr-label\" [for]=\"checkboxId\">\n {{ 'password.show' | dsfrI18n }}\n </label>\n </div>\n\n @if (hasRecovery()) {\n <p>\n <dsfr-link\n [link]=\"recoveryLink\"\n [targetLink]=\"recoveryTargetLink\"\n [route]=\"recoveryRoute\"\n [routePath]=\"recoveryRouterLink\"\n [routerLinkActive]=\"recoveryRouterLinkActive ?? ''\"\n [routerLinkExtras]=\"recoveryRouterLinkExtras\"\n (linkSelect)=\"onRecovery()\"\n >{{ 'password.forgotPassword' | dsfrI18n }}</dsfr-link\n >\n </p>\n }\n</div>\n" }]
}], ctorParameters: () => [], propDecorators: { autocomplete: [{
type: Input
}], labelSrOnly: [{
type: Input
}], required: [{
type: Input
}], message: [{
type: Input
}], messageSeverity: [{
type: Input
}], validationRules: [{
type: Input
}], recoveryLink: [{
type: Input
}], recoveryTargetLink: [{
type: Input
}], recoveryRouterLink: [{
type: Input
}], recoveryRouterLinkActive: [{
type: Input
}], recoveryRouterLinkExtras: [{
type: Input
}], recoveryRoute: [{
type: Input
}], recoveryRouteSelect: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1wYXNzd29yZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvZm9ybXMvZm9ybS1wYXNzd29yZC9mb3JtLXBhc3N3b3JkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtLXBhc3N3b3JkL2Zvcm0tcGFzc3dvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsWUFBWSxFQUdaLGlCQUFpQixFQUNqQixXQUFXLEdBQ1osTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7QUFpQmpHLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSx1QkFBK0I7SUF3RDVFLGdCQUFnQjtJQUNoQjtRQUNFLEtBQUssRUFBRSxDQUFDO1FBekRWLCtDQUErQztRQUN0QyxpQkFBWSxHQUFHLGtCQUFrQixDQUFDO1FBRTNDOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFN0I7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sWUFBTyxHQUF1QixTQUFTLENBQUM7UUErQmpELGlFQUFpRTtRQUN2RCx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBS3hDLGlCQUFZLEdBQUcsaUJBQWlCLENBQUM7SUFLcEQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixRQUFRO1FBQ04sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQVMsQ0FBQyxJQUFvQyxFQUFFLENBQVM7UUFDdkQsSUFBSSxNQUFNLEdBQVcsTUFBTSxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ25CLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDakMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxZQUFZLElBQUksQ0FBQyxPQUFPLGtCQUFrQixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQzVFLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7K0dBL0ZVLHlCQUF5QjttR0FBekIseUJBQXlCLGdqQkFWekI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUseUJBQXlCO2dCQUN0QyxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsaURDMUJILDJvR0E0RkEsMkNEaEVZLFlBQVksNEhBQUUsV0FBVyw0MEJBQUUsaUJBQWlCLHdaQUFFLFlBQVksaURBQUUsMkJBQTJCOzs0RkFFdEYseUJBQXlCO2tCQWRyQyxTQUFTOytCQUNFLG9CQUFvQixpQkFFZixpQkFBaUIsQ0FBQyxJQUFJLGFBQzFCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsMkJBQTJCOzRCQUN0QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixjQUNXLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLDJCQUEyQixDQUFDO3dEQUl6RixZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxPQUFPO3NCQUFmLEtBQUs7Z0JBS0csZUFBZTtzQkFBdkIsS0FBSztnQkFNRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBR0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0ksbUJBQW1CO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRXh0cmFzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERzZnJMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBEZWZhdWx0Q29udHJvbENvbXBvbmVudCxcbiAgRHNmckkxOG5QaXBlLFxuICBEc2ZyTGlua1RhcmdldCxcbiAgRHNmclNldmVyaXR5LFxuICBEc2ZyU2V2ZXJpdHlDb25zdCxcbiAgbmV3VW5pcXVlSWQsXG59IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBFZHVNZXNzYWdlU2V2ZXJpdHlEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGlyZWN0aXZlcy9tZXNzYWdlLXNldmVyaXR5LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEc2ZyRm9ybVBhc3N3b3JkVmFsaWRhdGlvblJ1bGUgfSBmcm9tICcuL2Zvcm0tcGFzc3dvcmQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWZvcm0tcGFzc3dvcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1wYXNzd29yZC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IERzZnJGb3JtUGFzc3dvcmRDb21wb25lbnQsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRHNmckxpbmtDb21wb25lbnQsIERzZnJJMThuUGlwZSwgRWR1TWVzc2FnZVNldmVyaXR5RGlyZWN0aXZlXSxcbn0pXG5leHBvcnQgY2xhc3MgRHNmckZvcm1QYXNzd29yZENvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sQ29tcG9uZW50PHN0cmluZz4gaW1wbGVtZW50cyBPbkluaXQge1xuICAvKiogQHNpbmNlIDEuNiAnY3VycmVudC1wYXNzd29yZCcgcGFyIGTDqWZhdXQgKi9cbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlID0gJ2N1cnJlbnQtcGFzc3dvcmQnO1xuXG4gIC8qKlxuICAgKiBDYWNoZSBsZSBsYWJlbCB2aXN1ZWxsZW1lbnQgZW4gbGUgbGFpc3NhbnQgZGlzcG9uaWJsZSBhdXggbGVjdGV1cnMgZCfDqWNyYW4uXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbFNyT25seSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmRpcXVlIHNpIGxlIGNoYW1wIGVzdCBvYmxpZ2F0b2lyZSBvdSBub24sIGZhdXggcGFyIGTDqWZhdXQuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGQnaW5mb3JtYXRpb24gbGnDqSBhdSBjb21wb3NhbnRcbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVwcsOpc2VudGUgbGEgc8OpdsOpcml0w6kgZHUgbWVzc2FnZS5cbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VTZXZlcml0eTogRHNmclNldmVyaXR5O1xuXG4gIC8qKlxuICAgKiBMaXN0ZSBkZXMgcsOoZ2xlcyBkZSBzw6ljdXJpc2F0aW9uIGR1IG1vdCBkZSBwYXNzZSwgdmFsaWRlcyBvdSBlbiBlcnJldXIgLSBPcHRpb25uZWwuXG4gICAqIFNvdXMgbGEgZm9ybWUgW3ttZXNzYWdlOiAnJywgb25FcnJvcjogZmFsc2V9XVxuICAgKi9cbiAgQElucHV0KCkgdmFsaWRhdGlvblJ1bGVzOiBEc2ZyRm9ybVBhc3N3b3JkVmFsaWRhdGlvblJ1bGVbXTtcblxuICAvKiogVXJsIGRlIHLDqWN1cMOpcmF0aW9uIGR1IG1vdCBkZSBwYXNzZSAob3B0aW9ubmVsKSAqL1xuICBASW5wdXQoKSByZWNvdmVyeUxpbms6IHN0cmluZztcblxuICAvKiogVGFyZ2V0IGR1IGxpZW4uIFRhcmdldCBwYXIgZMOpZmF1dCBkZSBsJ2FwcGxpY2F0aW9uIHNpIGxhIHByb3ByacOpdMOpIGVzdCBub24gcmVuc2VpZ27DqWUuICovXG4gIEBJbnB1dCgpIHJlY292ZXJ5VGFyZ2V0TGluazogRHNmckxpbmtUYXJnZXQ7XG5cbiAgLyoqIFBhdGggYW5ndWxhciBnw6lyw6kgZW4gdGFudCBxdWUgZGlyZWN0aXZlIHJvdXRlckxpbmsuIEV4Y2x1c2lmIGF2ZWMgbGluayBldCByb3V0ZS4gUHJpb3JpdGFpcmUgc3VyIHJvdXRlLiAqL1xuICBASW5wdXQoKSByZWNvdmVyeVJvdXRlckxpbms6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKiBSb3V0ZXJMaW5rOiBjbGFzc2UgdXRpbGlzw6llIHBvdXIgbGEgZGlyZWN0aXZlIHJvdXRlckxpbmsgYWN0aXZlLiAqL1xuICBASW5wdXQoKSByZWNvdmVyeVJvdXRlckxpbmtBY3RpdmU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBSb3V0ZXJMaW5rOiB2YWxldXJzIGFkZGl0aW9ubmVsbGVzIGRlIG5hdmlnYXRpb24gcG91ciBsZSByb3V0ZXJMaW5rIChxdWVyeVBhcmFtcywgc3RhdGUgZXRjLikgKi9cbiAgQElucHV0KCkgcmVjb3ZlcnlSb3V0ZXJMaW5rRXh0cmFzOiBOYXZpZ2F0aW9uRXh0cmFzO1xuXG4gIC8qKiBQYXRoIGludGVybmUuIEV4Y2x1c2lmIGF2ZWMgbGluayBldCByb3V0ZXJMaW5rICovXG4gIEBJbnB1dCgpIHJlY292ZXJ5Um91dGU6IHN0cmluZztcblxuICAvKiogUHJvcGFnZSBsJ8OpdsOobmVtZW50IEV2ZW50IGR1IERPTSDDoCBsYSBzw6lsZWN0aW9uIGQndW4gbGllbi4gKi9cbiAgQE91dHB1dCgpIHJlY292ZXJ5Um91dGVTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogQGludGVybmFsICovIGNoZWNrYm94SWQ6IHN0cmluZztcbiAgLyoqIEBpbnRlcm5hbCAqLyBtZXNzYWdlc0dyb3VwSWQ6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRHNmclNldmVyaXR5ID0gRHNmclNldmVyaXR5Q29uc3Q7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuY2hlY2tib3hJZCA9IG5ld1VuaXF1ZUlkKCk7XG4gICAgdGhpcy5tZXNzYWdlc0dyb3VwSWQgPSBuZXdVbmlxdWVJZCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRJZFJ1bGUocnVsZTogRHNmckZvcm1QYXNzd29yZFZhbGlkYXRpb25SdWxlLCBpOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCBzdGF0dXM6IHN0cmluZyA9ICdpbmZvJztcbiAgICBpZiAocnVsZS5vbkVycm9yID09PSBmYWxzZSkge1xuICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICB9IGVsc2UgaWYgKHJ1bGUub25FcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICB9XG5cbiAgICByZXR1cm4gYHBhc3N3b3JkLSR7dGhpcy5pbnB1dElkfS1pbnB1dC1tZXNzYWdlLSR7c3RhdHVzfS0ke2l9YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaGFzUmVjb3ZlcnkoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJlY292ZXJ5TGluayB8fCB0aGlzLnJlY292ZXJ5Um91dGUgfHwgdGhpcy5yZWNvdmVyeVJvdXRlckxpbms7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG9uUmVjb3ZlcnkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3ZlcnlSb3V0ZSkge1xuICAgICAgdGhpcy5yZWNvdmVyeVJvdXRlU2VsZWN0LmVtaXQodGhpcy5yZWNvdmVyeVJvdXRlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGhhc01lc3NhZ2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25SdWxlcyAmJiB0aGlzLnZhbGlkYXRpb25SdWxlcy5sZW5ndGggPiAwO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnItcGFzc3dvcmRcIj5cbiAgPGxhYmVsXG4gICAgY2xhc3M9XCJmci1sYWJlbFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ2ZyLXNyLW9ubHknOiBsYWJlbFNyT25seSxcbiAgICAgICdmci1pbnB1dC1ncm91cC0tZXJyb3InOiBtZXNzYWdlICYmIG1lc3NhZ2VTZXZlcml0eSA9PT0gRHNmclNldmVyaXR5LkVSUk9SLFxuICAgICAgJ2ZyLWlucHV0LWdyb3VwLS12YWxpZCc6XG4gICAgICAgIG1lc3NhZ2UgJiYgKG1lc3NhZ2VTZXZlcml0eSA9PT0gRHNmclNldmVyaXR5LlNVQ0NFU1MgfHwgbWVzc2FnZVNldmVyaXR5ID09PSBEc2ZyU2V2ZXJpdHkuVkFMSUQpLFxuICAgICAgJ2ZyLWlucHV0LWdyb3VwLS1pbmZvJzogbWVzc2FnZSAmJiBtZXNzYWdlU2V2ZXJpdHkgPT09IERzZnJTZXZlcml0eS5JTkZPLFxuICAgICAgJ2ZyLWlucHV0LWdyb3VwLS13YXJuaW5nJzogbWVzc2FnZSAmJiBtZXNzYWdlU2V2ZXJpdHkgPT09IERzZnJTZXZlcml0eS5XQVJOSU5HLFxuICAgIH1cIlxuICAgIFtmb3JdPVwiaW5wdXRJZFwiPlxuICAgIEBpZiAobGFiZWwpIHtcbiAgICAgIHt7IGxhYmVsIH19XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbGFiZWxdXCI+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgICBAaWYgKGhpbnQpIHtcbiAgICAgIDxzcGFuIGNsYXNzPVwiZnItaGludC10ZXh0XCI+e3sgaGludCB9fTwvc3Bhbj5cbiAgICB9XG4gIDwvbGFiZWw+XG5cbiAgPGRpdiBjbGFzcz1cImZyLWlucHV0LXdyYXBcIj5cbiAgICA8aW5wdXRcbiAgICAgIGNsYXNzPVwiZnItcGFzc3dvcmRfX2lucHV0IGZyLWlucHV0XCJcbiAgICAgIGF1dG9jYXBpdGFsaXplPVwib2ZmXCJcbiAgICAgIGF1dG9jb3JyZWN0PVwib2ZmXCJcbiAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaGFzTWVzc2FnZXMoKSA/IG1lc3NhZ2VzR3JvdXBJZCA6IG51bGxcIlxuICAgICAgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFthdHRyLm5hbWVdPVwibmFtZSB8fCBudWxsXCJcbiAgICAgIFthdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICAgIHR5cGU9XCJwYXNzd29yZFwiIC8+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmci1tZXNzYWdlcy1ncm91cFwiIFtpZF09XCJtZXNzYWdlc0dyb3VwSWRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICA8IS0tIHByZXR0aWVyLWlnbm9yZSAtLT5cbiAgICBAaWYgKG1lc3NhZ2UpIHtcbiAgICAgIDxwXG4gICAgICAgIGNsYXNzPVwiZnItbWVzc2FnZVwiXG4gICAgICAgICBbZWR1TWVzc2FnZVNldmVyaXR5XT1cIm1lc3NhZ2VTZXZlcml0eVwiXG4gICAgICAgID57eyBtZXNzYWdlIH19PC9wPlxuICAgIH1cblxuICAgIEBpZiAoaGFzTWVzc2FnZXMoKSkge1xuICAgICAgPHAgY2xhc3M9XCJmci1tZXNzYWdlXCI+e3sgJ3Bhc3N3b3JkLm1lc3NhZ2UnIHwgZHNmckkxOG4gfX08L3A+XG4gICAgfVxuICAgIEBmb3IgKHJ1bGUgb2YgdmFsaWRhdGlvblJ1bGVzOyB0cmFjayBydWxlOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgPHBcbiAgICAgICAgY2xhc3M9XCJmci1tZXNzYWdlXCJcbiAgICAgICAgW2lkXT1cImdldElkUnVsZShydWxlLCBpKVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnZnItbWVzc2FnZS0tZXJyb3InOiBydWxlLm9uRXJyb3IsXG4gICAgICAgICAgJ2ZyLW1lc3NhZ2UtLWluZm8nOiBydWxlLm9uRXJyb3IgPT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAnZnItbWVzc2FnZS0tdmFsaWQnOiBydWxlLm9uRXJyb3IgPT09IGZhbHNlLFxuICAgICAgICB9XCI+XG4gICAgICAgIHt7IHJ1bGUubWVzc2FnZSB9fVxuICAgICAgICBAaWYgKHJ1bGUub25FcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnItc3Itb25seVwiPiZuYnNwOy0mbmJzcDt7eyAncGFzc3dvcmQuaW52YWxpZENyaXRlcmlhJyB8IGRzZnJJMThuIH19PC9zcGFuPlxuICAgICAgICB9IEBlbHNlIGlmIChydWxlLm9uRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmci1zci1vbmx5XCI+Jm5ic3A7LSZuYnNwO3t7ICdwYXNzd29yZC52YWxpZENyaXRlcmlhJyB8IGRzZnJJMThuIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L3A+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZnItcGFzc3dvcmRfX2NoZWNrYm94IGZyLWNoZWNrYm94LWdyb3VwIGZyLWNoZWNrYm94LWdyb3VwLS1zbVwiPlxuICAgIDxpbnB1dCBbYXR0ci5hcmlhLWxhYmVsXT1cIidwYXNzd29yZC5hcmlhLmxhYmVsJyB8IGRzZnJJMThuXCIgW2lkXT1cImNoZWNrYm94SWRcIiB0eXBlPVwiY2hlY2tib3hcIiAvPlxuICAgIDwhLS0gZnItLXBhc3N3b3JkIHV0aWxpc8OpIHN1ciBsYSBkw6ltbyBEU0ZSIGV0IHBlcm1ldCBkZSBmaXhlciBsZSBwYWRkaW5nIGF2ZWMgbGEgY2hlY2tib3ggbWFpcyBpbGxvZ2lxdWUgLS0+XG4gICAgPGxhYmVsIGNsYXNzPVwiZnItLXBhc3N3b3JkX19jaGVja2JveCBmci1sYWJlbFwiIFtmb3JdPVwiY2hlY2tib3hJZFwiPlxuICAgICAge3sgJ3Bhc3N3b3JkLnNob3cnIHwgZHNmckkxOG4gfX1cbiAgICA8L2xhYmVsPlxuICA8L2Rpdj5cblxuICBAaWYgKGhhc1JlY292ZXJ5KCkpIHtcbiAgICA8cD5cbiAgICAgIDxkc2ZyLWxpbmtcbiAgICAgICAgW2xpbmtdPVwicmVjb3ZlcnlMaW5rXCJcbiAgICAgICAgW3RhcmdldExpbmtdPVwicmVjb3ZlcnlUYXJnZXRMaW5rXCJcbiAgICAgICAgW3JvdXRlXT1cInJlY292ZXJ5Um91dGVcIlxuICAgICAgICBbcm91dGVQYXRoXT1cInJlY292ZXJ5Um91dGVyTGlua1wiXG4gICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cInJlY292ZXJ5Um91dGVyTGlua0FjdGl2ZSA/PyAnJ1wiXG4gICAgICAgIFtyb3V0ZXJMaW5rRXh0cmFzXT1cInJlY292ZXJ5Um91dGVyTGlua0V4dHJhc1wiXG4gICAgICAgIChsaW5rU2VsZWN0KT1cIm9uUmVjb3ZlcnkoKVwiXG4gICAgICAgID57eyAncGFzc3dvcmQuZm9yZ290UGFzc3dvcmQnIHwgZHNmckkxOG4gfX08L2RzZnItbGlua1xuICAgICAgPlxuICAgIDwvcD5cbiAgfVxuPC9kaXY+XG4iXX0=