@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).
93 lines • 31.5 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { DsfrPanelBackgroundConst, DsfrPanelBorderConst } from '../card';
import { BasePanelComponent } from '../card/base-panel.component';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
import * as i3 from "../badges-group/badges-group.component";
import * as i4 from "../tags-group/tags-group.component";
import * as i5 from "../link/link.component";
import * as i6 from "../../shared/components/link-download/link-download.component";
import * as i7 from "../../shared/components/pictogram/pictogram.component";
export class DsfrTileComponent extends BasePanelComponent {
constructor(langService) {
super(langService);
/**
* Chemin vers le répertoire racine contenant les pictogrammes illustratifs DSFR.
*/
this.artworkDirPath = 'artwork';
/**
* Ce boolean permet de ne pas afficher d'icône (flèche).
*/
this.noIcon = false;
/**
* Rotation d'une tuile verticale sur breakpoint 'MD' ou 'LG' (au redimensionnement du contenu)
*/
this.rotateOn = undefined;
/** @deprecated utiliser `customBackground`. Active le fond de la tuile en gris clair. */
this.useGreyBackground = false;
/**
* Permet la gestion programmatique d'une navigation initiée au click sur le tile si l'input 'route' est valorisé.
* La valeur de la propriété 'route' sera transmise.
*/
this.tileSelect = new EventEmitter();
}
/** @deprecated (@since 1.9.0) utiliser `detailBottom` à la place */
set detail(value) {
this.detailBottom = value;
}
/** @internal */
getClasses() {
return {
'fr-tile': true,
'fr-enlarge-link': this.enlargeLink,
'fr-tile--download': this.download,
'fr-tile--grey': this.customBackground === DsfrPanelBackgroundConst.GREY || this.useGreyBackground,
'fr-tile--horizontal': this.horizontal,
'fr-tile--no-background': this.customBackground === DsfrPanelBackgroundConst.TRANSPARENT,
'fr-tile--no-border': this.customBorder === DsfrPanelBorderConst.NO_BORDER,
'fr-tile--no-icon': this.noIcon,
'fr-tile--shadow': this.customBorder === DsfrPanelBorderConst.SHADOW,
'fr-tile--sm': this.size === 'SM',
'fr-tile--vertical ': this.rotateOn === 'MD',
'fr-tile--vertical ': this.rotateOn === 'LG',
};
}
/**
* Dans le cas d'une route, un événement `(routeSelect)` est émis avec la valeur de la route et
* l'événement initial n'est pas propagé.
*
* @internal
*/
onLinkSelect() {
// on propage l'output, pas besoin de gérer ici un éventuel preventDefault si usage de route, c'est géré en amont
if (this.route) {
this.tileSelect.emit(this.route);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrTileComponent, deps: [{ token: i1.LangService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrTileComponent, selector: "dsfr-tile", inputs: { artworkDirPath: "artworkDirPath", artworkFilePath: "artworkFilePath", imageAlt: "imageAlt", imagePath: "imagePath", noIcon: "noIcon", rotateOn: "rotateOn", useGreyBackground: "useGreyBackground", detail: "detail" }, outputs: { tileSelect: "tileSelect" }, usesInheritance: true, ngImport: i0, template: "<div [ngClass]=\"getClasses()\">\n <div class=\"fr-tile__body\">\n <div class=\"fr-tile__content\">\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n\n <p class=\"fr-tile__desc\">\n <ng-container *ngIf=\"description\">{{ description }}</ng-container>\n <ng-content *ngIf=\"!description\" select=\"[desc]\"></ng-content>\n </p>\n\n <p class=\"fr-tile__detail\">\n <ng-container *ngIf=\"detailBottom\">{{ detailBottom }}</ng-container>\n <ng-content *ngIf=\"!detailBottom\" select=\"[detail]\"></ng-content>\n </p>\n\n <div *ngIf=\"badges || tags\" class=\"fr-tile__start\">\n <dsfr-badges-group *ngIf=\"badges\" [badges]=\"badges\"></dsfr-badges-group>\n <dsfr-tags-group *ngIf=\"tags && !badges.length\" [tags]=\"tags\"></dsfr-tags-group>\n </div>\n </div>\n </div>\n\n <!--TODO : Deprecated image \u00E0 retirer \u00E0 termes-->\n <div *ngIf=\"imagePath && !artworkFilePath && !download\" class=\"fr-tile__img\">\n <img [src]=\"imagePath\" class=\"fr-responsive-img\" [attr.alt]=\"imageAlt\" />\n <!-- L'alternative de l'image (attribut alt) doit \u00E0 priori rester vide car l'image est illustrative et ne doit pas \u00EAtre restitu\u00E9e aux technologies d\u2019assistance. Vous pouvez toutefois remplir l'alternative si vous estimer qu'elle apporte une information essentielle \u00E0 la compr\u00E9hension du contenu non pr\u00E9sente dans le texte -->\n </div>\n\n <!-- Header --------------------------------------------------------------------------------------------------------->\n <div class=\"fr-tile__header\" *ngIf=\"artworkFilePath || download\">\n <div class=\"fr-tile__pictogram\">\n <edu-pictogram\n [artworkDirPath]=\"artworkDirPath\"\n [artworkFilePath]=\"artworkFilePath\"\n [download]=\"download\"></edu-pictogram>\n </div>\n </div>\n</div>\n\n<!-- Template : Titre d'une tuile ----------------------------------------------------------------------->\n<ng-template #titleTemplate>\n <!-- FIXME on peut encore simplifier car on peut passer disabled \u00E0 DsfrLink -->\n <!--Tuile clickable-->\n <ng-container *ngIf=\"hasLink() || disabled\" [ngSwitch]=\"headingLevel\">\n <h2 class=\"fr-tile__title\" *ngSwitchCase=\"'H2'\">\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h2>\n <h3 class=\"fr-tile__title\" *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h3>\n <h4 class=\"fr-tile__title\" *ngSwitchCase=\"'H4'\">\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h4>\n <h5 class=\"fr-tile__title\" *ngSwitchCase=\"'H5'\">\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h5>\n <h6 class=\"fr-tile__title\" *ngSwitchCase=\"'H6'\">\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h6>\n </ng-container>\n\n <!-- Tuile non cliquable -->\n <ng-container *ngIf=\"!hasLink() && !disabled\" [ngSwitch]=\"headingLevel\">\n <h2 class=\"fr-tile__title\" *ngSwitchCase=\"'H2'\">\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h2>\n <h3 class=\"fr-tile__title\" *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h3>\n <h4 class=\"fr-tile__title\" *ngSwitchCase=\"'H4'\">\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h4>\n <h5 class=\"fr-tile__title\" *ngSwitchCase=\"'H5'\">\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h5>\n <h6 class=\"fr-tile__title\" *ngSwitchCase=\"'H6'\">\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h6>\n </ng-container>\n</ng-template>\n\n<!-- Template : Titre d'une tuile non cliquable ----------------------------------------------------------------------->\n<ng-template #noLinkTitleTemplate>\n <ng-container *ngIf=\"heading\">{{ heading }}</ng-container>\n <ng-container *ngIf=\"!heading\">\n <ng-template *ngTemplateOutlet=\"headingSlot\"></ng-template>\n </ng-container>\n</ng-template>\n\n<!-- Template : Titre d'une tuile cliquable --------------------------------------------------------------------------->\n<ng-template #linkTitleTemplate>\n <dsfr-link\n *ngIf=\"!download\"\n [label]=\"heading ? heading : ''\"\n [ariaLabel]=\"ariaLabel ? ariaLabel : ''\"\n [disabled]=\"disabled\"\n [link]=\"link\"\n [targetLink]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n (linkSelect)=\"onLinkSelect()\">\n <ng-template *ngTemplateOutlet=\"headingSlot\"></ng-template>\n </dsfr-link>\n <!-- Lien de t\u00E9l\u00E9chargement -->\n <edu-link-download\n *ngIf=\"download\"\n [item]=\"itemLink\"\n [downloadDirect]=\"downloadDirect\"\n [downloadAssessFile]=\"downloadAssessFile\"\n [langCode]=\"downloadLangCode\"\n (linkSelect)=\"onLinkSelect()\">\n </edu-link-download>\n</ng-template>\n\n<!-- Template : Titre dans un slot ------------------------------------------------------------------------------------>\n<ng-template #headingSlot>\n <ng-content select=\"[heading]\"></ng-content>\n</ng-template>\n", styles: [".fr-tile{height:100%}.fr-tile__start dsfr-badges-group .fr-badges-group,.fr-tile__start dsfr-badges-group .fr-tags-group,.fr-tile__start dsfr-tags-group .fr-badges-group,.fr-tile__start dsfr-tags-group .fr-tags-group{justify-content:center}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.DsfrBadgesGroupComponent, selector: "dsfr-badges-group", inputs: ["badges", "small"] }, { kind: "component", type: i4.DsfrTagsGroupComponent, selector: "dsfr-tags-group", inputs: ["tags", "mode"], outputs: ["tagSelect"] }, { kind: "component", type: i5.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"] }, { kind: "component", type: i6.LinkDownloadComponent, selector: "edu-link-download", inputs: ["customClass", "downloadDirect", "downloadAssessFile", "langCode", "item"], outputs: ["linkSelect"] }, { kind: "component", type: i7.PictogramComponent, selector: "edu-pictogram", inputs: ["artworkDirPath", "artworkFilePath", "download"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrTileComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-tile', encapsulation: ViewEncapsulation.None, template: "<div [ngClass]=\"getClasses()\">\n <div class=\"fr-tile__body\">\n <div class=\"fr-tile__content\">\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n\n <p class=\"fr-tile__desc\">\n <ng-container *ngIf=\"description\">{{ description }}</ng-container>\n <ng-content *ngIf=\"!description\" select=\"[desc]\"></ng-content>\n </p>\n\n <p class=\"fr-tile__detail\">\n <ng-container *ngIf=\"detailBottom\">{{ detailBottom }}</ng-container>\n <ng-content *ngIf=\"!detailBottom\" select=\"[detail]\"></ng-content>\n </p>\n\n <div *ngIf=\"badges || tags\" class=\"fr-tile__start\">\n <dsfr-badges-group *ngIf=\"badges\" [badges]=\"badges\"></dsfr-badges-group>\n <dsfr-tags-group *ngIf=\"tags && !badges.length\" [tags]=\"tags\"></dsfr-tags-group>\n </div>\n </div>\n </div>\n\n <!--TODO : Deprecated image \u00E0 retirer \u00E0 termes-->\n <div *ngIf=\"imagePath && !artworkFilePath && !download\" class=\"fr-tile__img\">\n <img [src]=\"imagePath\" class=\"fr-responsive-img\" [attr.alt]=\"imageAlt\" />\n <!-- L'alternative de l'image (attribut alt) doit \u00E0 priori rester vide car l'image est illustrative et ne doit pas \u00EAtre restitu\u00E9e aux technologies d\u2019assistance. Vous pouvez toutefois remplir l'alternative si vous estimer qu'elle apporte une information essentielle \u00E0 la compr\u00E9hension du contenu non pr\u00E9sente dans le texte -->\n </div>\n\n <!-- Header --------------------------------------------------------------------------------------------------------->\n <div class=\"fr-tile__header\" *ngIf=\"artworkFilePath || download\">\n <div class=\"fr-tile__pictogram\">\n <edu-pictogram\n [artworkDirPath]=\"artworkDirPath\"\n [artworkFilePath]=\"artworkFilePath\"\n [download]=\"download\"></edu-pictogram>\n </div>\n </div>\n</div>\n\n<!-- Template : Titre d'une tuile ----------------------------------------------------------------------->\n<ng-template #titleTemplate>\n <!-- FIXME on peut encore simplifier car on peut passer disabled \u00E0 DsfrLink -->\n <!--Tuile clickable-->\n <ng-container *ngIf=\"hasLink() || disabled\" [ngSwitch]=\"headingLevel\">\n <h2 class=\"fr-tile__title\" *ngSwitchCase=\"'H2'\">\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h2>\n <h3 class=\"fr-tile__title\" *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h3>\n <h4 class=\"fr-tile__title\" *ngSwitchCase=\"'H4'\">\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h4>\n <h5 class=\"fr-tile__title\" *ngSwitchCase=\"'H5'\">\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h5>\n <h6 class=\"fr-tile__title\" *ngSwitchCase=\"'H6'\">\n <ng-container *ngTemplateOutlet=\"linkTitleTemplate\"></ng-container>\n </h6>\n </ng-container>\n\n <!-- Tuile non cliquable -->\n <ng-container *ngIf=\"!hasLink() && !disabled\" [ngSwitch]=\"headingLevel\">\n <h2 class=\"fr-tile__title\" *ngSwitchCase=\"'H2'\">\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h2>\n <h3 class=\"fr-tile__title\" *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h3>\n <h4 class=\"fr-tile__title\" *ngSwitchCase=\"'H4'\">\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h4>\n <h5 class=\"fr-tile__title\" *ngSwitchCase=\"'H5'\">\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h5>\n <h6 class=\"fr-tile__title\" *ngSwitchCase=\"'H6'\">\n <ng-container *ngTemplateOutlet=\"noLinkTitleTemplate\"></ng-container>\n </h6>\n </ng-container>\n</ng-template>\n\n<!-- Template : Titre d'une tuile non cliquable ----------------------------------------------------------------------->\n<ng-template #noLinkTitleTemplate>\n <ng-container *ngIf=\"heading\">{{ heading }}</ng-container>\n <ng-container *ngIf=\"!heading\">\n <ng-template *ngTemplateOutlet=\"headingSlot\"></ng-template>\n </ng-container>\n</ng-template>\n\n<!-- Template : Titre d'une tuile cliquable --------------------------------------------------------------------------->\n<ng-template #linkTitleTemplate>\n <dsfr-link\n *ngIf=\"!download\"\n [label]=\"heading ? heading : ''\"\n [ariaLabel]=\"ariaLabel ? ariaLabel : ''\"\n [disabled]=\"disabled\"\n [link]=\"link\"\n [targetLink]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n (linkSelect)=\"onLinkSelect()\">\n <ng-template *ngTemplateOutlet=\"headingSlot\"></ng-template>\n </dsfr-link>\n <!-- Lien de t\u00E9l\u00E9chargement -->\n <edu-link-download\n *ngIf=\"download\"\n [item]=\"itemLink\"\n [downloadDirect]=\"downloadDirect\"\n [downloadAssessFile]=\"downloadAssessFile\"\n [langCode]=\"downloadLangCode\"\n (linkSelect)=\"onLinkSelect()\">\n </edu-link-download>\n</ng-template>\n\n<!-- Template : Titre dans un slot ------------------------------------------------------------------------------------>\n<ng-template #headingSlot>\n <ng-content select=\"[heading]\"></ng-content>\n</ng-template>\n", styles: [".fr-tile{height:100%}.fr-tile__start dsfr-badges-group .fr-badges-group,.fr-tile__start dsfr-badges-group .fr-tags-group,.fr-tile__start dsfr-tags-group .fr-badges-group,.fr-tile__start dsfr-tags-group .fr-tags-group{justify-content:center}\n"] }]
}], ctorParameters: function () { return [{ type: i1.LangService }]; }, propDecorators: { artworkDirPath: [{
type: Input
}], artworkFilePath: [{
type: Input
}], imageAlt: [{
type: Input
}], imagePath: [{
type: Input
}], noIcon: [{
type: Input
}], rotateOn: [{
type: Input
}], useGreyBackground: [{
type: Input
}], tileSelect: [{
type: Output
}], detail: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy90aWxlL3RpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdGlsZS90aWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7QUFRbEUsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGtCQUFrQjtJQW9DdkQsWUFBWSxXQUF3QjtRQUNsQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFwQ3JCOztXQUVHO1FBQ00sbUJBQWMsR0FBRyxTQUFTLENBQUM7UUFhcEM7O1dBRUc7UUFDTSxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXhCOztXQUVHO1FBQ00sYUFBUSxHQUE0QixTQUFTLENBQUM7UUFFdkQseUZBQXlGO1FBQ2hGLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUU1Qzs7O1dBR0c7UUFDTyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUlsRCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQWEsTUFBTSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixVQUFVO1FBQ1IsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJO1lBQ2YsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDbkMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDbEMsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyx3QkFBd0IsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQjtZQUNsRyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0Qyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssd0JBQXdCLENBQUMsV0FBVztZQUN4RixvQkFBb0IsRUFBRSxJQUFJLENBQUMsWUFBWSxLQUFLLG9CQUFvQixDQUFDLFNBQVM7WUFDMUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDL0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFlBQVksS0FBSyxvQkFBb0IsQ0FBQyxNQUFNO1lBQ3BFLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUk7WUFDakMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQzlDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSTtTQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWTtRQUNWLGlIQUFpSDtRQUNqSCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDOytHQTFFVSxpQkFBaUI7bUdBQWpCLGlCQUFpQixpVkNYOUIsdXlLQXdIQTs7NEZEN0dhLGlCQUFpQjtrQkFON0IsU0FBUzsrQkFDRSxXQUFXLGlCQUdOLGlCQUFpQixDQUFDLElBQUk7a0dBTTVCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQU1JLFVBQVU7c0JBQW5CLE1BQU07Z0JBT00sTUFBTTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRHNmclBhbmVsQmFja2dyb3VuZENvbnN0LCBEc2ZyUGFuZWxCb3JkZXJDb25zdCB9IGZyb20gJy4uL2NhcmQnO1xuaW1wb3J0IHsgQmFzZVBhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FyZC9iYXNlLXBhbmVsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItdGlsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90aWxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGlsZS5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyVGlsZUNvbXBvbmVudCBleHRlbmRzIEJhc2VQYW5lbENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBDaGVtaW4gdmVycyBsZSByw6lwZXJ0b2lyZSByYWNpbmUgY29udGVuYW50IGxlcyBwaWN0b2dyYW1tZXMgaWxsdXN0cmF0aWZzIERTRlIuXG4gICAqL1xuICBASW5wdXQoKSBhcnR3b3JrRGlyUGF0aCA9ICdhcnR3b3JrJztcblxuICAvKipcbiAgICogQ2hlbWluIHJlbGF0aWYgw6AgYXJ0d29ya0RpclBhdGggZMOpbm90YW50IGxlIGZpY2hpZXIgZCdpbGx1c3RyYXRpb24gw6AgdXRpbGlzZXIuXG4gICAqL1xuICBASW5wdXQoKSBhcnR3b3JrRmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogQGRlcHJlY2F0ZWQgKEBzaW5jZSAxLjUuMCkgKi9cbiAgQElucHV0KCkgaW1hZ2VBbHQ6IHN0cmluZztcblxuICAvKiogQGRlcHJlY2F0ZWQgKEBzaW5jZSAxLjUuMCkgdXRpbGlzZXIgYGFydHdvcmtGaWxlUGF0aGAuIFBhdGggcG91ciBzcmMgZCdpbWFnZSBkJ2lsbHVzdHJhdGlvbi4gKi9cbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENlIGJvb2xlYW4gcGVybWV0IGRlIG5lIHBhcyBhZmZpY2hlciBkJ2ljw7RuZSAoZmzDqGNoZSkuXG4gICAqL1xuICBASW5wdXQoKSBub0ljb24gPSBmYWxzZTtcblxuICAvKipcbiAgICogUm90YXRpb24gZCd1bmUgdHVpbGUgdmVydGljYWxlIHN1ciBicmVha3BvaW50ICdNRCcgb3UgJ0xHJyAoYXUgcmVkaW1lbnNpb25uZW1lbnQgZHUgY29udGVudSlcbiAgICovXG4gIEBJbnB1dCgpIHJvdGF0ZU9uOiAnTUQnIHwgJ0xHJyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKiogQGRlcHJlY2F0ZWQgdXRpbGlzZXIgYGN1c3RvbUJhY2tncm91bmRgLiBBY3RpdmUgbGUgZm9uZCBkZSBsYSB0dWlsZSBlbiBncmlzIGNsYWlyLiAqL1xuICBASW5wdXQoKSB1c2VHcmV5QmFja2dyb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgbGEgZ2VzdGlvbiBwcm9ncmFtbWF0aXF1ZSBkJ3VuZSBuYXZpZ2F0aW9uIGluaXRpw6llIGF1IGNsaWNrIHN1ciBsZSB0aWxlIHNpIGwnaW5wdXQgJ3JvdXRlJyBlc3QgdmFsb3Jpc8OpLlxuICAgKiBMYSB2YWxldXIgZGUgbGEgcHJvcHJpw6l0w6kgJ3JvdXRlJyBzZXJhIHRyYW5zbWlzZS5cbiAgICovXG4gIEBPdXRwdXQoKSB0aWxlU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IobGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlKSB7XG4gICAgc3VwZXIobGFuZ1NlcnZpY2UpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIChAc2luY2UgMS45LjApIHV0aWxpc2VyIGBkZXRhaWxCb3R0b21gIMOgIGxhIHBsYWNlICovXG4gIEBJbnB1dCgpIHNldCBkZXRhaWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZGV0YWlsQm90dG9tID0gdmFsdWU7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldENsYXNzZXMoKToge30ge1xuICAgIHJldHVybiB7XG4gICAgICAnZnItdGlsZSc6IHRydWUsXG4gICAgICAnZnItZW5sYXJnZS1saW5rJzogdGhpcy5lbmxhcmdlTGluayxcbiAgICAgICdmci10aWxlLS1kb3dubG9hZCc6IHRoaXMuZG93bmxvYWQsXG4gICAgICAnZnItdGlsZS0tZ3JleSc6IHRoaXMuY3VzdG9tQmFja2dyb3VuZCA9PT0gRHNmclBhbmVsQmFja2dyb3VuZENvbnN0LkdSRVkgfHwgdGhpcy51c2VHcmV5QmFja2dyb3VuZCxcbiAgICAgICdmci10aWxlLS1ob3Jpem9udGFsJzogdGhpcy5ob3Jpem9udGFsLFxuICAgICAgJ2ZyLXRpbGUtLW5vLWJhY2tncm91bmQnOiB0aGlzLmN1c3RvbUJhY2tncm91bmQgPT09IERzZnJQYW5lbEJhY2tncm91bmRDb25zdC5UUkFOU1BBUkVOVCxcbiAgICAgICdmci10aWxlLS1uby1ib3JkZXInOiB0aGlzLmN1c3RvbUJvcmRlciA9PT0gRHNmclBhbmVsQm9yZGVyQ29uc3QuTk9fQk9SREVSLFxuICAgICAgJ2ZyLXRpbGUtLW5vLWljb24nOiB0aGlzLm5vSWNvbixcbiAgICAgICdmci10aWxlLS1zaGFkb3cnOiB0aGlzLmN1c3RvbUJvcmRlciA9PT0gRHNmclBhbmVsQm9yZGVyQ29uc3QuU0hBRE9XLFxuICAgICAgJ2ZyLXRpbGUtLXNtJzogdGhpcy5zaXplID09PSAnU00nLFxuICAgICAgJ2ZyLXRpbGUtLXZlcnRpY2FsQG1kJzogdGhpcy5yb3RhdGVPbiA9PT0gJ01EJyxcbiAgICAgICdmci10aWxlLS12ZXJ0aWNhbEBsZyc6IHRoaXMucm90YXRlT24gPT09ICdMRycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYW5zIGxlIGNhcyBkJ3VuZSByb3V0ZSwgdW4gw6l2w6luZW1lbnQgYChyb3V0ZVNlbGVjdClgIGVzdCDDqW1pcyBhdmVjIGxhIHZhbGV1ciBkZSBsYSByb3V0ZSBldFxuICAgKiBsJ8OpdsOpbmVtZW50IGluaXRpYWwgbidlc3QgcGFzIHByb3BhZ8OpLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uTGlua1NlbGVjdCgpIHtcbiAgICAvLyBvbiBwcm9wYWdlIGwnb3V0cHV0LCBwYXMgYmVzb2luIGRlIGfDqXJlciBpY2kgdW4gw6l2ZW50dWVsIHByZXZlbnREZWZhdWx0IHNpIHVzYWdlIGRlIHJvdXRlLCBjJ2VzdCBnw6lyw6kgZW4gYW1vbnRcbiAgICBpZiAodGhpcy5yb3V0ZSkge1xuICAgICAgdGhpcy50aWxlU2VsZWN0LmVtaXQodGhpcy5yb3V0ZSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IFtuZ0NsYXNzXT1cImdldENsYXNzZXMoKVwiPlxuICA8ZGl2IGNsYXNzPVwiZnItdGlsZV9fYm9keVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmci10aWxlX19jb250ZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICA8cCBjbGFzcz1cImZyLXRpbGVfX2Rlc2NcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRlc2NyaXB0aW9uXCI+e3sgZGVzY3JpcHRpb24gfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhZGVzY3JpcHRpb25cIiBzZWxlY3Q9XCJbZGVzY11cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L3A+XG5cbiAgICAgIDxwIGNsYXNzPVwiZnItdGlsZV9fZGV0YWlsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxCb3R0b21cIj57eyBkZXRhaWxCb3R0b20gfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhZGV0YWlsQm90dG9tXCIgc2VsZWN0PVwiW2RldGFpbF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJiYWRnZXMgfHwgdGFnc1wiIGNsYXNzPVwiZnItdGlsZV9fc3RhcnRcIj5cbiAgICAgICAgPGRzZnItYmFkZ2VzLWdyb3VwICpuZ0lmPVwiYmFkZ2VzXCIgW2JhZGdlc109XCJiYWRnZXNcIj48L2RzZnItYmFkZ2VzLWdyb3VwPlxuICAgICAgICA8ZHNmci10YWdzLWdyb3VwICpuZ0lmPVwidGFncyAmJiAhYmFkZ2VzLmxlbmd0aFwiIFt0YWdzXT1cInRhZ3NcIj48L2RzZnItdGFncy1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tVE9ETyA6IERlcHJlY2F0ZWQgaW1hZ2Ugw6AgcmV0aXJlciDDoCB0ZXJtZXMtLT5cbiAgPGRpdiAqbmdJZj1cImltYWdlUGF0aCAmJiAhYXJ0d29ya0ZpbGVQYXRoICYmICFkb3dubG9hZFwiIGNsYXNzPVwiZnItdGlsZV9faW1nXCI+XG4gICAgPGltZyBbc3JjXT1cImltYWdlUGF0aFwiIGNsYXNzPVwiZnItcmVzcG9uc2l2ZS1pbWdcIiBbYXR0ci5hbHRdPVwiaW1hZ2VBbHRcIiAvPlxuICAgIDwhLS0gTCdhbHRlcm5hdGl2ZSBkZSBsJ2ltYWdlIChhdHRyaWJ1dCBhbHQpIGRvaXQgw6AgcHJpb3JpIHJlc3RlciB2aWRlIGNhciBsJ2ltYWdlIGVzdCBpbGx1c3RyYXRpdmUgZXQgbmUgZG9pdCBwYXMgw6p0cmUgcmVzdGl0dcOpZSBhdXggdGVjaG5vbG9naWVzIGTigJlhc3Npc3RhbmNlLiBWb3VzIHBvdXZleiB0b3V0ZWZvaXMgcmVtcGxpciBsJ2FsdGVybmF0aXZlIHNpIHZvdXMgZXN0aW1lciBxdSdlbGxlIGFwcG9ydGUgdW5lIGluZm9ybWF0aW9uIGVzc2VudGllbGxlIMOgIGxhIGNvbXByw6loZW5zaW9uIGR1IGNvbnRlbnUgbm9uIHByw6lzZW50ZSBkYW5zIGxlIHRleHRlIC0tPlxuICA8L2Rpdj5cblxuICA8IS0tIEhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gIDxkaXYgY2xhc3M9XCJmci10aWxlX19oZWFkZXJcIiAqbmdJZj1cImFydHdvcmtGaWxlUGF0aCB8fCBkb3dubG9hZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmci10aWxlX19waWN0b2dyYW1cIj5cbiAgICAgIDxlZHUtcGljdG9ncmFtXG4gICAgICAgIFthcnR3b3JrRGlyUGF0aF09XCJhcnR3b3JrRGlyUGF0aFwiXG4gICAgICAgIFthcnR3b3JrRmlsZVBhdGhdPVwiYXJ0d29ya0ZpbGVQYXRoXCJcbiAgICAgICAgW2Rvd25sb2FkXT1cImRvd25sb2FkXCI+PC9lZHUtcGljdG9ncmFtPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIFRlbXBsYXRlIDogVGl0cmUgZCd1bmUgdHVpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48bmctdGVtcGxhdGUgI3RpdGxlVGVtcGxhdGU+XG4gIDwhLS0gRklYTUUgb24gcGV1dCBlbmNvcmUgc2ltcGxpZmllciBjYXIgb24gcGV1dCBwYXNzZXIgZGlzYWJsZWQgw6AgRHNmckxpbmsgLS0+XG4gIDwhLS1UdWlsZSBjbGlja2FibGUtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0xpbmsoKSB8fCBkaXNhYmxlZFwiIFtuZ1N3aXRjaF09XCJoZWFkaW5nTGV2ZWxcIj5cbiAgICA8aDIgY2xhc3M9XCJmci10aWxlX190aXRsZVwiICpuZ1N3aXRjaENhc2U9XCInSDInXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlua1RpdGxlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2gyPlxuICAgIDxoMyBjbGFzcz1cImZyLXRpbGVfX3RpdGxlXCIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaW5rVGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvaDM+XG4gICAgPGg0IGNsYXNzPVwiZnItdGlsZV9fdGl0bGVcIiAqbmdTd2l0Y2hDYXNlPVwiJ0g0J1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpbmtUaXRsZVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9oND5cbiAgICA8aDUgY2xhc3M9XCJmci10aWxlX190aXRsZVwiICpuZ1N3aXRjaENhc2U9XCInSDUnXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlua1RpdGxlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2g1PlxuICAgIDxoNiBjbGFzcz1cImZyLXRpbGVfX3RpdGxlXCIgKm5nU3dpdGNoQ2FzZT1cIidINidcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaW5rVGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvaDY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gVHVpbGUgbm9uIGNsaXF1YWJsZSAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNMaW5rKCkgJiYgIWRpc2FibGVkXCIgW25nU3dpdGNoXT1cImhlYWRpbmdMZXZlbFwiPlxuICAgIDxoMiBjbGFzcz1cImZyLXRpbGVfX3RpdGxlXCIgKm5nU3dpdGNoQ2FzZT1cIidIMidcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub0xpbmtUaXRsZVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9oMj5cbiAgICA8aDMgY2xhc3M9XCJmci10aWxlX190aXRsZVwiICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9MaW5rVGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvaDM+XG4gICAgPGg0IGNsYXNzPVwiZnItdGlsZV9fdGl0bGVcIiAqbmdTd2l0Y2hDYXNlPVwiJ0g0J1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vTGlua1RpdGxlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2g0PlxuICAgIDxoNSBjbGFzcz1cImZyLXRpbGVfX3RpdGxlXCIgKm5nU3dpdGNoQ2FzZT1cIidINSdcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub0xpbmtUaXRsZVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9oNT5cbiAgICA8aDYgY2xhc3M9XCJmci10aWxlX190aXRsZVwiICpuZ1N3aXRjaENhc2U9XCInSDYnXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9MaW5rVGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvaDY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUZW1wbGF0ZSA6IFRpdHJlIGQndW5lIHR1aWxlIG5vbiBjbGlxdWFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48bmctdGVtcGxhdGUgI25vTGlua1RpdGxlVGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkaW5nXCI+e3sgaGVhZGluZyB9fTwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhlYWRpbmdcIj5cbiAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nU2xvdFwiPjwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUZW1wbGF0ZSA6IFRpdHJlIGQndW5lIHR1aWxlIGNsaXF1YWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48bmctdGVtcGxhdGUgI2xpbmtUaXRsZVRlbXBsYXRlPlxuICA8ZHNmci1saW5rXG4gICAgKm5nSWY9XCIhZG93bmxvYWRcIlxuICAgIFtsYWJlbF09XCJoZWFkaW5nID8gaGVhZGluZyA6ICcnXCJcbiAgICBbYXJpYUxhYmVsXT1cImFyaWFMYWJlbCA/IGFyaWFMYWJlbCA6ICcnXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtsaW5rXT1cImxpbmtcIlxuICAgIFt0YXJnZXRMaW5rXT1cImxpbmtUYXJnZXRcIlxuICAgIFtyb3V0ZV09XCJyb3V0ZVwiXG4gICAgW3JvdXRlUGF0aF09XCJyb3V0ZVBhdGhcIlxuICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cInJvdXRlckxpbmtBY3RpdmUgPz8gJydcIlxuICAgIFtyb3V0ZXJMaW5rRXh0cmFzXT1cInJvdXRlckxpbmtFeHRyYXNcIlxuICAgIChsaW5rU2VsZWN0KT1cIm9uTGlua1NlbGVjdCgpXCI+XG4gICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGluZ1Nsb3RcIj48L25nLXRlbXBsYXRlPlxuICA8L2RzZnItbGluaz5cbiAgPCEtLSBMaWVuIGRlIHTDqWzDqWNoYXJnZW1lbnQgLS0+XG4gIDxlZHUtbGluay1kb3dubG9hZFxuICAgICpuZ0lmPVwiZG93bmxvYWRcIlxuICAgIFtpdGVtXT1cIml0ZW1MaW5rXCJcbiAgICBbZG93bmxvYWREaXJlY3RdPVwiZG93bmxvYWREaXJlY3RcIlxuICAgIFtkb3dubG9hZEFzc2Vzc0ZpbGVdPVwiZG93bmxvYWRBc3Nlc3NGaWxlXCJcbiAgICBbbGFuZ0NvZGVdPVwiZG93bmxvYWRMYW5nQ29kZVwiXG4gICAgKGxpbmtTZWxlY3QpPVwib25MaW5rU2VsZWN0KClcIj5cbiAgPC9lZHUtbGluay1kb3dubG9hZD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGVtcGxhdGUgOiBUaXRyZSBkYW5zIHVuIHNsb3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNoZWFkaW5nU2xvdD5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2hlYWRpbmddXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==