@ngx-kit/core
Version:
ngx-kit - core module
521 lines • 36.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable, Optional, Renderer2 } from '@angular/core';
import { BehaviorSubject, Subject } from 'rxjs';
/**
* Service encapsulates complex date-picker grid logic.
*
*
* ### Example
*
* * collection:date-picker -
* [sources](https://github.com/ngx-kit/ngx-kit/tree/master/packages/collection/lib/ui-date-picker),
* [demo](https://ngx-kit.com/collection/module/ui-date-picker)
*/
var KitDatePickerService = /** @class */ (function () {
function KitDatePickerService(renderer) {
this.renderer = renderer;
this.moveHandlerUnsubs = [];
this._grid = new BehaviorSubject([]);
this._monthCursor = new BehaviorSubject(null);
this._pick = new Subject();
}
Object.defineProperty(KitDatePickerService.prototype, "active", {
/**
* Get active date.
*/
get: /**
* Get active date.
* @return {?}
*/
function () {
return new Date();
},
/**
* Set active date.
*/
set: /**
* Set active date.
* @param {?} date
* @return {?}
*/
function (date) {
this._active = new Date(date);
this._focus = new Date(date);
this.updateGrid();
},
enumerable: true,
configurable: true
});
Object.defineProperty(KitDatePickerService.prototype, "gridChanges", {
/**
* Observable with grid state.
*/
get: /**
* Observable with grid state.
* @return {?}
*/
function () {
return this._grid.asObservable();
},
enumerable: true,
configurable: true
});
Object.defineProperty(KitDatePickerService.prototype, "monthCursorChanges", {
/**
* Observable with month cursor state.
*/
get: /**
* Observable with month cursor state.
* @return {?}
*/
function () {
return this._monthCursor.asObservable();
},
enumerable: true,
configurable: true
});
Object.defineProperty(KitDatePickerService.prototype, "pick", {
/**
* Observable with pick date events.
*/
get: /**
* Observable with pick date events.
* @return {?}
*/
function () {
return this._pick.asObservable();
},
enumerable: true,
configurable: true
});
Object.defineProperty(KitDatePickerService.prototype, "weekdays", {
/**
* Weekdays array.
*/
get: /**
* Weekdays array.
* @return {?}
*/
function () {
/** @type {?} */
var weekdays = [];
/** @type {?} */
var cursor = this.startOfWeek(new Date());
for (var i = 0; i < 7; i++) {
weekdays.push(new Date(cursor));
cursor.setDate(cursor.getDate() + 1);
}
return weekdays;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
KitDatePickerService.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.moveHandlerUnsubs.forEach((/**
* @param {?} u
* @return {?}
*/
function (u) { return u(); }));
};
/**
* Focus date (open correspondent month).
*/
/**
* Focus date (open correspondent month).
* @param {?} date
* @return {?}
*/
KitDatePickerService.prototype.focus = /**
* Focus date (open correspondent month).
* @param {?} date
* @return {?}
*/
function (date) {
this._focus = new Date(date);
this.updateGrid();
};
/**
* Modify opened month.
*/
/**
* Modify opened month.
* @param {?} modifier
* @return {?}
*/
KitDatePickerService.prototype.modMonth = /**
* Modify opened month.
* @param {?} modifier
* @return {?}
*/
function (modifier) {
this._focus.setMonth(this._focus.getMonth() + modifier);
this.updateGrid();
};
/**
* Modify opened year.
*/
/**
* Modify opened year.
* @param {?} modifier
* @return {?}
*/
KitDatePickerService.prototype.modYear = /**
* Modify opened year.
* @param {?} modifier
* @return {?}
*/
function (modifier) {
this._focus.setFullYear(this._focus.getFullYear() + modifier);
this.updateGrid();
};
/**
* Handle keyboard movement.
*/
/**
* Handle keyboard movement.
* @param {?} target
* @return {?}
*/
KitDatePickerService.prototype.handleMove = /**
* Handle keyboard movement.
* @param {?} target
* @return {?}
*/
function (target) {
var _this = this;
if (this.renderer) {
this.moveHandlerUnsubs = [
this.renderer.listen(target, 'keydown.ArrowRight', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this._focus.setDate(_this._focus.getDate() + 1);
_this.updateGrid();
})),
this.renderer.listen(target, 'keydown.ArrowLeft', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this._focus.setDate(_this._focus.getDate() - 1);
_this.updateGrid();
})),
this.renderer.listen(target, 'keydown.ArrowUp', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this._focus.setDate(_this._focus.getDate() - 7);
_this.updateGrid();
})),
this.renderer.listen(target, 'keydown.ArrowDown', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this._focus.setDate(_this._focus.getDate() + 7);
_this.updateGrid();
})),
this.renderer.listen(target, 'keydown.Home', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this._focus.setDate(1);
_this.updateGrid();
})),
this.renderer.listen(target, 'keydown.End', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this._focus.setMonth(_this._focus.getMonth() + 1, 0);
_this.updateGrid();
})),
this.renderer.listen(target, 'keydown.PageUp', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this.modMonth(-1);
})),
this.renderer.listen(target, 'keydown.PageDown', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this.modMonth(1);
})),
this.renderer.listen(target, 'keydown.Alt.PageUp', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this.modYear(-1);
})),
this.renderer.listen(target, 'keydown.Alt.PageDown', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this.modYear(1);
})),
this.renderer.listen(target, 'keydown.Enter', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this._pick.next(new Date(_this._focus));
})),
this.renderer.listen(target, 'keydown.Space', (/**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
_this._pick.next(new Date(_this._focus));
})),
];
}
};
/**
* Compare two dates.
*/
/**
* Compare two dates.
* @private
* @param {?} x
* @param {?} y
* @return {?}
*/
KitDatePickerService.prototype.isDatesEqual = /**
* Compare two dates.
* @private
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
if (x && y) {
// @todo improve performance: cache xp, yp
/** @type {?} */
var xp = new Date(x);
xp.setHours(0, 0, 0, 0);
/** @type {?} */
var yp = new Date(y);
yp.setHours(0, 0, 0, 0);
return +xp === +yp;
}
else {
throw new Error('isDatesEqual params error');
}
};
/**
* Start of month of passed date.
*/
/**
* Start of month of passed date.
* @private
* @param {?} curr
* @return {?}
*/
KitDatePickerService.prototype.startOfMonth = /**
* Start of month of passed date.
* @private
* @param {?} curr
* @return {?}
*/
function (curr) {
return new Date(curr.getFullYear(), curr.getMonth(), 1);
};
/**
* Start of week of passed date.
*/
/**
* Start of week of passed date.
* @private
* @param {?} curr
* @return {?}
*/
KitDatePickerService.prototype.startOfWeek = /**
* Start of week of passed date.
* @private
* @param {?} curr
* @return {?}
*/
function (curr) {
/** @type {?} */
var date = new Date(curr);
/** @type {?} */
var day = date.getDay() || 7;
if (day !== 1) {
date.setHours(-24 * (day - 1));
}
return date;
};
/**
* Redraw grid based on monthCursor and current date.
*/
/**
* Redraw grid based on monthCursor and current date.
* @private
* @return {?}
*/
KitDatePickerService.prototype.updateGrid = /**
* Redraw grid based on monthCursor and current date.
* @private
* @return {?}
*/
function () {
var _this = this;
if (this._monthCursor.value &&
this.isDatesEqual(this.startOfMonth(this._focus), this.startOfMonth(this._monthCursor.value))) {
// update current grid
/** @type {?} */
var grid = this._grid.value;
grid.forEach((/**
* @param {?} r
* @return {?}
*/
function (r) { return r.forEach((/**
* @param {?} c
* @return {?}
*/
function (c) {
c.active = _this.isDatesEqual(c.date, _this._active);
c.focus = _this.isDatesEqual(c.date, _this._focus);
})); }));
this._grid.next(grid);
}
else {
// recompile grid
/** @type {?} */
var month = this.startOfMonth(this._focus);
/** @type {?} */
var grid = [];
/** @type {?} */
var cursor = this.startOfWeek(month);
for (var row = 0; row < this.weeksInMonth(month); row++) {
/** @type {?} */
var line = [];
for (var col = 0; col < 7; col++) {
/** @type {?} */
var date = new Date(cursor);
line.push({
active: this.isDatesEqual(date, this._active),
date: date,
focus: this.isDatesEqual(date, this._focus),
outside: date.getMonth() !== month.getMonth(),
});
cursor.setDate(cursor.getDate() + 1);
}
grid.push(line);
}
this._monthCursor.next(month);
this._grid.next(grid);
}
};
/**
* Calc number of weeks in month.
*/
/**
* Calc number of weeks in month.
* @private
* @param {?} curr
* @return {?}
*/
KitDatePickerService.prototype.weeksInMonth = /**
* Calc number of weeks in month.
* @private
* @param {?} curr
* @return {?}
*/
function (curr) {
/** @type {?} */
var firstOfMonth = new Date(curr.getFullYear(), curr.getMonth(), 1);
/** @type {?} */
var day = firstOfMonth.getDay() || 6;
day = day === 1 ? 0 : day;
if (day) {
day--;
}
/** @type {?} */
var diff = 7 - day;
/** @type {?} */
var lastOfMonth = new Date(curr.getFullYear(), curr.getMonth() + 1, 0);
/** @type {?} */
var lastDate = lastOfMonth.getDate();
if (lastOfMonth.getDay() === 1) {
diff--;
}
return Math.ceil((lastDate - diff) / 7) + 1;
};
KitDatePickerService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
KitDatePickerService.ctorParameters = function () { return [
{ type: Renderer2, decorators: [{ type: Optional }] }
]; };
return KitDatePickerService;
}());
export { KitDatePickerService };
if (false) {
/**
* @type {?}
* @private
*/
KitDatePickerService.prototype._active;
/**
* @type {?}
* @private
*/
KitDatePickerService.prototype._focus;
/**
* @type {?}
* @private
*/
KitDatePickerService.prototype.moveHandlerUnsubs;
/**
* @type {?}
* @private
*/
KitDatePickerService.prototype._grid;
/**
* @type {?}
* @private
*/
KitDatePickerService.prototype._monthCursor;
/**
* @type {?}
* @private
*/
KitDatePickerService.prototype._pick;
/**
* @type {?}
* @private
*/
KitDatePickerService.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0LWRhdGUtcGlja2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4LWtpdC9jb3JlLyIsInNvdXJjZXMiOlsic3JjL2tpdC1kYXRlLXBpY2tlci9raXQtZGF0ZS1waWNrZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7OztBQWE1RDtJQWNFLDhCQUFnQyxRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBUjNDLHNCQUFpQixHQUFVLEVBQUUsQ0FBQztRQUVyQixVQUFLLEdBQUcsSUFBSSxlQUFlLENBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQWMsSUFBSSxDQUFDLENBQUM7UUFFdEQsVUFBSyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFHN0MsQ0FBQztJQUtELHNCQUFJLHdDQUFNO1FBSFY7O1dBRUc7Ozs7O1FBQ0g7WUFDRSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVEOztXQUVHOzs7Ozs7UUFDSCxVQUFXLElBQVU7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDOzs7T0FUQTtJQWNELHNCQUFJLDZDQUFXO1FBSGY7O1dBRUc7Ozs7O1FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsQ0FBQzs7O09BQUE7SUFLRCxzQkFBSSxvREFBa0I7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QUFJLENBQUM7UUFDcEMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzFCLElBQUksR0FBRyxFQUFFO1lBQ1AsR0FBRyxFQUFFLENBQUM7U0FDUDs7WUFDRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUc7O1lBQ1osV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7WUFDbEUsUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUU7UUFDdEMsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzlCLElBQUksRUFBRSxDQUFDO1NBQ1I7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O2dCQXhQRixVQUFVOzs7O2dCQWQrQixTQUFTLHVCQTRCcEMsUUFBUTs7SUEyT3ZCLDJCQUFDO0NBQUEsQUF6UEQsSUF5UEM7U0F4UFksb0JBQW9COzs7Ozs7SUFDL0IsdUNBQXNCOzs7OztJQUV0QixzQ0FBcUI7Ozs7O0lBRXJCLGlEQUFzQzs7Ozs7SUFFdEMscUNBQW9FOzs7OztJQUVwRSw0Q0FBdUU7Ozs7O0lBRXZFLHFDQUE2Qzs7Ozs7SUFFakMsd0NBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBLaXREYXRlUGlja2VyR3JpZCB9IGZyb20gJy4vbWV0YSc7XHJcblxyXG4vKipcclxuICogU2VydmljZSBlbmNhcHN1bGF0ZXMgY29tcGxleCBkYXRlLXBpY2tlciBncmlkIGxvZ2ljLlxyXG4gKlxyXG4gKlxyXG4gKiAjIyMgRXhhbXBsZVxyXG4gKlxyXG4gKiAqIGNvbGxlY3Rpb246ZGF0ZS1waWNrZXIgLVxyXG4gKiBbc291cmNlc10oaHR0cHM6Ly9naXRodWIuY29tL25neC1raXQvbmd4LWtpdC90cmVlL21hc3Rlci9wYWNrYWdlcy9jb2xsZWN0aW9uL2xpYi91aS1kYXRlLXBpY2tlciksXHJcbiAqIFtkZW1vXShodHRwczovL25neC1raXQuY29tL2NvbGxlY3Rpb24vbW9kdWxlL3VpLWRhdGUtcGlja2VyKVxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgS2l0RGF0ZVBpY2tlclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX2FjdGl2ZTogRGF0ZTtcclxuXHJcbiAgcHJpdmF0ZSBfZm9jdXM6IERhdGU7XHJcblxyXG4gIHByaXZhdGUgbW92ZUhhbmRsZXJVbnN1YnM6IGFueVtdID0gW107XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyaWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEtpdERhdGVQaWNrZXJHcmlkPihbXSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX21vbnRoQ3Vyc29yID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BpY2sgPSBuZXcgU3ViamVjdDxEYXRlPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhY3RpdmUgZGF0ZS5cclxuICAgKi9cclxuICBnZXQgYWN0aXZlKCkge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgYWN0aXZlIGRhdGUuXHJcbiAgICovXHJcbiAgc2V0IGFjdGl2ZShkYXRlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl9hY3RpdmUgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIHRoaXMuX2ZvY3VzID0gbmV3IERhdGUoZGF0ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgd2l0aCBncmlkIHN0YXRlLlxyXG4gICAqL1xyXG4gIGdldCBncmlkQ2hhbmdlcygpOiBPYnNlcnZhYmxlPEtpdERhdGVQaWNrZXJHcmlkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ3JpZC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgd2l0aCBtb250aCBjdXJzb3Igc3RhdGUuXHJcbiAgICovXHJcbiAgZ2V0IG1vbnRoQ3Vyc29yQ2hhbmdlcygpOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9udGhDdXJzb3IuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIHdpdGggcGljayBkYXRlIGV2ZW50cy5cclxuICAgKi9cclxuICBnZXQgcGljaygpOiBPYnNlcnZhYmxlPERhdGU+IHtcclxuICAgIHJldHVybiB0aGlzLl9waWNrLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2Vla2RheXMgYXJyYXkuXHJcbiAgICovXHJcbiAgZ2V0IHdlZWtkYXlzKCk6IERhdGVbXSB7XHJcbiAgICBjb25zdCB3ZWVrZGF5cyA9IFtdO1xyXG4gICAgY29uc3QgY3Vyc29yID0gdGhpcy5zdGFydE9mV2VlayhuZXcgRGF0ZSgpKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XHJcbiAgICAgIHdlZWtkYXlzLnB1c2gobmV3IERhdGUoY3Vyc29yKSk7XHJcbiAgICAgIGN1cnNvci5zZXREYXRlKGN1cnNvci5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuICAgIHJldHVybiB3ZWVrZGF5cztcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5tb3ZlSGFuZGxlclVuc3Vicy5mb3JFYWNoKHUgPT4gdSgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvY3VzIGRhdGUgKG9wZW4gY29ycmVzcG9uZGVudCBtb250aCkuXHJcbiAgICovXHJcbiAgZm9jdXMoZGF0ZTogRGF0ZSkge1xyXG4gICAgdGhpcy5fZm9jdXMgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIHRoaXMudXBkYXRlR3JpZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW9kaWZ5IG9wZW5lZCBtb250aC5cclxuICAgKi9cclxuICBtb2RNb250aChtb2RpZmllcjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9mb2N1cy5zZXRNb250aCh0aGlzLl9mb2N1cy5nZXRNb250aCgpICsgbW9kaWZpZXIpO1xyXG4gICAgdGhpcy51cGRhdGVHcmlkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb2RpZnkgb3BlbmVkIHllYXIuXHJcbiAgICovXHJcbiAgbW9kWWVhcihtb2RpZmllcjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9mb2N1cy5zZXRGdWxsWWVhcih0aGlzLl9mb2N1cy5nZXRGdWxsWWVhcigpICsgbW9kaWZpZXIpO1xyXG4gICAgdGhpcy51cGRhdGVHcmlkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUga2V5Ym9hcmQgbW92ZW1lbnQuXHJcbiAgICovXHJcbiAgaGFuZGxlTW92ZSh0YXJnZXQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5tb3ZlSGFuZGxlclVuc3VicyA9IFtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0YXJnZXQsICdrZXlkb3duLkFycm93UmlnaHQnLCBlID0+IHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRoaXMuX2ZvY3VzLnNldERhdGUodGhpcy5fZm9jdXMuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0YXJnZXQsICdrZXlkb3duLkFycm93TGVmdCcsIGUgPT4ge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5fZm9jdXMuc2V0RGF0ZSh0aGlzLl9mb2N1cy5nZXREYXRlKCkgLSAxKTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRhcmdldCwgJ2tleWRvd24uQXJyb3dVcCcsIGUgPT4ge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5fZm9jdXMuc2V0RGF0ZSh0aGlzLl9mb2N1cy5nZXREYXRlKCkgLSA3KTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRhcmdldCwgJ2tleWRvd24uQXJyb3dEb3duJywgZSA9PiB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLl9mb2N1cy5zZXREYXRlKHRoaXMuX2ZvY3VzLmdldERhdGUoKSArIDcpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGFyZ2V0LCAna2V5ZG93bi5Ib21lJywgZSA9PiB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLl9mb2N1cy5zZXREYXRlKDEpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGFyZ2V0LCAna2V5ZG93bi5FbmQnLCBlID0+IHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRoaXMuX2ZvY3VzLnNldE1vbnRoKHRoaXMuX2ZvY3VzLmdldE1vbnRoKCkgKyAxLCAwKTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRhcmdldCwgJ2tleWRvd24uUGFnZVVwJywgZSA9PiB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLm1vZE1vbnRoKC0xKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0YXJnZXQsICdrZXlkb3duLlBhZ2VEb3duJywgZSA9PiB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLm1vZE1vbnRoKDEpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRhcmdldCwgJ2tleWRvd24uQWx0LlBhZ2VVcCcsIGUgPT4ge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5tb2RZZWFyKC0xKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0YXJnZXQsICdrZXlkb3duLkFsdC5QYWdlRG93bicsIGUgPT4ge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5tb2RZZWFyKDEpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRhcmdldCwgJ2tleWRvd24uRW50ZXInLCBlID0+IHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRoaXMuX3BpY2submV4dChuZXcgRGF0ZSh0aGlzLl9mb2N1cykpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRhcmdldCwgJ2tleWRvd24uU3BhY2UnLCBlID0+IHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRoaXMuX3BpY2submV4dChuZXcgRGF0ZSh0aGlzLl9mb2N1cykpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcGFyZSB0d28gZGF0ZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0RhdGVzRXF1YWwoeDogRGF0ZSwgeTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHggJiYgeSkge1xyXG4gICAgICAvLyBAdG9kbyBpbXByb3ZlIHBlcmZvcm1hbmNlOiBjYWNoZSB4cCwgeXBcclxuICAgICAgY29uc3QgeHAgPSBuZXcgRGF0ZSh4KTtcclxuICAgICAgeHAuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICAgIGNvbnN0IHlwID0gbmV3IERhdGUoeSk7XHJcbiAgICAgIHlwLnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgICByZXR1cm4gK3hwID09PSAreXA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lzRGF0ZXNFcXVhbCBwYXJhbXMgZXJyb3InKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0IG9mIG1vbnRoIG9mIHBhc3NlZCBkYXRlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhcnRPZk1vbnRoKGN1cnI6IERhdGUpIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZShjdXJyLmdldEZ1bGxZZWFyKCksIGN1cnIuZ2V0TW9udGgoKSwgMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFydCBvZiB3ZWVrIG9mIHBhc3NlZCBkYXRlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhcnRPZldlZWsoY3VycjogRGF0ZSkge1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGN1cnIpO1xyXG4gICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXkoKSB8fCA3O1xyXG4gICAgaWYgKGRheSAhPT0gMSkge1xyXG4gICAgICBkYXRlLnNldEhvdXJzKC0yNCAqIChkYXkgLSAxKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZHJhdyBncmlkIGJhc2VkIG9uIG1vbnRoQ3Vyc29yIGFuZCBjdXJyZW50IGRhdGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVHcmlkKCkge1xyXG4gICAgaWYgKHRoaXMuX21vbnRoQ3Vyc29yLnZhbHVlICYmXHJcbiAgICAgIHRoaXMuaXNEYXRlc0VxdWFsKHRoaXMuc3RhcnRPZk1vbnRoKHRoaXMuX2ZvY3VzKSwgdGhpcy5zdGFydE9mTW9udGgodGhpcy5fbW9udGhDdXJzb3IudmFsdWUpKSkge1xyXG4gICAgICAvLyB1cGRhdGUgY3VycmVudCBncmlkXHJcbiAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLl9ncmlkLnZhbHVlO1xyXG4gICAgICBncmlkLmZvckVhY2gociA9PiByLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgYy5hY3RpdmUgPSB0aGlzLmlzRGF0ZXNFcXVhbChjLmRhdGUsIHRoaXMuX2FjdGl2ZSk7XHJcbiAgICAgICAgYy5mb2N1cyA9IHRoaXMuaXNEYXRlc0VxdWFsKGMuZGF0ZSwgdGhpcy5fZm9jdXMpO1xyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMuX2dyaWQubmV4dChncmlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHJlY29tcGlsZSBncmlkXHJcbiAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5zdGFydE9mTW9udGgodGhpcy5fZm9jdXMpO1xyXG4gICAgICBjb25zdCBncmlkID0gW107XHJcbiAgICAgIGNvbnN0IGN1cnNvciA9IHRoaXMuc3RhcnRPZldlZWsobW9udGgpO1xyXG4gICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0aGlzLndlZWtzSW5Nb250aChtb250aCk7IHJvdysrKSB7XHJcbiAgICAgICAgY29uc3QgbGluZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDc7IGNvbCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY3Vyc29yKTtcclxuICAgICAgICAgIGxpbmUucHVzaCh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogdGhpcy5pc0RhdGVzRXF1YWwoZGF0ZSwgdGhpcy5fYWN0aXZlKSxcclxuICAgICAgICAgICAgZGF0ZSxcclxuICAgICAgICAgICAgZm9jdXM6IHRoaXMuaXNEYXRlc0VxdWFsKGRhdGUsIHRoaXMuX2ZvY3VzKSxcclxuICAgICAgICAgICAgb3V0c2lkZTogZGF0ZS5nZXRNb250aCgpICE9PSBtb250aC5nZXRNb250aCgpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjdXJzb3Iuc2V0RGF0ZShjdXJzb3IuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyaWQucHVzaChsaW5lKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9tb250aEN1cnNvci5uZXh0KG1vbnRoKTtcclxuICAgICAgdGhpcy5fZ3JpZC5uZXh0KGdyaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsYyBudW1iZXIgb2Ygd2Vla3MgaW4gbW9udGguXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB3ZWVrc0luTW9udGgoY3VycjogRGF0ZSk6IG51bWJlciB7XHJcbiAgICBjb25zdCBmaXJzdE9mTW9udGggPSBuZXcgRGF0ZShjdXJyLmdldEZ1bGxZZWFyKCksIGN1cnIuZ2V0TW9udGgoKSwgMSk7XHJcbiAgICBsZXQgZGF5ID0gZmlyc3RPZk1vbnRoLmdldERheSgpIHx8IDY7XHJcbiAgICBkYXkgPSBkYXkgPT09IDEgPyAwIDogZGF5O1xyXG4gICAgaWYgKGRheSkge1xyXG4gICAgICBkYXktLTtcclxuICAgIH1cclxuICAgIGxldCBkaWZmID0gNyAtIGRheTtcclxuICAgIGNvbnN0IGxhc3RPZk1vbnRoID0gbmV3IERhdGUoY3Vyci5nZXRGdWxsWWVhcigpLCBjdXJyLmdldE1vbnRoKCkgKyAxLCAwKTtcclxuICAgIGNvbnN0IGxhc3REYXRlID0gbGFzdE9mTW9udGguZ2V0RGF0ZSgpO1xyXG4gICAgaWYgKGxhc3RPZk1vbnRoLmdldERheSgpID09PSAxKSB7XHJcbiAgICAgIGRpZmYtLTtcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmNlaWwoKGxhc3REYXRlIC0gZGlmZikgLyA3KSArIDE7XHJcbiAgfVxyXG59XHJcbiJdfQ==