@acorex/core 5.6.0 → 5.9.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.
- package/README.md +1 -1
- package/config/index.d.ts +5 -0
- package/config/public-api.d.ts +1 -0
- package/{lib/config → config/src}/configs.d.ts +0 -0
- package/dateTime/index.d.ts +5 -0
- package/dateTime/public-api.d.ts +5 -0
- package/{lib/dateTime → dateTime/src}/datetime.class.d.ts +0 -0
- package/{lib/dateTime → dateTime/src}/datetime.module.d.ts +0 -0
- package/{lib/dateTime → dateTime/src}/datetime.pipe.d.ts +1 -1
- package/{lib/dateTime → dateTime/src}/georgian.calendar.d.ts +0 -0
- package/{lib/dateTime → dateTime/src}/jalali.calendar.d.ts +0 -0
- package/esm2020/acorex-core.mjs +1 -1
- package/esm2020/config/acorex-core-config.mjs +5 -0
- package/esm2020/config/public-api.mjs +2 -0
- package/esm2020/config/src/configs.mjs +32 -0
- package/esm2020/dateTime/acorex-core-dateTime.mjs +5 -0
- package/esm2020/dateTime/public-api.mjs +6 -0
- package/esm2020/dateTime/src/datetime.class.mjs +295 -0
- package/esm2020/dateTime/src/datetime.module.mjs +33 -0
- package/esm2020/dateTime/src/datetime.pipe.mjs +26 -0
- package/esm2020/dateTime/src/georgian.calendar.mjs +189 -0
- package/esm2020/dateTime/src/jalali.calendar.mjs +359 -0
- package/esm2020/events/acorex-core-events.mjs +5 -0
- package/esm2020/events/public-api.mjs +2 -0
- package/esm2020/events/src/event.service.mjs +36 -0
- package/esm2020/http/acorex-core-http.mjs +5 -0
- package/esm2020/http/public-api.mjs +6 -0
- package/esm2020/http/src/http-error.class.mjs +2 -0
- package/esm2020/http/src/http-events.interceptor.mjs +3 -0
- package/esm2020/http/src/http-request.class.mjs +2 -0
- package/esm2020/http/src/http-result.class.mjs +21 -0
- package/esm2020/http/src/http.module.mjs +29 -0
- package/esm2020/http/src/http.service.mjs +147 -0
- package/esm2020/pipes/acorex-core-pipes.mjs +5 -0
- package/esm2020/pipes/public-api.mjs +3 -0
- package/esm2020/pipes/src/pipes.module.mjs +19 -0
- package/esm2020/pipes/src/safe.pipe.mjs +30 -0
- package/esm2020/platform/acorex-core-platform.mjs +5 -0
- package/esm2020/platform/public-api.mjs +2 -0
- package/esm2020/platform/src/platform.service.mjs +141 -0
- package/esm2020/public-api.mjs +4 -12
- package/esm2020/translation/acorex-core-translation.mjs +5 -0
- package/esm2020/translation/public-api.mjs +4 -0
- package/esm2020/translation/src/translation.module.mjs +18 -0
- package/esm2020/translation/src/translator.mjs +43 -0
- package/esm2020/translation/src/translator.pipe.mjs +15 -0
- package/esm2020/utils/acorex-core-utils.mjs +5 -0
- package/esm2020/utils/public-api.mjs +5 -0
- package/esm2020/utils/src/color-util.mjs +71 -0
- package/esm2020/utils/src/drawing-util.mjs +27 -0
- package/esm2020/utils/src/object-util.mjs +39 -0
- package/esm2020/utils/src/string-util.mjs +19 -0
- package/events/index.d.ts +5 -0
- package/events/public-api.d.ts +1 -0
- package/{lib/events → events/src}/event.service.d.ts +0 -0
- package/fesm2015/acorex-core-config.mjs +39 -0
- package/fesm2015/acorex-core-config.mjs.map +1 -0
- package/fesm2015/acorex-core-dateTime.mjs +899 -0
- package/fesm2015/acorex-core-dateTime.mjs.map +1 -0
- package/fesm2015/acorex-core-events.mjs +43 -0
- package/fesm2015/acorex-core-events.mjs.map +1 -0
- package/fesm2015/acorex-core-http.mjs +201 -0
- package/fesm2015/acorex-core-http.mjs.map +1 -0
- package/fesm2015/acorex-core-pipes.mjs +53 -0
- package/fesm2015/acorex-core-pipes.mjs.map +1 -0
- package/fesm2015/acorex-core-platform.mjs +148 -0
- package/fesm2015/acorex-core-platform.mjs.map +1 -0
- package/fesm2015/acorex-core-translation.mjs +80 -0
- package/fesm2015/acorex-core-translation.mjs.map +1 -0
- package/fesm2015/acorex-core-utils.mjs +163 -0
- package/fesm2015/acorex-core-utils.mjs.map +1 -0
- package/fesm2015/acorex-core.mjs +5 -1409
- package/fesm2015/acorex-core.mjs.map +1 -1
- package/fesm2020/acorex-core-config.mjs +39 -0
- package/fesm2020/acorex-core-config.mjs.map +1 -0
- package/fesm2020/acorex-core-dateTime.mjs +899 -0
- package/fesm2020/acorex-core-dateTime.mjs.map +1 -0
- package/fesm2020/acorex-core-events.mjs +43 -0
- package/fesm2020/acorex-core-events.mjs.map +1 -0
- package/fesm2020/acorex-core-http.mjs +200 -0
- package/fesm2020/acorex-core-http.mjs.map +1 -0
- package/fesm2020/acorex-core-pipes.mjs +53 -0
- package/fesm2020/acorex-core-pipes.mjs.map +1 -0
- package/fesm2020/acorex-core-platform.mjs +148 -0
- package/fesm2020/acorex-core-platform.mjs.map +1 -0
- package/fesm2020/acorex-core-translation.mjs +79 -0
- package/fesm2020/acorex-core-translation.mjs.map +1 -0
- package/fesm2020/acorex-core-utils.mjs +163 -0
- package/fesm2020/acorex-core-utils.mjs.map +1 -0
- package/fesm2020/acorex-core.mjs +5 -1406
- package/fesm2020/acorex-core.mjs.map +1 -1
- package/http/index.d.ts +5 -0
- package/http/public-api.d.ts +5 -0
- package/http/src/http-error.class.d.ts +7 -0
- package/http/src/http-events.interceptor.d.ts +10 -0
- package/http/src/http-request.class.d.ts +14 -0
- package/http/src/http-result.class.d.ts +11 -0
- package/http/src/http.module.d.ts +8 -0
- package/http/src/http.service.d.ts +23 -0
- package/{acorex-core.d.ts → index.d.ts} +0 -0
- package/package.json +82 -15
- package/pipes/index.d.ts +5 -0
- package/pipes/public-api.d.ts +2 -0
- package/pipes/src/pipes.module.d.ts +8 -0
- package/{lib/utils → pipes/src}/safe.pipe.d.ts +1 -1
- package/platform/index.d.ts +5 -0
- package/platform/public-api.d.ts +1 -0
- package/{lib/platform → platform/src}/platform.service.d.ts +1 -1
- package/public-api.d.ts +1 -12
- package/translation/index.d.ts +5 -0
- package/translation/public-api.d.ts +3 -0
- package/{lib/translation → translation/src}/translation.module.d.ts +0 -0
- package/{lib/translation → translation/src}/translator.d.ts +0 -0
- package/{lib/translation → translation/src}/translator.pipe.d.ts +1 -1
- package/utils/index.d.ts +5 -0
- package/utils/public-api.d.ts +4 -0
- package/utils/src/color-util.d.ts +20 -0
- package/{lib/utils → utils/src}/drawing-util.d.ts +1 -1
- package/{lib/utils → utils/src}/object-util.d.ts +0 -0
- package/{lib/utils → utils/src}/string-util.d.ts +0 -0
- package/config/ax-preset.js +0 -198
- package/esm2020/lib/config/configs.mjs +0 -29
- package/esm2020/lib/core.module.mjs +0 -18
- package/esm2020/lib/dateTime/datetime.class.mjs +0 -295
- package/esm2020/lib/dateTime/datetime.module.mjs +0 -33
- package/esm2020/lib/dateTime/datetime.pipe.mjs +0 -26
- package/esm2020/lib/dateTime/georgian.calendar.mjs +0 -189
- package/esm2020/lib/dateTime/index.mjs +0 -6
- package/esm2020/lib/dateTime/jalali.calendar.mjs +0 -359
- package/esm2020/lib/events/event.service.mjs +0 -36
- package/esm2020/lib/events/index.mjs +0 -2
- package/esm2020/lib/hotkeys/hotkeys.service.mjs +0 -37
- package/esm2020/lib/hotkeys/index.mjs +0 -2
- package/esm2020/lib/platform/index.mjs +0 -2
- package/esm2020/lib/platform/platform.service.mjs +0 -138
- package/esm2020/lib/translation/index.mjs +0 -4
- package/esm2020/lib/translation/translation.module.mjs +0 -18
- package/esm2020/lib/translation/translator.mjs +0 -43
- package/esm2020/lib/translation/translator.pipe.mjs +0 -15
- package/esm2020/lib/utils/color-util.mjs +0 -82
- package/esm2020/lib/utils/drawing-util.mjs +0 -27
- package/esm2020/lib/utils/index.mjs +0 -6
- package/esm2020/lib/utils/object-util.mjs +0 -39
- package/esm2020/lib/utils/safe.pipe.mjs +0 -30
- package/esm2020/lib/utils/string-util.mjs +0 -19
- package/lib/core.module.d.ts +0 -7
- package/lib/dateTime/index.d.ts +0 -5
- package/lib/events/index.d.ts +0 -1
- package/lib/hotkeys/hotkeys.service.d.ts +0 -17
- package/lib/hotkeys/index.d.ts +0 -1
- package/lib/platform/index.d.ts +0 -1
- package/lib/translation/index.d.ts +0 -3
- package/lib/utils/color-util.d.ts +0 -14
- package/lib/utils/index.d.ts +0 -5
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { AXDateTime } from "./datetime.class";
|
|
2
|
+
export class GeorgianCalendar {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.monthNames = [
|
|
5
|
+
"January", "February", "March",
|
|
6
|
+
"April", "May", "June", "July",
|
|
7
|
+
"August", "September", "October",
|
|
8
|
+
"November", "December"
|
|
9
|
+
];
|
|
10
|
+
this.monthShortNames = [
|
|
11
|
+
"Jan", "Feb", "Mar",
|
|
12
|
+
"Apr", "May", "Jun", "Jul",
|
|
13
|
+
"Aug", "Sep", "Oct",
|
|
14
|
+
"Nov", "Dec"
|
|
15
|
+
];
|
|
16
|
+
this.dayNames = [
|
|
17
|
+
"Sunday", "Monday", "Tuesday", "Wednesday",
|
|
18
|
+
"Thursday", "Friday", "Saturday"
|
|
19
|
+
];
|
|
20
|
+
this.dayShortNames = [
|
|
21
|
+
"Sun", "Mon", "Tue", "Wed",
|
|
22
|
+
"Thu", "Fri", "Sat"
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
create(value) {
|
|
26
|
+
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());
|
|
27
|
+
}
|
|
28
|
+
name() {
|
|
29
|
+
return 'gregorian';
|
|
30
|
+
}
|
|
31
|
+
dayOfMonth(date) {
|
|
32
|
+
return date.getDate();
|
|
33
|
+
}
|
|
34
|
+
dayOfYear(date) {
|
|
35
|
+
let result = 0;
|
|
36
|
+
let m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
37
|
+
if (this.isLeap(date)) {
|
|
38
|
+
m[1] = 29;
|
|
39
|
+
}
|
|
40
|
+
for (let i = 0; i < date.getMonth(); i++) {
|
|
41
|
+
result = result + m[i];
|
|
42
|
+
}
|
|
43
|
+
result += date.getDate();
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
dayOfWeek(date) {
|
|
47
|
+
return date.getDay() + 1;
|
|
48
|
+
}
|
|
49
|
+
weekOfYear(date) {
|
|
50
|
+
const firstDay = new AXDateTime(date).startOf('year');
|
|
51
|
+
return Math.ceil((((date.getTime() - firstDay.date.getTime()) / 86400000) + firstDay.date.getDay() + 1) / 7);
|
|
52
|
+
}
|
|
53
|
+
year(date) {
|
|
54
|
+
return date.getFullYear();
|
|
55
|
+
}
|
|
56
|
+
monthOfYear(date) {
|
|
57
|
+
return date.getMonth() + 1;
|
|
58
|
+
}
|
|
59
|
+
add(date, unit, amount) {
|
|
60
|
+
let value = date.valueOf();
|
|
61
|
+
switch (unit) {
|
|
62
|
+
case 'second':
|
|
63
|
+
value += 1000 * amount;
|
|
64
|
+
break;
|
|
65
|
+
case 'minute':
|
|
66
|
+
value += 60000 * amount;
|
|
67
|
+
break;
|
|
68
|
+
case 'hour':
|
|
69
|
+
value += 3600000 * amount;
|
|
70
|
+
break;
|
|
71
|
+
case 'month':
|
|
72
|
+
const v = new Date(value);
|
|
73
|
+
var mo = date.getMonth();
|
|
74
|
+
var yr = date.getFullYear();
|
|
75
|
+
mo = (mo + amount) % 12;
|
|
76
|
+
if (0 > mo) {
|
|
77
|
+
yr += (date.getMonth() + amount - mo - 12) / 12;
|
|
78
|
+
mo += 12;
|
|
79
|
+
}
|
|
80
|
+
else
|
|
81
|
+
yr += ((date.getMonth() + amount - mo) / 12);
|
|
82
|
+
v.setMonth(mo);
|
|
83
|
+
v.setFullYear(yr);
|
|
84
|
+
value = v.valueOf();
|
|
85
|
+
break;
|
|
86
|
+
case 'week':
|
|
87
|
+
value += 7 * 86400000 * amount;
|
|
88
|
+
break;
|
|
89
|
+
case 'year':
|
|
90
|
+
const yv = new Date(value);
|
|
91
|
+
yv.setFullYear(yv.getFullYear() + amount);
|
|
92
|
+
value = yv.valueOf();
|
|
93
|
+
break;
|
|
94
|
+
case 'day':
|
|
95
|
+
default:
|
|
96
|
+
value += 86400000 * amount;
|
|
97
|
+
}
|
|
98
|
+
return new AXDateTime(new Date(value), this.name());
|
|
99
|
+
}
|
|
100
|
+
set(date, unit, value) {
|
|
101
|
+
const clone = new Date(date.valueOf());
|
|
102
|
+
switch (unit) {
|
|
103
|
+
case 'second':
|
|
104
|
+
clone.setHours(clone.getHours(), clone.getMinutes(), value, clone.getMilliseconds());
|
|
105
|
+
break;
|
|
106
|
+
case 'minute':
|
|
107
|
+
clone.setHours(clone.getHours(), value, clone.getSeconds(), clone.getMilliseconds());
|
|
108
|
+
break;
|
|
109
|
+
case 'hour':
|
|
110
|
+
clone.setHours(value, clone.getMinutes(), clone.getSeconds(), clone.getMilliseconds());
|
|
111
|
+
break;
|
|
112
|
+
default:
|
|
113
|
+
case 'day':
|
|
114
|
+
clone.setDate(value);
|
|
115
|
+
break;
|
|
116
|
+
case "week":
|
|
117
|
+
break;
|
|
118
|
+
case "month":
|
|
119
|
+
clone.setMonth(Math.max(0, value - 1));
|
|
120
|
+
break;
|
|
121
|
+
case "year":
|
|
122
|
+
clone.setFullYear(value);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
return new AXDateTime(clone, this.name());
|
|
126
|
+
}
|
|
127
|
+
startOf(date, unit) {
|
|
128
|
+
const clone = new Date(date.valueOf());
|
|
129
|
+
switch (unit) {
|
|
130
|
+
case 'second':
|
|
131
|
+
clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 0);
|
|
132
|
+
return new AXDateTime(clone, this.name());
|
|
133
|
+
case 'minute':
|
|
134
|
+
clone.setHours(clone.getHours(), clone.getMinutes(), 0, 0);
|
|
135
|
+
return new AXDateTime(clone, this.name());
|
|
136
|
+
case 'hour':
|
|
137
|
+
clone.setHours(clone.getHours(), 0, 0, 0);
|
|
138
|
+
return new AXDateTime(clone, this.name());
|
|
139
|
+
default:
|
|
140
|
+
case 'day':
|
|
141
|
+
clone.setHours(0, 0, 0, 0);
|
|
142
|
+
return new AXDateTime(clone, this.name());
|
|
143
|
+
case "week":
|
|
144
|
+
const index = 0;
|
|
145
|
+
const start = index >= 0 ? index : 0;
|
|
146
|
+
const day = clone.getDay();
|
|
147
|
+
const diff = clone.getDate() - day + (start > day ? start - 7 : start);
|
|
148
|
+
clone.setDate(diff);
|
|
149
|
+
return new AXDateTime(clone, this.name()).startOf('day');
|
|
150
|
+
case "month":
|
|
151
|
+
clone.setDate(1);
|
|
152
|
+
return new AXDateTime(clone, this.name()).startOf('day');
|
|
153
|
+
case "year":
|
|
154
|
+
clone.setMonth(0);
|
|
155
|
+
clone.setDate(1);
|
|
156
|
+
return new AXDateTime(clone, this.name()).startOf('day');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
endOf(date, unit) {
|
|
160
|
+
const clone = new Date(date.valueOf());
|
|
161
|
+
switch (unit) {
|
|
162
|
+
case 'second':
|
|
163
|
+
clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 999);
|
|
164
|
+
return new AXDateTime(clone, this.name());
|
|
165
|
+
case 'minute':
|
|
166
|
+
clone.setHours(clone.getHours(), clone.getMinutes(), 59, 999);
|
|
167
|
+
return new AXDateTime(clone, this.name());
|
|
168
|
+
case 'hour':
|
|
169
|
+
clone.setHours(clone.getHours(), 59, 59, 999);
|
|
170
|
+
return new AXDateTime(clone, this.name());
|
|
171
|
+
default:
|
|
172
|
+
case 'day':
|
|
173
|
+
clone.setHours(23, 59, 59, 999);
|
|
174
|
+
return new AXDateTime(clone, this.name());
|
|
175
|
+
case 'week':
|
|
176
|
+
return this.startOf(date, 'week').add('day', 6).endOf('day');
|
|
177
|
+
case 'month':
|
|
178
|
+
return new AXDateTime(new Date(date.getFullYear(), date.getMonth() + 1, 0), this.name()).endOf('day');
|
|
179
|
+
case "year":
|
|
180
|
+
clone.setMonth(11);
|
|
181
|
+
return new AXDateTime(clone, this.name()).endOf('month');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
isLeap(date) {
|
|
185
|
+
let leapYear = new Date(date.getFullYear(), 1, 29);
|
|
186
|
+
return leapYear.getDate() == 29;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcmdpYW4uY2FsZW5kYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29yZS9kYXRlVGltZS9zcmMvZ2VvcmdpYW4uY2FsZW5kYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRixNQUFNLE9BQU8sZ0JBQWdCO0lBQTdCO1FBRUksZUFBVSxHQUFHO1lBQ1QsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPO1lBQzlCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07WUFDOUIsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTO1lBQ2hDLFVBQVUsRUFBRSxVQUFVO1NBQ3pCLENBQUM7UUFFRixvQkFBZSxHQUFHO1lBQ2QsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO1lBQ25CLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7WUFDMUIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO1lBQ25CLEtBQUssRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQUVGLGFBQVEsR0FBRztZQUNQLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVc7WUFDMUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVO1NBQ25DLENBQUM7UUFFRixrQkFBYSxHQUFHO1lBQ1osS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztZQUMxQixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7U0FDdEIsQ0FBQztJQWtMTixDQUFDO0lBL0tHLE1BQU0sQ0FBQyxLQUFrQjtRQUNyQixPQUFPLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25LLENBQUM7SUFFRCxJQUFJO1FBQ0EsT0FBTyxXQUFXLENBQUE7SUFDdEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBVTtRQUNoQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDYjtRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUI7UUFDRCxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBVTtRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFVO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBVTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBVTtRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFVLEVBQUUsSUFBYyxFQUFFLE1BQWM7UUFDMUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLFFBQVEsSUFBSSxFQUFFO1lBQ1YsS0FBSyxRQUFRO2dCQUNULEtBQUssSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUN2QixNQUFLO1lBQ1QsS0FBSyxRQUFRO2dCQUNULEtBQUssSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUN4QixNQUFLO1lBQ1QsS0FBSyxNQUFNO2dCQUNQLEtBQUssSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUMxQixNQUFLO1lBQ1QsS0FBSyxPQUFPO2dCQUNSLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDNUIsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNSLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDaEQsRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDWjs7b0JBRUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xCLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3BCLE1BQUs7WUFDVCxLQUFLLE1BQU07Z0JBQ1AsS0FBSyxJQUFJLENBQUMsR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDO2dCQUMvQixNQUFLO1lBQ1QsS0FBSyxNQUFNO2dCQUNQLE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDMUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckIsTUFBSztZQUNULEtBQUssS0FBSyxDQUFDO1lBQ1g7Z0JBQ0ksS0FBSyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUM7U0FDbEM7UUFDRCxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxHQUFHLENBQUMsSUFBVSxFQUFFLElBQWMsRUFBRSxLQUFhO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsSUFBSSxFQUFFO1lBQ1YsS0FBSyxRQUFRO2dCQUNULEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JGLE1BQU07WUFDVixLQUFLLFFBQVE7Z0JBQ1QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFDckYsTUFBTTtZQUNWLEtBQUssTUFBTTtnQkFDUCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RixNQUFNO1lBQ1YsUUFBUTtZQUNSLEtBQUssS0FBSztnQkFDTixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixNQUFNO1lBQ1YsS0FBSyxNQUFNO2dCQUNQLE1BQU07WUFDVixLQUFLLE9BQU87Z0JBQ1IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsTUFBTTtZQUNWLEtBQUssTUFBTTtnQkFDUCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QixNQUFNO1NBQ2I7UUFDRCxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVUsRUFBRSxJQUFjO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsSUFBSSxFQUFFO1lBQ1YsS0FBSyxRQUFRO2dCQUNULEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLEtBQUssUUFBUTtnQkFDVCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxLQUFLLE1BQU07Z0JBQ1AsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsUUFBUTtZQUNSLEtBQUssS0FBSztnQkFDTixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxLQUFLLE1BQU07Z0JBQ1AsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixNQUFNLEtBQUssR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxLQUFLLE9BQU87Z0JBQ1IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDaEIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdELEtBQUssTUFBTTtnQkFDUCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEU7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVUsRUFBRSxJQUFjO1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsSUFBSSxFQUFFO1lBQ1YsS0FBSyxRQUFRO2dCQUNULEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzlFLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLEtBQUssUUFBUTtnQkFDVCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM5RCxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxLQUFLLE1BQU07Z0JBQ1AsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsUUFBUTtZQUNSLEtBQUssS0FBSztnQkFDTixLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxLQUFLLE1BQU07Z0JBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRSxLQUFLLE9BQU87Z0JBQ1IsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUcsS0FBSyxNQUFNO2dCQUNQLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNoRTtJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBVTtRQUNiLElBQUksUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYQ2FsZW5kYXIsIEFYRGF0ZVRpbWUsIEFYRGF0ZVZhbHVlLCBUaW1lVW5pdCB9IGZyb20gXCIuL2RhdGV0aW1lLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR2VvcmdpYW5DYWxlbmRhciBpbXBsZW1lbnRzIEFYQ2FsZW5kYXIge1xyXG5cclxuICAgIG1vbnRoTmFtZXMgPSBbXHJcbiAgICAgICAgXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLFxyXG4gICAgICAgIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLFxyXG4gICAgICAgIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLFxyXG4gICAgICAgIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXHJcbiAgICBdO1xyXG5cclxuICAgIG1vbnRoU2hvcnROYW1lcyA9IFtcclxuICAgICAgICBcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLFxyXG4gICAgICAgIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsXHJcbiAgICAgICAgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIixcclxuICAgICAgICBcIk5vdlwiLCBcIkRlY1wiXHJcbiAgICBdO1xyXG5cclxuICAgIGRheU5hbWVzID0gW1xyXG4gICAgICAgIFwiU3VuZGF5XCIsIFwiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLFxyXG4gICAgICAgIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXHJcbiAgICBdO1xyXG5cclxuICAgIGRheVNob3J0TmFtZXMgPSBbXHJcbiAgICAgICAgXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIixcclxuICAgICAgICBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXHJcbiAgICBdO1xyXG5cclxuXHJcbiAgICBjcmVhdGUodmFsdWU6IEFYRGF0ZVZhbHVlKTogQVhEYXRlVGltZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKHZhbHVlLnllYXIsIHZhbHVlLm1vbnRoIC0gMSwgdmFsdWUuZGF0ZSwgdmFsdWUuaG91cnMgfHwgMCwgdmFsdWUubWludXRlcyB8fCAwLCB2YWx1ZS5zZWNvbmRzIHx8IDAsIHZhbHVlLm1zIHx8IDApLCB0aGlzLm5hbWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnZ3JlZ29yaWFuJ1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mTW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgICAgICBsZXQgbSA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcclxuICAgICAgICBpZiAodGhpcy5pc0xlYXAoZGF0ZSkpIHtcclxuICAgICAgICAgICAgbVsxXSA9IDI5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGUuZ2V0TW9udGgoKTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG1baV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCArPSBkYXRlLmdldERhdGUoKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mV2VlayhkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXkoKSArIDE7XHJcbiAgICB9XHJcblxyXG4gICAgd2Vla09mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBmaXJzdERheSA9IG5ldyBBWERhdGVUaW1lKGRhdGUpLnN0YXJ0T2YoJ3llYXInKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKCgoKGRhdGUuZ2V0VGltZSgpIC0gZmlyc3REYXkuZGF0ZS5nZXRUaW1lKCkpIC8gODY0MDAwMDApICsgZmlyc3REYXkuZGF0ZS5nZXREYXkoKSArIDEpIC8gNyk7XHJcbiAgICB9XHJcblxyXG4gICAgeWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG1vbnRoT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZChkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCwgYW1vdW50OiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBkYXRlLnZhbHVlT2YoKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDEwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gNjAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDM2MDAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1vID0gZGF0ZS5nZXRNb250aCgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHlyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICAgICAgbW8gPSAobW8gKyBhbW91bnQpICUgMTI7XHJcbiAgICAgICAgICAgICAgICBpZiAoMCA+IG1vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeXIgKz0gKGRhdGUuZ2V0TW9udGgoKSArIGFtb3VudCAtIG1vIC0gMTIpIC8gMTI7XHJcbiAgICAgICAgICAgICAgICAgICAgbW8gKz0gMTI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgeXIgKz0gKChkYXRlLmdldE1vbnRoKCkgKyBhbW91bnQgLSBtbykgLyAxMik7XHJcbiAgICAgICAgICAgICAgICB2LnNldE1vbnRoKG1vKTtcclxuICAgICAgICAgICAgICAgIHYuc2V0RnVsbFllYXIoeXIpO1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2LnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gNyAqIDg2NDAwMDAwICogYW1vdW50O1xyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgY2FzZSAneWVhcic6XHJcbiAgICAgICAgICAgICAgICBjb25zdCB5diA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHl2LnNldEZ1bGxZZWFyKHl2LmdldEZ1bGxZZWFyKCkgKyBhbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB5di52YWx1ZU9mKCk7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdkYXknOlxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gODY0MDAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShuZXcgRGF0ZSh2YWx1ZSksIHRoaXMubmFtZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQsIHZhbHVlOiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgdmFsdWUsIGNsb25lLmdldE1pbGxpc2Vjb25kcygpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgdmFsdWUsIGNsb25lLmdldFNlY29uZHMoKSwgY2xvbmUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnModmFsdWUsIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCBjbG9uZS5nZXRNaWxsaXNlY29uZHMoKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3ZWVrXCI6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRNb250aChNYXRoLm1heCgwLCB2YWx1ZSAtIDEpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RnVsbFllYXIodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0T2YoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlIFwid2Vla1wiOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpbmRleCA+PSAwID8gaW5kZXggOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5ID0gY2xvbmUuZ2V0RGF5KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gY2xvbmUuZ2V0RGF0ZSgpIC0gZGF5ICsgKHN0YXJ0ID4gZGF5ID8gc3RhcnQgLSA3IDogc3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RGF0ZShkaWZmKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldERhdGUoMSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0TW9udGgoMCk7XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXREYXRlKDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVuZE9mKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0KTogQVhEYXRlVGltZSB7XHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XHJcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIGNsb25lLmdldFNlY29uZHMoKSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDU5LCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBjYXNlICdkYXknOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YoZGF0ZSwgJ3dlZWsnKS5hZGQoJ2RheScsIDYpLmVuZE9mKCdkYXknKTtcclxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgMCksIHRoaXMubmFtZSgpKS5lbmRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ5ZWFyXCI6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRNb250aCgxMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKS5lbmRPZignbW9udGgnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNMZWFwKGRhdGU6IERhdGUpIHtcclxuICAgICAgICBsZXQgbGVhcFllYXIgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIDEsIDI5KTtcclxuICAgICAgICByZXR1cm4gbGVhcFllYXIuZ2V0RGF0ZSgpID09IDI5O1xyXG4gICAgfVxyXG59Il19
|