@candidosales/material-time-picker
Version:
Time Picker for Angular
109 lines • 21.8 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { NgStyle } from '@angular/common';
import { MatToolbar } from '@angular/material/toolbar';
import { MatMiniFabButton } from '@angular/material/button';
import * as i0 from "@angular/core";
// Current type to show
export var CLOCK_TYPE;
(function (CLOCK_TYPE) {
CLOCK_TYPE[CLOCK_TYPE["HOURS"] = 1] = "HOURS";
CLOCK_TYPE[CLOCK_TYPE["MINUTES"] = 2] = "MINUTES";
})(CLOCK_TYPE || (CLOCK_TYPE = {}));
export class WClockComponent {
constructor() {
this.userTimeChange = new EventEmitter();
this.viewChange = new EventEmitter();
this.steps = new Array();
}
ngOnChanges() {
this.setupUI();
}
setupUI() {
this.steps = new Array();
switch (this.currentView) {
case CLOCK_TYPE.HOURS:
for (let i = 1; i <= this.userTime.format; i++) {
this.steps.push(i);
this.selectedTimePart = this.userTime.hour || 0;
if (this.selectedTimePart > this.userTime.format) {
this.selectedTimePart -= this.userTime.format;
}
}
break;
case CLOCK_TYPE.MINUTES:
for (let i = 5; i <= 55; i += 5) {
this.steps.push(i);
}
this.steps.push(0);
this.selectedTimePart = this.userTime.minute || 0;
break;
}
}
getPointerStyle() {
let divider = 1;
switch (this.currentView) {
case CLOCK_TYPE.HOURS:
divider = this.userTime.format;
break;
case CLOCK_TYPE.MINUTES:
divider = 60;
break;
}
let degrees = 0;
if (this.currentView === CLOCK_TYPE.HOURS) {
degrees = Math.round(this.userTime.hour * (360 / divider)) - 180;
}
else {
degrees = Math.round(this.userTime.minute * (360 / divider)) - 180;
}
const style = {
'-webkit-transform': 'rotate(' + degrees + 'deg)',
'-ms-transform': 'rotate(' + degrees + 'deg)',
transform: 'rotate(' + degrees + 'deg)'
};
return style;
}
getTimeValueClass(step, index) {
if (this.currentView === CLOCK_TYPE.HOURS) {
this.STEP_DEG = 360 / this.userTime.format;
}
else {
this.STEP_DEG = 360 / 12;
}
let classes = 'w-clock-step w-clock-deg' + this.STEP_DEG * (index + 1);
if (this.selectedTimePart === step) {
classes += ' mat-primary';
}
return classes;
}
changeTimeValue(step) {
if (this.currentView === CLOCK_TYPE.HOURS) {
this.userTime.hour = step;
// auto switch to minutes
this.viewChange.emit(CLOCK_TYPE.MINUTES);
}
else {
this.userTime.minute = step;
// auto switch to hours
this.viewChange.emit(CLOCK_TYPE.HOURS);
}
this.userTimeChange.emit(this.userTime);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: WClockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: WClockComponent, isStandalone: true, selector: "w-clock", inputs: { userTime: "userTime", currentView: "currentView", color: "color" }, outputs: { userTimeChange: "userTimeChange", viewChange: "viewChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex flex-row justify-content-center align-items-center w-clock-wrapper\">\n <div class=\"w-clock\">\n <div class=\"w-clock-container\">\n\n <!-- Clock center -->\n <button mat-mini-fab [color]=\"color\" class=\"w-clock-center\"></button>\n\n <!-- Clock hand -->\n <mat-toolbar [ngStyle]=\"getPointerStyle()\" [color]=\"color\" class=\"w-pointer\">\n <button mat-mini-fab [color]=\"color\" class=\"w-clock-selected\"></button>\n </mat-toolbar>\n\n <!-- Hour / Minute number faces -->\n @for (step of steps; track step; let i = $index) {\n <div [class]=\"getTimeValueClass(step, i)\" >\n <button mat-mini-fab\n [color]=\"selectedTimePart === step ? color : ''\"\n (click)=\"changeTimeValue(step)\">\n {{ step }}\n </button>\n </div>\n }\n\n </div>\n </div>\n</div>", styles: [".d-flex{display:flex}.flex-row{flex-direction:row}.flex-column{flex-direction:column}.justify-content-center{justify-content:center}.justify-content-between{justify-content:space-between}.align-items-center{align-items:center}.align-items-end{align-items:end}@media (min-width: 768px){.flex-md-row{flex-direction:row}.flex-md-column{flex-direction:column}}.w-clock-wrapper{height:100%;padding:0 24px}.w-clock-wrapper .w-clock{width:200px;height:200px;border-radius:50%;cursor:pointer;padding:24px;background:#ededed}.w-clock-wrapper .w-clock .w-clock-container{width:100%;height:100%;position:relative;display:block}.w-clock-wrapper .w-clock .w-clock-center{height:6px;width:6px;position:absolute;inset:0;margin:auto;border-radius:50%}.w-clock-wrapper .w-clock .w-pointer{box-shadow:none;width:1px;height:50%;position:absolute;left:0;right:0;bottom:0;margin:0 auto;padding:0;transform-origin:top center;transition:transform .2s;z-index:0;pointer-events:none}.w-clock-wrapper .w-clock .w-clock-step{display:block;position:absolute;transform:translate(-50%,-50%);transition:transform .2s}.w-clock-wrapper .w-clock .w-clock-step .mat-mdc-mini-fab{box-shadow:none;background-color:transparent}.w-clock-wrapper .w-clock .w-clock-selected{position:absolute;bottom:-19px;left:-19px;min-width:0;min-height:0;pointer-events:none;box-shadow:none;cursor:none}.w-clock-deg0{top:0%;left:50%}.w-clock-deg15{top:1.70370869%;left:62.94095226%}.w-clock-deg30{top:6.69872981%;left:75%}.w-clock-deg45{top:14.64466094%;left:85.35533905%}.w-clock-deg60{top:25%;left:93.30127019%}.w-clock-deg75{top:37.05904774%;left:98.29629131%}.w-clock-deg90{top:50%;left:100%}.w-clock-deg105{top:62.94095226%;left:98.29629131%}.w-clock-deg120{top:75%;left:93.30127019%}.w-clock-deg135{top:85.35533906%;left:85.35533906%}.w-clock-deg150{top:93.30127019%;left:75%}.w-clock-deg165{top:98.29629131%;left:62.94095226%}.w-clock-deg180{top:100%;left:50%}.w-clock-deg195{top:98.29629131%;left:37.05904774%}.w-clock-deg210{top:93.30127019%;left:25%}.w-clock-deg225{top:85.35533906%;left:14.64466094%}.w-clock-deg240{top:75%;left:6.69872981%}.w-clock-deg255{top:62.94095226%;left:1.703708686%}.w-clock-deg270{top:50%;left:0%}.w-clock-deg285{top:37.05904774%;left:1.703708686%}.w-clock-deg300{top:25%;left:6.69872981%}.w-clock-deg315{top:14.64466094%;left:14.64466094%}.w-clock-deg330{top:6.69872981%;left:25%}.w-clock-deg345{top:1.703708686%;left:37.05904774%}.w-clock-deg360{top:0%;left:50%}\n"], dependencies: [{ kind: "component", type: MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: WClockComponent, decorators: [{
type: Component,
args: [{ selector: 'w-clock', standalone: true, imports: [MatMiniFabButton, MatToolbar, NgStyle], template: "<div class=\"d-flex flex-row justify-content-center align-items-center w-clock-wrapper\">\n <div class=\"w-clock\">\n <div class=\"w-clock-container\">\n\n <!-- Clock center -->\n <button mat-mini-fab [color]=\"color\" class=\"w-clock-center\"></button>\n\n <!-- Clock hand -->\n <mat-toolbar [ngStyle]=\"getPointerStyle()\" [color]=\"color\" class=\"w-pointer\">\n <button mat-mini-fab [color]=\"color\" class=\"w-clock-selected\"></button>\n </mat-toolbar>\n\n <!-- Hour / Minute number faces -->\n @for (step of steps; track step; let i = $index) {\n <div [class]=\"getTimeValueClass(step, i)\" >\n <button mat-mini-fab\n [color]=\"selectedTimePart === step ? color : ''\"\n (click)=\"changeTimeValue(step)\">\n {{ step }}\n </button>\n </div>\n }\n\n </div>\n </div>\n</div>", styles: [".d-flex{display:flex}.flex-row{flex-direction:row}.flex-column{flex-direction:column}.justify-content-center{justify-content:center}.justify-content-between{justify-content:space-between}.align-items-center{align-items:center}.align-items-end{align-items:end}@media (min-width: 768px){.flex-md-row{flex-direction:row}.flex-md-column{flex-direction:column}}.w-clock-wrapper{height:100%;padding:0 24px}.w-clock-wrapper .w-clock{width:200px;height:200px;border-radius:50%;cursor:pointer;padding:24px;background:#ededed}.w-clock-wrapper .w-clock .w-clock-container{width:100%;height:100%;position:relative;display:block}.w-clock-wrapper .w-clock .w-clock-center{height:6px;width:6px;position:absolute;inset:0;margin:auto;border-radius:50%}.w-clock-wrapper .w-clock .w-pointer{box-shadow:none;width:1px;height:50%;position:absolute;left:0;right:0;bottom:0;margin:0 auto;padding:0;transform-origin:top center;transition:transform .2s;z-index:0;pointer-events:none}.w-clock-wrapper .w-clock .w-clock-step{display:block;position:absolute;transform:translate(-50%,-50%);transition:transform .2s}.w-clock-wrapper .w-clock .w-clock-step .mat-mdc-mini-fab{box-shadow:none;background-color:transparent}.w-clock-wrapper .w-clock .w-clock-selected{position:absolute;bottom:-19px;left:-19px;min-width:0;min-height:0;pointer-events:none;box-shadow:none;cursor:none}.w-clock-deg0{top:0%;left:50%}.w-clock-deg15{top:1.70370869%;left:62.94095226%}.w-clock-deg30{top:6.69872981%;left:75%}.w-clock-deg45{top:14.64466094%;left:85.35533905%}.w-clock-deg60{top:25%;left:93.30127019%}.w-clock-deg75{top:37.05904774%;left:98.29629131%}.w-clock-deg90{top:50%;left:100%}.w-clock-deg105{top:62.94095226%;left:98.29629131%}.w-clock-deg120{top:75%;left:93.30127019%}.w-clock-deg135{top:85.35533906%;left:85.35533906%}.w-clock-deg150{top:93.30127019%;left:75%}.w-clock-deg165{top:98.29629131%;left:62.94095226%}.w-clock-deg180{top:100%;left:50%}.w-clock-deg195{top:98.29629131%;left:37.05904774%}.w-clock-deg210{top:93.30127019%;left:25%}.w-clock-deg225{top:85.35533906%;left:14.64466094%}.w-clock-deg240{top:75%;left:6.69872981%}.w-clock-deg255{top:62.94095226%;left:1.703708686%}.w-clock-deg270{top:50%;left:0%}.w-clock-deg285{top:37.05904774%;left:1.703708686%}.w-clock-deg300{top:25%;left:6.69872981%}.w-clock-deg315{top:14.64466094%;left:14.64466094%}.w-clock-deg330{top:6.69872981%;left:25%}.w-clock-deg345{top:1.703708686%;left:37.05904774%}.w-clock-deg360{top:0%;left:50%}\n"] }]
}], propDecorators: { userTime: [{
type: Input
}], userTimeChange: [{
type: Output
}], currentView: [{
type: Input
}], viewChange: [{
type: Output
}], color: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidy1jbG9jay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC10aW1lLXBpY2tlci9zcmMvbGliL3ctY2xvY2svdy1jbG9jay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC10aW1lLXBpY2tlci9zcmMvbGliL3ctY2xvY2svdy1jbG9jay5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRTVELHVCQUF1QjtBQUN2QixNQUFNLENBQU4sSUFBWSxVQUdYO0FBSEQsV0FBWSxVQUFVO0lBQ3BCLDZDQUFTLENBQUE7SUFDVCxpREFBVyxDQUFBO0FBQ2IsQ0FBQyxFQUhXLFVBQVUsS0FBVixVQUFVLFFBR3JCO0FBa0JELE1BQU0sT0FBTyxlQUFlO0lBUDVCO1FBU21CLG1CQUFjLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHekQsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7UUFJdEQsVUFBSyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7S0EwRnBDO0lBdEZDLFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVPLE9BQU87UUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFFakMsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekIsS0FBSyxVQUFVLENBQUMsS0FB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QWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkMsT0FBTyxJQUFJLGNBQWMsQ0FBQztRQUM1QixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFZO1FBQzFCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBRTFCLHlCQUF5QjtZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFFNUIsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7OEdBbEdVLGVBQWU7a0dBQWYsZUFBZSwrT0NqQzVCLHE0QkF5Qk0sMjhFRE1RLGdCQUFnQiwwRkFBRSxVQUFVLHFHQUFFLE9BQU87OzJGQUV0QyxlQUFlO2tCQVAzQixTQUFTOytCQUNJLFNBQVMsY0FHUCxJQUFJLFdBQ1AsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDOzhCQUdsQyxRQUFRO3NCQUF2QixLQUFLO2dCQUNXLGNBQWM7c0JBQTlCLE1BQU07Z0JBRVMsV0FBVztzQkFBMUIsS0FBSztnQkFDVyxVQUFVO3NCQUExQixNQUFNO2dCQUVTLEtBQUs7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRUb29sYmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbGJhcic7XG5pbXBvcnQgeyBNYXRNaW5pRmFiQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcblxuLy8gQ3VycmVudCB0eXBlIHRvIHNob3dcbmV4cG9ydCBlbnVtIENMT0NLX1RZUEUge1xuICBIT1VSUyA9IDEsXG4gIE1JTlVURVMgPSAyXG59XG5cbmV4cG9ydCB0eXBlIFRpbWVGb3JtYXQgPSAxMiB8IDI0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElUaW1lIHtcbiAgaG91cjogYW55O1xuICBtaW51dGU6IGFueTtcbiAgbWVyaWRlbjogJ1BNJyB8ICdBTSc7XG4gIGZvcm1hdDogVGltZUZvcm1hdDtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd3LWNsb2NrJyxcbiAgICBzdHlsZVVybHM6IFsnLi93LWNsb2NrLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3ctY2xvY2suY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW01hdE1pbmlGYWJCdXR0b24sIE1hdFRvb2xiYXIsIE5nU3R5bGVdXG59KVxuZXhwb3J0IGNsYXNzIFdDbG9ja0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHB1YmxpYyB1c2VyVGltZTogSVRpbWU7XG4gIEBPdXRwdXQoKSBwdWJsaWMgdXNlclRpbWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJVGltZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQElucHV0KCkgcHVibGljIGN1cnJlbnRWaWV3OiBDTE9DS19UWVBFO1xuICBAT3V0cHV0KCkgcHVibGljIHZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENMT0NLX1RZUEU+KCk7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbG9yOiBzdHJpbmc7XG5cbiAgcHVibGljIHN0ZXBzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcbiAgc2VsZWN0ZWRUaW1lUGFydDtcbiAgcHJpdmF0ZSBTVEVQX0RFRzogbnVtYmVyO1xuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMuc2V0dXBVSSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFVJKCkge1xuICAgIHRoaXMuc3RlcHMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRWaWV3KSB7XG4gICAgICBjYXNlIENMT0NLX1RZUEUuSE9VUlM6XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMudXNlclRpbWUuZm9ybWF0OyBpKyspIHtcbiAgICAgICAgICB0aGlzLnN0ZXBzLnB1c2goaSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRpbWVQYXJ0ID0gdGhpcy51c2VyVGltZS5ob3VyIHx8IDA7XG5cbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRpbWVQYXJ0ID4gdGhpcy51c2VyVGltZS5mb3JtYXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lUGFydCAtPSB0aGlzLnVzZXJUaW1lLmZvcm1hdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ0xPQ0tfVFlQRS5NSU5VVEVTOlxuICAgICAgICBmb3IgKGxldCBpID0gNTsgaSA8PSA1NTsgaSArPSA1KSB7XG4gICAgICAgICAgdGhpcy5zdGVwcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcHMucHVzaCgwKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRpbWVQYXJ0ID0gdGhpcy51c2VyVGltZS5taW51dGUgfHwgMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZ2V0UG9pbnRlclN0eWxlKCkge1xuICAgIGxldCBkaXZpZGVyID0gMTtcbiAgICBzd2l0Y2ggKHRoaXMuY3VycmVudFZpZXcpIHtcbiAgICAgIGNhc2UgQ0xPQ0tfVFlQRS5IT1VSUzpcbiAgICAgICAgZGl2aWRlciA9IHRoaXMudXNlclRpbWUuZm9ybWF0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDTE9DS19UWVBFLk1JTlVURVM6XG4gICAgICAgIGRpdmlkZXIgPSA2MDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbGV0IGRlZ3JlZXMgPSAwO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSBDTE9DS19UWVBFLkhPVVJTKSB7XG4gICAgICBkZWdyZWVzID0gTWF0aC5yb3VuZCh0aGlzLnVzZXJUaW1lLmhvdXIgKiAoMzYwIC8gZGl2aWRlcikpIC0gMTgwO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWdyZWVzID0gTWF0aC5yb3VuZCh0aGlzLnVzZXJUaW1lLm1pbnV0ZSAqICgzNjAgLyBkaXZpZGVyKSkgLSAxODA7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGUgPSB7XG4gICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAncm90YXRlKCcgKyBkZWdyZWVzICsgJ2RlZyknLFxuICAgICAgJy1tcy10cmFuc2Zvcm0nOiAncm90YXRlKCcgKyBkZWdyZWVzICsgJ2RlZyknLFxuICAgICAgdHJhbnNmb3JtOiAncm90YXRlKCcgKyBkZWdyZWVzICsgJ2RlZyknXG4gICAgfTtcblxuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuXG4gIGdldFRpbWVWYWx1ZUNsYXNzKHN0ZXA6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSBDTE9DS19UWVBFLkhPVVJTKSB7XG4gICAgICB0aGlzLlNURVBfREVHID0gMzYwIC8gdGhpcy51c2VyVGltZS5mb3JtYXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuU1RFUF9ERUcgPSAzNjAgLyAxMjtcbiAgICB9XG4gICAgbGV0IGNsYXNzZXMgPSAndy1jbG9jay1zdGVwIHctY2xvY2stZGVnJyArIHRoaXMuU1RFUF9ERUcgKiAoaW5kZXggKyAxKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZVBhcnQgPT09IHN0ZXApIHtcbiAgICAgIGNsYXNzZXMgKz0gJyBtYXQtcHJpbWFyeSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBjaGFuZ2VUaW1lVmFsdWUoc3RlcDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09IENMT0NLX1RZUEUuSE9VUlMpIHtcbiAgICAgIHRoaXMudXNlclRpbWUuaG91ciA9IHN0ZXA7XG5cbiAgICAgIC8vIGF1dG8gc3dpdGNoIHRvIG1pbnV0ZXNcbiAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KENMT0NLX1RZUEUuTUlOVVRFUyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlclRpbWUubWludXRlID0gc3RlcDtcblxuICAgICAgLy8gYXV0byBzd2l0Y2ggdG8gaG91cnNcbiAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KENMT0NLX1RZUEUuSE9VUlMpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJUaW1lQ2hhbmdlLmVtaXQodGhpcy51c2VyVGltZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdy1jbG9jay13cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ3LWNsb2NrXCI+XG4gICAgPGRpdiBjbGFzcz1cInctY2xvY2stY29udGFpbmVyXCI+XG5cbiAgICAgIDwhLS0gQ2xvY2sgY2VudGVyIC0tPlxuICAgICAgPGJ1dHRvbiAgbWF0LW1pbmktZmFiIFtjb2xvcl09XCJjb2xvclwiIGNsYXNzPVwidy1jbG9jay1jZW50ZXJcIj48L2J1dHRvbj5cblxuICAgICAgPCEtLSBDbG9jayBoYW5kIC0tPlxuICAgICAgPG1hdC10b29sYmFyIFtuZ1N0eWxlXT1cImdldFBvaW50ZXJTdHlsZSgpXCIgW2NvbG9yXT1cImNvbG9yXCIgY2xhc3M9XCJ3LXBvaW50ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgW2NvbG9yXT1cImNvbG9yXCIgY2xhc3M9XCJ3LWNsb2NrLXNlbGVjdGVkXCI+PC9idXR0b24+XG4gICAgICA8L21hdC10b29sYmFyPlxuXG4gICAgICA8IS0tIEhvdXIgLyBNaW51dGUgbnVtYmVyIGZhY2VzIC0tPlxuICAgICAgQGZvciAoc3RlcCBvZiBzdGVwczsgdHJhY2sgc3RlcDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0VGltZVZhbHVlQ2xhc3Moc3RlcCwgaSlcIiA+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWJcbiAgICAgICAgICAgIFtjb2xvcl09XCJzZWxlY3RlZFRpbWVQYXJ0ID09PSBzdGVwID8gY29sb3IgOiAnJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGltZVZhbHVlKHN0ZXApXCI+XG4gICAgICAgICAgICB7eyBzdGVwIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19