@edugouvfr/ngx-dsfr-ext
Version:
NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)
105 lines • 19.4 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, Input, ViewEncapsulation } from '@angular/core';
import { DsfrI18nPipe, Language, newUniqueId } from '@edugouvfr/ngx-dsfr';
import { Subscription } from 'rxjs';
import { MESSAGES_EN } from './i18n/messages.en';
import { MESSAGES_FR } from './i18n/messages.fr';
import * as i0 from "@angular/core";
import * as i1 from "@edugouvfr/ngx-dsfr";
import * as i2 from "@angular/common";
export class DsfrProgressBarComponent {
constructor(i18n) {
this.i18n = i18n;
/**
* Affiche ou masque la valeur de la barre de progression, vrai par défaut.
*/
this.showValue = true;
/**
* Affiche ou masque le label de la barre de progression, vrai par défaut.
*/
this.showLabel = true;
/**
* Determine la valeur minimale et la valeur maximale de la valeur représentée dans la progress bar.
*/
this.range = { min: 0, max: 100 };
/**
* Signe d'unité ajouté à la valeur, '%' par défaut.
*/
this.unit = '%';
/**
* Stoppe l'animation de la barre si la valeur de cette dernière est indéterminée.
*/
this.stopIndeterminateAnimation = false;
/**
* Id du conteneur
* @internal */
this.progressbarId = newUniqueId();
/** Id du label
* @internal
*/
this.labelId = newUniqueId();
this.barLength = 0;
this.valueText = null;
this.subscription = new Subscription();
this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);
this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);
}
get indeterminate() {
return this.value === undefined;
}
get value() {
return this._value;
}
/**
* Valeur actuelle de la progression. La valeur `null` représente une valeur indéterminée.
*/
set value(value) {
if (typeof value !== 'number') {
this._value = undefined;
}
else {
this._value = Math.min(Math.max(this.range.min, value), this.range.max);
}
this.computeBarLength();
this.computeValueText();
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
computeBarLength() {
if (this.value !== undefined) {
const fullBarLength = this.range.max - this.range.min;
this.barLength = Math.round((this.value / fullBarLength) * 100);
}
else {
this.barLength = 25;
}
}
computeValueText() {
this.valueText = this.value !== null ? `${this.value} ${this.unit}` : null;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrProgressBarComponent, deps: [{ token: i1.DsfrI18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrProgressBarComponent, isStandalone: true, selector: "dsfr-ext-progressbar, dsfrx-progressbar", inputs: { label: "label", showValue: "showValue", showLabel: "showLabel", range: "range", unit: "unit", stopIndeterminateAnimation: "stopIndeterminateAnimation", indeterminateContextMessage: "indeterminateContextMessage", value: "value" }, ngImport: i0, template: "<p [id]=\"labelId\" class=\"fr-label\">{{ label }}</p>\n\n<div\n role=\"progressbar\"\n class=\"dsfrx-progressbar\"\n [id]=\"progressbarId\"\n [ngClass]=\"{ 'dsfrx-progressbar-indeterminate': indeterminate }\"\n [attr.aria-labelledby]=\"labelId\"\n [attr.aria-valuemin]=\"!indeterminate ? range.min : null\"\n [attr.aria-valuemax]=\"!indeterminate ? range.max : null\"\n [attr.aria-valuenow]=\"value\"\n [attr.aria-valuetext]=\"valueText\">\n <div class=\"dsfrx-progressbar-container\">\n <div\n class=\"dsfrx-progressbar-value\"\n [ngStyle]=\"{ width: barLength + '%' }\"\n [ngClass]=\"{ 'dsfrx-progressbar-value--stopped-animation': stopIndeterminateAnimation }\">\n <div class=\"dsfrx-progressbar-label\"> </div>\n </div>\n </div>\n</div>\n\n@if (indeterminate) {\n <p class=\"fr-sr-only\">{{ indeterminateContextMessage ?? ('progressbar.defaultMessage' | dsfrI18n) }}</p>\n}\n\n@if (showValue && !indeterminate) {\n <p class=\"dsfrx-progressbar-label\" aria-hidden=\"true\">{{ value }} {{ unit }}</p>\n}\n", styles: ["@charset \"UTF-8\";:root{--def-progress-bar-height: .75rem;--def-progress-bar-background: var(--background-contrast-grey-active);--def-progress-bar-border-width: 1px;--def-progress-bar-border-color: var(--border-default-blue-france);--def-progress-bar-color: var(--background-active-blue-france)}.dsfrx-progressbar{padding:2px;height:var(--progress-bar-height, var(--def-progress-bar-height));margin-top:.5rem;border-style:solid;border-color:var(--text-mention-grey);border-width:var(--progress-bar-border-width, var(--def-progress-bar-border-width))}.dsfrx-progressbar-container{height:100%;width:100%;position:relative;overflow:hidden;background:var(--progress-bar-background, var(--def-progress-bar-background));transition:width 1s ease-in-out}.dsfrx-progressbar-value{background:var(--progress-bar-color, var(--def-progress-bar-color));position:absolute;display:flex;align-items:center;justify-content:center;height:100%}.dsfrx-progressbar-label{font-size:.75rem;color:var(--text-mention-grey);margin-top:.75rem;line-height:1}.dsfrx-progressbar-indeterminate .dsfrx-progressbar-value{background:var(--progress-bar-color, var(--def-progress-bar-color));width:3rem;will-change:left,right;animation-name:example;animation-duration:2s;animation-timing-function:cubic-bezier(.65,.815,.735,.395);animation-iteration-count:infinite}.dsfrx-progressbar-indeterminate .dsfrx-progressbar-value--stopped-animation{animation-play-state:paused}@keyframes example{0%{left:-30%}to{left:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrProgressBarComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-ext-progressbar, dsfrx-progressbar', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, DsfrI18nPipe], template: "<p [id]=\"labelId\" class=\"fr-label\">{{ label }}</p>\n\n<div\n role=\"progressbar\"\n class=\"dsfrx-progressbar\"\n [id]=\"progressbarId\"\n [ngClass]=\"{ 'dsfrx-progressbar-indeterminate': indeterminate }\"\n [attr.aria-labelledby]=\"labelId\"\n [attr.aria-valuemin]=\"!indeterminate ? range.min : null\"\n [attr.aria-valuemax]=\"!indeterminate ? range.max : null\"\n [attr.aria-valuenow]=\"value\"\n [attr.aria-valuetext]=\"valueText\">\n <div class=\"dsfrx-progressbar-container\">\n <div\n class=\"dsfrx-progressbar-value\"\n [ngStyle]=\"{ width: barLength + '%' }\"\n [ngClass]=\"{ 'dsfrx-progressbar-value--stopped-animation': stopIndeterminateAnimation }\">\n <div class=\"dsfrx-progressbar-label\"> </div>\n </div>\n </div>\n</div>\n\n@if (indeterminate) {\n <p class=\"fr-sr-only\">{{ indeterminateContextMessage ?? ('progressbar.defaultMessage' | dsfrI18n) }}</p>\n}\n\n@if (showValue && !indeterminate) {\n <p class=\"dsfrx-progressbar-label\" aria-hidden=\"true\">{{ value }} {{ unit }}</p>\n}\n", styles: ["@charset \"UTF-8\";:root{--def-progress-bar-height: .75rem;--def-progress-bar-background: var(--background-contrast-grey-active);--def-progress-bar-border-width: 1px;--def-progress-bar-border-color: var(--border-default-blue-france);--def-progress-bar-color: var(--background-active-blue-france)}.dsfrx-progressbar{padding:2px;height:var(--progress-bar-height, var(--def-progress-bar-height));margin-top:.5rem;border-style:solid;border-color:var(--text-mention-grey);border-width:var(--progress-bar-border-width, var(--def-progress-bar-border-width))}.dsfrx-progressbar-container{height:100%;width:100%;position:relative;overflow:hidden;background:var(--progress-bar-background, var(--def-progress-bar-background));transition:width 1s ease-in-out}.dsfrx-progressbar-value{background:var(--progress-bar-color, var(--def-progress-bar-color));position:absolute;display:flex;align-items:center;justify-content:center;height:100%}.dsfrx-progressbar-label{font-size:.75rem;color:var(--text-mention-grey);margin-top:.75rem;line-height:1}.dsfrx-progressbar-indeterminate .dsfrx-progressbar-value{background:var(--progress-bar-color, var(--def-progress-bar-color));width:3rem;will-change:left,right;animation-name:example;animation-duration:2s;animation-timing-function:cubic-bezier(.65,.815,.735,.395);animation-iteration-count:infinite}.dsfrx-progressbar-indeterminate .dsfrx-progressbar-value--stopped-animation{animation-play-state:paused}@keyframes example{0%{left:-30%}to{left:100%}}\n"] }]
}], ctorParameters: () => [{ type: i1.DsfrI18nService }], propDecorators: { label: [{
type: Input,
args: [{ required: true }]
}], showValue: [{
type: Input
}], showLabel: [{
type: Input
}], range: [{
type: Input
}], unit: [{
type: Input
}], stopIndeterminateAnimation: [{
type: Input
}], indeterminateContextMessage: [{
type: Input
}], value: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3NiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L3NyYy9saWIvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3NiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L3NyYy9saWIvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3NiYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxZQUFZLEVBQW1CLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7QUFVakQsTUFBTSxPQUFPLHdCQUF3QjtJQXVEbkMsWUFBc0IsSUFBcUI7UUFBckIsU0FBSSxHQUFKLElBQUksQ0FBaUI7UUFqRDNDOztXQUVHO1FBQ00sY0FBUyxHQUFHLElBQUksQ0FBQztRQUUxQjs7V0FFRztRQUNNLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFMUI7O1dBRUc7UUFDTSxVQUFLLEdBQXlCLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFNUQ7O1dBRUc7UUFDTSxTQUFJLEdBQUcsR0FBRyxDQUFDO1FBRXBCOztXQUVHO1FBQ00sK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBUzVDOzt1QkFFZTtRQUNMLGtCQUFhLEdBQVcsV0FBVyxFQUFFLENBQUM7UUFFaEQ7O1dBRUc7UUFDTyxZQUFPLEdBQVcsV0FBVyxFQUFFLENBQUM7UUFFaEMsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUV0QixjQUFTLEdBQWtCLElBQUksQ0FBQztRQUdsQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsS0FBSyxDQUFDLEtBQXlCO1FBQzFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDMUIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNsRSxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RSxDQUFDOytHQWpHVSx3QkFBd0I7bUdBQXhCLHdCQUF3QixtVkNmckMsb2lDQTZCQSxtZ0REaEJZLFlBQVksNk1BQUUsWUFBWTs7NEZBRXpCLHdCQUF3QjtrQkFScEMsU0FBUzsrQkFDRSx5Q0FBeUMsaUJBR3BDLGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQztvRkFNVixLQUFLO3NCQUEvQixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFLaEIsU0FBUztzQkFBakIsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQU9HLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFtQ08sS0FBSztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEc2ZySTE4blBpcGUsIERzZnJJMThuU2VydmljZSwgTGFuZ3VhZ2UsIG5ld1VuaXF1ZUlkIH0gZnJvbSAnQGVkdWdvdXZmci9uZ3gtZHNmcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1FU1NBR0VTX0VOIH0gZnJvbSAnLi9pMThuL21lc3NhZ2VzLmVuJztcbmltcG9ydCB7IE1FU1NBR0VTX0ZSIH0gZnJvbSAnLi9pMThuL21lc3NhZ2VzLmZyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci1leHQtcHJvZ3Jlc3NiYXIsIGRzZnJ4LXByb2dyZXNzYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2dyZXNzYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvZ3Jlc3NiYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHNmckkxOG5QaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgRHNmclByb2dyZXNzQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIExhYmVsIGRlIGxhIGJhcnJlIGRlIHByb2dyZXNzaW9uLlxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgbGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQWZmaWNoZSBvdSBtYXNxdWUgbGEgdmFsZXVyIGRlIGxhIGJhcnJlIGRlIHByb2dyZXNzaW9uLCB2cmFpIHBhciBkw6lmYXV0LlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1ZhbHVlID0gdHJ1ZTtcblxuICAvKipcbiAgICogQWZmaWNoZSBvdSBtYXNxdWUgbGUgbGFiZWwgZGUgbGEgYmFycmUgZGUgcHJvZ3Jlc3Npb24sIHZyYWkgcGFyIGTDqWZhdXQuXG4gICAqL1xuICBASW5wdXQoKSBzaG93TGFiZWwgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgbGEgdmFsZXVyIG1pbmltYWxlIGV0IGxhIHZhbGV1ciBtYXhpbWFsZSBkZSBsYSB2YWxldXIgcmVwcsOpc2VudMOpZSBkYW5zIGxhIHByb2dyZXNzIGJhci5cbiAgICovXG4gIEBJbnB1dCgpIHJhbmdlOiBEc2ZyUHJvZ3Jlc3NCYXJSYW5nZSA9IHsgbWluOiAwLCBtYXg6IDEwMCB9O1xuXG4gIC8qKlxuICAgKiBTaWduZSBkJ3VuaXTDqSBham91dMOpIMOgIGxhIHZhbGV1ciwgJyUnIHBhciBkw6lmYXV0LlxuICAgKi9cbiAgQElucHV0KCkgdW5pdCA9ICclJztcblxuICAvKipcbiAgICogU3RvcHBlIGwnYW5pbWF0aW9uIGRlIGxhIGJhcnJlIHNpIGxhIHZhbGV1ciBkZSBjZXR0ZSBkZXJuacOocmUgZXN0IGluZMOpdGVybWluw6llLlxuICAgKi9cbiAgQElucHV0KCkgc3RvcEluZGV0ZXJtaW5hdGVBbmltYXRpb24gPSBmYWxzZTtcblxuICAvKipcbiAgICog8J+RkyBNZXNzYWdlIHBlcm1ldHRhbnQgZGUgY29udGV4dHVhbGlzZXIgbGUgcHJvY2Vzc3VzIGTDqWNyaXQgcGFyIGxhIGJhcnJlIGRlIHByb2dyZXNzaW9uIGVuIG1vZGUgXCJpbmTDqXRlcm1pbsOpXCIuXG4gICAqXG4gICAqIFZhbGV1ciBwYXIgZMOpZmF1dCA6IFwiQ2hhcmdlbWVudCBkZSBsJ2FnZW5kYSBlbiBjb3Vycy4gVmV1aWxsZXogcGF0aWVudGVyLlwiXG4gICAqL1xuICBASW5wdXQoKSBpbmRldGVybWluYXRlQ29udGV4dE1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSWQgZHUgY29udGVuZXVyXG4gICAqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgcHJvZ3Jlc3NiYXJJZDogc3RyaW5nID0gbmV3VW5pcXVlSWQoKTtcblxuICAvKiogSWQgZHUgbGFiZWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgbGFiZWxJZDogc3RyaW5nID0gbmV3VW5pcXVlSWQoKTtcblxuICBwcm90ZWN0ZWQgYmFyTGVuZ3RoOiBudW1iZXIgPSAwO1xuXG4gIHByb3RlY3RlZCB2YWx1ZVRleHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpMThuOiBEc2ZySTE4blNlcnZpY2UpIHtcbiAgICB0aGlzLmkxOG4uZXh0ZW5kc0xhYmVsc0J1bmRsZShMYW5ndWFnZS5FTiwgTUVTU0FHRVNfRU4pO1xuICAgIHRoaXMuaTE4bi5leHRlbmRzTGFiZWxzQnVuZGxlKExhbmd1YWdlLkZSLCBNRVNTQUdFU19GUik7XG4gIH1cblxuICBnZXQgaW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGV1ciBhY3R1ZWxsZSBkZSBsYSBwcm9ncmVzc2lvbi4gTGEgdmFsZXVyIGBudWxsYCByZXByw6lzZW50ZSB1bmUgdmFsZXVyIGluZMOpdGVybWluw6llLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5taW4oTWF0aC5tYXgodGhpcy5yYW5nZS5taW4sIHZhbHVlKSwgdGhpcy5yYW5nZS5tYXgpO1xuICAgIH1cblxuICAgIHRoaXMuY29tcHV0ZUJhckxlbmd0aCgpO1xuICAgIHRoaXMuY29tcHV0ZVZhbHVlVGV4dCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUJhckxlbmd0aCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBmdWxsQmFyTGVuZ3RoID0gdGhpcy5yYW5nZS5tYXggLSB0aGlzLnJhbmdlLm1pbjtcbiAgICAgIHRoaXMuYmFyTGVuZ3RoID0gTWF0aC5yb3VuZCgodGhpcy52YWx1ZSAvIGZ1bGxCYXJMZW5ndGgpICogMTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iYXJMZW5ndGggPSAyNTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVWYWx1ZVRleHQoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZVRleHQgPSB0aGlzLnZhbHVlICE9PSBudWxsID8gYCR7dGhpcy52YWx1ZX0gJHt0aGlzLnVuaXR9YCA6IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEc2ZyUHJvZ3Jlc3NCYXJSYW5nZSB7XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbn1cbiIsIjxwIFtpZF09XCJsYWJlbElkXCIgY2xhc3M9XCJmci1sYWJlbFwiPnt7IGxhYmVsIH19PC9wPlxuXG48ZGl2XG4gIHJvbGU9XCJwcm9ncmVzc2JhclwiXG4gIGNsYXNzPVwiZHNmcngtcHJvZ3Jlc3NiYXJcIlxuICBbaWRdPVwicHJvZ3Jlc3NiYXJJZFwiXG4gIFtuZ0NsYXNzXT1cInsgJ2RzZnJ4LXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUnOiBpbmRldGVybWluYXRlIH1cIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibGFiZWxJZFwiXG4gIFthdHRyLmFyaWEtdmFsdWVtaW5dPVwiIWluZGV0ZXJtaW5hdGUgPyByYW5nZS5taW4gOiBudWxsXCJcbiAgW2F0dHIuYXJpYS12YWx1ZW1heF09XCIhaW5kZXRlcm1pbmF0ZSA/IHJhbmdlLm1heCA6IG51bGxcIlxuICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInZhbHVlXCJcbiAgW2F0dHIuYXJpYS12YWx1ZXRleHRdPVwidmFsdWVUZXh0XCI+XG4gIDxkaXYgY2xhc3M9XCJkc2ZyeC1wcm9ncmVzc2Jhci1jb250YWluZXJcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImRzZnJ4LXByb2dyZXNzYmFyLXZhbHVlXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IGJhckxlbmd0aCArICclJyB9XCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2RzZnJ4LXByb2dyZXNzYmFyLXZhbHVlLS1zdG9wcGVkLWFuaW1hdGlvbic6IHN0b3BJbmRldGVybWluYXRlQW5pbWF0aW9uIH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkc2ZyeC1wcm9ncmVzc2Jhci1sYWJlbFwiPiZuYnNwOzwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG5AaWYgKGluZGV0ZXJtaW5hdGUpIHtcbiAgPHAgY2xhc3M9XCJmci1zci1vbmx5XCI+e3sgaW5kZXRlcm1pbmF0ZUNvbnRleHRNZXNzYWdlID8/ICgncHJvZ3Jlc3NiYXIuZGVmYXVsdE1lc3NhZ2UnIHwgZHNmckkxOG4pIH19PC9wPlxufVxuXG5AaWYgKHNob3dWYWx1ZSAmJiAhaW5kZXRlcm1pbmF0ZSkge1xuICA8cCBjbGFzcz1cImRzZnJ4LXByb2dyZXNzYmFyLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgdmFsdWUgfX0mbmJzcDt7eyB1bml0IH19PC9wPlxufVxuIl19