ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
532 lines • 34.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, HostBinding, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
var StepperComponent = /** @class */ (function () {
function StepperComponent() {
this.prefixCls = 'am-stepper';
this._max = Infinity;
this._min = -Infinity;
this._step = 1;
this._disabled = false;
this._readOnly = false;
this._showNumber = false;
this._upDisabled = false;
this._downDisabled = false;
this._isUpClick = false;
this._isDownClick = false;
this.onChange = new EventEmitter();
this.clsStepper = true;
this.clsStpDisabled = this._disabled;
this.clsShowNum = this._showNumber;
this.onChangeFn = (/**
* @return {?}
*/
function () { });
this.onTouchFn = (/**
* @return {?}
*/
function () { });
}
Object.defineProperty(StepperComponent.prototype, "max", {
get: /**
* @return {?}
*/
function () {
return this._max;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._max = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StepperComponent.prototype, "min", {
get: /**
* @return {?}
*/
function () {
return this._min;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._min = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StepperComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this._value;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
this._value = v;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StepperComponent.prototype, "step", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._step = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StepperComponent.prototype, "defaultValue", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
this._defaultValue = value;
this._value = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(StepperComponent.prototype, "disabled", {
get: /**
* @return {?}
*/
function () {
return this._disabled;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
this._downDisabled = value;
this._upDisabled = value;
}
this._disabled = value;
this.clsStpDisabled = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StepperComponent.prototype, "readOnly", {
get: /**
* @return {?}
*/
function () {
return this._readOnly;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._readOnly = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StepperComponent.prototype, "showNumber", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._showNumber = value;
this.clsShowNum = value;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
StepperComponent.prototype.onIncrease = /**
* @return {?}
*/
function () {
var _this = this;
if (!this._upDisabled) {
this._value = this.plus(this._value, this._step);
this.onChange.emit(this._value);
this.onChangeFn(this._value);
if (this.plus(this._value, this._step) > this._max) {
this._upDisabled = true;
}
if (this.minus(this._value, this._step) >= this._min) {
this._downDisabled = false;
}
this._isUpClick = true;
this.setCls();
setTimeout((/**
* @return {?}
*/
function () {
_this._isUpClick = false;
_this.setCls();
}), 100);
}
};
/**
* @return {?}
*/
StepperComponent.prototype.onDecrease = /**
* @return {?}
*/
function () {
var _this = this;
if (!this._downDisabled) {
this._value = this.minus(this._value, this._step);
this.onChange.emit(this._value);
this.onChangeFn(this._value);
if (this.minus(this._value, this._step) < this._min) {
this._downDisabled = true;
}
if (this.plus(this._value, this._step) <= this._max) {
this._upDisabled = false;
}
this._isDownClick = true;
this.setCls();
setTimeout((/**
* @return {?}
*/
function () {
_this._isDownClick = false;
_this.setCls();
}), 100);
}
};
/**
* @param {?} event
* @return {?}
*/
StepperComponent.prototype.inputChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var value = event.target.value;
this._value = value ? parseInt(value, null) : 0;
if (value < this._min) {
this._value = this._min;
}
if (value > this._max) {
this._value = this._max;
}
this.onChange.emit(this._value);
this.onChangeFn(this._value);
};
/**
* @return {?}
*/
StepperComponent.prototype.setCls = /**
* @return {?}
*/
function () {
var _a, _b;
this.upDisableCls = (_a = {},
_a[this.prefixCls + "-handler-up-disabled"] = this._upDisabled,
_a[this.prefixCls + "-handler-active"] = this._isUpClick,
_a);
this.downDisableCls = (_b = {},
_b[this.prefixCls + "-handler-down-disabled"] = this._downDisabled,
_b[this.prefixCls + "-handler-active"] = this._isDownClick,
_b);
};
/**
* @return {?}
*/
StepperComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
if (this._disabled) {
this._downDisabled = true;
this._upDisabled = true;
}
else {
this._upDisabled = this.plus(this._value, this._step) > this._max ? true : false;
this._downDisabled = this.minus(this._value, this._step) < this._min ? true : false;
}
this.setCls();
};
/**
* @param {?} value
* @return {?}
*/
StepperComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this._value = value;
this.ngOnChanges();
};
/**
* @param {?} fn
* @return {?}
*/
StepperComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeFn = fn;
};
/**
* @param {?} fn
* @return {?}
*/
StepperComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchFn = fn;
};
/**
* @param {?} num1
* @param {?} num2
* @return {?}
*/
StepperComponent.prototype.plus = /**
* @param {?} num1
* @param {?} num2
* @return {?}
*/
function (num1, num2) {
if (num1 === undefined || num1 === null || num2 === undefined || num2 === null) {
return;
}
/** @type {?} */
var baseNum = Math.pow(10, Math.max(this.digitLength(num1), this.digitLength(num2)));
return (this.times(num1, baseNum) + this.times(num2, baseNum)) / baseNum;
};
/**
* @param {?} num1
* @param {?} num2
* @return {?}
*/
StepperComponent.prototype.minus = /**
* @param {?} num1
* @param {?} num2
* @return {?}
*/
function (num1, num2) {
if (num1 === undefined || num1 === null || num2 === undefined || num2 === null) {
return;
}
/** @type {?} */
var baseNum = Math.pow(10, Math.max(this.digitLength(num1), this.digitLength(num2)));
return (this.times(num1, baseNum) - this.times(num2, baseNum)) / baseNum;
};
/**
* @param {?} num
* @return {?}
*/
StepperComponent.prototype.digitLength = /**
* @param {?} num
* @return {?}
*/
function (num) {
/** @type {?} */
var eSplit = num.toString().split(/[eE]/);
/** @type {?} */
var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
return len > 0 ? len : 0;
};
/**
* @param {?} num1
* @param {?} num2
* @return {?}
*/
StepperComponent.prototype.times = /**
* @param {?} num1
* @param {?} num2
* @return {?}
*/
function (num1, num2) {
/** @type {?} */
var num1Changed = this.floatToFixed(num1);
/** @type {?} */
var num2Changed = this.floatToFixed(num2);
/** @type {?} */
var baseNum = this.digitLength(num1) + this.digitLength(num2);
/** @type {?} */
var leftValue = num1Changed * num2Changed;
return leftValue / Math.pow(10, baseNum);
};
/**
* @param {?} num
* @return {?}
*/
StepperComponent.prototype.floatToFixed = /**
* @param {?} num
* @return {?}
*/
function (num) {
if (num.toString().indexOf('e') === -1) {
return Number(num.toString().replace('.', ''));
}
/** @type {?} */
var dLen = this.digitLength(num);
return dLen > 0 ? this.strip(num * Math.pow(10, dLen)) : num;
};
/**
* @param {?} num
* @param {?=} precision
* @return {?}
*/
StepperComponent.prototype.strip = /**
* @param {?} num
* @param {?=} precision
* @return {?}
*/
function (num, precision) {
if (precision === void 0) { precision = 12; }
return +parseFloat(num.toPrecision(precision));
};
StepperComponent.decorators = [
{ type: Component, args: [{
selector: 'Stepper, nzm-stepper',
template: "<div class=\"{{ prefixCls }}-handler-wrap\">\n <span\n role=\"button\"\n class=\"{{ prefixCls }}-handler {{ prefixCls }}-handler-up\"\n style=\"line-height:28px;\"\n [ngClass]=\"upDisableCls\"\n (click)=\"onIncrease()\"\n >\n <Icon [type]=\"'plus'\" [size]=\"'xxs'\"> </Icon>\n </span>\n <span\n role=\"button\"\n class=\"{{ prefixCls }}-handler {{ prefixCls }}-handler-down\"\n style=\"line-height:28px;\"\n [ngClass]=\"downDisableCls\"\n (click)=\"onDecrease()\"\n >\n <Icon [type]=\"'minus'\" [size]=\"'xxs'\"> </Icon>\n </span>\n</div>\n<div class=\"{{ prefixCls }}-input-wrap\">\n <input\n class=\"{{ prefixCls }}-input\"\n style=\"outline:none\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [autocomplete]=\"'off'\"\n [max]=\"max\"\n [min]=\"min\"\n [(ngModel)]=\"value\"\n (change)=\"inputChange($event)\"\n />\n</div>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return StepperComponent; })),
multi: true
}
]
}] }
];
/** @nocollapse */
StepperComponent.ctorParameters = function () { return []; };
StepperComponent.propDecorators = {
max: [{ type: Input }],
min: [{ type: Input }],
value: [{ type: Input }],
step: [{ type: Input }],
defaultValue: [{ type: Input }],
disabled: [{ type: Input }],
readOnly: [{ type: Input }],
showNumber: [{ type: Input }],
onChange: [{ type: Output }],
clsStepper: [{ type: HostBinding, args: ['class.am-stepper',] }],
clsStpDisabled: [{ type: HostBinding, args: ['class.am-stepper-disabled',] }],
clsShowNum: [{ type: HostBinding, args: ['class.showNumber',] }]
};
return StepperComponent;
}());
export { StepperComponent };
if (false) {
/** @type {?} */
StepperComponent.prototype.prefixCls;
/** @type {?} */
StepperComponent.prototype.upDisableCls;
/** @type {?} */
StepperComponent.prototype.downDisableCls;
/** @type {?} */
StepperComponent.prototype.stepperCls;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._max;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._min;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._value;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._step;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._defaultValue;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._disabled;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._readOnly;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._showNumber;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._upDisabled;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._downDisabled;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._isUpClick;
/**
* @type {?}
* @private
*/
StepperComponent.prototype._isDownClick;
/** @type {?} */
StepperComponent.prototype.onChange;
/** @type {?} */
StepperComponent.prototype.clsStepper;
/** @type {?} */
StepperComponent.prototype.clsStpDisabled;
/** @type {?} */
StepperComponent.prototype.clsShowNum;
/**
* @type {?}
* @private
*/
StepperComponent.prototype.onChangeFn;
/**
* @type {?}
* @private
*/
StepperComponent.prototype.onTouchFn;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInN0ZXBwZXIvc3RlcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekU7SUFrR0U7UUF0RkEsY0FBUyxHQUFXLFlBQVksQ0FBQztRQUt6QixTQUFJLEdBQVcsUUFBUSxDQUFDO1FBQ3hCLFNBQUksR0FBVyxDQUFDLFFBQVEsQ0FBQztRQUV6QixVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBRWxCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBMkR0QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUduQyxlQUFVLEdBQVksSUFBSSxDQUFDO1FBRTNCLG1CQUFjLEdBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUV6QyxlQUFVLEdBQVksSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMvQixlQUFVOzs7UUFBNEIsY0FBTyxDQUFDLEVBQUM7UUFDL0MsY0FBUzs7O1FBQTRCLGNBQU8sQ0FBQyxFQUFDO0lBRXZDLENBQUM7SUFwRWhCLHNCQUNJLGlDQUFHOzs7O1FBRFA7WUFFRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzs7Ozs7UUFDRCxVQUFRLEtBQWE7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RUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVOzs7NEJBQUMsY0FBTSxPQUFBLGdCQUFnQixFQUFoQixDQUFnQixFQUFDOzRCQUMvQyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7Ozs7c0JBb0JFLEtBQUs7c0JBT0wsS0FBSzt3QkFPTCxLQUFLO3VCQU9MLEtBQUs7K0JBSUwsS0FBSzsyQkFPTCxLQUFLOzJCQVlMLEtBQUs7NkJBT0wsS0FBSzsyQkFLTCxNQUFNOzZCQUdOLFdBQVcsU0FBQyxrQkFBa0I7aUNBRTlCLFdBQVcsU0FBQywyQkFBMkI7NkJBRXZDLFdBQVcsU0FBQyxrQkFBa0I7O0lBd0lqQyx1QkFBQztDQUFBLEFBck9ELElBcU9DO1NBMU5ZLGdCQUFnQjs7O0lBQzNCLHFDQUFpQzs7SUFDakMsd0NBQXFCOztJQUNyQiwwQ0FBdUI7O0lBQ3ZCLHNDQUFtQjs7Ozs7SUFFbkIsZ0NBQWdDOzs7OztJQUNoQyxnQ0FBaUM7Ozs7O0lBQ2pDLGtDQUF1Qjs7Ozs7SUFDdkIsaUNBQTBCOzs7OztJQUMxQix5Q0FBOEI7Ozs7O0lBQzlCLHFDQUFtQzs7Ozs7SUFDbkMscUNBQW1DOzs7OztJQUNuQyx1Q0FBcUM7Ozs7O0lBQ3JDLHVDQUFxQzs7Ozs7SUFDckMseUNBQXVDOzs7OztJQUN2QyxzQ0FBb0M7Ozs7O0lBQ3BDLHdDQUFzQzs7SUEwRHRDLG9DQUNtQzs7SUFFbkMsc0NBQzJCOztJQUMzQiwwQ0FDeUM7O0lBQ3pDLHNDQUN1Qzs7Ozs7SUFDdkMsc0NBQXVEOzs7OztJQUN2RCxxQ0FBc0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBIb3N0QmluZGluZywgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdTdGVwcGVyLCBuem0tc3RlcHBlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwcGVyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTdGVwcGVyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBwZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tc3RlcHBlcic7XG4gIHVwRGlzYWJsZUNsczogb2JqZWN0O1xuICBkb3duRGlzYWJsZUNsczogb2JqZWN0O1xuICBzdGVwcGVyQ2xzOiBvYmplY3Q7XG5cbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXIgPSBJbmZpbml0eTtcbiAgcHJpdmF0ZSBfbWluOiBudW1iZXIgPSAtSW5maW5pdHk7XG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlciA9IDE7XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZTogbnVtYmVyO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9yZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zaG93TnVtYmVyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3VwRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZG93bkRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzVXBDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0Rvd25DbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG4gIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzdGVwKHZhbHVlKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX2Rvd25EaXNhYmxlZCA9IHZhbHVlO1xuICAgICAgdGhpcy5fdXBEaXNhYmxlZCA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuY2xzU3RwRGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRPbmx5O1xuICB9XG4gIHNldCByZWFkT25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRPbmx5ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNob3dOdW1iZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93TnVtYmVyID0gdmFsdWU7XG4gICAgdGhpcy5jbHNTaG93TnVtID0gdmFsdWU7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1zdGVwcGVyJylcbiAgY2xzU3RlcHBlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tc3RlcHBlci1kaXNhYmxlZCcpXG4gIGNsc1N0cERpc2FibGVkOiBib29sZWFuID0gdGhpcy5fZGlzYWJsZWQ7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2hvd051bWJlcicpXG4gIGNsc1Nob3dOdW06IGJvb2xlYW4gPSB0aGlzLl9zaG93TnVtYmVyO1xuICBwcml2YXRlIG9uQ2hhbmdlRm46ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaEZuOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBvbkluY3JlYXNlKCkge1xuICAgIGlmICghdGhpcy5fdXBEaXNhYmxlZCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLnBsdXModGhpcy5fdmFsdWUsIHRoaXMuX3N0ZXApO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMub25DaGFuZ2VGbih0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAodGhpcy5wbHVzKHRoaXMuX3ZhbHVlLCB0aGlzLl9zdGVwKSA+IHRoaXMuX21heCkge1xuICAgICAgICB0aGlzLl91cERpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1pbnVzKHRoaXMuX3ZhbHVlLCB0aGlzLl9zdGVwKSA+PSB0aGlzLl9taW4pIHtcbiAgICAgICAgdGhpcy5fZG93bkRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1VwQ2xpY2sgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9pc1VwQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfVxuICB9XG5cbiAgb25EZWNyZWFzZSgpIHtcbiAgICBpZiAoIXRoaXMuX2Rvd25EaXNhYmxlZCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbnVzKHRoaXMuX3ZhbHVlLCB0aGlzLl9zdGVwKTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlRm4odGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKHRoaXMubWludXModGhpcy5fdmFsdWUsIHRoaXMuX3N0ZXApIDwgdGhpcy5fbWluKSB7XG4gICAgICAgIHRoaXMuX2Rvd25EaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wbHVzKHRoaXMuX3ZhbHVlLCB0aGlzLl9zdGVwKSA8PSB0aGlzLl9tYXgpIHtcbiAgICAgICAgdGhpcy5fdXBEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5faXNEb3duQ2xpY2sgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9pc0Rvd25DbGljayA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldENscygpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBpbnB1dENoYW5nZShldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgPyBwYXJzZUludCh2YWx1ZSwgbnVsbCkgOiAwO1xuICAgIGlmICh2YWx1ZSA8IHRoaXMuX21pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9taW47XG4gICAgfVxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX21heCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9tYXg7XG4gICAgfVxuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZUZuKHRoaXMuX3ZhbHVlKTtcbiAgfVxuXG4gIHNldENscygpIHtcbiAgICB0aGlzLnVwRGlzYWJsZUNscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30taGFuZGxlci11cC1kaXNhYmxlZGBdOiB0aGlzLl91cERpc2FibGVkLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1oYW5kbGVyLWFjdGl2ZWBdOiB0aGlzLl9pc1VwQ2xpY2tcbiAgICB9O1xuICAgIHRoaXMuZG93bkRpc2FibGVDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWhhbmRsZXItZG93bi1kaXNhYmxlZGBdOiB0aGlzLl9kb3duRGlzYWJsZWQsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWhhbmRsZXItYWN0aXZlYF06IHRoaXMuX2lzRG93bkNsaWNrXG4gICAgfTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICh0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZG93bkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3VwRGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cERpc2FibGVkID0gdGhpcy5wbHVzKHRoaXMuX3ZhbHVlLCB0aGlzLl9zdGVwKSA+IHRoaXMuX21heCA/IHRydWUgOiBmYWxzZTtcbiAgICAgIHRoaXMuX2Rvd25EaXNhYmxlZCA9IHRoaXMubWludXModGhpcy5fdmFsdWUsIHRoaXMuX3N0ZXApIDwgdGhpcy5fbWluID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnNldENscygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm5nT25DaGFuZ2VzKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoRm4gPSBmbjtcbiAgfVxuXG4gIHBsdXMobnVtMTogbnVtYmVyLCBudW0yOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChudW0xID09PSB1bmRlZmluZWQgfHwgbnVtMSA9PT0gbnVsbCB8fCBudW0yID09PSB1bmRlZmluZWQgfHwgbnVtMiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiYXNlTnVtID0gTWF0aC5wb3coMTAsIE1hdGgubWF4KHRoaXMuZGlnaXRMZW5ndGgobnVtMSksIHRoaXMuZGlnaXRMZW5ndGgobnVtMikpKTtcbiAgICByZXR1cm4gKHRoaXMudGltZXMobnVtMSwgYmFzZU51bSkgKyB0aGlzLnRpbWVzKG51bTIsIGJhc2VOdW0pKSAvIGJhc2VOdW07XG4gIH1cblxuICBtaW51cyhudW0xOiBudW1iZXIsIG51bTI6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKG51bTEgPT09IHVuZGVmaW5lZCB8fCBudW0xID09PSBudWxsIHx8IG51bTIgPT09IHVuZGVmaW5lZCB8fCBudW0yID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJhc2VOdW0gPSBNYXRoLnBvdygxMCwgTWF0aC5tYXgodGhpcy5kaWdpdExlbmd0aChudW0xKSwgdGhpcy5kaWdpdExlbmd0aChudW0yKSkpO1xuICAgIHJldHVybiAodGhpcy50aW1lcyhudW0xLCBiYXNlTnVtKSAtIHRoaXMudGltZXMobnVtMiwgYmFzZU51bSkpIC8gYmFzZU51bTtcbiAgfVxuXG4gIGRpZ2l0TGVuZ3RoKG51bTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBlU3BsaXQgPSBudW0udG9TdHJpbmcoKS5zcGxpdCgvW2VFXS8pO1xuICAgIGNvbnN0IGxlbiA9IChlU3BsaXRbMF0uc3BsaXQoJy4nKVsxXSB8fCAnJykubGVuZ3RoIC0gKyhlU3BsaXRbMV0gfHwgMCk7XG4gICAgcmV0dXJuIGxlbiA+IDAgPyBsZW4gOiAwO1xuICB9XG5cbiAgdGltZXMobnVtMTogbnVtYmVyLCBudW0yOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG51bTFDaGFuZ2VkID0gdGhpcy5mbG9hdFRvRml4ZWQobnVtMSk7XG4gICAgY29uc3QgbnVtMkNoYW5nZWQgPSB0aGlzLmZsb2F0VG9GaXhlZChudW0yKTtcbiAgICBjb25zdCBiYXNlTnVtID0gdGhpcy5kaWdpdExlbmd0aChudW0xKSArIHRoaXMuZGlnaXRMZW5ndGgobnVtMik7XG4gICAgY29uc3QgbGVmdFZhbHVlID0gbnVtMUNoYW5nZWQgKiBudW0yQ2hhbmdlZDtcbiAgICByZXR1cm4gbGVmdFZhbHVlIC8gTWF0aC5wb3coMTAsIGJhc2VOdW0pO1xuICB9XG5cbiAgZmxvYXRUb0ZpeGVkKG51bTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAobnVtLnRvU3RyaW5nKCkuaW5kZXhPZignZScpID09PSAtMSkge1xuICAgICAgcmV0dXJuIE51bWJlcihudW0udG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJycpKTtcbiAgICB9XG4gICAgY29uc3QgZExlbiA9IHRoaXMuZGlnaXRMZW5ndGgobnVtKTtcbiAgICByZXR1cm4gZExlbiA+IDAgPyB0aGlzLnN0cmlwKG51bSAqIE1hdGgucG93KDEwLCBkTGVuKSkgOiBudW07XG4gIH1cblxuICBzdHJpcChudW06IG51bWJlciwgcHJlY2lzaW9uID0gMTIpOiBudW1iZXIge1xuICAgIHJldHVybiArcGFyc2VGbG9hdChudW0udG9QcmVjaXNpb24ocHJlY2lzaW9uKSk7XG4gIH1cbn1cbiJdfQ==