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

120 lines 17.3 kB
import { expect } from '@playwright/test'; export class BasePageObjectModel { constructor(page, componentName, componentType) { this.page = page; this.sbFrame = this.frame; this.componentName = componentName; this.componentType = componentType; } get frame() { return this.page.frameLocator('#storybook-preview-iframe'); } async goToPage(variant = 'default', waitUntil = 'commit') { return this.page.goto(`?path=/story/${this.componentType}-${this.componentName}--${variant}`, { waitUntil, }); } /** * Permet de passer en mode plein écran afin d'éviter que le menu ne nuise à la pertinence des tests. */ async goToFullScreen() { await this.page.getByLabel('Go full screen').click(); } /** * Test par comparaison de screenshot. Permet de prévenir les régressions visuelles sur un composant. * * @param screenshotName Nom du screenshot (souvent le nom du composant) * @param options Options possibles de la méthode toHaveScreenshot */ async testSnapshot(screenshotName, options) { await expect(this.frame.locator('.sb-show-main')).toBeVisible(); await expect(this.page).toHaveScreenshot(screenshotName + '.png', options); } /** * Permet de vérifier le bon chargement d'un svg via la reponse de sa requête http. * * @param name Nom du svg (sans l'extension '.svg'). Vérifie le chargement de n'importe quel svg si non renseigné * @returns La Requête reçue correspondant au chargement du svg */ async waitForSvg(name = '') { return this.page.waitForResponse((response) => response.url().includes(`${name}.svg`)); } /** * Test le bon chargement du svg correspondant après avoir effectué une action spécifique afin d'assurer * la cohérence graphique d'une page en cas de tests screenshot * * @param action Promise correspondant à l'action censé déclencher le chargement du nouveau svg * @param svgName Nom du svg sensé être chargé (sans l'extension '.svg'). Vérifie le chargement de n'importe quel svg si non renseigné * @returns Une Promise contenant un tableau avec en index 0 le retour de l'action effectuée et en index 1 la reponse * de la requête d'appel du svg */ async doActionAndCheckSvg(action, svgName = '') { return Promise.all([action, this.waitForSvg(svgName)]); } } /** * Permet de charger la story faisant l'objet des tests. * * @param componentName Le nom canonique du composant tel qu'il est défini dans les métadonnées * (en minuscules et espaces remplacés par des tirets du milieu) * * @param page La référence à une page Playwright (c'est à dire à un onglet unique du navigateur) * * @param variant Le nom canonique de la story (en minuscules et espaces remplacés par des tirets du milieu) * * @returns une promesse sur la réponse HTTP reçue par l'onglet du navigateur */ export async function goToComponentPage(componentName, page, variant = 'default') { return page.goto(`?path=/story/components-${componentName}--${variant}`); } /** * Permet de charger la story faisant l'objet des tests. * * @param componentName Le nom canonique du composant tel qu'il est défini dans les métadonnées * (en minuscules et espaces remplacés par des tirets du milieu) * * @param page La référence à une page Playwright (c'est à dire à un onglet unique du navigateur) * * @param variant Le nom canonique de la story (en minuscules et espaces remplacés par des tirets du milieu) * * @returns une promesse sur la réponse HTTP reçue par l'onglet du navigateur */ export async function goToFormsPage(componentName, page, variant = 'default') { return page.goto(`?path=/story/forms-${componentName}--${variant}`); } /** * Permet de récupérer l'iframe générée par Storybook pour charger la story. * * @param page La référence à une page Playwright (c'est à dire à un onglet unique du navigateur) * * @returns un locator sur l'iframe dont l'attribut id est égal à "storybook-preview-iframe" */ export function getSbFrame(page) { return page.frameLocator('#storybook-preview-iframe'); } /** * Actionne la combinaison clavier spécifiée et assure que le focus est positionné sur le bon élément en séquence. * * @param tabNavigationSequence Décrit la séquence de navigation attendue. * @param keyPressContext Fournit le locator pointant vers l'élément qui doit être actionné. * @param withShift */ export async function testTabNavigation(tabNavigationSequence, keyPressContext, withShift = false) { const keyToPress = withShift ? 'Shift+Tab' : 'Tab'; for (let navigationStepIndex in tabNavigationSequence) { await keyPressContext.press(keyToPress); await expect(tabNavigationSequence[navigationStepIndex]).toBeFocused(); } } /** * Test par comparaison de screenshot. Permet de prévenir les régressions visuelles sur un composant. * * @param page La référence à une page Playwright (c'est à dire à un onglet unique du navigateur) * @param screenshotName Nom du screenshot (souvent le nom du composant) */ export async function testSnapshot(page, screenshotName) { // Permet de passer en mode plein écran afin d'éviter que le menu ne nuise à la pertinence des tests. await page.press('body', 'Alt+F'); await expect(page).toHaveScreenshot(screenshotName + '.png'); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTJlLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zZGsvc3JjL3V0aWxzL2UyZS51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdGLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhILE1BQU0sT0FBTyxtQkFBbUI7SUFNOUIsWUFBWSxJQUFVLEVBQUUsYUFBcUIsRUFBRSxhQUFxQztRQUNsRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FDWixVQUFrQixTQUFTLEVBQzNCLFlBQWdGLFFBQVE7UUFFeEYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLE9BQU8sRUFBRSxFQUFFO1lBQzVGLFNBQVM7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYztRQUNsQixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFzQixFQUFFLE9BQStDO1FBQ3hGLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEUsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFlLEVBQUU7UUFDaEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUksTUFBa0IsRUFBRSxVQUFrQixFQUFFO1FBQ25FLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLGFBQXFCLEVBQ3JCLElBQVUsRUFDVixVQUFrQixTQUFTO0lBRTNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsYUFBYSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQ2pDLGFBQXFCLEVBQ3JCLElBQVUsRUFDVixVQUFrQixTQUFTO0lBRTNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsYUFBYSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsSUFBVTtJQUNuQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMscUJBQWdDLEVBQ2hDLGVBQXdCLEVBQ3hCLFlBQXFCLEtBQUs7SUFFMUIsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUVuRCxLQUFLLElBQUksbUJBQW1CLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLGVBQWUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsTUFBTSxNQUFNLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxJQUFVLEVBQUUsY0FBc0I7SUFDbkUscUdBQXFHO0lBQ3JHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFbEMsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGcmFtZUxvY2F0b3IsIExvY2F0b3IsIFBhZ2UsIFBhZ2VBc3NlcnRpb25zVG9IYXZlU2NyZWVuc2hvdE9wdGlvbnMsIFJlc3BvbnNlLCBleHBlY3QgfSBmcm9tICdAcGxheXdyaWdodC90ZXN0JztcblxuZXhwb3J0IGNsYXNzIEJhc2VQYWdlT2JqZWN0TW9kZWwge1xuICBwYWdlOiBQYWdlO1xuICBzYkZyYW1lOiBGcmFtZUxvY2F0b3I7XG4gIGNvbXBvbmVudE5hbWU6IHN0cmluZztcbiAgY29tcG9uZW50VHlwZTogJ2NvbXBvbmVudHMnIHwgJ2Zvcm1zJztcblxuICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlLCBjb21wb25lbnROYW1lOiBzdHJpbmcsIGNvbXBvbmVudFR5cGU6ICdjb21wb25lbnRzJyB8ICdmb3JtcycpIHtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIHRoaXMuc2JGcmFtZSA9IHRoaXMuZnJhbWU7XG4gICAgdGhpcy5jb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTtcbiAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICB9XG5cbiAgZ2V0IGZyYW1lKCk6IEZyYW1lTG9jYXRvciB7XG4gICAgcmV0dXJuIHRoaXMucGFnZS5mcmFtZUxvY2F0b3IoJyNzdG9yeWJvb2stcHJldmlldy1pZnJhbWUnKTtcbiAgfVxuXG4gIGFzeW5jIGdvVG9QYWdlKFxuICAgIHZhcmlhbnQ6IHN0cmluZyA9ICdkZWZhdWx0JyxcbiAgICB3YWl0VW50aWw6ICdsb2FkJyB8ICdkb21jb250ZW50bG9hZGVkJyB8ICduZXR3b3JraWRsZScgfCAnY29tbWl0JyB8IHVuZGVmaW5lZCA9ICdjb21taXQnLFxuICApOiBQcm9taXNlPFJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2UuZ290byhgP3BhdGg9L3N0b3J5LyR7dGhpcy5jb21wb25lbnRUeXBlfS0ke3RoaXMuY29tcG9uZW50TmFtZX0tLSR7dmFyaWFudH1gLCB7XG4gICAgICB3YWl0VW50aWwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVybWV0IGRlIHBhc3NlciBlbiBtb2RlIHBsZWluIMOpY3JhbiBhZmluIGQnw6l2aXRlciBxdWUgbGUgbWVudSBuZSBudWlzZSDDoCBsYSBwZXJ0aW5lbmNlIGRlcyB0ZXN0cy5cbiAgICovXG4gIGFzeW5jIGdvVG9GdWxsU2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFnZS5nZXRCeUxhYmVsKCdHbyBmdWxsIHNjcmVlbicpLmNsaWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBwYXIgY29tcGFyYWlzb24gZGUgc2NyZWVuc2hvdC4gUGVybWV0IGRlIHByw6l2ZW5pciBsZXMgcsOpZ3Jlc3Npb25zIHZpc3VlbGxlcyBzdXIgdW4gY29tcG9zYW50LlxuICAgKlxuICAgKiBAcGFyYW0gc2NyZWVuc2hvdE5hbWUgTm9tIGR1IHNjcmVlbnNob3QgKHNvdXZlbnQgbGUgbm9tIGR1IGNvbXBvc2FudClcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBwb3NzaWJsZXMgZGUgbGEgbcOpdGhvZGUgdG9IYXZlU2NyZWVuc2hvdFxuICAgKi9cbiAgYXN5bmMgdGVzdFNuYXBzaG90KHNjcmVlbnNob3ROYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBQYWdlQXNzZXJ0aW9uc1RvSGF2ZVNjcmVlbnNob3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMuZnJhbWUubG9jYXRvcignLnNiLXNob3ctbWFpbicpKS50b0JlVmlzaWJsZSgpO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnBhZ2UpLnRvSGF2ZVNjcmVlbnNob3Qoc2NyZWVuc2hvdE5hbWUgKyAnLnBuZycsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1ldCBkZSB2w6lyaWZpZXIgbGUgYm9uIGNoYXJnZW1lbnQgZCd1biBzdmcgdmlhIGxhIHJlcG9uc2UgZGUgc2EgcmVxdcOqdGUgaHR0cC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTm9tIGR1IHN2ZyAoc2FucyBsJ2V4dGVuc2lvbiAnLnN2ZycpLiBWw6lyaWZpZSBsZSBjaGFyZ2VtZW50IGRlIG4naW1wb3J0ZSBxdWVsIHN2ZyBzaSBub24gcmVuc2VpZ27DqVxuICAgKiBAcmV0dXJucyBMYSBSZXF1w6p0ZSByZcOndWUgY29ycmVzcG9uZGFudCBhdSBjaGFyZ2VtZW50IGR1IHN2Z1xuICAgKi9cbiAgYXN5bmMgd2FpdEZvclN2ZyhuYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5wYWdlLndhaXRGb3JSZXNwb25zZSgocmVzcG9uc2UpID0+IHJlc3BvbnNlLnVybCgpLmluY2x1ZGVzKGAke25hbWV9LnN2Z2ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IGxlIGJvbiBjaGFyZ2VtZW50IGR1IHN2ZyBjb3JyZXNwb25kYW50IGFwcsOocyBhdm9pciBlZmZlY3R1w6kgdW5lIGFjdGlvbiBzcMOpY2lmaXF1ZSBhZmluIGQnYXNzdXJlclxuICAgKiBsYSBjb2jDqXJlbmNlIGdyYXBoaXF1ZSBkJ3VuZSBwYWdlIGVuIGNhcyBkZSB0ZXN0cyBzY3JlZW5zaG90XG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb24gUHJvbWlzZSBjb3JyZXNwb25kYW50IMOgIGwnYWN0aW9uIGNlbnPDqSBkw6ljbGVuY2hlciBsZSBjaGFyZ2VtZW50IGR1IG5vdXZlYXUgc3ZnXG4gICAqIEBwYXJhbSBzdmdOYW1lIE5vbSBkdSBzdmcgc2Vuc8OpIMOqdHJlIGNoYXJnw6kgKHNhbnMgbCdleHRlbnNpb24gJy5zdmcnKS4gVsOpcmlmaWUgbGUgY2hhcmdlbWVudCBkZSBuJ2ltcG9ydGUgcXVlbCBzdmcgc2kgbm9uIHJlbnNlaWduw6lcbiAgICogQHJldHVybnMgVW5lIFByb21pc2UgY29udGVuYW50IHVuIHRhYmxlYXUgYXZlYyBlbiBpbmRleCAwIGxlIHJldG91ciBkZSBsJ2FjdGlvbiBlZmZlY3R1w6llIGV0IGVuIGluZGV4IDEgbGEgcmVwb25zZVxuICAgKiBkZSBsYSByZXF1w6p0ZSBkJ2FwcGVsIGR1IHN2Z1xuICAgKi9cbiAgYXN5bmMgZG9BY3Rpb25BbmRDaGVja1N2ZzxUPihhY3Rpb246IFByb21pc2U8VD4sIHN2Z05hbWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxBd2FpdGVkPFQgfCBSZXNwb25zZT5bXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChbYWN0aW9uLCB0aGlzLndhaXRGb3JTdmcoc3ZnTmFtZSldKTtcbiAgfVxufVxuXG4vKipcbiAqIFBlcm1ldCBkZSBjaGFyZ2VyIGxhIHN0b3J5IGZhaXNhbnQgbCdvYmpldCBkZXMgdGVzdHMuXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudE5hbWUgTGUgbm9tIGNhbm9uaXF1ZSBkdSBjb21wb3NhbnQgdGVsIHF1J2lsIGVzdCBkw6lmaW5pIGRhbnMgbGVzIG3DqXRhZG9ubsOpZXNcbiAqICAgICAgICAgICAgICAgICAgICAgIChlbiBtaW51c2N1bGVzIGV0IGVzcGFjZXMgcmVtcGxhY8OpcyBwYXIgZGVzIHRpcmV0cyBkdSBtaWxpZXUpXG4gKlxuICogQHBhcmFtIHBhZ2UgTGEgcsOpZsOpcmVuY2Ugw6AgdW5lIHBhZ2UgUGxheXdyaWdodCAoYydlc3Qgw6AgZGlyZSDDoCB1biBvbmdsZXQgdW5pcXVlIGR1IG5hdmlnYXRldXIpXG4gKlxuICogQHBhcmFtIHZhcmlhbnQgTGUgbm9tIGNhbm9uaXF1ZSBkZSBsYSBzdG9yeSAoZW4gbWludXNjdWxlcyBldCBlc3BhY2VzIHJlbXBsYWPDqXMgcGFyIGRlcyB0aXJldHMgZHUgbWlsaWV1KVxuICpcbiAqIEByZXR1cm5zIHVuZSBwcm9tZXNzZSBzdXIgbGEgcsOpcG9uc2UgSFRUUCByZcOndWUgcGFyIGwnb25nbGV0IGR1IG5hdmlnYXRldXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdvVG9Db21wb25lbnRQYWdlKFxuICBjb21wb25lbnROYW1lOiBzdHJpbmcsXG4gIHBhZ2U6IFBhZ2UsXG4gIHZhcmlhbnQ6IHN0cmluZyA9ICdkZWZhdWx0Jyxcbik6IFByb21pc2U8UmVzcG9uc2UgfCBudWxsPiB7XG4gIHJldHVybiBwYWdlLmdvdG8oYD9wYXRoPS9zdG9yeS9jb21wb25lbnRzLSR7Y29tcG9uZW50TmFtZX0tLSR7dmFyaWFudH1gKTtcbn1cblxuLyoqXG4gKiBQZXJtZXQgZGUgY2hhcmdlciBsYSBzdG9yeSBmYWlzYW50IGwnb2JqZXQgZGVzIHRlc3RzLlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnROYW1lIExlIG5vbSBjYW5vbmlxdWUgZHUgY29tcG9zYW50IHRlbCBxdSdpbCBlc3QgZMOpZmluaSBkYW5zIGxlcyBtw6l0YWRvbm7DqWVzXG4gKiAgICAgICAgICAgICAgICAgICAgICAoZW4gbWludXNjdWxlcyBldCBlc3BhY2VzIHJlbXBsYWPDqXMgcGFyIGRlcyB0aXJldHMgZHUgbWlsaWV1KVxuICpcbiAqIEBwYXJhbSBwYWdlIExhIHLDqWbDqXJlbmNlIMOgIHVuZSBwYWdlIFBsYXl3cmlnaHQgKGMnZXN0IMOgIGRpcmUgw6AgdW4gb25nbGV0IHVuaXF1ZSBkdSBuYXZpZ2F0ZXVyKVxuICpcbiAqIEBwYXJhbSB2YXJpYW50IExlIG5vbSBjYW5vbmlxdWUgZGUgbGEgc3RvcnkgKGVuIG1pbnVzY3VsZXMgZXQgZXNwYWNlcyByZW1wbGFjw6lzIHBhciBkZXMgdGlyZXRzIGR1IG1pbGlldSlcbiAqXG4gKiBAcmV0dXJucyB1bmUgcHJvbWVzc2Ugc3VyIGxhIHLDqXBvbnNlIEhUVFAgcmXDp3VlIHBhciBsJ29uZ2xldCBkdSBuYXZpZ2F0ZXVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnb1RvRm9ybXNQYWdlKFxuICBjb21wb25lbnROYW1lOiBzdHJpbmcsXG4gIHBhZ2U6IFBhZ2UsXG4gIHZhcmlhbnQ6IHN0cmluZyA9ICdkZWZhdWx0Jyxcbik6IFByb21pc2U8UmVzcG9uc2UgfCBudWxsPiB7XG4gIHJldHVybiBwYWdlLmdvdG8oYD9wYXRoPS9zdG9yeS9mb3Jtcy0ke2NvbXBvbmVudE5hbWV9LS0ke3ZhcmlhbnR9YCk7XG59XG5cbi8qKlxuICogUGVybWV0IGRlIHLDqWN1cMOpcmVyIGwnaWZyYW1lIGfDqW7DqXLDqWUgcGFyIFN0b3J5Ym9vayBwb3VyIGNoYXJnZXIgbGEgc3RvcnkuXG4gKlxuICogQHBhcmFtIHBhZ2UgTGEgcsOpZsOpcmVuY2Ugw6AgdW5lIHBhZ2UgUGxheXdyaWdodCAoYydlc3Qgw6AgZGlyZSDDoCB1biBvbmdsZXQgdW5pcXVlIGR1IG5hdmlnYXRldXIpXG4gKlxuICogQHJldHVybnMgdW4gbG9jYXRvciBzdXIgbCdpZnJhbWUgZG9udCBsJ2F0dHJpYnV0IGlkIGVzdCDDqWdhbCDDoCBcInN0b3J5Ym9vay1wcmV2aWV3LWlmcmFtZVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYkZyYW1lKHBhZ2U6IFBhZ2UpOiBGcmFtZUxvY2F0b3Ige1xuICByZXR1cm4gcGFnZS5mcmFtZUxvY2F0b3IoJyNzdG9yeWJvb2stcHJldmlldy1pZnJhbWUnKTtcbn1cblxuLyoqXG4gKiBBY3Rpb25uZSBsYSBjb21iaW5haXNvbiBjbGF2aWVyIHNww6ljaWZpw6llIGV0IGFzc3VyZSBxdWUgbGUgZm9jdXMgZXN0IHBvc2l0aW9ubsOpIHN1ciBsZSBib24gw6lsw6ltZW50IGVuIHPDqXF1ZW5jZS5cbiAqXG4gKiBAcGFyYW0gdGFiTmF2aWdhdGlvblNlcXVlbmNlIETDqWNyaXQgbGEgc8OpcXVlbmNlIGRlIG5hdmlnYXRpb24gYXR0ZW5kdWUuXG4gKiBAcGFyYW0ga2V5UHJlc3NDb250ZXh0IEZvdXJuaXQgbGUgbG9jYXRvciBwb2ludGFudCB2ZXJzIGwnw6lsw6ltZW50IHF1aSBkb2l0IMOqdHJlIGFjdGlvbm7DqS5cbiAqIEBwYXJhbSB3aXRoU2hpZnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RUYWJOYXZpZ2F0aW9uKFxuICB0YWJOYXZpZ2F0aW9uU2VxdWVuY2U6IExvY2F0b3JbXSxcbiAga2V5UHJlc3NDb250ZXh0OiBMb2NhdG9yLFxuICB3aXRoU2hpZnQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBrZXlUb1ByZXNzID0gd2l0aFNoaWZ0ID8gJ1NoaWZ0K1RhYicgOiAnVGFiJztcblxuICBmb3IgKGxldCBuYXZpZ2F0aW9uU3RlcEluZGV4IGluIHRhYk5hdmlnYXRpb25TZXF1ZW5jZSkge1xuICAgIGF3YWl0IGtleVByZXNzQ29udGV4dC5wcmVzcyhrZXlUb1ByZXNzKTtcbiAgICBhd2FpdCBleHBlY3QodGFiTmF2aWdhdGlvblNlcXVlbmNlW25hdmlnYXRpb25TdGVwSW5kZXhdKS50b0JlRm9jdXNlZCgpO1xuICB9XG59XG5cbi8qKlxuICogVGVzdCBwYXIgY29tcGFyYWlzb24gZGUgc2NyZWVuc2hvdC4gUGVybWV0IGRlIHByw6l2ZW5pciBsZXMgcsOpZ3Jlc3Npb25zIHZpc3VlbGxlcyBzdXIgdW4gY29tcG9zYW50LlxuICpcbiAqIEBwYXJhbSBwYWdlIExhIHLDqWbDqXJlbmNlIMOgIHVuZSBwYWdlIFBsYXl3cmlnaHQgKGMnZXN0IMOgIGRpcmUgw6AgdW4gb25nbGV0IHVuaXF1ZSBkdSBuYXZpZ2F0ZXVyKVxuICogQHBhcmFtIHNjcmVlbnNob3ROYW1lIE5vbSBkdSBzY3JlZW5zaG90IChzb3V2ZW50IGxlIG5vbSBkdSBjb21wb3NhbnQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0U25hcHNob3QocGFnZTogUGFnZSwgc2NyZWVuc2hvdE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBQZXJtZXQgZGUgcGFzc2VyIGVuIG1vZGUgcGxlaW4gw6ljcmFuIGFmaW4gZCfDqXZpdGVyIHF1ZSBsZSBtZW51IG5lIG51aXNlIMOgIGxhIHBlcnRpbmVuY2UgZGVzIHRlc3RzLlxuICBhd2FpdCBwYWdlLnByZXNzKCdib2R5JywgJ0FsdCtGJyk7XG5cbiAgYXdhaXQgZXhwZWN0KHBhZ2UpLnRvSGF2ZVNjcmVlbnNob3Qoc2NyZWVuc2hvdE5hbWUgKyAnLnBuZycpO1xufVxuIl19