jconsumer-shared 1.2.1 → 1.2.3

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.
@@ -0,0 +1,203 @@
1
+ import { Injectable } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../date-time/datetime-processor.service";
4
+ export class JaldeeTimeService {
5
+ dateTimeProcessor;
6
+ moment;
7
+ constructor(dateTimeProcessor) {
8
+ this.dateTimeProcessor = dateTimeProcessor;
9
+ this.moment = this.dateTimeProcessor.getMoment();
10
+ }
11
+ /**
12
+ *
13
+ * @param interval
14
+ * @param startTime
15
+ * @param endTime
16
+ * @returns
17
+ */
18
+ getTimeSlotsFromQTimings(interval, startTime, endTime) {
19
+ const slotList = [];
20
+ // slotList.push(startTime);
21
+ const startTimeStr = this.moment(startTime, ['HH:mm A']).format('HH:mm A').toString();
22
+ let startingDTime = this.dateTimeProcessor.getDateFromTimeString(startTimeStr);
23
+ slotList.push(this.moment(startTime, ['HH:mm A']).format('hh:mm A').toString());
24
+ const endTimeStr = this.moment(endTime, ['HH:mm A']).format('HH:mm A').toString();
25
+ const endDTime = this.dateTimeProcessor.getDateFromTimeString(endTimeStr);
26
+ // tslint:disable-next-line:radix
27
+ const endDate = parseInt(this.moment(endDTime, ['DD']).format('DD').toString());
28
+ // let startingDTime = this.getDateFromTimeString(startTime);
29
+ let exitLoop = false;
30
+ while (!exitLoop) {
31
+ const nextTime = this.moment(startingDTime).add(interval, 'm');
32
+ // tslint:disable-next-line:radix
33
+ const nextDate = parseInt(nextTime.format('DD'));
34
+ const nextTimeDt = this.dateTimeProcessor.getDateFromTimeString(this.moment(nextTime, ['HH:mm A']).format('HH:mm A').toString());
35
+ if (nextDate === endDate) {
36
+ if (nextTimeDt.getTime() <= endDTime.getTime()) {
37
+ slotList.push(this.moment(nextTime, ['HH:mm A']).format('hh:mm A').toString());
38
+ }
39
+ else {
40
+ exitLoop = true;
41
+ }
42
+ }
43
+ else {
44
+ exitLoop = true;
45
+ }
46
+ startingDTime = nextTimeDt;
47
+ }
48
+ return slotList;
49
+ }
50
+ /**
51
+ *
52
+ * @param schedule_arr
53
+ * @returns
54
+ */
55
+ arrageScheduleforDisplay(schedule_arr) {
56
+ const timebase = [];
57
+ for (let i = 0; i < schedule_arr.length; i++) {
58
+ const timeindx = schedule_arr[i]['sTime'].replace(/\s+/, '') + schedule_arr[i]['eTime'].replace(/\s+/, '');
59
+ if (timebase[timeindx] === undefined) {
60
+ timebase[timeindx] = new Array();
61
+ timebase[timeindx].push(schedule_arr[i]);
62
+ }
63
+ else {
64
+ timebase[timeindx].push(schedule_arr[i]);
65
+ }
66
+ }
67
+ for (const obj in timebase) {
68
+ if (obj) {
69
+ const len = timebase[obj].length;
70
+ for (let i = 0; i < len; i++) {
71
+ for (let j = i + 1; j < len; j++) {
72
+ if (timebase[obj][j].day < timebase[obj][i].day) {
73
+ const tempobj = timebase[obj][i];
74
+ timebase[obj][i] = timebase[obj][j];
75
+ timebase[obj][j] = tempobj;
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ const displaysch = [];
82
+ let pday = 0;
83
+ for (const obj in timebase) {
84
+ if (obj) {
85
+ let curstr = '';
86
+ let gap = 0;
87
+ for (let i = 0; i < timebase[obj].length; i++) {
88
+ if (i === 0) {
89
+ curstr = this.dateTimeProcessor.getDay(timebase[obj][i].day);
90
+ pday = timebase[obj][i].day;
91
+ }
92
+ else {
93
+ const diffs = timebase[obj][i].day - pday;
94
+ if (diffs > 1) {
95
+ if (gap >= 1) {
96
+ if (curstr.includes((this.dateTimeProcessor.getDay(pday)))) {
97
+ }
98
+ else {
99
+ curstr = curstr + ' - ' + this.dateTimeProcessor.getDay(pday);
100
+ }
101
+ }
102
+ curstr = curstr + ', ' + this.dateTimeProcessor.getDay(timebase[obj][i].day);
103
+ }
104
+ else {
105
+ if (i === (timebase[obj].length - 1)) {
106
+ curstr = curstr + ' - ' + this.dateTimeProcessor.getDay(timebase[obj][i].day);
107
+ }
108
+ gap++;
109
+ }
110
+ pday = timebase[obj][i].day;
111
+ }
112
+ }
113
+ displaysch.push({ 'time': timebase[obj][0]['sTime'] + ' - ' + timebase[obj][0]['eTime'], 'dstr': curstr, 'indx': obj, 'recurrtype': timebase[obj][0]['recurrtype'] });
114
+ }
115
+ }
116
+ return displaysch;
117
+ }
118
+ getminutesOfDay(m) {
119
+ return parseInt(m.minute, 10) + parseInt(m.hour, 10) * 60;
120
+ }
121
+ getTimeinMin(time) {
122
+ const time_min = (time.hour * 60) + time.minute;
123
+ return (typeof (time_min) === 'number') ? time_min : 0;
124
+ }
125
+ prepareScheduleforSaving(schedule_arr) {
126
+ const timebase = [];
127
+ for (let i = 0; i < schedule_arr.length; i++) {
128
+ const timeindx = schedule_arr[i]['sTime'].replace(/\s+/, '') + schedule_arr[i]['eTime'].replace(/\s+/, '');
129
+ if (timebase[timeindx] === undefined) {
130
+ timebase[timeindx] = new Array();
131
+ timebase[timeindx].push(schedule_arr[i]);
132
+ }
133
+ else {
134
+ timebase[timeindx].push(schedule_arr[i]);
135
+ }
136
+ }
137
+ for (const obj in timebase) {
138
+ if (obj) {
139
+ const len = timebase[obj].length;
140
+ for (let i = 0; i < len; i++) {
141
+ for (let j = i + 1; j < len; j++) {
142
+ if (timebase[obj][j].day < timebase[obj][i].day) {
143
+ const tempobj = timebase[obj][i];
144
+ timebase[obj][i] = timebase[obj][j];
145
+ timebase[obj][j] = tempobj;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ const displaysch = [];
152
+ for (const obj in timebase) {
153
+ if (obj) {
154
+ const curstr = [];
155
+ for (let i = 0; i < timebase[obj].length; i++) {
156
+ curstr.push(timebase[obj][i].day);
157
+ }
158
+ displaysch.push({ 'stime': timebase[obj][0]['sTime'], 'etime': timebase[obj][0]['eTime'], 'daystr': curstr });
159
+ }
160
+ }
161
+ return displaysch;
162
+ }
163
+ formatTime(hours, minutes) {
164
+ let sHours = hours.toString();
165
+ let sMinutes = minutes.toString();
166
+ if (hours < 10) {
167
+ sHours = '0' + sHours;
168
+ }
169
+ if (minutes < 10) {
170
+ sMinutes = '0' + sMinutes;
171
+ }
172
+ const time24 = sHours + ':' + sMinutes + ':00';
173
+ return time24;
174
+ }
175
+ AMHourto24Time(time12) {
176
+ const time = time12;
177
+ let hours = Number(time.match(/^(\d+)/)[1]);
178
+ const minutes = Number(time.match(/:(\d+)/)[1]);
179
+ const AMPM = time.match(/\s(.*)$/)[1];
180
+ if (AMPM === 'PM' && hours < 12) {
181
+ hours = hours + 12;
182
+ }
183
+ if (AMPM === 'AM' && hours === 12) {
184
+ hours = hours - 12;
185
+ }
186
+ let sHours = hours.toString();
187
+ let sMinutes = minutes.toString();
188
+ if (hours < 10) {
189
+ sHours = '0' + sHours;
190
+ }
191
+ if (minutes < 10) {
192
+ sMinutes = '0' + sMinutes;
193
+ }
194
+ const time24 = sHours + ':' + sMinutes + ':00';
195
+ return time24;
196
+ }
197
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JaldeeTimeService, deps: [{ token: i1.DateTimeProcessor }], target: i0.ɵɵFactoryTarget.Injectable });
198
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JaldeeTimeService });
199
+ }
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JaldeeTimeService, decorators: [{
201
+ type: Injectable
202
+ }], ctorParameters: () => [{ type: i1.DateTimeProcessor }] });
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamFsZGVlLXRpbWUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2pjb25zdW1lci1zaGFyZWQvc3JjL2xpYi9jYWxlbmRhci90aW1lL2phbGRlZS10aW1lLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBSzNDLE1BQU0sT0FBTyxpQkFBaUI7SUFHTjtJQUZwQixNQUFNLENBQU07SUFFWixZQUFvQixpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsd0JBQXdCLENBQUMsUUFBYSxFQUFFLFNBQWMsRUFBRSxPQUFZO1FBQ2hFLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQiw0QkFBNEI7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0UsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDaEYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFT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QUksS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2YsUUFBUSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUMvQyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO3dHQXZMUSxpQkFBaUI7NEdBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFGN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBEYXRlVGltZVByb2Nlc3NvciB9IGZyb20gXCIuLi9kYXRlLXRpbWUvZGF0ZXRpbWUtcHJvY2Vzc29yLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuXHJcbmV4cG9ydCBjbGFzcyBKYWxkZWVUaW1lU2VydmljZSB7XHJcbiAgICBtb21lbnQ6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVUaW1lUHJvY2Vzc29yOiBEYXRlVGltZVByb2Nlc3Nvcikge1xyXG4gICAgICAgIHRoaXMubW9tZW50ID0gdGhpcy5kYXRlVGltZVByb2Nlc3Nvci5nZXRNb21lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGludGVydmFsIFxyXG4gICAgICogQHBhcmFtIHN0YXJ0VGltZSBcclxuICAgICAqIEBwYXJhbSBlbmRUaW1lIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGdldFRpbWVTbG90c0Zyb21RVGltaW5ncyhpbnRlcnZhbDogYW55LCBzdGFydFRpbWU6IGFueSwgZW5kVGltZTogYW55KSB7XHJcbiAgICAgICAgY29uc3Qgc2xvdExpc3QgPSBbXTtcclxuICAgICAgICAvLyBzbG90TGlzdC5wdXNoKHN0YXJ0VGltZSk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lU3RyID0gdGhpcy5tb21lbnQoc3RhcnRUaW1lLCBbJ0hIOm1tIEEnXSkuZm9ybWF0KCdISDptbSBBJykudG9TdHJpbmcoKTtcclxuICAgICAgICBsZXQgc3RhcnRpbmdEVGltZSA9IHRoaXMuZGF0ZVRpbWVQcm9jZXNzb3IuZ2V0RGF0ZUZyb21UaW1lU3RyaW5nKHN0YXJ0VGltZVN0cik7XHJcbiAgICAgICAgc2xvdExpc3QucHVzaCh0aGlzLm1vbWVudChzdGFydFRpbWUsIFsnSEg6bW0gQSddKS5mb3JtYXQoJ2hoOm1tIEEnKS50b1N0cmluZygpKTtcclxuICAgICAgICBjb25zdCBlbmRUaW1lU3RyID0gdGhpcy5tb21lbnQoZW5kVGltZSwgWydISDptbSBBJ10pLmZvcm1hdCgnSEg6bW0gQScpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29uc3QgZW5kRFRpbWUgPSB0aGlzLmRhdGVUaW1lUHJvY2Vzc29yLmdldERhdGVGcm9tVGltZVN0cmluZyhlbmRUaW1lU3RyKTtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmFkaXhcclxuICAgICAgICBjb25zdCBlbmREYXRlID0gcGFyc2VJbnQodGhpcy5tb21lbnQoZW5kRFRpbWUsIFsnREQnXSkuZm9ybWF0KCdERCcpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIC8vIGxldCBzdGFydGluZ0RUaW1lID0gdGhpcy5nZXREYXRlRnJvbVRpbWVTdHJpbmcoc3RhcnRUaW1lKTtcclxuICAgICAgICBsZXQgZXhpdExvb3AgPSBmYWxzZTtcclxuICAgICAgICB3aGlsZSAoIWV4aXRMb29wKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRUaW1lID0gdGhpcy5tb21lbnQoc3RhcnRpbmdEVGltZSkuYWRkKGludGVydmFsLCAnbScpO1xyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmFkaXhcclxuICAgICAgICAgICAgY29uc3QgbmV4dERhdGUgPSBwYXJzZUludChuZXh0VGltZS5mb3JtYXQoJ0REJykpO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0VGltZUR0ID0gdGhpcy5kYXRlVGltZVByb2Nlc3Nvci5nZXREYXRlRnJvbVRpbWVTdHJpbmcodGhpcy5tb21lbnQobmV4dFRpbWUsIFsnSEg6bW0gQSddKS5mb3JtYXQoJ0hIOm1tIEEnKS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgaWYgKG5leHREYXRlID09PSBlbmREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dFRpbWVEdC5nZXRUaW1lKCkgPD0gZW5kRFRpbWUuZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2xvdExpc3QucHVzaCh0aGlzLm1vbWVudChuZXh0VGltZSwgWydISDptbSBBJ10pLmZvcm1hdCgnaGg6bW0gQScpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3RhcnRpbmdEVGltZSA9IG5leHRUaW1lRHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzbG90TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHNjaGVkdWxlX2FyciBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhcnJhZ2VTY2hlZHVsZWZvckRpc3BsYXkoc2NoZWR1bGVfYXJyOiBhbnkpIHtcclxuICAgICAgICBjb25zdCB0aW1lYmFzZTogYW55ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlZHVsZV9hcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdGltZWluZHggPSBzY2hlZHVsZV9hcnJbaV1bJ3NUaW1lJ10ucmVwbGFjZSgvXFxzKy8sICcnKSArIHNjaGVkdWxlX2FycltpXVsnZVRpbWUnXS5yZXBsYWNlKC9cXHMrLywgJycpO1xyXG4gICAgICAgICAgICBpZiAodGltZWJhc2VbdGltZWluZHhdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRpbWViYXNlW3RpbWVpbmR4XSA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgICAgICAgICAgdGltZWJhc2VbdGltZWluZHhdLnB1c2goc2NoZWR1bGVfYXJyW2ldKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRpbWViYXNlW3RpbWVpbmR4XS5wdXNoKHNjaGVkdWxlX2FycltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBvYmogaW4gdGltZWJhc2UpIHtcclxuICAgICAgICAgICAgaWYgKG9iaikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVuID0gdGltZWJhc2Vbb2JqXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbGVuOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWViYXNlW29ial1bal0uZGF5IDwgdGltZWJhc2Vbb2JqXVtpXS5kYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBvYmogPSB0aW1lYmFzZVtvYmpdW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJhc2Vbb2JqXVtpXSA9IHRpbWViYXNlW29ial1bal07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmFzZVtvYmpdW2pdID0gdGVtcG9iajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaXNwbGF5c2NoID0gW107XHJcbiAgICAgICAgbGV0IHBkYXkgPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3Qgb2JqIGluIHRpbWViYXNlKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmopIHtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJzdHIgPSAnJztcclxuICAgICAgICAgICAgICAgIGxldCBnYXAgPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aW1lYmFzZVtvYmpdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc3RyID0gdGhpcy5kYXRlVGltZVByb2Nlc3Nvci5nZXREYXkodGltZWJhc2Vbb2JqXVtpXS5kYXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZGF5ID0gdGltZWJhc2Vbb2JqXVtpXS5kYXk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZnMgPSB0aW1lYmFzZVtvYmpdW2ldLmRheSAtIHBkYXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYXAgPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzdHIuaW5jbHVkZXMoKHRoaXMuZGF0ZVRpbWVQcm9jZXNzb3IuZ2V0RGF5KHBkYXkpKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzdHIgPSBjdXJzdHIgKyAnIC0gJyArIHRoaXMuZGF0ZVRpbWVQcm9jZXNzb3IuZ2V0RGF5KHBkYXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnN0ciA9IGN1cnN0ciArICcsICcgKyB0aGlzLmRhdGVUaW1lUHJvY2Vzc29yLmdldERheSh0aW1lYmFzZVtvYmpdW2ldLmRheSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gKHRpbWViYXNlW29ial0ubGVuZ3RoIC0gMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzdHIgPSBjdXJzdHIgKyAnIC0gJyArIHRoaXMuZGF0ZVRpbWVQcm9jZXNzb3IuZ2V0RGF5KHRpbWViYXNlW29ial1baV0uZGF5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBkYXkgPSB0aW1lYmFzZVtvYmpdW2ldLmRheTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5c2NoLnB1c2goeyAndGltZSc6IHRpbWViYXNlW29ial1bMF1bJ3NUaW1lJ10gKyAnIC0gJyArIHRpbWViYXNlW29ial1bMF1bJ2VUaW1lJ10sICdkc3RyJzogY3Vyc3RyLCAnaW5keCc6IG9iaiwgJ3JlY3VycnR5cGUnOiB0aW1lYmFzZVtvYmpdWzBdWydyZWN1cnJ0eXBlJ10gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpc3BsYXlzY2g7XHJcbiAgICB9XHJcbiAgICBnZXRtaW51dGVzT2ZEYXkobSkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludChtLm1pbnV0ZSwgMTApICsgcGFyc2VJbnQobS5ob3VyLCAxMCkgKiA2MDtcclxuICAgIH1cclxuICAgIGdldFRpbWVpbk1pbih0aW1lKSB7XHJcbiAgICAgICAgY29uc3QgdGltZV9taW4gPSAodGltZS5ob3VyICogNjApICsgdGltZS5taW51dGU7XHJcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgKHRpbWVfbWluKSA9PT0gJ251bWJlcicpID8gdGltZV9taW4gOiAwO1xyXG4gICAgfVxyXG4gICAgcHJlcGFyZVNjaGVkdWxlZm9yU2F2aW5nKHNjaGVkdWxlX2Fycikge1xyXG4gICAgICAgIGNvbnN0IHRpbWViYXNlOiBhbnkgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVkdWxlX2Fyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB0aW1laW5keCA9IHNjaGVkdWxlX2FycltpXVsnc1RpbWUnXS5yZXBsYWNlKC9cXHMrLywgJycpICsgc2NoZWR1bGVfYXJyW2ldWydlVGltZSddLnJlcGxhY2UoL1xccysvLCAnJyk7XHJcbiAgICAgICAgICAgIGlmICh0aW1lYmFzZVt0aW1laW5keF0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGltZWJhc2VbdGltZWluZHhdID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgICAgICAgICB0aW1lYmFzZVt0aW1laW5keF0ucHVzaChzY2hlZHVsZV9hcnJbaV0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGltZWJhc2VbdGltZWluZHhdLnB1c2goc2NoZWR1bGVfYXJyW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IG9iaiBpbiB0aW1lYmFzZSkge1xyXG4gICAgICAgICAgICBpZiAob2JqKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSB0aW1lYmFzZVtvYmpdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBsZW47IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZWJhc2Vbb2JqXVtqXS5kYXkgPCB0aW1lYmFzZVtvYmpdW2ldLmRheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcG9iaiA9IHRpbWViYXNlW29ial1baV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmFzZVtvYmpdW2ldID0gdGltZWJhc2Vbb2JqXVtqXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWViYXNlW29ial1bal0gPSB0ZW1wb2JqO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlzY2ggPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG9iaiBpbiB0aW1lYmFzZSkge1xyXG4gICAgICAgICAgICBpZiAob2JqKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJzdHIgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGltZWJhc2Vbb2JqXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnN0ci5wdXNoKHRpbWViYXNlW29ial1baV0uZGF5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRpc3BsYXlzY2gucHVzaCh7ICdzdGltZSc6IHRpbWViYXNlW29ial1bMF1bJ3NUaW1lJ10sICdldGltZSc6IHRpbWViYXNlW29ial1bMF1bJ2VUaW1lJ10sICdkYXlzdHInOiBjdXJzdHIgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpc3BsYXlzY2g7XHJcbiAgICB9XHJcblxyXG4gICAgZm9ybWF0VGltZShob3VycywgbWludXRlcykge1xyXG4gICAgICAgIGxldCBzSG91cnMgPSBob3Vycy50b1N0cmluZygpO1xyXG4gICAgICAgIGxldCBzTWludXRlcyA9IG1pbnV0ZXMudG9TdHJpbmcoKTtcclxuICAgICAgICBpZiAoaG91cnMgPCAxMCkge1xyXG4gICAgICAgICAgICBzSG91cnMgPSAnMCcgKyBzSG91cnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtaW51dGVzIDwgMTApIHtcclxuICAgICAgICAgICAgc01pbnV0ZXMgPSAnMCcgKyBzTWludXRlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGltZTI0ID0gc0hvdXJzICsgJzonICsgc01pbnV0ZXMgKyAnOjAwJztcclxuICAgICAgICByZXR1cm4gdGltZTI0O1xyXG4gICAgfVxyXG4gICAgQU1Ib3VydG8yNFRpbWUodGltZTEyKSB7XHJcbiAgICAgICAgY29uc3QgdGltZSA9IHRpbWUxMjtcclxuICAgICAgICBsZXQgaG91cnMgPSBOdW1iZXIodGltZS5tYXRjaCgvXihcXGQrKS8pWzFdKTtcclxuICAgICAgICBjb25zdCBtaW51dGVzID0gTnVtYmVyKHRpbWUubWF0Y2goLzooXFxkKykvKVsxXSk7XHJcbiAgICAgICAgY29uc3QgQU1QTSA9IHRpbWUubWF0Y2goL1xccyguKikkLylbMV07XHJcbiAgICAgICAgaWYgKEFNUE0gPT09ICdQTScgJiYgaG91cnMgPCAxMikgeyBob3VycyA9IGhvdXJzICsgMTI7IH1cclxuICAgICAgICBpZiAoQU1QTSA9PT0gJ0FNJyAmJiBob3VycyA9PT0gMTIpIHsgaG91cnMgPSBob3VycyAtIDEyOyB9XHJcbiAgICAgICAgbGV0IHNIb3VycyA9IGhvdXJzLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgbGV0IHNNaW51dGVzID0gbWludXRlcy50b1N0cmluZygpO1xyXG4gICAgICAgIGlmIChob3VycyA8IDEwKSB7XHJcbiAgICAgICAgICAgIHNIb3VycyA9ICcwJyArIHNIb3VycztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1pbnV0ZXMgPCAxMCkge1xyXG4gICAgICAgICAgICBzTWludXRlcyA9ICcwJyArIHNNaW51dGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0aW1lMjQgPSBzSG91cnMgKyAnOicgKyBzTWludXRlcyArICc6MDAnO1xyXG4gICAgICAgIHJldHVybiB0aW1lMjQ7XHJcbiAgICB9XHJcbn1cclxuIl19