igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
500 lines • 33.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* This file contains all the directives used by the @link IgxTimePickerComponent.
* You should generally not use them directly.
* @preferred
*/
import { Directive, ElementRef, HostBinding, HostListener, Inject, Input, TemplateRef } from '@angular/core';
import { IGX_TIME_PICKER_COMPONENT } from './time-picker.common';
import { InteractionMode } from '../core/enums';
/**
* @hidden
*/
export class IgxItemListDirective {
/**
* @param {?} timePicker
* @param {?} elementRef
*/
constructor(timePicker, elementRef) {
this.timePicker = timePicker;
this.elementRef = elementRef;
this.tabindex = 0;
}
/**
* @return {?}
*/
get defaultCSS() {
return true;
}
/**
* @return {?}
*/
get hourCSS() {
return this.type === 'hourList';
}
/**
* @return {?}
*/
get minuteCSS() {
return this.type === 'minuteList';
}
/**
* @return {?}
*/
get ampmCSS() {
return this.type === 'ampmList';
}
/**
* @return {?}
*/
onFocus() {
this.isActive = true;
}
/**
* @return {?}
*/
onBlur() {
this.isActive = false;
}
/**
* @private
* @return {?}
*/
nextItem() {
switch (this.type) {
case 'hourList': {
this.timePicker.nextHour();
break;
}
case 'minuteList': {
this.timePicker.nextMinute();
break;
}
case 'ampmList': {
this.timePicker.nextAmPm();
break;
}
}
}
/**
* @private
* @return {?}
*/
prevItem() {
switch (this.type) {
case 'hourList': {
this.timePicker.prevHour();
break;
}
case 'minuteList': {
this.timePicker.prevMinute();
break;
}
case 'ampmList': {
this.timePicker.prevAmPm();
break;
}
}
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onKeydownArrowDown(event) {
event.preventDefault();
this.nextItem();
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onKeydownArrowUp(event) {
event.preventDefault();
this.prevItem();
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onKeydownArrowRight(event) {
event.preventDefault();
/** @type {?} */
const listName = ((/** @type {?} */ (event.target))).className;
if (listName.indexOf('hourList') !== -1) {
this.timePicker.minuteList.nativeElement.focus();
}
else if (listName.indexOf('minuteList') !== -1 && this.timePicker._ampmItems.length !== 0) {
this.timePicker.ampmList.nativeElement.focus();
}
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onKeydownArrowLeft(event) {
event.preventDefault();
/** @type {?} */
const listName = ((/** @type {?} */ (event.target))).className;
if (listName.indexOf('minuteList') !== -1) {
this.timePicker.hourList.nativeElement.focus();
}
else if (listName.indexOf('ampmList') !== -1) {
this.timePicker.minuteList.nativeElement.focus();
}
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onKeydownEnter(event) {
event.preventDefault();
if (this.timePicker.mode === InteractionMode.DropDown) {
this.timePicker.hideOverlay();
return;
}
this.timePicker.okButtonClick();
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onKeydownEscape(event) {
event.preventDefault();
this.timePicker.cancelButtonClick();
}
/**
* @hidden
* @return {?}
*/
onHover() {
this.elementRef.nativeElement.focus();
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onScroll(event) {
event.preventDefault();
event.stopPropagation();
if (event.deltaY > 0) {
this.nextItem();
}
else if (event.deltaY < 0) {
this.prevItem();
}
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onPanMove(event) {
if (event.deltaY < 0) {
this.nextItem();
}
else if (event.deltaY > 0) {
this.prevItem();
}
}
}
IgxItemListDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxItemList]'
},] }
];
/** @nocollapse */
IgxItemListDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: ElementRef }
];
IgxItemListDirective.propDecorators = {
type: [{ type: Input, args: ['igxItemList',] }],
tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }],
defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__column',] }],
hourCSS: [{ type: HostBinding, args: ['class.igx-time-picker__hourList',] }],
minuteCSS: [{ type: HostBinding, args: ['class.igx-time-picker__minuteList',] }],
ampmCSS: [{ type: HostBinding, args: ['class.igx-time-picker__ampmList',] }],
onFocus: [{ type: HostListener, args: ['focus',] }],
onBlur: [{ type: HostListener, args: ['blur',] }],
onKeydownArrowDown: [{ type: HostListener, args: ['keydown.arrowdown', ['$event'],] }],
onKeydownArrowUp: [{ type: HostListener, args: ['keydown.arrowup', ['$event'],] }],
onKeydownArrowRight: [{ type: HostListener, args: ['keydown.arrowright', ['$event'],] }],
onKeydownArrowLeft: [{ type: HostListener, args: ['keydown.arrowleft', ['$event'],] }],
onKeydownEnter: [{ type: HostListener, args: ['keydown.enter', ['$event'],] }],
onKeydownEscape: [{ type: HostListener, args: ['keydown.escape', ['$event'],] }],
onHover: [{ type: HostListener, args: ['mouseover',] }],
onScroll: [{ type: HostListener, args: ['wheel', ['$event'],] }],
onPanMove: [{ type: HostListener, args: ['panmove', ['$event'],] }]
};
if (false) {
/** @type {?} */
IgxItemListDirective.prototype.type;
/** @type {?} */
IgxItemListDirective.prototype.isActive;
/** @type {?} */
IgxItemListDirective.prototype.tabindex;
/** @type {?} */
IgxItemListDirective.prototype.timePicker;
/**
* @type {?}
* @private
*/
IgxItemListDirective.prototype.elementRef;
}
/**
* @hidden
*/
export class IgxHourItemDirective {
/**
* @param {?} timePicker
* @param {?} itemList
*/
constructor(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
/**
* @return {?}
*/
get defaultCSS() {
return true;
}
/**
* @return {?}
*/
get selectedCSS() {
return this.isSelectedHour;
}
/**
* @return {?}
*/
get activeCSS() {
return this.isSelectedHour && this.itemList.isActive;
}
/**
* @return {?}
*/
get isSelectedHour() {
return this.timePicker.selectedHour === this.value;
}
/**
* @param {?} item
* @return {?}
*/
onClick(item) {
if (item !== '') {
this.timePicker.scrollHourIntoView(item);
}
}
}
IgxHourItemDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxHourItem]'
},] }
];
/** @nocollapse */
IgxHourItemDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
];
IgxHourItemDirective.propDecorators = {
value: [{ type: Input, args: ['igxHourItem',] }],
defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }],
selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }],
activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }],
onClick: [{ type: HostListener, args: ['click', ['value'],] }]
};
if (false) {
/** @type {?} */
IgxHourItemDirective.prototype.value;
/** @type {?} */
IgxHourItemDirective.prototype.timePicker;
/**
* @type {?}
* @private
*/
IgxHourItemDirective.prototype.itemList;
}
/**
* @hidden
*/
export class IgxMinuteItemDirective {
/**
* @param {?} timePicker
* @param {?} itemList
*/
constructor(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
/**
* @return {?}
*/
get defaultCSS() {
return true;
}
/**
* @return {?}
*/
get selectedCSS() {
return this.isSelectedMinute;
}
/**
* @return {?}
*/
get activeCSS() {
return this.isSelectedMinute && this.itemList.isActive;
}
/**
* @return {?}
*/
get isSelectedMinute() {
return this.timePicker.selectedMinute === this.value;
}
/**
* @param {?} item
* @return {?}
*/
onClick(item) {
if (item !== '') {
this.timePicker.scrollMinuteIntoView(item);
}
}
}
IgxMinuteItemDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxMinuteItem]'
},] }
];
/** @nocollapse */
IgxMinuteItemDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
];
IgxMinuteItemDirective.propDecorators = {
value: [{ type: Input, args: ['igxMinuteItem',] }],
defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }],
selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }],
activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }],
onClick: [{ type: HostListener, args: ['click', ['value'],] }]
};
if (false) {
/** @type {?} */
IgxMinuteItemDirective.prototype.value;
/** @type {?} */
IgxMinuteItemDirective.prototype.timePicker;
/**
* @type {?}
* @private
*/
IgxMinuteItemDirective.prototype.itemList;
}
/**
* @hidden
*/
export class IgxAmPmItemDirective {
/**
* @param {?} timePicker
* @param {?} itemList
*/
constructor(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
/**
* @return {?}
*/
get defaultCSS() {
return true;
}
/**
* @return {?}
*/
get selectedCSS() {
return this.isSelectedAmPm;
}
/**
* @return {?}
*/
get activeCSS() {
return this.isSelectedAmPm && this.itemList.isActive;
}
/**
* @return {?}
*/
get isSelectedAmPm() {
return this.timePicker.selectedAmPm === this.value;
}
/**
* @param {?} item
* @return {?}
*/
onClick(item) {
if (item !== '') {
this.timePicker.scrollAmPmIntoView(item);
}
}
}
IgxAmPmItemDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxAmPmItem]'
},] }
];
/** @nocollapse */
IgxAmPmItemDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
];
IgxAmPmItemDirective.propDecorators = {
value: [{ type: Input, args: ['igxAmPmItem',] }],
defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }],
selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }],
activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }],
onClick: [{ type: HostListener, args: ['click', ['value'],] }]
};
if (false) {
/** @type {?} */
IgxAmPmItemDirective.prototype.value;
/** @type {?} */
IgxAmPmItemDirective.prototype.timePicker;
/**
* @type {?}
* @private
*/
IgxAmPmItemDirective.prototype.itemList;
}
/**
* This directive should be used to mark which ng-template will be used from IgxTimePicker when re-templating its input group.
*/
export class IgxTimePickerTemplateDirective {
/**
* @param {?} template
*/
constructor(template) {
this.template = template;
}
}
IgxTimePickerTemplateDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxTimePickerTemplate]'
},] }
];
/** @nocollapse */
IgxTimePickerTemplateDirective.ctorParameters = () => [
{ type: TemplateRef }
];
if (false) {
/** @type {?} */
IgxTimePickerTemplateDirective.prototype.template;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuZGlyZWN0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGltZS1waWNrZXIvdGltZS1waWNrZXIuZGlyZWN0aXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFLQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx5QkFBeUIsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBTWhELE1BQU0sT0FBTyxvQkFBb0I7Ozs7O0lBTzdCLFlBQ08sVUFBNkIsRUFDeEIsVUFBc0I7UUFEM0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUczQixhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBSGtCLENBQUM7Ozs7SUFLdkMsSUFDSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQzs7OztJQUVELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVELElBQ0ksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7SUFDdEMsQ0FBQzs7OztJQUVELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7SUFDcEMsQ0FBQzs7OztJQUdNLE9BQU87UUFDVixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDOzs7O0lBR00sTUFBTTtRQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7Ozs7O0lBRU8sUUFBUTtR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QUM1Qjs7Ozs0Q0F5QmdCLE1BQU0sU0FBQyx5QkFBeUI7WUFFdkIsb0JBQW9COzs7b0JBeEJ6QyxLQUFLLFNBQUMsYUFBYTt5QkFHbkIsV0FBVyxTQUFDLDZCQUE2QjswQkFLekMsV0FBVyxTQUFDLHVDQUF1Qzt3QkFLbkQsV0FBVyxTQUFDLHFDQUFxQztzQkFhakQsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQzs7OztJQTFCaEMscUNBQ3FCOztJQXFCVCwwQ0FDd0I7Ozs7O0lBQ2hDLHdDQUFzQzs7Ozs7QUFnQjlDLE1BQU0sT0FBTyw4QkFBOEI7Ozs7SUFDdkMsWUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFBSSxDQUFDOzs7WUFKckQsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSx5QkFBeUI7YUFDdEM7Ozs7WUExVUcsV0FBVzs7OztJQTRVQyxrREFBaUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGRpcmVjdGl2ZXMgdXNlZCBieSB0aGUgQGxpbmsgSWd4VGltZVBpY2tlckNvbXBvbmVudC5cbiAqIFlvdSBzaG91bGQgZ2VuZXJhbGx5IG5vdCB1c2UgdGhlbSBkaXJlY3RseS5cbiAqIEBwcmVmZXJyZWRcbiAqL1xuaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVCwgSWd4VGltZVBpY2tlckJhc2UgfSBmcm9tICcuL3RpbWUtcGlja2VyLmNvbW1vbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbk1vZGUgfSBmcm9tICcuLi9jb3JlL2VudW1zJztcblxuLyoqIEBoaWRkZW4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneEl0ZW1MaXN0XSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4SXRlbUxpc3REaXJlY3RpdmUge1xuXG4gICAgQElucHV0KCdpZ3hJdGVtTGlzdCcpXG4gICAgcHVibGljIHR5cGU6IHN0cmluZztcblxuICAgIHB1YmxpYyBpc0FjdGl2ZTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fY29sdW1uJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2hvdXJMaXN0JylcbiAgICBnZXQgaG91ckNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2hvdXJMaXN0JztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fbWludXRlTGlzdCcpXG4gICAgZ2V0IG1pbnV0ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ21pbnV0ZUxpc3QnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19hbXBtTGlzdCcpXG4gICAgZ2V0IGFtcG1DU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdhbXBtTGlzdCc7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICAgIHB1YmxpYyBvbkZvY3VzKCkge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuZXh0SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXJMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5uZXh0SG91cigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubmV4dE1pbnV0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYW1wbUxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm5leHRBbVBtKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXZJdGVtKCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaG91ckxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnByZXZIb3VyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtaW51dGVMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5wcmV2TWludXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbXBtTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIucHJldkFtUG0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMubmV4dEl0ZW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3VwJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMucHJldkl0ZW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3JpZ2h0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dSaWdodChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IGxpc3ROYW1lID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NOYW1lO1xuXG4gICAgICAgIGlmIChsaXN0TmFtZS5pbmRleE9mKCdob3VyTGlzdCcpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZUxpc3QnKSAhPT0gLTEgJiYgdGhpcy50aW1lUGlja2VyLl9hbXBtSXRlbXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuYW1wbUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dsZWZ0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dMZWZ0KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgbGlzdE5hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZUxpc3QnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5ob3VyTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobGlzdE5hbWUuaW5kZXhPZignYW1wbUxpc3QnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5taW51dGVMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duRW50ZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyLm1vZGUgPT09IEludGVyYWN0aW9uTW9kZS5Ecm9wRG93bikge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLmhpZGVPdmVybGF5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lUGlja2VyLm9rQnV0dG9uQ2xpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25Fc2NhcGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnRpbWVQaWNrZXIuY2FuY2VsQnV0dG9uQ2xpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VvdmVyJylcbiAgICBwdWJsaWMgb25Ib3ZlcigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignd2hlZWwnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblNjcm9sbChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0SXRlbSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJldkl0ZW0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5tb3ZlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25QYW5Nb3ZlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJdGVtKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wcmV2SXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4SG91ckl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hIb3VySXRlbURpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEhvdXJJdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRIb3VyO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRIb3VyICYmIHRoaXMuaXRlbUxpc3QuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRIb3VyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkSG91ciA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbEhvdXJJbnRvVmlldyhpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneE1pbnV0ZUl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hNaW51dGVJdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4TWludXRlSXRlbScpXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbScpXG4gICAgZ2V0IGRlZmF1bHRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1zZWxlY3RlZCcpXG4gICAgZ2V0IHNlbGVjdGVkQ1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NlbGVjdGVkTWludXRlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRNaW51dGUgJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZE1pbnV0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZVBpY2tlci5zZWxlY3RlZE1pbnV0ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbE1pbnV0ZUludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4QW1QbUl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hBbVBtSXRlbURpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEFtUG1JdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRBbVBtO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRBbVBtICYmIHRoaXMuaXRlbUxpc3QuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRBbVBtKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkQW1QbSA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbEFtUG1JbnRvVmlldyhpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBzaG91bGQgYmUgdXNlZCB0byBtYXJrIHdoaWNoIG5nLXRlbXBsYXRlIHdpbGwgYmUgdXNlZCBmcm9tIElneFRpbWVQaWNrZXIgd2hlbiByZS10ZW1wbGF0aW5nIGl0cyBpbnB1dCBncm91cC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VGltZVBpY2tlclRlbXBsYXRlXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4VGltZVBpY2tlclRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHsgfVxufVxuXG4iXX0=