@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).
143 lines • 20 kB
JavaScript
import { DateUtils } from '../../shared/utils/date-utils';
export const DATE_ERROR = {
INVALID_FORMAT_DAY: 'err_invalid_format_day',
INVALID_FORMAT_MONTH: 'err_invalid_format_month',
INVALID_FORMAT_YEAR: 'err_invalid_format_year',
INVALID_DAY: 'err_invalid_day',
INVALID_MONTH: 'err_invalid_month',
INVALID_DATE: 'err_invalid_date',
REQUIRED: 'err_required',
};
/**
* Cette classe représente les valeurs saisies par un utilisateur sur 3 champs distincts, jour, mois année.
* 🔥 Bien que ces propriétés soient en théorie des nombres, à l'exécution, on reçoit des strings.
* - Chaque valeur est initialisée à `undefined` mais peut aussi avoir la valeur "" (chaine vide).
* 👆 Par défaut la date est une date UTC.
* L'objectif de la classe est de :
* - Gérer des dates saisies par l'utilisateur, potentiellement avec des valeurs `undefined` ou ""
* - Manipuler les mois de 1 à 12 (et non de 0 à 11)
* - D'encapsuler l'api [Date](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Date) et plus tard l'API Temporal
*/
export class DateModel {
constructor(fullYear, monthNum, dayNum, hourNum = 0) {
this.fullYear = fullYear;
this.monthNum = monthNum;
this.dayNum = dayNum;
this.hourNum = hourNum;
}
get month() {
return this.monthNum ? this.monthNum - 1 : -1;
}
/**
* @param value : 3 formes basiques pour utiliser la méthode
* - string : Une chaîne de caractères qui représente une date, selon le format reconnu par la méthode `Date.parse()` (ex : '04 Dec 1995 00:12:00 GMT')
* - number : Une valeur entière qui représente le nombre de millisecondes depuis le premier janvier 1970
* - date : Un objet de type date
*/
static of(value, loggerService) {
const date = DateUtils.dateUtcOfWithHours(value);
if (!date && typeof value === 'string') {
loggerService.warn(`La date '${value}' n'est pas valide`);
}
if (!date) {
return new DateModel();
}
else {
return new DateModel(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours());
}
}
isValid() {
const date = new Date(this.fullYear, this.month, this.dayNum);
// Nécessaire car les années à deux digits sont prises en compte comme des dates de format 19XX
if (DateUtils.isTwoDigitsYear(this.fullYear)) {
date.setFullYear(this.fullYear);
}
return (date.getFullYear() === Number(this.fullYear) &&
date.getMonth() === Number(this.month) &&
date.getDate() === Number(this.dayNum));
}
toDate(hourTimezoneOffset) {
let date = undefined;
let fullYear = Number(this.fullYear);
let monthNum = Number(this.monthNum);
let dayNum = Number(this.dayNum);
let hourNum = Number(this.hourNum);
// on vérifie quand même qu'on a bien affaire à des nombres
if (fullYear !== null &&
fullYear !== undefined &&
monthNum !== null &&
monthNum !== undefined &&
dayNum !== null &&
dayNum !== undefined &&
hourNum !== null &&
hourNum !== undefined &&
!isNaN(fullYear) &&
!isNaN(monthNum) &&
!isNaN(dayNum) &&
!isNaN(hourNum) &&
1 <= monthNum &&
monthNum <= 12 &&
1 <= dayNum &&
dayNum <= 31) {
const hourToOutput = hourTimezoneOffset ?? hourNum;
const dateWithoutTwoDigitsProblems = DateUtils.createDate(fullYear, this.month, dayNum, hourToOutput, typeof hourTimezoneOffset === 'number');
date = this.isValid() ? dateWithoutTwoDigitsProblems : undefined;
}
return date;
}
/**
* Valide le model.
* @param required indique si la date est requise ou non
* @return une liste de codes d'erreur ou tableau vide
*/
validate(required = false) {
const errors = [];
const dayNum = this.dayNum;
const monthNum = this.monthNum;
const fullYear = this.fullYear;
// Format
if (!this.isNumber(dayNum) || !this.isNumber(monthNum) || !this.isNumber(fullYear)) {
if (!this.isNumber(dayNum)) {
errors.push(DATE_ERROR.INVALID_FORMAT_DAY);
}
if (!this.isNumber(monthNum)) {
errors.push(DATE_ERROR.INVALID_FORMAT_MONTH);
}
if (!this.isNumber(fullYear)) {
errors.push(DATE_ERROR.INVALID_FORMAT_YEAR);
}
}
else {
// Erreur sur le jour, le mois
if (dayNum && (dayNum < 1 || dayNum > 31))
errors.push(DATE_ERROR.INVALID_DAY);
if (monthNum && (monthNum < 1 || monthNum > 12))
errors.push(DATE_ERROR.INVALID_MONTH);
}
// All touched : erreur sur la date elle-même
if (errors.length === 0 && this.allTouched()) {
// Tous les champs sont remplis, on vérifie la date
if (this.allFilled()) {
if (!this.isValid())
errors.push(DATE_ERROR.INVALID_DATE);
}
// Au moins 1 champ n'est pas rempli
else {
if (required)
errors.push(DATE_ERROR.REQUIRED);
}
}
return errors;
}
allTouched() {
return this.fullYear !== undefined && this.monthNum !== undefined && this.dayNum !== undefined;
}
allFilled() {
return !!this.dayNum && !!this.monthNum && !!this.fullYear;
}
/** @return true si undefined ou number */
isNumber(value) {
return value === undefined || !isNaN(value);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9wYXR0ZXJucy9kYXRlL2RhdGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTFELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixrQkFBa0IsRUFBRSx3QkFBd0I7SUFDNUMsb0JBQW9CLEVBQUUsMEJBQTBCO0lBQ2hELG1CQUFtQixFQUFFLHlCQUF5QjtJQUM5QyxXQUFXLEVBQUUsaUJBQWlCO0lBQzlCLGFBQWEsRUFBRSxtQkFBbUI7SUFDbEMsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxRQUFRLEVBQUUsY0FBYztDQUN6QixDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFRcEIsWUFBWSxRQUFpQixFQUFFLFFBQWlCLEVBQUUsTUFBZSxFQUFFLFVBQWtCLENBQUM7UUFDcEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVksS0FBSztRQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBZ0QsRUFBRSxhQUFrQztRQUM1RixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENB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RUFBRSxDQUFDO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUM3QyxtREFBbUQ7WUFDbkQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUNELG9DQUFvQztpQkFDL0IsQ0FBQztnQkFDSixJQUFJLFFBQVE7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO0lBQ2pHLENBQUM7SUFFTyxTQUFTO1FBQ2YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM3RCxDQUFDO0lBRUQsMENBQTBDO0lBQ2xDLFFBQVEsQ0FBQyxLQUFVO1FBQ3pCLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kYXRlLXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IERBVEVfRVJST1IgPSB7XG4gIElOVkFMSURfRk9STUFUX0RBWTogJ2Vycl9pbnZhbGlkX2Zvcm1hdF9kYXknLFxuICBJTlZBTElEX0ZPUk1BVF9NT05USDogJ2Vycl9pbnZhbGlkX2Zvcm1hdF9tb250aCcsXG4gIElOVkFMSURfRk9STUFUX1lFQVI6ICdlcnJfaW52YWxpZF9mb3JtYXRfeWVhcicsXG4gIElOVkFMSURfREFZOiAnZXJyX2ludmFsaWRfZGF5JyxcbiAgSU5WQUxJRF9NT05USDogJ2Vycl9pbnZhbGlkX21vbnRoJyxcbiAgSU5WQUxJRF9EQVRFOiAnZXJyX2ludmFsaWRfZGF0ZScsXG4gIFJFUVVJUkVEOiAnZXJyX3JlcXVpcmVkJyxcbn07XG5cbi8qKlxuICogQ2V0dGUgY2xhc3NlIHJlcHLDqXNlbnRlIGxlcyB2YWxldXJzIHNhaXNpZXMgcGFyIHVuIHV0aWxpc2F0ZXVyIHN1ciAzIGNoYW1wcyBkaXN0aW5jdHMsIGpvdXIsIG1vaXMgYW5uw6llLlxuICog8J+UpSBCaWVuIHF1ZSBjZXMgcHJvcHJpw6l0w6lzIHNvaWVudCBlbiB0aMOpb3JpZSBkZXMgbm9tYnJlcywgw6AgbCdleMOpY3V0aW9uLCBvbiByZcOnb2l0IGRlcyBzdHJpbmdzLlxuICogLSBDaGFxdWUgdmFsZXVyIGVzdCBpbml0aWFsaXPDqWUgw6AgYHVuZGVmaW5lZGAgbWFpcyBwZXV0IGF1c3NpIGF2b2lyIGxhIHZhbGV1ciBcIlwiIChjaGFpbmUgdmlkZSkuXG4gKiDwn5GGIFBhciBkw6lmYXV0IGxhIGRhdGUgZXN0IHVuZSBkYXRlIFVUQy5cbiAqIEwnb2JqZWN0aWYgZGUgbGEgY2xhc3NlIGVzdCBkZSA6XG4gKiAtIEfDqXJlciBkZXMgZGF0ZXMgc2Fpc2llcyBwYXIgbCd1dGlsaXNhdGV1ciwgcG90ZW50aWVsbGVtZW50IGF2ZWMgZGVzIHZhbGV1cnMgYHVuZGVmaW5lZGAgb3UgXCJcIlxuICogLSBNYW5pcHVsZXIgbGVzIG1vaXMgZGUgMSDDoCAxMiAoZXQgbm9uIGRlIDAgw6AgMTEpXG4gKiAtIEQnZW5jYXBzdWxlciBsJ2FwaSBbRGF0ZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZSkgZXQgcGx1cyB0YXJkIGwnQVBJIFRlbXBvcmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRlTW9kZWwge1xuICAvLyBVbmUgZGF0ZSBlc3QgbGUgbm9tYnJlIGRlIG1pbGxpc2Vjb25kZXMgw6ljb3Vsw6llcyBkZXB1aXMgbGUgcHJlbWllciBqYW52aWVyIDE5NzAgc3VyIGwnw6ljaGVsbGUgVVRDIChpZGVtIGVwb2NoIFVOSVgpXG4gIC8vIE9uIGRpc3Rpbmd1ZSBsZXMgZGF0ZXMgcmVsYXRpdmVzIGF1IHRlbXBzIHVuaXZlcnNhbCBjb29yZG9ubsOpIChVVEMpIGR1IHRlbXBzIGRlIGxhIG1hY2hpbmUgZGUgbCd1dGlsaXNhdGV1ci5cbiAgZnVsbFllYXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbW9udGhOdW06IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGF5TnVtOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGhvdXJOdW06IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihmdWxsWWVhcj86IG51bWJlciwgbW9udGhOdW0/OiBudW1iZXIsIGRheU51bT86IG51bWJlciwgaG91ck51bTogbnVtYmVyID0gMCkge1xuICAgIHRoaXMuZnVsbFllYXIgPSBmdWxsWWVhcjtcbiAgICB0aGlzLm1vbnRoTnVtID0gbW9udGhOdW07XG4gICAgdGhpcy5kYXlOdW0gPSBkYXlOdW07XG4gICAgdGhpcy5ob3VyTnVtID0gaG91ck51bTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG1vbnRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9udGhOdW0gPyB0aGlzLm1vbnRoTnVtIC0gMSA6IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSA6IDMgZm9ybWVzIGJhc2lxdWVzIHBvdXIgdXRpbGlzZXIgbGEgbcOpdGhvZGVcbiAgICogLSBzdHJpbmcgOiBVbmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBxdWkgcmVwcsOpc2VudGUgdW5lIGRhdGUsIHNlbG9uIGxlIGZvcm1hdCByZWNvbm51IHBhciBsYSBtw6l0aG9kZSBgRGF0ZS5wYXJzZSgpYCAoZXggOiAnMDQgRGVjIDE5OTUgMDA6MTI6MDAgR01UJylcbiAgICogLSBudW1iZXIgOiBVbmUgdmFsZXVyIGVudGnDqHJlIHF1aSByZXByw6lzZW50ZSBsZSBub21icmUgZGUgbWlsbGlzZWNvbmRlcyBkZXB1aXMgbGUgcHJlbWllciBqYW52aWVyIDE5NzBcbiAgICogLSBkYXRlIDogVW4gb2JqZXQgZGUgdHlwZSBkYXRlXG4gICAqL1xuICBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCB1bmRlZmluZWQgfCBudWxsLCBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlIHwgYW55KTogRGF0ZU1vZGVsIHtcbiAgICBjb25zdCBkYXRlID0gRGF0ZVV0aWxzLmRhdGVVdGNPZldpdGhIb3Vycyh2YWx1ZSk7XG5cbiAgICBpZiAoIWRhdGUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgbG9nZ2VyU2VydmljZS53YXJuKGBMYSBkYXRlICcke3ZhbHVlfScgbidlc3QgcGFzIHZhbGlkZWApO1xuICAgIH1cblxuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlTW9kZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlTW9kZWwoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpKTtcbiAgICB9XG4gIH1cblxuICBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmZ1bGxZZWFyISwgdGhpcy5tb250aCEsIHRoaXMuZGF5TnVtKTtcblxuICAgIC8vIE7DqWNlc3NhaXJlIGNhciBsZXMgYW5uw6llcyDDoCBkZXV4IGRpZ2l0cyBzb250IHByaXNlcyBlbiBjb21wdGUgY29tbWUgZGVzIGRhdGVzIGRlIGZvcm1hdCAxOVhYXG4gICAgaWYgKERhdGVVdGlscy5pc1R3b0RpZ2l0c1llYXIodGhpcy5mdWxsWWVhciEpKSB7XG4gICAgICBkYXRlLnNldEZ1bGxZZWFyKHRoaXMuZnVsbFllYXIhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSBOdW1iZXIodGhpcy5mdWxsWWVhcikgJiZcbiAgICAgIGRhdGUuZ2V0TW9udGgoKSA9PT0gTnVtYmVyKHRoaXMubW9udGgpICYmXG4gICAgICBkYXRlLmdldERhdGUoKSA9PT0gTnVtYmVyKHRoaXMuZGF5TnVtKVxuICAgICk7XG4gIH1cblxuICB0b0RhdGUoaG91clRpbWV6b25lT2Zmc2V0PzogbnVtYmVyKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGZ1bGxZZWFyID0gTnVtYmVyKHRoaXMuZnVsbFllYXIpO1xuICAgIGxldCBtb250aE51bSA9IE51bWJlcih0aGlzLm1vbnRoTnVtKTtcbiAgICBsZXQgZGF5TnVtID0gTnVtYmVyKHRoaXMuZGF5TnVtKTtcbiAgICBsZXQgaG91ck51bSA9IE51bWJlcih0aGlzLmhvdXJOdW0pO1xuXG4gICAgLy8gb24gdsOpcmlmaWUgcXVhbmQgbcOqbWUgcXUnb24gYSBiaWVuIGFmZmFpcmUgw6AgZGVzIG5vbWJyZXNcbiAgICBpZiAoXG4gICAgICBmdWxsWWVhciAhPT0gbnVsbCAmJlxuICAgICAgZnVsbFllYXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgbW9udGhOdW0gIT09IG51bGwgJiZcbiAgICAgIG1vbnRoTnVtICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGRheU51bSAhPT0gbnVsbCAmJlxuICAgICAgZGF5TnVtICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGhvdXJOdW0gIT09IG51bGwgJiZcbiAgICAgIGhvdXJOdW0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIWlzTmFOKGZ1bGxZZWFyKSAmJlxuICAgICAgIWlzTmFOKG1vbnRoTnVtKSAmJlxuICAgICAgIWlzTmFOKGRheU51bSkgJiZcbiAgICAgICFpc05hTihob3VyTnVtKSAmJlxuICAgICAgMSA8PSBtb250aE51bSAmJlxuICAgICAgbW9udGhOdW0gPD0gMTIgJiZcbiAgICAgIDEgPD0gZGF5TnVtICYmXG4gICAgICBkYXlOdW0gPD0gMzFcbiAgICApIHtcbiAgICAgIGNvbnN0IGhvdXJUb091dHB1dCA9IGhvdXJUaW1lem9uZU9mZnNldCA/PyBob3VyTnVtO1xuXG4gICAgICBjb25zdCBkYXRlV2l0aG91dFR3b0RpZ2l0c1Byb2JsZW1zID0gRGF0ZVV0aWxzLmNyZWF0ZURhdGUoXG4gICAgICAgIGZ1bGxZZWFyLFxuICAgICAgICB0aGlzLm1vbnRoLFxuICAgICAgICBkYXlOdW0sXG4gICAgICAgIGhvdXJUb091dHB1dCxcbiAgICAgICAgdHlwZW9mIGhvdXJUaW1lem9uZU9mZnNldCA9PT0gJ251bWJlcicsXG4gICAgICApO1xuXG4gICAgICBkYXRlID0gdGhpcy5pc1ZhbGlkKCkgPyBkYXRlV2l0aG91dFR3b0RpZ2l0c1Byb2JsZW1zIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkZSBsZSBtb2RlbC5cbiAgICogQHBhcmFtIHJlcXVpcmVkIGluZGlxdWUgc2kgbGEgZGF0ZSBlc3QgcmVxdWlzZSBvdSBub25cbiAgICogQHJldHVybiB1bmUgbGlzdGUgZGUgY29kZXMgZCdlcnJldXIgb3UgdGFibGVhdSB2aWRlXG4gICAqL1xuICB2YWxpZGF0ZShyZXF1aXJlZCA9IGZhbHNlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGNvbnN0IGRheU51bSA9IHRoaXMuZGF5TnVtO1xuICAgIGNvbnN0IG1vbnRoTnVtID0gdGhpcy5tb250aE51bTtcbiAgICBjb25zdCBmdWxsWWVhciA9IHRoaXMuZnVsbFllYXI7XG5cbiAgICAvLyBGb3JtYXRcbiAgICBpZiAoIXRoaXMuaXNOdW1iZXIoZGF5TnVtKSB8fCAhdGhpcy5pc051bWJlcihtb250aE51bSkgfHwgIXRoaXMuaXNOdW1iZXIoZnVsbFllYXIpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNOdW1iZXIoZGF5TnVtKSkge1xuICAgICAgICBlcnJvcnMucHVzaChEQVRFX0VSUk9SLklOVkFMSURfRk9STUFUX0RBWSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNOdW1iZXIobW9udGhOdW0pKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKERBVEVfRVJST1IuSU5WQUxJRF9GT1JNQVRfTU9OVEgpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzTnVtYmVyKGZ1bGxZZWFyKSkge1xuICAgICAgICBlcnJvcnMucHVzaChEQVRFX0VSUk9SLklOVkFMSURfRk9STUFUX1lFQVIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFcnJldXIgc3VyIGxlIGpvdXIsIGxlIG1vaXNcbiAgICAgIGlmIChkYXlOdW0gJiYgKGRheU51bSA8IDEgfHwgZGF5TnVtID4gMzEpKSBlcnJvcnMucHVzaChEQVRFX0VSUk9SLklOVkFMSURfREFZKTtcbiAgICAgIGlmIChtb250aE51bSAmJiAobW9udGhOdW0gPCAxIHx8IG1vbnRoTnVtID4gMTIpKSBlcnJvcnMucHVzaChEQVRFX0VSUk9SLklOVkFMSURfTU9OVEgpO1xuICAgIH1cblxuICAgIC8vIEFsbCB0b3VjaGVkIDogZXJyZXVyIHN1ciBsYSBkYXRlIGVsbGUtbcOqbWVcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmFsbFRvdWNoZWQoKSkge1xuICAgICAgLy8gVG91cyBsZXMgY2hhbXBzIHNvbnQgcmVtcGxpcywgb24gdsOpcmlmaWUgbGEgZGF0ZVxuICAgICAgaWYgKHRoaXMuYWxsRmlsbGVkKCkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgZXJyb3JzLnB1c2goREFURV9FUlJPUi5JTlZBTElEX0RBVEUpO1xuICAgICAgfVxuICAgICAgLy8gQXUgbW9pbnMgMSBjaGFtcCBuJ2VzdCBwYXMgcmVtcGxpXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSBlcnJvcnMucHVzaChEQVRFX0VSUk9SLlJFUVVJUkVEKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxUb3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZ1bGxZZWFyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5tb250aE51bSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZGF5TnVtICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFsbEZpbGxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRheU51bSAmJiAhIXRoaXMubW9udGhOdW0gJiYgISF0aGlzLmZ1bGxZZWFyO1xuICB9XG5cbiAgLyoqIEByZXR1cm4gdHJ1ZSBzaSB1bmRlZmluZWQgb3UgbnVtYmVyICovXG4gIHByaXZhdGUgaXNOdW1iZXIodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFpc05hTih2YWx1ZSk7XG4gIH1cbn1cbiJdfQ==