UNPKG

e5core-angular-ui

Version:

e5 Anywhere Angular UI

438 lines 44.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, Input, Output, ViewChildren, QueryList, Inject, LOCALE_ID } from '@angular/core'; import { DiariseUnit } from '../../enums/diarise-unit'; import { BehaviorSubject } from 'rxjs'; import { WorkMenuItemFoundationService, WorkItemFoundationService } from 'e5core-angular-services'; import { DatePipe } from '@angular/common'; import { DiariseReasonModel } from '../../models/diarise-reason.model'; export class E5coreUiWorkDiariseComponent { /** * @param {?} workItemFoundationService * @param {?} workMenuItemService * @param {?} locale * @param {?} datePipe */ constructor(workItemFoundationService, workMenuItemService, locale, datePipe) { this.workItemFoundationService = workItemFoundationService; this.workMenuItemService = workMenuItemService; this.locale = locale; this.datePipe = datePipe; this.dateChange = new EventEmitter(); this.reasonTextChange = new EventEmitter(); this.reasonChange = new EventEmitter(); this.diariseWork = new EventEmitter(); this.timeChange = new EventEmitter(); this.diariseReasonOption = ''; this.showDiariseTime = true; this.showDiariseButton = true; this.showDiariseReasonDropdown = true; } /** * @return {?} */ get diariseDate() { return this._diariseDate; } /** * @param {?} value * @return {?} */ set diariseDate(value) { this._diariseDate = value; } /** * @return {?} */ ngOnInit() { if (typeof this.workItem$ === 'undefined') { console.error('e5core-ui-work-diarise [workItem$] must have a BehaviorSubject<WorkItemModel>'); return; } if (this.displayedTime == null) { /** @type {?} */ const currentTime = this.formatAMPM(new Date()); this.displayedTime = currentTime; } if (this.displayedDate == null) { this.displayedDate = new Date(); } if (typeof this.workItem$ != null) { this.workItem$.subscribe(w => { this.workId = w.workId; if (this.showDiariseReasonDropdown) { this.reasons = new Array(); if (this.workId !== '00000000-0000-0000-0000-000000000000') { this.GetDiariseReasons(); } } }); } } /** * @private * @param {?} clickedDiariseOption * @return {?} */ calculateDiariseDate(clickedDiariseOption) { /** @type {?} */ const unit = parseInt(DiariseUnit[clickedDiariseOption.diariseUnit], 10); /** @type {?} */ const increment = parseInt(clickedDiariseOption.value.toString(), 10); this.diariseDate = new Date(); switch (unit) { case DiariseUnit.Tomorrow: { this.diariseDate.setDate(this.diariseDate.getDate() + 1); break; } case DiariseUnit.Days: { this.diariseDate.setDate(this.diariseDate.getDate() + increment); break; } case DiariseUnit.Months: { this.diariseDate.setMonth(this.diariseDate.getMonth() + increment); break; } case DiariseUnit.Weeks: { this.diariseDate.setDate(this.diariseDate.getDate() + increment * 7); break; } case DiariseUnit.Year: { this.diariseDate.setFullYear(this.diariseDate.getFullYear() + increment); break; } } } /** * @private * @return {?} */ setDatePickerDate() { // for(let datePicker of this.datePickerComponents.toArray()){ // datePicker.displayedDate = this.diariseDate; this.displayedDate = this.diariseDate; } /** * @private * @param {?} tempDate * @return {?} */ formatAMPM(tempDate) { /** @type {?} */ let minuteString; /** @type {?} */ let hours = tempDate.getHours(); /** @type {?} */ const minutes = tempDate.getMinutes(); /** @type {?} */ const ampm = hours >= 12 ? 'pm' : 'am'; hours = hours % 12; hours = hours ? hours : 12; // the hour '0' should be '12' minuteString = minutes < 10 ? '0' + minutes.toString() : minutes.toString(); /** @type {?} */ const strTime = hours.toString() + ':' + minuteString + ' ' + ampm; return strTime; } /** * @param {?} $event * @return {?} */ onDiarisePeriodOptionClick($event) { this.calculateDiariseDate($event.diariseOption); this.setDatePickerDate(); this.diarisePeriodOption = $event.diariseOption; } /** * @param {?} $event * @return {?} */ onDiariseButtonClick($event) { // ---Working Code------------------------------------------ // let temp = {"AssessmentExplanationcode":"This is a test"}; // let menuData = { // "WorkItemChanges": WorkItemChanges, // "TaskChanges": null, // "AdditionalProperties": { // "result": "ok", // "DiariseReason": this.diariseReasonOption, // "DiariseUntilDate": formattedDiariseUntilDate, // "DiariseUntilHours": diariseHours, // "DiariseUntilMinutes": diariseMinutes // } // } // _let diariseEvent : WorkDiariseEvent = {diariseOption:this.diarisePeriodOption, // diariseUntilDate:diariseUntilDate, diariseUntilHours : diariseHours, // diariseUntilMinutes : diariseMinutes, diariseTextReason : this.diariseReasonTextValue, // diariseReasonOption : this.diariseReasonOption, menuData:menuData, source:"button"} ; // ---Working Code------------------------------------------ this.diariseWorkEvent = this.ConstructWorkDiariseEvent('button'); this.DiariseWorkItem(); } /** * @param {?} $event * @return {?} */ onDiariseDateChange($event) { this.displayedDate = $event; this.diariseWorkEvent = this.ConstructWorkDiariseEvent('date'); this.dateChange.emit(this.diariseWorkEvent); } /** * @param {?} $event * @return {?} */ onDiariseReasonTextChange($event) { this.diariseReasonTextValue = $event; this.diariseReasonOption = $event; this.diariseWorkEvent = this.ConstructWorkDiariseEvent('reasonText'); this.reasonTextChange.emit(this.diariseWorkEvent); } /** * @param {?} $event * @return {?} */ onDiariseReasonChange($event) { this.diariseReasonOption = $event.value; this.diariseWorkEvent = this.ConstructWorkDiariseEvent('reasonDropdown'); this.reasonChange.emit(this.diariseWorkEvent); } /** * @param {?} time * @return {?} */ onTimeChange(time) { this.displayedTime = time; /** @type {?} */ const diariseWorkEvent = this.ConstructWorkDiariseEvent('time'); this.timeChange.emit(diariseWorkEvent); } /** * @return {?} */ GetDiariseReasons() { this.workItemFoundationService.getDiariseReasons(this.workId).subscribe(s => { /** @type {?} */ const tempReasons = s.map(item => new DiariseReasonModel(item)); this.reasons = tempReasons; }, error => { console.error(error); }); } /** * @return {?} */ DiariseWorkItem() { this.diariseWorkEvent = this.ConstructWorkDiariseEvent('diariseWorkItem'); /** @type {?} */ var options = { menuItemCode: "diarise" }; this.workMenuItemService.invokeMenuItem(this.workId, -1, this.diariseWorkEvent.menuData, options).subscribe(s => { this.diariseWork.emit(this.diariseWorkEvent); }, error => { console.error(error); }); } /** * @param {?} eventSource * @return {?} */ ConstructWorkDiariseEvent(eventSource) { /** @type {?} */ const WorkItemChanges = {}; if (this.diariseReasonPropertyId != null && this.diariseReasonTextValue != null) { WorkItemChanges[this.diariseReasonPropertyId] = this.diariseReasonTextValue; } /** @type {?} */ const diariseUntilTime = this.ConvertTime12to24(this.displayedTime).split(':'); /** @type {?} */ const diariseHours = parseInt(diariseUntilTime[0], 10); /** @type {?} */ const diariseMinutes = parseInt(diariseUntilTime[1], 10); /** @type {?} */ const diariseUntilDate = this.datePipe.transform(this.displayedDate, 'dd/MM/yyyy'); /** @type {?} */ const additionalProperties = { result: 'ok', DiariseReason: this.diariseReasonOption, DiariseUntilDate: diariseUntilDate, DiaiseUntilHours: diariseHours, DiariseUntilMinutes: diariseMinutes }; /** @type {?} */ const menuData = { 'WorkItemChanges': WorkItemChanges, 'TaskChanges': null, 'AdditionalProperties': { 'result': 'ok', 'DiariseReason': this.diariseReasonOption, 'DiariseUntilDate': diariseUntilDate, 'DiariseUntilHours': diariseHours, 'DiariseUntilMinutes': diariseMinutes } }; // let additionalProperties: AdditionalProperties = {result:"ok", DiariseReason:this.diariseReasonOption, // DiariseUntilDate:formattedDiariseUntilDate,DiaiseUntilHours:diariseHours, DiariseUntilMinutes:diariseMinutes}; // let menuData:DiariseMenuDataModel = {WorkItemChanges: WorkItemChanges, TaskChanges : null, // AdditionalProperties:additionalProperties }; /** @type {?} */ const diariseEvent = { diariseOption: this.diarisePeriodOption, diariseUntilDate: diariseUntilDate, diariseUntilHours: diariseHours, diariseUntilMinutes: diariseMinutes, diariseTextReason: this.diariseReasonTextValue, diariseReasonOption: this.diariseReasonOption, menuData: menuData, source: eventSource }; return diariseEvent; } /** * @param {?} time12h * @return {?} */ ConvertTime12to24(time12h) { const [time, modifier] = time12h.split(' '); // tslint:disable-next-line:prefer-const let [hours, minutes] = time.split(':'); if (hours === '12') { hours = '00'; } if (modifier.toUpperCase() === 'PM') { hours = parseInt(hours, 10) + 12; } return hours + ':' + minutes; } } E5coreUiWorkDiariseComponent.decorators = [ { type: Component, args: [{ selector: 'e5core-ui-work-diarise', template: `<e5core-ui-work-diarise-material [periodOptions]='periodOptions' [reasons]='reasons' [displayedDate] ='displayedDate' [displayedTime] = 'displayedTime' [diariseReasonPropertyId] ='diariseReasonPropertyId' [diariseReasonPlaceHolder] ='diariseReasonPlaceHolder' [diariseReasonTextValue]='diariseReasonTextValue' [showDiariseButton]='showDiariseButton' [showDiariseTime]='showDiariseTime' (diariseWork)='onDiariseButtonClick($event)' (reasonTextChange)='onDiariseReasonTextChange($event)' (reasonChange)='onDiariseReasonChange($event)' (dateChange)='onDiariseDateChange($event)' (timeChange)="onTimeChange($event)" (periodChange)="onDiarisePeriodOptionClick($event)" [showDiariseReasonDropdown]='showDiariseReasonDropdown' > </e5core-ui-work-diarise-material>` }] } ]; /** @nocollapse */ E5coreUiWorkDiariseComponent.ctorParameters = () => [ { type: WorkItemFoundationService }, { type: WorkMenuItemFoundationService }, { type: String, decorators: [{ type: Inject, args: [LOCALE_ID,] }] }, { type: DatePipe } ]; E5coreUiWorkDiariseComponent.propDecorators = { workItem$: [{ type: Input }], diariseReasons$: [{ type: Input }], dateChange: [{ type: Output }], reasonTextChange: [{ type: Output }], reasonChange: [{ type: Output }], diariseWork: [{ type: Output }], timeChange: [{ type: Output }], periodOptions: [{ type: Input }], reasons: [{ type: Input }], diariseReasonPropertyId: [{ type: Input }], displayedDate: [{ type: Input }], displayedTime: [{ type: Input }], diariseReasonPlaceHolder: [{ type: Input }], diariseReasonTextValue: [{ type: Input }], diariseReasonOption: [{ type: Input }], showDiariseTime: [{ type: Input }], showDiariseButton: [{ type: Input }], showDiariseReasonDropdown: [{ type: Input }], datePickerComponents: [{ type: ViewChildren, args: ['datepicker',] }] }; if (false) { /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.workItem$; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.diariseReasons$; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.dateChange; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.reasonTextChange; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.reasonChange; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.diariseWork; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.timeChange; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.periodOptions; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.reasons; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.diariseReasonPropertyId; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.displayedDate; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.displayedTime; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.diariseReasonPlaceHolder; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.diariseReasonTextValue; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.diariseReasonOption; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.showDiariseTime; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.showDiariseButton; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.showDiariseReasonDropdown; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.workItemModel; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.workId; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.diarisePeriodOption; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.diariseWorkEvent; /** * @type {?} * @private */ E5coreUiWorkDiariseComponent.prototype._diariseDate; /** @type {?} */ E5coreUiWorkDiariseComponent.prototype.datePickerComponents; /** * @type {?} * @private */ E5coreUiWorkDiariseComponent.prototype.workItemFoundationService; /** * @type {?} * @private */ E5coreUiWorkDiariseComponent.prototype.workMenuItemService; /** * @type {?} * @private */ E5coreUiWorkDiariseComponent.prototype.locale; /** * @type {?} * @private */ E5coreUiWorkDiariseComponent.prototype.datePipe; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTVjb3JlLXVpLXdvcmstZGlhcmlzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9lNWNvcmUtYW5ndWxhci11aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2U1Y29yZS11aS13b3JrLWRpYXJpc2UvZTVjb3JlLXVpLXdvcmstZGlhcmlzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25HLE9BQU8sRUFBYyxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQTBCdkUsTUFBTSxPQUFPLDRCQUE0Qjs7Ozs7OztJQW1DckMsWUFDWSx5QkFBb0QsRUFDcEQsbUJBQWtELEVBQy9CLE1BQWMsRUFDakMsUUFBa0I7UUFIbEIsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUNwRCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQStCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXBDcEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMzQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdkMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FB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Ozs7O1lBM0J1Qyx5QkFBeUI7WUFBeEQsNkJBQTZCO3lDQWtFN0IsTUFBTSxTQUFDLFNBQVM7WUFqRUosUUFBUTs7O3dCQTRCeEIsS0FBSzs4QkFDTCxLQUFLO3lCQUNMLE1BQU07K0JBQ04sTUFBTTsyQkFDTixNQUFNOzBCQUNOLE1BQU07eUJBQ04sTUFBTTs0QkFFTixLQUFLO3NCQUNMLEtBQUs7c0NBQ0wsS0FBSzs0QkFDTCxLQUFLOzRCQUNMLEtBQUs7dUNBQ0wsS0FBSztxQ0FDTCxLQUFLO2tDQUNMLEtBQUs7OEJBQ0wsS0FBSztnQ0FDTCxLQUFLO3dDQUNMLEtBQUs7bUNBY0wsWUFBWSxTQUFDLFlBQVk7Ozs7SUFoQzFCLGlEQUFtRDs7SUFDbkQsdURBQStEOztJQUMvRCxrREFBK0M7O0lBQy9DLHdEQUFxRDs7SUFDckQsb0RBQWlEOztJQUNqRCxtREFBNkQ7O0lBQzdELGtEQUErQzs7SUFFL0MscURBQTZDOztJQUM3QywrQ0FBdUM7O0lBQ3ZDLCtEQUF5Qzs7SUFDekMscURBQTZCOztJQUM3QixxREFBK0I7O0lBQy9CLGdFQUEwQzs7SUFDMUMsOERBQXlDOztJQUN6QywyREFBa0M7O0lBQ2xDLHVEQUFnQzs7SUFDaEMseURBQWtDOztJQUNsQyxpRUFBMEM7O0lBRTFDLHFEQUE2Qjs7SUFDN0IsOENBQWU7O0lBQ2YsMkRBQXdDOztJQUN4Qyx3REFBbUM7Ozs7O0lBQ25DLG9EQUEyQjs7SUFRM0IsNERBQ29FOzs7OztJQUVoRSxpRUFBNEQ7Ozs7O0lBQzVELDJEQUEwRDs7Ozs7SUFDMUQsOENBQXlDOzs7OztJQUN6QyxnREFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgSW5qZWN0LCBMT0NBTEVfSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEU1Y29yZVVpV29ya0RpYXJpc2VCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQvZTVjb3JlLXVpLXdvcmstZGlhcmlzZS1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaWFyaXNlT3B0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlhcmlzZS1vcHRpb24ubW9kZWwnO1xuaW1wb3J0IHsgRGlhcmlzZU9wdGlvbkNsaWNrRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvZGlhcmlzZS1vcHRpb24tY2xpY2stZXZlbnQnO1xuaW1wb3J0IHsgRGlhcmlzZVVuaXQgfSBmcm9tICcuLi8uLi9lbnVtcy9kaWFyaXNlLXVuaXQnO1xuaW1wb3J0IHsgRTVjb3JlVWlEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZTVjb3JlLXVpLWRhdGVwaWNrZXIvZTVjb3JlLXVpLWRhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV29ya0l0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy93b3JrLWl0ZW0nO1xuaW1wb3J0IHsgV29ya01lbnVJdGVtRm91bmRhdGlvblNlcnZpY2UsIFdvcmtJdGVtRm91bmRhdGlvblNlcnZpY2UgfSBmcm9tICdlNWNvcmUtYW5ndWxhci1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBmb3JtYXREYXRlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFyaXNlUmVhc29uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlhcmlzZS1yZWFzb24ubW9kZWwnO1xuaW1wb3J0IHsgRGlhcmlzZU1lbnVEYXRhTW9kZWwsIEFkZGl0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RpYXJpc2UtbWVudS1kYXRhLW1vZGVsJztcbmltcG9ydCB7IERpYXJpc2VXb3JrRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvZGlhcmlzZS13b3JrLWV2ZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlNWNvcmUtdWktd29yay1kaWFyaXNlJyxcbiAgICB0ZW1wbGF0ZTogYDxlNWNvcmUtdWktd29yay1kaWFyaXNlLW1hdGVyaWFsXG4gICAgICAgICAgICAgICBbcGVyaW9kT3B0aW9uc109J3BlcmlvZE9wdGlvbnMnXG4gICAgICAgICAgICAgICBbcmVhc29uc109J3JlYXNvbnMnXG4gICAgICAgICAgICAgICBbZGlzcGxheWVkRGF0ZV0gPSdkaXNwbGF5ZWREYXRlJ1xuICAgICAgICAgICAgICAgW2Rpc3BsYXllZFRpbWVdID0gJ2Rpc3BsYXllZFRpbWUnXG4gICAgICAgICAgICAgICBbZGlhcmlzZVJlYXNvblByb3BlcnR5SWRdID0nZGlhcmlzZVJlYXNvblByb3BlcnR5SWQnXG4gICAgICAgICAgICAgICBbZGlhcmlzZVJlYXNvblBsYWNlSG9sZGVyXSA9J2RpYXJpc2VSZWFzb25QbGFjZUhvbGRlcidcbiAgICAgICAgICAgICAgIFtkaWFyaXNlUmVhc29uVGV4dFZhbHVlXT0nZGlhcmlzZVJlYXNvblRleHRWYWx1ZSdcbiAgICAgICAgICAgICAgIFtzaG93RGlhcmlzZUJ1dHRvbl09J3Nob3dEaWFyaXNlQnV0dG9uJ1xuICAgICAgICAgICAgICAgW3Nob3dEaWFyaXNlVGltZV09J3Nob3dEaWFyaXNlVGltZSdcbiAgICAgICAgICAgICAgIChkaWFyaXNlV29yayk9J29uRGlhcmlzZUJ1dHRvbkNsaWNrKCRldmVudCknXG4gICAgICAgICAgICAgICAocmVhc29uVGV4dENoYW5nZSk9J29uRGlhcmlzZVJlYXNvblRleHRDaGFuZ2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgIChyZWFzb25DaGFuZ2UpPSdvbkRpYXJpc2VSZWFzb25DaGFuZ2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT0nb25EaWFyaXNlRGF0ZUNoYW5nZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgKHRpbWVDaGFuZ2UpPVwib25UaW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgKHBlcmlvZENoYW5nZSk9XCJvbkRpYXJpc2VQZXJpb2RPcHRpb25DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIFtzaG93RGlhcmlzZVJlYXNvbkRyb3Bkb3duXT0nc2hvd0RpYXJpc2VSZWFzb25Ecm9wZG93bidcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgIDwvZTVjb3JlLXVpLXdvcmstZGlhcmlzZS1tYXRlcmlhbD5gXG59KVxuZXhwb3J0IGNsYXNzIEU1Y29yZVVpV29ya0RpYXJpc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIHdvcmtJdGVtJDogQmVoYXZpb3JTdWJqZWN0PFdvcmtJdGVtTW9kZWw+O1xuICAgIEBJbnB1dCgpIGRpYXJpc2VSZWFzb25zJDogQmVoYXZpb3JTdWJqZWN0PERpYXJpc2VSZWFzb25Nb2RlbD4gO1xuICAgIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHJlYXNvblRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgcmVhc29uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIGRpYXJpc2VXb3JrID0gbmV3IEV2ZW50RW1pdHRlcjxEaWFyaXNlV29ya0V2ZW50PigpO1xuICAgIEBPdXRwdXQoKSB0aW1lQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBASW5wdXQoKSBwZXJpb2RPcHRpb25zOiBEaWFyaXNlT3B0aW9uTW9kZWxbXTtcbiAgICBASW5wdXQoKSByZWFzb25zOiBEaWFyaXNlUmVhc29uTW9kZWxbXTtcbiAgICBASW5wdXQoKSBkaWFyaXNlUmVhc29uUHJvcGVydHlJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRpc3BsYXllZERhdGU6IERhdGU7XG4gICAgQElucHV0KCkgZGlzcGxheWVkVGltZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRpYXJpc2VSZWFzb25QbGFjZUhvbGRlcjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRpYXJpc2VSZWFzb25UZXh0VmFsdWU6IHN0cmluZyA7XG4gICAgQElucHV0KCkgZGlhcmlzZVJlYXNvbk9wdGlvbiA9ICcnO1xuICAgIEBJbnB1dCgpIHNob3dEaWFyaXNlVGltZSA9IHRydWU7XG4gICAgQElucHV0KCkgc2hvd0RpYXJpc2VCdXR0b24gPSB0cnVlO1xuICAgIEBJbnB1dCgpIHNob3dEaWFyaXNlUmVhc29uRHJvcGRvd24gPSB0cnVlO1xuXG4gICAgd29ya0l0ZW1Nb2RlbDogV29ya0l0ZW1Nb2RlbDtcbiAgICB3b3JrSWQ6IHN0cmluZztcbiAgICBkaWFyaXNlUGVyaW9kT3B0aW9uOiBEaWFyaXNlT3B0aW9uTW9kZWw7XG4gICAgZGlhcmlzZVdvcmtFdmVudDogRGlhcmlzZVdvcmtFdmVudDtcbiAgICBwcml2YXRlIF9kaWFyaXNlRGF0ZTogRGF0ZTtcbiAgICBwdWJsaWMgZ2V0IGRpYXJpc2VEYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhcmlzZURhdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZGlhcmlzZURhdGUodmFsdWU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5fZGlhcmlzZURhdGUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkcmVuKCdkYXRlcGlja2VyJylcbiAgICBwdWJsaWMgZGF0ZVBpY2tlckNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxFNWNvcmVVaURhdGVwaWNrZXJDb21wb25lbnQ+O1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHdvcmtJdGVtRm91bmRhdGlvblNlcnZpY2U6IFdvcmtJdGVtRm91bmRhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgd29ya01lbnVJdGVtU2VydmljZTogV29ya01lbnVJdGVtRm91bmRhdGlvblNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcml2YXRlIGxvY2FsZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuXG4gICAgICAgIGlmwqAgKHR5cGVvZsKgdGhpcy53b3JrSXRlbSTCoD09PcKgJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2U1Y29yZS11aS13b3JrLWRpYXJpc2UgW3dvcmtJdGVtJF0gbXVzdCBoYXZlIGEgQmVoYXZpb3JTdWJqZWN0PFdvcmtJdGVtTW9kZWw+Jyk7XG4gICAgICAgICAgICByZXR1cm7CoDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXllZFRpbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLmZvcm1hdEFNUE0obmV3IERhdGUoKSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXllZERhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWbCoCAodHlwZW9mwqB0aGlzLndvcmtJdGVtJMKgIT3CoG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMud29ya0l0ZW0kLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICB3ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrSWQgPSB3LndvcmtJZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0RpYXJpc2VSZWFzb25Ecm9wZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFzb25zID0gbmV3IEFycmF5PERpYXJpc2VSZWFzb25Nb2RlbD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndvcmtJZCAhPT0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdldERpYXJpc2VSZWFzb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApIDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVEaWFyaXNlRGF0ZShjbGlja2VkRGlhcmlzZU9wdGlvbjogRGlhcmlzZU9wdGlvbk1vZGVsKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgdW5pdCA9IHBhcnNlSW50KERpYXJpc2VVbml0W2NsaWNrZWREaWFyaXNlT3B0aW9uLmRpYXJpc2VVbml0XSwgMTApO1xuICAgICAgICBjb25zdCBpbmNyZW1lbnQgPSBwYXJzZUludChjbGlja2VkRGlhcmlzZU9wdGlvbi52YWx1ZS50b1N0cmluZygpLCAxMCk7XG4gICAgICAgIHRoaXMuZGlhcmlzZURhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgRGlhcmlzZVVuaXQuVG9tb3Jyb3c6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYXJpc2VEYXRlLnNldERhdGUodGhpcy5kaWFyaXNlRGF0ZS5nZXREYXRlKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEaWFyaXNlVW5pdC5EYXlzOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFyaXNlRGF0ZS5zZXREYXRlKHRoaXMuZGlhcmlzZURhdGUuZ2V0RGF0ZSgpICsgaW5jcmVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEaWFyaXNlVW5pdC5Nb250aHM6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYXJpc2VEYXRlLnNldE1vbnRoKHRoaXMuZGlhcmlzZURhdGUuZ2V0TW9udGgoKSArIGluY3JlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRGlhcmlzZVVuaXQuV2Vla3M6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYXJpc2VEYXRlLnNldERhdGUodGhpcy5kaWFyaXNlRGF0ZS5nZXREYXRlKCkgKyBpbmNyZW1lbnQgKiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEaWFyaXNlVW5pdC5ZZWFyOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFyaXNlRGF0ZS5zZXRGdWxsWWVhcih0aGlzLmRpYXJpc2VEYXRlLmdldEZ1bGxZZWFyKCkgKyBpbmNyZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGF0ZVBpY2tlckRhdGUoKSB7XG4gICAgICAgIC8vIGZvcihsZXQgZGF0ZVBpY2tlciBvZiB0aGlzLmRhdGVQaWNrZXJDb21wb25lbnRzLnRvQXJyYXkoKSl7XG4gICAgICAgIC8vICAgZGF0ZVBpY2tlci5kaXNwbGF5ZWREYXRlID0gdGhpcy5kaWFyaXNlRGF0ZTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRlID0gdGhpcy5kaWFyaXNlRGF0ZTtcblxuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0QU1QTSh0ZW1wRGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBtaW51dGVTdHJpbmc6IHN0cmluZztcbiAgICAgICAgbGV0IGhvdXJzID0gdGVtcERhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IHRlbXBEYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgY29uc3QgYW1wbSA9IGhvdXJzID49IDEyID8gJ3BtJyA6ICdhbSc7XG4gICAgICAgIGhvdXJzID0gaG91cnMgJSAxMjtcbiAgICAgICAgaG91cnMgPSBob3VycyA/IGhvdXJzIDogMTI7IC8vIHRoZSBob3VyICcwJyBzaG91bGQgYmUgJzEyJ1xuICAgICAgICBtaW51dGVTdHJpbmcgPSBtaW51dGVzIDwgMTAgPyAnMCcgKyBtaW51dGVzLnRvU3RyaW5nKCkgOiBtaW51dGVzLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHN0clRpbWUgPSBob3Vycy50b1N0cmluZygpICsgJzonICsgbWludXRlU3RyaW5nICsgJyAnICsgYW1wbTtcbiAgICAgICAgcmV0dXJuIHN0clRpbWU7XG4gICAgfVxuXG4gICAgb25EaWFyaXNlUGVyaW9kT3B0aW9uQ2xpY2soJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVEaWFyaXNlRGF0ZSgkZXZlbnQuZGlhcmlzZU9wdGlvbik7XG4gICAgICAgIHRoaXMuc2V0RGF0ZVBpY2tlckRhdGUoKTtcbiAgICAgICAgdGhpcy5kaWFyaXNlUGVyaW9kT3B0aW9uID0gJGV2ZW50LmRpYXJpc2VPcHRpb247XG4gICAgfVxuXG4gICAgb25EaWFyaXNlQnV0dG9uQ2xpY2soJGV2ZW50OiBEaWFyaXNlV29ya0V2ZW50KSB7XG5cbiAgICAgICAgLy8gIC0tLVdvcmtpbmcgQ29kZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBcdGxldCB0ZW1wID0ge1wiQXNzZXNzbWVudEV4cGxhbmF0aW9uY29kZVwiOlwiVGhpcyBpcyBhIHRlc3RcIn07XG4gICAgICAgIC8vICAgbGV0IG1lbnVEYXRhID0ge1xuICAgICAgICAvLyBcdFwiV29ya0l0ZW1DaGFuZ2VzXCI6IFdvcmtJdGVtQ2hhbmdlcyxcbiAgICAgICAgLy8gXHRcIlRhc2tDaGFuZ2VzXCI6IG51bGwsXG4gICAgICAgIC8vIFx0XCJBZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XG4gICAgICAgIC8vIFx0XHRcInJlc3VsdFwiOiBcIm9rXCIsXG4gICAgICAgIC8vIFx0XHRcIkRpYXJpc2VSZWFzb25cIjogdGhpcy5kaWFyaXNlUmVhc29uT3B0aW9uLFxuICAgICAgICAvLyBcdFx0XCJEaWFyaXNlVW50aWxEYXRlXCI6IGZvcm1hdHRlZERpYXJpc2VVbnRpbERhdGUsXG4gICAgICAgIC8vIFx0XHRcIkRpYXJpc2VVbnRpbEhvdXJzXCI6IGRpYXJpc2VIb3VycyxcbiAgICAgICAgLy8gXHRcdFwiRGlhcmlzZVVudGlsTWludXRlc1wiOiBkaWFyaXNlTWludXRlc1xuICAgICAgICAvLyBcdH1cbiAgICAgICAgLy8gfVxuICAgICAgICAvLyAgX2xldCBkaWFyaXNlRXZlbnQgOiBXb3JrRGlhcmlzZUV2ZW50ID0ge2RpYXJpc2VPcHRpb246dGhpcy5kaWFyaXNlUGVyaW9kT3B0aW9uLFxuICAgICAgICAvLyAgZGlhcmlzZVVudGlsRGF0ZTpkaWFyaXNlVW50aWxEYXRlLCBkaWFyaXNlVW50aWxIb3VycyA6IGRpYXJpc2VIb3VycyxcbiAgICAgICAgLy8gIGRpYXJpc2VVbnRpbE1pbnV0ZXMgOiBkaWFyaXNlTWludXRlcywgZGlhcmlzZVRleHRSZWFzb24gOiB0aGlzLmRpYXJpc2VSZWFzb25UZXh0VmFsdWUsXG4gICAgICAgIC8vICBkaWFyaXNlUmVhc29uT3B0aW9uIDogdGhpcy5kaWFyaXNlUmVhc29uT3B0aW9uLCBtZW51RGF0YTptZW51RGF0YSwgc291cmNlOlwiYnV0dG9uXCJ9IDtcbiAgICAgICAgLy8gIC0tLVdvcmtpbmcgQ29kZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIHRoaXMuZGlhcmlzZVdvcmtFdmVudCA9ICB0aGlzLkNvbnN0cnVjdFdvcmtEaWFyaXNlRXZlbnQoJ2J1dHRvbicpO1xuICAgICAgICB0aGlzLkRpYXJpc2VXb3JrSXRlbSgpO1xuICAgIH1cblxuICAgIG9uRGlhcmlzZURhdGVDaGFuZ2UoJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRlID0gJGV2ZW50O1xuICAgICAgICB0aGlzLmRpYXJpc2VXb3JrRXZlbnQgPSAgdGhpcy5Db25zdHJ1Y3RXb3JrRGlhcmlzZUV2ZW50KCdkYXRlJykgO1xuICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLmRpYXJpc2VXb3JrRXZlbnQpO1xuICAgIH1cblxuICAgIG9uRGlhcmlzZVJlYXNvblRleHRDaGFuZ2UoJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5kaWFyaXNlUmVhc29uVGV4dFZhbHVlID0gJGV2ZW50O1xuICAgICAgICB0aGlzLmRpYXJpc2VSZWFzb25PcHRpb24gPSAkZXZlbnQ7XG4gICAgICAgIHRoaXMuZGlhcmlzZVdvcmtFdmVudCA9ICB0aGlzLkNvbnN0cnVjdFdvcmtEaWFyaXNlRXZlbnQoJ3JlYXNvblRleHQnKSA7XG4gICAgICAgIHRoaXMucmVhc29uVGV4dENoYW5nZS5lbWl0KHRoaXMuZGlhcmlzZVdvcmtFdmVudCk7XG4gICAgfVxuXG4gICAgb25EaWFyaXNlUmVhc29uQ2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuZGlhcmlzZVJlYXNvbk9wdGlvbiA9ICRldmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5kaWFyaXNlV29ya0V2ZW50ID0gIHRoaXMuQ29uc3RydWN0V29ya0RpYXJpc2VFdmVudCgncmVhc29uRHJvcGRvd24nKSA7XG4gICAgICAgIHRoaXMucmVhc29uQ2hhbmdlLmVtaXQodGhpcy5kaWFyaXNlV29ya0V2ZW50KTtcbiAgICB9XG5cbiAgICBvblRpbWVDaGFuZ2UodGltZTogYW55KSB7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkVGltZSA9IHRpbWU7XG4gICAgICAgIGNvbnN0IGRpYXJpc2VXb3JrRXZlbnQ6IERpYXJpc2VXb3JrRXZlbnQgPSB0aGlzLkNvbnN0cnVjdFdvcmtEaWFyaXNlRXZlbnQoJ3RpbWUnKSA7XG4gICAgICAgIHRoaXMudGltZUNoYW5nZS5lbWl0KGRpYXJpc2VXb3JrRXZlbnQpO1xuICAgIH1cblxuICAgIEdldERpYXJpc2VSZWFzb25zKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMud29ya0l0ZW1Gb3VuZGF0aW9uU2VydmljZS5nZXREaWFyaXNlUmVhc29ucyh0aGlzLndvcmtJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFJlYXNvbnM6IGFueSA9IHMubWFwKGl0ZW0gPT4gbmV3IERpYXJpc2VSZWFzb25Nb2RlbChpdGVtKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFzb25zID0gdGVtcFJlYXNvbnM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICApIDtcbiAgICB9XG5cbiAgICBwdWJsaWMgRGlhcmlzZVdvcmtJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYXJpc2VXb3JrRXZlbnQgPSAgdGhpcy5Db25zdHJ1Y3RXb3JrRGlhcmlzZUV2ZW50KCdkaWFyaXNlV29ya0l0ZW0nKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7bWVudUl0ZW1Db2RlOiBcImRpYXJpc2VcIn07XG4gICAgICAgIHRoaXMud29ya01lbnVJdGVtU2VydmljZS5pbnZva2VNZW51SXRlbSh0aGlzLndvcmtJZCwgLTEsIHRoaXMuZGlhcmlzZVdvcmtFdmVudC5tZW51RGF0YSwgb3B0aW9ucykuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhcmlzZVdvcmsuZW1pdCh0aGlzLmRpYXJpc2VXb3JrRXZlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKSA7XG4gICAgfVxuXG4gICAgcHVibGljIENvbnN0cnVjdFdvcmtEaWFyaXNlRXZlbnQoZXZlbnRTb3VyY2U6IGFueSk6IERpYXJpc2VXb3JrRXZlbnQge1xuICAgICAgICBjb25zdCBXb3JrSXRlbUNoYW5nZXMgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuZGlhcmlzZVJlYXNvblByb3BlcnR5SWQgIT0gbnVsbCAmJiB0aGlzLmRpYXJpc2VSZWFzb25UZXh0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgV29ya0l0ZW1DaGFuZ2VzW3RoaXMuZGlhcmlzZVJlYXNvblByb3BlcnR5SWRdID0gdGhpcy5kaWFyaXNlUmVhc29uVGV4dFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlhcmlzZVVudGlsVGltZSA9IHRoaXMuQ29udmVydFRpbWUxMnRvMjQodGhpcy5kaXNwbGF5ZWRUaW1lKS5zcGxpdCgnOicpO1xuICAgICAgICBjb25zdCBkaWFyaXNlSG91cnMgPSBwYXJzZUludChkaWFyaXNlVW50aWxUaW1lWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IGRpYXJpc2VNaW51dGVzID0gcGFyc2VJbnQoZGlhcmlzZVVudGlsVGltZVsxXSwgMTApO1xuICAgICAgICBjb25zdCBkaWFyaXNlVW50aWxEYXRlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5kaXNwbGF5ZWREYXRlLCAnZGQvTU0veXl5eScpIDtcblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUHJvcGVydGllczogQWRkaXRpb25hbFByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICByZXN1bHQ6ICdvaycsXG4gICAgICAgICAgICBEaWFyaXNlUmVhc29uOiB0aGlzLmRpYXJpc2VSZWFzb25PcHRpb24sXG4gICAgICAgICAgICBEaWFyaXNlVW50aWxEYXRlOiBkaWFyaXNlVW50aWxEYXRlLFxuICAgICAgICAgICAgRGlhaXNlVW50aWxIb3VyczogZGlhcmlzZUhvdXJzLFxuICAgICAgICAgICAgRGlhcmlzZVVudGlsTWludXRlczogZGlhcmlzZU1pbnV0ZXNcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWVudURhdGEgPSB7XG4gICAgICAgICAgICAnV29ya0l0ZW1DaGFuZ2VzJzogV29ya0l0ZW1DaGFuZ2VzLFxuICAgICAgICAgICAgJ1Rhc2tDaGFuZ2VzJzogbnVsbCxcbiAgICAgICAgICAgICdBZGRpdGlvbmFsUHJvcGVydGllcyc6IHtcbiAgICAgICAgICAgICAgICAncmVzdWx0JzogJ29rJyxcbiAgICAgICAgICAgICAgICAnRGlhcmlzZVJlYXNvbic6IHRoaXMuZGlhcmlzZVJlYXNvbk9wdGlvbixcbiAgICAgICAgICAgICAgICAnRGlhcmlzZVVudGlsRGF0ZSc6IGRpYXJpc2VVbnRpbERhdGUsXG4gICAgICAgICAgICAgICAgJ0RpYXJpc2VVbnRpbEhvdXJzJzogZGlhcmlzZUhvdXJzLFxuICAgICAgICAgICAgICAgICdEaWFyaXNlVW50aWxNaW51dGVzJzogZGlhcmlzZU1pbnV0ZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSA7XG5cbiAgICAgICAgLy8gbGV0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBBZGRpdGlvbmFsUHJvcGVydGllcyA9IHtyZXN1bHQ6XCJva1wiLCBEaWFyaXNlUmVhc29uOnRoaXMuZGlhcmlzZVJlYXNvbk9wdGlvbixcbiAgICAgICAgLy8gIERpYXJpc2VVbnRpbERhdGU6Zm9ybWF0dGVkRGlhcmlzZVVudGlsRGF0ZSxEaWFpc2VVbnRpbEhvdXJzOmRpYXJpc2VIb3VycywgRGlhcmlzZVVudGlsTWludXRlczpkaWFyaXNlTWludXRlc307XG4gICAgICAgIC8vIGxldCBtZW51RGF0YTpEaWFyaXNlTWVudURhdGFNb2RlbCA9IHtXb3JrSXRlbUNoYW5nZXM6IFdvcmtJdGVtQ2hhbmdlcywgVGFza0NoYW5nZXMgOiBudWxsLFxuICAgICAgICAvLyAgQWRkaXRpb25hbFByb3BlcnRpZXM6YWRkaXRpb25hbFByb3BlcnRpZXMgfTtcblxuICAgICAgICBjb25zdCBkaWFyaXNlRXZlbnQ6IERpYXJpc2VXb3JrRXZlbnQgPSB7XG4gICAgICAgICAgICBkaWFyaXNlT3B0aW9uOiB0aGlzLmRpYXJpc2VQZXJpb2RPcHRpb24sXG4gICAgICAgICAgICBkaWFyaXNlVW50aWxEYXRlOiBkaWFyaXNlVW50aWxEYXRlLFxuICAgICAgICAgICAgZGlhcmlzZVVudGlsSG91cnMgOiBkaWFyaXNlSG91cnMsXG4gICAgICAgICAgICBkaWFyaXNlVW50aWxNaW51dGVzIDogZGlhcmlzZU1pbnV0ZXMsXG4gICAgICAgICAgICBkaWFyaXNlVGV4dFJlYXNvbiA6IHRoaXMuZGlhcmlzZVJlYXNvblRleHRWYWx1ZSxcbiAgICAgICAgICAgIGRpYXJpc2VSZWFzb25PcHRpb24gOiB0aGlzLmRpYXJpc2VSZWFzb25PcHRpb24sXG4gICAgICAgICAgICBtZW51RGF0YTogbWVudURhdGEsXG4gICAgICAgICAgICBzb3VyY2U6IGV2ZW50U291cmNlXG4gICAgICAgIH0gO1xuICAgICAgICByZXR1cm4gZGlhcmlzZUV2ZW50O1xuICAgIH1cblxuICAgIENvbnZlcnRUaW1lMTJ0bzI0KHRpbWUxMmgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbdGltZSwgbW9kaWZpZXJdID0gdGltZTEyaC5zcGxpdCgnICcpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWNvbnN0XG4gICAgICAgIGxldCBbaG91cnMsIG1pbnV0ZXNdID0gdGltZS5zcGxpdCgnOicpO1xuICAgICAgICBpZiAoaG91cnMgPT09ICcxMicpIHtcbiAgICAgICAgICAgIGhvdXJzID0gJzAwJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kaWZpZXIudG9VcHBlckNhc2UoKSA9PT0gJ1BNJykge1xuICAgICAgICAgICAgaG91cnMgPSBwYXJzZUludChob3VycywgMTApICsgMTI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaG91cnMgKyAnOicgKyBtaW51dGVzO1xuICAgIH1cbn1cbiJdfQ==