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

98 lines 19.4 kB
import { CommonModule } from '@angular/common'; import { Component, forwardRef, Input, ViewEncapsulation } from '@angular/core'; import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; import { DefaultControlComponent, DsfrSizeConst } from '../../shared'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; export class DsfrRangeComponent extends DefaultControlComponent { constructor() { super(); /** Valeur minimale possible */ this.min = 0; /** Valeur max possible */ this.max = 100; /** Ne pas afficher le minimum et le maximum */ this.hideMinMax = false; /** Désactiver le curseur */ this.disabled = false; /** @internal Curseur double */ this.double = false; } /** * Taille du curseur (SM et MD possibles, MD par défaut) * * @deprecated since(1.15.0) utiliser 'rangeSize' à la place */ get size() { return this.rangeSize; } get hintId() { return this.inputId + '-hint-text'; } /** * Taille du curseur (SM et MD possibles, MD par défaut) * * @deprecated since(1.15.0) utiliser 'rangeSize' à la place */ set size(value) { this.rangeSize = value; } /**@internal */ isDouble() { return Array.isArray(this.value); } /** @internal */ isSmall() { return this.size == DsfrSizeConst.SM; } /** @internal */ getValue(index) { return Array.isArray(this.value) ? this.value[index] : undefined; } /** @internal */ onInputChange(index, value) { if (Array.isArray(this.value)) { this.value[index] = value; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrRangeComponent, isStandalone: true, selector: "dsfr-range", inputs: { min: "min", max: "max", hideMinMax: "hideMinMax", step: "step", rangeSize: "rangeSize", prefix: "prefix", suffix: "suffix", disabled: "disabled", error: "error", size: "size" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrRangeComponent), multi: true, }, ], usesInheritance: true, ngImport: i0, template: "<div\n class=\"fr-range-group\"\n id=\"{{ inputId }}-group\"\n [ngClass]=\"{ 'fr-range-group--disabled': disabled, 'fr-range-group--error': error }\">\n <label id=\"{{ inputId }}-label\" class=\"fr-label\">\n <!-- Label obligatoire -->\n @if (label) {\n {{ label }}\n } @else {\n <ng-content></ng-content>\n }\n @if (hint) {\n <span class=\"fr-hint-text\">{{ hint }}</span>\n }\n </label>\n <div\n class=\"fr-range\"\n [attr.data-fr-prefix]=\"prefix\"\n [attr.data-fr-suffix]=\"suffix\"\n [ngClass]=\"{ 'fr-range--double': isDouble(), 'fr-range--sm': isSmall(), 'fr-range--step': step }\">\n <span class=\"fr-range__output\">{{ value }}</span>\n @if (!isDouble()) {\n <input\n id=\"{{ inputId }}\"\n name=\"{{ inputId }}\"\n type=\"range\"\n [attr.aria-labelledby]=\"inputId + '-label'\"\n min=\"{{ min }}\"\n max=\"{{ max }}\"\n [disabled]=\"disabled\"\n [attr.value]=\"value\"\n [(ngModel)]=\"value\"\n [attr.aria-describedby]=\"error ? inputId + '-messages' : null\"\n [attr.step]=\"step\" />\n } @else {\n <input\n id=\"{{ inputId }}\"\n name=\"{{ inputId }}\"\n type=\"range\"\n [attr.aria-labelledby]=\"inputId + '-label'\"\n min=\"{{ min }}\"\n max=\"{{ max }}\"\n [disabled]=\"disabled\"\n [attr.value]=\"getValue(0)\"\n [ngModel]=\"getValue(0)\"\n (ngModelChange)=\"onInputChange(0, $event)\"\n [attr.aria-describedby]=\"error ? inputId + '-messages' : null\" />\n <input\n id=\"{{ inputId }}-2\"\n name=\"{{ inputId }}-2\"\n type=\"range\"\n [attr.aria-labelledby]=\"inputId + '-label'\"\n max=\"{{ max }}\"\n [disabled]=\"disabled\"\n [attr.value]=\"getValue(1)\"\n [ngModel]=\"getValue(1)\"\n (ngModelChange)=\"onInputChange(1, $event)\"\n [attr.aria-describedby]=\"error ? inputId + '-messages' : null\" />\n }\n\n @if (!hideMinMax) {\n <span class=\"fr-range__min\" aria-hidden=\"true\">\n {{ min }}\n </span>\n <span class=\"fr-range__max\" aria-hidden=\"true\">\n {{ max }}\n </span>\n }\n </div>\n <div class=\"fr-messages-group\" id=\"{{ inputId }}-messages\" aria-live=\"polite\">\n @if (error) {\n <p class=\"fr-message fr-message--error\" id=\"range-2310-message-error\">\n {{ error }}\n </p>\n }\n </div>\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.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrRangeComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-range', encapsulation: ViewEncapsulation.None, imports: [CommonModule, FormsModule], standalone: true, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrRangeComponent), multi: true, }, ], template: "<div\n class=\"fr-range-group\"\n id=\"{{ inputId }}-group\"\n [ngClass]=\"{ 'fr-range-group--disabled': disabled, 'fr-range-group--error': error }\">\n <label id=\"{{ inputId }}-label\" class=\"fr-label\">\n <!-- Label obligatoire -->\n @if (label) {\n {{ label }}\n } @else {\n <ng-content></ng-content>\n }\n @if (hint) {\n <span class=\"fr-hint-text\">{{ hint }}</span>\n }\n </label>\n <div\n class=\"fr-range\"\n [attr.data-fr-prefix]=\"prefix\"\n [attr.data-fr-suffix]=\"suffix\"\n [ngClass]=\"{ 'fr-range--double': isDouble(), 'fr-range--sm': isSmall(), 'fr-range--step': step }\">\n <span class=\"fr-range__output\">{{ value }}</span>\n @if (!isDouble()) {\n <input\n id=\"{{ inputId }}\"\n name=\"{{ inputId }}\"\n type=\"range\"\n [attr.aria-labelledby]=\"inputId + '-label'\"\n min=\"{{ min }}\"\n max=\"{{ max }}\"\n [disabled]=\"disabled\"\n [attr.value]=\"value\"\n [(ngModel)]=\"value\"\n [attr.aria-describedby]=\"error ? inputId + '-messages' : null\"\n [attr.step]=\"step\" />\n } @else {\n <input\n id=\"{{ inputId }}\"\n name=\"{{ inputId }}\"\n type=\"range\"\n [attr.aria-labelledby]=\"inputId + '-label'\"\n min=\"{{ min }}\"\n max=\"{{ max }}\"\n [disabled]=\"disabled\"\n [attr.value]=\"getValue(0)\"\n [ngModel]=\"getValue(0)\"\n (ngModelChange)=\"onInputChange(0, $event)\"\n [attr.aria-describedby]=\"error ? inputId + '-messages' : null\" />\n <input\n id=\"{{ inputId }}-2\"\n name=\"{{ inputId }}-2\"\n type=\"range\"\n [attr.aria-labelledby]=\"inputId + '-label'\"\n max=\"{{ max }}\"\n [disabled]=\"disabled\"\n [attr.value]=\"getValue(1)\"\n [ngModel]=\"getValue(1)\"\n (ngModelChange)=\"onInputChange(1, $event)\"\n [attr.aria-describedby]=\"error ? inputId + '-messages' : null\" />\n }\n\n @if (!hideMinMax) {\n <span class=\"fr-range__min\" aria-hidden=\"true\">\n {{ min }}\n </span>\n <span class=\"fr-range__max\" aria-hidden=\"true\">\n {{ max }}\n </span>\n }\n </div>\n <div class=\"fr-messages-group\" id=\"{{ inputId }}-messages\" aria-live=\"polite\">\n @if (error) {\n <p class=\"fr-message fr-message--error\" id=\"range-2310-message-error\">\n {{ error }}\n </p>\n }\n </div>\n</div>\n" }] }], ctorParameters: () => [], propDecorators: { min: [{ type: Input }], max: [{ type: Input }], hideMinMax: [{ type: Input }], step: [{ type: Input }], rangeSize: [{ type: Input }], prefix: [{ type: Input }], suffix: [{ type: Input }], disabled: [{ type: Input }], error: [{ type: Input }], size: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcmFuZ2UvcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcmFuZ2UvcmFuZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFZLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7OztBQWdCaEYsTUFBTSxPQUFPLGtCQUFtQixTQUFRLHVCQUFrRDtJQWlDeEY7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQWpDViwrQkFBK0I7UUFDdEIsUUFBRyxHQUFXLENBQUMsQ0FBQztRQUV6QiwwQkFBMEI7UUFDakIsUUFBRyxHQUFXLEdBQUcsQ0FBQztRQUUzQixnREFBZ0Q7UUFDdkMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQWdCckMsNEJBQTRCO1FBQ25CLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFLbkMsZ0NBQWdDO1FBQ2hDLFdBQU0sR0FBWSxLQUFLLENBQUM7SUFJeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLElBQUksQ0FBQyxLQUFlO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxlQUFlO0lBQ2YsUUFBUTtRQUNOLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixRQUFRLENBQUMsS0FBYTtRQUNwQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixhQUFhLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDeEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDOytHQS9FVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixxUEFSbEI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2dCQUNqRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsaURDakJILDA4RUE2RUEsMkNEcEVZLFlBQVksNEhBQUUsV0FBVzs7NEZBVXhCLGtCQUFrQjtrQkFkOUIsU0FBUzsrQkFDRSxZQUFZLGlCQUVQLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLGNBQ3hCLElBQUksYUFDTDt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQzs0QkFDakQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7d0RBSVEsR0FBRztzQkFBWCxLQUFLO2dCQUdHLEdBQUc7c0JBQVgsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFHRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBMkJPLElBQUk7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERlZmF1bHRDb250cm9sQ29tcG9uZW50LCBEc2ZyU2l6ZSwgRHNmclNpemVDb25zdCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItcmFuZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHNmclJhbmdlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJSYW5nZUNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sQ29tcG9uZW50PG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0+IHtcbiAgLyoqIFZhbGV1ciBtaW5pbWFsZSBwb3NzaWJsZSAqL1xuICBASW5wdXQoKSBtaW46IG51bWJlciA9IDA7XG5cbiAgLyoqIFZhbGV1ciBtYXggcG9zc2libGUgKi9cbiAgQElucHV0KCkgbWF4OiBudW1iZXIgPSAxMDA7XG5cbiAgLyoqIE5lIHBhcyBhZmZpY2hlciBsZSBtaW5pbXVtIGV0IGxlIG1heGltdW0gICovXG4gIEBJbnB1dCgpIGhpZGVNaW5NYXg6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSW5jcsOpbWVudCBxdWUgZG9pdCBzdWl2cmUgbGEgdmFsZXVyICgxIHBhciBkw6lmYXV0KSAgKi9cbiAgQElucHV0KCkgc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUYWlsbGUgZHUgY3Vyc2V1ciAoU00gZXQgTUQgcG9zc2libGVzLCBNRCBwYXIgZMOpZmF1dClcbiAgICovXG4gIEBJbnB1dCgpIHJhbmdlU2l6ZTogRHNmclNpemU7XG5cbiAgLyoqIFByw6lmaXhlIGFmZmljaMOpIGF2YW50IGxlcyB2YWxldXJzICAqL1xuICBASW5wdXQoKSBwcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogU3VmZml4ZSBhZmZpY2jDqSBhcHLDqHMgbGVzIHZhbGV1cnMgICovXG4gIEBJbnB1dCgpIHN1ZmZpeDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBEw6lzYWN0aXZlciBsZSBjdXJzZXVyICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEFmZmljaGUgdW4gbWVzc2FnZSBkJ2VycmV1ciAgKi9cbiAgQElucHV0KCkgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogQGludGVybmFsIEN1cnNldXIgZG91YmxlICAqL1xuICBkb3VibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhaWxsZSBkdSBjdXJzZXVyIChTTSBldCBNRCBwb3NzaWJsZXMsIE1EIHBhciBkw6lmYXV0KVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSgxLjE1LjApIHV0aWxpc2VyICdyYW5nZVNpemUnIMOgIGxhIHBsYWNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBEc2ZyU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VTaXplO1xuICB9XG5cbiAgZ2V0IGhpbnRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgJy1oaW50LXRleHQnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhaWxsZSBkdSBjdXJzZXVyIChTTSBldCBNRCBwb3NzaWJsZXMsIE1EIHBhciBkw6lmYXV0KVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSgxLjE1LjApIHV0aWxpc2VyICdyYW5nZVNpemUnIMOgIGxhIHBsYWNlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2l6ZSh2YWx1ZTogRHNmclNpemUpIHtcbiAgICB0aGlzLnJhbmdlU2l6ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqQGludGVybmFsICovXG4gIGlzRG91YmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBpc1NtYWxsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNpemUgPT0gRHNmclNpemVDb25zdC5TTTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0VmFsdWUoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG9uSW5wdXRDaGFuZ2UoaW5kZXg6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImZyLXJhbmdlLWdyb3VwXCJcbiAgaWQ9XCJ7eyBpbnB1dElkIH19LWdyb3VwXCJcbiAgW25nQ2xhc3NdPVwieyAnZnItcmFuZ2UtZ3JvdXAtLWRpc2FibGVkJzogZGlzYWJsZWQsICdmci1yYW5nZS1ncm91cC0tZXJyb3InOiBlcnJvciB9XCI+XG4gIDxsYWJlbCBpZD1cInt7IGlucHV0SWQgfX0tbGFiZWxcIiBjbGFzcz1cImZyLWxhYmVsXCI+XG4gICAgPCEtLSBMYWJlbCBvYmxpZ2F0b2lyZSAtLT5cbiAgICBAaWYgKGxhYmVsKSB7XG4gICAgICB7eyBsYWJlbCB9fVxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgICBAaWYgKGhpbnQpIHtcbiAgICAgIDxzcGFuIGNsYXNzPVwiZnItaGludC10ZXh0XCI+e3sgaGludCB9fTwvc3Bhbj5cbiAgICB9XG4gIDwvbGFiZWw+XG4gIDxkaXZcbiAgICBjbGFzcz1cImZyLXJhbmdlXCJcbiAgICBbYXR0ci5kYXRhLWZyLXByZWZpeF09XCJwcmVmaXhcIlxuICAgIFthdHRyLmRhdGEtZnItc3VmZml4XT1cInN1ZmZpeFwiXG4gICAgW25nQ2xhc3NdPVwieyAnZnItcmFuZ2UtLWRvdWJsZSc6IGlzRG91YmxlKCksICdmci1yYW5nZS0tc20nOiBpc1NtYWxsKCksICdmci1yYW5nZS0tc3RlcCc6IHN0ZXAgfVwiPlxuICAgIDxzcGFuIGNsYXNzPVwiZnItcmFuZ2VfX291dHB1dFwiPnt7IHZhbHVlIH19PC9zcGFuPlxuICAgIEBpZiAoIWlzRG91YmxlKCkpIHtcbiAgICAgIDxpbnB1dFxuICAgICAgICBpZD1cInt7IGlucHV0SWQgfX1cIlxuICAgICAgICBuYW1lPVwie3sgaW5wdXRJZCB9fVwiXG4gICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpbnB1dElkICsgJy1sYWJlbCdcIlxuICAgICAgICBtaW49XCJ7eyBtaW4gfX1cIlxuICAgICAgICBtYXg9XCJ7eyBtYXggfX1cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbYXR0ci52YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImVycm9yID8gaW5wdXRJZCArICctbWVzc2FnZXMnIDogbnVsbFwiXG4gICAgICAgIFthdHRyLnN0ZXBdPVwic3RlcFwiIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8aW5wdXRcbiAgICAgICAgaWQ9XCJ7eyBpbnB1dElkIH19XCJcbiAgICAgICAgbmFtZT1cInt7IGlucHV0SWQgfX1cIlxuICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaW5wdXRJZCArICctbGFiZWwnXCJcbiAgICAgICAgbWluPVwie3sgbWluIH19XCJcbiAgICAgICAgbWF4PVwie3sgbWF4IH19XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2F0dHIudmFsdWVdPVwiZ2V0VmFsdWUoMClcIlxuICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZSgwKVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoMCwgJGV2ZW50KVwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZXJyb3IgPyBpbnB1dElkICsgJy1tZXNzYWdlcycgOiBudWxsXCIgLz5cbiAgICAgIDxpbnB1dFxuICAgICAgICBpZD1cInt7IGlucHV0SWQgfX0tMlwiXG4gICAgICAgIG5hbWU9XCJ7eyBpbnB1dElkIH19LTJcIlxuICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaW5wdXRJZCArICctbGFiZWwnXCJcbiAgICAgICAgbWF4PVwie3sgbWF4IH19XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2F0dHIudmFsdWVdPVwiZ2V0VmFsdWUoMSlcIlxuICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZSgxKVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoMSwgJGV2ZW50KVwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZXJyb3IgPyBpbnB1dElkICsgJy1tZXNzYWdlcycgOiBudWxsXCIgLz5cbiAgICB9XG5cbiAgICBAaWYgKCFoaWRlTWluTWF4KSB7XG4gICAgICA8c3BhbiBjbGFzcz1cImZyLXJhbmdlX19taW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAge3sgbWluIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImZyLXJhbmdlX19tYXhcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAge3sgbWF4IH19XG4gICAgICA8L3NwYW4+XG4gICAgfVxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZyLW1lc3NhZ2VzLWdyb3VwXCIgaWQ9XCJ7eyBpbnB1dElkIH19LW1lc3NhZ2VzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgQGlmIChlcnJvcikge1xuICAgICAgPHAgY2xhc3M9XCJmci1tZXNzYWdlIGZyLW1lc3NhZ2UtLWVycm9yXCIgaWQ9XCJyYW5nZS0yMzEwLW1lc3NhZ2UtZXJyb3JcIj5cbiAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgIDwvcD5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=