UNPKG

fundamental-ngx

Version:

SAP Fundamentals, implemented in Angular

373 lines 25.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectorRef, Component, forwardRef, HostBinding, Input, ViewChild, ViewEncapsulation } from '@angular/core'; import { TimeObject } from '../time/time-object'; import { TimeComponent } from '../time/time.component'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { TimeFormatParser } from './format/time-parser'; export class TimePickerComponent { /** * @hidden * @param {?} cd * @param {?} timeAdapter */ constructor(cd, timeAdapter) { this.cd = cd; this.timeAdapter = timeAdapter; /** * @hidden */ this.timepickerclass = true; /** * \@Input An object that contains three integer properties: 'hour' (ranging from 0 to 23), * 'minute' (ranging from 0 to 59), and 'second' (ranging from 0 to 59). This is the model the component consumes. Example: * * ```json * { hour: 12, minute: 0, second: 0 } * ``` */ this.time = { hour: 0, minute: 0, second: 0 }; /** * \@Input Uses compact time picker. */ this.compact = false; /** * \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23) * and does not display a period control. */ this.meridian = false; /** * \@Input When set to false, hides the buttons that increment and decrement the corresponding input. */ this.spinners = true; /** * \@Input When set to false, hides the input for seconds. */ this.displaySeconds = true; /** * Whether to perform visual validation on the picker input. */ this.validate = true; /** * Aria label for the time picker input. */ this.timePickerInputLabel = 'Time picker input'; /** * Whether a null input is considered valid. */ this.allowNull = true; /** * @hidden Whether the input time is valid. Internal use. */ this.isInvalidTimeInput = false; /** * @hidden */ this.onChange = (/** * @return {?} */ () => { }); /** * @hidden */ this.onTouched = (/** * @return {?} */ () => { }); } /** * @hidden * @return {?} */ ngOnInit() { this.placeholder = this.getPlaceholder(); } /** * Returns the current value of the time input. * @return {?} */ getTime() { return this.time; } /** * @hidden * @return {?} */ getFormattedTime() { /** @type {?} */ const formattedTime = this.timeAdapter.format(this.time, this.meridian); return formattedTime !== undefined ? formattedTime : ''; } /** * @hidden * @param {?} timeFromInput * @return {?} */ timeInputChanged(timeFromInput) { /** @type {?} */ const time = this.timeAdapter.parse(timeFromInput, this.displaySeconds, this.meridian); if (time) { this.isInvalidTimeInput = false; this.child.setDisplayedHour(); this.time = Object.assign(this.time, time); this.onChange(time); } else { if (this.allowNull && timeFromInput === '') { this.isInvalidTimeInput = false; this.child.setDisplayedHour(); this.onChange({ hour: null, minutes: null, seconds: null }); } else { this.isInvalidTimeInput = true; } } } /** * @hidden * @param {?} $event * @return {?} */ inputGroupClicked($event) { if (!this.isOpen && !this.disabled) { $event.stopPropagation(); this.isOpen = true; } } /** * @hidden * @return {?} */ onFocusHandler() { if (!this.isOpen) { this.isOpen = true; } } /** * @hidden * @return {?} */ addOnButtonClicked() { if (!this.disabled) { this.isOpen = !this.isOpen; } } /** * @hidden * @return {?} */ popoverClosed() { this.isOpen = false; } /** * @hidden * @return {?} */ getPlaceholder() { /** @type {?} */ let retVal; if (this.displaySeconds) { if (this.meridian) { retVal = 'hh' + ':' + 'mm' + ':' + 'ss am/pm'; } else { retVal = 'hh' + ':' + 'mm' + ':' + 'ss'; } } else { if (this.meridian) { retVal = 'hh' + ':' + 'mm' + ' am/pm'; } else { retVal = 'hh' + ':' + 'mm'; } } return retVal; } /** * @hidden * @return {?} */ timeFromTimeComponentChanged() { this.cd.detectChanges(); this.onChange(this.time); } /** * @hidden * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @hidden * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @hidden * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * @hidden * @param {?} time * @return {?} */ writeValue(time) { if (!time) { return; } this.time = time; } } TimePickerComponent.decorators = [ { type: Component, args: [{ selector: 'fd-time-picker', template: "<fd-popover [(isOpen)]=\"isOpen\"\n [triggers]=\"[]\">\n <fd-popover-control>\n <!--fd-input-group *ngIf=\"!meridian\" (timeInputChanged)=\"timeInputChanged($event)\" [type]=\"'time'\"\n [placement]=\"'after'\" [button]=\"true\" (click)=\"inputGroupClicked($event)\" [glyph]=\"'fob-watch'\"\n [placeholder]=\"getPlaceholder()\" [inputText]=\"getFormattedTime()\" [disabled]=\"disabled\"\n (addOnButtonClicked)=\"addOnButtonClicked($event)\"></fd-input-group>\n <fd-input-group *ngIf=\"meridian\" (timeInputChanged)=\"timeInputChanged($event)\" [type]=\"'time'\"\n [placement]=\"'after'\" [button]=\"true\" (click)=\"inputGroupClicked($event)\" [glyph]=\"'fob-watch'\"\n [placeholder]=\"getPlaceholder()\" [inputText]=\"getFormattedTime()\" [disabled]=\"disabled\"\n (addOnButtonClicked)=\"addOnButtonClicked($event)\"></fd-input-group-->\n <div class=\"fd-input-group fd-input-group--after\"\n [ngClass]=\"{'fd-input-group--compact' : compact}\">\n <input [value]=\"getFormattedTime()\"\n (keyup)=\"timeInputChanged($event.currentTarget.value)\"\n (focus)=\"onFocusHandler()\"\n (click)=\"inputGroupClicked($event)\"\n [disabled]=\"disabled\"\n type=\"text\"\n [ngClass]=\"{ 'fd-input--compact': compact, 'is-invalid': isInvalidTimeInput && validate }\"\n [placeholder]=\"placeholder\"\n [attr.aria-label]=\"timePickerInputLabel\">\n <span class=\"fd-input-group__addon fd-input-group__addon--button fd-input-group__addon--after\">\n <button [disabled]=\"disabled\" type=\"button\"\n [ngClass]=\"{ 'fd-button--compact' : compact }\" (click)=\"addOnButtonClicked()\"\n class=\"fd-button--icon fd-button--light sap-icon--fob-watch\"></button>\n </span>\n </div>\n </fd-popover-control>\n <fd-popover-body>\n <fd-time [disabled]=\"disabled\"\n [meridian]=\"meridian\"\n [(ngModel)]=\"time\"\n (ngModelChange)=\"timeFromTimeComponentChanged()\"\n [spinners]=\"spinners\"\n [displaySeconds]=\"displaySeconds\"></fd-time>\n </fd-popover-body>\n</fd-popover>\n", host: { '(blur)': 'onTouched()', class: 'fd-timepicker-custom' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => TimePickerComponent)), multi: true } ], encapsulation: ViewEncapsulation.None, styles: [".fd-timepicker-custom{display:inline-block}.fd-timepicker-custom fd-popover{display:block}.fd-timepicker-custom fd-time{width:auto}"] }] } ]; /** @nocollapse */ TimePickerComponent.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: TimeFormatParser } ]; TimePickerComponent.propDecorators = { timepickerclass: [{ type: HostBinding, args: ['class.fd-time-picker',] }], time: [{ type: Input }], compact: [{ type: Input }], meridian: [{ type: Input }], disabled: [{ type: Input }], spinners: [{ type: Input }], displaySeconds: [{ type: Input }], validate: [{ type: Input }], timePickerInputLabel: [{ type: Input }], allowNull: [{ type: Input }], child: [{ type: ViewChild, args: [TimeComponent,] }] }; if (false) { /** * @hidden * @type {?} */ TimePickerComponent.prototype.timepickerclass; /** * \@Input An object that contains three integer properties: 'hour' (ranging from 0 to 23), * 'minute' (ranging from 0 to 59), and 'second' (ranging from 0 to 59). This is the model the component consumes. Example: * * ```json * { hour: 12, minute: 0, second: 0 } * ``` * @type {?} */ TimePickerComponent.prototype.time; /** * \@Input Uses compact time picker. * @type {?} */ TimePickerComponent.prototype.compact; /** * \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23) * and does not display a period control. * @type {?} */ TimePickerComponent.prototype.meridian; /** * \@Input Disables the component. * @type {?} */ TimePickerComponent.prototype.disabled; /** * \@Input When set to false, hides the buttons that increment and decrement the corresponding input. * @type {?} */ TimePickerComponent.prototype.spinners; /** * \@Input When set to false, hides the input for seconds. * @type {?} */ TimePickerComponent.prototype.displaySeconds; /** * Whether to perform visual validation on the picker input. * @type {?} */ TimePickerComponent.prototype.validate; /** * Aria label for the time picker input. * @type {?} */ TimePickerComponent.prototype.timePickerInputLabel; /** * Whether a null input is considered valid. * @type {?} */ TimePickerComponent.prototype.allowNull; /** * @hidden Whether the input time is valid. Internal use. * @type {?} */ TimePickerComponent.prototype.isInvalidTimeInput; /** * @hidden * @type {?} */ TimePickerComponent.prototype.child; /** * @hidden * @type {?} */ TimePickerComponent.prototype.period; /** * @hidden * @type {?} */ TimePickerComponent.prototype.isOpen; /** * @hidden * @type {?} */ TimePickerComponent.prototype.placeholder; /** * @hidden * @type {?} */ TimePickerComponent.prototype.onChange; /** * @hidden * @type {?} */ TimePickerComponent.prototype.onTouched; /** * @type {?} * @private */ TimePickerComponent.prototype.cd; /** @type {?} */ TimePickerComponent.prototype.timeAdapter; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZnVuZGFtZW50YWwtbmd4LyIsInNvdXJjZXMiOlsibGliL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFtQnhELE1BQU0sT0FBTyxtQkFBbUI7Ozs7OztJQXlMNUIsWUFBb0IsRUFBcUIsRUFDdEIsV0FBNkI7UUFENUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWtCOzs7O1FBdExoRCxvQkFBZSxHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7O1FBV3ZCLFNBQUksR0FBZSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Ozs7UUFJckQsWUFBTyxHQUFZLEtBQUssQ0FBQzs7Ozs7UUFLekIsYUFBUSxHQUFZLEtBQUssQ0FBQzs7OztRQVExQixhQUFRLEdBQVksSUFBSSxDQUFDOzs7O1FBSXpCLG1CQUFjLEdBQVksSUFBSSxDQUFDOzs7O1FBSS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7Ozs7UUFJekIseUJBQW9CLEdBQVcsbUJBQW1CLENBQUM7Ozs7UUFJbkQsY0FBUyxHQUFZLElBQUksQ0FBQzs7OztR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QUNkO2lCQUNKO2dCQUVELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUN4Qzs7OztZQXRCUSxpQkFBaUI7WUFJakIsZ0JBQWdCOzs7OEJBc0JwQixXQUFXLFNBQUMsc0JBQXNCO21CQVdsQyxLQUFLO3NCQUlMLEtBQUs7dUJBS0wsS0FBSzt1QkFJTCxLQUFLO3VCQUlMLEtBQUs7NkJBSUwsS0FBSzt1QkFJTCxLQUFLO21DQUlMLEtBQUs7d0JBSUwsS0FBSztvQkFPTCxTQUFTLFNBQUMsYUFBYTs7Ozs7OztJQW5EeEIsOENBQ3VCOzs7Ozs7Ozs7O0lBVXZCLG1DQUNxRDs7Ozs7SUFHckQsc0NBQ3lCOzs7Ozs7SUFJekIsdUNBQzBCOzs7OztJQUcxQix1Q0FDa0I7Ozs7O0lBR2xCLHVDQUN5Qjs7Ozs7SUFHekIsNkNBQytCOzs7OztJQUcvQix1Q0FDeUI7Ozs7O0lBR3pCLG1EQUNtRDs7Ozs7SUFHbkQsd0NBQzBCOzs7OztJQUcxQixpREFBb0M7Ozs7O0lBR3BDLG9DQUNxQjs7Ozs7SUFHckIscUNBQWU7Ozs7O0lBR2YscUNBQWdCOzs7OztJQUdoQiwwQ0FBb0I7Ozs7O0lBR3BCLHVDQUE4Qjs7Ozs7SUFFOUIsd0NBQStCOzs7OztJQW9IbkIsaUNBQTZCOztJQUM3QiwwQ0FBb0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGltZU9iamVjdCB9IGZyb20gJy4uL3RpbWUvdGltZS1vYmplY3QnO1xuaW1wb3J0IHsgVGltZUNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUvdGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVGltZUZvcm1hdFBhcnNlciB9IGZyb20gJy4vZm9ybWF0L3RpbWUtcGFyc2VyJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC10aW1lLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBob3N0OiB7XG4gICAgICAgICcoYmx1ciknOiAnb25Ub3VjaGVkKCknLFxuICAgICAgICBjbGFzczogJ2ZkLXRpbWVwaWNrZXItY3VzdG9tJ1xuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGltZVBpY2tlckNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXSxcbiAgICBzdHlsZVVybHM6IFsnLi90aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgVGltZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQge1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZkLXRpbWUtcGlja2VyJylcbiAgICB0aW1lcGlja2VyY2xhc3MgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQElucHV0IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRocmVlIGludGVnZXIgcHJvcGVydGllczogJ2hvdXInIChyYW5naW5nIGZyb20gMCB0byAyMyksXG4gICAgICogJ21pbnV0ZScgKHJhbmdpbmcgZnJvbSAwIHRvIDU5KSwgYW5kICdzZWNvbmQnIChyYW5naW5nIGZyb20gMCB0byA1OSkuIFRoaXMgaXMgdGhlIG1vZGVsIHRoZSBjb21wb25lbnQgY29uc3VtZXMuIEV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGBqc29uXG4gICAgICogeyBob3VyOiAxMiwgbWludXRlOiAwLCBzZWNvbmQ6IDAgfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGltZTogVGltZU9iamVjdCA9IHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAgfTtcblxuICAgIC8qKiBASW5wdXQgVXNlcyBjb21wYWN0IHRpbWUgcGlja2VyLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29tcGFjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEBJbnB1dCBXaGVuIHNldCB0byB0cnVlLCB1c2VzIHRoZSAyNCBob3VyIGNsb2NrIChob3VycyByYW5naW5nIGZyb20gMCB0byAyMylcbiAgICAgKiBhbmQgZG9lcyBub3QgZGlzcGxheSBhIHBlcmlvZCBjb250cm9sLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWVyaWRpYW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBASW5wdXQgRGlzYWJsZXMgdGhlIGNvbXBvbmVudC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkOiBib29sZWFuO1xuXG4gICAgLyoqIEBJbnB1dCBXaGVuIHNldCB0byBmYWxzZSwgaGlkZXMgdGhlIGJ1dHRvbnMgdGhhdCBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCB0aGUgY29ycmVzcG9uZGluZyBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNwaW5uZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBASW5wdXQgV2hlbiBzZXQgdG8gZmFsc2UsIGhpZGVzIHRoZSBpbnB1dCBmb3Igc2Vjb25kcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlTZWNvbmRzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRvIHBlcmZvcm0gdmlzdWFsIHZhbGlkYXRpb24gb24gdGhlIHBpY2tlciBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbGlkYXRlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgdGltZSBwaWNrZXIgaW5wdXQuICovXG4gICAgQElucHV0KClcbiAgICB0aW1lUGlja2VySW5wdXRMYWJlbDogc3RyaW5nID0gJ1RpbWUgcGlja2VyIGlucHV0JztcblxuICAgIC8qKiBXaGV0aGVyIGEgbnVsbCBpbnB1dCBpcyBjb25zaWRlcmVkIHZhbGlkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWxsb3dOdWxsOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBAaGlkZGVuIFdoZXRoZXIgdGhlIGlucHV0IHRpbWUgaXMgdmFsaWQuIEludGVybmFsIHVzZS4gKi9cbiAgICBpc0ludmFsaWRUaW1lSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChUaW1lQ29tcG9uZW50KVxuICAgIGNoaWxkOiBUaW1lQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwZXJpb2Q6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaXNPcGVuOiBib29sZWFuO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkNoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7fTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdGltZSBpbnB1dC5cbiAgICAgKi9cbiAgICBnZXRUaW1lKCk6IFRpbWVPYmplY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0Rm9ybWF0dGVkVGltZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRUaW1lID0gdGhpcy50aW1lQWRhcHRlci5mb3JtYXQodGhpcy50aW1lLCB0aGlzLm1lcmlkaWFuKTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFRpbWUgIT09IHVuZGVmaW5lZCA/IGZvcm1hdHRlZFRpbWUgOiAnJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHRpbWVJbnB1dENoYW5nZWQodGltZUZyb21JbnB1dCkge1xuICAgICAgICBjb25zdCB0aW1lID0gdGhpcy50aW1lQWRhcHRlci5wYXJzZSh0aW1lRnJvbUlucHV0LCB0aGlzLmRpc3BsYXlTZWNvbmRzLCB0aGlzLm1lcmlkaWFuKTtcbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNJbnZhbGlkVGltZUlucHV0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNoaWxkLnNldERpc3BsYXllZEhvdXIoKTtcbiAgICAgICAgICAgIHRoaXMudGltZSA9IE9iamVjdC5hc3NpZ24odGhpcy50aW1lLCB0aW1lKTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd051bGwgJiYgdGltZUZyb21JbnB1dCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzSW52YWxpZFRpbWVJbnB1dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGQuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2Uoe2hvdXI6IG51bGwsIG1pbnV0ZXM6IG51bGwsIHNlY29uZHM6IG51bGx9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0ludmFsaWRUaW1lSW5wdXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpbnB1dEdyb3VwQ2xpY2tlZCgkZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbiAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkZvY3VzSGFuZGxlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBhZGRPbkJ1dHRvbkNsaWNrZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHBvcG92ZXJDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXRQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsO1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5U2Vjb25kcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSAnaGgnICsgJzonICsgJ21tJyArICc6JyArICdzcyBhbS9wbSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9ICdoaCcgKyAnOicgKyAnbW0nICsgJzonICsgJ3NzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lcmlkaWFuKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gJ2hoJyArICc6JyArICdtbScgKyAnIGFtL3BtJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gJ2hoJyArICc6JyArICdtbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgdGltZUZyb21UaW1lQ29tcG9uZW50Q2hhbmdlZCgpIHtcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh0aW1lOiBUaW1lT2JqZWN0KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHdyaXRlVmFsdWUodGltZTogVGltZU9iamVjdCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHVibGljIHRpbWVBZGFwdGVyOiBUaW1lRm9ybWF0UGFyc2VyKSB7fVxufVxuIl19