ng-timeparser
Version:
[](https://badge.fury.io/js/ng-timeparser) [](https://travis-ci.org/feeloor/ng-timeparser)
299 lines (289 loc) • 26 kB
JavaScript
import { Injectable, Directive, HostListener, Output, EventEmitter, Input, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TimeParserService = /** @class */ (function () {
function TimeParserService() {
}
/**
* Parses given time-string to a correct 4 digit time or empty if it's an invalid time
* @param {?} inputTime Time-string to parse
* @param {?=} militaryTime Use military time (24 hour format)
* @return {?}
*/
TimeParserService.prototype.parseTime = /**
* Parses given time-string to a correct 4 digit time or empty if it's an invalid time
* @param {?} inputTime Time-string to parse
* @param {?=} militaryTime Use military time (24 hour format)
* @return {?}
*/
function (inputTime, militaryTime) {
if (militaryTime === void 0) { militaryTime = false; }
var /** @type {?} */ returnTime = '';
var /** @type {?} */ correctFormat = false;
var /** @type {?} */ time = inputTime;
// English (12 hours pattern)
if (!militaryTime) {
if (new RegExp(/^[2-9][0-9].*$/).test(time) && (time.match(/\d/g) || []).length !== 3) {
// Matches 22 or 22 PM but not 321 or 321 PM/AM
correctFormat = false;
time = '';
}
else if (new RegExp(/^[0-1][0-9]:[0-5][0-9].*$/).test(time)) {
// Matches for example 07:30 or 07:30 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 5);
}
else if (new RegExp(/^[0-1][0-9][0-5][0-9].*$/).test(time)) {
// Matches for example 0730 or 0730 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 4);
}
else if (new RegExp(/^[0-9]:[0-5][0-9].*$/).test(time)) {
// Matches for example 9:33 and 9:33 PM/AM
correctFormat = true;
time = "0" + this.addAMorPM(time, 0, 4);
}
else if (new RegExp(/^[0-9][0-5][0-9].*$/).test(time)) {
// Matches for example 933 and 933 PM/AM
correctFormat = true;
time = "0" + this.addAMorPM(time, 0, 3);
}
else if (new RegExp(/^[0-1][0-2].*$/).test(time)) {
// Matches 12 or 12 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 2);
}
else if (new RegExp(/^[0-9].*$/).test(time)) {
// Matches for example 3 and 3 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 1);
}
// French / Military Time (24 hours pattern)
}
else {
if (new RegExp(/^[0-2][0-9]:[0-5][0-9]$/).test(time)) {
// Matches 17:30
correctFormat = true;
}
else if (new RegExp(/^[0-2][0-9][0-5][0-9]$/).test(time)) {
// Matches 1730
correctFormat = true;
}
else if (new RegExp(/^[0-2][0-9]:[0-5]$/).test(time)) {
// Matches 22:3
correctFormat = true;
time = time + "0";
}
else if (new RegExp(/^[0-2][0-9][0-5]$/).test(time)) {
// Matches 223
correctFormat = true;
time = time + "0";
}
else if (new RegExp(/^[0-9]:[0-5][0-9]$/).test(time)) {
// Matches 7:30
correctFormat = true;
time = "0" + time;
}
else if (new RegExp(/^[0-9][0-5][0-9]$/).test(time)) {
// Matches 730
correctFormat = true;
time = "0" + time;
}
else if (new RegExp(/^[0-2][0-9]/).test(time)) {
// Matches 19
correctFormat = true;
time = time + "00";
}
else if (new RegExp(/^[0-9]/).test(time)) {
// Matches 9
correctFormat = true;
time = "0" + time + "00";
}
}
// Create return data
if (correctFormat) {
time = time.toUpperCase();
time = this.makeTime4Digit(time);
returnTime = this.addColonIfMissing(time);
if (militaryTime) {
returnTime = returnTime.substring(0, 5);
}
}
else {
returnTime = '';
}
return returnTime;
};
/**
* Parses a valid time to a 4 digit time
* For example 4 PM to 04:00 PM or 4:30 PM to 04:30 PM
* @param {?} time Time-string to parse to 4 digit
* @return {?}
*/
TimeParserService.prototype.makeTime4Digit = /**
* Parses a valid time to a 4 digit time
* For example 4 PM to 04:00 PM or 4:30 PM to 04:30 PM
* @param {?} time Time-string to parse to 4 digit
* @return {?}
*/
function (time) {
var /** @type {?} */ preAMorPM = '';
var /** @type {?} */ parsed = time;
// Get any existing AM/PM
if (new RegExp(/PM/i).test(time)) {
preAMorPM = 'PM';
parsed = parsed.replace(/PM/i, '');
}
else if (new RegExp(/AM/i).test(time)) {
preAMorPM = 'AM';
parsed = parsed.replace(/AM/i, '');
}
parsed = parsed.replace(':', '');
parsed = parsed.replace(/ /g, '');
if (parsed.length === 1) {
parsed = "0" + parsed + "00";
}
else if (parsed.length === 2) {
parsed = parsed + "00";
}
else if (parsed.length === 3) {
if (new RegExp(/^[0-1][0-9][0-5]/).test(parsed)) {
parsed = parsed + "0";
}
else if (new RegExp(/^[0-9][0-5][0-9]/).test(parsed)) {
parsed = "0" + parsed;
}
}
return "" + parsed + (preAMorPM ? ' ' + preAMorPM : '');
};
/**
* Adds a colon if it's missing to given time-string
* For example 0400 to 04:00
* @param {?} time Time-string to add missing colon to
* @return {?}
*/
TimeParserService.prototype.addColonIfMissing = /**
* Adds a colon if it's missing to given time-string
* For example 0400 to 04:00
* @param {?} time Time-string to add missing colon to
* @return {?}
*/
function (time) {
if (time.indexOf(':') === -1) {
return time.substring(0, 2) + ":" + time.substring(2);
}
return time;
};
/**
* Takes start and end of time-string and then adds correct AM/PM
* @param {?} time Time-string to add AM or PM too
* @param {?} start Where time starts in string
* @param {?} end Where time ends in string
* @return {?}
*/
TimeParserService.prototype.addAMorPM = /**
* Takes start and end of time-string and then adds correct AM/PM
* @param {?} time Time-string to add AM or PM too
* @param {?} start Where time starts in string
* @param {?} end Where time ends in string
* @return {?}
*/
function (time, start, end) {
if (new RegExp(/PM/i).test(time)) {
return time.substring(start, end) + " PM";
}
else if (new RegExp(/AM/i).test(time)) {
return time.substring(start, end) + " AM";
}
else {
return time.substring(start, end) + " PM";
}
};
TimeParserService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
TimeParserService.ctorParameters = function () { return []; };
return TimeParserService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TimeParserDirective = /** @class */ (function () {
function TimeParserDirective(timeParserService) {
this.timeParserService = timeParserService;
this.ngModelChange = new EventEmitter();
this.militaryTime = this.militaryTime || false;
}
/**
* @param {?} event
* @return {?}
*/
TimeParserDirective.prototype.onBlur = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.ngModelChange.emit(this.timeParserService.parseTime(event.target.value, this.militaryTime));
};
TimeParserDirective.decorators = [
{ type: Directive, args: [{
selector: '[timeParser]'
},] },
];
/** @nocollapse */
TimeParserDirective.ctorParameters = function () { return [
{ type: TimeParserService, },
]; };
TimeParserDirective.propDecorators = {
"militaryTime": [{ type: Input },],
"ngModelChange": [{ type: Output },],
"onBlur": [{ type: HostListener, args: ['blur', ['$event'],] },],
};
return TimeParserDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TimeParserModule = /** @class */ (function () {
function TimeParserModule() {
}
TimeParserModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule
],
declarations: [TimeParserDirective],
providers: [TimeParserService],
exports: [TimeParserDirective]
},] },
];
return TimeParserModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { TimeParserDirective, TimeParserService, TimeParserModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdGltZXBhcnNlci5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmctdGltZXBhcnNlci9zcmMvYXBwL3RpbWUtcGFyc2VyL3NlcnZpY2VzL3RpbWUtcGFyc2VyLnNlcnZpY2UudHMiLCJuZzovL25nLXRpbWVwYXJzZXIvc3JjL2FwcC90aW1lLXBhcnNlci9kaXJlY3RpdmVzL3RpbWUtcGFyc2VyLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmctdGltZXBhcnNlci9zcmMvYXBwL3RpbWUtcGFyc2VyL3RpbWUtcGFyc2VyLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaW1lUGFyc2VyU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICAvKipcbiAgICogUGFyc2VzIGdpdmVuIHRpbWUtc3RyaW5nIHRvIGEgY29ycmVjdCA0IGRpZ2l0IHRpbWUgb3IgZW1wdHkgaWYgaXQncyBhbiBpbnZhbGlkIHRpbWVcbiAgICogQHBhcmFtIGlucHV0VGltZSBUaW1lLXN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0gbWlsaXRhcnlUaW1lIFVzZSBtaWxpdGFyeSB0aW1lICgyNCBob3VyIGZvcm1hdClcbiAgICovXG4gIHB1YmxpYyBwYXJzZVRpbWUoaW5wdXRUaW1lOiBzdHJpbmcsIG1pbGl0YXJ5VGltZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBsZXQgcmV0dXJuVGltZSA9ICcnO1xuICAgIGxldCBjb3JyZWN0Rm9ybWF0ID0gZmFsc2U7XG4gICAgbGV0IHRpbWUgPSBpbnB1dFRpbWU7XG5cbiAgICAvLyBFbmdsaXNoICgxMiBob3VycyBwYXR0ZXJuKVxuICAgIGlmICghbWlsaXRhcnlUaW1lKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cCgvXlsyLTldWzAtOV0uKiQvKS50ZXN0KHRpbWUpICYmICh0aW1lLm1hdGNoKC9cXGQvZykgfHwgW10pLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAvLyBNYXRjaGVzIDIyIG9yIDIyIFBNIGJ1dCBub3QgMzIxIG9yIDMyMSBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gZmFsc2U7XG4gICAgICAgIHRpbWUgPSAnJztcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV06WzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSAwNzozMCBvciAwNzozMCBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDUpO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMV1bMC05XVswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgMDczMCBvciAwNzMwIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gdGhpcy5hZGRBTW9yUE0odGltZSwgMCwgNCk7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XTpbMC01XVswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDk6MzMgYW5kIDk6MzMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGhpcy5hZGRBTW9yUE0odGltZSwgMCwgNCl9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldWzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSA5MzMgYW5kIDkzMyBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAwJHt0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAzKX1gO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMV1bMC0yXS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxMiBvciAxMiBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDIpO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgMyBhbmQgMyBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDEpO1xuICAgICAgfVxuICAgICAgLy8gRnJlbmNoIC8gTWlsaXRhcnkgVGltZSAoMjQgaG91cnMgcGF0dGVybilcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldOlswLTVdWzAtOV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDE3OjMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XVswLTVdWzAtOV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDE3MzBcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldOlswLTVdJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAyMjozXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYCR7dGltZX0wYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV1bMC01XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMjIzXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYCR7dGltZX0wYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldOlswLTVdWzAtOV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDc6MzBcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGltZX1gO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV1bMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyA3MzBcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGltZX1gO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XS8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxOVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MDBgO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV0vKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgOVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAwJHt0aW1lfTAwYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcmV0dXJuIGRhdGFcbiAgICBpZiAoY29ycmVjdEZvcm1hdCkge1xuICAgICAgdGltZSA9IHRpbWUudG9VcHBlckNhc2UoKTtcbiAgICAgIHRpbWUgPSB0aGlzLm1ha2VUaW1lNERpZ2l0KHRpbWUpO1xuICAgICAgcmV0dXJuVGltZSA9IHRoaXMuYWRkQ29sb25JZk1pc3NpbmcodGltZSk7XG5cbiAgICAgIGlmIChtaWxpdGFyeVRpbWUpIHtcbiAgICAgICAgcmV0dXJuVGltZSA9IHJldHVyblRpbWUuc3Vic3RyaW5nKDAsIDUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5UaW1lID0gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdmFsaWQgdGltZSB0byBhIDQgZGlnaXQgdGltZVxuICAgKiBGb3IgZXhhbXBsZSA0IFBNIHRvIDA0OjAwIFBNIG9yIDQ6MzAgUE0gdG8gMDQ6MzAgUE1cbiAgICogQHBhcmFtIHRpbWUgVGltZS1zdHJpbmcgdG8gcGFyc2UgdG8gNCBkaWdpdFxuICAgKi9cbiAgcHJpdmF0ZSBtYWtlVGltZTREaWdpdCh0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBwcmVBTW9yUE0gPSAnJztcbiAgICBsZXQgcGFyc2VkID0gdGltZTtcblxuICAgIC8vIEdldCBhbnkgZXhpc3RpbmcgQU0vUE1cbiAgICBpZiAobmV3IFJlZ0V4cCgvUE0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcHJlQU1vclBNID0gJ1BNJztcbiAgICAgIHBhcnNlZCA9IHBhcnNlZC5yZXBsYWNlKC9QTS9pLCAnJyk7XG4gICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9BTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICBwcmVBTW9yUE0gPSAnQU0nO1xuICAgICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoL0FNL2ksICcnKTtcbiAgICB9XG5cbiAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgnOicsICcnKTtcbiAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgvIC9nLCAnJyk7XG4gICAgaWYgKHBhcnNlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHBhcnNlZCA9IGAwJHtwYXJzZWR9MDBgO1xuICAgIH0gZWxzZSBpZiAocGFyc2VkLmxlbmd0aCA9PT0gMikge1xuICAgICAgcGFyc2VkID0gYCR7cGFyc2VkfTAwYDtcbiAgICB9IGVsc2UgaWYgKHBhcnNlZC5sZW5ndGggPT09IDMpIHtcbiAgICAgIGlmIChuZXcgUmVnRXhwKC9eWzAtMV1bMC05XVswLTVdLykudGVzdChwYXJzZWQpKSB7XG4gICAgICAgIHBhcnNlZCA9IGAke3BhcnNlZH0wYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldWzAtNV1bMC05XS8pLnRlc3QocGFyc2VkKSkge1xuICAgICAgICBwYXJzZWQgPSBgMCR7cGFyc2VkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3BhcnNlZH0ke3ByZUFNb3JQTSA/ICcgJyArIHByZUFNb3JQTSA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbG9uIGlmIGl0J3MgbWlzc2luZyB0byBnaXZlbiB0aW1lLXN0cmluZ1xuICAgKiBGb3IgZXhhbXBsZSAwNDAwIHRvIDA0OjAwXG4gICAqIEBwYXJhbSB0aW1lIFRpbWUtc3RyaW5nIHRvIGFkZCBtaXNzaW5nIGNvbG9uIHRvXG4gICAqL1xuICBwcml2YXRlIGFkZENvbG9uSWZNaXNzaW5nKHRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRpbWUuaW5kZXhPZignOicpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKDAsIDIpfToke3RpbWUuc3Vic3RyaW5nKDIpfWA7XG4gICAgfVxuICAgIHJldHVybiB0aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHN0YXJ0IGFuZCBlbmQgb2YgdGltZS1zdHJpbmcgYW5kIHRoZW4gYWRkcyBjb3JyZWN0IEFNL1BNXG4gICAqIEBwYXJhbSB0aW1lIFRpbWUtc3RyaW5nIHRvIGFkZCBBTSBvciBQTSB0b29cbiAgICogQHBhcmFtIHN0YXJ0IFdoZXJlIHRpbWUgc3RhcnRzIGluIHN0cmluZ1xuICAgKiBAcGFyYW0gZW5kIFdoZXJlIHRpbWUgZW5kcyBpbiBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgYWRkQU1vclBNKHRpbWU6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChuZXcgUmVnRXhwKC9QTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCl9IFBNYDtcbiAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL0FNL2kpLnRlc3QodGltZSkpIHtcbiAgICAgIHJldHVybiBgJHt0aW1lLnN1YnN0cmluZyhzdGFydCwgZW5kKX0gQU1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCl9IFBNYDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVGltZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RpbWVQYXJzZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBUaW1lUGFyc2VyRGlyZWN0aXZlIHtcbiAgQElucHV0KCkgbWlsaXRhcnlUaW1lOiBib29sZWFuO1xuICBAT3V0cHV0KCkgbmdNb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVQYXJzZXJTZXJ2aWNlOiBUaW1lUGFyc2VyU2VydmljZSkge1xuICAgIHRoaXMubWlsaXRhcnlUaW1lID0gdGhpcy5taWxpdGFyeVRpbWUgfHwgZmFsc2U7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSkgb25CbHVyKGV2ZW50KSB7XG4gICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy50aW1lUGFyc2VyU2VydmljZS5wYXJzZVRpbWUoZXZlbnQudGFyZ2V0LnZhbHVlLCB0aGlzLm1pbGl0YXJ5VGltZSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgVGltZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7IFRpbWVQYXJzZXJEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1RpbWVQYXJzZXJEaXJlY3RpdmVdLFxuICBwcm92aWRlcnM6IFtUaW1lUGFyc2VyU2VydmljZV0sXG4gIGV4cG9ydHM6IFtUaW1lUGFyc2VyRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBUaW1lUGFyc2VyTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtJQUtFO0tBQWlCOzs7Ozs7O0lBT1YscUNBQVM7Ozs7OztjQUFDLFNBQWlCLEVBQUUsWUFBNkI7UUFBN0IsNkJBQUEsRUFBQSxvQkFBNkI7UUFDL0QscUJBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixxQkFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHFCQUFJLElBQUksR0FBRyxTQUFTLENBQUM7O1FBR3JCLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUU7O2dCQUVyRixhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ1g7aUJBQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQywy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