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).

78 lines 22.6 kB
import { CommonModule } from '@angular/common'; import { Component, forwardRef, Input, ViewEncapsulation } from '@angular/core'; import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; import { DsfrButtonComponent } from '../../components'; import { InputGroupComponent, isStringEmptyOrNull } from '../../shared'; import { BaseInputComboComponent } from './base-input-combo.component'; import { DsfrInputTypeConst } from './form-input.model'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; export class DsfrFormInputComponent extends BaseInputComboComponent { constructor() { super(...arguments); /** * Cache le label visuellement en le laissant disponible aux lecteurs d'écran. */ this.labelSrOnly = false; } /** @deprecated since 1.2 use `type` instead. */ get textarea() { return this.isTextArea(); } /** @deprecated (@since 1.2) utiliser `type` à la place. */ set textarea(value) { this.type = value ? DsfrInputTypeConst.TEXTAREA : DsfrInputTypeConst.TEXT; } /** @internal */ isTextArea() { return this.type === DsfrInputTypeConst.TEXTAREA; } /** @internal */ hasInputWrap() { return this.hasButton() || !isStringEmptyOrNull(this.icon); } /** @internal */ getWrapClasses() { let classes = ['fr-input-wrap']; if (this.hasButton() && this.inputWrapMode === 'addon') classes.push('fr-input-wrap--addon'); if (this.hasButton() && this.inputWrapMode === 'action') classes.push('fr-input-wrap--action'); if (this.icon) classes.push(this.icon); return classes; } /** @internal */ onButtonClick(event) { if (this.buttonType != 'submit') this.buttonSelect.emit(event); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFormInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrFormInputComponent, isStandalone: true, selector: "dsfr-form-input", inputs: { rows: "rows", labelSrOnly: "labelSrOnly", width: "width", textarea: "textarea" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrFormInputComponent), multi: true, }, ], usesInheritance: true, ngImport: i0, template: "<edu-input-group\n [inputId]=\"inputId\"\n [label]=\"label\"\n [hint]=\"hint\"\n [messagesGroupId]=\"messagesGroupId\"\n [disabled]=\"disabled\"\n [message]=\"message\"\n [severity]=\"messageSeverity\">\n <label class=\"fr-label\" [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\" [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 @if (!isTextArea()) {\n @if (!hasInputWrap()) {\n <ng-container [ngTemplateOutlet]=\"inputTemplate\"></ng-container>\n } @else {\n <div [ngClass]=\"getWrapClasses()\">\n <ng-container *ngTemplateOutlet=\"inputTemplate\"></ng-container>\n @if (hasButton()) {\n <dsfr-button\n [ariaLabel]=\"buttonAriaLabel\"\n [disabled]=\"buttonDisabled\"\n [icon]=\"buttonIcon\"\n [label]=\"buttonLabel\"\n [tooltipMessage]=\"buttonTooltipMessage\"\n [type]=\"buttonType\"\n [variant]=\"buttonVariant\"\n (click)=\"onButtonClick($event)\"></dsfr-button>\n }\n </div>\n }\n } @else {\n <textarea\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-describedby]=\"message ? messagesGroupId : null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n [(ngModel)]=\"value\"\n [ngStyle]=\"width ? { width: width } : {}\"\n [attr.rows]=\"rows || null\"></textarea>\n }\n</edu-input-group>\n\n<!-- Templates -------------------------------------------------------------------------------------------------------->\n\n<!-- Template input -->\n<ng-template #inputTemplate>\n <input\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-autocomplete]=\"ariaAutocomplete || null\"\n [attr.aria-describedby]=\"message ? messagesGroupId : null\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-expanded]=\"ariaExpanded !== undefined ? ariaExpanded : null\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n [readOnly]=\"readonly\"\n [attr.aria-required]=\"required || null\"\n [attr.role]=\"inputRole || null\"\n [attr.inputmode]=\"inputMode || null\"\n [attr.autocorrect]=\"autoCorrect ? null : 'off'\"\n [(ngModel)]=\"value\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [attr.type]=\"type || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [attr.pattern]=\"pattern || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n (blur)=\"onBlur()\"\n [attr.minLength]=\"minLength || null\"\n [attr.spellcheck]=\"spellCheck || null\"\n [ngStyle]=\"width ? { width: width } : {}\" />\n</ng-template>\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: 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: 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: "component", type: InputGroupComponent, selector: "edu-input-group", inputs: ["label", "inputId", "hint", "disabled", "message", "severity", "messagesGroupId"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFormInputComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-form-input', encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrFormInputComponent), multi: true, }, ], standalone: true, imports: [CommonModule, FormsModule, DsfrButtonComponent, InputGroupComponent], template: "<edu-input-group\n [inputId]=\"inputId\"\n [label]=\"label\"\n [hint]=\"hint\"\n [messagesGroupId]=\"messagesGroupId\"\n [disabled]=\"disabled\"\n [message]=\"message\"\n [severity]=\"messageSeverity\">\n <label class=\"fr-label\" [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\" [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 @if (!isTextArea()) {\n @if (!hasInputWrap()) {\n <ng-container [ngTemplateOutlet]=\"inputTemplate\"></ng-container>\n } @else {\n <div [ngClass]=\"getWrapClasses()\">\n <ng-container *ngTemplateOutlet=\"inputTemplate\"></ng-container>\n @if (hasButton()) {\n <dsfr-button\n [ariaLabel]=\"buttonAriaLabel\"\n [disabled]=\"buttonDisabled\"\n [icon]=\"buttonIcon\"\n [label]=\"buttonLabel\"\n [tooltipMessage]=\"buttonTooltipMessage\"\n [type]=\"buttonType\"\n [variant]=\"buttonVariant\"\n (click)=\"onButtonClick($event)\"></dsfr-button>\n }\n </div>\n }\n } @else {\n <textarea\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-describedby]=\"message ? messagesGroupId : null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n [(ngModel)]=\"value\"\n [ngStyle]=\"width ? { width: width } : {}\"\n [attr.rows]=\"rows || null\"></textarea>\n }\n</edu-input-group>\n\n<!-- Templates -------------------------------------------------------------------------------------------------------->\n\n<!-- Template input -->\n<ng-template #inputTemplate>\n <input\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-autocomplete]=\"ariaAutocomplete || null\"\n [attr.aria-describedby]=\"message ? messagesGroupId : null\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-expanded]=\"ariaExpanded !== undefined ? ariaExpanded : null\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n [readOnly]=\"readonly\"\n [attr.aria-required]=\"required || null\"\n [attr.role]=\"inputRole || null\"\n [attr.inputmode]=\"inputMode || null\"\n [attr.autocorrect]=\"autoCorrect ? null : 'off'\"\n [(ngModel)]=\"value\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [attr.type]=\"type || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [attr.pattern]=\"pattern || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n (blur)=\"onBlur()\"\n [attr.minLength]=\"minLength || null\"\n [attr.spellcheck]=\"spellCheck || null\"\n [ngStyle]=\"width ? { width: width } : {}\" />\n</ng-template>\n" }] }], propDecorators: { rows: [{ type: Input }], labelSrOnly: [{ type: Input }], width: [{ type: Input }], textarea: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvZm9ybXMvZm9ybS1pbnB1dC9mb3JtLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7O0FBZ0J4RCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsdUJBQXVCO0lBZG5FOztRQW9CRTs7V0FFRztRQUNNLGdCQUFXLEdBQUcsS0FBSyxDQUFDO0tBMEM5QjtJQWxDQyxnREFBZ0Q7SUFDaEQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxJQUFhLFFBQVEsQ0FBQyxLQUFjO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztJQUM1RSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsUUFBUSxDQUFDO0lBQ25ELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsY0FBYztRQUNaLElBQUksT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxPQUFPO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzdGLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMvRixJQUFJLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixhQUFhLENBQUMsS0FBWTtRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLENBQUM7K0dBbERVLHNCQUFzQjttR0FBdEIsc0JBQXNCLDBKQVZ0QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUM7Z0JBQ3JELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRixpRENsQkgsNHVHQTRGQSwyQ0R4RVksWUFBWSx3WEFBRSxXQUFXLDQwQkFBRSxtQkFBbUIsa1hBQUUsbUJBQW1COzs0RkFFbEUsc0JBQXNCO2tCQWRsQyxTQUFTOytCQUNFLGlCQUFpQixpQkFFWixpQkFBaUIsQ0FBQyxJQUFJLGFBQzFCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHVCQUF1QixDQUFDOzRCQUNyRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixjQUNXLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUM7OEJBTXJFLElBQUk7c0JBQVosS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLEtBQUs7c0JBQWIsS0FBSztnQkFRTyxRQUFRO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEc2ZyQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBJbnB1dEdyb3VwQ29tcG9uZW50LCBpc1N0cmluZ0VtcHR5T3JOdWxsIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IEJhc2VJbnB1dENvbWJvQ29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLWlucHV0LWNvbWJvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEc2ZySW5wdXRUeXBlQ29uc3QgfSBmcm9tICcuL2Zvcm0taW5wdXQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWZvcm0taW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHNmckZvcm1JbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRHNmckJ1dHRvbkNvbXBvbmVudCwgSW5wdXRHcm91cENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJGb3JtSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBCYXNlSW5wdXRDb21ib0NvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUeXBlICd0ZXh0YXJlYScgOiBub21icmUgZGUgbGlnbmVzLlxuICAgKi9cbiAgQElucHV0KCkgcm93czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDYWNoZSBsZSBsYWJlbCB2aXN1ZWxsZW1lbnQgZW4gbGUgbGFpc3NhbnQgZGlzcG9uaWJsZSBhdXggbGVjdGV1cnMgZCfDqWNyYW4uXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbFNyT25seSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAoc2luY2UgMS4yKSB1dGlsaXNlciBgY3VzdG9tQ2xhc3NgIMOgIGxhIHBsYWNlLlxuICAgKiBMYXJnZXVyIGRlIGwnaW5wdXQsIGAnMTAwJSdgIHBhciBkw6lmYXV0LCBgJzEwcmVtJ2AgcGFyIGTDqWZhdXQgcG91ciB1biB0eXBlIGRhdGUuXG4gICAqL1xuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nO1xuXG4gIC8qKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjIgdXNlIGB0eXBlYCBpbnN0ZWFkLiAqL1xuICBnZXQgdGV4dGFyZWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNUZXh0QXJlYSgpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIChAc2luY2UgMS4yKSB1dGlsaXNlciBgdHlwZWAgw6AgbGEgcGxhY2UuICovXG4gIEBJbnB1dCgpIHNldCB0ZXh0YXJlYSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMudHlwZSA9IHZhbHVlID8gRHNmcklucHV0VHlwZUNvbnN0LlRFWFRBUkVBIDogRHNmcklucHV0VHlwZUNvbnN0LlRFWFQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGlzVGV4dEFyZWEoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRHNmcklucHV0VHlwZUNvbnN0LlRFWFRBUkVBO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBoYXNJbnB1dFdyYXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQnV0dG9uKCkgfHwgIWlzU3RyaW5nRW1wdHlPck51bGwodGhpcy5pY29uKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0V3JhcENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGxldCBjbGFzc2VzID0gWydmci1pbnB1dC13cmFwJ107XG4gICAgaWYgKHRoaXMuaGFzQnV0dG9uKCkgJiYgdGhpcy5pbnB1dFdyYXBNb2RlID09PSAnYWRkb24nKSBjbGFzc2VzLnB1c2goJ2ZyLWlucHV0LXdyYXAtLWFkZG9uJyk7XG4gICAgaWYgKHRoaXMuaGFzQnV0dG9uKCkgJiYgdGhpcy5pbnB1dFdyYXBNb2RlID09PSAnYWN0aW9uJykgY2xhc3Nlcy5wdXNoKCdmci1pbnB1dC13cmFwLS1hY3Rpb24nKTtcbiAgICBpZiAodGhpcy5pY29uKSBjbGFzc2VzLnB1c2godGhpcy5pY29uKTtcblxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkJ1dHRvbkNsaWNrKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmJ1dHRvblR5cGUgIT0gJ3N1Ym1pdCcpIHRoaXMuYnV0dG9uU2VsZWN0LmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCI8ZWR1LWlucHV0LWdyb3VwXG4gIFtpbnB1dElkXT1cImlucHV0SWRcIlxuICBbbGFiZWxdPVwibGFiZWxcIlxuICBbaGludF09XCJoaW50XCJcbiAgW21lc3NhZ2VzR3JvdXBJZF09XCJtZXNzYWdlc0dyb3VwSWRcIlxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcbiAgW3NldmVyaXR5XT1cIm1lc3NhZ2VTZXZlcml0eVwiPlxuICA8bGFiZWwgY2xhc3M9XCJmci1sYWJlbFwiIFtuZ0NsYXNzXT1cInsgJ2ZyLXNyLW9ubHknOiBsYWJlbFNyT25seSB9XCIgW2Zvcl09XCJpbnB1dElkXCI+XG4gICAgQGlmIChsYWJlbCkge1xuICAgICAge3sgbGFiZWwgfX1cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltsYWJlbF1cIj48L25nLWNvbnRlbnQ+XG4gICAgfVxuICAgIEBpZiAoaGludCkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJmci1oaW50LXRleHRcIj57eyBoaW50IH19PC9zcGFuPlxuICAgIH1cbiAgPC9sYWJlbD5cbiAgQGlmICghaXNUZXh0QXJlYSgpKSB7XG4gICAgQGlmICghaGFzSW5wdXRXcmFwKCkpIHtcbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaW5wdXRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRXcmFwQ2xhc3NlcygpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIEBpZiAoaGFzQnV0dG9uKCkpIHtcbiAgICAgICAgICA8ZHNmci1idXR0b25cbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiYnV0dG9uQXJpYUxhYmVsXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICBbaWNvbl09XCJidXR0b25JY29uXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJidXR0b25MYWJlbFwiXG4gICAgICAgICAgICBbdG9vbHRpcE1lc3NhZ2VdPVwiYnV0dG9uVG9vbHRpcE1lc3NhZ2VcIlxuICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uVHlwZVwiXG4gICAgICAgICAgICBbdmFyaWFudF09XCJidXR0b25WYXJpYW50XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKCRldmVudClcIj48L2RzZnItYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH0gQGVsc2Uge1xuICAgIDx0ZXh0YXJlYVxuICAgICAgY2xhc3M9XCJmci1pbnB1dFwiXG4gICAgICBbbmdDbGFzc109XCJjdXN0b21DbGFzcyB8fCBudWxsXCJcbiAgICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICAgIFthdHRyLm5hbWVdPVwibmFtZSB8fCBudWxsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXIgfHwgbnVsbFwiXG4gICAgICBbYXR0ci5tYXhMZW5ndGhdPVwibWF4TGVuZ3RoIHx8IG51bGxcIlxuICAgICAgW2F0dHIubWluTGVuZ3RoXT1cIm1pbkxlbmd0aCB8fCBudWxsXCJcbiAgICAgIFthdHRyLmF1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGUgfHwgbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm1lc3NhZ2UgPyBtZXNzYWdlc0dyb3VwSWQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJhcmlhSW52YWxpZCB8fCBudWxsXCJcbiAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgW25nU3R5bGVdPVwid2lkdGggPyB7IHdpZHRoOiB3aWR0aCB9IDoge31cIlxuICAgICAgW2F0dHIucm93c109XCJyb3dzIHx8IG51bGxcIj48L3RleHRhcmVhPlxuICB9XG48L2VkdS1pbnB1dC1ncm91cD5cblxuPCEtLSBUZW1wbGF0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG5cbjwhLS0gVGVtcGxhdGUgaW5wdXQgLS0+XG48bmctdGVtcGxhdGUgI2lucHV0VGVtcGxhdGU+XG4gIDxpbnB1dFxuICAgIGNsYXNzPVwiZnItaW5wdXRcIlxuICAgIFtuZ0NsYXNzXT1cImN1c3RvbUNsYXNzIHx8IG51bGxcIlxuICAgIFthdHRyLmF1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGUgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXJpYUF1dG9jb21wbGV0ZSB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm1lc3NhZ2UgPyBtZXNzYWdlc0dyb3VwSWQgOiBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiYXJpYUV4cGFuZGVkICE9PSB1bmRlZmluZWQgPyBhcmlhRXhwYW5kZWQgOiBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiYXJpYUludmFsaWQgfHwgbnVsbFwiXG4gICAgW3JlYWRPbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkIHx8IG51bGxcIlxuICAgIFthdHRyLnJvbGVdPVwiaW5wdXRSb2xlIHx8IG51bGxcIlxuICAgIFthdHRyLmlucHV0bW9kZV09XCJpbnB1dE1vZGUgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXV0b2NvcnJlY3RdPVwiYXV0b0NvcnJlY3QgPyBudWxsIDogJ29mZidcIlxuICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWUgfHwgbnVsbFwiXG4gICAgW2F0dHIudHlwZV09XCJ0eXBlIHx8IG51bGxcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICBbYXR0ci5wYXR0ZXJuXT1cInBhdHRlcm4gfHwgbnVsbFwiXG4gICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXIgfHwgbnVsbFwiXG4gICAgW2F0dHIubWluXT1cIm1pbiB8fCBudWxsXCJcbiAgICBbYXR0ci5tYXhdPVwibWF4IHx8IG51bGxcIlxuICAgIFthdHRyLm1heExlbmd0aF09XCJtYXhMZW5ndGggfHwgbnVsbFwiXG4gICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgIFthdHRyLm1pbkxlbmd0aF09XCJtaW5MZW5ndGggfHwgbnVsbFwiXG4gICAgW2F0dHIuc3BlbGxjaGVja109XCJzcGVsbENoZWNrIHx8IG51bGxcIlxuICAgIFtuZ1N0eWxlXT1cIndpZHRoID8geyB3aWR0aDogd2lkdGggfSA6IHt9XCIgLz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=