cocori-ng
Version:
Cocori-ng is an Angular full of great components & utilites based on Material
282 lines • 37.4 kB
JavaScript
import { Injectable } from '@angular/core';
import { HelperService } from './helper/helper.service';
import * as i0 from "@angular/core";
export class ValidatorsService {
getValidationErrorMessage(error) {
const configClésErreurs = {
'required': (!error.message ? 'Veuillez saisir ce champ' : error.message),
'invalidEmailAddress': 'L\'e-mail n\'est pas valide.',
'invalidCodePostal': 'Le code postal n\'est pas valide.',
'invalidDate': "Veuillez saisir une date valide.",
'invalidHeure': "L'heure n'est pas au bon format.",
'invalideDateHeure': "La date/heure n'est pas valide.",
'regexInvalide': (!error.value.formatRegexEnClair ? 'Le format attendu est incorrect.' : `Fomat attendu : ${error.value.formatRegexEnClair}.`),
'invalidTypeMime': "Le type du document n'est pas accepté.",
'invalidTailleTotaleUpload': `La taille totale des pièces jointes est atteinte.`,
'invalidTailleUpload': `La taille limite de la pièce jointe est atteinte.`,
'datePasseeInvalide': "La date doit être dans le passé.",
'dateFutureInvalide': "La date doit être dans le future.",
'datePasseeOuPresenteInvalide': "La date doit être passée ou présente.",
'dateFutureOuPresenteInvalide': "La date doit être présente ou future.",
'invalidIMEI': "Le numéro IMEI est invalide.",
'invalidDateAnterieure': "La date doit être antérieure.",
'dateAvantUneAutre': "La date B doit être antérieure à la date A.",
'invalidNumeroTelephone': 'Le numéro de téléphone n\'est pas valide.',
'adresseMailDejaUtilisee': 'L\'adresse e-mail est déjà utilisée.',
'identiqueValidator': 'Le champ n\'est pas identique.',
'pseudoDejaUtilisee': 'Le pseudo est déjà utilisé.',
'utilisateurMajeurInvalide': 'Vous devez être majeur.',
'entierInvalide': 'Saisissez un entier.',
'auMoinsUnChampRequis': 'Veuillez saisir au moins un critère de recherche.'
};
return configClésErreurs[error.key];
}
static require(control) {
const value = HelperService.retourneNullSiNonDéfini(control.value);
if (control.hasValidator(ValidatorsService.dateValidator)) {
return value === null ? { invalidDate: true } : null;
}
else {
return value === null ? { "required": true } : null;
}
}
static emailValidator(control) {
if (!control.value)
return null;
// RFC 2822 compliant regex
if (control.value.match(/[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?/)) {
return null;
}
else {
return { 'invalidEmailAddress': true };
}
}
static dateValidator(control) {
return null;
}
static telephoneValidator(control) {
if (!control.value)
return null;
if (control.value.match(/^0[1-9](\s[0-9][0-9]){4}$/)) {
return null;
}
else {
return { 'invalidNumeroTelephone': true };
}
}
static codepostalValidator(control) {
if (!control.value)
return null;
if (control.value.match(/^(([0-8][0-9])|(9[0-5]))[0-9]{3}$/)) {
return null;
}
else {
return { 'invalidCodePostal': true };
}
}
/** VALIDATEURS DATES */
/**
* La date à valider est au format UTC : 1982-11-06T00:00:00Z
*/
// public static dateValidateurUTC(control: FormControl): any {
// if (!control.value) return null;
// const str = control.value;
// const dateValide: boolean = DateFunctions.validerDateUTC(str);
// return dateValide ? null : { 'invalidDate': true };
// }
// l'heure est au format 11h12
// public static heureValidateur(control: FormControl): any {
// if (!control.value) return null;
// const str = control.value;
// if (DateFunctions.validerUneHeure(str)) {
// return null;
// } else {
// return { 'invalidHeure': true };
// }
// }
// la date heure est au format 01/01/2018 à 12h14
// public static dateHeureValidateur(control: FormControl): any {
// if (!control.value) return null;
// const str: string = control.value;
// const valeurSplit: string[] = str.split(configdefault.date.dateTimeSeparator);
// const dateValide: boolean = DateFunctions.validerDateJJMMAAAA(valeurSplit[0]);
// const heureValide: boolean = DateFunctions.validerUneHeure(valeurSplit[1]);
// if (!dateValide) {
// return { 'invalidDate': true };
// } else if (!heureValide) {
// return { 'invalidHeure': true };
// } else {
// return null;
// }
// }
/**
* La date à valider est au format UTC : 1982-11-06T15:15:15Z
* invalideDateHeure
*/
// public static dateHeureValidateurUTC(control: FormControl): any {
// if (!control.value) return null;
// const str = control.value;
// const dateValide: boolean = DateFunctions.validerDateUTC(str);
// return dateValide ? null : { 'invalideDateHeure': true };
// }
// public static datePasséeValidateur(control: FormControl): any {
// if (!control.value) return null;
// const dates: Date[] = DateFunctions.validateurDatesAides(control.value);
// if (dates[0] >= dates[1]) {
// return {
// 'datePasseeInvalide': true
// };
// }
// return null;
// }
// public static dateFutureValidateur(control: FormControl): any {
// if (!control.value) return null;
// const dates: Date[] = DateFunctions.validateurDatesAides(control.value);
// if (dates[0] <= dates[1]) {
// return {
// 'dateFutureInvalide': true
// };
// }
// return null;
// }
// public static datePasséeOuPrésenteValidateur(control: FormControl): any {
// if (!control.value) return null;
// const dates: Date[] = DateFunctions.validateurDatesAides(control.value);
// if (dates[0] > dates[1]) {
// return {
// 'datePasseeOuPresenteInvalide': true
// };
// }
// return null;
// }
// public static dateFutureOuPrésenteValidateur(control: FormControl): any {
// if (!control.value) return null;
// const dates: Date[] = DateFunctions.validateurDatesAides(control.value);
// if (dates[0] < dates[1]) {
// return {
// 'dateFutureOuPresenteInvalide': true
// };
// }
// return null;
// }
/** / VALIDATEURS DATES */
// https://medium.com/front-end-hacking/reactive-forms-and-form-validation-with-angular-fdcbcf98e1e8
static regexValidator(regle, formatRegexEnClair) {
return (control) => {
if (!control.value)
return null;
const regexp = new RegExp(regle);
return !regexp.test(control.value) ? { 'regexInvalide': { formatRegexEnClair } } : null;
};
}
static numeroSinistreValidator(control) {
if (!control.value)
return null;
if (control.value.match(/^([A-z0-9]{2})?(L|l)[A-z0-9](T|t)[A-z0-9]{5}$/)) {
return null;
}
else {
return { 'invalidNumeroSinistre': true };
}
}
static caseACocherRequireValidator(control) {
if (control.value === true) {
return null;
}
else {
return { 'required': true };
}
}
static dateAvantUneAutre(champDateAvant, champDateAprès) {
return (group) => {
if (!group.get(champDateAvant) || !group.get(champDateAprès))
return null;
const dateDébut = group.get(champDateAvant).value;
const dateFin = group.get(champDateAprès).value;
if (dateDébut > dateFin) {
return {
'erreurDateFinAvantDébut': true
};
}
return null;
};
}
// https://gist.github.com/DiegoSalazar/4075533
static luhnValidator(control) {
let valeur = control.value;
// accept only digits, dashes or spaces
if (/[^0-9-\s]+/.test(valeur))
return { 'invalidIMEI': true };
// The Luhn Algorithm. It's so pretty.
let nCheck = 0;
let nDigit = 0;
let bEven = false;
valeur = valeur.replace(/\D/g, "");
for (let n = valeur.length - 1; n >= 0; n--) {
const cDigit = valeur.charAt(n);
nDigit = parseInt(cDigit, 10);
if (bEven) {
if ((nDigit *= 2) > 9)
nDigit -= 9;
}
nCheck += nDigit;
bEven = !bEven;
}
if (nCheck % 10 === 0) {
return null;
}
else {
return { 'invalidIMEI': true };
}
}
static identiqueValidator(controle, controleConfirme) {
return (group) => {
const password = group.controls[controle];
const confirmPassword = group.controls[controleConfirme];
if (password.value !== confirmPassword.value) {
return {
'identiqueValidator': true
};
}
};
}
static êtreMajeurValidateur(control) {
if (parseInt(control.value) >= 18) {
return null;
}
else {
return { 'utilisateurMajeurInvalide': true };
}
}
static entierValidateur(control) {
if (control.value.match(/^\d+$/)) {
return null;
}
else {
return { 'entierInvalide': true };
}
}
static auMoinsUnChampDoitEtreRequisValidateur() {
return (group) => {
let isAtLeastOne = false;
if (group && group.controls) {
for (const control in group.controls) {
if (group.controls.hasOwnProperty(control) && group.controls[control].valid && HelperService.retourneNullSiNonDéfini(group.controls[control].value)) {
isAtLeastOne = true;
break;
}
}
}
return isAtLeastOne ? null : { 'auMoinsUnChampRequis': true };
};
}
}
ValidatorsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: ValidatorsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
ValidatorsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: ValidatorsService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: ValidatorsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29jb3JpLW5nL3NyYy9mZWF0dXJlLWNvcmUvc2VydmljZS92YWxpZGF0b3JzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBV3hELE1BQU0sT0FBTyxpQkFBaUI7SUFFbkIseUJBQXlCLENBQUMsS0FBcUI7UUFFbEQsTUFBTSxpQkFBaUIsR0FBUTtZQUMzQixVQUFVLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3pFLHFCQUFxQixFQUFFLDhCQUE4QjtZQUNyRCxtQkFBbUIsRUFBRSxtQ0FBbUM7WUFDeEQsYUFBYSxFQUFFLGtDQUFrQztZQUNqRCxjQUFjLEVBQUUsa0NBQWtDO1lBQ2xELG1CQUFtQixFQUFFLGlDQUFpQztZQUN0RCxlQUFlLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxDQUFDO1lBQzlJLGlCQUFpQixFQUFFLHdDQUF3QztZQUMzRCwyQkFBMkIsRUFBRSxtREFBbUQ7WUFDaEYscUJBQXFCLEVBQUUsbURBQW1EO1lBQzFFLG9CQUFvQixFQUFFLGtDQUFrQztZQUN4RCxvQkFBb0IsRUFBRSxtQ0FBbUM7WUFDekQsOEJBQThCLEVBQUUsdUNBQXVDO1lBQ3ZFLDhCQUE4QixFQUFFLHVDQUF1QztZQUN2RSxhQUFhLEVBQUUsOEJBQThCO1lBQzdDLHVCQUF1QixFQUFF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UUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUNqSixZQUFZLEdBQUcsSUFBSSxDQUFDO3dCQUNwQixNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7WUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2xFLENBQUMsQ0FBQztJQUNOLENBQUM7OzhHQW5VUSxpQkFBaUI7a0hBQWpCLGlCQUFpQixjQUZkLE1BQU07MkZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJy4vaGVscGVyL2hlbHBlci5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWR0aW9uRXJyb3Ige1xyXG4gICAga2V5OiBzdHJpbmc7XHJcbiAgICB2YWx1ZT86IGFueTtcclxuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvcnNTZXJ2aWNlIHtcclxuXHJcbiAgICBwdWJsaWMgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShlcnJvcjogVmFsaWR0aW9uRXJyb3IpOiBhbnkge1xyXG5cclxuICAgICAgICBjb25zdCBjb25maWdDbMOpc0VycmV1cnM6IGFueSA9IHtcclxuICAgICAgICAgICAgJ3JlcXVpcmVkJzogKCFlcnJvci5tZXNzYWdlID8gJ1ZldWlsbGV6IHNhaXNpciBjZSBjaGFtcCcgOiBlcnJvci5tZXNzYWdlKSxcclxuICAgICAgICAgICAgJ2ludmFsaWRFbWFpbEFkZHJlc3MnOiAnTFxcJ2UtbWFpbCBuXFwnZXN0IHBhcyB2YWxpZGUuJyxcclxuICAgICAgICAgICAgJ2ludmFsaWRDb2RlUG9zdGFsJzogJ0xlIGNvZGUgcG9zdGFsIG5cXCdlc3QgcGFzIHZhbGlkZS4nLFxyXG4gICAgICAgICAgICAnaW52YWxpZERhdGUnOiBcIlZldWlsbGV6IHNhaXNpciB1bmUgZGF0ZSB2YWxpZGUuXCIsXHJcbiAgICAgICAgICAgICdpbnZhbGlkSGV1cmUnOiBcIkwnaGV1cmUgbidlc3QgcGFzIGF1IGJvbiBmb3JtYXQuXCIsXHJcbiAgICAgICAgICAgICdpbnZhbGlkZURhdGVIZXVyZSc6IFwiTGEgZGF0ZS9oZXVyZSBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxyXG4gICAgICAgICAgICAncmVnZXhJbnZhbGlkZSc6ICghZXJyb3IudmFsdWUuZm9ybWF0UmVnZXhFbkNsYWlyID8gJ0xlIGZvcm1hdCBhdHRlbmR1IGVzdCBpbmNvcnJlY3QuJyA6IGBGb21hdCBhdHRlbmR1IDogJHtlcnJvci52YWx1ZS5mb3JtYXRSZWdleEVuQ2xhaXJ9LmApLFxyXG4gICAgICAgICAgICAnaW52YWxpZFR5cGVNaW1lJzogXCJMZSB0eXBlIGR1IGRvY3VtZW50IG4nZXN0IHBhcyBhY2NlcHTDqS5cIixcclxuICAgICAgICAgICAgJ2ludmFsaWRUYWlsbGVUb3RhbGVVcGxvYWQnOiBgTGEgdGFpbGxlIHRvdGFsZSBkZXMgcGnDqGNlcyBqb2ludGVzIGVzdCBhdHRlaW50ZS5gLFxyXG4gICAgICAgICAgICAnaW52YWxpZFRhaWxsZVVwbG9hZCc6IGBMYSB0YWlsbGUgbGltaXRlIGRlIGxhIHBpw6hjZSBqb2ludGUgZXN0IGF0dGVpbnRlLmAsXHJcbiAgICAgICAgICAgICdkYXRlUGFzc2VlSW52YWxpZGUnOiBcIkxhIGRhdGUgZG9pdCDDqnRyZSBkYW5zIGxlIHBhc3PDqS5cIixcclxuICAgICAgICAgICAgJ2RhdGVGdXR1cmVJbnZhbGlkZSc6IFwiTGEgZGF0ZSBkb2l0IMOqdHJlIGRhbnMgbGUgZnV0dXJlLlwiLFxyXG4gICAgICAgICAgICAnZGF0ZVBhc3NlZU91UHJlc2VudGVJbnZhbGlkZSc6IFwiTGEgZGF0ZSBkb2l0IMOqdHJlIHBhc3PDqWUgb3UgcHLDqXNlbnRlLlwiLFxyXG4gICAgICAgICAgICAnZGF0ZUZ1dHVyZU91UHJlc2VudGVJbnZhbGlkZSc6IFwiTGEgZGF0ZSBkb2l0IMOqdHJlIHByw6lzZW50ZSBvdSBmdXR1cmUuXCIsXHJcbiAgICAgICAgICAgICdpbnZhbGlkSU1FSSc6IFwiTGUgbnVtw6lybyBJTUVJIGVzdCBpbnZhbGlkZS5cIixcclxuICAgICAgICAgICAgJ2ludmFsaWREYXRlQW50ZXJpZXVyZSc6IFwiTGEgZGF0ZSBkb2l0IMOqdHJlIGFudMOpcmlldXJlLlwiLFxyXG4gICAgICAgICAgICAnZGF0ZUF2YW50VW5lQXV0cmUnOiBcIkxhIGRhdGUgQiBkb2l0IMOqdHJlIGFudMOpcmlldXJlIMOgIGxhIGRhdGUgQS5cIixcclxuICAgICAgICAgICAgJ2ludmFsaWROdW1lcm9UZWxlcGhvbmUnOiAnTGUgbnVtw6lybyBkZSB0w6lsw6lwaG9uZSBuXFwnZXN0IHBhcyB2YWxpZGUuJyxcclxuICAgICAgICAgICAgJ2FkcmVzc2VNYWlsRGVqYVV0aWxpc2VlJzogJ0xcXCdhZHJlc3NlIGUtbWFpbCBlc3QgZMOpasOgIHV0aWxpc8OpZS4nLFxyXG4gICAgICAgICAgICAnaWRlbnRpcXVlVmFsaWRhdG9yJzogJ0xlIGNoYW1wIG5cXCdlc3QgcGFzIGlkZW50aXF1ZS4nLFxyXG4gICAgICAgICAgICAncHNldWRvRGVqYVV0aWxpc2VlJzogJ0xlIHBzZXVkbyBlc3QgZMOpasOgIHV0aWxpc8OpLicsXHJcbiAgICAgICAgICAgICd1dGlsaXNhdGV1ck1hamV1ckludmFsaWRlJzogJ1ZvdXMgZGV2ZXogw6p0cmUgbWFqZXVyLicsXHJcbiAgICAgICAgICAgICdlbnRpZXJJbnZhbGlkZSc6ICdTYWlzaXNzZXogdW4gZW50aWVyLicsXHJcbiAgICAgICAgICAgICdhdU1vaW5zVW5DaGFtcFJlcXVpcyc6ICdWZXVpbGxleiBzYWlzaXIgYXUgbW9pbnMgdW4gY3JpdMOocmUgZGUgcmVjaGVyY2hlLidcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gY29uZmlnQ2zDqXNFcnJldXJzW2Vycm9yLmtleV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyByZXF1aXJlKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gSGVscGVyU2VydmljZS5yZXRvdXJuZU51bGxTaU5vbkTDqWZpbmkoY29udHJvbC52YWx1ZSlcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnNTZXJ2aWNlLmRhdGVWYWxpZGF0b3IpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IHsgaW52YWxpZERhdGU6IHRydWUgfSA6IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8geyBcInJlcXVpcmVkXCI6IHRydWUgfSA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZW1haWxWYWxpZGF0b3IoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XHJcbiAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gUkZDIDI4MjIgY29tcGxpYW50IHJlZ2V4XHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUubWF0Y2goL1thLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcXC5bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSpAKD86W2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV0qW2EtekEtWjAtOV0pP1xcLikrW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV0qW2EtekEtWjAtOV0pPy8pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7ICdpbnZhbGlkRW1haWxBZGRyZXNzJzogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRhdGVWYWxpZGF0b3IoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHRlbGVwaG9uZVZhbGlkYXRvcihjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLnZhbHVlLm1hdGNoKC9eMFsxLTldKFxcc1swLTldWzAtOV0pezR9JC8pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7ICdpbnZhbGlkTnVtZXJvVGVsZXBob25lJzogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvZGVwb3N0YWxWYWxpZGF0b3IoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogYW55IHtcclxuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbC52YWx1ZS5tYXRjaCgvXigoWzAtOF1bMC05XSl8KDlbMC01XSkpWzAtOV17M30kLykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWRDb2RlUG9zdGFsJzogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVkFMSURBVEVVUlMgREFURVMgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIGRhdGUgw6AgdmFsaWRlciBlc3QgYXUgZm9ybWF0IFVUQyA6IDE5ODItMTEtMDZUMDA6MDA6MDBaXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgZGF0ZVZhbGlkYXRldXJVVEMoY29udHJvbDogRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgLy8gICAgIGlmICghY29udHJvbC52YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IHN0ciA9IGNvbnRyb2wudmFsdWU7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGRhdGVWYWxpZGU6IGJvb2xlYW4gPSBEYXRlRnVuY3Rpb25zLnZhbGlkZXJEYXRlVVRDKHN0cik7XHJcblxyXG4gICAgLy8gICAgIHJldHVybiBkYXRlVmFsaWRlID8gbnVsbCA6IHsgJ2ludmFsaWREYXRlJzogdHJ1ZSB9O1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGwnaGV1cmUgZXN0IGF1IGZvcm1hdCAxMWgxMlxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBoZXVyZVZhbGlkYXRldXIoY29udHJvbDogRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgLy8gICAgIGlmICghY29udHJvbC52YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IHN0ciA9IGNvbnRyb2wudmFsdWU7XHJcblxyXG4gICAgLy8gICAgIGlmIChEYXRlRnVuY3Rpb25zLnZhbGlkZXJVbmVIZXVyZShzdHIpKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB7ICdpbnZhbGlkSGV1cmUnOiB0cnVlIH07XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGxhIGRhdGUgaGV1cmUgZXN0IGF1IGZvcm1hdCAwMS8wMS8yMDE4IMOgIDEyaDE0XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIGRhdGVIZXVyZVZhbGlkYXRldXIoY29udHJvbDogRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgLy8gICAgIGlmICghY29udHJvbC52YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IHN0cjogc3RyaW5nID0gY29udHJvbC52YWx1ZTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgdmFsZXVyU3BsaXQ6IHN0cmluZ1tdID0gc3RyLnNwbGl0KGNvbmZpZ2RlZmF1bHQuZGF0ZS5kYXRlVGltZVNlcGFyYXRvcik7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGRhdGVWYWxpZGU6IGJvb2xlYW4gPSBEYXRlRnVuY3Rpb25zLnZhbGlkZXJEYXRlSkpNTUFBQUEodmFsZXVyU3BsaXRbMF0pO1xyXG4gICAgLy8gICAgIGNvbnN0IGhldXJlVmFsaWRlOiBib29sZWFuID0gRGF0ZUZ1bmN0aW9ucy52YWxpZGVyVW5lSGV1cmUodmFsZXVyU3BsaXRbMV0pO1xyXG5cclxuICAgIC8vICAgICBpZiAoIWRhdGVWYWxpZGUpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHsgJ2ludmFsaWREYXRlJzogdHJ1ZSB9O1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAoIWhldXJlVmFsaWRlKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB7ICdpbnZhbGlkSGV1cmUnOiB0cnVlIH07XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGEgZGF0ZSDDoCB2YWxpZGVyIGVzdCBhdSBmb3JtYXQgVVRDIDogMTk4Mi0xMS0wNlQxNToxNToxNVpcclxuICAgICAqIGludmFsaWRlRGF0ZUhldXJlXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgZGF0ZUhldXJlVmFsaWRhdGV1clVUQyhjb250cm9sOiBGb3JtQ29udHJvbCk6IGFueSB7XHJcbiAgICAvLyAgICAgaWYgKCFjb250cm9sLnZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAvLyAgICAgY29uc3Qgc3RyID0gY29udHJvbC52YWx1ZTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgZGF0ZVZhbGlkZTogYm9vbGVhbiA9IERhdGVGdW5jdGlvbnMudmFsaWRlckRhdGVVVEMoc3RyKTtcclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIGRhdGVWYWxpZGUgPyBudWxsIDogeyAnaW52YWxpZGVEYXRlSGV1cmUnOiB0cnVlIH07XHJcblxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgZGF0ZVBhc3PDqWVWYWxpZGF0ZXVyKGNvbnRyb2w6IEZvcm1Db250cm9sKTogYW55IHtcclxuICAgIC8vICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHJldHVybiBudWxsO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBkYXRlczogRGF0ZVtdID0gRGF0ZUZ1bmN0aW9ucy52YWxpZGF0ZXVyRGF0ZXNBaWRlcyhjb250cm9sLnZhbHVlKTtcclxuXHJcbiAgICAvLyAgICAgaWYgKGRhdGVzWzBdID49IGRhdGVzWzFdKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB7XHJcbiAgICAvLyAgICAgICAgICAgICAnZGF0ZVBhc3NlZUludmFsaWRlJzogdHJ1ZVxyXG4gICAgLy8gICAgICAgICB9O1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBkYXRlRnV0dXJlVmFsaWRhdGV1cihjb250cm9sOiBGb3JtQ29udHJvbCk6IGFueSB7XHJcbiAgICAvLyAgICAgaWYgKCFjb250cm9sLnZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgZGF0ZXM6IERhdGVbXSA9IERhdGVGdW5jdGlvbnMudmFsaWRhdGV1ckRhdGVzQWlkZXMoY29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChkYXRlc1swXSA8PSBkYXRlc1sxXSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4ge1xyXG4gICAgLy8gICAgICAgICAgICAgJ2RhdGVGdXR1cmVJbnZhbGlkZSc6IHRydWVcclxuICAgIC8vICAgICAgICAgfTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIHJldHVybiBudWxsO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgZGF0ZVBhc3PDqWVPdVByw6lzZW50ZVZhbGlkYXRldXIoY29udHJvbDogRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgLy8gICAgIGlmICghY29udHJvbC52YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGRhdGVzOiBEYXRlW10gPSBEYXRlRnVuY3Rpb25zLnZhbGlkYXRldXJEYXRlc0FpZGVzKGNvbnRyb2wudmFsdWUpO1xyXG5cclxuICAgIC8vICAgICBpZiAoZGF0ZXNbMF0gPiBkYXRlc1sxXSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4ge1xyXG4gICAgLy8gICAgICAgICAgICAgJ2RhdGVQYXNzZWVPdVByZXNlbnRlSW52YWxpZGUnOiB0cnVlXHJcbiAgICAvLyAgICAgICAgIH07XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIGRhdGVGdXR1cmVPdVByw6lzZW50ZVZhbGlkYXRldXIoY29udHJvbDogRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgLy8gICAgIGlmICghY29udHJvbC52YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGRhdGVzOiBEYXRlW10gPSBEYXRlRnVuY3Rpb25zLnZhbGlkYXRldXJEYXRlc0FpZGVzKGNvbnRyb2wudmFsdWUpO1xyXG5cclxuICAgIC8vICAgICBpZiAoZGF0ZXNbMF0gPCBkYXRlc1sxXSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4ge1xyXG4gICAgLy8gICAgICAgICAgICAgJ2RhdGVGdXR1cmVPdVByZXNlbnRlSW52YWxpZGUnOiB0cnVlXHJcbiAgICAvLyAgICAgICAgIH07XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKiogLyBWQUxJREFURVVSUyBEQVRFUyAqL1xyXG5cclxuICAgIC8vIGh0dHBzOi8vbWVkaXVtLmNvbS9mcm9udC1lbmQtaGFja2luZy9yZWFjdGl2ZS1mb3Jtcy1hbmQtZm9ybS12YWxpZGF0aW9uLXdpdGgtYW5ndWxhci1mZGNiY2Y5OGUxZThcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnZXhWYWxpZGF0b3IocmVnbGU6IHN0cmluZywgZm9ybWF0UmVnZXhFbkNsYWlyOiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4cDogUmVnRXhwID0gbmV3IFJlZ0V4cChyZWdsZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gIXJlZ2V4cC50ZXN0KGNvbnRyb2wudmFsdWUpID8geyAncmVnZXhJbnZhbGlkZSc6IHsgZm9ybWF0UmVnZXhFbkNsYWlyIH0gfSA6IG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG51bWVyb1NpbmlzdHJlVmFsaWRhdG9yKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUubWF0Y2goL14oW0EtejAtOV17Mn0pPyhMfGwpW0EtejAtOV0oVHx0KVtBLXowLTldezV9JC8pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7ICdpbnZhbGlkTnVtZXJvU2luaXN0cmUnOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2FzZUFDb2NoZXJSZXF1aXJlVmFsaWRhdG9yKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IGFueSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgJ3JlcXVpcmVkJzogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRhdGVBdmFudFVuZUF1dHJlKGNoYW1wRGF0ZUF2YW50OiBzdHJpbmcsIGNoYW1wRGF0ZUFwcsOoczogc3RyaW5nKTogYW55IHtcclxuICAgICAgICByZXR1cm4gKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWdyb3VwLmdldChjaGFtcERhdGVBdmFudCkgfHwgIWdyb3VwLmdldChjaGFtcERhdGVBcHLDqHMpKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVEw6lidXQ6IGFueSA9IGdyb3VwLmdldChjaGFtcERhdGVBdmFudCkudmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVGaW46IGFueSA9IGdyb3VwLmdldChjaGFtcERhdGVBcHLDqHMpLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGVEw6lidXQgPiBkYXRlRmluKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICdlcnJldXJEYXRlRmluQXZhbnREw6lidXQnOiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0RpZWdvU2FsYXphci80MDc1NTMzXHJcbiAgICBwdWJsaWMgc3RhdGljIGx1aG5WYWxpZGF0b3IoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogYW55IHtcclxuICAgICAgICBsZXQgdmFsZXVyOiBzdHJpbmcgPSBjb250cm9sLnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBhY2NlcHQgb25seSBkaWdpdHMsIGRhc2hlcyBvciBzcGFjZXNcclxuICAgICAgICBpZiAoL1teMC05LVxcc10rLy50ZXN0KHZhbGV1cikpIHJldHVybiB7ICdpbnZhbGlkSU1FSSc6IHRydWUgfTtcclxuXHJcbiAgICAgICAgLy8gVGhlIEx1aG4gQWxnb3JpdGhtLiBJdCdzIHNvIHByZXR0eS5cclxuICAgICAgICBsZXQgbkNoZWNrID0gMDtcclxuICAgICAgICBsZXQgbkRpZ2l0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCBiRXZlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YWxldXIgPSB2YWxldXIucmVwbGFjZSgvXFxEL2csIFwiXCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBuID0gdmFsZXVyLmxlbmd0aCAtIDE7IG4gPj0gMDsgbi0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNEaWdpdCA9IHZhbGV1ci5jaGFyQXQobik7XHJcbiAgICAgICAgICAgIG5EaWdpdCA9IHBhcnNlSW50KGNEaWdpdCwgMTApO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJFdmVuKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKG5EaWdpdCAqPSAyKSA+IDkpIG5EaWdpdCAtPSA5O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBuQ2hlY2sgKz0gbkRpZ2l0O1xyXG4gICAgICAgICAgICBiRXZlbiA9ICFiRXZlbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChuQ2hlY2sgJSAxMCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4geyAnaW52YWxpZElNRUknOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaWRlbnRpcXVlVmFsaWRhdG9yKGNvbnRyb2xlOiBzdHJpbmcsIGNvbnRyb2xlQ29uZmlybWU6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIChncm91cDogVW50eXBlZEZvcm1Hcm91cCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYXNzd29yZCA9IGdyb3VwLmNvbnRyb2xzW2NvbnRyb2xlXTtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlybVBhc3N3b3JkID0gZ3JvdXAuY29udHJvbHNbY29udHJvbGVDb25maXJtZV07XHJcblxyXG4gICAgICAgICAgICBpZiAocGFzc3dvcmQudmFsdWUgIT09IGNvbmZpcm1QYXNzd29yZC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAnaWRlbnRpcXVlVmFsaWRhdG9yJzogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyDDqnRyZU1hamV1clZhbGlkYXRldXIoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogYW55IHtcclxuICAgICAgICBpZiAocGFyc2VJbnQoY29udHJvbC52YWx1ZSkgPj0gMTgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgJ3V0aWxpc2F0ZXVyTWFqZXVySW52YWxpZGUnOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZW50aWVyVmFsaWRhdGV1cihjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBhbnkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnZhbHVlLm1hdGNoKC9eXFxkKyQvKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4geyAnZW50aWVySW52YWxpZGUnOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgYXVNb2luc1VuQ2hhbXBEb2l0RXRyZVJlcXVpc1ZhbGlkYXRldXIoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0F0TGVhc3RPbmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChncm91cCAmJiBncm91cC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sIGluIGdyb3VwLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGNvbnRyb2wpICYmIGdyb3VwLmNvbnRyb2xzW2NvbnRyb2xdLnZhbGlkICYmIEhlbHBlclNlcnZpY2UucmV0b3VybmVOdWxsU2lOb25Ew6lmaW5pKGdyb3VwLmNvbnRyb2xzW2NvbnRyb2xdLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0F0TGVhc3RPbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGlzQXRMZWFzdE9uZSA/IG51bGwgOiB7ICdhdU1vaW5zVW5DaGFtcFJlcXVpcyc6IHRydWUgfTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==