UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

454 lines (453 loc) 44.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { AbstractHasFormatterInputDataView } from './AbstractHasFormatterInputDataView'; import { DateFormatter } from '../../../share/formatter/DateFormatter'; import { DateTimeUtils } from '../../../share/utils/DateTimeUtils'; import { Option } from '../../../decorator/Option.decorator'; import { EventUtils } from '../../../share/utils/EventUtils'; import { BEFORE_VIEW_SHOW_EVENT, VIEW_SHOW_EVENT, BEFORE_VIEW_HIDE_EVENT, VIEW_HIDE_EVENT } from '../../../share/CustomEventType'; /** * @abstract */ export class AbstractDateTimePicker extends AbstractHasFormatterInputDataView { /** * @param {?} elementRef * @param {?} formatterFactory * @param {?} phloxAppInfoService * @param {?} needFocusService */ constructor(elementRef, formatterFactory, phloxAppInfoService, needFocusService) { super(elementRef, formatterFactory, needFocusService); this.beforeViewShowEvent = new EventEmitter(); this.viewShowEvent = new EventEmitter(); this.beforeViewHideEvent = new EventEmitter(); this.viewHideEvent = new EventEmitter(); phloxAppInfoService.getAppInfo().then((info) => { this.phloxAppInfo = info; }); this._useDataPattern = false; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); // Set DateFormatter as default value. if ((this.formatter === null || this.formatter === undefined) && (this.formatterName === null || this.formatterName === undefined)) { this.setFormatterName(DateFormatter.NAME); } // Set default fomatter's pattern if not specified. if (this.formatter !== null && this.formatter !== undefined && this.formatter.getName() === DateFormatter.NAME) { let /** @type {?} */ df = /** @type {?} */ (this.formatter); if (df.getPattern() === null || df.getPattern() === undefined) { // Use display format the same as data's pattern. df.setPattern(this.getDataPattern()); this._useDataPattern = true; } } if (!this.getDate()) { // Set default data value = current date time. let /** @type {?} */ now = new Date(); // Ignore milliseconds by default. now.setMilliseconds(0); this.setDate(now); } // We've to explicitly call this method even if it has been called in super.ngOnInt() // since the default date may be initialized after the super.ngOnInit() is called. this.selfSaveData(this.data); } /** * @param {?=} $event * @return {?} */ emitBeforeViewShowEvent($event) { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_SHOW_EVENT, this, data, $event); this.beforeViewShowEvent.emit(ev); } /** * @param {?=} $event * @return {?} */ emitViewShowEvent($event) { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_SHOW_EVENT, this, data, $event); this.viewShowEvent.emit(ev); } /** * @param {?=} $event * @return {?} */ emitBeforeViewHideEvent($event) { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_HIDE_EVENT, this, data, $event); this.beforeViewHideEvent.emit(ev); } /** * @param {?=} $event * @return {?} */ emitViewHideEvent($event) { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_HIDE_EVENT, this, data, $event); this.viewHideEvent.emit(ev); } /** * @param {?} data * @return {?} */ selfSaveData(data) { this.originalDate = this.getDate(); } /** * @return {?} */ isSelfDataDirty() { let /** @type {?} */ date = this.getDate(); if (this.originalDate !== null && date === null || this.originalDate === null && date !== null) { return true; } if (typeof this.originalDate !== typeof date) { return true; } if (this.originalDate !== undefined && this.originalDate instanceof Date) { return this.compareDate(this.originalDate, date) !== 0; } else { try { return JSON.stringify(this.originalDate) !== JSON.stringify(date); } catch (/** @type {?} */ e) { return false; } } } /** * @return {?} */ selfResetData() { this.setDate(this.originalDate); } /** * @param {?} a * @param {?} b * @return {?} */ compareDate(a, b) { if (!a && b) { return -1; } if (a && !b) { return 1; } if (!a && !b) { return 0; } return a.compareTo(b); } /** * @param {?} data * @return {?} */ getTimeZoneDiff(data) { if (this.formatter instanceof DateFormatter) { let /** @type {?} */ df = /** @type {?} */ (this.formatter); if (df.getTimeZone() !== null && typeof df.getTimeZone() !== 'undefined') { let /** @type {?} */ offsetHours = Math.floor(-data.getTimezoneOffset() / 60); let /** @type {?} */ offsetMins = -data.getTimezoneOffset() % 60; let /** @type {?} */ diff = (offsetHours * 100 + offsetMins); let /** @type {?} */ tzDiff = 0; if (typeof df.getTimeZone() === 'number') { tzDiff = diff - df.getTimeZone(); } else if (typeof df.getTimeZone() === 'string') { tzDiff = diff - DateTimeUtils.parseTimeZone(df.getTimeZone()); } return tzDiff; } } return 0; } /** * @return {?} */ getDate() { // Get value from "this.data". let /** @type {?} */ obj = this.getInputValue(); if (obj === null || obj === undefined) { return obj; } if (this.typeOfData === null || this.typeOfData === undefined || this.typeOfData.toLowerCase() === AbstractDateTimePicker.TYPE_AUTO) { // Try to resolve "typeOfData" automatically. this.typeOfData = typeof obj; } if (this.typeOfData === 'string') { try { return Date.parseExact(obj, this.getDataPattern()); } catch (/** @type {?} */ err) { } try { // Try to parse using Date.parse() return Date.parse(obj); } catch (/** @type {?} */ err) { } } else if (this.typeOfData === 'number') { try { return new Date(obj); } catch (/** @type {?} */ err) { } } else if (this.typeOfData === 'object') { if (obj instanceof Date) { return new Date(obj.getTime()); } } // Could not parse data in any cases. return null; } /** * @param {?} data * @param {?=} $event * @param {?=} fireEvent * @return {?} */ setDate(data, $event, fireEvent) { let /** @type {?} */ date; // We accept these kinds of "data" and parse it into date. if (typeof data === 'string') { try { date = Date.parseExact(data, this.getDataPattern()); } catch (/** @type {?} */ err) { } if (date === null || typeof date === 'undefined') { try { date = Date.parse(data); } catch (/** @type {?} */ err) { } } } else if (typeof data === 'number') { try { date = new Date(data); } catch (/** @type {?} */ err) { } } else if (typeof data === 'object') { if (data instanceof Date) { date = new Date(data.getTime()); } } // Then, convert parsed "date" into "typeOfData". let /** @type {?} */ newData = date; if (newData !== null && newData !== undefined) { if (this.typeOfData === null || this.typeOfData === undefined || this.typeOfData.toLowerCase() === AbstractDateTimePicker.TYPE_AUTO) { // Try to resolve "typeOfData" automatically. this.typeOfData = typeof newData; } if (this.typeOfData === 'string') { newData = date.toString(this.getDataPattern()); } else if (this.typeOfData === 'number') { newData = date.getTime(); } else if (this.typeOfData === 'object') { newData = date; } } // Save it into "this.data". this.setInputValue(newData, $event, fireEvent); } /** * @return {?} */ getBeforeViewShowEvent() { return this.beforeViewShowEvent; } /** * @param {?} event * @return {?} */ setBeforeViewShowEvent(event) { this.beforeViewShowEvent = event; } /** * @return {?} */ getViewShowEvent() { return this.viewShowEvent; } /** * @param {?} event * @return {?} */ setViewShowEvent(event) { this.viewShowEvent = event; } /** * @return {?} */ getBeforeViewHideEvent() { return this.beforeViewHideEvent; } /** * @param {?} event * @return {?} */ setBeforeViewHideEvent(event) { this.beforeViewHideEvent = event; } /** * @return {?} */ getViewHideEvent() { return this.viewHideEvent; } /** * @param {?} event * @return {?} */ setViewHideEvent(event) { this.viewHideEvent = event; } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ show($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeViewShowEvent', $event, fireEvent, ($event) => { // doEvent this.doShow(); }, ($event) => { // emitBeforeEvent this.emitBeforeViewShowEvent($event); }, ($event, result) => { // emitAfterEvent this.emitViewShowEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ hide($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeViewHideEvent', $event, fireEvent, ($event) => { // doEvent this.doHide(); }, ($event) => { // emitBeforeEvent this.emitBeforeViewHideEvent($event); }, ($event, result) => { // emitAfterEvent this.emitViewHideEvent($event); }, ($event) => { // doPrevented }); } /** * @return {?} */ getDataPattern() { if (this.dataPattern === null || this.dataPattern === undefined) { return this.getDataPatternFromSetting(); } return this.dataPattern; } /** * @param {?} dataPattern * @return {?} */ setDataPattern(dataPattern) { this.dataPattern = dataPattern; } /** * @return {?} */ getOriginalDate() { return this.originalDate; } /** * @return {?} */ getDataPatternFromSetting() { if (this.phloxAppInfo === null || this.phloxAppInfo === undefined) { return "yyyy-MM-dd"; } if (this.phloxAppInfo.settings === null || this.phloxAppInfo.settings === undefined) { return "yyyy-MM-dd"; } if (this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN === null || this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN === undefined) { return "yyyy-MM-dd"; } return this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN; } } tslib_1.__decorate([ Option('beforeViewShow'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDateTimePicker.prototype, "beforeViewShowEvent", void 0); tslib_1.__decorate([ Option('viewShow'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDateTimePicker.prototype, "viewShowEvent", void 0); tslib_1.__decorate([ Option('beforeViewHide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDateTimePicker.prototype, "beforeViewHideEvent", void 0); tslib_1.__decorate([ Option('viewHide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDateTimePicker.prototype, "viewHideEvent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], AbstractDateTimePicker.prototype, "dataPattern", void 0); function AbstractDateTimePicker_tsickle_Closure_declarations() { /** @type {?} */ AbstractDateTimePicker.prototype.beforeViewShowEvent; /** @type {?} */ AbstractDateTimePicker.prototype.viewShowEvent; /** @type {?} */ AbstractDateTimePicker.prototype.beforeViewHideEvent; /** @type {?} */ AbstractDateTimePicker.prototype.viewHideEvent; /** @type {?} */ AbstractDateTimePicker.prototype.dataPattern; /** @type {?} */ AbstractDateTimePicker.prototype.phloxAppInfo; /** @type {?} */ AbstractDateTimePicker.prototype.originalDate; /** @type {?} */ AbstractDateTimePicker.prototype._useDataPattern; /** * @abstract * @return {?} */ AbstractDateTimePicker.prototype.doHide = function () { }; /** * @abstract * @return {?} */ AbstractDateTimePicker.prototype.doShow = function () { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REYXRlVGltZVBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9BYnN0cmFjdERhdGVUaW1lUGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUF5QixZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFHaEYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFNN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7QUFFbEksTUFBTSw2QkFBdUMsU0FBUSxpQ0FBaUM7Ozs7Ozs7SUFpQnBGLFlBQVksVUFBc0IsRUFBRSxnQkFBa0MsRUFBRSxtQkFBd0MsRUFDNUcsZ0JBQWtDO1FBQ3BDLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXhDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0tBQzlCOzs7O0lBRU0sUUFBUTtRQUNiLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7UUFHakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQzs7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQy9HLHFCQUFJLEVBQUUscUJBQWlDLElBQUksQ0FBQyxTQUFTLENBQUEsQ0FBQztZQUV0RCxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDOztnQkFFOUQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztnQkFFckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7YUFDN0I7U0FDRjtRQUVELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQzs7WUFFcEIscUJBQUksR0FBRyxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7O1lBRzNCLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNuQjs7O1FBSUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Ozs7OztJQUd2Qix1QkFBdUIsQ0FBQyxNQUFjO1FBQzVDLHFCQUFJLElBQUksR0FBUSxJQUFJLENBQUM7UUFDckIscUJBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7SUFHNUIsaUJBQWlCLENBQUMsTUFBYztRQUN0QyxxQkFBSSxJQUFJLEdBQVEsSUFBSSxDQUFDO1FBQ3JCLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXhFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7SUFHdEIsdUJBQXVCLENBQUMsTUFBYztRQUM1QyxxQkFBSSxJQUFJLEdBQVEsSUFBSSxDQUFDO1FBQ3JCLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFL0UsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7O0lBRzVCLGlCQUFpQixDQUFDLE1BQWM7UUFDdEMscUJBQUksSUFBSSxHQUFRLElBQUksQ0FBQztRQUNyQixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7O0lBSXZCLFlBQVksQ0FBQyxJQUFTO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDOzs7OztJQUk5QixlQUFlO1FBQ3BCLHFCQUFJLElBQUksR0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFaEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMvRixNQUFNLENBQUMsSUFBSSxDQUFDO1NBQ2I7UUFDRCxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDYjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN6RSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4RDtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25FO1lBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNkO1NBQ0Y7Ozs7O0lBSUksYUFBYTtRQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzs7Ozs7OztJQUszQixXQUFXLENBQUMsQ0FBTyxFQUFFLENBQU87UUFDakMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNYO1FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDVjtRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNiLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDVjtRQUVELE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7SUFHakIsZUFBZSxDQUFDLElBQVU7UUFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsWUFBWSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzVDLHFCQUFJLEVBQUUscUJBQWlDLElBQUksQ0FBQyxTQUFTLENBQUEsQ0FBQztZQUV0RCxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLHFCQUFJLFdBQVcsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLHFCQUFJLFVBQVUsR0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDeEQscUJBQUksSUFBSSxHQUFHLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQztnQkFDNUMscUJBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztnQkFFdkIsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDekMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7aUJBQ2xDO2dCQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxNQUFNLEdBQUcsSUFBSSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7aUJBQy9EO2dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZjtTQUNGO1FBRUQsTUFBTSxDQUFDLENBQUMsQ0FBQzs7Ozs7SUFHSixPQUFPOztRQUVaLHFCQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFcEMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ1o7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxLQUFLLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7O1lBRXBJLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxHQUFHLENBQUM7U0FDOUI7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzthQUNwRDtZQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFBLEdBQUcsRUFBRSxDQUFDO2FBQ2Q7WUFFRCxJQUFJLENBQUM7O2dCQUVILE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3hCO1lBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsR0FBRyxFQUFFLENBQUM7YUFDZDtTQUNGO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3RCO1lBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsR0FBRyxFQUFFLENBQUM7YUFDZDtTQUNGO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN4QyxFQUFFLENBQUMsQ0FBQyxHQUFHLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ2hDO1NBQ0Y7O1FBR0QsTUFBTSxDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7SUFHUCxPQUFPLENBQUMsSUFBUyxFQUFFLE1BQWMsRUFBRSxTQUFtQjtRQUMzRCxxQkFBSSxJQUFVLENBQUM7O1FBR2YsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2FBQ3JEO1lBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsR0FBRyxFQUFFLENBQUM7YUFDZDtZQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDO29CQUNILElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN6QjtnQkFBQyxLQUFLLENBQUMsQ0FBQyxpQkFBQSxHQUFHLEVBQUUsQ0FBQztpQkFDZDthQUNGO1NBQ0Y7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3ZCO1lBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsR0FBRyxFQUFFLENBQUM7YUFDZDtTQUNGO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDcEMsRUFBRSxDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNqQztTQUNGOztRQUdELHFCQUFJLE9BQU8sR0FBUSxJQUFJLENBQUM7UUFFeEIsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM5QyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxLQUFLLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7O2dCQUVwSSxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sT0FBTyxDQUFDO2FBQ2xDO1lBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzthQUNoRDtZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDMUI7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxPQUFPLEdBQUcsSUFBSSxDQUFDO2FBQ2hCO1NBQ0Y7O1FBR0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDOzs7OztJQUcxQyxzQkFBc0I7UUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQzs7Ozs7O0lBRzNCLHNCQUFzQixDQUFDLEtBQXdCO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7Ozs7O0lBRzVCLGdCQUFnQjtRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7Ozs7O0lBR3JCLGdCQUFnQixDQUFDLEtBQXdCO1FBQzlDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDOzs7OztJQUd0QixzQkFBc0I7UUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQzs7Ozs7O0lBRzNCLHNCQUFzQixDQUFDLEtBQXdCO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7Ozs7O0lBRzVCLGdCQUFnQjtRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7Ozs7O0lBR3JCLGdCQUFnQixDQUFDLEtBQXdCO1FBQzlDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDOzs7Ozs7O0lBR3RCLElBQUksQ0FBQyxNQUFjLEVBQUUsU0FBbUI7UUFDN0MsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO1FBRUQsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1lBRTlGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNmLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFbkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RDLEVBQUUsQ0FBQyxNQUFhLEVBQUUsTUFBVyxFQUFFLEVBQUU7O1lBRWhDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNoQyxFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1NBRXBCLENBQUMsQ0FBQzs7Ozs7OztJQUdFLElBQUksQ0FBQyxNQUFjLEVBQUUsU0FBbUI7UUFDN0MsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO1FBRUQsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1lBRTlGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNmLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFbkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RDLEVBQUUsQ0FBQyxNQUFhLEVBQUUsTUFBVyxFQUFFLEVBQUU7O1lBRWhDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNoQyxFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1NBRXBCLENBQUMsQ0FBQzs7Ozs7SUFHRSxjQUFjO1FBQ25CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7U0FDekM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzs7Ozs7O0lBR25CLGNBQWMsQ0FBQyxXQUFtQjtRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQzs7Ozs7SUFHMUIsZUFBZTtRQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzs7Ozs7SUFHakIseUJBQXlCO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRSxNQUFNLENBQUMsWUFBWSxDQUFDO1NBQ3JCO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEYsTUFBTSxDQUFDLFlBQVksQ0FBQztTQUNyQjtRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLHlCQUF5QixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3hJLE1BQU0sQ0FBQyxZQUFZLENBQUM7U0FDckI7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7S0FDN0Q7Q0FLRjs7SUFqV0UsTUFBTSxDQUFDLGdCQUFnQixDQUFDO3NDQUNNLFlBQVk7OztJQUMxQyxNQUFNLENBQUMsVUFBVSxDQUFDO3NDQUNNLFlBQVk7OztJQUNwQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7c0NBQ00sWUFBWTs7O0lBQzFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3BDLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0SW5wdXREYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3RJbnB1dERhdGFWaWV3JztcclxuaW1wb3J0IHsgSUZvcm1hdHRlciB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL2Zvcm1hdHRlci9JRm9ybWF0dGVyJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3IH0gZnJvbSAnLi9BYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcnO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRlRm9ybWF0dGVyIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvZm9ybWF0dGVyL0RhdGVGb3JtYXR0ZXInO1xyXG5pbXBvcnQgeyBEYXRlVGltZVV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvRGF0ZVRpbWVVdGlscyc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgRGF0YVV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvRGF0YVV0aWxzJztcclxuaW1wb3J0IHsgcmVhZCB9IGZyb20gJ2ZzJztcclxuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XHJcbmltcG9ydCB7IFBobG94QXBwSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL1BobG94QXBwSW5mb1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcclxuaW1wb3J0IHsgQkVGT1JFX1ZJRVdfU0hPV19FVkVOVCwgVklFV19TSE9XX0VWRU5ULCBCRUZPUkVfVklFV19ISURFX0VWRU5ULCBWSUVXX0hJREVfRVZFTlQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0ZVRpbWVQaWNrZXIgZXh0ZW5kcyBBYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBAT3B0aW9uKCdiZWZvcmVWaWV3U2hvdycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZVZpZXdTaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ3ZpZXdTaG93JylcclxuICBwcm90ZWN0ZWQgdmlld1Nob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlVmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3B0aW9uKCd2aWV3SGlkZScpXHJcbiAgcHJvdGVjdGVkIHZpZXdIaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGF0dGVybjogc3RyaW5nO1xyXG5cclxuICBwcm90ZWN0ZWQgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XHJcbiAgcHJvdGVjdGVkIG9yaWdpbmFsRGF0ZTogRGF0ZTtcclxuICBwcm90ZWN0ZWQgX3VzZURhdGFQYXR0ZXJuOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBmb3JtYXR0ZXJGYWN0b3J5OiBGb3JtYXR0ZXJGYWN0b3J5LCBwaGxveEFwcEluZm9TZXJ2aWNlOiBQaGxveEFwcEluZm9TZXJ2aWNlXHJcbiAgICAsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGZvcm1hdHRlckZhY3RvcnksIG5lZWRGb2N1c1NlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlVmlld1Nob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMudmlld1Nob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuYmVmb3JlVmlld0hpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMudmlld0hpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBwaGxveEFwcEluZm9TZXJ2aWNlLmdldEFwcEluZm8oKS50aGVuKChpbmZvKSA9PiB7XHJcbiAgICAgIHRoaXMucGhsb3hBcHBJbmZvID0gaW5mbztcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3VzZURhdGFQYXR0ZXJuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIC8vIFNldCBEYXRlRm9ybWF0dGVyIGFzIGRlZmF1bHQgdmFsdWUuXHJcbiAgICBpZiAoKHRoaXMuZm9ybWF0dGVyID09PSBudWxsIHx8IHRoaXMuZm9ybWF0dGVyID09PSB1bmRlZmluZWQpICYmICh0aGlzLmZvcm1hdHRlck5hbWUgPT09IG51bGwgfHwgdGhpcy5mb3JtYXR0ZXJOYW1lID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgIHRoaXMuc2V0Rm9ybWF0dGVyTmFtZShEYXRlRm9ybWF0dGVyLk5BTUUpO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGRlZmF1bHQgZm9tYXR0ZXIncyBwYXR0ZXJuIGlmIG5vdCBzcGVjaWZpZWQuXHJcbiAgICBpZiAodGhpcy5mb3JtYXR0ZXIgIT09IG51bGwgJiYgdGhpcy5mb3JtYXR0ZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZvcm1hdHRlci5nZXROYW1lKCkgPT09IERhdGVGb3JtYXR0ZXIuTkFNRSkge1xyXG4gICAgICBsZXQgZGY6IERhdGVGb3JtYXR0ZXIgPSA8RGF0ZUZvcm1hdHRlcj50aGlzLmZvcm1hdHRlcjtcclxuXHJcbiAgICAgIGlmIChkZi5nZXRQYXR0ZXJuKCkgPT09IG51bGwgfHwgZGYuZ2V0UGF0dGVybigpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBVc2UgZGlzcGxheSBmb3JtYXQgdGhlIHNhbWUgYXMgZGF0YSdzIHBhdHRlcm4uXHJcbiAgICAgICAgZGYuc2V0UGF0dGVybih0aGlzLmdldERhdGFQYXR0ZXJuKCkpO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VEYXRhUGF0dGVybiA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZ2V0RGF0ZSgpKSB7XHJcbiAgICAgIC8vIFNldCBkZWZhdWx0IGRhdGEgdmFsdWUgPSBjdXJyZW50IGRhdGUgdGltZS5cclxuICAgICAgbGV0IG5vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAvLyBJZ25vcmUgbWlsbGlzZWNvbmRzIGJ5IGRlZmF1bHQuXHJcbiAgICAgIG5vdy5zZXRNaWxsaXNlY29uZHMoMCk7XHJcblxyXG4gICAgICB0aGlzLnNldERhdGUobm93KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSd2ZSB0byBleHBsaWNpdGx5IGNhbGwgdGhpcyBtZXRob2QgZXZlbiBpZiBpdCBoYXMgYmVlbiBjYWxsZWQgaW4gc3VwZXIubmdPbkludCgpXHJcbiAgICAvLyBzaW5jZSB0aGUgZGVmYXVsdCBkYXRlIG1heSBiZSBpbml0aWFsaXplZCBhZnRlciB0aGUgc3VwZXIubmdPbkluaXQoKSBpcyBjYWxsZWQuXHJcbiAgICB0aGlzLnNlbGZTYXZlRGF0YSh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0QmVmb3JlVmlld1Nob3dFdmVudCgkZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9WSUVXX1NIT1dfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVWaWV3U2hvd0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0Vmlld1Nob3dFdmVudCgkZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFZJRVdfU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLnZpZXdTaG93RXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRCZWZvcmVWaWV3SGlkZUV2ZW50KCRldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1ZJRVdfSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVZpZXdIaWRlRXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRWaWV3SGlkZUV2ZW50KCRldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoVklFV19ISURFX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMudmlld0hpZGVFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIC8vIE92ZXJyaWRlXHJcbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub3JpZ2luYWxEYXRlID0gdGhpcy5nZXREYXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBPdmVycmlkZVxyXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZGF0ZTogRGF0ZSA9IHRoaXMuZ2V0RGF0ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9yaWdpbmFsRGF0ZSAhPT0gbnVsbCAmJiBkYXRlID09PSBudWxsIHx8IHRoaXMub3JpZ2luYWxEYXRlID09PSBudWxsICYmIGRhdGUgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHRoaXMub3JpZ2luYWxEYXRlICE9PSB0eXBlb2YgZGF0ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcmlnaW5hbERhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9yaWdpbmFsRGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZURhdGUodGhpcy5vcmlnaW5hbERhdGUsIGRhdGUpICE9PSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5vcmlnaW5hbERhdGUpICE9PSBKU09OLnN0cmluZ2lmeShkYXRlKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gT3ZlcnJpZGVcclxuICBwdWJsaWMgc2VsZlJlc2V0RGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0RGF0ZSh0aGlzLm9yaWdpbmFsRGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLyBTdWIgY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGlnbm9yZSBpcnJlbGV2YW50IGF0dHJpYnV0ZXMuXHJcbiAgLy8gRm9yIGV4YW1wbGUsIGEgdGltZSBwaWNrZXIgc2hvdWxkIG9ubHkgY29tcGFyZSB3aXRoIEhIOm1tOnNzIGlnbm9yaW5nIERvTSBvciBtcy5cclxuICBwdWJsaWMgY29tcGFyZURhdGUoYTogRGF0ZSwgYjogRGF0ZSk6IG51bWJlciB7XHJcbiAgICBpZiAoIWEgJiYgYikge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgICBpZiAoYSAmJiAhYikge1xyXG4gICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIGlmICghYSAmJiAhYikge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYS5jb21wYXJlVG8oYik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGltZVpvbmVEaWZmKGRhdGE6IERhdGUpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuZm9ybWF0dGVyIGluc3RhbmNlb2YgRGF0ZUZvcm1hdHRlcikge1xyXG4gICAgICBsZXQgZGY6IERhdGVGb3JtYXR0ZXIgPSA8RGF0ZUZvcm1hdHRlcj50aGlzLmZvcm1hdHRlcjtcclxuXHJcbiAgICAgIGlmIChkZi5nZXRUaW1lWm9uZSgpICE9PSBudWxsICYmIHR5cGVvZiBkZi5nZXRUaW1lWm9uZSgpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGxldCBvZmZzZXRIb3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigtZGF0YS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjApO1xyXG4gICAgICAgIGxldCBvZmZzZXRNaW5zOiBudW1iZXIgPSAtZGF0YS5nZXRUaW1lem9uZU9mZnNldCgpICUgNjA7XHJcbiAgICAgICAgbGV0IGRpZmYgPSAob2Zmc2V0SG91cnMgKiAxMDAgKyBvZmZzZXRNaW5zKTtcclxuICAgICAgICBsZXQgdHpEaWZmOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGRmLmdldFRpbWVab25lKCkgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICB0ekRpZmYgPSBkaWZmIC0gZGYuZ2V0VGltZVpvbmUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZi5nZXRUaW1lWm9uZSgpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdHpEaWZmID0gZGlmZiAtIERhdGVUaW1lVXRpbHMucGFyc2VUaW1lWm9uZShkZi5nZXRUaW1lWm9uZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHR6RGlmZjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGUoKTogRGF0ZSB7XHJcbiAgICAvLyBHZXQgdmFsdWUgZnJvbSBcInRoaXMuZGF0YVwiLlxyXG4gICAgbGV0IG9iajogYW55ID0gdGhpcy5nZXRJbnB1dFZhbHVlKCk7XHJcblxyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09IG51bGwgfHwgdGhpcy50eXBlT2ZEYXRhID09PSB1bmRlZmluZWQgfHwgdGhpcy50eXBlT2ZEYXRhLnRvTG93ZXJDYXNlKCkgPT09IEFic3RyYWN0RGF0ZVRpbWVQaWNrZXIuVFlQRV9BVVRPKSB7XHJcbiAgICAgIC8vIFRyeSB0byByZXNvbHZlIFwidHlwZU9mRGF0YVwiIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgIHRoaXMudHlwZU9mRGF0YSA9IHR5cGVvZiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZUV4YWN0KG9iaiwgdGhpcy5nZXREYXRhUGF0dGVybigpKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHVzaW5nIERhdGUucGFyc2UoKVxyXG4gICAgICAgIHJldHVybiBEYXRlLnBhcnNlKG9iaik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUob2JqKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlT2ZEYXRhID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmouZ2V0VGltZSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvdWxkIG5vdCBwYXJzZSBkYXRhIGluIGFueSBjYXNlcy5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERhdGUoZGF0YTogYW55LCAkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGRhdGU6IERhdGU7XHJcblxyXG4gICAgLy8gV2UgYWNjZXB0IHRoZXNlIGtpbmRzIG9mIFwiZGF0YVwiIGFuZCBwYXJzZSBpdCBpbnRvIGRhdGUuXHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZGF0ZSA9IERhdGUucGFyc2VFeGFjdChkYXRhLCB0aGlzLmdldERhdGFQYXR0ZXJuKCkpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGUgPT09IG51bGwgfHwgdHlwZW9mIGRhdGUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGRhdGUgPSBEYXRlLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0YSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0YS5nZXRUaW1lKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlbiwgY29udmVydCBwYXJzZWQgXCJkYXRlXCIgaW50byBcInR5cGVPZkRhdGFcIi5cclxuICAgIGxldCBuZXdEYXRhOiBhbnkgPSBkYXRlO1xyXG5cclxuICAgIGlmIChuZXdEYXRhICE9PSBudWxsICYmIG5ld0RhdGEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy50eXBlT2ZEYXRhID09PSBudWxsIHx8IHRoaXMudHlwZU9mRGF0YSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudHlwZU9mRGF0YS50b0xvd2VyQ2FzZSgpID09PSBBYnN0cmFjdERhdGVUaW1lUGlja2VyLlRZUEVfQVVUTykge1xyXG4gICAgICAgIC8vIFRyeSB0byByZXNvbHZlIFwidHlwZU9mRGF0YVwiIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgICAgdGhpcy50eXBlT2ZEYXRhID0gdHlwZW9mIG5ld0RhdGE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbmV3RGF0YSA9IGRhdGUudG9TdHJpbmcodGhpcy5nZXREYXRhUGF0dGVybigpKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgbmV3RGF0YSA9IGRhdGUuZ2V0VGltZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBuZXdEYXRhID0gZGF0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNhdmUgaXQgaW50byBcInRoaXMuZGF0YVwiLlxyXG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKG5ld0RhdGEsICRldmVudCwgZmlyZUV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCZWZvcmVWaWV3U2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmJlZm9yZVZpZXdTaG93RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0QmVmb3JlVmlld1Nob3dFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuYmVmb3JlVmlld1Nob3dFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFZpZXdTaG93RXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld1Nob3dFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaWV3U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3U2hvd0V2ZW50ID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmVmb3JlVmlld0hpZGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVWaWV3SGlkZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJlZm9yZVZpZXdIaWRlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XHJcbiAgICB0aGlzLmJlZm9yZVZpZXdIaWRlRXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWaWV3SGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdIaWRlRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Vmlld0hpZGVFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0hpZGVFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3coJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlVmlld1Nob3dFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuZG9TaG93KCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlVmlld1Nob3dFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdFZpZXdTaG93RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlKCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZVZpZXdIaWRlRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9FdmVudFxyXG4gICAgICB0aGlzLmRvSGlkZSgpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEJlZm9yZVZpZXdIaWRlRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRWaWV3SGlkZUV2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb1ByZXZlbnRlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YVBhdHRlcm4oKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRhdGFQYXR0ZXJuID09PSBudWxsIHx8IHRoaXMuZGF0YVBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXREYXRhUGF0dGVybkZyb21TZXR0aW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhUGF0dGVybjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRhUGF0dGVybihkYXRhUGF0dGVybjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGFQYXR0ZXJuID0gZGF0YVBhdHRlcm47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0T3JpZ2luYWxEYXRlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxEYXRlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldERhdGFQYXR0ZXJuRnJvbVNldHRpbmcoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mbyA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mbyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5ERUZBVUxUX0RBVEFfREFURV9QQVRURVJOID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLkRFRkFVTFRfREFUQV9EQVRFX1BBVFRFUk4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gXCJ5eXl5LU1NLWRkXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLkRFRkFVTFRfREFUQV9EQVRFX1BBVFRFUk47XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9IaWRlKCk6IHZvaWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBkb1Nob3coKTogdm9pZDtcclxufVxyXG4iXX0=