@acorex/core 7.22.0 → 7.23.0

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.
Files changed (140) hide show
  1. package/{dateTime → date-time}/README.md +2 -2
  2. package/{dateTime → date-time}/lib/datetime.class.d.ts +1 -0
  3. package/{dateTime → date-time}/lib/formatters/datetime-formatter.d.ts +1 -1
  4. package/{dateTime → date-time}/lib/formatters/timeleft-formatter.d.ts +1 -1
  5. package/esm2022/acorex-core.mjs +1 -1
  6. package/esm2022/config/lib/configs.mjs +1 -1
  7. package/esm2022/config/lib/configs.service.mjs +3 -3
  8. package/esm2022/date-time/acorex-core-date-time.mjs +5 -0
  9. package/esm2022/date-time/index.mjs +11 -0
  10. package/esm2022/date-time/lib/calendar.service.mjs +100 -0
  11. package/esm2022/date-time/lib/dateTime.config.mjs +50 -0
  12. package/esm2022/date-time/lib/datetime.class.mjs +337 -0
  13. package/esm2022/date-time/lib/datetime.module.mjs +27 -0
  14. package/esm2022/date-time/lib/datetime.pipe.mjs +29 -0
  15. package/esm2022/date-time/lib/formatters/datetime-formatter.mjs +32 -0
  16. package/esm2022/date-time/lib/formatters/timeleft-formatter.mjs +91 -0
  17. package/esm2022/date-time/lib/georgian.calendar.mjs +203 -0
  18. package/esm2022/date-time/lib/holidays.loader.mjs +13 -0
  19. package/esm2022/date-time/lib/jalali.calendar.mjs +440 -0
  20. package/esm2022/events/lib/event.service.mjs +4 -4
  21. package/esm2022/events/lib/event.type.mjs +1 -1
  22. package/esm2022/file/lib/file-download-ref.class.mjs +1 -1
  23. package/esm2022/file/lib/file-size-formatter.mjs +4 -4
  24. package/esm2022/file/lib/file-upload-ref.class.mjs +1 -1
  25. package/esm2022/file/lib/file.module.mjs +6 -6
  26. package/esm2022/file/lib/file.service.mjs +5 -5
  27. package/esm2022/format/lib/format.config.mjs +1 -1
  28. package/esm2022/format/lib/format.module.mjs +13 -16
  29. package/esm2022/format/lib/format.pipe.mjs +10 -6
  30. package/esm2022/format/lib/format.service.mjs +19 -16
  31. package/esm2022/format/lib/format.types.mjs +1 -1
  32. package/esm2022/format/lib/formatters/number-formatter.mjs +6 -7
  33. package/esm2022/format/lib/formatters/string-formatter.mjs +1 -1
  34. package/esm2022/image/lib/image.service.mjs +4 -4
  35. package/esm2022/index.mjs +2 -2
  36. package/esm2022/lib/core.component.mjs +12 -0
  37. package/esm2022/memorize/lib/memorize.decorator.mjs +1 -1
  38. package/esm2022/pipes/lib/safe/safe.pipe.mjs +4 -4
  39. package/esm2022/platform/lib/platform.service.mjs +47 -42
  40. package/esm2022/storage/cookie-storage.service.mjs +15 -8
  41. package/esm2022/storage/local-storage.service.mjs +46 -10
  42. package/esm2022/storage/session-storage.service.mjs +3 -3
  43. package/esm2022/translation/lib/translation-scope.resolver.mjs +4 -4
  44. package/esm2022/translation/lib/translation.config.mjs +2 -2
  45. package/esm2022/translation/lib/translation.loader.mjs +3 -3
  46. package/esm2022/translation/lib/translation.module.mjs +10 -10
  47. package/esm2022/translation/lib/translation.service.mjs +19 -11
  48. package/esm2022/translation/lib/translation.types.mjs +1 -1
  49. package/esm2022/translation/lib/translator.directive.mjs +5 -5
  50. package/esm2022/translation/lib/translator.pipe.mjs +4 -4
  51. package/esm2022/utils/lib/auto-unsubscribe.mjs +4 -4
  52. package/esm2022/utils/lib/color-util.mjs +4 -2
  53. package/esm2022/utils/lib/drawing-util.mjs +6 -3
  54. package/esm2022/utils/lib/html-util.mjs +17 -3
  55. package/esm2022/utils/lib/string-util.mjs +1 -1
  56. package/esm2022/validation/lib/rules/between-rule.mjs +7 -7
  57. package/esm2022/validation/lib/rules/callback-rule.mjs +10 -7
  58. package/esm2022/validation/lib/rules/equal-rule.mjs +7 -7
  59. package/esm2022/validation/lib/rules/greater-than.mjs +12 -8
  60. package/esm2022/validation/lib/rules/length-rule.mjs +10 -7
  61. package/esm2022/validation/lib/rules/less-than-rule.mjs +12 -8
  62. package/esm2022/validation/lib/rules/maxlength-rule.mjs +12 -9
  63. package/esm2022/validation/lib/rules/minlength-rule.mjs +12 -9
  64. package/esm2022/validation/lib/rules/regex-rule.mjs +15 -12
  65. package/esm2022/validation/lib/rules/required-rule.mjs +14 -14
  66. package/esm2022/validation/lib/validation.config.mjs +3 -3
  67. package/esm2022/validation/lib/validation.module.mjs +15 -19
  68. package/esm2022/validation/lib/validation.service.mjs +19 -16
  69. package/esm2022/validation/lib/validation.types.mjs +1 -1
  70. package/fesm2022/acorex-core-config.mjs +3 -3
  71. package/fesm2022/acorex-core-config.mjs.map +1 -1
  72. package/fesm2022/{acorex-core-dateTime.mjs → acorex-core-date-time.mjs} +96 -45
  73. package/fesm2022/acorex-core-date-time.mjs.map +1 -0
  74. package/fesm2022/acorex-core-events.mjs +3 -3
  75. package/fesm2022/acorex-core-events.mjs.map +1 -1
  76. package/fesm2022/acorex-core-file.mjs +12 -12
  77. package/fesm2022/acorex-core-file.mjs.map +1 -1
  78. package/fesm2022/acorex-core-format.mjs +43 -40
  79. package/fesm2022/acorex-core-format.mjs.map +1 -1
  80. package/fesm2022/acorex-core-image.mjs +3 -3
  81. package/fesm2022/acorex-core-image.mjs.map +1 -1
  82. package/fesm2022/acorex-core-memorize.mjs.map +1 -1
  83. package/fesm2022/acorex-core-pipes.mjs +3 -3
  84. package/fesm2022/acorex-core-pipes.mjs.map +1 -1
  85. package/fesm2022/acorex-core-platform.mjs +46 -41
  86. package/fesm2022/acorex-core-platform.mjs.map +1 -1
  87. package/fesm2022/acorex-core-storage.mjs +63 -20
  88. package/fesm2022/acorex-core-storage.mjs.map +1 -1
  89. package/fesm2022/acorex-core-translation.mjs +31 -23
  90. package/fesm2022/acorex-core-translation.mjs.map +1 -1
  91. package/fesm2022/acorex-core-utils.mjs +27 -8
  92. package/fesm2022/acorex-core-utils.mjs.map +1 -1
  93. package/fesm2022/acorex-core-validation.mjs +110 -88
  94. package/fesm2022/acorex-core-validation.mjs.map +1 -1
  95. package/fesm2022/acorex-core.mjs +14 -1
  96. package/fesm2022/acorex-core.mjs.map +1 -1
  97. package/file/lib/file-size-formatter.d.ts +1 -1
  98. package/format/lib/format.config.d.ts +1 -1
  99. package/format/lib/format.service.d.ts +5 -5
  100. package/format/lib/formatters/number-formatter.d.ts +1 -1
  101. package/format/lib/formatters/string-formatter.d.ts +1 -1
  102. package/index.d.ts +1 -2
  103. package/lib/core.component.d.ts +5 -0
  104. package/package.json +15 -15
  105. package/storage/local-storage.service.d.ts +6 -0
  106. package/translation/lib/translation-scope.resolver.d.ts +1 -1
  107. package/translation/lib/translation.config.d.ts +2 -2
  108. package/translation/lib/translation.loader.d.ts +3 -3
  109. package/validation/lib/rules/between-rule.d.ts +2 -2
  110. package/validation/lib/rules/callback-rule.d.ts +2 -2
  111. package/validation/lib/rules/equal-rule.d.ts +2 -2
  112. package/validation/lib/rules/greater-than.d.ts +2 -2
  113. package/validation/lib/rules/length-rule.d.ts +2 -2
  114. package/validation/lib/rules/less-than-rule.d.ts +2 -2
  115. package/validation/lib/rules/maxlength-rule.d.ts +2 -2
  116. package/validation/lib/rules/minlength-rule.d.ts +2 -2
  117. package/validation/lib/rules/regex-rule.d.ts +2 -2
  118. package/validation/lib/rules/required-rule.d.ts +2 -2
  119. package/validation/lib/validation.service.d.ts +4 -4
  120. package/esm2022/dateTime/acorex-core-dateTime.mjs +0 -5
  121. package/esm2022/dateTime/index.mjs +0 -11
  122. package/esm2022/dateTime/lib/calendar.service.mjs +0 -91
  123. package/esm2022/dateTime/lib/dateTime.config.mjs +0 -50
  124. package/esm2022/dateTime/lib/datetime.class.mjs +0 -325
  125. package/esm2022/dateTime/lib/datetime.module.mjs +0 -21
  126. package/esm2022/dateTime/lib/datetime.pipe.mjs +0 -29
  127. package/esm2022/dateTime/lib/formatters/datetime-formatter.mjs +0 -30
  128. package/esm2022/dateTime/lib/formatters/timeleft-formatter.mjs +0 -91
  129. package/esm2022/dateTime/lib/georgian.calendar.mjs +0 -198
  130. package/esm2022/dateTime/lib/holidays.loader.mjs +0 -13
  131. package/esm2022/dateTime/lib/jalali.calendar.mjs +0 -423
  132. package/fesm2022/acorex-core-dateTime.mjs.map +0 -1
  133. /package/{dateTime → date-time}/index.d.ts +0 -0
  134. /package/{dateTime → date-time}/lib/calendar.service.d.ts +0 -0
  135. /package/{dateTime → date-time}/lib/dateTime.config.d.ts +0 -0
  136. /package/{dateTime → date-time}/lib/datetime.module.d.ts +0 -0
  137. /package/{dateTime → date-time}/lib/datetime.pipe.d.ts +0 -0
  138. /package/{dateTime → date-time}/lib/georgian.calendar.d.ts +0 -0
  139. /package/{dateTime → date-time}/lib/holidays.loader.d.ts +0 -0
  140. /package/{dateTime → date-time}/lib/jalali.calendar.d.ts +0 -0
@@ -1,423 +0,0 @@
1
- import { AXCalendar, AXDateTime } from './datetime.class';
2
- export class JalaliCalendar extends AXCalendar {
3
- /**
4
- * @ignore
5
- */
6
- constructor(config) {
7
- super(config);
8
- /*
9
- Jalaali years starting the 33-year rule.
10
- */
11
- this.breaks = [
12
- -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456,
13
- 3178,
14
- ];
15
- }
16
- create(value) {
17
- const a = this.toGregorian(value.year, value.month, value.date);
18
- return new AXDateTime(new Date(a.getFullYear(), a.getMonth(), a.getDate(), value.hours || 0, value.minutes || 0, value.seconds || 0, value.ms || 0), this);
19
- }
20
- name() {
21
- return 'jalali';
22
- }
23
- dayOfMonth(date) {
24
- return this.toJalaali(date).day;
25
- }
26
- dayOfYear(date) {
27
- const j = this.toJalaali(date);
28
- return (j.month <= 6 ? (j.month - 1) * 31 : 6 * 31 + (j.month - 7) * 30) + j.day;
29
- }
30
- dayOfWeek(date) {
31
- return date.getDay() == 6 ? 1 : date.getDay() + 2;
32
- }
33
- weekOfYear(date) {
34
- //TODO : apply jalali
35
- const firstDay = new AXDateTime(date, this).startOf('year');
36
- return Math.ceil(((date.getTime() - firstDay.date.getTime()) / 86400000 + firstDay.date.getDay() + 1) / 7);
37
- }
38
- year(date) {
39
- return this.toJalaali(date).year;
40
- }
41
- monthOfYear(date) {
42
- return this.toJalaali(date).month;
43
- }
44
- add(date, unit, amount) {
45
- let value = date.valueOf();
46
- switch (unit) {
47
- case 'second':
48
- value += 1000 * amount;
49
- break;
50
- case 'minute':
51
- value += 60000 * amount;
52
- break;
53
- case 'hour':
54
- value += 3600000 * amount;
55
- break;
56
- case 'month': {
57
- // const v = new Date(value);
58
- // let jd = this.dayOfMonth(date);
59
- // let jm = this.monthOfYear(date);
60
- // let jy = this.year(date);
61
- // const nm = jm + amount;
62
- // const ny = nm % 12 ? Math.floor(nm / 12) : 0;
63
- // jy += ny;
64
- // jm = nm - ny * 12;
65
- // const vv = this.toGregorian(jy, jm, jd);
66
- // v.setFullYear(vv.getFullYear());
67
- // v.setMonth(vv.getMonth());
68
- // v.setDate(vv.getDate());
69
- // value = v.valueOf();
70
- // break;
71
- let jd = this.dayOfMonth(date);
72
- let jm = this.monthOfYear(date);
73
- let jy = this.year(date);
74
- let newMonth = jm + amount;
75
- let yearsToAdd = Math.floor(newMonth / 12);
76
- newMonth = newMonth % 12;
77
- if (newMonth <= 0) {
78
- newMonth += 12;
79
- yearsToAdd--;
80
- }
81
- jy += yearsToAdd;
82
- // Temporary set to first of the month to prevent rollover
83
- const tempDate = this.toGregorian(jy, newMonth, 1);
84
- const gregorianDate = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate());
85
- // Adjust the day to either the original day or the last day of the new month, whichever is smaller
86
- const lastDayOfNewMonth = this.jalaaliMonthLength(jy, newMonth); // Implement this method to find the last day in a Jalali month
87
- jd = Math.min(jd, lastDayOfNewMonth);
88
- const finalDate = this.toGregorian(jy, newMonth, jd);
89
- gregorianDate.setFullYear(finalDate.getFullYear());
90
- gregorianDate.setMonth(finalDate.getMonth());
91
- gregorianDate.setDate(finalDate.getDate());
92
- value = gregorianDate.valueOf();
93
- break;
94
- }
95
- case 'week':
96
- value += 7 * 86400000 * amount;
97
- break;
98
- case 'year': {
99
- const v = new Date(value);
100
- let jd = this.dayOfMonth(date);
101
- let jm = this.monthOfYear(date);
102
- let jy = this.year(date);
103
- const vv = this.toGregorian(jy + amount, jm, jd);
104
- v.setFullYear(vv.getFullYear());
105
- v.setMonth(vv.getMonth());
106
- v.setDate(vv.getDate());
107
- value = v.valueOf();
108
- break;
109
- }
110
- case 'day':
111
- default:
112
- value += 86400000 * amount;
113
- }
114
- return new AXDateTime(new Date(value), this);
115
- }
116
- set(date, unit, value) {
117
- const clone = new Date(date.valueOf());
118
- const jDate = this.toJalaali(clone);
119
- switch (unit) {
120
- case 'second':
121
- clone.setHours(clone.getHours(), clone.getMinutes(), value, clone.getMilliseconds());
122
- break;
123
- case 'minute':
124
- clone.setHours(clone.getHours(), value, clone.getSeconds(), clone.getMilliseconds());
125
- break;
126
- case 'hour':
127
- clone.setHours(value, clone.getMinutes(), clone.getSeconds(), clone.getMilliseconds());
128
- break;
129
- default:
130
- case 'day': {
131
- const gDate = this.toGregorian(jDate.year, jDate.month, value);
132
- clone.setDate(gDate.getDate());
133
- break;
134
- }
135
- case 'week':
136
- break;
137
- case 'month': {
138
- const gDate2 = this.toGregorian(jDate.year, value, jDate.day);
139
- clone.setMonth(gDate2.getMonth());
140
- break;
141
- }
142
- case 'year': {
143
- const gDate3 = this.toGregorian(value, jDate.month, jDate.day);
144
- clone.setFullYear(gDate3.getFullYear());
145
- break;
146
- }
147
- }
148
- return new AXDateTime(clone, this);
149
- }
150
- startOf(date, unit) {
151
- const clone = new Date(date.valueOf());
152
- switch (unit) {
153
- case 'second':
154
- clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 0);
155
- return new AXDateTime(clone, this);
156
- case 'minute':
157
- clone.setHours(clone.getHours(), clone.getMinutes(), 0, 0);
158
- return new AXDateTime(clone, this);
159
- case 'hour':
160
- clone.setHours(clone.getHours(), 0, 0, 0);
161
- return new AXDateTime(clone, this);
162
- default:
163
- case 'day':
164
- clone.setHours(0, 0, 0, 0);
165
- return new AXDateTime(clone, this);
166
- case 'week':
167
- return new AXDateTime(clone, this).add('day', -this.dayOfWeek(clone) + 1).startOf('day');
168
- case 'month': {
169
- const jy = this.year(date);
170
- const jm = this.monthOfYear(date);
171
- const gDate = this.toGregorian(jy, jm, 1);
172
- return new AXDateTime(gDate, this).startOf('day');
173
- }
174
- case 'year': {
175
- const jy = this.year(date);
176
- const gDate = this.toGregorian(jy, 1, 1);
177
- return new AXDateTime(gDate, this).startOf('day');
178
- }
179
- }
180
- }
181
- endOf(date, unit) {
182
- const clone = new Date(date.valueOf());
183
- switch (unit) {
184
- case 'second':
185
- clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 999);
186
- return new AXDateTime(clone, this);
187
- case 'minute':
188
- clone.setHours(clone.getHours(), clone.getMinutes(), 59, 999);
189
- return new AXDateTime(clone, this);
190
- case 'hour':
191
- clone.setHours(clone.getHours(), 59, 59, 999);
192
- return new AXDateTime(clone, this);
193
- default:
194
- case 'day':
195
- clone.setHours(23, 59, 59, 999);
196
- return new AXDateTime(clone, this);
197
- case 'week': {
198
- return this.startOf(date, 'week').add('day', 6).endOf('day');
199
- }
200
- case 'month': {
201
- const jy = this.year(date);
202
- const jm = this.monthOfYear(date);
203
- const jd = this.jalaaliMonthLength(jy, jm);
204
- const gDate = this.toGregorian(jy, jm, jd);
205
- return new AXDateTime(gDate, this).endOf('day');
206
- }
207
- case 'year': {
208
- const jy = this.year(date);
209
- const gDate = this.toGregorian(jy, 12, this.jalaaliMonthLength(jy, 12));
210
- return new AXDateTime(gDate, this).endOf('day');
211
- }
212
- }
213
- }
214
- parse(value) {
215
- const [y, M, d, h, m, s, ms] = value.split(/[^a-zA-Z0-9]+/gi);
216
- const date = this.toGregorian(Number(y) ?? 0, Number(M) ?? 1, Number(d) ?? 1);
217
- if (h != null)
218
- date.setHours(Number(h));
219
- if (m != null)
220
- date.setMinutes(Number(m));
221
- if (s != null)
222
- date.setSeconds(Number(s));
223
- if (ms != null)
224
- date.setMilliseconds(Number(d));
225
- return new AXDateTime(date, this);
226
- }
227
- /*
228
- Converts a Gregorian date to Jalaali.
229
- */
230
- toJalaali(date) {
231
- const gd = date.getDate();
232
- const gm = date.getMonth() + 1;
233
- const gy = date.getFullYear();
234
- const r = this.d2j(this.g2d(gy, gm, gd));
235
- return {
236
- year: r.jy,
237
- month: r.jm,
238
- day: r.jd,
239
- };
240
- }
241
- /*
242
- Converts a Jalaali date to Gregorian.
243
- */
244
- toGregorian(jy, jm, jd) {
245
- const g = this.d2g(this.j2d(jy, jm, jd));
246
- return new Date(g.gy, g.gm - 1, g.gd);
247
- }
248
- /*
249
- Checks whether a Jalaali date is valid or not.
250
- */
251
- isValidJalaaliDate(jy, jm, jd) {
252
- return jy >= -61 && jy <= 3177 && jm >= 1 && jm <= 12 && jd >= 1 && jd <= this.jalaaliMonthLength(jy, jm);
253
- }
254
- /*
255
- Is this a leap year or not?
256
- */
257
- isLeapJalaaliYear(jy) {
258
- return this.jalCalLeap(jy) === 0;
259
- }
260
- /*
261
- Number of days in a given month in a Jalaali year.
262
- */
263
- jalaaliMonthLength(jy, jm) {
264
- if (jm <= 6)
265
- return 31;
266
- if (jm <= 11)
267
- return 30;
268
- if (this.isLeapJalaaliYear(jy))
269
- return 30;
270
- return 29;
271
- }
272
- /*
273
- This determines if the Jalaali (Persian) year is
274
- leap (366-day long) or is the common year (365 days)
275
-
276
- @param jy Jalaali calendar year (-61 to 3177)
277
- @returns number of years since the last leap year (0 to 4)
278
- */
279
- jalCalLeap(jy) {
280
- let bl = this.breaks.length, jp = this.breaks[0], jm, jump, leap, n, i;
281
- if (jy < jp || jy >= this.breaks[bl - 1])
282
- throw new Error('Invalid Jalaali year ' + jy);
283
- for (i = 1; i < bl; i += 1) {
284
- jm = this.breaks[i];
285
- jump = jm - jp;
286
- if (jy < jm)
287
- break;
288
- jp = jm;
289
- }
290
- n = jy - jp;
291
- if (jump - n < 6)
292
- n = n - jump + this.div(jump + 4, 33) * 33;
293
- leap = this.mod(this.mod(n + 1, 33) - 1, 4);
294
- if (leap === -1) {
295
- leap = 4;
296
- }
297
- return leap;
298
- }
299
- jalCal(jy, withoutLeap) {
300
- let bl = this.breaks.length, gy = jy + 621, leapJ = -14, jp = this.breaks[0], jm, jump, leap, leapG, march, n, i;
301
- if (jy < jp || jy >= this.breaks[bl - 1])
302
- throw new Error('Invalid Jalaali year ' + jy);
303
- // Find the limiting years for the Jalaali year jy.
304
- for (i = 1; i < bl; i += 1) {
305
- jm = this.breaks[i];
306
- jump = jm - jp;
307
- if (jy < jm)
308
- break;
309
- leapJ = leapJ + this.div(jump, 33) * 8 + this.div(this.mod(jump, 33), 4);
310
- jp = jm;
311
- }
312
- n = jy - jp;
313
- // Find the number of leap years from AD 621 to the beginning
314
- // of the current Jalaali year in the Persian calendar.
315
- leapJ = leapJ + this.div(n, 33) * 8 + this.div(this.mod(n, 33) + 3, 4);
316
- if (this.mod(jump, 33) === 4 && jump - n === 4)
317
- leapJ += 1;
318
- // And the same in the Gregorian calendar (until the year gy).
319
- leapG = this.div(gy, 4) - this.div((this.div(gy, 100) + 1) * 3, 4) - 150;
320
- // Determine the Gregorian date of Farvardin the 1st.
321
- march = 20 + leapJ - leapG;
322
- // return with gy and march when we don't need leap
323
- if (withoutLeap)
324
- return { gy: gy, march: march };
325
- // Find how many years have passed since the last leap year.
326
- if (jump - n < 6)
327
- n = n - jump + this.div(jump + 4, 33) * 33;
328
- leap = this.mod(this.mod(n + 1, 33) - 1, 4);
329
- if (leap === -1) {
330
- leap = 4;
331
- }
332
- return {
333
- leap: leap,
334
- gy: gy,
335
- march: march,
336
- };
337
- }
338
- j2d(jy, jm, jd) {
339
- let r = this.jalCal(jy, true);
340
- return this.g2d(r.gy, 3, r.march) + (jm - 1) * 31 - this.div(jm, 7) * (jm - 7) + jd - 1;
341
- }
342
- d2j(jdn) {
343
- let gy = this.d2g(jdn).gy, // Calculate Gregorian year (gy).
344
- jy = gy - 621, r = this.jalCal(jy, false), jdn1f = this.g2d(gy, 3, r.march), jd, jm, k;
345
- // Find number of days that passed since 1 Farvardin.
346
- k = jdn - jdn1f;
347
- if (k >= 0) {
348
- if (k <= 185) {
349
- // The first 6 months.
350
- jm = 1 + this.div(k, 31);
351
- jd = this.mod(k, 31) + 1;
352
- return {
353
- jy: jy,
354
- jm: jm,
355
- jd: jd,
356
- };
357
- }
358
- else {
359
- // The remaining months.
360
- k -= 186;
361
- }
362
- }
363
- else {
364
- // Previous Jalaali year.
365
- jy -= 1;
366
- k += 179;
367
- if (r.leap === 1)
368
- k += 1;
369
- }
370
- jm = 7 + this.div(k, 30);
371
- jd = this.mod(k, 30) + 1;
372
- return {
373
- jy: jy,
374
- jm: jm,
375
- jd: jd,
376
- };
377
- }
378
- g2d(gy, gm, gd) {
379
- let d = this.div((gy + this.div(gm - 8, 6) + 100100) * 1461, 4) +
380
- this.div(153 * this.mod(gm + 9, 12) + 2, 5) +
381
- gd -
382
- 34840408;
383
- d = d - this.div(this.div(gy + 100100 + this.div(gm - 8, 6), 100) * 3, 4) + 752;
384
- return d;
385
- }
386
- d2g(jdn) {
387
- let j, i, gd, gm, gy;
388
- j = 4 * jdn + 139361631;
389
- j = j + this.div(this.div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
390
- i = this.div(this.mod(j, 1461), 4) * 5 + 308;
391
- gd = this.div(this.mod(i, 153), 5) + 1;
392
- gm = this.mod(this.div(i, 153), 12) + 1;
393
- gy = this.div(j, 1461) - 100100 + this.div(8 - gm, 6);
394
- return {
395
- gy: gy,
396
- gm: gm,
397
- gd: gd,
398
- };
399
- }
400
- jalaaliWeek(jy, jm, jd) {
401
- let dayOfWeek = this.jalaaliToDateObject(jy, jm, jd, 0, 0, 0, 0).getDay();
402
- let startDayDifference = dayOfWeek == 6 ? 0 : -(dayOfWeek + 1);
403
- let endDayDifference = 6 + startDayDifference;
404
- return {
405
- saturday: this.d2j(this.j2d(jy, jm, jd + startDayDifference)),
406
- friday: this.d2j(this.j2d(jy, jm, jd + endDayDifference)),
407
- };
408
- }
409
- jalaaliToDateObject(jy, jm, jd, h = 0, m = 0, s = 0, ms = 0) {
410
- let gregorianCalenderDate = this.toGregorian(jy, jm, jd);
411
- return new Date(gregorianCalenderDate.getFullYear(), gregorianCalenderDate.getMonth() - 1, gregorianCalenderDate.getDate(), h || 0, m || 0, s || 0, ms || 0);
412
- }
413
- /*
414
- Utility helper functions.
415
- */
416
- div(a, b) {
417
- return ~~(a / b);
418
- }
419
- mod(a, b) {
420
- return a - ~~(a / b) * b;
421
- }
422
- }
423
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamFsYWxpLmNhbGVuZGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL2RhdGVUaW1lL3NyYy9saWIvamFsYWxpLmNhbGVuZGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQW9CLFVBQVUsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRyxNQUFNLE9BQU8sY0FBZSxTQUFRLFVBQVU7SUFDNUM7O09BRUc7SUFDSCxZQUFZLE1BQXdCO1FBQ2xDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUdoQjs7UUFFQTtRQUNRLFdBQU0sR0FBRztZQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNyRyxJQUFJO1NBQ0wsQ0FBQztJQVJGLENBQUM7SUFVRCxNQUFNLENBQUMsS0FBa0I7UUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxVQUFVLENBQ25CLElBQUksSUFBSSxDQUNOLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFDZixDQUFDLENBQUMsUUFBUSxFQUFFLEVBQ1osQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUNYLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUNoQixLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFDbEIsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQ2xCLEtBQUssQ0FB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RyxDQUFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDaEYsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sR0FBRyxDQUFDLEdBQVc7UUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQztRQUN4QixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTztZQUNMLEVBQUUsRUFBRSxFQUFFO1lBQ04sRUFBRSxFQUFFLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRU8sV0FBVyxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVTtRQUNwRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFMUUsSUFBSSxrQkFBa0IsR0FBRyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFFOUMsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztZQUM3RCxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7U0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsRUFBVSxFQUNWLEVBQVUsRUFDVixFQUFVLEVBQ1YsSUFBWSxDQUFDLEVBQ2IsSUFBWSxDQUFDLEVBQ2IsSUFBWSxDQUFDLEVBQ2IsS0FBYSxDQUFDO1FBRWQsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekQsT0FBTyxJQUFJLElBQUksQ0FDYixxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsRUFDbkMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUNwQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsRUFDL0IsQ0FBQyxJQUFJLENBQUMsRUFDTixDQUFDLElBQUksQ0FBQyxFQUNOLENBQUMsSUFBSSxDQUFDLEVBQ04sRUFBRSxJQUFJLENBQUMsQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVEOztNQUVFO0lBRU0sR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTO1FBQzlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWENhbGVuZGFyLCBBWENhbGVuZGFyQ29uZmlnLCBBWERhdGVUaW1lLCBBWERhdGVWYWx1ZSwgVGltZVVuaXQgfSBmcm9tICcuL2RhdGV0aW1lLmNsYXNzJztcblxuZXhwb3J0IGNsYXNzIEphbGFsaUNhbGVuZGFyIGV4dGVuZHMgQVhDYWxlbmRhciB7XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IEFYQ2FsZW5kYXJDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuICB9XG5cbiAgLypcbiAgSmFsYWFsaSB5ZWFycyBzdGFydGluZyB0aGUgMzMteWVhciBydWxlLlxuKi9cbiAgcHJpdmF0ZSBicmVha3MgPSBbXG4gICAgLTYxLCA5LCAzOCwgMTk5LCA0MjYsIDY4NiwgNzU2LCA4MTgsIDExMTEsIDExODEsIDEyMTAsIDE2MzUsIDIwNjAsIDIwOTcsIDIxOTIsIDIyNjIsIDIzMjQsIDIzOTQsIDI0NTYsXG4gICAgMzE3OCxcbiAgXTtcblxuICBjcmVhdGUodmFsdWU6IEFYRGF0ZVZhbHVlKTogQVhEYXRlVGltZSB7XG4gICAgY29uc3QgYSA9IHRoaXMudG9HcmVnb3JpYW4odmFsdWUueWVhciwgdmFsdWUubW9udGgsIHZhbHVlLmRhdGUpO1xuICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShcbiAgICAgIG5ldyBEYXRlKFxuICAgICAgICBhLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGEuZ2V0TW9udGgoKSxcbiAgICAgICAgYS5nZXREYXRlKCksXG4gICAgICAgIHZhbHVlLmhvdXJzIHx8IDAsXG4gICAgICAgIHZhbHVlLm1pbnV0ZXMgfHwgMCxcbiAgICAgICAgdmFsdWUuc2Vjb25kcyB8fCAwLFxuICAgICAgICB2YWx1ZS5tcyB8fCAwLFxuICAgICAgKSxcbiAgICAgIHRoaXMsXG4gICAgKTtcbiAgfVxuXG4gIG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2phbGFsaSc7XG4gIH1cblxuICBkYXlPZk1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRvSmFsYWFsaShkYXRlKS5kYXk7XG4gIH1cblxuICBkYXlPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgY29uc3QgaiA9IHRoaXMudG9KYWxhYWxpKGRhdGUpO1xuICAgIHJldHVybiAoai5tb250aCA8PSA2ID8gKGoubW9udGggLSAxKSAqIDMxIDogNiAqIDMxICsgKGoubW9udGggLSA3KSAqIDMwKSArIGouZGF5O1xuICB9XG5cbiAgZGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLmdldERheSgpID09IDYgPyAxIDogZGF0ZS5nZXREYXkoKSArIDI7XG4gIH1cblxuICB3ZWVrT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIC8vVE9ETyA6IGFwcGx5IGphbGFsaVxuICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IEFYRGF0ZVRpbWUoZGF0ZSwgdGhpcykuc3RhcnRPZigneWVhcicpO1xuICAgIHJldHVybiBNYXRoLmNlaWwoXG4gICAgICAoKGRhdGUuZ2V0VGltZSgpIC0gZmlyc3REYXkuZGF0ZS5nZXRUaW1lKCkpIC8gODY0MDAwMDAgKyBmaXJzdERheS5kYXRlLmdldERheSgpICsgMSkgLyA3LFxuICAgICk7XG4gIH1cblxuICB5ZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRvSmFsYWFsaShkYXRlKS55ZWFyO1xuICB9XG5cbiAgbW9udGhPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9KYWxhYWxpKGRhdGUpLm1vbnRoO1xuICB9XG5cbiAgYWRkKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCBhbW91bnQ6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xuICAgIGxldCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgdmFsdWUgKz0gMTAwMCAqIGFtb3VudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICB2YWx1ZSArPSA2MDAwMCAqIGFtb3VudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgdmFsdWUgKz0gMzYwMDAwMCAqIGFtb3VudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb250aCc6IHtcbiAgICAgICAgLy8gY29uc3QgdiA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgLy8gbGV0IGpkID0gdGhpcy5kYXlPZk1vbnRoKGRhdGUpO1xuICAgICAgICAvLyBsZXQgam0gPSB0aGlzLm1vbnRoT2ZZZWFyKGRhdGUpO1xuICAgICAgICAvLyBsZXQgankgPSB0aGlzLnllYXIoZGF0ZSk7XG4gICAgICAgIC8vIGNvbnN0IG5tID0gam0gKyBhbW91bnQ7XG4gICAgICAgIC8vIGNvbnN0IG55ID0gbm0gJSAxMiA/IE1hdGguZmxvb3Iobm0gLyAxMikgOiAwO1xuICAgICAgICAvLyBqeSArPSBueTtcbiAgICAgICAgLy8gam0gPSBubSAtIG55ICogMTI7XG4gICAgICAgIC8vIGNvbnN0IHZ2ID0gdGhpcy50b0dyZWdvcmlhbihqeSwgam0sIGpkKTtcbiAgICAgICAgLy8gdi5zZXRGdWxsWWVhcih2di5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgLy8gdi5zZXRNb250aCh2di5nZXRNb250aCgpKTtcbiAgICAgICAgLy8gdi5zZXREYXRlKHZ2LmdldERhdGUoKSk7XG4gICAgICAgIC8vIHZhbHVlID0gdi52YWx1ZU9mKCk7XG4gICAgICAgIC8vIGJyZWFrO1xuICAgICAgICBsZXQgamQgPSB0aGlzLmRheU9mTW9udGgoZGF0ZSk7XG4gICAgICAgIGxldCBqbSA9IHRoaXMubW9udGhPZlllYXIoZGF0ZSk7XG4gICAgICAgIGxldCBqeSA9IHRoaXMueWVhcihkYXRlKTtcblxuICAgICAgICBsZXQgbmV3TW9udGggPSBqbSArIGFtb3VudDtcbiAgICAgICAgbGV0IHllYXJzVG9BZGQgPSBNYXRoLmZsb29yKG5ld01vbnRoIC8gMTIpO1xuICAgICAgICBuZXdNb250aCA9IG5ld01vbnRoICUgMTI7XG4gICAgICAgIGlmIChuZXdNb250aCA8PSAwKSB7XG4gICAgICAgICAgbmV3TW9udGggKz0gMTI7XG4gICAgICAgICAgeWVhcnNUb0FkZC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgankgKz0geWVhcnNUb0FkZDtcblxuICAgICAgICAvLyBUZW1wb3Jhcnkgc2V0IHRvIGZpcnN0IG9mIHRoZSBtb250aCB0byBwcmV2ZW50IHJvbGxvdmVyXG4gICAgICAgIGNvbnN0IHRlbXBEYXRlID0gdGhpcy50b0dyZWdvcmlhbihqeSwgbmV3TW9udGgsIDEpO1xuICAgICAgICBjb25zdCBncmVnb3JpYW5EYXRlID0gbmV3IERhdGUodGVtcERhdGUuZ2V0RnVsbFllYXIoKSwgdGVtcERhdGUuZ2V0TW9udGgoKSwgdGVtcERhdGUuZ2V0RGF0ZSgpKTtcblxuICAgICAgICAvLyBBZGp1c3QgdGhlIGRheSB0byBlaXRoZXIgdGhlIG9yaWdpbmFsIGRheSBvciB0aGUgbGFzdCBkYXkgb2YgdGhlIG5ldyBtb250aCwgd2hpY2hldmVyIGlzIHNtYWxsZXJcbiAgICAgICAgY29uc3QgbGFzdERheU9mTmV3TW9udGggPSB0aGlzLmphbGFhbGlNb250aExlbmd0aChqeSwgbmV3TW9udGgpOyAvLyBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZmluZCB0aGUgbGFzdCBkYXkgaW4gYSBKYWxhbGkgbW9udGhcbiAgICAgICAgamQgPSBNYXRoLm1pbihqZCwgbGFzdERheU9mTmV3TW9udGgpO1xuXG4gICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIG5ld01vbnRoLCBqZCk7XG4gICAgICAgIGdyZWdvcmlhbkRhdGUuc2V0RnVsbFllYXIoZmluYWxEYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICBncmVnb3JpYW5EYXRlLnNldE1vbnRoKGZpbmFsRGF0ZS5nZXRNb250aCgpKTtcbiAgICAgICAgZ3JlZ29yaWFuRGF0ZS5zZXREYXRlKGZpbmFsRGF0ZS5nZXREYXRlKCkpO1xuXG4gICAgICAgIHZhbHVlID0gZ3JlZ29yaWFuRGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIHZhbHVlICs9IDcgKiA4NjQwMDAwMCAqIGFtb3VudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd5ZWFyJzoge1xuICAgICAgICBjb25zdCB2ID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICBsZXQgamQgPSB0aGlzLmRheU9mTW9udGgoZGF0ZSk7XG4gICAgICAgIGxldCBqbSA9IHRoaXMubW9udGhPZlllYXIoZGF0ZSk7XG4gICAgICAgIGxldCBqeSA9IHRoaXMueWVhcihkYXRlKTtcbiAgICAgICAgY29uc3QgdnYgPSB0aGlzLnRvR3JlZ29yaWFuKGp5ICsgYW1vdW50LCBqbSwgamQpO1xuICAgICAgICB2LnNldEZ1bGxZZWFyKHZ2LmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICB2LnNldE1vbnRoKHZ2LmdldE1vbnRoKCkpO1xuICAgICAgICB2LnNldERhdGUodnYuZ2V0RGF0ZSgpKTtcbiAgICAgICAgdmFsdWUgPSB2LnZhbHVlT2YoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdkYXknOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFsdWUgKz0gODY0MDAwMDAgKiBhbW91bnQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShuZXcgRGF0ZSh2YWx1ZSksIHRoaXMpO1xuICB9XG5cbiAgc2V0KGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCB2YWx1ZTogbnVtYmVyKTogQVhEYXRlVGltZSB7XG4gICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XG4gICAgY29uc3QgakRhdGUgPSB0aGlzLnRvSmFsYWFsaShjbG9uZSk7XG4gICAgc3dpdGNoICh1bml0KSB7XG4gICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIHZhbHVlLCBjbG9uZS5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgdmFsdWUsIGNsb25lLmdldFNlY29uZHMoKSwgY2xvbmUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjbG9uZS5zZXRIb3Vycyh2YWx1ZSwgY2xvbmUuZ2V0TWludXRlcygpLCBjbG9uZS5nZXRTZWNvbmRzKCksIGNsb25lLmdldE1pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSAnZGF5Jzoge1xuICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oakRhdGUueWVhciwgakRhdGUubW9udGgsIHZhbHVlKTtcbiAgICAgICAgY2xvbmUuc2V0RGF0ZShnRGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vbnRoJzoge1xuICAgICAgICBjb25zdCBnRGF0ZTIgPSB0aGlzLnRvR3JlZ29yaWFuKGpEYXRlLnllYXIsIHZhbHVlLCBqRGF0ZS5kYXkpO1xuICAgICAgICBjbG9uZS5zZXRNb250aChnRGF0ZTIuZ2V0TW9udGgoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAneWVhcic6IHtcbiAgICAgICAgY29uc3QgZ0RhdGUzID0gdGhpcy50b0dyZWdvcmlhbih2YWx1ZSwgakRhdGUubW9udGgsIGpEYXRlLmRheSk7XG4gICAgICAgIGNsb25lLnNldEZ1bGxZZWFyKGdEYXRlMy5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcyk7XG4gIH1cblxuICBzdGFydE9mKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0KTogQVhEYXRlVGltZSB7XG4gICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XG4gICAgc3dpdGNoICh1bml0KSB7XG4gICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIGNsb25lLmdldFNlY29uZHMoKSwgMCk7XG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcyk7XG4gICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIDAsIDApO1xuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMpO1xuICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDAsIDAsIDApO1xuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNsb25lLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMpO1xuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcykuYWRkKCdkYXknLCAtdGhpcy5kYXlPZldlZWsoY2xvbmUpICsgMSkuc3RhcnRPZignZGF5Jyk7XG4gICAgICBjYXNlICdtb250aCc6IHtcbiAgICAgICAgY29uc3QgankgPSB0aGlzLnllYXIoZGF0ZSk7XG4gICAgICAgIGNvbnN0IGptID0gdGhpcy5tb250aE9mWWVhcihkYXRlKTtcbiAgICAgICAgY29uc3QgZ0RhdGUgPSB0aGlzLnRvR3JlZ29yaWFuKGp5LCBqbSwgMSk7XG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShnRGF0ZSwgdGhpcykuc3RhcnRPZignZGF5Jyk7XG4gICAgICB9XG4gICAgICBjYXNlICd5ZWFyJzoge1xuICAgICAgICBjb25zdCBqeSA9IHRoaXMueWVhcihkYXRlKTtcbiAgICAgICAgY29uc3QgZ0RhdGUgPSB0aGlzLnRvR3JlZ29yaWFuKGp5LCAxLCAxKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGdEYXRlLCB0aGlzKS5zdGFydE9mKCdkYXknKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbmRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWUge1xuICAgIGNvbnN0IGNsb25lID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCBjbG9uZS5nZXRTZWNvbmRzKCksIDk5OSk7XG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcyk7XG4gICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIDU5LCA5OTkpO1xuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMpO1xuICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDU5LCA1OSwgOTk5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlICdkYXknOlxuICAgICAgICBjbG9uZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMpO1xuICAgICAgY2FzZSAnd2Vlayc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZihkYXRlLCAnd2VlaycpLmFkZCgnZGF5JywgNikuZW5kT2YoJ2RheScpO1xuICAgICAgfVxuICAgICAgY2FzZSAnbW9udGgnOiB7XG4gICAgICAgIGNvbnN0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xuICAgICAgICBjb25zdCBqbSA9IHRoaXMubW9udGhPZlllYXIoZGF0ZSk7XG4gICAgICAgIGNvbnN0IGpkID0gdGhpcy5qYWxhYWxpTW9udGhMZW5ndGgoanksIGptKTtcbiAgICAgICAgY29uc3QgZ0RhdGUgPSB0aGlzLnRvR3JlZ29yaWFuKGp5LCBqbSwgamQpO1xuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoZ0RhdGUsIHRoaXMpLmVuZE9mKCdkYXknKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3llYXInOiB7XG4gICAgICAgIGNvbnN0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xuICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIDEyLCB0aGlzLmphbGFhbGlNb250aExlbmd0aChqeSwgMTIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGdEYXRlLCB0aGlzKS5lbmRPZignZGF5Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcGFyc2UodmFsdWU6IHN0cmluZyk6IEFYRGF0ZVRpbWUge1xuICAgIGNvbnN0IFt5LCBNLCBkLCBoLCBtLCBzLCBtc10gPSB2YWx1ZS5zcGxpdCgvW15hLXpBLVowLTldKy9naSk7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oTnVtYmVyKHkpID8/IDAsIE51bWJlcihNKSA/PyAxLCBOdW1iZXIoZCkgPz8gMSk7XG4gICAgaWYgKGggIT0gbnVsbCkgZGF0ZS5zZXRIb3VycyhOdW1iZXIoaCkpO1xuICAgIGlmIChtICE9IG51bGwpIGRhdGUuc2V0TWludXRlcyhOdW1iZXIobSkpO1xuICAgIGlmIChzICE9IG51bGwpIGRhdGUuc2V0U2Vjb25kcyhOdW1iZXIocykpO1xuICAgIGlmIChtcyAhPSBudWxsKSBkYXRlLnNldE1pbGxpc2Vjb25kcyhOdW1iZXIoZCkpO1xuICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShkYXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qXG4gIENvbnZlcnRzIGEgR3JlZ29yaWFuIGRhdGUgdG8gSmFsYWFsaS5cbiovXG4gIHRvSmFsYWFsaShkYXRlOiBEYXRlKTogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXI7IGRheTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGdkID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgZ20gPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGd5ID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IHIgPSB0aGlzLmQyaih0aGlzLmcyZChneSwgZ20sIGdkKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHllYXI6IHIuanksXG4gICAgICBtb250aDogci5qbSxcbiAgICAgIGRheTogci5qZCxcbiAgICB9O1xuICB9XG5cbiAgLypcbiAgICBDb252ZXJ0cyBhIEphbGFhbGkgZGF0ZSB0byBHcmVnb3JpYW4uXG4gICovXG4gIHRvR3JlZ29yaWFuKGp5LCBqbSwgamQpOiBEYXRlIHtcbiAgICBjb25zdCBnID0gdGhpcy5kMmcodGhpcy5qMmQoanksIGptLCBqZCkpO1xuICAgIHJldHVybiBuZXcgRGF0ZShnLmd5LCBnLmdtIC0gMSwgZy5nZCk7XG4gIH1cblxuICAvKlxuICAgIENoZWNrcyB3aGV0aGVyIGEgSmFsYWFsaSBkYXRlIGlzIHZhbGlkIG9yIG5vdC5cbiAgKi9cbiAgaXNWYWxpZEphbGFhbGlEYXRlKGp5LCBqbSwgamQpIHtcbiAgICByZXR1cm4gankgPj0gLTYxICYmIGp5IDw9IDMxNzcgJiYgam0gPj0gMSAmJiBqbSA8PSAxMiAmJiBqZCA+PSAxICYmIGpkIDw9IHRoaXMuamFsYWFsaU1vbnRoTGVuZ3RoKGp5LCBqbSk7XG4gIH1cblxuICAvKlxuICAgIElzIHRoaXMgYSBsZWFwIHllYXIgb3Igbm90P1xuICAqL1xuICBpc0xlYXBKYWxhYWxpWWVhcihqeSkge1xuICAgIHJldHVybiB0aGlzLmphbENhbExlYXAoankpID09PSAwO1xuICB9XG5cbiAgLypcbiAgICBOdW1iZXIgb2YgZGF5cyBpbiBhIGdpdmVuIG1vbnRoIGluIGEgSmFsYWFsaSB5ZWFyLlxuICAqL1xuICBqYWxhYWxpTW9udGhMZW5ndGgoanksIGptKSB7XG4gICAgaWYgKGptIDw9IDYpIHJldHVybiAzMTtcbiAgICBpZiAoam0gPD0gMTEpIHJldHVybiAzMDtcbiAgICBpZiAodGhpcy5pc0xlYXBKYWxhYWxpWWVhcihqeSkpIHJldHVybiAzMDtcbiAgICByZXR1cm4gMjk7XG4gIH1cblxuICAvKlxuICAgICAgVGhpcyBkZXRlcm1pbmVzIGlmIHRoZSBKYWxhYWxpIChQZXJzaWFuKSB5ZWFyIGlzXG4gICAgICBsZWFwICgzNjYtZGF5IGxvbmcpIG9yIGlzIHRoZSBjb21tb24geWVhciAoMzY1IGRheXMpXG4gIFxuICAgICAgQHBhcmFtIGp5IEphbGFhbGkgY2FsZW5kYXIgeWVhciAoLTYxIHRvIDMxNzcpXG4gICAgICBAcmV0dXJucyBudW1iZXIgb2YgeWVhcnMgc2luY2UgdGhlIGxhc3QgbGVhcCB5ZWFyICgwIHRvIDQpXG4gICAqL1xuICBwcml2YXRlIGphbENhbExlYXAoank6IG51bWJlcikge1xuICAgIGxldCBibCA9IHRoaXMuYnJlYWtzLmxlbmd0aCxcbiAgICAgIGpwID0gdGhpcy5icmVha3NbMF0sXG4gICAgICBqbSxcbiAgICAgIGp1bXAsXG4gICAgICBsZWFwLFxuICAgICAgbixcbiAgICAgIGk7XG5cbiAgICBpZiAoankgPCBqcCB8fCBqeSA+PSB0aGlzLmJyZWFrc1tibCAtIDFdKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSmFsYWFsaSB5ZWFyICcgKyBqeSk7XG5cbiAgICBmb3IgKGkgPSAxOyBpIDwgYmw7IGkgKz0gMSkge1xuICAgICAgam0gPSB0aGlzLmJyZWFrc1tpXTtcbiAgICAgIGp1bXAgPSBqbSAtIGpwO1xuICAgICAgaWYgKGp5IDwgam0pIGJyZWFrO1xuICAgICAganAgPSBqbTtcbiAgICB9XG4gICAgbiA9IGp5IC0ganA7XG5cbiAgICBpZiAoanVtcCAtIG4gPCA2KSBuID0gbiAtIGp1bXAgKyB0aGlzLmRpdihqdW1wICsgNCwgMzMpICogMzM7XG4gICAgbGVhcCA9IHRoaXMubW9kKHRoaXMubW9kKG4gKyAxLCAzMykgLSAxLCA0KTtcbiAgICBpZiAobGVhcCA9PT0gLTEpIHtcbiAgICAgIGxlYXAgPSA0O1xuICAgIH1cblxuICAgIHJldHVybiBsZWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBqYWxDYWwoank6IG51bWJlciwgd2l0aG91dExlYXA6IGJvb2xlYW4pIHtcbiAgICBsZXQgYmwgPSB0aGlzLmJyZWFrcy5sZW5ndGgsXG4gICAgICBneSA9IGp5ICsgNjIxLFxuICAgICAgbGVhcEogPSAtMTQsXG4gICAgICBqcCA9IHRoaXMuYnJlYWtzWzBdLFxuICAgICAgam0sXG4gICAgICBqdW1wLFxuICAgICAgbGVhcCxcbiAgICAgIGxlYXBHLFxuICAgICAgbWFyY2gsXG4gICAgICBuLFxuICAgICAgaTtcblxuICAgIGlmIChqeSA8IGpwIHx8IGp5ID49IHRoaXMuYnJlYWtzW2JsIC0gMV0pIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKYWxhYWxpIHllYXIgJyArIGp5KTtcblxuICAgIC8vIEZpbmQgdGhlIGxpbWl0aW5nIHllYXJzIGZvciB0aGUgSmFsYWFsaSB5ZWFyIGp5LlxuICAgIGZvciAoaSA9IDE7IGkgPCBibDsgaSArPSAxKSB7XG4gICAgICBqbSA9IHRoaXMuYnJlYWtzW2ldO1xuICAgICAganVtcCA9IGptIC0ganA7XG4gICAgICBpZiAoankgPCBqbSkgYnJlYWs7XG4gICAgICBsZWFwSiA9IGxlYXBKICsgdGhpcy5kaXYoanVtcCwgMzMpICogOCArIHRoaXMuZGl2KHRoaXMubW9kKGp1bXAsIDMzKSwgNCk7XG4gICAgICBqcCA9IGptO1xuICAgIH1cbiAgICBuID0gankgLSBqcDtcblxuICAgIC8vIEZpbmQgdGhlIG51bWJlciBvZiBsZWFwIHllYXJzIGZyb20gQUQgNjIxIHRvIHRoZSBiZWdpbm5pbmdcbiAgICAvLyBvZiB0aGUgY3VycmVudCBKYWxhYWxpIHllYXIgaW4gdGhlIFBlcnNpYW4gY2FsZW5kYXIuXG4gICAgbGVhcEogPSBsZWFwSiArIHRoaXMuZGl2KG4sIDMzKSAqIDggKyB0aGlzLmRpdih0aGlzLm1vZChuLCAzMykgKyAzLCA0KTtcbiAgICBpZiAodGhpcy5tb2QoanVtcCwgMzMpID09PSA0ICYmIGp1bXAgLSBuID09PSA0KSBsZWFwSiArPSAxO1xuXG4gICAgLy8gQW5kIHRoZSBzYW1lIGluIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgKHVudGlsIHRoZSB5ZWFyIGd5KS5cbiAgICBsZWFwRyA9IHRoaXMuZGl2KGd5LCA0KSAtIHRoaXMuZGl2KCh0aGlzLmRpdihneSwgMTAwKSArIDEpICogMywgNCkgLSAxNTA7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIEdyZWdvcmlhbiBkYXRlIG9mIEZhcnZhcmRpbiB0aGUgMXN0LlxuICAgIG1hcmNoID0gMjAgKyBsZWFwSiAtIGxlYXBHO1xuXG4gICAgLy8gcmV0dXJuIHdpdGggZ3kgYW5kIG1hcmNoIHdoZW4gd2UgZG9uJ3QgbmVlZCBsZWFwXG4gICAgaWYgKHdpdGhvdXRMZWFwKSByZXR1cm4geyBneTogZ3ksIG1hcmNoOiBtYXJjaCB9O1xuXG4gICAgLy8gRmluZCBob3cgbWFueSB5ZWFycyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBsZWFwIHllYXIuXG4gICAgaWYgKGp1bXAgLSBuIDwgNikgbiA9IG4gLSBqdW1wICsgdGhpcy5kaXYoanVtcCArIDQsIDMzKSAqIDMzO1xuICAgIGxlYXAgPSB0aGlzLm1vZCh0aGlzLm1vZChuICsgMSwgMzMpIC0gMSwgNCk7XG4gICAgaWYgKGxlYXAgPT09IC0xKSB7XG4gICAgICBsZWFwID0gNDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVhcDogbGVhcCxcbiAgICAgIGd5OiBneSxcbiAgICAgIG1hcmNoOiBtYXJjaCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBqMmQoanksIGptLCBqZCk6IG51bWJlciB7XG4gICAgbGV0IHIgPSB0aGlzLmphbENhbChqeSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXMuZzJkKHIuZ3ksIDMsIHIubWFyY2gpICsgKGptIC0gMSkgKiAzMSAtIHRoaXMuZGl2KGptLCA3KSAqIChqbSAtIDcpICsgamQgLSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBkMmooamRuOiBudW1iZXIpIHtcbiAgICBsZXQgZ3kgPSB0aGlzLmQyZyhqZG4pLmd5LCAvLyBDYWxjdWxhdGUgR3JlZ29yaWFuIHllYXIgKGd5KS5cbiAgICAgIGp5ID0gZ3kgLSA2MjEsXG4gICAgICByID0gdGhpcy5qYWxDYWwoanksIGZhbHNlKSxcbiAgICAgIGpkbjFmID0gdGhpcy5nMmQoZ3ksIDMsIHIubWFyY2gpLFxuICAgICAgamQsXG4gICAgICBqbSxcbiAgICAgIGs7XG5cbiAgICAvLyBGaW5kIG51bWJlciBvZiBkYXlzIHRoYXQgcGFzc2VkIHNpbmNlIDEgRmFydmFyZGluLlxuICAgIGsgPSBqZG4gLSBqZG4xZjtcbiAgICBpZiAoayA+PSAwKSB7XG4gICAgICBpZiAoayA8PSAxODUpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IDYgbW9udGhzLlxuICAgICAgICBqbSA9IDEgKyB0aGlzLmRpdihrLCAzMSk7XG4gICAgICAgIGpkID0gdGhpcy5tb2QoaywgMzEpICsgMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBqeToganksXG4gICAgICAgICAgam06IGptLFxuICAgICAgICAgIGpkOiBqZCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSByZW1haW5pbmcgbW9udGhzLlxuICAgICAgICBrIC09IDE4NjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUHJldmlvdXMgSmFsYWFsaSB5ZWFyLlxuICAgICAgankgLT0gMTtcbiAgICAgIGsgKz0gMTc5O1xuICAgICAgaWYgKHIubGVhcCA9PT0gMSkgayArPSAxO1xuICAgIH1cbiAgICBqbSA9IDcgKyB0aGlzLmRpdihrLCAzMCk7XG4gICAgamQgPSB0aGlzLm1vZChrLCAzMCkgKyAxO1xuICAgIHJldHVybiB7XG4gICAgICBqeToganksXG4gICAgICBqbTogam0sXG4gICAgICBqZDogamQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZzJkKGd5OiBudW1iZXIsIGdtOiBudW1iZXIsIGdkOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBkID1cbiAgICAgIHRoaXMuZGl2KChneSArIHRoaXMuZGl2KGdtIC0gOCwgNikgKyAxMDAxMDApICogMTQ2MSwgNCkgK1xuICAgICAgdGhpcy5kaXYoMTUzICogdGhpcy5tb2QoZ20gKyA5LCAxMikgKyAyLCA1KSArXG4gICAgICBnZCAtXG4gICAgICAzNDg0MDQwODtcbiAgICBkID0gZCAtIHRoaXMuZGl2KHRoaXMuZGl2KGd5ICsgMTAwMTAwICsgdGhpcy5kaXYoZ20gLSA4LCA2KSwgMTAwKSAqIDMsIDQpICsgNzUyO1xuICAgIHJldHVybiBkO1xuICB9XG5cbiAgcHJpdmF0ZSBkMmcoamRuOiBudW1iZXIpIHtcbiAgICBsZXQgaiwgaSwgZ2QsIGdtLCBneTtcbiAgICBqID0gNCAqIGpkbiArIDEzOTM2MTYzMTtcbiAgICBqID0gaiArIHRoaXMuZGl2KHRoaXMuZGl2KDQgKiBqZG4gKyAxODMxODc3MjAsIDE0NjA5NykgKiAzLCA0KSAqIDQgLSAzOTA4O1xuICAgIGkgPSB0aGlzLmRpdih0aGlzLm1vZChqLCAxNDYxKSwgNCkgKiA1ICsgMzA4O1xuICAgIGdkID0gdGhpcy5kaXYodGhpcy5tb2QoaSwgMTUzKSwgNSkgKyAxO1xuICAgIGdtID0gdGhpcy5tb2QodGhpcy5kaXYoaSwgMTUzKSwgMTIpICsgMTtcbiAgICBneSA9IHRoaXMuZGl2KGosIDE0NjEpIC0gMTAwMTAwICsgdGhpcy5kaXYoOCAtIGdtLCA2KTtcbiAgICByZXR1cm4ge1xuICAgICAgZ3k6IGd5LFxuICAgICAgZ206IGdtLFxuICAgICAgZ2Q6IGdkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGphbGFhbGlXZWVrKGp5OiBudW1iZXIsIGptOiBudW1iZXIsIGpkOiBudW1iZXIpOiB7IHNhdHVyZGF5OiBhbnk7IGZyaWRheTogYW55IH0ge1xuICAgIGxldCBkYXlPZldlZWsgPSB0aGlzLmphbGFhbGlUb0RhdGVPYmplY3QoanksIGptLCBqZCwgMCwgMCwgMCwgMCkuZ2V0RGF5KCk7XG5cbiAgICBsZXQgc3RhcnREYXlEaWZmZXJlbmNlID0gZGF5T2ZXZWVrID09IDYgPyAwIDogLShkYXlPZldlZWsgKyAxKTtcbiAgICBsZXQgZW5kRGF5RGlmZmVyZW5jZSA9IDYgKyBzdGFydERheURpZmZlcmVuY2U7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2F0dXJkYXk6IHRoaXMuZDJqKHRoaXMuajJkKGp5LCBqbSwgamQgKyBzdGFydERheURpZmZlcmVuY2UpKSxcbiAgICAgIGZyaWRheTogdGhpcy5kMmoodGhpcy5qMmQoanksIGptLCBqZCArIGVuZERheURpZmZlcmVuY2UpKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBqYWxhYWxpVG9EYXRlT2JqZWN0KFxuICAgIGp5OiBudW1iZXIsXG4gICAgam06IG51bWJlcixcbiAgICBqZDogbnVtYmVyLFxuICAgIGg6IG51bWJlciA9IDAsXG4gICAgbTogbnVtYmVyID0gMCxcbiAgICBzOiBudW1iZXIgPSAwLFxuICAgIG1zOiBudW1iZXIgPSAwLFxuICApIHtcbiAgICBsZXQgZ3JlZ29yaWFuQ2FsZW5kZXJEYXRlID0gdGhpcy50b0dyZWdvcmlhbihqeSwgam0sIGpkKTtcblxuICAgIHJldHVybiBuZXcgRGF0ZShcbiAgICAgIGdyZWdvcmlhbkNhbGVuZGVyRGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgZ3JlZ29yaWFuQ2FsZW5kZXJEYXRlLmdldE1vbnRoKCkgLSAxLFxuICAgICAgZ3JlZ29yaWFuQ2FsZW5kZXJEYXRlLmdldERhdGUoKSxcbiAgICAgIGggfHwgMCxcbiAgICAgIG0gfHwgMCxcbiAgICAgIHMgfHwgMCxcbiAgICAgIG1zIHx8IDAsXG4gICAgKTtcbiAgfVxuXG4gIC8qXG4gICAgVXRpbGl0eSBoZWxwZXIgZnVuY3Rpb25zLlxuICAqL1xuXG4gIHByaXZhdGUgZGl2KGE6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIH5+KGEgLyBiKTtcbiAgfVxuXG4gIHByaXZhdGUgbW9kKGE6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGEgLSB+fihhIC8gYikgKiBiO1xuICB9XG59XG4iXX0=