ng-timeparser
Version:
[](https://badge.fury.io/js/ng-timeparser) [](https://travis-ci.org/feeloor/ng-timeparser)
193 lines (192 loc) • 21.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable } from '@angular/core';
export class TimeParserService {
constructor() { }
/**
* 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 {?}
*/
parseTime(inputTime, militaryTime = false) {
let /** @type {?} */ returnTime = '';
let /** @type {?} */ correctFormat = false;
let /** @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 {?}
*/
makeTime4Digit(time) {
let /** @type {?} */ preAMorPM = '';
let /** @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 {?}
*/
addColonIfMissing(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 {?}
*/
addAMorPM(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 TimeParserService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TimeParserService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TimeParserService.ctorParameters;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXRpbWVwYXJzZXIvIiwic291cmNlcyI6WyJzcmMvYXBwL3RpbWUtcGFyc2VyL3NlcnZpY2VzL3RpbWUtcGFyc2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsTUFBTTtJQUVKLGlCQUFpQjs7Ozs7OztJQU9WLFNBQVMsQ0FBQyxTQUFpQixFQUFFLGVBQXdCLEtBQUs7UUFDL0QscUJBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixxQkFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHFCQUFJLElBQUksR0FBRyxTQUFTLENBQUM7O1FBR3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUV0RixhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ1g7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFOUQsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNuQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQywwQkFBMEIs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Q0FBQztTQUMzQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQztTQUMzQzs7OztZQTdKSixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGltZVBhcnNlclNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBnaXZlbiB0aW1lLXN0cmluZyB0byBhIGNvcnJlY3QgNCBkaWdpdCB0aW1lIG9yIGVtcHR5IGlmIGl0J3MgYW4gaW52YWxpZCB0aW1lXG4gICAqIEBwYXJhbSBpbnB1dFRpbWUgVGltZS1zdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIG1pbGl0YXJ5VGltZSBVc2UgbWlsaXRhcnkgdGltZSAoMjQgaG91ciBmb3JtYXQpXG4gICAqL1xuICBwdWJsaWMgcGFyc2VUaW1lKGlucHV0VGltZTogc3RyaW5nLCBtaWxpdGFyeVRpbWU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgbGV0IHJldHVyblRpbWUgPSAnJztcbiAgICBsZXQgY29ycmVjdEZvcm1hdCA9IGZhbHNlO1xuICAgIGxldCB0aW1lID0gaW5wdXRUaW1lO1xuXG4gICAgLy8gRW5nbGlzaCAoMTIgaG91cnMgcGF0dGVybilcbiAgICBpZiAoIW1pbGl0YXJ5VGltZSkge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoL15bMi05XVswLTldLiokLykudGVzdCh0aW1lKSAmJiAodGltZS5tYXRjaCgvXFxkL2cpIHx8IFtdKS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAyMiBvciAyMiBQTSBidXQgbm90IDMyMSBvciAzMjEgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aW1lID0gJyc7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0xXVswLTldOlswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgMDc6MzAgb3IgMDc6MzAgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCA1KTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV1bMC01XVswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDA3MzAgb3IgMDczMCBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDQpO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV06WzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSA5OjMzIGFuZCA5OjMzIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDQpfWA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgOTMzIGFuZCA5MzMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGhpcy5hZGRBTW9yUE0odGltZSwgMCwgMyl9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtMl0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTIgb3IgMTIgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAyKTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDMgYW5kIDMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAxKTtcbiAgICAgIH1cbiAgICAgIC8vIEZyZW5jaCAvIE1pbGl0YXJ5IFRpbWUgKDI0IGhvdXJzIHBhdHRlcm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XTpbMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxNzozMFxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV1bMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxNzMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XTpbMC01XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMjI6M1xuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldWzAtNV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDIyM1xuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XTpbMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyA3OjMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldWzAtNV1bMC05XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgNzMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV0vKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTlcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgJHt0aW1lfTAwYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDlcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGltZX0wMGA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJldHVybiBkYXRhXG4gICAgaWYgKGNvcnJlY3RGb3JtYXQpIHtcbiAgICAgIHRpbWUgPSB0aW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICB0aW1lID0gdGhpcy5tYWtlVGltZTREaWdpdCh0aW1lKTtcbiAgICAgIHJldHVyblRpbWUgPSB0aGlzLmFkZENvbG9uSWZNaXNzaW5nKHRpbWUpO1xuXG4gICAgICBpZiAobWlsaXRhcnlUaW1lKSB7XG4gICAgICAgIHJldHVyblRpbWUgPSByZXR1cm5UaW1lLnN1YnN0cmluZygwLCA1KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuVGltZSA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5UaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHZhbGlkIHRpbWUgdG8gYSA0IGRpZ2l0IHRpbWVcbiAgICogRm9yIGV4YW1wbGUgNCBQTSB0byAwNDowMCBQTSBvciA0OjMwIFBNIHRvIDA0OjMwIFBNXG4gICAqIEBwYXJhbSB0aW1lIFRpbWUtc3RyaW5nIHRvIHBhcnNlIHRvIDQgZGlnaXRcbiAgICovXG4gIHByaXZhdGUgbWFrZVRpbWU0RGlnaXQodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlQU1vclBNID0gJyc7XG4gICAgbGV0IHBhcnNlZCA9IHRpbWU7XG5cbiAgICAvLyBHZXQgYW55IGV4aXN0aW5nIEFNL1BNXG4gICAgaWYgKG5ldyBSZWdFeHAoL1BNL2kpLnRlc3QodGltZSkpIHtcbiAgICAgIHByZUFNb3JQTSA9ICdQTSc7XG4gICAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgvUE0vaSwgJycpO1xuICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvQU0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcHJlQU1vclBNID0gJ0FNJztcbiAgICAgIHBhcnNlZCA9IHBhcnNlZC5yZXBsYWNlKC9BTS9pLCAnJyk7XG4gICAgfVxuXG4gICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoJzonLCAnJyk7XG4gICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoLyAvZywgJycpO1xuICAgIGlmIChwYXJzZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICBwYXJzZWQgPSBgMCR7cGFyc2VkfTAwYDtcbiAgICB9IGVsc2UgaWYgKHBhcnNlZC5sZW5ndGggPT09IDIpIHtcbiAgICAgIHBhcnNlZCA9IGAke3BhcnNlZH0wMGA7XG4gICAgfSBlbHNlIGlmIChwYXJzZWQubGVuZ3RoID09PSAzKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV1bMC01XS8pLnRlc3QocGFyc2VkKSkge1xuICAgICAgICBwYXJzZWQgPSBgJHtwYXJzZWR9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0vKS50ZXN0KHBhcnNlZCkpIHtcbiAgICAgICAgcGFyc2VkID0gYDAke3BhcnNlZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBgJHtwYXJzZWR9JHtwcmVBTW9yUE0gPyAnICcgKyBwcmVBTW9yUE0gOiAnJ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb2xvbiBpZiBpdCdzIG1pc3NpbmcgdG8gZ2l2ZW4gdGltZS1zdHJpbmdcbiAgICogRm9yIGV4YW1wbGUgMDQwMCB0byAwNDowMFxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBhZGQgbWlzc2luZyBjb2xvbiB0b1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRDb2xvbklmTWlzc2luZyh0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBgJHt0aW1lLnN1YnN0cmluZygwLCAyKX06JHt0aW1lLnN1YnN0cmluZygyKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBzdGFydCBhbmQgZW5kIG9mIHRpbWUtc3RyaW5nIGFuZCB0aGVuIGFkZHMgY29ycmVjdCBBTS9QTVxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBhZGQgQU0gb3IgUE0gdG9vXG4gICAqIEBwYXJhbSBzdGFydCBXaGVyZSB0aW1lIHN0YXJ0cyBpbiBzdHJpbmdcbiAgICogQHBhcmFtIGVuZCBXaGVyZSB0aW1lIGVuZHMgaW4gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGFkZEFNb3JQTSh0aW1lOiBzdHJpbmcsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgvUE0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBQTWA7XG4gICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9BTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCl9IEFNYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBQTWA7XG4gICAgfVxuICB9XG59XG4iXX0=