ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
463 lines (462 loc) • 44 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ElementRef, ViewEncapsulation, ViewChild, ViewContainerRef, HostListener, EventEmitter, Output } from '@angular/core';
import { PickerOptions } from './picker-options.provider';
import * as data from './demo-data/address-data';
import * as velocity from '../core/util/velocity';
import * as touchEvent from '../core/util/touch-event';
import { LocaleProviderService } from '../locale-provider/locale-provider.service';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
var PickerComponent = /** @class */ (function () {
function PickerComponent(elementRef, options, _localeProviderService) {
this.elementRef = elementRef;
this.options = options;
this._localeProviderService = _localeProviderService;
this.transitionName = 'am-slide-up-enter am-slide-up-enter-active';
this.maskTransitionName = 'am-fade-enter am-fade-enter-active';
this.address = data.getData();
this.startY = 0;
this.differY = 0;
this.currentY = 0;
this.len = 0;
this.dom = null;
this.index = 0;
this.maxY = 0;
this.lineHeight = 34;
this.data = [];
this.selectedTarget = [];
this.isMouseDown = false;
this.Velocity = velocity.getVelocity();
this._unsubscribe$ = new Subject();
this.onChange = new EventEmitter();
}
/**
* @param {?} event
* @return {?}
*/
PickerComponent.prototype.panstart = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (!event.target.classList.contains('am-picker-col-mask')) {
return;
}
this.isMouseDown = true;
event.preventDefault();
this.dom = touchEvent.getEventTarget(event).target.parentElement.children[2];
this.len = this.dom.children.length;
this.maxY = -(this.len - 1);
if (this.dom.style.transform === 'translateY(0px)') {
this.currentY = 0;
this.maxY = -(this.len - 1);
}
else if (this.selectedTarget.length > 0) {
this.selectedTarget.forEach(function (item) {
if (item.targetId === event.target.id) {
_this.currentY = item.currentY;
}
});
}
this.startY = touchEvent.getEventTarget(event).clientY;
};
/**
* @param {?} event
* @return {?}
*/
PickerComponent.prototype.panmove = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown) {
return;
}
event.preventDefault();
/** @type {?} */
var ev = touchEvent.getEventTarget(event);
this.differY = ev.clientY - this.startY;
this.Velocity.record(this.differY);
this.dom.style.transition = 'transform 0s';
this.dom.style.transform = "translateY(" + (this.currentY * this.lineHeight + this.differY) + "px)";
};
/**
* @param {?} event
* @return {?}
*/
PickerComponent.prototype.panend = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown) {
return;
}
this.isMouseDown = false;
event.preventDefault();
/** @type {?} */
var ev = touchEvent.getEventTarget(event);
this.differY = ev.clientY - this.startY;
/** @type {?} */
var time = 0.3;
/** @type {?} */
var velocityTemp = this.Velocity.getVelocity(this.differY) * 4;
if (velocity) {
this.differY = velocityTemp * 40 + this.differY;
time = Math.abs(velocityTemp) * 0.1;
}
this.dom.style.transition = 'transform ' + (time < 0.3 ? 0.3 : time) + 's';
if (this.differY <= -this.lineHeight / 2) {
this.currentY += Math.floor(this.differY / this.lineHeight);
if (this.currentY <= this.maxY) {
this.currentY = this.maxY;
}
}
else if (this.differY >= this.lineHeight / 2) {
this.currentY += Math.floor(this.differY / this.lineHeight);
if (this.currentY >= 0) {
this.currentY = 0;
}
}
if (this.selectedTarget.length > 0) {
/** @type {?} */
var hasKey_1 = false;
this.selectedTarget.forEach(function (item) {
if (item.targetId === event.target.id) {
hasKey_1 = true;
item.targetId = event.target.id;
item.currentY = _this.currentY;
}
else if (parseInt(item.targetId, 0) > parseInt(event.target.id, 0) && _this.options.cascade) {
item.currentY = 0;
}
});
if (!hasKey_1) {
this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY });
}
}
else {
this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY });
}
this.dom.style.transform = "translateY(" + this.currentY * this.lineHeight + "px)";
this.index = Math.floor(Math.abs(this.currentY / 1));
this.setCurrentSelected(parseInt(event.target.id, 0), this.index);
this.onChange.emit(this.combineReslut());
this.options.onPickerChange.emit(this.combineReslut());
};
/**
* @return {?}
*/
PickerComponent.prototype.init = /**
* @return {?}
*/
function () {
if (this.options.data.length > 0) {
this.address = this.options.data;
}
if (this.data.length > 0) {
this.selectedTarget = [];
this.data = [];
}
this.data.push(this.generateArrayData(this.address));
if (this.options.value.length > 0) {
this.getInitValueIndex(this.data);
}
else {
this.checkArrayDeep(this.address[0]);
for (var index = 0; index < this.data.length; index++) {
this.selectedTarget.push({ targetId: "" + index, currentY: 0 });
}
}
};
/**
* @param {?} dataTemp
* @return {?}
*/
PickerComponent.prototype.getInitValueIndex = /**
* @param {?} dataTemp
* @return {?}
*/
function (dataTemp) {
var _this = this;
this.selectedTarget = [];
this.options.value.forEach(function (element, i) {
dataTemp.forEach(function (item, j) {
item.forEach(function (item1, k) {
if (element === (item1.label || item1) && i === j) {
_this.checkArrayDeep(_this.data[i][k], false);
_this.selectedTarget.push({ targetId: "" + i, currentY: -k });
}
});
});
});
};
/**
* @return {?}
*/
PickerComponent.prototype.reloadPicker = /**
* @return {?}
*/
function () {
if (!this._picker || this._picker === undefined) {
return;
}
this.currentPicker = this._picker.element.nativeElement;
if (this.currentPicker && this.currentPicker.children.length > 0) {
/** @type {?} */
var self_1 = this;
setTimeout(function () {
self_1.selectedTarget.forEach(function (item, i) {
self_1.currentPicker.children[i].children[2].style.transition = 'transform .3s';
/** @type {?} */
var index = parseInt(item.currentY, 0);
self_1.currentPicker.children[i].children[2].style.transform = "translateY(" + index * self_1.lineHeight + "px)";
});
}, 0);
}
};
/**
* @param {?} targetArr
* @return {?}
*/
PickerComponent.prototype.generateArrayData = /**
* @param {?} targetArr
* @return {?}
*/
function (targetArr) {
/** @type {?} */
var tempArr = [];
if (targetArr instanceof Array) {
targetArr.forEach(function (item, i) {
if (item instanceof Array) {
/** @type {?} */
var keys = Object.keys(item);
/** @type {?} */
var element_1 = {};
keys.forEach(function (key) {
element_1[key] = targetArr[i][key] || targetArr[i];
});
tempArr.push(element_1);
}
else {
tempArr.push(item);
}
});
return tempArr;
}
return [];
};
/**
* @param {?} parent
* @param {?=} init
* @return {?}
*/
PickerComponent.prototype.checkArrayDeep = /**
* @param {?} parent
* @param {?=} init
* @return {?}
*/
function (parent, init) {
if (init === void 0) { init = true; }
if (parent instanceof Object && parent.children && parent.children.length > 0) {
if (this.generateArrayData(parent.children).length > 0 && this.data.length < this.options.cols) {
this.data.push(this.generateArrayData(parent.children));
if (init) {
this.checkArrayDeep(parent.children[0]);
}
}
}
};
/**
* @return {?}
*/
PickerComponent.prototype.ok = /**
* @return {?}
*/
function () {
this.options.onOk.emit(this.combineReslut());
if (this.options.confirm) {
this.options.confirm(this.combineReslut());
}
this.setTransitionName();
};
/**
* @return {?}
*/
PickerComponent.prototype.combineReslut = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var result = [];
this.selectedTarget.forEach(function (item) {
result.push(_this.data[parseInt(item.targetId, 0)][-item.currentY]);
});
return result;
};
/**
* @return {?}
*/
PickerComponent.prototype.cancel = /**
* @return {?}
*/
function () {
this.setTransitionName();
this.options.onDismiss.emit();
if (this.options.cancel) {
this.options.cancel();
}
};
/**
* @return {?}
*/
PickerComponent.prototype.setTransitionName = /**
* @return {?}
*/
function () {
var _this = this;
this.transitionName = 'am-slide-up-leave am-slide-up-leave-active';
this.maskTransitionName = 'am-fade-leave am-fade-leave-active';
setTimeout(function () {
_this.options.hidePicker();
}, 200);
};
/**
* @param {?} target
* @param {?} index
* @return {?}
*/
PickerComponent.prototype.setCurrentSelected = /**
* @param {?} target
* @param {?} index
* @return {?}
*/
function (target, index) {
var _this = this;
if (!this.options.cascade) {
return;
}
/** @type {?} */
var a = this.data.slice(0, target + 1);
this.data = a;
this.checkArrayDeep(this.data[target][index]);
setTimeout(function () {
_this.data.forEach(function (item, i) {
if (target !== "" + i && i > target) {
_this._picker.element.nativeElement.children[i].children[2].style.transition = 'transform .3s';
_this._picker.element.nativeElement.children[i].children[2].style.transform = 'translateY(0px)';
}
});
}, 0);
};
/**
* @return {?}
*/
PickerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.init();
this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(function (_) {
/** @type {?} */
var locale = _this._localeProviderService.getLocaleSubObj('Picker');
_this.options.okText = locale.okText;
_this.options.dismissText = locale.dismissText;
});
};
/**
* @return {?}
*/
PickerComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.reloadPicker();
};
/**
* @return {?}
*/
PickerComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this._unsubscribe$.next();
this._unsubscribe$.complete();
};
PickerComponent.decorators = [
{ type: Component, args: [{
selector: 'Picker',
template: "<div *ngIf=\"options.mask\" class=\"am-picker-popup-mask {{maskTransitionName}}\" (click)=\"cancel()\"></div>\n<div class=\"am-picker-popup {{transitionName}}\" style=\"z-index: 1001\">\n <div class=\"am-picker-popup-content\">\n <div class=\"am-picker-popup-body\">\n <div>\n <div class=\"am-picker-popup-header\">\n <div class=\"am-picker-popup-item am-picker-popup-header-left\" (click)=\"cancel()\">{{options.dismissText}}</div>\n <div class=\"am-picker-popup-item am-picker-popup-title\">{{options.title}}</div>\n <div class=\"am-picker-popup-item am-picker-popup-header-right\" (click)=\"ok()\">{{options.okText}}</div>\n </div>\n <div class=\"am-picker\" style=\"flex-direction: row; align-items: center;\" #picker>\n <div *ngFor=\"let item of data; let i = index\" class=\"am-picker-col\">\n <div class=\"am-picker-col-indicator \" style=\"top: 102px;\" [ngStyle]=\"options.indicatorStyle\"></div>\n <div class=\"am-picker-col-mask\" style=\"background-size: 100% 102px;\" id={{i}}></div>\n <div class=\"am-picker-col-content\">\n <div *ngFor=\"let val of item; let i = index\" class=\"am-picker-col-item\" id={{i}}>{{val.label?val.label:val}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
PickerComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: PickerOptions },
{ type: LocaleProviderService }
]; };
PickerComponent.propDecorators = {
_picker: [{ type: ViewChild, args: ['picker', { read: ViewContainerRef },] }],
onChange: [{ type: Output }],
panstart: [{ type: HostListener, args: ['mousedown', ['$event'],] }, { type: HostListener, args: ['touchstart', ['$event'],] }],
panmove: [{ type: HostListener, args: ['mousemove', ['$event'],] }, { type: HostListener, args: ['touchmove', ['$event'],] }],
panend: [{ type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['mouseleave', ['$event'],] }, { type: HostListener, args: ['touchend', ['$event'],] }]
};
return PickerComponent;
}());
export { PickerComponent };
if (false) {
/** @type {?} */
PickerComponent.prototype.transitionName;
/** @type {?} */
PickerComponent.prototype.maskTransitionName;
/** @type {?} */
PickerComponent.prototype.address;
/** @type {?} */
PickerComponent.prototype.startY;
/** @type {?} */
PickerComponent.prototype.differY;
/** @type {?} */
PickerComponent.prototype.currentY;
/** @type {?} */
PickerComponent.prototype.len;
/** @type {?} */
PickerComponent.prototype.dom;
/** @type {?} */
PickerComponent.prototype.index;
/** @type {?} */
PickerComponent.prototype.maxY;
/** @type {?} */
PickerComponent.prototype.lineHeight;
/** @type {?} */
PickerComponent.prototype.data;
/** @type {?} */
PickerComponent.prototype.selectedTarget;
/** @type {?} */
PickerComponent.prototype.isMouseDown;
/** @type {?} */
PickerComponent.prototype.Velocity;
/** @type {?} */
PickerComponent.prototype.currentPicker;
/** @type {?} */
PickerComponent.prototype._unsubscribe$;
/** @type {?} */
PickerComponent.prototype._picker;
/** @type {?} */
PickerComponent.prototype.onChange;
/** @type {?} */
PickerComponent.prototype.elementRef;
/** @type {?} */
PickerComponent.prototype.options;
/** @type {?} */
PickerComponent.prototype._localeProviderService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsicGlja2VyL3BpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLFlBQVksRUFFWixZQUFZLEVBQ1osTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEtBQUssSUFBSSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxRQUFRLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFVBQVUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7SUE2SDdCLHlCQUFtQixVQUFzQixFQUFTLE9BQXNCLEVBQVUsc0JBQTZDO1FBQTVHLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBUyxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQVUsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF1Qjs4QkFySHRHLDRDQUE0QztrQ0FDeEMsb0NBQW9DO3VCQUNoRCxJQUFJLENBQUMsT0FBTyxFQUFFO3NCQUNkLENBQUM7dUJBQ0EsQ0FBQzt3QkFDQSxDQUFDO21CQUNOLENBQUM7bUJBQ0osSUFBSTtxQkFDQyxDQUFDO29CQUNGLENBQUM7MEJBQ0ssRUFBRTtvQkFDVCxFQUFFOzhCQUNRLEVBQUU7MkJBQ0gsS0FBSzt3QkFDakIsUUFBUSxDQUFDLFdBQVcsRUFBRTs2QkFHTSxJQUFJLE9BQU8s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Y2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBBZnRlclZpZXdJbml0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGlja2VyT3B0aW9ucyB9IGZyb20gJy4vcGlja2VyLW9wdGlvbnMucHJvdmlkZXInO1xuaW1wb3J0ICogYXMgZGF0YSBmcm9tICcuL2RlbW8tZGF0YS9hZGRyZXNzLWRhdGEnO1xuaW1wb3J0ICogYXMgdmVsb2NpdHkgZnJvbSAnLi4vY29yZS91dGlsL3ZlbG9jaXR5JztcbmltcG9ydCAqIGFzIHRvdWNoRXZlbnQgZnJvbSAnLi4vY29yZS91dGlsL3RvdWNoLWV2ZW50JztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1BpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgdHJhbnNpdGlvbk5hbWU6IHN0cmluZyA9ICdhbS1zbGlkZS11cC1lbnRlciBhbS1zbGlkZS11cC1lbnRlci1hY3RpdmUnO1xuICBtYXNrVHJhbnNpdGlvbk5hbWU6IHN0cmluZyA9ICdhbS1mYWRlLWVudGVyIGFtLWZhZGUtZW50ZXItYWN0aXZlJztcbiAgYWRkcmVzczogYW55W10gPSBkYXRhLmdldERhdGEoKTtcbiAgc3RhcnRZOiBudW1iZXIgPSAwO1xuICBkaWZmZXJZOiBudW1iZXIgPSAwO1xuICBjdXJyZW50WTogbnVtYmVyID0gMDtcbiAgbGVuOiBudW1iZXIgPSAwO1xuICBkb206IGFueSA9IG51bGw7XG4gIGluZGV4OiBudW1iZXIgPSAwO1xuICBtYXhZOiBudW1iZXIgPSAwO1xuICBsaW5lSGVpZ2h0OiBudW1iZXIgPSAzNDtcbiAgZGF0YTogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRUYXJnZXQ6IGFueVtdID0gW107XG4gIGlzTW91c2VEb3duOiBib29sZWFuID0gZmFsc2U7XG4gIFZlbG9jaXR5ID0gdmVsb2NpdHkuZ2V0VmVsb2NpdHkoKTtcbiAgY3VycmVudFBpY2tlcjogYW55O1xuXG4gIHByaXZhdGUgX3Vuc3Vic2NyaWJlJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgncGlja2VyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHByaXZhdGUgX3BpY2tlcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBbJyRldmVudCddKVxuICBwYW5zdGFydChldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc01vdXNlRG93biA9IHRydWU7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRvbSA9IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLnRhcmdldC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuWzJdO1xuICAgIHRoaXMubGVuID0gdGhpcy5kb20uY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHRoaXMubWF4WSA9IC0odGhpcy5sZW4gLSAxKTtcblxuICAgIGlmICh0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPT09ICd0cmFuc2xhdGVZKDBweCknKSB7XG4gICAgICB0aGlzLmN1cnJlbnRZID0gMDtcbiAgICAgIHRoaXMubWF4WSA9IC0odGhpcy5sZW4gLSAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYXJnZXQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS50YXJnZXRJZCA9PT0gZXZlbnQudGFyZ2V0LmlkKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50WSA9IGl0ZW0uY3VycmVudFk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0WSA9IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLmNsaWVudFk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZW1vdmUnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxuICBwYW5tb3ZlKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhbS1waWNrZXItY29sLW1hc2snKSB8fCAhdGhpcy5pc01vdXNlRG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGV2ID0gdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCk7XG4gICAgdGhpcy5kaWZmZXJZID0gZXYuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIHRoaXMuVmVsb2NpdHkucmVjb3JkKHRoaXMuZGlmZmVyWSk7XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gMHMnO1xuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGhpcy5jdXJyZW50WSAqIHRoaXMubGluZUhlaWdodCArIHRoaXMuZGlmZmVyWX1weClgO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gIHBhbmVuZChldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgIXRoaXMuaXNNb3VzZURvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc01vdXNlRG93biA9IGZhbHNlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZXYgPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICB0aGlzLmRpZmZlclkgPSBldi5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgbGV0IHRpbWUgPSAwLjM7XG4gICAgY29uc3QgdmVsb2NpdHlUZW1wID0gdGhpcy5WZWxvY2l0eS5nZXRWZWxvY2l0eSh0aGlzLmRpZmZlclkpICogNDtcbiAgICBpZiAodmVsb2NpdHkpIHtcbiAgICAgIHRoaXMuZGlmZmVyWSA9IHZlbG9jaXR5VGVtcCAqIDQwICsgdGhpcy5kaWZmZXJZO1xuICAgICAgdGltZSA9IE1hdGguYWJzKHZlbG9jaXR5VGVtcCkgKiAwLjE7XG4gICAgfVxuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtICcgKyAodGltZSA8IDAuMyA/IDAuMyA6IHRpbWUpICsgJ3MnO1xuICAgIGlmICh0aGlzLmRpZmZlclkgPD0gLXRoaXMubGluZUhlaWdodCAvIDIpIHtcbiAgICAgIHRoaXMuY3VycmVudFkgKz0gTWF0aC5mbG9vcih0aGlzLmRpZmZlclkgLyB0aGlzLmxpbmVIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMuY3VycmVudFkgPD0gdGhpcy5tYXhZKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFkgPSB0aGlzLm1heFk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmRpZmZlclkgPj0gdGhpcy5saW5lSGVpZ2h0IC8gMikge1xuICAgICAgdGhpcy5jdXJyZW50WSArPSBNYXRoLmZsb29yKHRoaXMuZGlmZmVyWSAvIHRoaXMubGluZUhlaWdodCk7XG4gICAgICBpZiAodGhpcy5jdXJyZW50WSA+PSAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgaGFzS2V5ID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnRhcmdldElkID09PSBldmVudC50YXJnZXQuaWQpIHtcbiAgICAgICAgICBoYXNLZXkgPSB0cnVlO1xuICAgICAgICAgIGl0ZW0udGFyZ2V0SWQgPSBldmVudC50YXJnZXQuaWQ7XG4gICAgICAgICAgaXRlbS5jdXJyZW50WSA9IHRoaXMuY3VycmVudFk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoaXRlbS50YXJnZXRJZCwgMCkgPiBwYXJzZUludChldmVudC50YXJnZXQuaWQsIDApICYmIHRoaXMub3B0aW9ucy5jYXNjYWRlKSB7XG4gICAgICAgICAgaXRlbS5jdXJyZW50WSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFoYXNLZXkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGV2ZW50LnRhcmdldC5pZCwgY3VycmVudFk6IHRoaXMuY3VycmVudFkgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBldmVudC50YXJnZXQuaWQsIGN1cnJlbnRZOiB0aGlzLmN1cnJlbnRZIH0pO1xuICAgIH1cbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RoaXMuY3VycmVudFkgKiB0aGlzLmxpbmVIZWlnaHR9cHgpYDtcbiAgICB0aGlzLmluZGV4ID0gTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmN1cnJlbnRZIC8gMSkpO1xuICAgIHRoaXMuc2V0Q3VycmVudFNlbGVjdGVkKHBhcnNlSW50KGV2ZW50LnRhcmdldC5pZCwgMCksIHRoaXMuaW5kZXgpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgdGhpcy5vcHRpb25zLm9uUGlja2VyQ2hhbmdlLmVtaXQodGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHB1YmxpYyBvcHRpb25zOiBQaWNrZXJPcHRpb25zLCBwcml2YXRlIF9sb2NhbGVQcm92aWRlclNlcnZpY2U6IExvY2FsZVByb3ZpZGVyU2VydmljZSkge1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hZGRyZXNzID0gdGhpcy5vcHRpb25zLmRhdGE7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldCA9IFtdO1xuICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgfVxuICAgIHRoaXMuZGF0YS5wdXNoKHRoaXMuZ2VuZXJhdGVBcnJheURhdGEodGhpcy5hZGRyZXNzKSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmdldEluaXRWYWx1ZUluZGV4KHRoaXMuZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hlY2tBcnJheURlZXAodGhpcy5hZGRyZXNzWzBdKTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmRhdGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBgJHtpbmRleH1gLCBjdXJyZW50WTogMCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbml0VmFsdWVJbmRleChkYXRhVGVtcCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCwgaSkgPT4ge1xuICAgICAgZGF0YVRlbXAuZm9yRWFjaCgoaXRlbSwgaikgPT4ge1xuICAgICAgICBpdGVtLmZvckVhY2goKGl0ZW0xLCBrKSA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IChpdGVtMS5sYWJlbCB8fCBpdGVtMSkgJiYgaSA9PT0gaikge1xuICAgICAgICAgICAgdGhpcy5jaGVja0FycmF5RGVlcCh0aGlzLmRhdGFbaV1ba10sIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBgJHtpfWAsIGN1cnJlbnRZOiAtayB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWxvYWRQaWNrZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9waWNrZXIgfHwgdGhpcy5fcGlja2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGlja2VyID0gdGhpcy5fcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5jdXJyZW50UGlja2VyICYmIHRoaXMuY3VycmVudFBpY2tlci5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gLjNzJztcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGl0ZW0uY3VycmVudFksIDApO1xuICAgICAgICAgIHNlbGYuY3VycmVudFBpY2tlci5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke2luZGV4ICogc2VsZi5saW5lSGVpZ2h0fXB4KWA7XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVBcnJheURhdGEodGFyZ2V0QXJyKSB7XG4gICAgY29uc3QgdGVtcEFyciA9IFtdO1xuICAgIGlmICh0YXJnZXRBcnIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdGFyZ2V0QXJyLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0ge307XG4gICAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50W2tleV0gPSB0YXJnZXRBcnJbaV1ba2V5XSB8fCB0YXJnZXRBcnJbaV07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGVtcEFyci5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlbXBBcnIucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGVtcEFycjtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY2hlY2tBcnJheURlZXAocGFyZW50LCBpbml0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBPYmplY3QgJiYgcGFyZW50LmNoaWxkcmVuICYmIHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5nZW5lcmF0ZUFycmF5RGF0YShwYXJlbnQuY2hpbGRyZW4pLmxlbmd0aCA+IDAgJiYgdGhpcy5kYXRhLmxlbmd0aCA8IHRoaXMub3B0aW9ucy5jb2xzKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKHRoaXMuZ2VuZXJhdGVBcnJheURhdGEocGFyZW50LmNoaWxkcmVuKSk7XG4gICAgICAgIGlmIChpbml0KSB7XG4gICAgICAgICAgdGhpcy5jaGVja0FycmF5RGVlcChwYXJlbnQuY2hpbGRyZW5bMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb2soKSB7XG4gICAgdGhpcy5vcHRpb25zLm9uT2suZW1pdCh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb25maXJtKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY29uZmlybSh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgfVxuICAgIHRoaXMuc2V0VHJhbnNpdGlvbk5hbWUoKTtcbiAgfVxuXG4gIGNvbWJpbmVSZXNsdXQoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5kYXRhW3BhcnNlSW50KGl0ZW0udGFyZ2V0SWQsIDApXVstaXRlbS5jdXJyZW50WV0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uTmFtZSgpO1xuICAgIHRoaXMub3B0aW9ucy5vbkRpc21pc3MuZW1pdCgpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FuY2VsKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY2FuY2VsKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9ICdhbS1zbGlkZS11cC1sZWF2ZSBhbS1zbGlkZS11cC1sZWF2ZS1hY3RpdmUnO1xuICAgIHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gJ2FtLWZhZGUtbGVhdmUgYW0tZmFkZS1sZWF2ZS1hY3RpdmUnO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLmhpZGVQaWNrZXIoKTtcbiAgICB9LCAyMDApO1xuICB9XG5cbiAgc2V0Q3VycmVudFNlbGVjdGVkKHRhcmdldCwgaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5jYXNjYWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGEgPSB0aGlzLmRhdGEuc2xpY2UoMCwgdGFyZ2V0ICsgMSk7XG4gICAgdGhpcy5kYXRhID0gYTtcbiAgICB0aGlzLmNoZWNrQXJyYXlEZWVwKHRoaXMuZGF0YVt0YXJnZXRdW2luZGV4XSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBgJHtpfWAgJiYgaSA+IHRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX3BpY2tlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gLjNzJztcbiAgICAgICAgICB0aGlzLl9waWNrZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKDBweCknO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMuX2xvY2FsZVByb3ZpZGVyU2VydmljZS5sb2NhbGVDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgY29uc3QgbG9jYWxlOiBhbnkgPSB0aGlzLl9sb2NhbGVQcm92aWRlclNlcnZpY2UuZ2V0TG9jYWxlU3ViT2JqKCdQaWNrZXInKTtcbiAgICAgIHRoaXMub3B0aW9ucy5va1RleHQgPSBsb2NhbGUub2tUZXh0O1xuICAgICAgdGhpcy5vcHRpb25zLmRpc21pc3NUZXh0ID0gbG9jYWxlLmRpc21pc3NUZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucmVsb2FkUGlja2VyKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=