UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

669 lines 53 kB
import { __decorate, __metadata, __param } from "tslib"; /** * 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 */ var IgxItemListDirective = /** @class */ (function () { function IgxItemListDirective(timePicker, elementRef) { this.timePicker = timePicker; this.elementRef = elementRef; this.tabindex = 0; } Object.defineProperty(IgxItemListDirective.prototype, "defaultCSS", { get: function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(IgxItemListDirective.prototype, "hourCSS", { get: function () { return this.type === 'hourList'; }, enumerable: true, configurable: true }); Object.defineProperty(IgxItemListDirective.prototype, "minuteCSS", { get: function () { return this.type === 'minuteList'; }, enumerable: true, configurable: true }); Object.defineProperty(IgxItemListDirective.prototype, "secondsCSS", { get: function () { return this.type === 'secondsList'; }, enumerable: true, configurable: true }); Object.defineProperty(IgxItemListDirective.prototype, "ampmCSS", { get: function () { return this.type === 'ampmList'; }, enumerable: true, configurable: true }); IgxItemListDirective.prototype.onFocus = function () { this.isActive = true; }; IgxItemListDirective.prototype.onBlur = function () { this.isActive = false; }; IgxItemListDirective.prototype.nextItem = function () { switch (this.type) { case 'hourList': { this.timePicker.nextHour(); break; } case 'minuteList': { this.timePicker.nextMinute(); break; } case 'secondsList': { this.timePicker.nextSeconds(); break; } case 'ampmList': { this.timePicker.nextAmPm(); break; } } }; IgxItemListDirective.prototype.prevItem = function () { switch (this.type) { case 'hourList': { this.timePicker.prevHour(); break; } case 'minuteList': { this.timePicker.prevMinute(); break; } case 'secondsList': { this.timePicker.prevSeconds(); break; } case 'ampmList': { this.timePicker.prevAmPm(); break; } } }; /** * @hidden */ IgxItemListDirective.prototype.onKeydownArrowDown = function (event) { event.preventDefault(); this.nextItem(); }; /** * @hidden */ IgxItemListDirective.prototype.onKeydownArrowUp = function (event) { event.preventDefault(); this.prevItem(); }; /** * @hidden */ IgxItemListDirective.prototype.onKeydownArrowRight = function (event) { event.preventDefault(); var listName = event.target.className; if (listName.indexOf('hourList') !== -1 && this.timePicker.minuteList) { this.timePicker.minuteList.nativeElement.focus(); } else if ((listName.indexOf('hourList') !== -1 || listName.indexOf('minuteList') !== -1) && this.timePicker.secondsList) { this.timePicker.secondsList.nativeElement.focus(); } else if ((listName.indexOf('hourList') !== -1 || listName.indexOf('minuteList') !== -1 || listName.indexOf('secondsList') !== -1) && this.timePicker.ampmList) { this.timePicker.ampmList.nativeElement.focus(); } }; /** * @hidden */ IgxItemListDirective.prototype.onKeydownArrowLeft = function (event) { event.preventDefault(); var listName = event.target.className; if (listName.indexOf('ampmList') !== -1 && this.timePicker.secondsList) { this.timePicker.secondsList.nativeElement.focus(); } else if (listName.indexOf('secondsList') !== -1 && this.timePicker.secondsList && listName.indexOf('minutesList') && this.timePicker.minuteList) { this.timePicker.minuteList.nativeElement.focus(); } else if (listName.indexOf('ampmList') !== -1 && this.timePicker.minuteList) { this.timePicker.minuteList.nativeElement.focus(); } else if ((listName.indexOf('ampmList') !== -1 || listName.indexOf('secondsList') !== -1 || listName.indexOf('minuteList') !== -1) && this.timePicker.hourList) { this.timePicker.hourList.nativeElement.focus(); } }; /** * @hidden */ IgxItemListDirective.prototype.onKeydownEnter = function (event) { event.preventDefault(); if (this.timePicker.mode === InteractionMode.DropDown) { this.timePicker.close(); return; } this.timePicker.okButtonClick(); }; /** * @hidden */ IgxItemListDirective.prototype.onKeydownEscape = function (event) { event.preventDefault(); this.timePicker.cancelButtonClick(); }; /** * @hidden */ IgxItemListDirective.prototype.onHover = function () { this.elementRef.nativeElement.focus(); }; /** * @hidden */ IgxItemListDirective.prototype.onScroll = function (event) { event.preventDefault(); event.stopPropagation(); if (event.deltaY > 0) { this.nextItem(); } else if (event.deltaY < 0) { this.prevItem(); } }; /** * @hidden */ IgxItemListDirective.prototype.onPanMove = function (event) { if (event.deltaY < 0) { this.nextItem(); } else if (event.deltaY > 0) { this.prevItem(); } }; IgxItemListDirective.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: ElementRef } ]; }; __decorate([ Input('igxItemList'), __metadata("design:type", String) ], IgxItemListDirective.prototype, "type", void 0); __decorate([ HostBinding('attr.tabindex'), __metadata("design:type", Object) ], IgxItemListDirective.prototype, "tabindex", void 0); __decorate([ HostBinding('class.igx-time-picker__column'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__hourList'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "hourCSS", null); __decorate([ HostBinding('class.igx-time-picker__minuteList'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "minuteCSS", null); __decorate([ HostBinding('class.igx-time-picker__secondsList'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "secondsCSS", null); __decorate([ HostBinding('class.igx-time-picker__ampmList'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "ampmCSS", null); __decorate([ HostListener('focus'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onFocus", null); __decorate([ HostListener('blur'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onBlur", null); __decorate([ HostListener('keydown.arrowdown', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownArrowDown", null); __decorate([ HostListener('keydown.arrowup', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownArrowUp", null); __decorate([ HostListener('keydown.arrowright', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownArrowRight", null); __decorate([ HostListener('keydown.arrowleft', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownArrowLeft", null); __decorate([ HostListener('keydown.enter', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownEnter", null); __decorate([ HostListener('keydown.escape', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownEscape", null); __decorate([ HostListener('mouseover'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onHover", null); __decorate([ HostListener('wheel', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onScroll", null); __decorate([ HostListener('panmove', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onPanMove", null); IgxItemListDirective = __decorate([ Directive({ selector: '[igxItemList]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, ElementRef]) ], IgxItemListDirective); return IgxItemListDirective; }()); export { IgxItemListDirective }; /** * @hidden */ var IgxHourItemDirective = /** @class */ (function () { function IgxHourItemDirective(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } Object.defineProperty(IgxHourItemDirective.prototype, "defaultCSS", { get: function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(IgxHourItemDirective.prototype, "selectedCSS", { get: function () { return this.isSelectedHour; }, enumerable: true, configurable: true }); Object.defineProperty(IgxHourItemDirective.prototype, "activeCSS", { get: function () { return this.isSelectedHour && this.itemList.isActive; }, enumerable: true, configurable: true }); Object.defineProperty(IgxHourItemDirective.prototype, "isSelectedHour", { get: function () { return this.timePicker.selectedHour === this.value; }, enumerable: true, configurable: true }); IgxHourItemDirective.prototype.onClick = function (item) { if (item !== '') { this.timePicker.scrollHourIntoView(item); } }; IgxHourItemDirective.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; }; __decorate([ Input('igxHourItem'), __metadata("design:type", String) ], IgxHourItemDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-time-picker__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxHourItemDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxHourItemDirective.prototype, "selectedCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--active'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxHourItemDirective.prototype, "activeCSS", null); __decorate([ HostListener('click', ['value']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxHourItemDirective.prototype, "onClick", null); IgxHourItemDirective = __decorate([ Directive({ selector: '[igxHourItem]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, IgxItemListDirective]) ], IgxHourItemDirective); return IgxHourItemDirective; }()); export { IgxHourItemDirective }; /** * @hidden */ var IgxMinuteItemDirective = /** @class */ (function () { function IgxMinuteItemDirective(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } Object.defineProperty(IgxMinuteItemDirective.prototype, "defaultCSS", { get: function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(IgxMinuteItemDirective.prototype, "selectedCSS", { get: function () { return this.isSelectedMinute; }, enumerable: true, configurable: true }); Object.defineProperty(IgxMinuteItemDirective.prototype, "activeCSS", { get: function () { return this.isSelectedMinute && this.itemList.isActive; }, enumerable: true, configurable: true }); Object.defineProperty(IgxMinuteItemDirective.prototype, "isSelectedMinute", { get: function () { return this.timePicker.selectedMinute === this.value; }, enumerable: true, configurable: true }); IgxMinuteItemDirective.prototype.onClick = function (item) { if (item !== '') { this.timePicker.scrollMinuteIntoView(item); } }; IgxMinuteItemDirective.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; }; __decorate([ Input('igxMinuteItem'), __metadata("design:type", String) ], IgxMinuteItemDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-time-picker__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxMinuteItemDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxMinuteItemDirective.prototype, "selectedCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--active'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxMinuteItemDirective.prototype, "activeCSS", null); __decorate([ HostListener('click', ['value']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxMinuteItemDirective.prototype, "onClick", null); IgxMinuteItemDirective = __decorate([ Directive({ selector: '[igxMinuteItem]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, IgxItemListDirective]) ], IgxMinuteItemDirective); return IgxMinuteItemDirective; }()); export { IgxMinuteItemDirective }; /** * @hidden */ var IgxSecondsItemDirective = /** @class */ (function () { function IgxSecondsItemDirective(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } Object.defineProperty(IgxSecondsItemDirective.prototype, "defaultCSS", { get: function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(IgxSecondsItemDirective.prototype, "selectedCSS", { get: function () { return this.isSelectedSeconds; }, enumerable: true, configurable: true }); Object.defineProperty(IgxSecondsItemDirective.prototype, "activeCSS", { get: function () { return this.isSelectedSeconds && this.itemList.isActive; }, enumerable: true, configurable: true }); Object.defineProperty(IgxSecondsItemDirective.prototype, "isSelectedSeconds", { get: function () { return this.timePicker.selectedSeconds === this.value; }, enumerable: true, configurable: true }); IgxSecondsItemDirective.prototype.onClick = function (item) { if (item !== '') { this.timePicker.scrollSecondsIntoView(item); } }; IgxSecondsItemDirective.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; }; __decorate([ Input('igxSecondsItem'), __metadata("design:type", String) ], IgxSecondsItemDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-time-picker__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxSecondsItemDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxSecondsItemDirective.prototype, "selectedCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--active'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxSecondsItemDirective.prototype, "activeCSS", null); __decorate([ HostListener('click', ['value']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxSecondsItemDirective.prototype, "onClick", null); IgxSecondsItemDirective = __decorate([ Directive({ selector: '[igxSecondsItem]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, IgxItemListDirective]) ], IgxSecondsItemDirective); return IgxSecondsItemDirective; }()); export { IgxSecondsItemDirective }; /** * @hidden */ var IgxAmPmItemDirective = /** @class */ (function () { function IgxAmPmItemDirective(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } Object.defineProperty(IgxAmPmItemDirective.prototype, "defaultCSS", { get: function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAmPmItemDirective.prototype, "selectedCSS", { get: function () { return this.isSelectedAmPm; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAmPmItemDirective.prototype, "activeCSS", { get: function () { return this.isSelectedAmPm && this.itemList.isActive; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAmPmItemDirective.prototype, "isSelectedAmPm", { get: function () { return this.timePicker.selectedAmPm === this.value; }, enumerable: true, configurable: true }); IgxAmPmItemDirective.prototype.onClick = function (item) { if (item !== '') { this.timePicker.scrollAmPmIntoView(item); } }; IgxAmPmItemDirective.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; }; __decorate([ Input('igxAmPmItem'), __metadata("design:type", String) ], IgxAmPmItemDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-time-picker__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxAmPmItemDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxAmPmItemDirective.prototype, "selectedCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--active'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxAmPmItemDirective.prototype, "activeCSS", null); __decorate([ HostListener('click', ['value']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxAmPmItemDirective.prototype, "onClick", null); IgxAmPmItemDirective = __decorate([ Directive({ selector: '[igxAmPmItem]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, IgxItemListDirective]) ], IgxAmPmItemDirective); return IgxAmPmItemDirective; }()); export { IgxAmPmItemDirective }; /** * This directive should be used to mark which ng-template will be used from IgxTimePicker when re-templating its input group. */ var IgxTimePickerTemplateDirective = /** @class */ (function () { function IgxTimePickerTemplateDirective(template) { this.template = template; } IgxTimePickerTemplateDirective.ctorParameters = function () { return [ { type: TemplateRef } ]; }; IgxTimePickerTemplateDirective = __decorate([ Directive({ selector: '[igxTimePickerTemplate]' }), __metadata("design:paramtypes", [TemplateRef]) ], IgxTimePickerTemplateDirective); return IgxTimePickerTemplateDirective; }()); export { IgxTimePickerTemplateDirective }; /** * This directive can be used to add custom action buttons to the dropdownb/dialog. */ var IgxTimePickerActionsDirective = /** @class */ (function () { function IgxTimePickerActionsDirective(template) { this.template = template; } IgxTimePickerActionsDirective.ctorParameters = function () { return [ { type: TemplateRef } ]; }; IgxTimePickerActionsDirective = __decorate([ Directive({ selector: '[igxTimePickerActions]' }), __metadata("design:paramtypes", [TemplateRef]) ], IgxTimePickerActionsDirective); return IgxTimePickerActionsDirective; }()); export { IgxTimePickerActionsDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuZGlyZWN0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGltZS1waWNrZXIvdGltZS1waWNrZXIuZGlyZWN0aXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRztBQUNILE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxXQUFXLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFxQixNQUFNLHNCQUFzQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEQsY0FBYztBQUlkO0lBT0ksOEJBQzhDLFVBQTZCLEVBQy9ELFVBQXNCO1FBRFksZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDL0QsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUkzQixhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBSGhCLENBQUM7SUFNTCxzQkFBSSw0Q0FBVTthQUFkO1lBQ0ksT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQzs7O09BQUE7SUFHRCxzQkFBSSx5Q0FBTzthQUFYO1lBQ0ksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztRQUNwQyxDQUFDOzs7T0FBQTtJQUdELHNCQUFJLDJDQUFTO2FBQWI7WUFDSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDO1FBQ3RDLENBQUM7OztPQUFBO0lBR0Qsc0JBQUksNENBQVU7YUFBZDtZQUNJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUM7UUFDdkMsQ0FBQzs7O09BQUE7SUFHRCxzQkFBSSx5Q0FBTzthQUFYO1lBQ0ksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztRQUNwQyxDQUFDOzs7T0FBQTtJQUdNLHNDQUFPLEdBQWQ7UUFD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QUFRLEdBQVIsUUFBUSxDQUFrQjtJQUFJLENBQUM7O2dCQUFyQixXQUFXOztJQUQvQiw4QkFBOEI7UUFIMUMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLHlCQUF5QjtTQUN0QyxDQUFDO3lDQUUrQixXQUFXO09BRC9CLDhCQUE4QixDQUUxQztJQUFELHFDQUFDO0NBQUEsQUFGRCxJQUVDO1NBRlksOEJBQThCO0FBSTNDOztHQUVHO0FBSUg7SUFDSSx1Q0FBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFBSSxDQUFDOztnQkFBckIsV0FBVzs7SUFEL0IsNkJBQTZCO1FBSHpDLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSx3QkFBd0I7U0FDckMsQ0FBQzt5Q0FFK0IsV0FBVztPQUQvQiw2QkFBNkIsQ0FFekM7SUFBRCxvQ0FBQztDQUFBLEFBRkQsSUFFQztTQUZZLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZGlyZWN0aXZlcyB1c2VkIGJ5IHRoZSBAbGluayBJZ3hUaW1lUGlja2VyQ29tcG9uZW50LlxuICogWW91IHNob3VsZCBnZW5lcmFsbHkgbm90IHVzZSB0aGVtIGRpcmVjdGx5LlxuICogQHByZWZlcnJlZFxuICovXG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJR1hfVElNRV9QSUNLRVJfQ09NUE9ORU5ULCBJZ3hUaW1lUGlja2VyQmFzZSB9IGZyb20gJy4vdGltZS1waWNrZXIuY29tbW9uJztcbmltcG9ydCB7IEludGVyYWN0aW9uTW9kZSB9IGZyb20gJy4uL2NvcmUvZW51bXMnO1xuXG4vKiogQGhpZGRlbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4SXRlbUxpc3RdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hJdGVtTGlzdERpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEl0ZW1MaXN0JylcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nO1xuXG4gICAgcHVibGljIGlzQWN0aXZlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVCkgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcbiAgICApIHsgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2NvbHVtbicpXG4gICAgZ2V0IGRlZmF1bHRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19ob3VyTGlzdCcpXG4gICAgZ2V0IGhvdXJDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdob3VyTGlzdCc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX21pbnV0ZUxpc3QnKVxuICAgIGdldCBtaW51dGVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdtaW51dGVMaXN0JztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fc2Vjb25kc0xpc3QnKVxuICAgIGdldCBzZWNvbmRzQ1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnc2Vjb25kc0xpc3QnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19hbXBtTGlzdCcpXG4gICAgZ2V0IGFtcG1DU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdhbXBtTGlzdCc7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICAgIHB1YmxpYyBvbkZvY3VzKCkge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuZXh0SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXJMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5uZXh0SG91cigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubmV4dE1pbnV0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kc0xpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm5leHRTZWNvbmRzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbXBtTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubmV4dEFtUG0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJldkl0ZW0oKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdob3VyTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIucHJldkhvdXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZUxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnByZXZNaW51dGUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZHNMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5wcmV2U2Vjb25kcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYW1wbUxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnByZXZBbVBtKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2Rvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd0Rvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLm5leHRJdGVtKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3d1cCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnByZXZJdGVtKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dyaWdodCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93UmlnaHQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBsaXN0TmFtZSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTmFtZTtcblxuICAgICAgICBpZiAobGlzdE5hbWUuaW5kZXhPZignaG91ckxpc3QnKSAhPT0gLTEgJiYgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5taW51dGVMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICgobGlzdE5hbWUuaW5kZXhPZignaG91ckxpc3QnKSAhPT0gLTEgfHwgbGlzdE5hbWUuaW5kZXhPZignbWludXRlTGlzdCcpICE9PSAtMSkgJiYgdGhpcy50aW1lUGlja2VyLnNlY29uZHNMaXN0KSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Vjb25kc0xpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKChsaXN0TmFtZS5pbmRleE9mKCdob3VyTGlzdCcpICE9PSAtMSB8fCBsaXN0TmFtZS5pbmRleE9mKCdtaW51dGVMaXN0JykgIT09IC0xIHx8XG4gICAgICAgICAgICBsaXN0TmFtZS5pbmRleE9mKCdzZWNvbmRzTGlzdCcpICE9PSAtMSkgJiYgdGhpcy50aW1lUGlja2VyLmFtcG1MaXN0KSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuYW1wbUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dsZWZ0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dMZWZ0KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGxpc3ROYW1lID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NOYW1lO1xuXG4gICAgICAgIGlmIChsaXN0TmFtZS5pbmRleE9mKCdhbXBtTGlzdCcpICE9PSAtMSAmJiB0aGlzLnRpbWVQaWNrZXIuc2Vjb25kc0xpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5zZWNvbmRzTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobGlzdE5hbWUuaW5kZXhPZignc2Vjb25kc0xpc3QnKSAhPT0gLTEgJiYgdGhpcy50aW1lUGlja2VyLnNlY29uZHNMaXN0XG4gICAgICAgICAgICAmJiBsaXN0TmFtZS5pbmRleE9mKCdtaW51dGVzTGlzdCcpICYmIHRoaXMudGltZVBpY2tlci5taW51dGVMaXN0KSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubWludXRlTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobGlzdE5hbWUuaW5kZXhPZignYW1wbUxpc3QnKSAhPT0gLTEgJiYgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5taW51dGVMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICgobGlzdE5hbWUuaW5kZXhPZignYW1wbUxpc3QnKSAhPT0gLTEgfHwgbGlzdE5hbWUuaW5kZXhPZignc2Vjb25kc0xpc3QnKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZUxpc3QnKSAhPT0gLTEpICYmIHRoaXMudGltZVBpY2tlci5ob3VyTGlzdCkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLmhvdXJMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duRW50ZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyLm1vZGUgPT09IEludGVyYWN0aW9uTW9kZS5Ecm9wRG93bikge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLmNsb3NlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lUGlja2VyLm9rQnV0dG9uQ2xpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25Fc2NhcGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnRpbWVQaWNrZXIuY2FuY2VsQnV0dG9uQ2xpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VvdmVyJylcbiAgICBwdWJsaWMgb25Ib3ZlcigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignd2hlZWwnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblNjcm9sbChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0SXRlbSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJldkl0ZW0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5tb3ZlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25QYW5Nb3ZlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJdGVtKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wcmV2SXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4SG91ckl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hIb3VySXRlbURpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEhvdXJJdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRIb3VyO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRIb3VyICYmIHRoaXMuaXRlbUxpc3QuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRIb3VyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkSG91ciA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbEhvdXJJbnRvVmlldyhpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneE1pbnV0ZUl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hNaW51dGVJdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4TWludXRlSXRlbScpXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbScpXG4gICAgZ2V0IGRlZmF1bHRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1zZWxlY3RlZCcpXG4gICAgZ2V0IHNlbGVjdGVkQ1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NlbGVjdGVkTWludXRlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRNaW51dGUgJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZE1pbnV0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZVBpY2tlci5zZWxlY3RlZE1pbnV0ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbE1pbnV0ZUludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4U2Vjb25kc0l0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hTZWNvbmRzSXRlbURpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneFNlY29uZHNJdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTog