com.phloxui
Version:
PhloxUI Ng2+ Framework
234 lines (233 loc) • 23.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { AbstractI18NApplicable } from '../../share/AbstractI18NApplicable';
import { Option } from '../../decorator/Option.decorator';
import { EventUtils } from '../../share/utils/EventUtils';
import { START_VALIDATE_EVENT, END_VALIDATE_EVENT } from '../../share/CustomEventType';
/**
* @abstract
* @template T
*/
export class AbstractValidatable extends AbstractI18NApplicable {
constructor() {
super();
this.validators = [];
this.startValidateEvent = new EventEmitter();
this.endValidateEvent = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @param {?} value
* @return {?}
*/
doValidate(value) {
let /** @type {?} */ result = [];
if (this.validators !== null && typeof this.validators !== 'undefined') {
for (let /** @type {?} */ vdt of this.validators) {
let /** @type {?} */ vResult = vdt.validate(value);
result.push(vResult);
}
}
return result;
}
/**
* @param {?} value
* @return {?}
*/
validate(value) {
// emit start validate
let /** @type {?} */ d = {
value: value
};
let /** @type {?} */ startEv = EventUtils.newCustomEvent(START_VALIDATE_EVENT, this, d, null);
this.startValidateEvent.emit(startEv);
// validate
let /** @type {?} */ result = this.doValidate(value);
this.onValidationEnd(value, result);
// emit end validate
let /** @type {?} */ dataEnd = {
value: value,
result: result,
};
let /** @type {?} */ endEv = EventUtils.newCustomEvent(END_VALIDATE_EVENT, this, dataEnd, null);
this.endValidateEvent.emit(endEv);
return result;
}
/**
* @param {?} validator
* @return {?}
*/
addValidator(validator) {
if (validator === null || typeof validator === 'undefined') {
return;
}
// check contain if contain return false
let /** @type {?} */ index = this.validators.indexOf(validator);
if (index >= 0) {
return false;
}
let /** @type {?} */ i18nValidator = /** @type {?} */ (validator);
if (typeof this.i18nValue !== 'undefined' && typeof i18nValidator.applyI18N === 'function') {
let /** @type {?} */ value = this.i18nValue;
if (value === null) {
i18nValidator.applyI18N(null);
}
else {
if (value.validators !== null && typeof value.validators !== 'undefined') {
let /** @type {?} */ bypass = false;
if (typeof i18nValidator.isBypassKey === 'function') {
bypass = i18nValidator.isBypassKey();
}
if (bypass) {
i18nValidator.applyI18N(value);
}
else {
let /** @type {?} */ i18nCVal = value.validators[i18nValidator.getI18NKey()];
if (typeof i18nCVal !== 'undefined') {
i18nValidator.applyI18N(i18nCVal);
}
}
}
}
}
if (this.options !== null && typeof this.options !== 'undefined' && typeof i18nValidator.setOptions === 'function') {
if (this.options.validators !== null && typeof this.options.validators !== 'undefined') {
let /** @type {?} */ options = this.options.validators;
if (typeof i18nValidator.getName === 'function') {
let /** @type {?} */ name = i18nValidator.getName();
if (name !== null && typeof name === 'string') {
let /** @type {?} */ optionsByName = this.options.validators[name];
if (optionsByName !== null && optionsByName !== undefined) {
options = optionsByName;
}
}
}
i18nValidator.setOptions(options);
}
}
this.validators.push(validator);
return true;
}
/**
* @param {?} validator
* @return {?}
*/
removeValidator(validator) {
if (validator === null || typeof validator === 'undefined') {
return false;
}
let /** @type {?} */ index = this.validators.indexOf(validator);
if (index < 0) {
return false;
}
this.validators.splice(index, 1);
return true;
}
/**
* @return {?}
*/
getValidators() {
return this.validators;
}
/**
* @return {?}
*/
getStartValidateEvent() {
return this.startValidateEvent;
}
/**
* @return {?}
*/
getEndValidateEvent() {
return this.endValidateEvent;
}
/**
* @param {?} event
* @return {?}
*/
setStartValidateEvent(event) {
this.startValidateEvent = event;
}
/**
* @param {?} event
* @return {?}
*/
setEndValidateEvent(event) {
this.endValidateEvent = event;
}
/**
* @return {?}
*/
resetValidationResult() {
}
/**
* @param {?} value
* @return {?}
*/
applyI18N(value) {
if (typeof value === 'undefined') {
return;
}
super.applyI18N(value);
if (this.validators !== null && typeof this.validators !== 'undefined') {
for (let /** @type {?} */ vt of this.validators) {
let /** @type {?} */ validator = /** @type {?} */ (vt);
// check if child is applicable
if (typeof validator.applyI18N === 'function') {
if (value === null) {
validator.applyI18N(null);
}
else {
if (value.validators !== null && typeof value.validators !== 'undefined') {
let /** @type {?} */ bypass = false;
if (typeof validator.isBypassKey === 'function') {
bypass = validator.isBypassKey();
}
if (bypass) {
validator.applyI18N(value);
}
else {
let /** @type {?} */ i18nCVal = value.validators[validator.getI18NKey()];
if (typeof i18nCVal !== 'undefined') {
validator.applyI18N(i18nCVal);
}
}
}
}
}
}
}
}
}
tslib_1.__decorate([
Option('startValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractValidatable.prototype, "startValidateEvent", void 0);
tslib_1.__decorate([
Option('endValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractValidatable.prototype, "endValidateEvent", void 0);
function AbstractValidatable_tsickle_Closure_declarations() {
/** @type {?} */
AbstractValidatable.prototype.validators;
/** @type {?} */
AbstractValidatable.prototype.startValidateEvent;
/** @type {?} */
AbstractValidatable.prototype.endValidateEvent;
/**
* @abstract
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
AbstractValidatable.prototype.onValidationEnd = function (inputValue, results) { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RWYWxpZGF0YWJsZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC92YWxpZGF0ZS9BYnN0cmFjdFZhbGlkYXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFVLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdyRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUc1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7OztBQUV2RixNQUFNLDBCQUF1QyxTQUFRLHNCQUFzQjtJQVF6RTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7S0FDNUM7Ozs7SUFFTSxRQUFROzs7Ozs7SUFNTCxVQUFVLENBQUMsS0FBUTtRQUMzQixxQkFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLEdBQUcsQ0FBQyxDQUFDLHFCQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDaEMscUJBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxJ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Q0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDbkIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDM0I7b0JBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ04sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7NEJBQ3pFLHFCQUFJLE1BQU0sR0FBWSxLQUFLLENBQUM7NEJBQzVCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLFdBQVcsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dDQUNoRCxNQUFNLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDOzZCQUNsQzs0QkFFRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dDQUNYLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQzVCOzRCQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNOLHFCQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dDQUV4RCxFQUFFLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO29DQUNwQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lDQUMvQjs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7O0NBRUo7O0lBaE1FLE1BQU0sQ0FBQyxlQUFlLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3pDLE1BQU0sQ0FBQyxhQUFhLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi9tb2RlbC9WYWxpZGF0aW9uUmVzdWx0JztcbmltcG9ydCB7IEFic3RyYWN0STE4TkFwcGxpY2FibGUgfSBmcm9tICcuLi8uLi9zaGFyZS9BYnN0cmFjdEkxOE5BcHBsaWNhYmxlJztcbmltcG9ydCB7IElWYWxpZGF0YWJsZSB9IGZyb20gJy4vSVZhbGlkYXRhYmxlJztcbmltcG9ydCB7IElWYWxpZGF0b3IgfSBmcm9tICcuL0lWYWxpZGF0b3InO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuaW1wb3J0IHsgU1RBUlRfVkFMSURBVEVfRVZFTlQsIEVORF9WQUxJREFURV9FVkVOVCB9IGZyb20gJy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRhYmxlPFQ+IGV4dGVuZHMgQWJzdHJhY3RJMThOQXBwbGljYWJsZSBpbXBsZW1lbnRzIE9uSW5pdCwgSVZhbGlkYXRhYmxlPFQ+e1xuXG4gIHByaXZhdGUgdmFsaWRhdG9yczogSVZhbGlkYXRvcjxUPltdO1xuICBAT3B0aW9uKCdzdGFydFZhbGlkYXRlJylcbiAgcHJvdGVjdGVkIHN0YXJ0VmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2VuZFZhbGlkYXRlJylcbiAgcHJvdGVjdGVkIGVuZFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy52YWxpZGF0b3JzID0gW107XG4gICAgdGhpcy5zdGFydFZhbGlkYXRlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbmRWYWxpZGF0ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25WYWxpZGF0aW9uRW5kKGlucHV0VmFsdWU6IFQsIHJlc3VsdHM6IFZhbGlkYXRpb25SZXN1bHRbXSk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGRvVmFsaWRhdGUodmFsdWU6IFQpOiBWYWxpZGF0aW9uUmVzdWx0W10ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgIGlmICh0aGlzLnZhbGlkYXRvcnMgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMudmFsaWRhdG9ycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZvciAobGV0IHZkdCBvZiB0aGlzLnZhbGlkYXRvcnMpIHtcbiAgICAgICAgbGV0IHZSZXN1bHQgPSB2ZHQudmFsaWRhdGUodmFsdWUpO1xuICAgICAgICByZXN1bHQucHVzaCh2UmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBUKTogVmFsaWRhdGlvblJlc3VsdFtdIHtcbiAgICAvLyBlbWl0IHN0YXJ0IHZhbGlkYXRlXG4gICAgbGV0IGQ6IGFueSA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH07XG4gICAgbGV0IHN0YXJ0RXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFNUQVJUX1ZBTElEQVRFX0VWRU5ULCB0aGlzLCBkLCBudWxsKTtcblxuICAgIHRoaXMuc3RhcnRWYWxpZGF0ZUV2ZW50LmVtaXQoc3RhcnRFdik7XG5cbiAgICAvLyB2YWxpZGF0ZVxuICAgIGxldCByZXN1bHQ6IFZhbGlkYXRpb25SZXN1bHRbXSA9IHRoaXMuZG9WYWxpZGF0ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLm9uVmFsaWRhdGlvbkVuZCh2YWx1ZSwgcmVzdWx0KTtcblxuICAgIC8vIGVtaXQgZW5kIHZhbGlkYXRlXG4gICAgbGV0IGRhdGFFbmQ6IGFueSA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3VsdDogcmVzdWx0LFxuICAgIH07XG4gICAgbGV0IGVuZEV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChFTkRfVkFMSURBVEVfRVZFTlQsIHRoaXMsIGRhdGFFbmQsIG51bGwpO1xuXG4gICAgdGhpcy5lbmRWYWxpZGF0ZUV2ZW50LmVtaXQoZW5kRXYpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRWYWxpZGF0b3IodmFsaWRhdG9yOiBJVmFsaWRhdG9yPFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsaWRhdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGNvbnRhaW4gaWYgY29udGFpbiByZXR1cm4gZmFsc2VcbiAgICBsZXQgaW5kZXggPSB0aGlzLnZhbGlkYXRvcnMuaW5kZXhPZih2YWxpZGF0b3IpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGkxOG5WYWxpZGF0b3IgPSB2YWxpZGF0b3IgYXMgYW55O1xuICAgIGlmICh0eXBlb2YgdGhpcy5pMThuVmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBpMThuVmFsaWRhdG9yLmFwcGx5STE4TiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5pMThuVmFsdWU7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgaTE4blZhbGlkYXRvci5hcHBseUkxOE4obnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFsdWUudmFsaWRhdG9ycyAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudmFsaWRhdG9ycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsZXQgYnlwYXNzOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpMThuVmFsaWRhdG9yLmlzQnlwYXNzS2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBieXBhc3MgPSBpMThuVmFsaWRhdG9yLmlzQnlwYXNzS2V5KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGJ5cGFzcykge1xuICAgICAgICAgICAgaTE4blZhbGlkYXRvci5hcHBseUkxOE4odmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaTE4bkNWYWwgPSB2YWx1ZS52YWxpZGF0b3JzW2kxOG5WYWxpZGF0b3IuZ2V0STE4TktleSgpXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpMThuQ1ZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgaTE4blZhbGlkYXRvci5hcHBseUkxOE4oaTE4bkNWYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMub3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGkxOG5WYWxpZGF0b3Iuc2V0T3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3JzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMudmFsaWRhdG9ycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMudmFsaWRhdG9ycztcblxuICAgICAgICBpZiAodHlwZW9mIGkxOG5WYWxpZGF0b3IuZ2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGxldCBuYW1lID0gaTE4blZhbGlkYXRvci5nZXROYW1lKCk7XG5cbiAgICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zQnlOYW1lID0gdGhpcy5vcHRpb25zLnZhbGlkYXRvcnNbbmFtZV07XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zQnlOYW1lICE9PSBudWxsICYmIG9wdGlvbnNCeU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc0J5TmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpMThuVmFsaWRhdG9yLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0b3JzLnB1c2godmFsaWRhdG9yKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZVZhbGlkYXRvcih2YWxpZGF0b3I6IElWYWxpZGF0b3I8VD4pOiBib29sZWFuIHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBudWxsIHx8IHR5cGVvZiB2YWxpZGF0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGluZGV4ID0gdGhpcy52YWxpZGF0b3JzLmluZGV4T2YodmFsaWRhdG9yKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0b3JzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYWxpZGF0b3JzKCk6IElWYWxpZGF0b3I8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9ycztcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGFydFZhbGlkYXRlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0VmFsaWRhdGVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFbmRWYWxpZGF0ZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5lbmRWYWxpZGF0ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFN0YXJ0VmFsaWRhdGVFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0VmFsaWRhdGVFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEVuZFZhbGlkYXRlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5lbmRWYWxpZGF0ZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRWYWxpZGF0aW9uUmVzdWx0KCk6IHZvaWQge1xuXG4gIH1cblxuICBwdWJsaWMgYXBwbHlJMThOKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5hcHBseUkxOE4odmFsdWUpO1xuXG4gICAgaWYgKHRoaXMudmFsaWRhdG9ycyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy52YWxpZGF0b3JzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZm9yIChsZXQgdnQgb2YgdGhpcy52YWxpZGF0b3JzKSB7XG4gICAgICAgIGxldCB2YWxpZGF0b3IgPSB2dCBhcyBhbnk7XG4gICAgICAgIC8vIGNoZWNrIGlmIGNoaWxkIGlzIGFwcGxpY2FibGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3IuYXBwbHlJMThOID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3IuYXBwbHlJMThOKG51bGwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUudmFsaWRhdG9ycyAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudmFsaWRhdG9ycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgbGV0IGJ5cGFzczogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvci5pc0J5cGFzc0tleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGJ5cGFzcyA9IHZhbGlkYXRvci5pc0J5cGFzc0tleSgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGJ5cGFzcykge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvci5hcHBseUkxOE4odmFsdWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpMThuQ1ZhbCA9IHZhbHVlLnZhbGlkYXRvcnNbdmFsaWRhdG9yLmdldEkxOE5LZXkoKV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGkxOG5DVmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLmFwcGx5STE4TihpMThuQ1ZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=