UNPKG

@kre-form/ant

Version:

396 lines (394 loc) 46.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component } from "@angular/core"; import * as differenceInCalendarDays_ from "date-fns/difference_in_calendar_days"; import { FieldType, KreFormCommonService } from "@kre-form/core"; import * as moment_ from "moment"; import { FormGlobalService } from "@kre-form/core"; /** @type {?} */ const moment = moment_; /** @type {?} */ const differenceInCalendarDays = differenceInCalendarDays_; export class KreFormFieldDateTime extends FieldType { /** * @param {?} globalService * @param {?} commonService */ constructor(globalService, commonService) { super(); this.globalService = globalService; this.commonService = commonService; this.disabledDate = (/** * @param {?} current * @return {?} */ (current) => { if (!!(/** @type {?} */ (this.to)).maxDate && !!(/** @type {?} */ (this.to)).minDate) { return (differenceInCalendarDays(current, new Date((/** @type {?} */ (this.to)).maxDate)) > 0 || differenceInCalendarDays(current, new Date((/** @type {?} */ ((/** @type {?} */ (this.to)).minDate)))) < 0); } else if (!!(/** @type {?} */ (this.to)).maxDate && !(/** @type {?} */ (this.to)).minDate) { return differenceInCalendarDays(current, new Date((/** @type {?} */ (this.to)).maxDate)) > 0; } else if (!(/** @type {?} */ (this.to)).maxDate && !!(/** @type {?} */ (this.to)).minDate) { return differenceInCalendarDays(current, new Date((/** @type {?} */ (this.to)).minDate)) < 0; } else { return false; } }); this.disabledDateTime = (/** * @param {?} e * @return {?} */ (e) => { /** @type {?} */ let nzDisabledHours = []; /** @type {?} */ let nzDisabledMinutes = []; if (!!(/** @type {?} */ (this.to)).maxDate && !!(/** @type {?} */ (this.to)).minDate) { if (differenceInCalendarDays(e, new Date((/** @type {?} */ (this.to)).minDate)) === 0) { nzDisabledHours = this.range(-1, new Date((/** @type {?} */ (this.to)).minDate).getHours()); if (!!e && new Date((/** @type {?} */ (this.to)).minDate).getHours() - e.getHours() === 0) { nzDisabledMinutes = this.range(-1, new Date((/** @type {?} */ (this.to)).minDate).getMinutes()); } } if (differenceInCalendarDays(e, new Date((/** @type {?} */ (this.to)).maxDate)) === 0) { nzDisabledHours = [ ...nzDisabledHours, ...this.range(new Date((/** @type {?} */ (this.to)).maxDate).getHours() + 1, 24), ]; if (!!e && new Date((/** @type {?} */ (this.to)).maxDate).getHours() - e.getHours() === 0) { nzDisabledMinutes = [ ...nzDisabledMinutes, ...this.range(new Date((/** @type {?} */ (this.to)).maxDate).getMinutes(), 60), ]; } } } else if (!!(/** @type {?} */ (this.to)).maxDate && !(/** @type {?} */ (this.to)).minDate) { if (!!e && differenceInCalendarDays(e, new Date((/** @type {?} */ (this.to)).maxDate)) === 0) { nzDisabledHours = this.range(new Date((/** @type {?} */ (this.to)).maxDate).getHours() + 1, 24); if (!!e && new Date((/** @type {?} */ (this.to)).maxDate).getHours() - e.getHours() === 0) { nzDisabledMinutes = this.range(new Date((/** @type {?} */ (this.to)).maxDate).getMinutes(), 60); } } } else if (!(/** @type {?} */ (this.to)).maxDate && !!(/** @type {?} */ (this.to)).minDate) { if (!!e && differenceInCalendarDays(e, new Date((/** @type {?} */ (this.to)).minDate)) === 0) { nzDisabledHours = this.range(0, new Date((/** @type {?} */ (this.to)).minDate).getHours()); if (!!e && new Date((/** @type {?} */ (this.to)).minDate).getHours() - e.getHours() === 0) { nzDisabledMinutes = this.range(-1, new Date((/** @type {?} */ (this.to)).minDate).getMinutes()); } } } return { nzDisabledHours: (/** * @return {?} */ () => nzDisabledHours), nzDisabledMinutes: (/** * @return {?} */ () => nzDisabledMinutes), nzDisabledSeconds: (/** * @return {?} */ () => []), }; }); this.disabledHours = (/** * @return {?} */ () => { /** @type {?} */ let nzDisabledHours = []; if (!!(/** @type {?} */ (this.to)).maxDate && !!(/** @type {?} */ (this.to)).minDate) { nzDisabledHours = this.range(-1, new Date((/** @type {?} */ (this.to)).minDate).getHours()); nzDisabledHours = nzDisabledHours.concat(this.range(new Date((/** @type {?} */ (this.to)).maxDate).getHours() + 1, 24)); } else if (!!(/** @type {?} */ (this.to)).maxDate && !(/** @type {?} */ (this.to)).minDate) { nzDisabledHours = this.range(new Date((/** @type {?} */ (this.to)).maxDate).getHours() + 1, 24); } else if (!(/** @type {?} */ (this.to)).maxDate && !!(/** @type {?} */ (this.to)).minDate) { nzDisabledHours = this.range(0, new Date((/** @type {?} */ (this.to)).minDate).getHours()); } return nzDisabledHours; }); this.disabledMinutes = (/** * @param {?} e * @return {?} */ (e) => { /** @type {?} */ let nzDisabledMinutes = []; if (!!(/** @type {?} */ (this.to)).maxDate && !!(/** @type {?} */ (this.to)).minDate) { if (differenceInCalendarDays(e, new Date((/** @type {?} */ (this.to)).minDate)) === 0) { if (!!e && new Date((/** @type {?} */ (this.to)).minDate).getHours() - e.getHours() === 0) { nzDisabledMinutes = this.range(-1, new Date((/** @type {?} */ (this.to)).minDate).getMinutes()); } } if (differenceInCalendarDays(e, new Date((/** @type {?} */ (this.to)).maxDate)) === 0) { if (!!e && new Date((/** @type {?} */ (this.to)).maxDate).getHours() - e.getHours() === 0) { nzDisabledMinutes = this.range(new Date((/** @type {?} */ (this.to)).maxDate).getMinutes(), 60); } } } else if (!!(/** @type {?} */ (this.to)).maxDate && !(/** @type {?} */ (this.to)).minDate) { if (!!e && differenceInCalendarDays(e, new Date((/** @type {?} */ (this.to)).maxDate)) === 0) { if (!!e && new Date((/** @type {?} */ (this.to)).maxDate).getHours() - e.getHours() === 0) { nzDisabledMinutes = this.range(new Date((/** @type {?} */ (this.to)).maxDate).getMinutes(), 60); } } } else if (!(/** @type {?} */ (this.to)).maxDate && !!(/** @type {?} */ (this.to)).minDate) { if (!!e && differenceInCalendarDays(e, new Date((/** @type {?} */ (this.to)).minDate)) === 0) { if (!!e && new Date((/** @type {?} */ (this.to)).minDate).getHours() - e.getHours() === 0) { nzDisabledMinutes = this.range(-1, new Date((/** @type {?} */ (this.to)).minDate).getMinutes()); } } } return nzDisabledMinutes; }); } /** * * @param {?} e * @param {?} global 该变量是用来做之前的兼容,具体用来干什么 需要看外部的调用 * @return {?} */ nzOnOpenChange(e, global) { if (global == true) { if (!!this.field && !!this.field.templateOptions && this.field.templateOptions.enableInterface) { this.globalService.notifyDataChanged("DateTimeClick", { rdm: Math.random(), config: this.field, state: e, }); } } if (e == false && this.to != undefined && this.to != null && this.to.blur != undefined && this.to.blur != null) { this.to.blur(this.field, null); } } //datetime date month year time /** * @return {?} */ get format() { /** @type {?} */ let result = "yyyy/MM/dd HH:mm"; if ((/** @type {?} */ (this.to))["format"] != undefined && (/** @type {?} */ (this.to))["format"] != null && (/** @type {?} */ (this.to))["format"] != "") { result = (/** @type {?} */ (this.to))["format"]; } return result; } /** * @return {?} */ get showType() { /** @type {?} */ let result = "datetime"; if ((/** @type {?} */ (this.to))["type"] != undefined && (/** @type {?} */ (this.to))["type"] != null && (/** @type {?} */ (this.to))["type"] != "") { result = (/** @type {?} */ (this.to))["type"].toLowerCase(); } return result; } /** * @return {?} */ getText() { /** @type {?} */ let result = ""; if ((/** @type {?} */ (this.to)).type === undefined || (/** @type {?} */ (this.to)).type === null || (/** @type {?} */ (this.to)).type === "") { (/** @type {?} */ (this.to)).type = "datetime"; } if (this.model != undefined && this.model != null && this.field != undefined && this.field != null && this.field.key != undefined && this.field.key != null && this.model[this.field.key] != undefined && this.model[this.field.key] != null && this.model[this.field.key] != "") { if (moment(this.model[this.field.key]).isValid()) { /** @type {?} */ const date = this.model[this.field.key]; switch ((/** @type {?} */ (this.to)).type) { case "datetime": result = moment(date).format("YYYY/MM/DD HH:mm"); break; case "date": result = moment(date).format("YYYY/MM/DD"); break; case "year": result = moment(date).format("YYYY"); break; case "month": result = moment(date).format("YYYY/MM"); break; case "time": result = moment(date).format("HH:mm"); break; } } } return result; } // differenceInCalendarDays(e: Date | null, date: Date): number { // if (!!e) { // return e.getDate() - date.getDate(); // } else { // return 0; // } // } /** * @param {?} start * @param {?} end * @return {?} */ range(start, end) { /** @type {?} */ const result = []; for (let i = start; i < end; i++) { result.push(i); } return result; } /** * @return {?} */ get showToday() { if (typeof this.to.today === "undefined") { return true; } return !!this.to.today; } } KreFormFieldDateTime.decorators = [ { type: Component, args: [{ selector: "krefield-datetime", template: ` <ng-container *ngIf="formStatus !== 0; else other"> <div class="control-design"> <input nz-input disabled /> </div> </ng-container> <ng-template #other> <ng-container *ngIf="editor === true"> <ng-container [ngSwitch]="showType"> <ng-container *ngSwitchCase="'datetime'"> <nz-date-picker nzShowTime [nzShowTime]="{ nzFormat: 'HH:mm' }" nzFormat="yyyy/MM/dd HH:mm" [formControl]="formControl" [kreFormAttributes]="field" [class.is-invalid]="showError" [nzDisabledDate]="disabledDate" [nzDisabledTime]="disabledDateTime" [nzPlaceHolder]="to.placeholder || undefined" (nzOnOpenChange)="nzOnOpenChange($event, true)" ></nz-date-picker> </ng-container> <ng-container *ngSwitchCase="'date'"> <nz-date-picker nzFormat="yyyy/MM/dd" [formControl]="formControl" [kreFormAttributes]="field" [nzDisabledDate]="disabledDate" [class.is-invalid]="showError" [nzShowToday]="showToday" [nzPlaceHolder]="to.placeholder || undefined" (nzOnOpenChange)="nzOnOpenChange($event, false)" ></nz-date-picker> </ng-container> <ng-container *ngSwitchCase="'year'"> <nz-year-picker nzFormat="yyyy" [formControl]="formControl" [kreFormAttributes]="field" [class.is-invalid]="showError" [nzPlaceHolder]="to.placeholder || undefined" (nzOnOpenChange)="nzOnOpenChange($event, false)" ></nz-year-picker> </ng-container> <ng-container *ngSwitchCase="'month'"> <nz-month-picker nzFormat="yyyy/MM" [formControl]="formControl" [kreFormAttributes]="field" [class.is-invalid]="showError" [nzPlaceHolder]="to.placeholder || undefined" (nzOnOpenChange)="nzOnOpenChange($event, false)" ></nz-month-picker> </ng-container> <ng-container *ngSwitchCase="'time'"> <nz-time-picker nzFormat="HH:mm" [formControl]="formControl" [kreFormAttributes]="field" [class.is-invalid]="showError" [nzDisabledHours]="disabledHours" [nzDisabledMinutes]="disabledMinutes" (nzOpenChange)="nzOnOpenChange($event, true)" [nzPlaceHolder]="to.placeholder || undefined" nzClearText="" [nzPopupClassName]="field.className" ></nz-time-picker> </ng-container> <ng-container *ngSwitchDefault></ng-container> </ng-container> </ng-container> <div class="fieldtext" *ngIf="editor === false"> {{ getText() }} </div> </ng-template> ` }] } ]; /** @nocollapse */ KreFormFieldDateTime.ctorParameters = () => [ { type: FormGlobalService }, { type: KreFormCommonService } ]; if (false) { /** @type {?} */ KreFormFieldDateTime.prototype.disabledDate; /** @type {?} */ KreFormFieldDateTime.prototype.disabledDateTime; /** @type {?} */ KreFormFieldDateTime.prototype.disabledHours; /** @type {?} */ KreFormFieldDateTime.prototype.disabledMinutes; /** * @type {?} * @private */ KreFormFieldDateTime.prototype.globalService; /** * @type {?} * @private */ KreFormFieldDateTime.prototype.commonService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3JlLWZvcm0vYW50LyIsInNvdXJjZXMiOlsibGliL3R5cGVzL2RhdGV0aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sS0FBSyx5QkFBeUIsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFnQixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztNQUUzRCxNQUFNLEdBQUcsT0FBTzs7TUFDaEIsd0JBQXdCLEdBQUcseUJBQXlCO0FBb0YxRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsU0FBUzs7Ozs7SUFDakQsWUFDVSxhQUFnQyxFQUNoQyxhQUFtQztRQUUzQyxLQUFLLEVBQUUsQ0FBQztRQUhBLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUF1RzdDLGlCQUFZOzs7O1FBQUcsQ0FBQyxPQUFhLEVBQVcsRUFBRTtZQUN4QyxJQUFJLENBQUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FBTyxFQUFFO2dCQUM1QyxPQUFPLENBQ0wsd0JBQXdCLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLG1CQUFBLElBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQ2pFLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBQSxtQkFBQSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FBTyxFQUFDLENBQUMs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LENBQUM7d0JBQ3hDLE1BQU07b0JBQ1IsS0FBSyxNQUFNO3dCQUNULE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QyxNQUFNO2lCQUNUO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Ozs7Ozs7Ozs7Ozs7SUEySkQsS0FBSyxDQUFDLEtBQWEsRUFBRSxHQUFXOztjQUN4QixNQUFNLEdBQWEsRUFBRTtRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzs7O0lBRUQsSUFBSSxTQUFTO1FBQ1gsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUN4QyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQzs7O1lBbldGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThFVDthQUNGOzs7O1lBdEZzQixpQkFBaUI7WUFGcEIsb0JBQW9COzs7O0lBbU10Qyw0Q0FhRTs7SUFFRixnREErREU7O0lBRUYsNkNBaUJFOztJQUVGLCtDQThDRTs7Ozs7SUF6UEEsNkNBQXdDOzs7OztJQUN4Qyw2Q0FBMkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0ICogYXMgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXyBmcm9tIFwiZGF0ZS1mbnMvZGlmZmVyZW5jZV9pbl9jYWxlbmRhcl9kYXlzXCI7XG5pbXBvcnQgeyBGaWVsZFR5cGUsIEtyZUZvcm1Db21tb25TZXJ2aWNlIH0gZnJvbSBcIkBrcmUtZm9ybS9jb3JlXCI7XG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCB7IEZpZWxkV3JhcHBlciwgRm9ybUdsb2JhbFNlcnZpY2UgfSBmcm9tIFwiQGtyZS1mb3JtL2NvcmVcIjtcblxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcbmNvbnN0IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c187XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJrcmVmaWVsZC1kYXRldGltZVwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtU3RhdHVzICE9PSAwOyBlbHNlIG90aGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbC1kZXNpZ25cIj5cbiAgICAgICAgPGlucHV0IG56LWlucHV0IGRpc2FibGVkIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjb3RoZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdG9yID09PSB0cnVlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInNob3dUeXBlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxuICAgICAgICAgICAgPG56LWRhdGUtcGlja2VyXG4gICAgICAgICAgICAgIG56U2hvd1RpbWVcbiAgICAgICAgICAgICAgW256U2hvd1RpbWVdPVwieyBuekZvcm1hdDogJ0hIOm1tJyB9XCJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJ5eXl5L01NL2RkIEhIOm1tXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWREYXRlXT1cImRpc2FibGVkRGF0ZVwiXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkVGltZV09XCJkaXNhYmxlZERhdGVUaW1lXCJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwidG8ucGxhY2Vob2xkZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgKG56T25PcGVuQ2hhbmdlKT1cIm56T25PcGVuQ2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAgICAgPjwvbnotZGF0ZS1waWNrZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICA8bnotZGF0ZS1waWNrZXJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJ5eXl5L01NL2RkXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWREYXRlXT1cImRpc2FibGVkRGF0ZVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInNob3dFcnJvclwiXG4gICAgICAgICAgICAgIFtuelNob3dUb2RheV09XCJzaG93VG9kYXlcIlxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJ0by5wbGFjZWhvbGRlciB8fCB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAobnpPbk9wZW5DaGFuZ2UpPVwibnpPbk9wZW5DaGFuZ2UoJGV2ZW50LCBmYWxzZSlcIlxuICAgICAgICAgICAgPjwvbnotZGF0ZS1waWNrZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3llYXInXCI+XG4gICAgICAgICAgICA8bnoteWVhci1waWNrZXJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJ5eXl5XCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwidG8ucGxhY2Vob2xkZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgKG56T25PcGVuQ2hhbmdlKT1cIm56T25PcGVuQ2hhbmdlKCRldmVudCwgZmFsc2UpXCJcbiAgICAgICAgICAgID48L256LXllYXItcGlja2VyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtb250aCdcIj5cbiAgICAgICAgICAgIDxuei1tb250aC1waWNrZXJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJ5eXl5L01NXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwidG8ucGxhY2Vob2xkZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgKG56T25PcGVuQ2hhbmdlKT1cIm56T25PcGVuQ2hhbmdlKCRldmVudCwgZmFsc2UpXCJcbiAgICAgICAgICAgID48L256LW1vbnRoLXBpY2tlcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGltZSdcIj5cbiAgICAgICAgICAgIDxuei10aW1lLXBpY2tlclxuICAgICAgICAgICAgICBuekZvcm1hdD1cIkhIOm1tXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRIb3Vyc109XCJkaXNhYmxlZEhvdXJzXCJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRNaW51dGVzXT1cImRpc2FibGVkTWludXRlc1wiXG4gICAgICAgICAgICAgIChuek9wZW5DaGFuZ2UpPVwibnpPbk9wZW5DaGFuZ2UoJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cInRvLnBsYWNlaG9sZGVyIHx8IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgIG56Q2xlYXJUZXh0PVwiXCJcbiAgICAgICAgICAgICAgW256UG9wdXBDbGFzc05hbWVdPVwiZmllbGQuY2xhc3NOYW1lXCJcbiAgICAgICAgICAgID48L256LXRpbWUtcGlja2VyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkdGV4dFwiICpuZ0lmPVwiZWRpdG9yID09PSBmYWxzZVwiPlxuICAgICAgICB7eyBnZXRUZXh0KCkgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEtyZUZvcm1GaWVsZERhdGVUaW1lIGV4dGVuZHMgRmllbGRUeXBlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBnbG9iYWxTZXJ2aWNlOiBGb3JtR2xvYmFsU2VydmljZSxcbiAgICBwcml2YXRlIGNvbW1vblNlcnZpY2U6IEtyZUZvcm1Db21tb25TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVcbiAgICogQHBhcmFtIGdsb2JhbCDor6Xlj5jph4/mmK/nlKjmnaXlgZrkuYvliY3nmoTlhbzlrrnvvIzlhbfkvZPnlKjmnaXlubLku4DkuYgg6ZyA6KaB55yL5aSW6YOo55qE6LCD55SoXG4gICAqL1xuICBuek9uT3BlbkNoYW5nZShlOiBhbnksIGdsb2JhbDogYm9vbGVhbikge1xuICAgIGlmIChnbG9iYWwgPT0gdHJ1ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhIXRoaXMuZmllbGQgJiZcbiAgICAgICAgISF0aGlzLmZpZWxkLnRlbXBsYXRlT3B0aW9ucyAmJlxuICAgICAgICB0aGlzLmZpZWxkLnRlbXBsYXRlT3B0aW9ucy5lbmFibGVJbnRlcmZhY2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLmdsb2JhbFNlcnZpY2Uubm90aWZ5RGF0YUNoYW5nZWQoXCJEYXRlVGltZUNsaWNrXCIsIHtcbiAgICAgICAgICByZG06IE1hdGgucmFuZG9tKCksXG4gICAgICAgICAgY29uZmlnOiB0aGlzLmZpZWxkLFxuICAgICAgICAgIHN0YXRlOiBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlID09IGZhbHNlICYmXG4gICAgICB0aGlzLnRvICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy50byAhPSBudWxsICYmXG4gICAgICB0aGlzLnRvLmJsdXIgIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnRvLmJsdXIgIT0gbnVsbFxuICAgICkge1xuICAgICAgdGhpcy50by5ibHVyKHRoaXMuZmllbGQsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8vZGF0ZXRpbWUgZGF0ZSBtb250aCB5ZWFyIHRpbWVcbiAgZ2V0IGZvcm1hdCgpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJ5eXl5L01NL2RkIEhIOm1tXCI7XG4gICAgaWYgKFxuICAgICAgdGhpcy50byFbXCJmb3JtYXRcIl0gIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnRvIVtcImZvcm1hdFwiXSAhPSBudWxsICYmXG4gICAgICB0aGlzLnRvIVtcImZvcm1hdFwiXSAhPSBcIlwiXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnRvIVtcImZvcm1hdFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBnZXQgc2hvd1R5cGUoKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiZGF0ZXRpbWVcIjtcbiAgICBpZiAoXG4gICAgICB0aGlzLnRvIVtcInR5cGVcIl0gIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnRvIVtcInR5cGVcIl0gIT0gbnVsbCAmJlxuICAgICAgdGhpcy50byFbXCJ0eXBlXCJdICE9IFwiXCJcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMudG8hW1widHlwZVwiXS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0VGV4dCgpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoXG4gICAgICB0aGlzLnRvIS50eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMudG8hLnR5cGUgPT09IG51bGwgfHxcbiAgICAgIHRoaXMudG8hLnR5cGUgPT09IFwiXCJcbiAgICApIHtcbiAgICAgIHRoaXMudG8hLnR5cGUgPSBcImRhdGV0aW1lXCI7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMubW9kZWwgIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm1vZGVsICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZmllbGQgIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmZpZWxkICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZmllbGQua2V5ICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5maWVsZC5rZXkgIT0gbnVsbCAmJlxuICAgICAgdGhpcy5tb2RlbFt0aGlzLmZpZWxkLmtleV0gIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm1vZGVsW3RoaXMuZmllbGQua2V5XSAhPSBudWxsICYmXG4gICAgICB0aGlzLm1vZGVsW3RoaXMuZmllbGQua2V5XSAhPSBcIlwiXG4gICAgKSB7XG4gICAgICBpZiAobW9tZW50KHRoaXMubW9kZWxbdGhpcy5maWVsZC5rZXldKS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgY29uc3QgZGF0ZTogYW55ID0gdGhpcy5tb2RlbFt0aGlzLmZpZWxkLmtleV07XG4gICAgICAgIHN3aXRjaCAodGhpcy50byEudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICAgICAgcmVzdWx0ID0gbW9tZW50KGRhdGUpLmZvcm1hdChcIllZWVkvTU0vREQgSEg6bW1cIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgcmVzdWx0ID0gbW9tZW50KGRhdGUpLmZvcm1hdChcIllZWVkvTU0vRERcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwieWVhclwiOlxuICAgICAgICAgICAgcmVzdWx0ID0gbW9tZW50KGRhdGUpLmZvcm1hdChcIllZWVlcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibW9udGhcIjpcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudChkYXRlKS5mb3JtYXQoXCJZWVlZL01NXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInRpbWVcIjpcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudChkYXRlKS5mb3JtYXQoXCJISDptbVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGlzYWJsZWREYXRlID0gKGN1cnJlbnQ6IERhdGUpOiBib29sZWFuID0+IHtcbiAgICBpZiAoISF0aGlzLnRvIS5tYXhEYXRlICYmICEhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGN1cnJlbnQsIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpKSA+IDAgfHxcbiAgICAgICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGN1cnJlbnQsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUhKSkgPCAwXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoISF0aGlzLnRvIS5tYXhEYXRlICYmICF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICByZXR1cm4gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGN1cnJlbnQsIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpKSA+IDA7XG4gICAgfSBlbHNlIGlmICghdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIHJldHVybiBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoY3VycmVudCwgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkpIDwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBkaXNhYmxlZERhdGVUaW1lID0gKGU6IERhdGUpID0+IHtcbiAgICBsZXQgbnpEaXNhYmxlZEhvdXJzOiBudW1iZXJbXSA9IFtdO1xuICAgIGxldCBuekRpc2FibGVkTWludXRlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGlmICghIXRoaXMudG8hLm1heERhdGUgJiYgISF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBpZiAoZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpKSA9PT0gMCkge1xuICAgICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKC0xLCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKS5nZXRIb3VycygpKTtcblxuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldE1pbnV0ZXMoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSwgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkpID09PSAwKSB7XG4gICAgICAgIG56RGlzYWJsZWRIb3VycyA9IFtcbiAgICAgICAgICAuLi5uekRpc2FibGVkSG91cnMsXG4gICAgICAgICAgLi4udGhpcy5yYW5nZShuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpICsgMSwgMjQpLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICghIWUgJiYgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSAtIGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgIG56RGlzYWJsZWRNaW51dGVzID0gW1xuICAgICAgICAgICAgLi4ubnpEaXNhYmxlZE1pbnV0ZXMsXG4gICAgICAgICAgICAuLi50aGlzLnJhbmdlKG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpLmdldE1pbnV0ZXMoKSwgNjApLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhIWUgJiZcbiAgICAgICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpKSA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIG56RGlzYWJsZWRIb3VycyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSArIDEsXG4gICAgICAgICAgMjRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhZSAmJiBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpIC0gZS5nZXRIb3VycygpID09PSAwKSB7XG4gICAgICAgICAgbnpEaXNhYmxlZE1pbnV0ZXMgPSB0aGlzLnJhbmdlKFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgNjBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFlICYmXG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKSkgPT09IDBcbiAgICAgICkge1xuICAgICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKDAsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkpO1xuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldE1pbnV0ZXMoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG56RGlzYWJsZWRIb3VyczogKCkgPT4gbnpEaXNhYmxlZEhvdXJzLFxuICAgICAgbnpEaXNhYmxlZE1pbnV0ZXM6ICgpID0+IG56RGlzYWJsZWRNaW51dGVzLFxuICAgICAgbnpEaXNhYmxlZFNlY29uZHM6ICgpID0+IFtdLFxuICAgIH07XG4gIH07XG5cbiAgZGlzYWJsZWRIb3VycyA9ICgpID0+IHtcbiAgICBsZXQgbnpEaXNhYmxlZEhvdXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIG56RGlzYWJsZWRIb3VycyA9IHRoaXMucmFuZ2UoLTEsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkpO1xuICAgICAgbnpEaXNhYmxlZEhvdXJzID0gbnpEaXNhYmxlZEhvdXJzLmNvbmNhdChcbiAgICAgICAgdGhpcy5yYW5nZShuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpICsgMSwgMjQpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoISF0aGlzLnRvIS5tYXhEYXRlICYmICF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKFxuICAgICAgICBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpICsgMSxcbiAgICAgICAgMjRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIG56RGlzYWJsZWRIb3VycyA9IHRoaXMucmFuZ2UoMCwgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0SG91cnMoKSk7XG4gICAgfVxuICAgIHJldHVybiBuekRpc2FibGVkSG91cnM7XG4gIH07XG5cbiAgZGlzYWJsZWRNaW51dGVzID0gKGU6IERhdGUpID0+IHtcbiAgICBsZXQgbnpEaXNhYmxlZE1pbnV0ZXM6IG51bWJlcltdID0gW107XG4gICAgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIGlmIChkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSwgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkpID09PSAwKSB7XG4gICAgICAgIGlmICghIWUgJiYgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0SG91cnMoKSAtIGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgIG56RGlzYWJsZWRNaW51dGVzID0gdGhpcy5yYW5nZShcbiAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0TWludXRlcygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKSkgPT09IDApIHtcbiAgICAgICAgaWYgKCEhZSAmJiBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpIC0gZS5nZXRIb3VycygpID09PSAwKSB7XG4gICAgICAgICAgbnpEaXNhYmxlZE1pbnV0ZXMgPSB0aGlzLnJhbmdlKFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgNjBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIXRoaXMudG8hLm1heERhdGUgJiYgIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFlICYmXG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKSkgPT09IDBcbiAgICAgICkge1xuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRNaW51dGVzKCksXG4gICAgICAgICAgICA2MFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLnRvIS5tYXhEYXRlICYmICEhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhIWUgJiZcbiAgICAgICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpKSA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIGlmICghIWUgJiYgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0SG91cnMoKSAtIGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgIG56RGlzYWJsZWRNaW51dGVzID0gdGhpcy5yYW5nZShcbiAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0TWludXRlcygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuekRpc2FibGVkTWludXRlcztcbiAgfTtcbiAgLy8gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGU6IERhdGUgfCBudWxsLCBkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgLy8gICBpZiAoISFlKSB7XG4gIC8vICAgICByZXR1cm4gZS5nZXREYXRlKCkgLSBkYXRlLmdldERhdGUoKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgcmV0dXJuIDA7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldCBzaG93VG9kYXkoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnRvLnRvZGF5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdGhpcy50by50b2RheTtcbiAgfVxufVxuIl19