@acorex/core 5.0.45 → 5.0.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,10 @@ export class JalaliCalendar {
6
6
  this.dayNames = ("شنبه_یکشنبه_دوشنبه_سه شنبه_چهارشنبه_پنج شنبه_جمعه").split("_");
7
7
  this.dayShortNames = "ش_ی_د_س_چ_پ_ج".split("_");
8
8
  }
9
+ create(value) {
10
+ const a = this.toGregorian(value.year, value.month, value.date);
11
+ return new AXDateTime(new Date(a.getFullYear(), a.getMonth(), a.getDate(), value.hours || 0, value.minutes || 0, value.seconds || 0, value.ms || 0), this.name());
12
+ }
9
13
  name() {
10
14
  return 'jalali';
11
15
  }
@@ -48,14 +52,10 @@ export class JalaliCalendar {
48
52
  let jd = this.dayOfMonth(date);
49
53
  let jm = this.monthOfYear(date);
50
54
  let jy = this.year(date);
51
- jm = (jm + amount) % 12;
52
- if (0 > jm) {
53
- jy += (this.monthOfYear(date) + amount - jm - 12) / 12;
54
- jm += 12;
55
- }
56
- else {
57
- jy += ((this.monthOfYear(date) + amount - jm) / 12);
58
- }
55
+ const nm = (jm + amount);
56
+ const ny = (nm % 12) ? Math.floor(nm / 12) : 0;
57
+ jy += ny;
58
+ jm = nm - (ny * 12);
59
59
  const vv = this.toGregorian(jy, jm, jd);
60
60
  v.setFullYear(vv.getFullYear());
61
61
  v.setMonth(vv.getMonth());
@@ -68,6 +68,10 @@ export class JalaliCalendar {
68
68
  break;
69
69
  case 'year':
70
70
  {
71
+ // const v = new Date(value);
72
+ // v.setFullYear(v.getFullYear() + amount);
73
+ // value = v.valueOf();
74
+ // break
71
75
  const v = new Date(value);
72
76
  let jd = this.dayOfMonth(date);
73
77
  let jm = this.monthOfYear(date);
@@ -77,8 +81,8 @@ export class JalaliCalendar {
77
81
  v.setMonth(vv.getMonth());
78
82
  v.setDate(vv.getDate());
79
83
  value = v.valueOf();
84
+ break;
80
85
  }
81
- break;
82
86
  case 'day':
83
87
  default:
84
88
  value += 86400000 * amount;
@@ -86,7 +90,35 @@ export class JalaliCalendar {
86
90
  return new AXDateTime(new Date(value), this.name());
87
91
  }
88
92
  set(date, unit, value) {
89
- throw new Error("Method not implemented.");
93
+ const clone = new Date(date.valueOf());
94
+ const jDate = this.toJalali(clone);
95
+ switch (unit) {
96
+ case 'second':
97
+ clone.setHours(clone.getHours(), clone.getMinutes(), value, clone.getMilliseconds());
98
+ break;
99
+ case 'minute':
100
+ clone.setHours(clone.getHours(), value, clone.getSeconds(), clone.getMilliseconds());
101
+ break;
102
+ case 'hour':
103
+ clone.setHours(value, clone.getMinutes(), clone.getSeconds(), clone.getMilliseconds());
104
+ break;
105
+ default:
106
+ case 'day':
107
+ const gDate = this.toGregorian(jDate.year, jDate.month, value);
108
+ clone.setDate(gDate.getDate());
109
+ break;
110
+ case "week":
111
+ break;
112
+ case "month":
113
+ const gDate2 = this.toGregorian(jDate.year, value, jDate.day);
114
+ clone.setMonth(gDate2.getMonth());
115
+ break;
116
+ case "year":
117
+ const gDate3 = this.toGregorian(value, jDate.month, jDate.day);
118
+ clone.setFullYear(gDate3.getFullYear());
119
+ break;
120
+ }
121
+ return new AXDateTime(clone, this.name());
90
122
  }
91
123
  startOf(date, unit) {
92
124
  const clone = new Date(date.valueOf());
@@ -324,4 +356,4 @@ export class JalaliCalendar {
324
356
  return a - ~~(a / b) * b;
325
357
  }
326
358
  }
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamFsYWxpLmNhbGVuZGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNvcmV4L2NvcmUvc3JjL2xpYi9kYXRlVGltZS9qYWxhbGkuY2FsZW5kYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBRXBFLE1BQU0sT0FBTyxjQUFjO0lBQTNCO1FBRUksZUFBVSxHQUFHLENBQUMsb0VBQW9FLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0Ysb0JBQWUsR0FBRyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXBHLGFBQVEsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTVFLGtCQUFhLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQW1YOUMsQ0FBQztJQWpYRyxJQUFJO1FBQ0EsT0FBTyxRQUFRLENBQUE7SUFDbkIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbkMsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFVO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFB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TUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBVSxFQUFFLElBQWM7UUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkMsUUFBUSxJQUFJLEVBQUU7WUFDVixLQUFLLFFBQVE7Z0JBQ1QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsS0FBSyxRQUFRO2dCQUNULEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLEtBQUssTUFBTTtnQkFDUCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxRQUFRO1lBQ1IsS0FBSyxLQUFLO2dCQUNOLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLEtBQUssTUFBTTtnQkFD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QUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN2QyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNyRCxPQUFPO1lBQ0gsRUFBRSxFQUFFLEVBQUU7WUFDSixFQUFFLEVBQUUsRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFO1NBQ1gsQ0FBQTtJQUNMLENBQUM7SUFFRDs7TUFFRTtJQUNNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ3BCLENBQUM7SUFFTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzVCLENBQUM7Q0FFSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYQ2FsZW5kYXIsIEFYRGF0ZVRpbWUsIFRpbWVVbml0IH0gZnJvbSBcIi4vZGF0ZXRpbWUuY2xhc3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBKYWxhbGlDYWxlbmRhciBpbXBsZW1lbnRzIEFYQ2FsZW5kYXIge1xyXG5cclxuICAgIG1vbnRoTmFtZXMgPSAoXCLZgdix2YjYsdiv24zZhl/Yp9ix2K/bjNio2YfYtNiqX9iu2LHYr9in2K9f2KrbjNixX9mF2LHYr9in2K9f2LTZh9ix24zZiNixX9mF2YfYsV/Yotio2KfZhl/Yotiw2LFf2K/bjF/YqNmH2YXZhl/Yp9iz2YHZhtivXCIpLnNwbGl0KFwiX1wiKTtcclxuXHJcbiAgICBtb250aFNob3J0TmFtZXMgPSAoXCLZgdix2YjYsdiv24zZhl/Yp9ix2K/bjNio2YfYtNiqX9iu2LHYr9in2K9f2KrbjNixX9mF2LHYr9in2K9f2LTZh9ix24zZiNixX9mF2YfYsV/Yotio2KfZhl/Yotiw2LFf2K/bjF/YqNmH2YXZhl/Yp9iz2YHZhtivXCIpLnNwbGl0KFwiX1wiKTtcclxuXHJcbiAgICBkYXlOYW1lcyA9IChcIti02YbYqNmHX9uM2qnYtNmG2KjZh1/Yr9mI2LTZhtio2Ydf2LPZhyDYtNmG2KjZh1/ahtmH2KfYsdi02YbYqNmHX9m+2YbYrCDYtNmG2KjZh1/YrNmF2LnZh1wiKS5zcGxpdChcIl9cIik7XHJcblxyXG4gICAgZGF5U2hvcnROYW1lcyA9IFwi2LRf24xf2K9f2LNf2oZf2b5f2KxcIi5zcGxpdChcIl9cIilcclxuXHJcbiAgICBuYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdqYWxhbGknXHJcbiAgICB9XHJcblxyXG4gICAgZGF5T2ZNb250aChkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b0phbGFsaShkYXRlKS5kYXk7XHJcbiAgICB9XHJcblxyXG4gICAgZGF5T2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGogPSB0aGlzLnRvSmFsYWxpKGRhdGUpO1xyXG4gICAgICAgIHJldHVybiAoai5tb250aCA8PSA2ID8gKChqLm1vbnRoIC0gMSkgKiAzMSkgOiAoKDYgKiAzMSkgKyAoai5tb250aCAtIDcpICogMzApKSArIGouZGF5O1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mV2VlayhkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXkoKSA9PSA2ID8gMSA6IGRhdGUuZ2V0RGF5KCkgKyAyO1xyXG4gICAgfVxyXG5cclxuICAgIHdlZWtPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgLy9UT0RPIDogYXBwbHkgamFsYWxpXHJcbiAgICAgICAgY29uc3QgZmlyc3REYXkgPSBuZXcgQVhEYXRlVGltZShkYXRlKS5zdGFydE9mKCd5ZWFyJyk7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCgoKChkYXRlLmdldFRpbWUoKSAtIGZpcnN0RGF5LmRhdGUuZ2V0VGltZSgpKSAvIDg2NDAwMDAwKSArIGZpcnN0RGF5LmRhdGUuZ2V0RGF5KCkgKyAxKSAvIDcpO1xyXG4gICAgfVxyXG5cclxuICAgIHllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9KYWxhbGkoZGF0ZSkueWVhcjtcclxuICAgIH1cclxuXHJcbiAgICBtb250aE9mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b0phbGFsaShkYXRlKS5tb250aDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYWRkKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCBhbW91bnQ6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xyXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gMTAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA2MDAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gMzYwMDAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqZCA9IHRoaXMuZGF5T2ZNb250aChkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgam0gPSB0aGlzLm1vbnRoT2ZZZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqeSA9IHRoaXMueWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBqbSA9IChqbSArIGFtb3VudCkgJSAxMjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoMCA+IGptKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGp5ICs9ICh0aGlzLm1vbnRoT2ZZZWFyKGRhdGUpICsgYW1vdW50IC0gam0gLSAxMikgLyAxMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgam0gKz0gMTI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqeSArPSAoKHRoaXMubW9udGhPZlllYXIoZGF0ZSkgKyBhbW91bnQgLSBqbSkgLyAxMik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZ2ID0gdGhpcy50b0dyZWdvcmlhbihqeSwgam0sIGpkKTtcclxuICAgICAgICAgICAgICAgICAgICB2LnNldEZ1bGxZZWFyKHZ2LmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHYuc2V0TW9udGgodnYuZ2V0TW9udGgoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5zZXREYXRlKHZ2LmdldERhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2LnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDcgKiA4NjQwMDAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGpkID0gdGhpcy5kYXlPZk1vbnRoKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqbSA9IHRoaXMubW9udGhPZlllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZ2ID0gdGhpcy50b0dyZWdvcmlhbihqeSArIGFtb3VudCwgam0sIGpkKTtcclxuICAgICAgICAgICAgICAgICAgICB2LnNldEZ1bGxZZWFyKHZ2LmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHYuc2V0TW9udGgodnYuZ2V0TW9udGgoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5zZXREYXRlKHZ2LmdldERhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2LnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA4NjQwMDAwMCAqIGFtb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKHZhbHVlKSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldChkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCwgdmFsdWU6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0T2YoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlIFwid2Vla1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSkuYWRkKCdkYXknLCAtdGhpcy5kYXlPZldlZWsoY2xvbmUpICsgMSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtb250aFwiOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGptID0gdGhpcy5tb250aE9mWWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIGptLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoZ0RhdGUsIHRoaXMubmFtZSgpKS5zdGFydE9mKCdkYXknKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInllYXJcIjpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqeSA9IHRoaXMueWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIDEsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShnRGF0ZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbmRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xyXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCBjbG9uZS5nZXRTZWNvbmRzKCksIDk5OSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgNTksIDk5OSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCA1OSwgNTksIDk5OSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZihkYXRlLCAnd2VlaycpLmFkZCgnZGF5JywgNikuZW5kT2YoJ2RheScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgankgPSB0aGlzLnllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgam0gPSB0aGlzLm1vbnRoT2ZZZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpkID0gdGhpcy5tb250aExlbmd0aChqeSwgam0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdEYXRlID0gdGhpcy50b0dyZWdvcmlhbihqeSwgam0sIGpkKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoZ0RhdGUsIHRoaXMubmFtZSgpKS5lbmRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJ5ZWFyXCI6XHJcbiAgICAgICAgICAgICAgICBsZXQgankgPSB0aGlzLnllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIDEyLCB0aGlzLm1vbnRoTGVuZ3RoKGp5LCAxMikpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGdEYXRlLCB0aGlzLm5hbWUoKSkuZW5kT2YoJ2RheScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHRvSmFsYWxpKGRhdGU6IERhdGUpOiB7IHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIgfSB7XHJcbiAgICAgICAgY29uc3QgZ3kgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgY29uc3QgZ20gPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICAgIGNvbnN0IGdkID0gZGF0ZS5nZXREYXRlKCk7XHJcbiAgICAgICAgY29uc3QgciA9IHRoaXMuZDJqKHRoaXMuZzJkKGd5LCBnbSwgZ2QpKVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHllYXI6IHIuanksXHJcbiAgICAgICAgICAgIG1vbnRoOiByLmptLFxyXG4gICAgICAgICAgICBkYXk6IHIuamQsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgIENvbnZlcnRzIGEgSmFsYWFsaSBkYXRlIHRvIEdyZWdvcmlhbi5cclxuICAgICovXHJcbiAgICB0b0dyZWdvcmlhbihqeSwgam0sIGpkKSB7XHJcbiAgICAgICAgY29uc3QgZyA9IHRoaXMuZDJnKHRoaXMuajJkKGp5LCBqbSwgamQpKVxyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShnLmd5LCBnLmdtIC0gMSwgZy5nZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgQ2hlY2tzIHdoZXRoZXIgYSBKYWxhYWxpIGRhdGUgaXMgdmFsaWQgb3Igbm90LlxyXG4gICAgKi9cclxuICAgIGlzVmFsaWQoanksIGptLCBqZCkge1xyXG4gICAgICAgIHJldHVybiBqeSA+PSAtNjEgJiYgankgPD0gMzE3NyAmJlxyXG4gICAgICAgICAgICBqbSA+PSAxICYmIGptIDw9IDEyICYmXHJcbiAgICAgICAgICAgIGpkID49IDEgJiYgamQgPD0gdGhpcy5tb250aExlbmd0aChqeSwgam0pXHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgSXMgdGhpcyBhIGxlYXAgeWVhciBvciBub3Q/XHJcbiAgICAqL1xyXG4gICAgaXNMZWFwWWVhcihqeSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmphbENhbChqeSkubGVhcCA9PT0gMFxyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgIE51bWJlciBvZiBkYXlzIGluIGEgZ2l2ZW4gbW9udGggaW4gYSBKYWxhYWxpIHllYXIuXHJcbiAgICAqL1xyXG4gICAgbW9udGhMZW5ndGgoanksIGptKSB7XHJcbiAgICAgICAgaWYgKGptIDw9IDYpIHJldHVybiAzMVxyXG4gICAgICAgIGlmIChqbSA8PSAxMSkgcmV0dXJuIDMwXHJcbiAgICAgICAgaWYgKHRoaXMuaXNMZWFwWWVhcihqeSkpIHJldHVybiAzMFxyXG4gICAgICAgIHJldHVybiAyOVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIGphbENhbChqeSkge1xyXG4gICAgICAgIC8vIEphbGFhbGkgeWVhcnMgc3RhcnRpbmcgdGhlIDMzLXllYXIgcnVsZS5cclxuICAgICAgICBsZXQgYnJlYWtzID0gWy02MSwgOSwgMzgsIDE5OSwgNDI2LCA2ODYsIDc1NiwgODE4LCAxMTExLCAxMTgxLCAxMjEwXHJcbiAgICAgICAgICAgICwgMTYzNSwgMjA2MCwgMjA5NywgMjE5MiwgMjI2MiwgMjMyNCwgMjM5NCwgMjQ1NiwgMzE3OFxyXG4gICAgICAgIF1cclxuICAgICAgICAgICAgLCBibCA9IGJyZWFrcy5sZW5ndGhcclxuICAgICAgICAgICAgLCBneSA9IGp5ICsgNjIxXHJcbiAgICAgICAgICAgICwgbGVhcEogPSAtMTRcclxuICAgICAgICAgICAgLCBqcCA9IGJyZWFrc1swXVxyXG4gICAgICAgICAgICAsIGptXHJcbiAgICAgICAgICAgICwganVtcFxyXG4gICAgICAgICAgICAsIGxlYXBcclxuICAgICAgICAgICAgLCBsZWFwR1xyXG4gICAgICAgICAgICAsIG1hcmNoXHJcbiAgICAgICAgICAgICwgblxyXG4gICAgICAgICAgICAsIGlcclxuXHJcbiAgICAgICAgaWYgKGp5IDwganAgfHwgankgPj0gYnJlYWtzW2JsIC0gMV0pXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKYWxhYWxpIHllYXIgJyArIGp5KVxyXG5cclxuICAgICAgICAvLyBGaW5kIHRoZSBsaW1pdGluZyB5ZWFycyBmb3IgdGhlIEphbGFhbGkgeWVhciBqeS5cclxuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYmw7IGkgKz0gMSkge1xyXG4gICAgICAgICAgICBqbSA9IGJyZWFrc1tpXVxyXG4gICAgICAgICAgICBqdW1wID0gam0gLSBqcFxyXG4gICAgICAgICAgICBpZiAoankgPCBqbSlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGxlYXBKID0gbGVhcEogKyB0aGlzLmRpdihqdW1wLCAzMykgKiA4ICsgdGhpcy5kaXYodGhpcy5tb2QoanVtcCwgMzMpLCA0KVxyXG4gICAgICAgICAgICBqcCA9IGptXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG4gPSBqeSAtIGpwXHJcblxyXG4gICAgICAgIC8vIEZpbmQgdGhlIG51bWJlciBvZiBsZWFwIHllYXJzIGZyb20gQUQgNjIxIHRvIHRoZSBiZWdpbm5pbmdcclxuICAgICAgICAvLyBvZiB0aGUgY3VycmVudCBKYWxhYWxpIHllYXIgaW4gdGhlIFBlcnNpYW4gY2FsZW5kYXIuXHJcbiAgICAgICAgbGVhcEogPSBsZWFwSiArIHRoaXMuZGl2KG4sIDMzKSAqIDggKyB0aGlzLmRpdih0aGlzLm1vZChuLCAzMykgKyAzLCA0KVxyXG4gICAgICAgIGlmICh0aGlzLm1vZChqdW1wLCAzMykgPT09IDQgJiYganVtcCAtIG4gPT09IDQpXHJcbiAgICAgICAgICAgIGxlYXBKICs9IDFcclxuXHJcbiAgICAgICAgLy8gQW5kIHRoZSBzYW1lIGluIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgKHVudGlsIHRoZSB5ZWFyIGd5KS5cclxuICAgICAgICBsZWFwRyA9IHRoaXMuZGl2KGd5LCA0KSAtIHRoaXMuZGl2KCh0aGlzLmRpdihneSwgMTAwKSArIDEpICogMywgNCkgLSAxNTBcclxuXHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBHcmVnb3JpYW4gZGF0ZSBvZiBGYXJ2YXJkaW4gdGhlIDFzdC5cclxuICAgICAgICBtYXJjaCA9IDIwICsgbGVhcEogLSBsZWFwR1xyXG5cclxuICAgICAgICAvLyBGaW5kIGhvdyBtYW55IHllYXJzIGhhdmUgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGxlYXAgeWVhci5cclxuICAgICAgICBpZiAoanVtcCAtIG4gPCA2KVxyXG4gICAgICAgICAgICBuID0gbiAtIGp1bXAgKyB0aGlzLmRpdihqdW1wICsgNCwgMzMpICogMzNcclxuICAgICAgICBsZWFwID0gdGhpcy5tb2QodGhpcy5tb2QobiArIDEsIDMzKSAtIDEsIDQpXHJcbiAgICAgICAgaWYgKGxlYXAgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGxlYXAgPSA0XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsZWFwOiBsZWFwXHJcbiAgICAgICAgICAgICwgZ3k6IGd5XHJcbiAgICAgICAgICAgICwgbWFyY2g6IG1hcmNoXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgIENvbnZlcnRzIGEgZGF0ZSBvZiB0aGUgSmFsYWFsaSBjYWxlbmRhciB0byB0aGUgSnVsaWFuIERheSBudW1iZXIuXHJcbiAgICAgIEBwYXJhbSBqeSBKYWxhYWxpIHllYXIgKDEgdG8gMzEwMClcclxuICAgICAgQHBhcmFtIGptIEphbGFhbGkgbW9udGggKDEgdG8gMTIpXHJcbiAgICAgIEBwYXJhbSBqZCBKYWxhYWxpIGRheSAoMSB0byAyOS8zMSlcclxuICAgICAgQHJldHVybiBKdWxpYW4gRGF5IG51bWJlclxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgajJkKGp5LCBqbSwgamQpIHtcclxuICAgICAgICBsZXQgciA9IHRoaXMuamFsQ2FsKGp5KVxyXG4gICAgICAgIHJldHVybiB0aGlzLmcyZChyLmd5LCAzLCByLm1hcmNoKSArIChqbSAtIDEpICogMzEgLSB0aGlzLmRpdihqbSwgNykgKiAoam0gLSA3KSArIGpkIC0gMVxyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgIENvbnZlcnRzIHRoZSBKdWxpYW4gRGF5IG51bWJlciB0byBhIGRhdGUgaW4gdGhlIEphbGFhbGkgY2FsZW5kYXIuXHJcbiAgICAgIEBwYXJhbSBqZG4gSnVsaWFuIERheSBudW1iZXJcclxuICAgICAgQHJldHVyblxyXG4gICAgICAgIGp5OiBKYWxhYWxpIHllYXIgKDEgdG8gMzEwMClcclxuICAgICAgICBqbTogSmFsYWFsaSBtb250aCAoMSB0byAxMilcclxuICAgICAgICBqZDogSmFsYWFsaSBkYXkgKDEgdG8gMjkvMzEpXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBkMmooamRuKSB7XHJcbiAgICAgICAgbGV0IGd5ID0gdGhpcy5kMmcoamRuKS5neSAvLyBDYWxjdWxhdGUgR3JlZ29yaWFuIHllYXIgKGd5KS5cclxuICAgICAgICAgICAgLCBqeSA9IGd5IC0gNjIxXHJcbiAgICAgICAgICAgICwgciA9IHRoaXMuamFsQ2FsKGp5KVxyXG4gICAgICAgICAgICAsIGpkbjFmID0gdGhpcy5nMmQoZ3ksIDMsIHIubWFyY2gpXHJcbiAgICAgICAgICAgICwgamRcclxuICAgICAgICAgICAgLCBqbVxyXG4gICAgICAgICAgICAsIGtcclxuXHJcbiAgICAgICAgLy8gRmluZCBudW1iZXIgb2YgZGF5cyB0aGF0IHBhc3NlZCBzaW5jZSAxIEZhcnZhcmRpbi5cclxuICAgICAgICBrID0gamRuIC0gamRuMWZcclxuICAgICAgICBpZiAoayA+PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChrIDw9IDE4NSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IDYgbW9udGhzLlxyXG4gICAgICAgICAgICAgICAgam0gPSAxICsgdGhpcy5kaXYoaywgMzEpXHJcbiAgICAgICAgICAgICAgICBqZCA9IHRoaXMubW9kKGssIDMxKSArIDFcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgank6IGp5XHJcbiAgICAgICAgICAgICAgICAgICAgLCBqbTogam1cclxuICAgICAgICAgICAgICAgICAgICAsIGpkOiBqZFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBtb250aHMuXHJcbiAgICAgICAgICAgICAgICBrIC09IDE4NlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gUHJldmlvdXMgSmFsYWFsaSB5ZWFyLlxyXG4gICAgICAgICAgICBqeSAtPSAxXHJcbiAgICAgICAgICAgIGsgKz0gMTc5XHJcbiAgICAgICAgICAgIGlmIChyLmxlYXAgPT09IDEpXHJcbiAgICAgICAgICAgICAgICBrICs9IDFcclxuICAgICAgICB9XHJcbiAgICAgICAgam0gPSA3ICsgdGhpcy5kaXYoaywgMzApXHJcbiAgICAgICAgamQgPSB0aGlzLm1vZChrLCAzMCkgKyAxXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgank6IGp5XHJcbiAgICAgICAgICAgICwgam06IGptXHJcbiAgICAgICAgICAgICwgamQ6IGpkXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIGcyZChneSwgZ20sIGdkKSB7XHJcbiAgICAgICAgbGV0IGQgPSB0aGlzLmRpdigoZ3kgKyB0aGlzLmRpdihnbSAtIDgsIDYpICsgMTAwMTAwKSAqIDE0NjEsIDQpXHJcbiAgICAgICAgICAgICsgdGhpcy5kaXYoMTUzICogdGhpcy5tb2QoZ20gKyA5LCAxMikgKyAyLCA1KVxyXG4gICAgICAgICAgICArIGdkIC0gMzQ4NDA0MDhcclxuICAgICAgICBkID0gZCAtIHRoaXMuZGl2KHRoaXMuZGl2KGd5ICsgMTAwMTAwICsgdGhpcy5kaXYoZ20gLSA4LCA2KSwgMTAwKSAqIDMsIDQpICsgNzUyXHJcbiAgICAgICAgcmV0dXJuIGRcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBkMmcoamRuKSB7XHJcbiAgICAgICAgbGV0IGpcclxuICAgICAgICAgICAgLCBpXHJcbiAgICAgICAgICAgICwgZ2RcclxuICAgICAgICAgICAgLCBnbVxyXG4gICAgICAgICAgICAsIGd5XHJcbiAgICAgICAgaiA9IDQgKiBqZG4gKyAxMzkzNjE2MzFcclxuICAgICAgICBqID0gaiArIHRoaXMuZGl2KHRoaXMuZGl2KDQgKiBqZG4gKyAxODMxODc3MjAsIDE0NjA5NykgKiAzLCA0KSAqIDQgLSAzOTA4XHJcbiAgICAgICAgaSA9IHRoaXMuZGl2KHRoaXMubW9kKGosIDE0NjEpLCA0KSAqIDUgKyAzMDhcclxuICAgICAgICBnZCA9IHRoaXMuZGl2KHRoaXMubW9kKGksIDE1MyksIDUpICsgMVxyXG4gICAgICAgIGdtID0gdGhpcy5tb2QodGhpcy5kaXYoaSwgMTUzKSwgMTIpICsgMVxyXG4gICAgICAgIGd5ID0gdGhpcy5kaXYoaiwgMTQ2MSkgLSAxMDAxMDAgKyB0aGlzLmRpdig4IC0gZ20sIDYpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ3k6IGd5XHJcbiAgICAgICAgICAgICwgZ206IGdtXHJcbiAgICAgICAgICAgICwgZ2Q6IGdkXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgIFV0aWxpdHkgaGVscGVyIGZ1bmN0aW9ucy5cclxuICAgICovXHJcbiAgICBwcml2YXRlIGRpdihhLCBiKSB7XHJcbiAgICAgICAgcmV0dXJuIH5+KGEgLyBiKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbW9kKGEsIGIpIHtcclxuICAgICAgICByZXR1cm4gYSAtIH5+KGEgLyBiKSAqIGJcclxuICAgIH1cclxuXHJcbn0iXX0=
359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamFsYWxpLmNhbGVuZGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNvcmV4L2NvcmUvc3JjL2xpYi9kYXRlVGltZS9qYWxhbGkuY2FsZW5kYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRixNQUFNLE9BQU8sY0FBYztJQUEzQjtRQUVJLGVBQVUsR0FBRyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRS9GLG9CQUFlLEdBQUcsQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVwRyxhQUFRLEdBQUcsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU1RSxrQkFBYSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFxWi9DLENBQUM7SUFsWkcsTUFBTSxDQUFDLEtBQWtCO1FBQ3JCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEssQ0FB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SUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQztZQUMxQyxLQUFLLElBQUksQ0FBQyxDQUFBO1FBRWQsOERBQThEO1FBQzlELEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtRQUV4RSxxREFBcUQ7UUFDckQsS0FBSyxHQUFHLEVBQUUsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBRTFCLDREQUE0RDtRQUM1RCxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNaLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDOUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUMzQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNiLElBQUksR0FBRyxDQUFDLENBQUE7U0FDWDtRQUVELE9BQU87WUFDSCxJQUFJLEVBQUUsSUFBSTtZQUNSLEVBQUUsRUFBRSxFQUFFO1lBQ04sS0FBSyxFQUFFLEtBQUs7U0FDakIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7O01BTUU7SUFDTSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ2xCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDdkIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7TUFPRTtJQUNNLEdBQUcsQ0FBQyxHQUFHO1FBQ1gsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsaUNBQWlDO1VBQ3JELEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUNiLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUNuQixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDaEMsRUFBRSxFQUNGLEVBQUUsRUFDRixDQUFDLENBQUE7UUFFUCxxREFBcUQ7UUFDckQsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUE7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUU7Z0JBQ1Ysc0JBQXNCO2dCQUN0QixFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO2dCQUN4QixFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN4QixPQUFPO29CQUNILEVBQUUsRUFBRSxFQUFFO29CQUNKLEVBQUUsRUFBRSxFQUFFO29CQUNOLEVBQUUsRUFBRSxFQUFFO2lCQUNYLENBQUE7YUFDSjtpQkFBTTtnQkFDSCx3QkFBd0I7Z0JBQ3hCLENBQUMsSUFBSSxHQUFHLENBQUE7YUFDWDtTQUNKO2FBQU07WUFDSCx5QkFBeUI7WUFDekIsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNQLENBQUMsSUFBSSxHQUFHLENBQUE7WUFDUixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztnQkFDWixDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ2I7UUFDRCxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3hCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDeEIsT0FBTztZQUNILEVBQUUsRUFBRSxFQUFFO1lBQ0osRUFBRSxFQUFFLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRTtTQUNYLENBQUE7SUFDTCxDQUFDO0lBR08sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNsQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2NBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2NBQzNDLEVBQUUsR0FBRyxRQUFRLENBQUE7UUFDbkIsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtRQUMvRSxPQUFPLENBQUMsQ0FBQTtJQUNaLENBQUM7SUFHTyxHQUFHLENBQUMsR0FBRztRQUNYLElBQUksQ0FBQyxFQUNDLENBQUMsRUFDRCxFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsQ0FBQTtRQUNSLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQTtRQUN2QixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQTtRQUN6RSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFBO1FBQzVDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN0QyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdkMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDckQsT0FBTztZQUNILEVBQUUsRUFBRSxFQUFFO1lBQ0osRUFBRSxFQUFFLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRTtTQUNYLENBQUE7SUFDTCxDQUFDO0lBRUQ7O01BRUU7SUFDTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBRU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM1QixDQUFDO0NBRUoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWENhbGVuZGFyLCBBWERhdGVUaW1lLCBBWERhdGVWYWx1ZSwgVGltZVVuaXQgfSBmcm9tIFwiLi9kYXRldGltZS5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEphbGFsaUNhbGVuZGFyIGltcGxlbWVudHMgQVhDYWxlbmRhciB7XHJcblxyXG4gICAgbW9udGhOYW1lcyA9IChcItmB2LHZiNix2K/bjNmGX9in2LHYr9uM2KjZh9i02Kpf2K7Ysdiv2KfYr1/YqtuM2LFf2YXYsdiv2KfYr1/YtNmH2LHbjNmI2LFf2YXZh9ixX9ii2KjYp9mGX9ii2LDYsV/Yr9uMX9io2YfZhdmGX9in2LPZgdmG2K9cIikuc3BsaXQoXCJfXCIpO1xyXG5cclxuICAgIG1vbnRoU2hvcnROYW1lcyA9IChcItmB2LHZiNix2K/bjNmGX9in2LHYr9uM2KjZh9i02Kpf2K7Ysdiv2KfYr1/YqtuM2LFf2YXYsdiv2KfYr1/YtNmH2LHbjNmI2LFf2YXZh9ixX9ii2KjYp9mGX9ii2LDYsV/Yr9uMX9io2YfZhdmGX9in2LPZgdmG2K9cIikuc3BsaXQoXCJfXCIpO1xyXG5cclxuICAgIGRheU5hbWVzID0gKFwi2LTZhtio2Ydf24zaqdi02YbYqNmHX9iv2YjYtNmG2KjZh1/Ys9mHINi02YbYqNmHX9qG2YfYp9ix2LTZhtio2Ydf2b7ZhtisINi02YbYqNmHX9is2YXYudmHXCIpLnNwbGl0KFwiX1wiKTtcclxuXHJcbiAgICBkYXlTaG9ydE5hbWVzID0gXCLYtF/bjF/Yr1/Ys1/ahl/Zvl/YrFwiLnNwbGl0KFwiX1wiKTtcclxuXHJcblxyXG4gICAgY3JlYXRlKHZhbHVlOiBBWERhdGVWYWx1ZSk6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLnRvR3JlZ29yaWFuKHZhbHVlLnllYXIsIHZhbHVlLm1vbnRoLCB2YWx1ZS5kYXRlKTtcclxuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUobmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLCBhLmdldE1vbnRoKCksIGEuZ2V0RGF0ZSgpLCB2YWx1ZS5ob3VycyB8fCAwLCB2YWx1ZS5taW51dGVzIHx8IDAsIHZhbHVlLnNlY29uZHMgfHwgMCwgdmFsdWUubXMgfHwgMCksIHRoaXMubmFtZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBuYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdqYWxhbGknXHJcbiAgICB9XHJcblxyXG4gICAgZGF5T2ZNb250aChkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b0phbGFsaShkYXRlKS5kYXk7XHJcbiAgICB9XHJcblxyXG4gICAgZGF5T2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGogPSB0aGlzLnRvSmFsYWxpKGRhdGUpO1xyXG4gICAgICAgIHJldHVybiAoai5tb250aCA8PSA2ID8gKChqLm1vbnRoIC0gMSkgKiAzMSkgOiAoKDYgKiAzMSkgKyAoai5tb250aCAtIDcpICogMzApKSArIGouZGF5O1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mV2VlayhkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXkoKSA9PSA2ID8gMSA6IGRhdGUuZ2V0RGF5KCkgKyAyO1xyXG4gICAgfVxyXG5cclxuICAgIHdlZWtPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgLy9UT0RPIDogYXBwbHkgamFsYWxpXHJcbiAgICAgICAgY29uc3QgZmlyc3REYXkgPSBuZXcgQVhEYXRlVGltZShkYXRlKS5zdGFydE9mKCd5ZWFyJyk7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCgoKChkYXRlLmdldFRpbWUoKSAtIGZpcnN0RGF5LmRhdGUuZ2V0VGltZSgpKSAvIDg2NDAwMDAwKSArIGZpcnN0RGF5LmRhdGUuZ2V0RGF5KCkgKyAxKSAvIDcpO1xyXG4gICAgfVxyXG5cclxuICAgIHllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9KYWxhbGkoZGF0ZSkueWVhcjtcclxuICAgIH1cclxuXHJcbiAgICBtb250aE9mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b0phbGFsaShkYXRlKS5tb250aDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYWRkKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCBhbW91bnQ6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xyXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gMTAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA2MDAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gMzYwMDAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqZCA9IHRoaXMuZGF5T2ZNb250aChkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgam0gPSB0aGlzLm1vbnRoT2ZZZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqeSA9IHRoaXMueWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBubSA9IChqbSArIGFtb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnkgPSAobm0gJSAxMikgPyBNYXRoLmZsb29yKG5tIC8gMTIpIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBqeSArPSBueTtcclxuICAgICAgICAgICAgICAgICAgICBqbSA9IG5tIC0gKG55ICogMTIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZ2ID0gdGhpcy50b0dyZWdvcmlhbihqeSwgam0sIGpkKTtcclxuICAgICAgICAgICAgICAgICAgICB2LnNldEZ1bGxZZWFyKHZ2LmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHYuc2V0TW9udGgodnYuZ2V0TW9udGgoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5zZXREYXRlKHZ2LmdldERhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2LnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDcgKiA4NjQwMDAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHYgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdi5zZXRGdWxsWWVhcih2LmdldEZ1bGxZZWFyKCkgKyBhbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlID0gdi52YWx1ZU9mKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYnJlYWtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqZCA9IHRoaXMuZGF5T2ZNb250aChkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgam0gPSB0aGlzLm1vbnRoT2ZZZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqeSA9IHRoaXMueWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2diA9IHRoaXMudG9HcmVnb3JpYW4oankgKyBhbW91bnQsIGptLCBqZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5zZXRGdWxsWWVhcih2di5nZXRGdWxsWWVhcigpKTtcclxuICAgICAgICAgICAgICAgICAgICB2LnNldE1vbnRoKHZ2LmdldE1vbnRoKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHYuc2V0RGF0ZSh2di5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdi52YWx1ZU9mKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDg2NDAwMDAwICogYW1vdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUobmV3IERhdGUodmFsdWUpLCB0aGlzLm5hbWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCB2YWx1ZTogbnVtYmVyKTogQVhEYXRlVGltZSB7XHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XHJcbiAgICAgICAgY29uc3QgakRhdGUgPSB0aGlzLnRvSmFsYWxpKGNsb25lKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgdmFsdWUsIGNsb25lLmdldE1pbGxpc2Vjb25kcygpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgdmFsdWUsIGNsb25lLmdldFNlY29uZHMoKSwgY2xvbmUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnModmFsdWUsIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCBjbG9uZS5nZXRNaWxsaXNlY29uZHMoKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdEYXRlID0gdGhpcy50b0dyZWdvcmlhbihqRGF0ZS55ZWFyLCBqRGF0ZS5tb250aCwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RGF0ZShnRGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3ZWVrXCI6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZTIgPSB0aGlzLnRvR3JlZ29yaWFuKGpEYXRlLnllYXIsIHZhbHVlLCBqRGF0ZS5kYXkpO1xyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0TW9udGgoZ0RhdGUyLmdldE1vbnRoKCkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ5ZWFyXCI6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZTMgPSB0aGlzLnRvR3JlZ29yaWFuKHZhbHVlLCBqRGF0ZS5tb250aCwgakRhdGUuZGF5KTtcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEZ1bGxZZWFyKGdEYXRlMy5nZXRGdWxsWWVhcigpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydE9mKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0KTogQVhEYXRlVGltZSB7XHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XHJcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIGNsb25lLmdldFNlY29uZHMoKSwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCAwLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBjYXNlICdkYXknOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgY2FzZSBcIndlZWtcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLmFkZCgnZGF5JywgLXRoaXMuZGF5T2ZXZWVrKGNsb25lKSArIDEpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqeSA9IHRoaXMueWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqbSA9IHRoaXMubW9udGhPZlllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ0RhdGUgPSB0aGlzLnRvR3JlZ29yaWFuKGp5LCBqbSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGdEYXRlLCB0aGlzLm5hbWUoKSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJ5ZWFyXCI6XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgankgPSB0aGlzLnllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ0RhdGUgPSB0aGlzLnRvR3JlZ29yaWFuKGp5LCAxLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoZ0RhdGUsIHRoaXMubmFtZSgpKS5zdGFydE9mKCdkYXknKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZW5kT2YoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCA5OTkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIDU5LCA5OTkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgNTksIDU5LCA5OTkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YoZGF0ZSwgJ3dlZWsnKS5hZGQoJ2RheScsIDYpLmVuZE9mKCdkYXknKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGptID0gdGhpcy5tb250aE9mWWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqZCA9IHRoaXMubW9udGhMZW5ndGgoanksIGptKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIGptLCBqZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGdEYXRlLCB0aGlzLm5hbWUoKSkuZW5kT2YoJ2RheScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxyXG4gICAgICAgICAgICAgICAgbGV0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ0RhdGUgPSB0aGlzLnRvR3JlZ29yaWFuKGp5LCAxMiwgdGhpcy5tb250aExlbmd0aChqeSwgMTIpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShnRGF0ZSwgdGhpcy5uYW1lKCkpLmVuZE9mKCdkYXknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICB0b0phbGFsaShkYXRlOiBEYXRlKTogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyIH0ge1xyXG4gICAgICAgIGNvbnN0IGd5ID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgIGNvbnN0IGdtID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgICAgICBjb25zdCBnZCA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmQyaih0aGlzLmcyZChneSwgZ20sIGdkKSlcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB5ZWFyOiByLmp5LFxyXG4gICAgICAgICAgICBtb250aDogci5qbSxcclxuICAgICAgICAgICAgZGF5OiByLmpkLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICBDb252ZXJ0cyBhIEphbGFhbGkgZGF0ZSB0byBHcmVnb3JpYW4uXHJcbiAgICAqL1xyXG4gICAgdG9HcmVnb3JpYW4oanksIGptLCBqZCkge1xyXG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLmQyZyh0aGlzLmoyZChqeSwgam0sIGpkKSlcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUoZy5neSwgZy5nbSAtIDEsIGcuZ2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgIENoZWNrcyB3aGV0aGVyIGEgSmFsYWFsaSBkYXRlIGlzIHZhbGlkIG9yIG5vdC5cclxuICAgICovXHJcbiAgICBpc1ZhbGlkKGp5LCBqbSwgamQpIHtcclxuICAgICAgICByZXR1cm4gankgPj0gLTYxICYmIGp5IDw9IDMxNzcgJiZcclxuICAgICAgICAgICAgam0gPj0gMSAmJiBqbSA8PSAxMiAmJlxyXG4gICAgICAgICAgICBqZCA+PSAxICYmIGpkIDw9IHRoaXMubW9udGhMZW5ndGgoanksIGptKVxyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgIElzIHRoaXMgYSBsZWFwIHllYXIgb3Igbm90P1xyXG4gICAgKi9cclxuICAgIGlzTGVhcFllYXIoankpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5qYWxDYWwoankpLmxlYXAgPT09IDBcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICBOdW1iZXIgb2YgZGF5cyBpbiBhIGdpdmVuIG1vbnRoIGluIGEgSmFsYWFsaSB5ZWFyLlxyXG4gICAgKi9cclxuICAgIG1vbnRoTGVuZ3RoKGp5LCBqbSkge1xyXG4gICAgICAgIGlmIChqbSA8PSA2KSByZXR1cm4gMzFcclxuICAgICAgICBpZiAoam0gPD0gMTEpIHJldHVybiAzMFxyXG4gICAgICAgIGlmICh0aGlzLmlzTGVhcFllYXIoankpKSByZXR1cm4gMzBcclxuICAgICAgICByZXR1cm4gMjlcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBqYWxDYWwoankpIHtcclxuICAgICAgICAvLyBKYWxhYWxpIHllYXJzIHN0YXJ0aW5nIHRoZSAzMy15ZWFyIHJ1bGUuXHJcbiAgICAgICAgbGV0IGJyZWFrcyA9IFstNjEsIDksIDM4LCAxOTksIDQyNiwgNjg2LCA3NTYsIDgxOCwgMTExMSwgMTE4MSwgMTIxMFxyXG4gICAgICAgICAgICAsIDE2MzUsIDIwNjAsIDIwOTcsIDIxOTIsIDIyNjIsIDIzMjQsIDIzOTQsIDI0NTYsIDMxNzhcclxuICAgICAgICBdXHJcbiAgICAgICAgICAgICwgYmwgPSBicmVha3MubGVuZ3RoXHJcbiAgICAgICAgICAgICwgZ3kgPSBqeSArIDYyMVxyXG4gICAgICAgICAgICAsIGxlYXBKID0gLTE0XHJcbiAgICAgICAgICAgICwganAgPSBicmVha3NbMF1cclxuICAgICAgICAgICAgLCBqbVxyXG4gICAgICAgICAgICAsIGp1bXBcclxuICAgICAgICAgICAgLCBsZWFwXHJcbiAgICAgICAgICAgICwgbGVhcEdcclxuICAgICAgICAgICAgLCBtYXJjaFxyXG4gICAgICAgICAgICAsIG5cclxuICAgICAgICAgICAgLCBpXHJcblxyXG4gICAgICAgIGlmIChqeSA8IGpwIHx8IGp5ID49IGJyZWFrc1tibCAtIDFdKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSmFsYWFsaSB5ZWFyICcgKyBqeSlcclxuXHJcbiAgICAgICAgLy8gRmluZCB0aGUgbGltaXRpbmcgeWVhcnMgZm9yIHRoZSBKYWxhYWxpIHllYXIgankuXHJcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGJsOyBpICs9IDEpIHtcclxuICAgICAgICAgICAgam0gPSBicmVha3NbaV1cclxuICAgICAgICAgICAganVtcCA9IGptIC0ganBcclxuICAgICAgICAgICAgaWYgKGp5IDwgam0pXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBsZWFwSiA9IGxlYXBKICsgdGhpcy5kaXYoanVtcCwgMzMpICogOCArIHRoaXMuZGl2KHRoaXMubW9kKGp1bXAsIDMzKSwgNClcclxuICAgICAgICAgICAganAgPSBqbVxyXG4gICAgICAgIH1cclxuICAgICAgICBuID0gankgLSBqcFxyXG5cclxuICAgICAgICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgbGVhcCB5ZWFycyBmcm9tIEFEIDYyMSB0byB0aGUgYmVnaW5uaW5nXHJcbiAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgSmFsYWFsaSB5ZWFyIGluIHRoZSBQZXJzaWFuIGNhbGVuZGFyLlxyXG4gICAgICAgIGxlYXBKID0gbGVhcEogKyB0aGlzLmRpdihuLCAzMykgKiA4ICsgdGhpcy5kaXYodGhpcy5tb2QobiwgMzMpICsgMywgNClcclxuICAgICAgICBpZiAodGhpcy5tb2QoanVtcCwgMzMpID09PSA0ICYmIGp1bXAgLSBuID09PSA0KVxyXG4gICAgICAgICAgICBsZWFwSiArPSAxXHJcblxyXG4gICAgICAgIC8vIEFuZCB0aGUgc2FtZSBpbiB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyICh1bnRpbCB0aGUgeWVhciBneSkuXHJcbiAgICAgICAgbGVhcEcgPSB0aGlzLmRpdihneSwgNCkgLSB0aGlzLmRpdigodGhpcy5kaXYoZ3ksIDEwMCkgKyAxKSAqIDMsIDQpIC0gMTUwXHJcblxyXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgR3JlZ29yaWFuIGRhdGUgb2YgRmFydmFyZGluIHRoZSAxc3QuXHJcbiAgICAgICAgbWFyY2ggPSAyMCArIGxlYXBKIC0gbGVhcEdcclxuXHJcbiAgICAgICAgLy8gRmluZCBob3cgbWFueSB5ZWFycyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBsZWFwIHllYXIuXHJcbiAgICAgICAgaWYgKGp1bXAgLSBuIDwgNilcclxuICAgICAgICAgICAgbiA9IG4gLSBqdW1wICsgdGhpcy5kaXYoanVtcCArIDQsIDMzKSAqIDMzXHJcbiAgICAgICAgbGVhcCA9IHRoaXMubW9kKHRoaXMubW9kKG4gKyAxLCAzMykgLSAxLCA0KVxyXG4gICAgICAgIGlmIChsZWFwID09PSAtMSkge1xyXG4gICAgICAgICAgICBsZWFwID0gNFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGVhcDogbGVhcFxyXG4gICAgICAgICAgICAsIGd5OiBneVxyXG4gICAgICAgICAgICAsIG1hcmNoOiBtYXJjaFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICBDb252ZXJ0cyBhIGRhdGUgb2YgdGhlIEphbGFhbGkgY2FsZW5kYXIgdG8gdGhlIEp1bGlhbiBEYXkgbnVtYmVyLlxyXG4gICAgICBAcGFyYW0gankgSmFsYWFsaSB5ZWFyICgxIHRvIDMxMDApXHJcbiAgICAgIEBwYXJhbSBqbSBKYWxhYWxpIG1vbnRoICgxIHRvIDEyKVxyXG4gICAgICBAcGFyYW0gamQgSmFsYWFsaSBkYXkgKDEgdG8gMjkvMzEpXHJcbiAgICAgIEByZXR1cm4gSnVsaWFuIERheSBudW1iZXJcclxuICAgICovXHJcbiAgICBwcml2YXRlIGoyZChqeSwgam0sIGpkKSB7XHJcbiAgICAgICAgbGV0IHIgPSB0aGlzLmphbENhbChqeSlcclxuICAgICAgICByZXR1cm4gdGhpcy5nMmQoci5neSwgMywgci5tYXJjaCkgKyAoam0gLSAxKSAqIDMxIC0gdGhpcy5kaXYoam0sIDcpICogKGptIC0gNykgKyBqZCAtIDFcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICBDb252ZXJ0cyB0aGUgSnVsaWFuIERheSBudW1iZXIgdG8gYSBkYXRlIGluIHRoZSBKYWxhYWxpIGNhbGVuZGFyLlxyXG4gICAgICBAcGFyYW0gamRuIEp1bGlhbiBEYXkgbnVtYmVyXHJcbiAgICAgIEByZXR1cm5cclxuICAgICAgICBqeTogSmFsYWFsaSB5ZWFyICgxIHRvIDMxMDApXHJcbiAgICAgICAgam06IEphbGFhbGkgbW9udGggKDEgdG8gMTIpXHJcbiAgICAgICAgamQ6IEphbGFhbGkgZGF5ICgxIHRvIDI5LzMxKVxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgZDJqKGpkbikge1xyXG4gICAgICAgIGxldCBneSA9IHRoaXMuZDJnKGpkbikuZ3kgLy8gQ2FsY3VsYXRlIEdyZWdvcmlhbiB5ZWFyIChneSkuXHJcbiAgICAgICAgICAgICwgankgPSBneSAtIDYyMVxyXG4gICAgICAgICAgICAsIHIgPSB0aGlzLmphbENhbChqeSlcclxuICAgICAgICAgICAgLCBqZG4xZiA9IHRoaXMuZzJkKGd5LCAzLCByLm1hcmNoKVxyXG4gICAgICAgICAgICAsIGpkXHJcbiAgICAgICAgICAgICwgam1cclxuICAgICAgICAgICAgLCBrXHJcblxyXG4gICAgICAgIC8vIEZpbmQgbnVtYmVyIG9mIGRheXMgdGhhdCBwYXNzZWQgc2luY2UgMSBGYXJ2YXJkaW4uXHJcbiAgICAgICAgayA9IGpkbiAtIGpkbjFmXHJcbiAgICAgICAgaWYgKGsgPj0gMCkge1xyXG4gICAgICAgICAgICBpZiAoayA8PSAxODUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCA2IG1vbnRocy5cclxuICAgICAgICAgICAgICAgIGptID0gMSArIHRoaXMuZGl2KGssIDMxKVxyXG4gICAgICAgICAgICAgICAgamQgPSB0aGlzLm1vZChrLCAzMSkgKyAxXHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGp5OiBqeVxyXG4gICAgICAgICAgICAgICAgICAgICwgam06IGptXHJcbiAgICAgICAgICAgICAgICAgICAgLCBqZDogamRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgbW9udGhzLlxyXG4gICAgICAgICAgICAgICAgayAtPSAxODZcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFByZXZpb3VzIEphbGFhbGkgeWVhci5cclxuICAgICAgICAgICAgankgLT0gMVxyXG4gICAgICAgICAgICBrICs9IDE3OVxyXG4gICAgICAgICAgICBpZiAoci5sZWFwID09PSAxKVxyXG4gICAgICAgICAgICAgICAgayArPSAxXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGptID0gNyArIHRoaXMuZGl2KGssIDMwKVxyXG4gICAgICAgIGpkID0gdGhpcy5tb2QoaywgMzApICsgMVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGp5OiBqeVxyXG4gICAgICAgICAgICAsIGptOiBqbVxyXG4gICAgICAgICAgICAsIGpkOiBqZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBnMmQoZ3ksIGdtLCBnZCkge1xyXG4gICAgICAgIGxldCBkID0gdGhpcy5kaXYoKGd5ICsgdGhpcy5kaXYoZ20gLSA4LCA2KSArIDEwMDEwMCkgKiAxNDYxLCA0KVxyXG4gICAgICAgICAgICArIHRoaXMuZGl2KDE1MyAqIHRoaXMubW9kKGdtICsgOSwgMTIpICsgMiwgNSlcclxuICAgICAgICAgICAgKyBnZCAtIDM0ODQwNDA4XHJcbiAgICAgICAgZCA9IGQgLSB0aGlzLmRpdih0aGlzLmRpdihneSArIDEwMDEwMCArIHRoaXMuZGl2KGdtIC0gOCwgNiksIDEwMCkgKiAzLCA0KSArIDc1MlxyXG4gICAgICAgIHJldHVybiBkXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgZDJnKGpkbikge1xyXG4gICAgICAgIGxldCBqXHJcbiAgICAgICAgICAgICwgaVxyXG4gICAgICAgICAgICAsIGdkXHJcbiAgICAgICAgICAgICwgZ21cclxuICAgICAgICAgICAgLCBneVxyXG4gICAgICAgIGogPSA0ICogamRuICsgMTM5MzYxNjMxXHJcbiAgICAgICAgaiA9IGogKyB0aGlzLmRpdih0aGlzLmRpdig0ICogamRuICsgMTgzMTg3NzIwLCAxNDYwOTcpICogMywgNCkgKiA0IC0gMzkwOFxyXG4gICAgICAgIGkgPSB0aGlzLmRpdih0aGlzLm1vZChqLCAxNDYxKSwgNCkgKiA1ICsgMzA4XHJcbiAgICAgICAgZ2QgPSB0aGlzLmRpdih0aGlzLm1vZChpLCAxNTMpLCA1KSArIDFcclxuICAgICAgICBnbSA9IHRoaXMubW9kKHRoaXMuZGl2KGksIDE1MyksIDEyKSArIDFcclxuICAgICAgICBneSA9IHRoaXMuZGl2KGosIDE0NjEpIC0gMTAwMTAwICsgdGhpcy5kaXYoOCAtIGdtLCA2KVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGd5OiBneVxyXG4gICAgICAgICAgICAsIGdtOiBnbVxyXG4gICAgICAgICAgICAsIGdkOiBnZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICBVdGlsaXR5IGhlbHBlciBmdW5jdGlvbnMuXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBkaXYoYSwgYikge1xyXG4gICAgICAgIHJldHVybiB+fihhIC8gYilcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1vZChhLCBiKSB7XHJcbiAgICAgICAgcmV0dXJuIGEgLSB+fihhIC8gYikgKiBiXHJcbiAgICB9XHJcblxyXG59Il19
@@ -164,14 +164,43 @@ AXConfig.dataChangeSubject = new Subject();
164
164
  // @dynamic
165
165
  class AXDateTime {
166
166
  constructor(value = new Date(), calendar = AXConfig.get(`dateTime.calendar`)) {
167
- this._calendar =
168
- typeof calendar == 'string'
169
- ? AXConfig.get(`dateTime.calendars.${calendar}`)
170
- : calendar;
167
+ this._formatKeys = {
168
+ ss: () => this.pad(this.date.getSeconds(), 2),
169
+ s: () => this.date.getSeconds().toString(),
170
+ //
171
+ dd: () => this.pad(this.calendar.dayOfMonth(this.date), 2),
172
+ d: () => this.calendar.dayOfMonth(this.date).toString(),
173
+ //
174
+ mm: () => this.pad(this.date.getMinutes(), 2),
175
+ m: () => this.date.getMinutes().toString(),
176
+ //
177
+ MMMM: () => this.calendar.monthNames[this.calendar.monthOfYear(this.date) - 1],
178
+ MMM: () => this.calendar.monthShortNames[this.calendar.monthOfYear(this.date) - 1],
179
+ MM: () => this.pad(this.calendar.monthOfYear(this.date), 2),
180
+ //
181
+ DDDD: () => this.calendar.dayNames[this.calendar.dayOfWeek(this.date) - 1],
182
+ DDD: () => this.calendar.dayShortNames[this.calendar.dayOfWeek(this.date) - 1],
183
+ //
184
+ yyyy: () => this.calendar.year(this.date).toString(),
185
+ YYYY: () => this.calendar.year(this.date).toString(),
186
+ yy: () => this.calendar.year(this.date).toString().substring(2),
187
+ YY: () => this.calendar.year(this.date).toString().substring(2),
188
+ //
189
+ HH: () => this.pad(this.date.getHours(), 2),
190
+ H: () => this.date.getHours().toString(),
191
+ //
192
+ hh: () => this.pad((this.date.getHours() % 12 || 12), 2),
193
+ h: () => (this.date.getHours() % 12 || 12).toString(),
194
+ //
195
+ A: () => (this.date.getHours() < 12) ? 'am' : 'pm',
196
+ a: () => (this.date.getHours() < 12) ? 'am' : 'pm',
197
+ };
198
+ this._calendar = AXDateTime.resolveCalendar(calendar);
171
199
  if (value instanceof Date) {
172
200
  this._date = value;
173
201
  }
174
202
  else {
203
+ //TODO: parse jalali
175
204
  this._date = new Date(value);
176
205
  }
177
206
  }
@@ -188,6 +217,31 @@ class AXDateTime {
188
217
  }
189
218
  return date;
190
219
  }
220
+ static from(value = {
221
+ calendar: AXConfig.get('dateTime.calendar'),
222
+ year: 1,
223
+ month: 1,
224
+ date: 1,
225
+ hours: 0,
226
+ minutes: 0,
227
+ seconds: 0,
228
+ ms: 0
229
+ }) {
230
+ // let date: AXDateTime = new AXDateTime(new Date(), value.calendar);
231
+ // date.set('year', value.year);
232
+ // date.set('month', value.month);
233
+ // date.set('day', value.date);
234
+ // date.set('hour', value.hours);
235
+ // date.set('minute', value.minutes);
236
+ // date.set('second', value.seconds);
237
+ // date.set('ms', value.ms);
238
+ return AXDateTime.resolveCalendar(value.calendar).create(value);
239
+ }
240
+ static resolveCalendar(calendar) {
241
+ return typeof calendar == 'string'
242
+ ? AXConfig.get(`dateTime.calendars.${calendar}`)
243
+ : calendar;
244
+ }
191
245
  get date() {
192
246
  return this._date;
193
247
  }
@@ -195,7 +249,7 @@ class AXDateTime {
195
249
  return this._calendar;
196
250
  }
197
251
  clone() {
198
- return new AXDateTime(this.date, this.calendar.name());
252
+ return new AXDateTime(this.date, this.calendar);
199
253
  }
200
254
  get dayOfMonth() {
201
255
  return this._calendar.dayOfMonth(this.date);
@@ -244,40 +298,9 @@ class AXDateTime {
244
298
  return this._calendar.endOf(this.date, unit);
245
299
  }
246
300
  format(format = AXConfig.get('dateTime.shortDateFormat')) {
247
- const keys = {
248
- ss: () => this.pad(this.date.getSeconds(), 2),
249
- s: () => this.date.getSeconds().toString(),
250
- //
251
- dd: () => this.pad(this.calendar.dayOfMonth(this.date), 2),
252
- d: () => this.calendar.dayOfMonth(this.date).toString(),
253
- //
254
- mm: () => this.pad(this.date.getMinutes(), 2),
255
- m: () => this.date.getMinutes().toString(),
256
- //
257
- MMMM: () => this.calendar.monthNames[this.calendar.monthOfYear(this.date) - 1],
258
- MMM: () => this.calendar.monthShortNames[this.calendar.monthOfYear(this.date) - 1],
259
- MM: () => this.pad(this.calendar.monthOfYear(this.date), 2),
260
- //
261
- DDDD: () => this.calendar.dayNames[this.calendar.dayOfWeek(this.date) - 1],
262
- DDD: () => this.calendar.dayShortNames[this.calendar.dayOfWeek(this.date) - 1],
263
- //
264
- yyyy: () => this.calendar.year(this.date).toString(),
265
- YYYY: () => this.calendar.year(this.date).toString(),
266
- yy: () => this.calendar.year(this.date).toString().substring(2),
267
- YY: () => this.calendar.year(this.date).toString().substring(2),
268
- //
269
- HH: () => this.pad(this.date.getHours(), 2),
270
- H: () => this.date.getHours().toString(),
271
- //
272
- hh: () => this.pad((this.date.getHours() % 12 || 12), 2),
273
- h: () => (this.date.getHours() % 12 || 12).toString(),
274
- //
275
- A: () => (this.date.getHours() < 12) ? 'am' : 'pm',
276
- a: () => (this.date.getHours() < 12) ? 'am' : 'pm',
277
- };
278
- const re = new RegExp(_.orderBy(Object.keys(keys), c => c.length, ['desc']).join("|"), "gi");
279
- return format.replace(re, function (matched) {
280
- return keys[matched]();
301
+ const re = new RegExp(_.orderBy(Object.keys(this._formatKeys), c => c.length, ['desc']).join("|"), "gi");
302
+ return format.replace(re, (matched) => {
303
+ return this._formatKeys[matched]();
281
304
  });
282
305
  }
283
306
  pad(n, width, z = '0') {
@@ -291,7 +314,7 @@ class AXDateTime {
291
314
  return this.compare(value, unit) == 0;
292
315
  }
293
316
  compare(value, unit = 'day') {
294
- const val = AXDateTime.convert(value);
317
+ const val = AXDateTime.convert(value, this.calendar.name());
295
318
  const func = (v1, v2) => {
296
319
  if (v1 == v2) {
297
320
  return 0;
@@ -476,6 +499,9 @@ class GeorgianCalendar {
476
499
  "Thu", "Fri", "Sat"
477
500
  ];
478
501
  }
502
+ create(value) {
503
+ return new AXDateTime(new Date(value.year, value.month - 1, value.date, value.hours || 0, value.minutes || 0, value.seconds || 0, value.ms || 0), this.name());
504
+ }
479
505
  name() {
480
506
  return 'gregorian';
481
507
  }
@@ -645,6 +671,10 @@ class JalaliCalendar {
645
671
  this.dayNames = ("شنبه_یکشنبه_دوشنبه_سه شنبه_چهارشنبه_پنج شنبه_جمعه").split("_");
646
672
  this.dayShortNames = "ش_ی_د_س_چ_پ_ج".split("_");
647
673
  }
674
+ create(value) {
675
+ const a = this.toGregorian(value.year, value.month, value.date);
676
+ return new AXDateTime(new Date(a.getFullYear(), a.getMonth(), a.getDate(), value.hours || 0, value.minutes || 0, value.seconds || 0, value.ms || 0), this.name());
677
+ }
648
678
  name() {
649
679
  return 'jalali';
650
680
  }
@@ -687,14 +717,10 @@ class JalaliCalendar {
687
717
  let jd = this.dayOfMonth(date);
688
718
  let jm = this.monthOfYear(date);
689
719
  let jy = this.year(date);
690
- jm = (jm + amount) % 12;
691
- if (0 > jm) {
692
- jy += (this.monthOfYear(date) + amount - jm - 12) / 12;
693
- jm += 12;
694
- }
695
- else {
696
- jy += ((this.monthOfYear(date) + amount - jm) / 12);
697
- }
720
+ const nm = (jm + amount);
721
+ const ny = (nm % 12) ? Math.floor(nm / 12) : 0;
722
+ jy += ny;
723
+ jm = nm - (ny * 12);
698
724
  const vv = this.toGregorian(jy, jm, jd);
699
725
  v.setFullYear(vv.getFullYear());
700
726
  v.setMonth(vv.getMonth());
@@ -707,6 +733,10 @@ class JalaliCalendar {
707
733
  break;
708
734
  case 'year':
709
735
  {
736
+ // const v = new Date(value);
737
+ // v.setFullYear(v.getFullYear() + amount);
738
+ // value = v.valueOf();
739
+ // break
710
740
  const v = new Date(value);
711
741
  let jd = this.dayOfMonth(date);
712
742
  let jm = this.monthOfYear(date);
@@ -716,8 +746,8 @@ class JalaliCalendar {
716
746
  v.setMonth(vv.getMonth());
717
747
  v.setDate(vv.getDate());
718
748
  value = v.valueOf();
749
+ break;
719
750
  }
720
- break;
721
751
  case 'day':
722
752
  default:
723
753
  value += 86400000 * amount;
@@ -725,7 +755,35 @@ class JalaliCalendar {
725
755
  return new AXDateTime(new Date(value), this.name());
726
756
  }
727
757
  set(date, unit, value) {
728
- throw new Error("Method not implemented.");
758
+ const clone = new Date(date.valueOf());
759
+ const jDate = this.toJalali(clone);
760
+ switch (unit) {
761
+ case 'second':
762
+ clone.setHours(clone.getHours(), clone.getMinutes(), value, clone.getMilliseconds());
763
+ break;
764
+ case 'minute':
765
+ clone.setHours(clone.getHours(), value, clone.getSeconds(), clone.getMilliseconds());
766
+ break;
767
+ case 'hour':
768
+ clone.setHours(value, clone.getMinutes(), clone.getSeconds(), clone.getMilliseconds());
769
+ break;
770
+ default:
771
+ case 'day':
772
+ const gDate = this.toGregorian(jDate.year, jDate.month, value);
773
+ clone.setDate(gDate.getDate());
774
+ break;
775
+ case "week":
776
+ break;
777
+ case "month":
778
+ const gDate2 = this.toGregorian(jDate.year, value, jDate.day);
779
+ clone.setMonth(gDate2.getMonth());
780
+ break;
781
+ case "year":
782
+ const gDate3 = this.toGregorian(value, jDate.month, jDate.day);
783
+ clone.setFullYear(gDate3.getFullYear());
784
+ break;
785
+ }
786
+ return new AXDateTime(clone, this.name());
729
787
  }
730
788
  startOf(date, unit) {
731
789
  const clone = new Date(date.valueOf());
@@ -973,7 +1031,7 @@ class AXDateTimeModule {
973
1031
  gregorian: new GeorgianCalendar()
974
1032
  },
975
1033
  calendar: 'gregorian',
976
- shortDateFormat: 'DDD, dd MMM yyyy'
1034
+ shortDateFormat: 'DDDD, d MMM yyyy'
977
1035
  }
978
1036
  });
979
1037
  }