UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

294 lines (292 loc) 52.6 kB
/* MIT License Copyright (c) 2019 Temainfo Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Component, EventEmitter, Input, Output, ViewChild, Optional, Inject } from '@angular/core'; import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NgModel } from '@angular/forms'; import { TlInput } from '../input/input'; import { ElementBase } from '../input/core/element-base'; import { MakeProvider } from '../core/base/value-accessor-provider'; import { ClockPickerService } from './services/clockpicker.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../input/input"; import * as i3 from "@angular/forms"; export class TlClockPicker extends ElementBase { constructor(validators, asyncValidators, renderer) { super(validators, asyncValidators); this.renderer = renderer; this.label = ''; this.name = ''; this.labelSize = ''; this.textAlign = 'left'; this.labelPlacement = 'left'; this.readonly = false; this.disabled = false; this.placeholder = 'ClockPicker Field'; this.clearButton = true; this.autoClose = false; this.iconTimepicker = false; this.showButtonDone = true; this.buttonDoneMessage = 'Done'; this.color = 'primary'; this.changeTime = new EventEmitter(); this.iconAfter = ''; this.moving = false; this.time = { hour: '00', minute: '00' }; this.listeners = []; this.clockMeasure = { offsetX: 0, offsetY: 0, width: 0, height: 0 }; this.wrapperMeasure = { offsetX: 0, offsetY: 0, width: 0, height: 0 }; this.boxCenter = []; } ngAfterContentInit() { this.timepickerService = new ClockPickerService(this.wrapperDial, this.wrapperDialMin, this.renderer); this.timepickerService.createHourDial(); this.handleModelChange(); this.handleIconClockPicker(); this.onCloseClockPicker(); this.windowMouseMove(); this.listenDocumentScroll(); this.documentMouseDown(); } ngAfterViewInit() { this.setPickerMeasures(); this.handleClockPickerPosition(); } handleIconClockPicker() { if (this.iconTimepicker) { this.iconAfter = 'ion-clock'; } } setPickerMeasures() { setTimeout(() => { this.setClockOffset(); this.setWrapperOffset(); this.setBoxCenter(); }, 1); } setClockOffset() { this.clockMeasure.offsetX = this.uiClockRadius.nativeElement.offsetLeft; this.clockMeasure.offsetY = this.uiClockRadius.nativeElement.offsetTop; this.clockMeasure.width = this.uiClockRadius.nativeElement.offsetWidth; this.clockMeasure.height = this.uiClockRadius.nativeElement.offsetHeight; } setWrapperOffset() { this.wrapperMeasure.offsetX = this.timePickerContent.nativeElement.offsetLeft; this.wrapperMeasure.offsetY = this.timePickerContent.nativeElement.offsetTop; this.wrapperMeasure.width = this.timePickerContent.nativeElement.offsetWidth; this.wrapperMeasure.height = this.timePickerContent.nativeElement.offsetHeight; } setBoxCenter() { this.boxCenter = [ this.clockMeasure.offsetX + this.wrapperMeasure.offsetX + (this.clockMeasure.width / 2), this.clockMeasure.offsetY + this.wrapperMeasure.offsetY - (this.clockMeasure.height / 2) ]; } handleModelChange() { this.model.valueChanges.subscribe((value) => { if (value) { this.timepickerService.setTimeClock(this.clearMask(this.model.value)); } }); } listenDocumentScroll() { this.listeners.push(this.renderer.listen(document, 'scroll', () => { this.close(); })); } windowMouseMove() { this.listeners.push(this.renderer.listen(document, 'mousemove', ($event) => { const positionX = $event.pageX - this.boxCenter[0]; const positionY = -($event.pageY - (this.boxCenter[1] + this.clockMeasure.height)); if (this.moving) { let angle = Math.floor(Math.atan2(positionX, positionY) * (180 / Math.PI)); if (angle < 0) { angle = Math.floor(360 + angle); } this.timepickerService.setAngleLineHour(angle - (angle % this.timepickerService.getDivisorAngle())); this.timepickerService.getTimeByAngle(angle); } })); } documentMouseDown() { this.renderer.listen(document, 'mousedown', ($event) => { this.isElementInPath($event); }); } isElementInPath($event) { if ($event.path.indexOf(this.timePickerContent.nativeElement) < 0) { this.close(); } } setInputValue(value) { this.tlinput.input.nativeElement.value = value.hour + ':' + value.minute; } close() { this.timepickerService.closeClockPicker(); } opened() { return this.timepickerService.getOpened(); } changeHour() { this.timepickerService.createHourDial(); } changeMinute() { this.timepickerService.createMinuteDial(); } onCloseClockPicker() { this.timepickerService.change.subscribe((value) => { this.setInputValue(value); this.changeTime.emit(value); }); } onKeyUp($event) { const replaced = this.clearMask($event.target.value); if (replaced.length <= 2) { this.timepickerService.setTimeClock(replaced); } else { this.timepickerService.setTimeClock(replaced); } } clearMask(value) { return value.replace(/[^\d]+/g, ''); } open() { this.timepickerService.openClockPicker(); this.handleClockPickerPosition(); this.setPickerMeasures(); } onMouseDown() { this.moving = true; } onMouseUp() { this.moving = false; if (this.isHourDial()) { setTimeout(() => this.timepickerService.createMinuteDial()); } else { if (this.autoClose) { this.timepickerService.closeClockPicker(); } } } handleClockPickerPosition() { const timePickerHeight = this.showButtonDone ? 325 : 300; const totalHeight = (this.tlinput.input.nativeElement.getBoundingClientRect().top) + timePickerHeight; if ((window.innerHeight - totalHeight) < 0) { this.setTopPositionTop(); this.setLeftPosition(); return; } this.setWrapperClockPickerPositionBottom(); } setTopPositionTop() { this.isClockPickerAbove = true; const timePickerHeight = this.showButtonDone ? 325 : 300; this.timePickerContent.nativeElement.style.top = (this.tlinput.input.nativeElement.getBoundingClientRect().top - this.tlinput.input.nativeElement.offsetHeight) - timePickerHeight + 'px'; } setWrapperClockPickerPositionBottom() { this.setTopPositionBottom(); this.setLeftPosition(); } setTopPositionBottom() { this.isClockPickerAbove = false; this.timePickerContent.nativeElement.style.top = (this.tlinput.input.nativeElement.getBoundingClientRect().top + this.tlinput.input.nativeElement.offsetHeight) + 'px'; } setLeftPosition() { this.timePickerContent.nativeElement.style.left = this.tlinput.input.nativeElement.getBoundingClientRect().left + 'px'; } isHourDial() { return this.timepickerService.type === 'hour'; } onClearInput($event) { $event.stopPropagation(); } ngOnDestroy() { this.listeners.forEach((value) => value()); } } /** @nocollapse */ TlClockPicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlClockPicker, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlClockPicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlClockPicker, selector: "tl-clockpicker", inputs: { label: "label", name: "name", labelSize: "labelSize", textAlign: "textAlign", labelPlacement: "labelPlacement", readonly: "readonly", disabled: "disabled", placeholder: "placeholder", clearButton: "clearButton", autoClose: "autoClose", iconTimepicker: "iconTimepicker", showButtonDone: "showButtonDone", buttonDoneMessage: "buttonDoneMessage", color: "color" }, outputs: { changeTime: "changeTime" }, providers: [MakeProvider(TlClockPicker), ClockPickerService], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }, { propertyName: "tlinput", first: true, predicate: TlInput, descendants: true, static: true }, { propertyName: "timePickerContent", first: true, predicate: ["timePickerContent"], descendants: true, static: true }, { propertyName: "uiClockRadius", first: true, predicate: ["uiClockRadius"], descendants: true, static: true }, { propertyName: "wrapperDialMin", first: true, predicate: ["wrapperDialMin"], descendants: true, static: true }, { propertyName: "wrapperDial", first: true, predicate: ["wrapperDial"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [class]=\"'tl-clockpicker ' + color\">\n <tl-input #input\n [label]=\"label\"\n [labelSize]=\"labelSize\"\n [name]=\"name\"\n (clear)=\"onClearInput($event)\"\n (keyup)=\"onKeyUp($event)\"\n (focus)=\"open()\"\n [iconAfter]=\"iconAfter\"\n [textAlign]=\"textAlign\"\n [mask]=\"'00:00'\"\n [labelPlacement]=\"labelPlacement\"\n [readonly]=\"readonly ? true : null\"\n [disabled]=\"disabled ? true : null\"\n [(ngModel)]=\"value\"\n [placeholder]=\"placeholder\"\n [clearButton]=\"clearButton\">\n </tl-input>\n <div class=\"ui-wrapper-clockpicker-content\" #timePickerContent\n [style.display]=\"opened() ? 'block' : 'none'\">\n <div class=\"ui-arrow-up\" #arrow [style.display]=\"opened() && !isClockPickerAbove ? 'block' : 'none'\"></div>\n <div class=\"ui-clockpicker-wrapper\">\n <div class=\"ui-clockpicker-header\">\n <span [ngClass]=\"{ 'selected-time' : timepickerService.type === 'hour' }\"\n (click)=\"changeHour()\">{{ timepickerService.getClockPickerValue().hour }}</span>\n :\n <span [ngClass]=\"{ 'selected-time' : timepickerService.type === 'minute'}\"\n (click)=\"changeMinute()\">{{ timepickerService.getClockPickerValue().minute }}</span>\n </div>\n <div class=\"ui-clockpicker-content\" [ngClass]=\"{ 'noBorderBottom' : !showButtonDone }\">\n <div class=\"ui-clock\" #uiClockRadius>\n <div class=\"ui-point-center\" #point></div>\n <div class=\"ui-clock-line\" [style.transform]=\"'rotate('+ timepickerService.getAngleClock() + 'deg)'\">\n <div class=\"ui-clock-line-circle\"></div>\n </div>\n </div>\n <div class=\"clockpicker-dial\" (mousedown)=\"onMouseDown()\" (mouseup)=\"onMouseUp()\" #wrapperDial></div>\n <div class=\"clockpicker-dial dial-min\" (mousedown)=\"onMouseDown()\" (mouseup)=\"onMouseUp()\" #wrapperDialMin></div>\n </div>\n <div *ngIf=\"showButtonDone\" class=\"ui-clockpicker-footer\" (click)=\"close()\">\n {{ buttonDoneMessage }}\n </div>\n <div class=\"ui-arrow-down\" [style.display]=\"opened() && isClockPickerAbove ? 'block' : 'none'\"></div>\n </div>\n </div>\n</div>\n\n", styles: [".tl-clockpicker>.ui-wrapper-clockpicker-content{position:fixed;height:100%;z-index:1000}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper{position:absolute;margin-top:9px}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-header{position:relative;height:50px;font-weight:700;flex-direction:row;display:flex;align-items:center;justify-items:center;justify-content:center;font-size:2em;font-family:sans-serif;cursor:pointer;-webkit-user-select:none;user-select:none}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content{padding:10px;cursor:move;position:relative}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.ui-clock{content:\" \";height:200px;width:200px;border-radius:50%;box-sizing:border-box;position:relative}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.clockpicker-dial{position:absolute;-webkit-user-select:none;user-select:none;box-sizing:border-box;top:-5px;left:-5px}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.clockpicker-dial.dial-min{font-size:.9em}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.clockpicker-dial>.clock-number{width:30px;height:30px;border-radius:50%;text-align:center;font-size:1.2em;animation-name:creating;animation-duration:.2s;justify-content:center;align-items:center;display:flex;transition:all ease-in-out .3s}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.clockpicker-dial>.clock-number:hover{cursor:pointer}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-footer{height:50px;display:flex;align-items:center;justify-items:center;justify-content:center}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-footer:hover{cursor:pointer}.tl-clockpicker .noBorderBottom{border-bottom:0!important}.tl-clockpicker .ui-clock-line-circle{width:30px;height:30px;opacity:.5;border-radius:50%;position:absolute;left:-15px;top:-30px}.tl-clockpicker .ui-translate-rotate{position:absolute;width:100%;height:100%;z-index:100}.tl-clockpicker .ui-clock-line{position:absolute;height:70px;width:1px;left:0;right:0;top:14%;margin:0 auto;transform-origin:bottom right}.tl-clockpicker .ui-point-center{min-height:0px;height:6px;width:6px;position:absolute;inset:0;margin:auto;border-radius:50%}.tl-clockpicker .ui-arrow-up{position:fixed;width:0;height:0;border-style:solid;z-index:100;border-width:0 10px 10px 10px}.tl-clockpicker .ui-arrow-up:after{content:\"\";display:block;position:absolute;width:0;height:0;left:-9px;top:1px;border-style:solid;border-width:0 9px 9px 9px}.tl-clockpicker .ui-arrow-down{position:absolute;width:0;height:0;border-style:solid;z-index:100;border-width:0 10px 10px 10px;transform:rotate(180deg)}.tl-clockpicker .ui-arrow-down:after{content:\"\";display:block;position:absolute;width:0;height:0;left:-9px;top:1px;border-style:solid;border-width:0 9px 9px 9px}@keyframes creating{0%{opacity:0;transform:scale(0)}25%{opacity:.25;transform:scale(.25)}50%{opacity:.5;transform:scale(.5)}75%{opacity:.75;transform:scale(.75)}to{opacity:1;transform:scale(1)}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.TlInput, selector: "tl-input", inputs: ["textBefore", "textAfter", "labelPlacement", "labelSize", "name", "label", "color", "iconBefore", "iconAfter", "clearButton", "readonly", "required", "disabled", "autocomplete", "maxlength", "tabindex", "textAlign", "mask", "placeholder", "type", "height", "withBorder", "flatBorder"], outputs: ["clear", "overlayOrigin", "clickAddon", "click", "focus", "blur", "valid", "completeMask"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlClockPicker, decorators: [{ type: Component, args: [{ selector: 'tl-clockpicker', providers: [MakeProvider(TlClockPicker), ClockPickerService], template: "<div [class]=\"'tl-clockpicker ' + color\">\n <tl-input #input\n [label]=\"label\"\n [labelSize]=\"labelSize\"\n [name]=\"name\"\n (clear)=\"onClearInput($event)\"\n (keyup)=\"onKeyUp($event)\"\n (focus)=\"open()\"\n [iconAfter]=\"iconAfter\"\n [textAlign]=\"textAlign\"\n [mask]=\"'00:00'\"\n [labelPlacement]=\"labelPlacement\"\n [readonly]=\"readonly ? true : null\"\n [disabled]=\"disabled ? true : null\"\n [(ngModel)]=\"value\"\n [placeholder]=\"placeholder\"\n [clearButton]=\"clearButton\">\n </tl-input>\n <div class=\"ui-wrapper-clockpicker-content\" #timePickerContent\n [style.display]=\"opened() ? 'block' : 'none'\">\n <div class=\"ui-arrow-up\" #arrow [style.display]=\"opened() && !isClockPickerAbove ? 'block' : 'none'\"></div>\n <div class=\"ui-clockpicker-wrapper\">\n <div class=\"ui-clockpicker-header\">\n <span [ngClass]=\"{ 'selected-time' : timepickerService.type === 'hour' }\"\n (click)=\"changeHour()\">{{ timepickerService.getClockPickerValue().hour }}</span>\n :\n <span [ngClass]=\"{ 'selected-time' : timepickerService.type === 'minute'}\"\n (click)=\"changeMinute()\">{{ timepickerService.getClockPickerValue().minute }}</span>\n </div>\n <div class=\"ui-clockpicker-content\" [ngClass]=\"{ 'noBorderBottom' : !showButtonDone }\">\n <div class=\"ui-clock\" #uiClockRadius>\n <div class=\"ui-point-center\" #point></div>\n <div class=\"ui-clock-line\" [style.transform]=\"'rotate('+ timepickerService.getAngleClock() + 'deg)'\">\n <div class=\"ui-clock-line-circle\"></div>\n </div>\n </div>\n <div class=\"clockpicker-dial\" (mousedown)=\"onMouseDown()\" (mouseup)=\"onMouseUp()\" #wrapperDial></div>\n <div class=\"clockpicker-dial dial-min\" (mousedown)=\"onMouseDown()\" (mouseup)=\"onMouseUp()\" #wrapperDialMin></div>\n </div>\n <div *ngIf=\"showButtonDone\" class=\"ui-clockpicker-footer\" (click)=\"close()\">\n {{ buttonDoneMessage }}\n </div>\n <div class=\"ui-arrow-down\" [style.display]=\"opened() && isClockPickerAbove ? 'block' : 'none'\"></div>\n </div>\n </div>\n</div>\n\n", styles: [".tl-clockpicker>.ui-wrapper-clockpicker-content{position:fixed;height:100%;z-index:1000}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper{position:absolute;margin-top:9px}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-header{position:relative;height:50px;font-weight:700;flex-direction:row;display:flex;align-items:center;justify-items:center;justify-content:center;font-size:2em;font-family:sans-serif;cursor:pointer;-webkit-user-select:none;user-select:none}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content{padding:10px;cursor:move;position:relative}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.ui-clock{content:\" \";height:200px;width:200px;border-radius:50%;box-sizing:border-box;position:relative}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.clockpicker-dial{position:absolute;-webkit-user-select:none;user-select:none;box-sizing:border-box;top:-5px;left:-5px}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.clockpicker-dial.dial-min{font-size:.9em}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.clockpicker-dial>.clock-number{width:30px;height:30px;border-radius:50%;text-align:center;font-size:1.2em;animation-name:creating;animation-duration:.2s;justify-content:center;align-items:center;display:flex;transition:all ease-in-out .3s}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-content>.clockpicker-dial>.clock-number:hover{cursor:pointer}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-footer{height:50px;display:flex;align-items:center;justify-items:center;justify-content:center}.tl-clockpicker>.ui-wrapper-clockpicker-content>.ui-clockpicker-wrapper>.ui-clockpicker-footer:hover{cursor:pointer}.tl-clockpicker .noBorderBottom{border-bottom:0!important}.tl-clockpicker .ui-clock-line-circle{width:30px;height:30px;opacity:.5;border-radius:50%;position:absolute;left:-15px;top:-30px}.tl-clockpicker .ui-translate-rotate{position:absolute;width:100%;height:100%;z-index:100}.tl-clockpicker .ui-clock-line{position:absolute;height:70px;width:1px;left:0;right:0;top:14%;margin:0 auto;transform-origin:bottom right}.tl-clockpicker .ui-point-center{min-height:0px;height:6px;width:6px;position:absolute;inset:0;margin:auto;border-radius:50%}.tl-clockpicker .ui-arrow-up{position:fixed;width:0;height:0;border-style:solid;z-index:100;border-width:0 10px 10px 10px}.tl-clockpicker .ui-arrow-up:after{content:\"\";display:block;position:absolute;width:0;height:0;left:-9px;top:1px;border-style:solid;border-width:0 9px 9px 9px}.tl-clockpicker .ui-arrow-down{position:absolute;width:0;height:0;border-style:solid;z-index:100;border-width:0 10px 10px 10px;transform:rotate(180deg)}.tl-clockpicker .ui-arrow-down:after{content:\"\";display:block;position:absolute;width:0;height:0;left:-9px;top:1px;border-style:solid;border-width:0 9px 9px 9px}@keyframes creating{0%{opacity:0;transform:scale(0)}25%{opacity:.25;transform:scale(.25)}50%{opacity:.5;transform:scale(.5)}75%{opacity:.75;transform:scale(.75)}to{opacity:1;transform:scale(1)}}\n"] }] }], ctorParameters: function () { return [{ type: Array, decorators: [{ type: Optional }, { type: Inject, args: [NG_VALIDATORS] }] }, { type: Array, decorators: [{ type: Optional }, { type: Inject, args: [NG_ASYNC_VALIDATORS] }] }, { type: i0.Renderer2 }]; }, propDecorators: { label: [{ type: Input }], name: [{ type: Input }], labelSize: [{ type: Input }], textAlign: [{ type: Input }], labelPlacement: [{ type: Input }], readonly: [{ type: Input }], disabled: [{ type: Input }], placeholder: [{ type: Input }], clearButton: [{ type: Input }], autoClose: [{ type: Input }], iconTimepicker: [{ type: Input }], showButtonDone: [{ type: Input }], buttonDoneMessage: [{ type: Input }], color: [{ type: Input }], changeTime: [{ type: Output }], model: [{ type: ViewChild, args: [NgModel, { static: true }] }], tlinput: [{ type: ViewChild, args: [TlInput, { static: true }] }], timePickerContent: [{ type: ViewChild, args: ['timePickerContent', { static: true }] }], uiClockRadius: [{ type: ViewChild, args: ['uiClockRadius', { static: true }] }], wrapperDialMin: [{ type: ViewChild, args: ['wrapperDialMin', { static: true }] }], wrapperDial: [{ type: ViewChild, args: ['wrapperDial', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2twaWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9jbG9ja3BpY2tlci9jbG9ja3BpY2tlci50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2Nsb2NrcGlja2VyL2Nsb2NrcGlja2VyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWEsUUFBUSxFQUFFLE1BQU0sRUFFL0UsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7QUFRcEUsTUFBTSxPQUFPLGFBQWMsU0FBUSxXQUFtQjtJQThEcEQsWUFBa0QsVUFBc0IsRUFDaEIsZUFBMkIsRUFBVSxRQUFtQjtRQUM5RyxLQUFLLENBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBRSxDQUFDO1FBRHNELGFBQVEsR0FBUixRQUFRLENBQVc7UUE3RHZHLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBRVYsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLGNBQVMsR0FBRyxNQUFNLENBQUM7UUFFbkIsbUJBQWMsR0FBRyxNQUFNLENBQUM7UUFFeEIsYUFBUSxHQUFHLEtB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O2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFFZ0MsS0FBSztzQkFBM0MsU0FBUzt1QkFBRSxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUVJLE9BQU87c0JBQTdDLFNBQVM7dUJBQUUsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFZ0IsaUJBQWlCO3NCQUFuRSxTQUFTO3VCQUFFLG1CQUFtQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFQSxhQUFhO3NCQUEzRCxTQUFTO3VCQUFFLGVBQWUsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRUssY0FBYztzQkFBN0QsU0FBUzt1QkFBRSxnQkFBZ0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRUMsV0FBVztzQkFBdkQsU0FBUzt1QkFBRSxhQUFhLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBNSVQgTGljZW5zZVxuXG4gQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5pbXBvcnQge1xuICBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIE9wdGlvbmFsLCBJbmplY3QsIEFmdGVyQ29udGVudEluaXQsXG4gIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX0FTWU5DX1ZBTElEQVRPUlMsIE5HX1ZBTElEQVRPUlMsIE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUbElucHV0IH0gZnJvbSAnLi4vaW5wdXQvaW5wdXQnO1xuaW1wb3J0IHsgRWxlbWVudEJhc2UgfSBmcm9tICcuLi9pbnB1dC9jb3JlL2VsZW1lbnQtYmFzZSc7XG5pbXBvcnQgeyBNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL2Jhc2UvdmFsdWUtYWNjZXNzb3ItcHJvdmlkZXInO1xuaW1wb3J0IHsgQ2xvY2tQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9jbG9ja3BpY2tlci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCgge1xuICBzZWxlY3RvcjogJ3RsLWNsb2NrcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Nsb2NrcGlja2VyLmh0bWwnLFxuICBzdHlsZVVybHM6IFsgJy4vY2xvY2twaWNrZXIuc2NzcycgXSxcbiAgcHJvdmlkZXJzOiBbIE1ha2VQcm92aWRlciggVGxDbG9ja1BpY2tlciApLCBDbG9ja1BpY2tlclNlcnZpY2UgXVxufSApXG5leHBvcnQgY2xhc3MgVGxDbG9ja1BpY2tlciBleHRlbmRzIEVsZW1lbnRCYXNlPHN0cmluZz4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG5cbiAgQElucHV0KCkgbmFtZSA9ICcnO1xuXG4gIEBJbnB1dCgpIGxhYmVsU2l6ZSA9ICcnO1xuXG4gIEBJbnB1dCgpIHRleHRBbGlnbiA9ICdsZWZ0JztcblxuICBASW5wdXQoKSBsYWJlbFBsYWNlbWVudCA9ICdsZWZ0JztcblxuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnQ2xvY2tQaWNrZXIgRmllbGQnO1xuXG4gIEBJbnB1dCgpIGNsZWFyQnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKSBhdXRvQ2xvc2UgPSBmYWxzZTtcblxuICBASW5wdXQoKSBpY29uVGltZXBpY2tlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNob3dCdXR0b25Eb25lID0gdHJ1ZTtcblxuICBASW5wdXQoKSBidXR0b25Eb25lTWVzc2FnZSA9ICdEb25lJztcblxuICBASW5wdXQoKSBjb2xvciA9ICdwcmltYXJ5JztcblxuICBAT3V0cHV0KCkgY2hhbmdlVGltZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCBOZ01vZGVsLCB7c3RhdGljOiB0cnVlfSAgKSBtb2RlbDogTmdNb2RlbDtcblxuICBAVmlld0NoaWxkKCBUbElucHV0LCB7c3RhdGljOiB0cnVlfSAgKSB0bGlucHV0O1xuXG4gIEBWaWV3Q2hpbGQoICd0aW1lUGlja2VyQ29udGVudCcsIHtzdGF0aWM6IHRydWV9ICApIHRpbWVQaWNrZXJDb250ZW50O1xuXG4gIEBWaWV3Q2hpbGQoICd1aUNsb2NrUmFkaXVzJywge3N0YXRpYzogdHJ1ZX0gICkgdWlDbG9ja1JhZGl1cztcblxuICBAVmlld0NoaWxkKCAnd3JhcHBlckRpYWxNaW4nLCB7c3RhdGljOiB0cnVlfSAgKSB3cmFwcGVyRGlhbE1pbjtcblxuICBAVmlld0NoaWxkKCAnd3JhcHBlckRpYWwnLCB7c3RhdGljOiB0cnVlfSAgKSB3cmFwcGVyRGlhbDtcblxuICBwdWJsaWMgaWNvbkFmdGVyID0gJyc7XG5cbiAgcHVibGljIG1vdmluZyA9IGZhbHNlO1xuXG4gIHB1YmxpYyB0aW1lID0geyBob3VyOiAnMDAnLCBtaW51dGU6ICcwMCcgfTtcblxuICBwdWJsaWMgdGltZXBpY2tlclNlcnZpY2U6IENsb2NrUGlja2VyU2VydmljZTtcblxuICBwdWJsaWMgaXNDbG9ja1BpY2tlckFib3ZlOiBib29sZWFuO1xuXG4gIHByaXZhdGUgbGlzdGVuZXJzID0gW107XG5cbiAgcHJpdmF0ZSBjbG9ja01lYXN1cmUgPSB7IG9mZnNldFg6IDAsIG9mZnNldFk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcblxuICBwcml2YXRlIHdyYXBwZXJNZWFzdXJlID0geyBvZmZzZXRYOiAwLCBvZmZzZXRZOiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG5cbiAgcHJpdmF0ZSBib3hDZW50ZXIgPSBbXTtcblxuICBjb25zdHJ1Y3RvciggQE9wdGlvbmFsKCkgQEluamVjdCggTkdfVkFMSURBVE9SUyApIHZhbGlkYXRvcnM6IEFycmF5PGFueT4sXG4gICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KCBOR19BU1lOQ19WQUxJREFUT1JTICkgYXN5bmNWYWxpZGF0b3JzOiBBcnJheTxhbnk+LCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIgKSB7XG4gICAgc3VwZXIoIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycyApO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudGltZXBpY2tlclNlcnZpY2UgPSBuZXcgQ2xvY2tQaWNrZXJTZXJ2aWNlKCB0aGlzLndyYXBwZXJEaWFsLCB0aGlzLndyYXBwZXJEaWFsTWluLCB0aGlzLnJlbmRlcmVyICk7XG4gICAgdGhpcy50aW1lcGlja2VyU2VydmljZS5jcmVhdGVIb3VyRGlhbCgpO1xuICAgIHRoaXMuaGFuZGxlTW9kZWxDaGFuZ2UoKTtcbiAgICB0aGlzLmhhbmRsZUljb25DbG9ja1BpY2tlcigpO1xuICAgIHRoaXMub25DbG9zZUNsb2NrUGlja2VyKCk7XG4gICAgdGhpcy53aW5kb3dNb3VzZU1vdmUoKTtcbiAgICB0aGlzLmxpc3RlbkRvY3VtZW50U2Nyb2xsKCk7XG4gICAgdGhpcy5kb2N1bWVudE1vdXNlRG93bigpO1xuICB9XG5cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zZXRQaWNrZXJNZWFzdXJlcygpO1xuICAgIHRoaXMuaGFuZGxlQ2xvY2tQaWNrZXJQb3NpdGlvbigpO1xuICB9XG5cbiAgaGFuZGxlSWNvbkNsb2NrUGlja2VyKCkge1xuICAgIGlmICggdGhpcy5pY29uVGltZXBpY2tlciApIHtcbiAgICAgIHRoaXMuaWNvbkFmdGVyID0gJ2lvbi1jbG9jayc7XG4gICAgfVxuICB9XG5cbiAgc2V0UGlja2VyTWVhc3VyZXMoKSB7XG4gICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgdGhpcy5zZXRDbG9ja09mZnNldCgpO1xuICAgICAgdGhpcy5zZXRXcmFwcGVyT2Zmc2V0KCk7XG4gICAgICB0aGlzLnNldEJveENlbnRlcigpO1xuICAgIH0sIDEgKTtcbiAgfVxuXG4gIHNldENsb2NrT2Zmc2V0KCkge1xuICAgIHRoaXMuY2xvY2tNZWFzdXJlLm9mZnNldFggPSB0aGlzLnVpQ2xvY2tSYWRpdXMubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0O1xuICAgIHRoaXMuY2xvY2tNZWFzdXJlLm9mZnNldFkgPSB0aGlzLnVpQ2xvY2tSYWRpdXMubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XG4gICAgdGhpcy5jbG9ja01lYXN1cmUud2lkdGggPSB0aGlzLnVpQ2xvY2tSYWRpdXMubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICB0aGlzLmNsb2NrTWVhc3VyZS5oZWlnaHQgPSB0aGlzLnVpQ2xvY2tSYWRpdXMubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gIH1cblxuICBzZXRXcmFwcGVyT2Zmc2V0KCkge1xuICAgIHRoaXMud3JhcHBlck1lYXN1cmUub2Zmc2V0WCA9IHRoaXMudGltZVBpY2tlckNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0O1xuICAgIHRoaXMud3JhcHBlck1lYXN1cmUub2Zmc2V0WSA9IHRoaXMudGltZVBpY2tlckNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XG4gICAgdGhpcy53cmFwcGVyTWVhc3VyZS53aWR0aCA9IHRoaXMudGltZVBpY2tlckNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICB0aGlzLndyYXBwZXJNZWFzdXJlLmhlaWdodCA9IHRoaXMudGltZVBpY2tlckNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gIH1cblxuICBzZXRCb3hDZW50ZXIoKSB7XG4gICAgdGhpcy5ib3hDZW50ZXIgPSBbXG4gICAgICB0aGlzLmNsb2NrTWVhc3VyZS5vZmZzZXRYICsgdGhpcy53cmFwcGVyTWVhc3VyZS5vZmZzZXRYICsgKHRoaXMuY2xvY2tNZWFzdXJlLndpZHRoIC8gMiksXG4gICAgICB0aGlzLmNsb2NrTWVhc3VyZS5vZmZzZXRZICsgdGhpcy53cmFwcGVyTWVhc3VyZS5vZmZzZXRZIC0gKHRoaXMuY2xvY2tNZWFzdXJlLmhlaWdodCAvIDIpXG4gICAgXTtcbiAgfVxuXG4gIGhhbmRsZU1vZGVsQ2hhbmdlKCkge1xuICAgIHRoaXMubW9kZWwudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSggKCB2YWx1ZSApID0+IHtcbiAgICAgIGlmICggdmFsdWUgKSB7XG4gICAgICAgIHRoaXMudGltZXBpY2tlclNlcnZpY2Uuc2V0VGltZUNsb2NrKCB0aGlzLmNsZWFyTWFzayggdGhpcy5tb2RlbC52YWx1ZSApICk7XG4gICAgICB9XG4gICAgfSApO1xuICB9XG5cbiAgbGlzdGVuRG9jdW1lbnRTY3JvbGwoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaCggdGhpcy5yZW5kZXJlci5saXN0ZW4oIGRvY3VtZW50LCAnc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gKSApO1xuICB9XG5cbiAgd2luZG93TW91c2VNb3ZlKCkge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goIHRoaXMucmVuZGVyZXIubGlzdGVuKCBkb2N1bWVudCwgJ21vdXNlbW92ZScsICggJGV2ZW50ICkgPT4ge1xuXG4gICAgICBjb25zdCBwb3NpdGlvblggPSAkZXZlbnQucGFnZVggLSB0aGlzLmJveENlbnRlclsgMCBdO1xuICAgICAgY29uc3QgcG9zaXRpb25ZID0gLSgkZXZlbnQucGFnZVkgLSAoIHRoaXMuYm94Q2VudGVyWyAxIF0gKyB0aGlzLmNsb2NrTWVhc3VyZS5oZWlnaHQpKTtcblxuICAgICAgaWYgKCB0aGlzLm1vdmluZyApIHtcbiAgICAgICAgbGV0IGFuZ2xlID0gTWF0aC5mbG9vciggTWF0aC5hdGFuMiggcG9zaXRpb25YLCBwb3NpdGlvblkgKSAqICgxODAgLyBNYXRoLlBJKSApO1xuICAgICAgICBpZiAoIGFuZ2xlIDwgMCApIHtcbiAgICAgICAgICBhbmdsZSA9IE1hdGguZmxvb3IoIDM2MCArIGFuZ2xlICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lcGlja2VyU2VydmljZS5zZXRBbmdsZUxpbmVIb3VyKCBhbmdsZSAtIChhbmdsZSAlIHRoaXMudGltZXBpY2tlclNlcnZpY2UuZ2V0RGl2aXNvckFuZ2xlKCkpICk7XG4gICAgICAgIHRoaXMudGltZXBpY2tlclNlcnZpY2UuZ2V0VGltZUJ5QW5nbGUoIGFuZ2xlICk7XG4gICAgICB9XG4gICAgfSApICk7XG4gIH1cblxuICBkb2N1bWVudE1vdXNlRG93bigpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbiggZG9jdW1lbnQsICdtb3VzZWRvd24nLCAoICRldmVudCApID0+IHtcbiAgICAgIHRoaXMuaXNFbGVtZW50SW5QYXRoKCAkZXZlbnQgKTtcbiAgICB9ICk7XG4gIH1cblxuICBpc0VsZW1lbnRJblBhdGgoICRldmVudCApIHtcbiAgICBpZiAoICRldmVudC5wYXRoLmluZGV4T2YoIHRoaXMudGltZVBpY2tlckNvbnRlbnQubmF0aXZlRWxlbWVudCApIDwgMCApIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBzZXRJbnB1dFZhbHVlKCB2YWx1ZSApIHtcbiAgICB0aGlzLnRsaW5wdXQuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlLmhvdXIgKyAnOicgKyB2YWx1ZS5taW51dGU7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLnRpbWVwaWNrZXJTZXJ2aWNlLmNsb3NlQ2xvY2tQaWNrZXIoKTtcbiAgfVxuXG4gIG9wZW5lZCgpIHtcbiAgICByZXR1cm4gdGhpcy50aW1lcGlja2VyU2VydmljZS5nZXRPcGVuZWQoKTtcbiAgfVxuXG4gIGNoYW5nZUhvdXIoKSB7XG4gICAgdGhpcy50aW1lcGlja2VyU2VydmljZS5jcmVhdGVIb3VyRGlhbCgpO1xuICB9XG5cbiAgY2hhbmdlTWludXRlKCkge1xuICAgIHRoaXMudGltZXBpY2tlclNlcnZpY2UuY3JlYXRlTWludXRlRGlhbCgpO1xuICB9XG5cbiAgb25DbG9zZUNsb2NrUGlja2VyKCkge1xuICAgIHRoaXMudGltZXBpY2tlclNlcnZpY2UuY2hhbmdlLnN1YnNjcmliZSggKCB2YWx1ZSApID0+IHtcbiAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSggdmFsdWUgKTtcbiAgICAgIHRoaXMuY2hhbmdlVGltZS5lbWl0KCB2YWx1ZSApO1xuICAgIH0gKTtcbiAgfVxuXG4gIG9uS2V5VXAoICRldmVudCApIHtcbiAgICBjb25zdCByZXBsYWNlZCA9IHRoaXMuY2xlYXJNYXNrKCAkZXZlbnQudGFyZ2V0LnZhbHVlICk7XG4gICAgaWYgKCByZXBsYWNlZC5sZW5ndGggPD0gMiApIHtcbiAgICAgIHRoaXMudGltZXBpY2tlclNlcnZpY2Uuc2V0VGltZUNsb2NrKCByZXBsYWNlZCApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVwaWNrZXJTZXJ2aWNlLnNldFRpbWVDbG9jayggcmVwbGFjZWQgKTtcbiAgICB9XG4gIH1cblxuICBjbGVhck1hc2soIHZhbHVlICkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCAvW15cXGRdKy9nLCAnJyApO1xuICB9XG5cbiAgb3BlbigpIHtcbiAgICB0aGlzLnRpbWVwaWNrZXJTZXJ2aWNlLm9wZW5DbG9ja1BpY2tlcigpO1xuICAgIHRoaXMuaGFuZGxlQ2xvY2tQaWNrZXJQb3NpdGlvbigpO1xuICAgIHRoaXMuc2V0UGlja2VyTWVhc3VyZXMoKTtcbiAgfVxuXG4gIG9uTW91c2VEb3duKCkge1xuICAgIHRoaXMubW92aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIG9uTW91c2VVcCgpIHtcbiAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgIGlmICggdGhpcy5pc0hvdXJEaWFsKCkgKSB7XG4gICAgICBzZXRUaW1lb3V0KCAoKSA9PiB0aGlzLnRpbWVwaWNrZXJTZXJ2aWNlLmNyZWF0ZU1pbnV0ZURpYWwoKSApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIHRoaXMuYXV0b0Nsb3NlICkge1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJTZXJ2aWNlLmNsb3NlQ2xvY2tQaWNrZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVDbG9ja1BpY2tlclBvc2l0aW9uKCkge1xuICAgIGNvbnN0IHRpbWVQaWNrZXJIZWlnaHQgPSB0aGlzLnNob3dCdXR0b25Eb25lID8gMzI1IDogMzAwO1xuICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gKHRoaXMudGxpbnB1dC5pbnB1dC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCApICsgdGltZVBpY2tlckhlaWdodDtcbiAgICBpZiAoICh3aW5kb3cuaW5uZXJIZWlnaHQgLSB0b3RhbEhlaWdodCkgPCAwICkge1xuICAgICAgdGhpcy5zZXRUb3BQb3NpdGlvblRvcCgpO1xuICAgICAgdGhpcy5zZXRMZWZ0UG9zaXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRXcmFwcGVyQ2xvY2tQaWNrZXJQb3NpdGlvbkJvdHRvbSgpO1xuICB9XG5cbiAgc2V0VG9wUG9zaXRpb25Ub3AoKSB7XG4gICAgdGhpcy5pc0Nsb2NrUGlja2VyQWJvdmUgPSB0cnVlO1xuICAgIGNvbnN0IHRpbWVQaWNrZXJIZWlnaHQgPSB0aGlzLnNob3dCdXR0b25Eb25lID8gMzI1IDogMzAwO1xuICAgIHRoaXMudGltZVBpY2tlckNvbnRlbnQubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPVxuICAgICAgKCB0aGlzLnRsaW5wdXQuaW5wdXQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLnRsaW5wdXQuaW5wdXQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKVxuICAgICAgLSB0aW1lUGlja2VySGVpZ2h0ICsgJ3B4JztcbiAgfVxuXG4gIHNldFdyYXBwZXJDbG9ja1BpY2tlclBvc2l0aW9uQm90dG9tKCkge1xuICAgIHRoaXMuc2V0VG9wUG9zaXRpb25Cb3R0b20oKTtcbiAgICB0aGlzLnNldExlZnRQb3NpdGlvbigpO1xuICB9XG5cbiAgc2V0VG9wUG9zaXRpb25Cb3R0b20oKSB7XG4gICAgdGhpcy5pc0Nsb2NrUGlja2VyQWJvdmUgPSBmYWxzZTtcbiAgICB0aGlzLnRpbWVQaWNrZXJDb250ZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID1cbiAgICAgICggdGhpcy50bGlucHV0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy50bGlucHV0LmlucHV0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICkgKyAncHgnO1xuICB9XG5cbiAgc2V0TGVmdFBvc2l0aW9uKCkge1xuICAgIHRoaXMudGltZVBpY2tlckNvbnRlbnQubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy50bGlucHV0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArICdweCc7XG4gIH1cblxuXG4gIGlzSG91ckRpYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudGltZXBpY2tlclNlcnZpY2UudHlwZSA9PT0gJ2hvdXInO1xuICB9XG5cbiAgb25DbGVhcklucHV0KCAkZXZlbnQgKSB7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCggKCB2YWx1ZSApID0+IHZhbHVlKCkgKTtcbiAgfVxuXG5cbn1cblxuIiwiPGRpdiBbY2xhc3NdPVwiJ3RsLWNsb2NrcGlja2VyICcgKyBjb2xvclwiPlxuICA8dGwtaW5wdXQgI2lucHV0XG4gICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgICAgW2xhYmVsU2l6ZV09XCJsYWJlbFNpemVcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAoY2xlYXIpPVwib25DbGVhcklucHV0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZm9jdXMpPVwib3BlbigpXCJcbiAgICAgICAgICAgIFtpY29uQWZ0ZXJdPVwiaWNvbkFmdGVyXCJcbiAgICAgICAgICAgIFt0ZXh0QWxpZ25dPVwidGV4dEFsaWduXCJcbiAgICAgICAgICAgIFttYXNrXT1cIicwMDowMCdcIlxuICAgICAgICAgICAgW2xhYmVsUGxhY2VtZW50X