ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
285 lines • 40.7 kB
JavaScript
import { DateModels } from '../date/DataTypes';
import { formatDate } from '../util';
import { zh_CN } from 'ng-zorro-antd-mobile/locale-provider';
export class CalendarDatePickerBaseComponent {
constructor() {
this.props = {
prefixCls: 'rmc-calendar',
infinite: false,
infiniteOpt: false,
defaultDate: new Date(),
initalMonths: 6,
locale: zh_CN.Calendar
};
this.state = {
months: []
};
this.visibleMonth = [];
this.getDateWithoutTime = (date) => {
if (!date) {
return 0;
}
return +new Date(date.getFullYear(), date.getMonth(), date.getDate());
};
this.genWeekData = (firstDate) => {
const minDateTime = this.getDateWithoutTime(this.props.minDate);
const maxDateTime = this.getDateWithoutTime(this.props.maxDate) || Number.POSITIVE_INFINITY;
const weeks = [];
const nextMonth = this.getMonthDate(firstDate, 1).firstDate;
let currentDay = firstDate;
let currentWeek = [];
weeks.push(currentWeek);
let startWeekday = currentDay.getDay();
if (startWeekday > 0) {
for (let i = 0; i < startWeekday; i++) {
currentWeek.push({});
}
}
while (currentDay < nextMonth) {
if (currentWeek.length === 7) {
currentWeek = [];
weeks.push(currentWeek);
}
const dayOfMonth = currentDay.getDate();
const tick = +currentDay;
currentWeek.push({
tick,
dayOfMonth,
selected: DateModels.SelectType.None,
isFirstOfMonth: dayOfMonth === 1,
isLastOfMonth: false,
outOfDate: tick < minDateTime || tick > maxDateTime
});
const year = currentDay.getFullYear();
const month = currentDay.getMonth();
const date = currentDay.getDate();
currentDay = new Date(year, month, date + 1);
}
currentWeek[currentWeek.length - 1].isLastOfMonth = true;
return weeks;
};
this.selectDateRange = (startDate, endDate, clear = false) => {
const { getDateExtra, type, onSelectHasDisableDate } = this.props;
if (type === 'one') {
endDate = undefined;
}
const time1 = this.getDateWithoutTime(startDate), time2 = this.getDateWithoutTime(endDate);
const startDateTick = !time2 || time1 < time2 ? time1 : time2;
const endDateTick = time2 && time1 > time2 ? time1 : time2;
const startMonthDate = this.getMonthDate(new Date(startDateTick)).firstDate;
const endMonthDate = endDateTick ? new Date(endDateTick) : this.getMonthDate(new Date(startDateTick)).lastDate;
let unuseable = [], needUpdate = false;
this.state.months
.filter(m => {
return m.firstDate >= startMonthDate && m.firstDate <= endMonthDate;
})
.forEach(m => {
m.weeks.forEach(w => w
.filter(d => {
if (!endDateTick) {
return d.tick && this.inDate(startDateTick, d.tick);
}
else {
return d.tick && d.tick >= startDateTick && d.tick <= endDateTick;
}
})
.forEach(d => {
const oldValue = d.selected;
if (clear) {
d.selected = DateModels.SelectType.None;
}
else {
const info = (getDateExtra && getDateExtra(new Date(d.tick))) || {};
if (d.outOfDate || info.disable) {
unuseable.push(d.tick);
}
if (this.inDate(startDateTick, d.tick)) {
if (type === 'one') {
d.selected = DateModels.SelectType.Single;
}
else if (!endDateTick) {
d.selected = DateModels.SelectType.Only;
}
else if (startDateTick !== endDateTick) {
d.selected = DateModels.SelectType.Start;
}
else {
d.selected = DateModels.SelectType.All;
}
}
else if (this.inDate(endDateTick, d.tick)) {
d.selected = DateModels.SelectType.End;
}
else {
d.selected = DateModels.SelectType.Middle;
}
}
needUpdate = needUpdate || d.selected !== oldValue;
}));
if (needUpdate && m.componentRef) {
m.componentRef.updateWeeks();
}
});
if (unuseable.length > 0) {
if (onSelectHasDisableDate) {
onSelectHasDisableDate(unuseable.map(tick => new Date(tick)));
}
else {
console.warn('Unusable date. You can handle by onSelectHasDisableDate.', unuseable);
}
}
};
this.computeVisible = (clientHeight, scrollTop) => {
let needUpdate = false;
const MAX_VIEW_PORT = clientHeight * 2;
const MIN_VIEW_PORT = clientHeight;
// 大缓冲区外过滤规则
const filterFunc = (vm) => vm.y &&
vm.height &&
vm.y + vm.height > scrollTop - MAX_VIEW_PORT &&
vm.y < scrollTop + clientHeight + MAX_VIEW_PORT;
if (this.props.infiniteOpt && this.visibleMonth.length > 12) {
this.visibleMonth = this.visibleMonth.filter(filterFunc).sort((a, b) => +a.firstDate - +b.firstDate);
}
// 当小缓冲区不满时填充
if (this.visibleMonth.length > 0) {
const last = this.visibleMonth[this.visibleMonth.length - 1];
if (last.y !== undefined && last.height && last.y + last.height < scrollTop + clientHeight + MIN_VIEW_PORT) {
const lastIndex = this.state.months.indexOf(last);
for (let i = 1; i <= 2; i++) {
const index = lastIndex + i;
if (index < this.state.months.length && this.visibleMonth.indexOf(this.state.months[index]) < 0) {
this.visibleMonth.push(this.state.months[index]);
}
else {
if (this.canLoadNext()) {
this.genMonthData(undefined, 1);
}
}
}
needUpdate = true;
}
const first = this.visibleMonth[0];
if (first.y !== undefined && first.height && first.y > scrollTop - MIN_VIEW_PORT) {
const firstIndex = this.state.months.indexOf(first);
for (let i = 1; i <= 2; i++) {
const index = firstIndex - i;
if (index >= 0 && this.visibleMonth.indexOf(this.state.months[index]) < 0) {
this.visibleMonth.unshift(this.state.months[index]);
needUpdate = true;
}
}
}
}
else if (this.state.months.length > 0) {
this.visibleMonth = this.state.months.filter(filterFunc);
needUpdate = true;
}
return needUpdate;
};
this.createOnScroll = () => {
// let timer: any;
let clientHeight = 0, scrollTop = 0;
return (data) => {
const { client, top } = data;
clientHeight = client;
scrollTop = top;
this.computeVisible(clientHeight, scrollTop);
// 以上方法目前无问题,如果后续有性能问题,改用如下方法,但以下方法会导致刷新稍微延迟现象
// if (timer) {
// return;
// }
//
// timer = setTimeout(() => {
// timer = undefined;
//
// if (this.computeVisible(clientHeight, scrollTop)) {
// console.log('update dom');
// }
// }, 50);
};
};
this.baseOnCellClick = (day) => {
if (!day.tick) {
return;
}
if (this.props.onCellClick) {
this.props.onCellClick(new Date(day.tick));
}
};
}
init() {
const { initalMonths = 6, defaultDate } = this.props;
for (let i = 0; i < initalMonths; i++) {
if (this.canLoadNext()) {
this.genMonthData(defaultDate, i);
}
}
this.visibleMonth = [...this.state.months];
}
receiveProps(oldValue, newValue) {
if (oldValue && newValue) {
if (oldValue.startDate !== newValue.startDate || oldValue.endDate !== newValue.endDate) {
if (oldValue.startDate) {
this.selectDateRange(oldValue.startDate, oldValue.endDate, true);
}
if (newValue.startDate) {
this.selectDateRange(newValue.startDate, newValue.endDate);
}
}
}
}
getMonthDate(date = new Date(), addMonth = 0) {
const y = date.getFullYear(), m = date.getMonth();
return {
firstDate: new Date(y, m + addMonth, 1),
lastDate: new Date(y, m + 1 + addMonth, 0)
};
}
canLoadPrev() {
const { minDate } = this.props;
return (!minDate ||
this.state.months.length <= 0 ||
+this.getMonthDate(minDate).firstDate < +this.state.months[0].firstDate);
}
canLoadNext() {
const { maxDate } = this.props;
return (!maxDate ||
this.state.months.length <= 0 ||
+this.getMonthDate(maxDate).firstDate > +this.state.months[this.state.months.length - 1].firstDate);
}
genMonthData(date, addMonth = 0) {
if (!date) {
date = addMonth >= 0 ? this.state.months[this.state.months.length - 1].firstDate : this.state.months[0].firstDate;
}
if (!date) {
date = new Date();
}
const { locale } = this.props;
const { firstDate, lastDate } = this.getMonthDate(date, addMonth);
const weeks = this.genWeekData(firstDate);
const title = formatDate(firstDate, locale ? locale.monthTitle : 'yyyy/MM', this.props.locale);
const data = {
title,
firstDate,
lastDate,
weeks
};
data.component = this.genMonthComponent(data);
if (addMonth >= 0) {
this.state.months.push(data);
}
else {
this.state.months.unshift(data);
}
const { startDate, endDate } = this.props;
if (startDate) {
this.selectDateRange(startDate, endDate);
}
return data;
}
inDate(date, tick) {
return date <= tick && tick < date + 24 * 3600000;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY2FsZW5kYXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQU03RCxNQUFNLE9BQU8sK0JBQStCO0lBaUIxQztRQWhCQSxVQUFLLEdBQUc7WUFDTixTQUFTLEVBQUUsY0FBYztZQUN6QixRQUFRLEVBQUUsS0FBSztZQUNmLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtZQUN2QixZQUFZLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUTtTQUNBLENBQUM7UUFFekIsVUFBSyxHQUFRO1lBQ1gsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBRUYsaUJBQVksR0FBMkIsRUFBRSxDQUFDO1FBdUQxQyx1QkFBa0IsR0FBRyxDQUFDLElBQVcsRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLENBQUM7YUFDVjtZQUNELE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQztRQUVGLGdCQUFXLEdBQUcsQ0FBQyxTQUFlLEVBQUUsRUFBRTtZQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMs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QUksR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3BELENBQUM7Q0FpS0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlTW9kZWxzIH0gZnJvbSAnLi4vZGF0ZS9EYXRhVHlwZXMnO1xuaW1wb3J0IHsgRGF0ZXBpY2tlclByb3BzVHlwZSB9IGZyb20gJy4vZGF0ZXBpY2tlci5wcm9wcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgemhfQ04gfSBmcm9tICduZy16b3Jyby1hbnRkLW1vYmlsZS9sb2NhbGUtcHJvdmlkZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVwaWNrZXJTdGF0ZVR5cGUge1xuICBtb250aHM6IERhdGVNb2RlbHMuTW9udGhEYXRhW107XG59XG5cbmV4cG9ydCBjbGFzcyBDYWxlbmRhckRhdGVQaWNrZXJCYXNlQ29tcG9uZW50IHtcbiAgcHJvcHMgPSB7XG4gICAgcHJlZml4Q2xzOiAncm1jLWNhbGVuZGFyJyxcbiAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgaW5maW5pdGVPcHQ6IGZhbHNlLFxuICAgIGRlZmF1bHREYXRlOiBuZXcgRGF0ZSgpLFxuICAgIGluaXRhbE1vbnRoczogNixcbiAgICBsb2NhbGU6IHpoX0NOLkNhbGVuZGFyXG4gIH0gYXMgRGF0ZXBpY2tlclByb3BzVHlwZTtcblxuICBzdGF0ZTogYW55ID0ge1xuICAgIG1vbnRoczogW11cbiAgfTtcblxuICB2aXNpYmxlTW9udGg6IERhdGVNb2RlbHMuTW9udGhEYXRhW10gPSBbXTtcbiAgZ2VuTW9udGhDb21wb25lbnQ6IChkYXRhKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgaW5pdCgpIHtcbiAgICBjb25zdCB7IGluaXRhbE1vbnRocyA9IDYsIGRlZmF1bHREYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdGFsTW9udGhzOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNhbkxvYWROZXh0KCkpIHtcbiAgICAgICAgdGhpcy5nZW5Nb250aERhdGEoZGVmYXVsdERhdGUsIGkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnZpc2libGVNb250aCA9IFsuLi50aGlzLnN0YXRlLm1vbnRoc107XG4gIH1cblxuICByZWNlaXZlUHJvcHMob2xkVmFsdWU6IERhdGVwaWNrZXJQcm9wc1R5cGUsIG5ld1ZhbHVlOiBEYXRlcGlja2VyUHJvcHNUeXBlKSB7XG4gICAgaWYgKG9sZFZhbHVlICYmIG5ld1ZhbHVlKSB7XG4gICAgICBpZiAob2xkVmFsdWUuc3RhcnREYXRlICE9PSBuZXdWYWx1ZS5zdGFydERhdGUgfHwgb2xkVmFsdWUuZW5kRGF0ZSAhPT0gbmV3VmFsdWUuZW5kRGF0ZSkge1xuICAgICAgICBpZiAob2xkVmFsdWUuc3RhcnREYXRlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlUmFuZ2Uob2xkVmFsdWUuc3RhcnREYXRlLCBvbGRWYWx1ZS5lbmREYXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3VmFsdWUuc3RhcnREYXRlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlUmFuZ2UobmV3VmFsdWUuc3RhcnREYXRlLCBuZXdWYWx1ZS5lbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldE1vbnRoRGF0ZShkYXRlID0gbmV3IERhdGUoKSwgYWRkTW9udGggPSAwKSB7XG4gICAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG0gPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0RGF0ZTogbmV3IERhdGUoeSwgbSArIGFkZE1vbnRoLCAxKSxcbiAgICAgIGxhc3REYXRlOiBuZXcgRGF0ZSh5LCBtICsgMSArIGFkZE1vbnRoLCAwKVxuICAgIH07XG4gIH1cblxuICBjYW5Mb2FkUHJldigpIHtcbiAgICBjb25zdCB7IG1pbkRhdGUgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgICFtaW5EYXRlIHx8XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggPD0gMCB8fFxuICAgICAgK3RoaXMuZ2V0TW9udGhEYXRlKG1pbkRhdGUpLmZpcnN0RGF0ZSA8ICt0aGlzLnN0YXRlLm1vbnRoc1swXS5maXJzdERhdGVcbiAgICApO1xuICB9XG5cbiAgY2FuTG9hZE5leHQoKSB7XG4gICAgY29uc3QgeyBtYXhEYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICAhbWF4RGF0ZSB8fFxuICAgICAgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIDw9IDAgfHxcbiAgICAgICt0aGlzLmdldE1vbnRoRGF0ZShtYXhEYXRlKS5maXJzdERhdGUgPiArdGhpcy5zdGF0ZS5tb250aHNbdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIC0gMV0uZmlyc3REYXRlXG4gICAgKTtcbiAgfVxuXG4gIGdldERhdGVXaXRob3V0VGltZSA9IChkYXRlPzogRGF0ZSkgPT4ge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiArbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbiAgfTtcblxuICBnZW5XZWVrRGF0YSA9IChmaXJzdERhdGU6IERhdGUpID0+IHtcbiAgICBjb25zdCBtaW5EYXRlVGltZSA9IHRoaXMuZ2V0RGF0ZVdpdGhvdXRUaW1lKHRoaXMucHJvcHMubWluRGF0ZSk7XG4gICAgY29uc3QgbWF4RGF0ZVRpbWUgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZSh0aGlzLnByb3BzLm1heERhdGUpIHx8IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIGNvbnN0IHdlZWtzOiBEYXRlTW9kZWxzLkNlbGxEYXRhW11bXSA9IFtdO1xuICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0TW9udGhEYXRlKGZpcnN0RGF0ZSwgMSkuZmlyc3REYXRlO1xuICAgIGxldCBjdXJyZW50RGF5ID0gZmlyc3REYXRlO1xuICAgIGxldCBjdXJyZW50V2VlazogRGF0ZU1vZGVscy5DZWxsRGF0YVtdID0gW107XG4gICAgd2Vla3MucHVzaChjdXJyZW50V2Vlayk7XG5cbiAgICBsZXQgc3RhcnRXZWVrZGF5ID0gY3VycmVudERheS5nZXREYXkoKTtcbiAgICBpZiAoc3RhcnRXZWVrZGF5ID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydFdlZWtkYXk7IGkrKykge1xuICAgICAgICBjdXJyZW50V2Vlay5wdXNoKHt9IGFzIERhdGVNb2RlbHMuQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoY3VycmVudERheSA8IG5leHRNb250aCkge1xuICAgICAgaWYgKGN1cnJlbnRXZWVrLmxlbmd0aCA9PT0gNykge1xuICAgICAgICBjdXJyZW50V2VlayA9IFtdO1xuICAgICAgICB3ZWVrcy5wdXNoKGN1cnJlbnRXZWVrKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRheU9mTW9udGggPSBjdXJyZW50RGF5LmdldERhdGUoKTtcbiAgICAgIGNvbnN0IHRpY2sgPSArY3VycmVudERheTtcbiAgICAgIGN1cnJlbnRXZWVrLnB1c2goe1xuICAgICAgICB0aWNrLFxuICAgICAgICBkYXlPZk1vbnRoLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZU1vZGVscy5TZWxlY3RUeXBlLk5vbmUsXG4gICAgICAgIGlzRmlyc3RPZk1vbnRoOiBkYXlPZk1vbnRoID09PSAxLFxuICAgICAgICBpc0xhc3RPZk1vbnRoOiBmYWxzZSxcbiAgICAgICAgb3V0T2ZEYXRlOiB0aWNrIDwgbWluRGF0ZVRpbWUgfHwgdGljayA+IG1heERhdGVUaW1lXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHllYXIgPSBjdXJyZW50RGF5LmdldEZ1bGxZZWFyKCk7XG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnREYXkuZ2V0TW9udGgoKTtcbiAgICAgIGNvbnN0IGRhdGUgPSBjdXJyZW50RGF5LmdldERhdGUoKTtcbiAgICAgIGN1cnJlbnREYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSArIDEpO1xuICAgIH1cbiAgICBjdXJyZW50V2Vla1tjdXJyZW50V2Vlay5sZW5ndGggLSAxXS5pc0xhc3RPZk1vbnRoID0gdHJ1ZTtcbiAgICByZXR1cm4gd2Vla3M7XG4gIH07XG5cbiAgZ2VuTW9udGhEYXRhKGRhdGU/OiBEYXRlLCBhZGRNb250aDogbnVtYmVyID0gMCkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgZGF0ZSA9IGFkZE1vbnRoID49IDAgPyB0aGlzLnN0YXRlLm1vbnRoc1t0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggLSAxXS5maXJzdERhdGUgOiB0aGlzLnN0YXRlLm1vbnRoc1swXS5maXJzdERhdGU7XG4gICAgfVxuICAgIGlmICghZGF0ZSkge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxuICAgIGNvbnN0IHsgbG9jYWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgZmlyc3REYXRlLCBsYXN0RGF0ZSB9ID0gdGhpcy5nZXRNb250aERhdGUoZGF0ZSwgYWRkTW9udGgpO1xuICAgIGNvbnN0IHdlZWtzID0gdGhpcy5nZW5XZWVrRGF0YShmaXJzdERhdGUpO1xuICAgIGNvbnN0IHRpdGxlID0gZm9ybWF0RGF0ZShmaXJzdERhdGUsIGxvY2FsZSA/IGxvY2FsZS5tb250aFRpdGxlIDogJ3l5eXkvTU0nLCB0aGlzLnByb3BzLmxvY2FsZSk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHRpdGxlLFxuICAgICAgZmlyc3REYXRlLFxuICAgICAgbGFzdERhdGUsXG4gICAgICB3ZWVrc1xuICAgIH0gYXMgRGF0ZU1vZGVscy5Nb250aERhdGE7XG4gICAgZGF0YS5jb21wb25lbnQgPSB0aGlzLmdlbk1vbnRoQ29tcG9uZW50KGRhdGEpO1xuICAgIGlmIChhZGRNb250aCA+PSAwKSB7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy5wdXNoKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy51bnNoaWZ0KGRhdGEpO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdERhdGVSYW5nZShzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGluRGF0ZShkYXRlOiBudW1iZXIsIHRpY2s6IG51bWJlcikge1xuICAgIHJldHVybiBkYXRlIDw9IHRpY2sgJiYgdGljayA8IGRhdGUgKyAyNCAqIDM2MDAwMDA7XG4gIH1cblxuICBzZWxlY3REYXRlUmFuZ2UgPSAoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlPzogRGF0ZSwgY2xlYXIgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0RGF0ZUV4dHJhLCB0eXBlLCBvblNlbGVjdEhhc0Rpc2FibGVEYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICh0eXBlID09PSAnb25lJykge1xuICAgICAgZW5kRGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgdGltZTEgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZShzdGFydERhdGUpLFxuICAgICAgdGltZTIgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZShlbmREYXRlKTtcbiAgICBjb25zdCBzdGFydERhdGVUaWNrID0gIXRpbWUyIHx8IHRpbWUxIDwgdGltZTIgPyB0aW1lMSA6IHRpbWUyO1xuICAgIGNvbnN0IGVuZERhdGVUaWNrID0gdGltZTIgJiYgdGltZTEgPiB0aW1lMiA/IHRpbWUxIDogdGltZTI7XG5cbiAgICBjb25zdCBzdGFydE1vbnRoRGF0ZSA9IHRoaXMuZ2V0TW9udGhEYXRlKG5ldyBEYXRlKHN0YXJ0RGF0ZVRpY2spKS5maXJzdERhdGU7XG4gICAgY29uc3QgZW5kTW9udGhEYXRlID0gZW5kRGF0ZVRpY2sgPyBuZXcgRGF0ZShlbmREYXRlVGljaykgOiB0aGlzLmdldE1vbnRoRGF0ZShuZXcgRGF0ZShzdGFydERhdGVUaWNrKSkubGFzdERhdGU7XG5cbiAgICBsZXQgdW51c2VhYmxlOiBudW1iZXJbXSA9IFtdLFxuICAgICAgbmVlZFVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUubW9udGhzXG4gICAgICAuZmlsdGVyKG0gPT4ge1xuICAgICAgICByZXR1cm4gbS5maXJzdERhdGUgPj0gc3RhcnRNb250aERhdGUgJiYgbS5maXJzdERhdGUgPD0gZW5kTW9udGhEYXRlO1xuICAgICAgfSlcbiAgICAgIC5mb3JFYWNoKG0gPT4ge1xuICAgICAgICBtLndlZWtzLmZvckVhY2godyA9PlxuICAgICAgICAgIHdcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiB7XG4gICAgICAgICAgICAgIGlmICghZW5kRGF0ZVRpY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50aWNrICYmIHRoaXMuaW5EYXRlKHN0YXJ0RGF0ZVRpY2ssIGQudGljayk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQudGljayAmJiBkLnRpY2sgPj0gc3RhcnREYXRlVGljayAmJiBkLnRpY2sgPD0gZW5kRGF0ZVRpY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZm9yRWFjaChkID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBkLnNlbGVjdGVkO1xuICAgICAgICAgICAgICBpZiAoY2xlYXIpIHtcbiAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLk5vbmU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IChnZXREYXRlRXh0cmEgJiYgZ2V0RGF0ZUV4dHJhKG5ldyBEYXRlKGQudGljaykpKSB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAoZC5vdXRPZkRhdGUgfHwgaW5mby5kaXNhYmxlKSB7XG4gICAgICAgICAgICAgICAgICB1bnVzZWFibGUucHVzaChkLnRpY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbkRhdGUoc3RhcnREYXRlVGljaywgZC50aWNrKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBEYXRlTW9kZWxzLlNlbGVjdFR5cGUuU2luZ2xlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZW5kRGF0ZVRpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5Pbmx5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydERhdGVUaWNrICE9PSBlbmREYXRlVGljaykge1xuICAgICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLlN0YXJ0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5BbGw7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluRGF0ZShlbmREYXRlVGljaywgZC50aWNrKSkge1xuICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5FbmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBEYXRlTW9kZWxzLlNlbGVjdFR5cGUuTWlkZGxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZWVkVXBkYXRlID0gbmVlZFVwZGF0ZSB8fCBkLnNlbGVjdGVkICE9PSBvbGRWYWx1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChuZWVkVXBkYXRlICYmIG0uY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgbS5jb21wb25lbnRSZWYudXBkYXRlV2Vla3MoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgaWYgKHVudXNlYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAob25TZWxlY3RIYXNEaXNhYmxlRGF0ZSkge1xuICAgICAgICBvblNlbGVjdEhhc0Rpc2FibGVEYXRlKHVudXNlYWJsZS5tYXAodGljayA9PiBuZXcgRGF0ZSh0aWNrKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdVbnVzYWJsZSBkYXRlLiBZb3UgY2FuIGhhbmRsZSBieSBvblNlbGVjdEhhc0Rpc2FibGVEYXRlLicsIHVudXNlYWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbXB1dGVWaXNpYmxlID0gKGNsaWVudEhlaWdodDogbnVtYmVyLCBzY3JvbGxUb3A6IG51bWJlcikgPT4ge1xuICAgIGxldCBuZWVkVXBkYXRlID0gZmFsc2U7XG4gICAgY29uc3QgTUFYX1ZJRVdfUE9SVCA9IGNsaWVudEhlaWdodCAqIDI7XG4gICAgY29uc3QgTUlOX1ZJRVdfUE9SVCA9IGNsaWVudEhlaWdodDtcblxuICAgIC8vIOWkp+e8k+WGsuWMuuWklui/h+a7pOinhOWImVxuICAgIGNvbnN0IGZpbHRlckZ1bmMgPSAodm06IERhdGVNb2RlbHMuTW9udGhEYXRhKSA9PlxuICAgICAgdm0ueSAmJlxuICAgICAgdm0uaGVpZ2h0ICYmXG4gICAgICB2bS55ICsgdm0uaGVpZ2h0ID4gc2Nyb2xsVG9wIC0gTUFYX1ZJRVdfUE9SVCAmJlxuICAgICAgdm0ueSA8IHNjcm9sbFRvcCArIGNsaWVudEhlaWdodCArIE1BWF9WSUVXX1BPUlQ7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5pbmZpbml0ZU9wdCAmJiB0aGlzLnZpc2libGVNb250aC5sZW5ndGggPiAxMikge1xuICAgICAgdGhpcy52aXNpYmxlTW9udGggPSB0aGlzLnZpc2libGVNb250aC5maWx0ZXIoZmlsdGVyRnVuYykuc29ydCgoYSwgYikgPT4gK2EuZmlyc3REYXRlIC0gK2IuZmlyc3REYXRlKTtcbiAgICB9XG5cbiAgICAvLyDlvZPlsI/nvJPlhrLljLrkuI3mu6Hml7bloavlhYVcbiAgICBpZiAodGhpcy52aXNpYmxlTW9udGgubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMudmlzaWJsZU1vbnRoW3RoaXMudmlzaWJsZU1vbnRoLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxhc3QueSAhPT0gdW5kZWZpbmVkICYmIGxhc3QuaGVpZ2h0ICYmIGxhc3QueSArIGxhc3QuaGVpZ2h0IDwgc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0ICsgTUlOX1ZJRVdfUE9SVCkge1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLnN0YXRlLm1vbnRocy5pbmRleE9mKGxhc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAyOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGxhc3RJbmRleCArIGk7XG4gICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoICYmIHRoaXMudmlzaWJsZU1vbnRoLmluZGV4T2YodGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZU1vbnRoLnB1c2godGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuTG9hZE5leHQoKSkge1xuICAgICAgICAgICAgICB0aGlzLmdlbk1vbnRoRGF0YSh1bmRlZmluZWQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLnZpc2libGVNb250aFswXTtcbiAgICAgIGlmIChmaXJzdC55ICE9PSB1bmRlZmluZWQgJiYgZmlyc3QuaGVpZ2h0ICYmIGZpcnN0LnkgPiBzY3JvbGxUb3AgLSBNSU5fVklFV19QT1JUKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSB0aGlzLnN0YXRlLm1vbnRocy5pbmRleE9mKGZpcnN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMjsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBmaXJzdEluZGV4IC0gaTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiB0aGlzLnZpc2libGVNb250aC5pbmRleE9mKHRoaXMuc3RhdGUubW9udGhzW2luZGV4XSkgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVNb250aC51bnNoaWZ0KHRoaXMuc3RhdGUubW9udGhzW2luZGV4XSk7XG4gICAgICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUubW9udGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmlzaWJsZU1vbnRoID0gdGhpcy5zdGF0ZS5tb250aHMuZmlsdGVyKGZpbHRlckZ1bmMpO1xuICAgICAgbmVlZFVwZGF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5lZWRVcGRhdGU7XG4gIH07XG5cbiAgY3JlYXRlT25TY3JvbGwgPSAoKSA9PiB7XG4gICAgLy8gbGV0IHRpbWVyOiBhbnk7XG4gICAgbGV0IGNsaWVudEhlaWdodCA9IDAsXG4gICAgICBzY3JvbGxUb3AgPSAwO1xuXG4gICAgcmV0dXJuIChkYXRhOiB7IGZ1bGw6IG51bWJlcjsgY2xpZW50OiBudW1iZXI7IHRvcDogbnVtYmVyIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCB0b3AgfSA9IGRhdGE7XG4gICAgICBjbGllbnRIZWlnaHQgPSBjbGllbnQ7XG4gICAgICBzY3JvbGxUb3AgPSB0b3A7XG5cbiAgICAgIHRoaXMuY29tcHV0ZVZpc2libGUoY2xpZW50SGVpZ2h0LCBzY3JvbGxUb3ApO1xuXG4gICAgICAvLyDku6XkuIrmlrnms5Xnm67liY3ml6Dpl67popjvvIzlpoLmnpzlkI7nu63mnInmgKfog73pl67popjvvIzmlLnnlKjlpoLkuIvmlrnms5XvvIzkvYbku6XkuIvmlrnms5XkvJrlr7zoh7TliLfmlrDnqI3lvq7lu7bov5/njrDosaFcblxuICAgICAgLy8gaWYgKHRpbWVyKSB7XG4gICAgICAvLyAgIHJldHVybjtcbiAgICAgIC8vIH1cbiAgICAgIC8vXG4gICAgICAvLyB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIC8vXG4gICAgICAvLyAgIGlmICh0aGlzLmNvbXB1dGVWaXNpYmxlKGNsaWVudEhlaWdodCwgc2Nyb2xsVG9wKSkge1xuICAgICAgLy8gICAgIGNvbnNvbGUubG9nKCd1cGRhdGUgZG9tJyk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0sIDUwKTtcbiAgICB9O1xuICB9O1xuXG4gIGJhc2VPbkNlbGxDbGljayA9IChkYXk6IERhdGVNb2RlbHMuQ2VsbERhdGEpID0+IHtcbiAgICBpZiAoIWRheS50aWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLm9uQ2VsbENsaWNrKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2VsbENsaWNrKG5ldyBEYXRlKGRheS50aWNrKSk7XG4gICAgfVxuICB9O1xufVxuIl19