ngx-form-control
Version:
Form controls for angular 6
433 lines (432 loc) • 40.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
import { BaseListControlComponent } from '../../utils/base-list-control.component';
import { Common } from '../../utils/common';
var FormSelect2Component = /** @class */ (function (_super) {
tslib_1.__extends(FormSelect2Component, _super);
function FormSelect2Component() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this._isTouched = false;
return _this;
}
Object.defineProperty(FormSelect2Component.prototype, "placeholder", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._placeholder = value;
this.updateSelect2Options();
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "required", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._required = value;
this.updateSelect2Options();
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "disabled", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disabled = value;
this.updateSelect2Options();
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "multiple", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._multiple = value;
this.updateSelect2Options();
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "tag", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._tag = value;
this.updateSelect2Options();
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "tokenSeparators", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._tag = value;
this.updateSelect2Options();
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "value", {
get: /**
* @return {?}
*/
function () {
var _this = this;
if (!this._selectedIndexes || !this._selectedIndexes.length) {
return null;
}
/** @type {?} */
var result = this._selectedIndexes.reduce(function (currentResult, index) {
if (Number.isInteger(index) && _this._selectOptions[index]) {
currentResult.push(_this._selectOptions[index].value);
}
else if (_this._tag) {
/** @type {?} */
var match = index['value'].match(/^number: {([\d]+)}$/);
if (match) {
currentResult.push(match[1]);
}
else {
currentResult.push(index['value']);
}
}
return currentResult;
}, []);
return this._multiple ? result : result[0];
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "invalid", {
get: /**
* @return {?}
*/
function () {
if (this.hasCustomError) {
return true;
}
if (!this._isTouched) {
return false;
}
return this.hasRequiredError;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "valid", {
get: /**
* @return {?}
*/
function () {
if (this.hasCustomError) {
return false;
}
if (!this._isTouched) {
return false;
}
return !this.hasRequiredError;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FormSelect2Component.prototype, "errorMessages", {
get: /**
* @return {?}
*/
function () {
if (this.hasRequiredError) {
return [this.requiredErrorMessage];
}
if (this.hasCustomError) {
return this.innerCustomErrorMessages;
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FormSelect2Component.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.updateSelect2Options();
};
/**
* @param {?} value
* @return {?}
*/
FormSelect2Component.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this._multiple && value && value.length) {
this.selectValues(value);
}
else if (!this._multiple) {
this.selectValue(value);
}
else {
this.cleanValue();
}
};
/**
* @return {?}
*/
FormSelect2Component.prototype.validate = /**
* @return {?}
*/
function () {
/** @type {?} */
var result = {};
if (this.hasRequiredError) {
result['required'] = true;
}
return result;
};
// noinspection JSUnusedGlobalSymbols
/**
* @return {?}
*/
FormSelect2Component.prototype.reset = /**
* @return {?}
*/
function () {
this._isTouched = false;
};
/**
* @return {?}
*/
FormSelect2Component.prototype.afterInitOptions = /**
* @return {?}
*/
function () {
this._selectOptions = tslib_1.__spread(this._selectOptions);
this.updateSelect2Options();
};
/**
* @param {?} values
* @return {?}
*/
FormSelect2Component.prototype.selectValues = /**
* @param {?} values
* @return {?}
*/
function (values) {
var _this = this;
this._selectedIndexes = [];
/** @type {?} */
var select2Data = [];
if (values && values.length) {
values.map(function (value) {
/** @type {?} */
var index = _this.findIndex(value);
if (index > -1) {
_this._selectedIndexes.push(index);
select2Data.push(index);
}
else if (_this._tag) {
_this._selectedIndexes.push({ value: value });
select2Data.push(value);
}
});
}
if (Common.isClient()) {
this._selectElement.val(select2Data);
this._selectElement.trigger('change');
}
};
/**
* @return {?}
*/
FormSelect2Component.prototype.updateSelectedIndexes = /**
* @return {?}
*/
function () {
var _this = this;
if (Common.isServer()) {
return;
}
/** @type {?} */
var oldSelectedIndexes = JSON.stringify(this._selectedIndexes);
/** @type {?} */
var value = this._selectElement.val();
if ('number' === typeof value || ('string' === typeof value && Number.isInteger(+value))) {
this._selectedIndexes = [+value];
}
else if ('string' === typeof value && this._tag) {
this._selectedIndexes = [{ value: value }];
}
else if (value && value.length) {
this._selectedIndexes = value.map(function (item) {
if (Number.isInteger(+item)) {
return +item;
}
if (_this._tag) {
return { value: item };
}
return null;
});
}
else {
this._selectedIndexes = [];
}
/** @type {?} */
var newSelectedIndexes = JSON.stringify(this._selectedIndexes);
if (newSelectedIndexes !== oldSelectedIndexes) {
this.triggerChange();
}
};
/**
* @param {?} value
* @return {?}
*/
FormSelect2Component.prototype.selectValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (Common.isServer()) {
return;
}
/** @type {?} */
var index = this.findIndex(value);
if (index > -1) {
this._selectedIndexes = [index];
this._selectElement.val(this._selectedIndexes);
this._selectElement.trigger('change');
}
else if (this._tag) {
this._selectedIndexes = [{ value: value }];
this._selectElement.val(value);
this._selectElement.trigger('change');
}
else {
this.cleanValue();
}
};
/**
* @return {?}
*/
FormSelect2Component.prototype.cleanValue = /**
* @return {?}
*/
function () {
if (Common.isServer()) {
return;
}
this._selectedIndexes = [];
this._selectElement.val(null);
this._selectElement.trigger('change');
};
/**
* @return {?}
*/
FormSelect2Component.prototype.updateSelect2Options = /**
* @return {?}
*/
function () {
var _this = this;
if (Common.isServer() || !this.customSelectElement || !this.customSelectElement.nativeElement) {
return;
}
this._selectElement = $(this.customSelectElement.nativeElement);
if (this._selectElement.hasClass('select2-hidden-accessible')) {
this._selectElement.select2().empty();
this._selectElement.select2('destroy');
}
this._selectElement.select2({
tags: this._tag,
tokenSeparators: this._tokenSeparators || [],
placeholder: this._placeholder,
allowClear: !this._required,
multiple: this._multiple,
data: this._selectOptions,
disabled: this._disabled,
createTag: function (params) {
/** @type {?} */
var term = $.trim(params.term);
if (term === '') {
return null;
}
return {
id: Number.isInteger(+term) ? "number: {" + term + "}" : term,
text: term,
newTag: true
};
}
});
this._selectElement.on('select2:select', function () {
_this.updateSelectedIndexes();
});
this._selectElement.on('select2:unselect', function () {
_this.updateSelectedIndexes();
});
this._selectElement.on('select2:close', function () {
_this._isTouched = true;
});
};
FormSelect2Component.decorators = [
{ type: Component, args: [{
selector: 'ngx-form-select2',
template: "<label *ngIf=\"label\" [for]=\"id\">{{label}}</label>\n\n<div class=\"form-control is-invalid\" [ngClass]=\"{'is-invalid': invalid, 'is-valid': valid}\">\n <!--suppress HtmlFormInputWithoutLabel -->\n <select [id]=\"id\" #customSelectElement></select>\n</div>\n\n<div class=\"valid-feedback\" *ngIf=\"valid && validMessage\">{{validMessage}}</div>\n\n<div class=\"invalid-feedback\" *ngIf=\"invalid\">\n <span *ngFor=\"let message of errorMessages; let last = last;\">\n {{message}}<br *ngIf=\"!last\">\n </span>\n</div>\n",
styles: [":host .form-control{padding:0}:host .form-control /deep/ .select2-container{width:100%!important}:host .form-control /deep/ .select2-container .select2-selection--single{height:auto}:host .form-control /deep/ .select2-container--default .select2-selection--multiple,:host .form-control /deep/ .select2-container--default .select2-selection--single,:host .form-control /deep/ .select2-container--default.select2-container--focus .select2-selection--multiple{border:none;outline:0!important}:host .form-control /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control /deep/ .select2-container--default .select2-selection--single:focus{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}:host .form-control.is-invalid /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control.is-invalid /deep/ .select2-container--default .select2-selection--single:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}:host .form-control.is-valid /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control.is-valid /deep/ .select2-container--default .select2-selection--single:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}:host .form-control /deep/ .select2-container--default .select2-selection--single .select2-selection__rendered{min-height:40px;line-height:25px;padding:.375rem 25px .375rem .75rem}:host .form-control /deep/ .select2-container .select2-selection--multiple{min-height:40px;padding:.375rem .75rem}:host .form-control /deep/ .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding:0}:host .form-control /deep/ .select2-container--default .select2-selection--single .select2-selection__arrow{height:38px}"],
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: FormSelect2Component, multi: true },
{ provide: NG_VALIDATORS, useExisting: FormSelect2Component, multi: true }
]
},] },
];
FormSelect2Component.propDecorators = {
customSelectElement: [{ type: ViewChild, args: ['customSelectElement',] }],
placeholder: [{ type: Input }],
required: [{ type: Input }],
disabled: [{ type: Input }],
multiple: [{ type: Input }],
tag: [{ type: Input }],
tokenSeparators: [{ type: Input }]
};
return FormSelect2Component;
}(BaseListControlComponent));
export { FormSelect2Component };
if (false) {
/** @type {?} */
FormSelect2Component.prototype._selectElement;
/** @type {?} */
FormSelect2Component.prototype._isTouched;
/** @type {?} */
FormSelect2Component.prototype._placeholder;
/** @type {?} */
FormSelect2Component.prototype.customSelectElement;
/** @type {?} */
FormSelect2Component.prototype._required;
/** @type {?} */
FormSelect2Component.prototype._disabled;
/** @type {?} */
FormSelect2Component.prototype._tag;
/** @type {?} */
FormSelect2Component.prototype._tokenSeparators;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zZWxlY3QyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mb3JtLWNvbnRyb2wvIiwic291cmNlcyI6WyJsaWIvZm9ybS1zZWxlY3QyL2Zvcm0tc2VsZWN0Mi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlFLE9BQU8sRUFBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7O0lBMkJBLGdEQUF3Qjs7OzJCQUczQyxLQUFLOzs7SUFLMUIsc0JBQWEsNkNBQVc7Ozs7O1FBQXhCLFVBQXlCLEtBQWE7WUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBSUQsc0JBQWEsMENBQVE7Ozs7O1FBQXJCLFVBQXNCLEtBQWM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBSUQsc0JBQWEsMENBQVE7Ozs7O1FBQXJCLFVBQXNCLEtBQWM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBRUQsc0JBQWEsMENBQVE7Ozs7O1FBQXJCLFVBQXNCLEtBQWM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBSUQs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S0FBSztzQkFPTCxLQUFLO2tDQU9MLEtBQUs7OytCQXZFUjtFQThCMEMsd0JBQXdCO1NBQXJELG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7QmFzZUxpc3RDb250cm9sQ29tcG9uZW50fSBmcm9tICcuLi8uLi91dGlscy9iYXNlLWxpc3QtY29udHJvbC5jb21wb25lbnQnO1xyXG5pbXBvcnQge0NvbW1vbn0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJztcclxuXHJcbmRlY2xhcmUgY29uc3QgJDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWZvcm0tc2VsZWN0MicsXHJcbiAgdGVtcGxhdGU6IGA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIj57e2xhYmVsfX08L2xhYmVsPlxyXG5cclxuPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbCBpcy1pbnZhbGlkXCIgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzogaW52YWxpZCwgJ2lzLXZhbGlkJzogdmFsaWR9XCI+XHJcbiAgPCEtLXN1cHByZXNzIEh0bWxGb3JtSW5wdXRXaXRob3V0TGFiZWwgLS0+XHJcbiAgPHNlbGVjdCBbaWRdPVwiaWRcIiAjY3VzdG9tU2VsZWN0RWxlbWVudD48L3NlbGVjdD5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwidmFsaWQtZmVlZGJhY2tcIiAqbmdJZj1cInZhbGlkICYmIHZhbGlkTWVzc2FnZVwiPnt7dmFsaWRNZXNzYWdlfX08L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJpbnZhbGlkXCI+XHJcbiAgPHNwYW4gKm5nRm9yPVwibGV0IG1lc3NhZ2Ugb2YgZXJyb3JNZXNzYWdlczsgbGV0IGxhc3QgPSBsYXN0O1wiPlxyXG4gICAge3ttZXNzYWdlfX08YnIgKm5nSWY9XCIhbGFzdFwiPlxyXG4gIDwvc3Bhbj5cclxuPC9kaXY+XHJcbmAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IC5mb3JtLWNvbnRyb2x7cGFkZGluZzowfTpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lcnt3aWR0aDoxMDAlIWltcG9ydGFudH06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXIgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGV7aGVpZ2h0OmF1dG99Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGUsOmhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlLDpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdC5zZWxlY3QyLWNvbnRhaW5lci0tZm9jdXMgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZXtib3JkZXI6bm9uZTtvdXRsaW5lOjAhaW1wb3J0YW50fTpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLW11bHRpcGxlOmZvY3VzLDpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZTpmb2N1c3tib3JkZXItY29sb3I6IzgwYmRmZjtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMCwxMjMsMjU1LC4yNSl9Omhvc3QgLmZvcm0tY29udHJvbC5pcy1pbnZhbGlkIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZTpmb2N1cyw6aG9zdCAuZm9ybS1jb250cm9sLmlzLWludmFsaWQgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZTpmb2N1c3tib3JkZXItY29sb3I6I2RjMzU0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjIwLDUzLDY5LC4yNSl9Omhvc3QgLmZvcm0tY29udHJvbC5pcy12YWxpZCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGU6Zm9jdXMsOmhvc3QgLmZvcm0tY29udHJvbC5pcy12YWxpZCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlOmZvY3Vze2JvcmRlci1jb2xvcjojMjhhNzQ1O2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg0MCwxNjcsNjksLjI1KX06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGUgLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZHttaW4taGVpZ2h0OjQwcHg7bGluZS1oZWlnaHQ6MjVweDtwYWRkaW5nOi4zNzVyZW0gMjVweCAuMzc1cmVtIC43NXJlbX06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXIgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZXttaW4taGVpZ2h0OjQwcHg7cGFkZGluZzouMzc1cmVtIC43NXJlbX06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZSAuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVke3BhZGRpbmc6MH06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGUgLnNlbGVjdDItc2VsZWN0aW9uX19hcnJvd3toZWlnaHQ6MzhweH1gXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IEZvcm1TZWxlY3QyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZX0sXHJcbiAgICB7cHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IEZvcm1TZWxlY3QyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZX1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtU2VsZWN0MkNvbXBvbmVudCBleHRlbmRzIEJhc2VMaXN0Q29udHJvbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfaXNUb3VjaGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHJcbiAgQFZpZXdDaGlsZCgnY3VzdG9tU2VsZWN0RWxlbWVudCcpIGN1c3RvbVNlbGVjdEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XHJcblxyXG4gIEBJbnB1dCgpIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX211bHRpcGxlID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90YWc6IGJvb2xlYW47XHJcblxyXG4gIEBJbnB1dCgpIHNldCB0YWcodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3RhZyA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG9rZW5TZXBhcmF0b3JzOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBzZXQgdG9rZW5TZXBhcmF0b3JzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl90YWcgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgaWYgKCF0aGlzLl9zZWxlY3RlZEluZGV4ZXMgfHwgIXRoaXMuX3NlbGVjdGVkSW5kZXhlcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc2VsZWN0ZWRJbmRleGVzLnJlZHVjZSgoY3VycmVudFJlc3VsdCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5kZXgpICYmIHRoaXMuX3NlbGVjdE9wdGlvbnNbaW5kZXhdKSB7XHJcbiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKHRoaXMuX3NlbGVjdE9wdGlvbnNbaW5kZXhdLnZhbHVlKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YWcpIHtcclxuICAgICAgICBjb25zdCBtYXRjaCA9IGluZGV4Wyd2YWx1ZSddLm1hdGNoKC9ebnVtYmVyOiB7KFtcXGRdKyl9JC8pO1xyXG5cclxuICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgIGN1cnJlbnRSZXN1bHQucHVzaChtYXRjaFsxXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGN1cnJlbnRSZXN1bHQucHVzaChpbmRleFsndmFsdWUnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY3VycmVudFJlc3VsdDtcclxuICAgIH0sIFtdKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGUgPyByZXN1bHQgOiByZXN1bHRbMF07XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmhhc0N1c3RvbUVycm9yKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5faXNUb3VjaGVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5oYXNSZXF1aXJlZEVycm9yO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tRXJyb3IpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5faXNUb3VjaGVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gIXRoaXMuaGFzUmVxdWlyZWRFcnJvcjtcclxuICB9XHJcblxyXG4gIGdldCBlcnJvck1lc3NhZ2VzKCk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgaWYgKHRoaXMuaGFzUmVxdWlyZWRFcnJvcikge1xyXG4gICAgICByZXR1cm4gW3RoaXMucmVxdWlyZWRFcnJvck1lc3NhZ2VdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0N1c3RvbUVycm9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlubmVyQ3VzdG9tRXJyb3JNZXNzYWdlcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55IHwgQXJyYXk8YW55Pik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX211bHRpcGxlICYmIHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdFZhbHVlcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl9tdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdFZhbHVlKHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xlYW5WYWx1ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoKToge30ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0ge307XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzUmVxdWlyZWRFcnJvcikge1xyXG4gICAgICByZXN1bHRbJ3JlcXVpcmVkJ10gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzXHJcbiAgcmVzZXQoKSB7XHJcbiAgICB0aGlzLl9pc1RvdWNoZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZnRlckluaXRPcHRpb25zKCkge1xyXG4gICAgdGhpcy5fc2VsZWN0T3B0aW9ucyA9IFsuLi50aGlzLl9zZWxlY3RPcHRpb25zXTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdFZhbHVlcyh2YWx1ZXMpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFtdO1xyXG4gICAgY29uc3Qgc2VsZWN0MkRhdGEgPSBbXTtcclxuXHJcbiAgICBpZiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZmluZEluZGV4KHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgIHNlbGVjdDJEYXRhLnB1c2goaW5kZXgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFnKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMucHVzaCh7dmFsdWV9KTtcclxuICAgICAgICAgIHNlbGVjdDJEYXRhLnB1c2godmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKENvbW1vbi5pc0NsaWVudCgpKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudmFsKHNlbGVjdDJEYXRhKTtcclxuICAgICAgdGhpcy5fc2VsZWN0RWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0ZWRJbmRleGVzKCkge1xyXG4gICAgaWYgKENvbW1vbi5pc1NlcnZlcigpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvbGRTZWxlY3RlZEluZGV4ZXMgPSBKU09OLnN0cmluZ2lmeSh0aGlzLl9zZWxlY3RlZEluZGV4ZXMpO1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbCgpO1xyXG5cclxuICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIHZhbHVlIHx8ICgnc3RyaW5nJyA9PT0gdHlwZW9mIHZhbHVlICYmIE51bWJlci5pc0ludGVnZXIoK3ZhbHVlKSkpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzID0gWyt2YWx1ZV07XHJcbiAgICB9IGVsc2UgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgdmFsdWUgJiYgdGhpcy5fdGFnKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFt7dmFsdWV9XTtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IHZhbHVlLm1hcChpdGVtID0+IHtcclxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcigraXRlbSkpIHtcclxuICAgICAgICAgIHJldHVybiAraXRlbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl90YWcpIHtcclxuICAgICAgICAgIHJldHVybiB7dmFsdWU6IGl0ZW19O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3U2VsZWN0ZWRJbmRleGVzID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fc2VsZWN0ZWRJbmRleGVzKTtcclxuXHJcbiAgICBpZiAobmV3U2VsZWN0ZWRJbmRleGVzICE9PSBvbGRTZWxlY3RlZEluZGV4ZXMpIHtcclxuICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdFZhbHVlKHZhbHVlKSB7XHJcbiAgICBpZiAoQ29tbW9uLmlzU2VydmVyKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maW5kSW5kZXgodmFsdWUpO1xyXG5cclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFtpbmRleF07XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudmFsKHRoaXMuX3NlbGVjdGVkSW5kZXhlcyk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3RhZykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbe3ZhbHVlfV07XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudmFsKHZhbHVlKTtcclxuICAgICAgdGhpcy5fc2VsZWN0RWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xlYW5WYWx1ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhblZhbHVlKCkge1xyXG4gICAgaWYgKENvbW1vbi5pc1NlcnZlcigpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbXTtcclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudmFsKG51bGwpO1xyXG4gICAgdGhpcy5fc2VsZWN0RWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0Mk9wdGlvbnMoKSB7XHJcbiAgICBpZiAoQ29tbW9uLmlzU2VydmVyKCkgfHwgIXRoaXMuY3VzdG9tU2VsZWN0RWxlbWVudCB8fCAhdGhpcy5jdXN0b21TZWxlY3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQgPSAkKHRoaXMuY3VzdG9tU2VsZWN0RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgIGlmICh0aGlzLl9zZWxlY3RFbGVtZW50Lmhhc0NsYXNzKCdzZWxlY3QyLWhpZGRlbi1hY2Nlc3NpYmxlJykpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0RWxlbWVudC5zZWxlY3QyKCkuZW1wdHkoKTtcclxuICAgICAgdGhpcy5fc2VsZWN0RWxlbWVudC5zZWxlY3QyKCdkZXN0cm95Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0RWxlbWVudC5zZWxlY3QyKHtcclxuICAgICAgdGFnczogdGhpcy5fdGFnLFxyXG4gICAgICB0b2tlblNlcGFyYXRvcnM6IHRoaXMuX3Rva2VuU2VwYXJhdG9ycyB8fCBbXSxcclxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMuX3BsYWNlaG9sZGVyLFxyXG4gICAgICBhbGxvd0NsZWFyOiAhdGhpcy5fcmVxdWlyZWQsXHJcbiAgICAgIG11bHRpcGxlOiB0aGlzLl9tdWx0aXBsZSxcclxuICAgICAgZGF0YTogdGhpcy5fc2VsZWN0T3B0aW9ucyxcclxuICAgICAgZGlzYWJsZWQ6IHRoaXMuX2Rpc2FibGVkLFxyXG4gICAgICBjcmVhdGVUYWc6IGZ1bmN0aW9uIChwYXJhbXMpIHtcclxuICAgICAgICBjb25zdCB0ZXJtID0gJC50cmltKHBhcmFtcy50ZXJtKTtcclxuXHJcbiAgICAgICAgaWYgKHRlcm0gPT09ICcnKSB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBpZDogTnVtYmVyLmlzSW50ZWdlcigrdGVybSkgPyBgbnVtYmVyOiB7JHt0ZXJtfX1gIDogdGVybSxcclxuICAgICAgICAgIHRleHQ6IHRlcm0sXHJcbiAgICAgICAgICBuZXdUYWc6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50Lm9uKCdzZWxlY3QyOnNlbGVjdCcsICgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEluZGV4ZXMoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQub24oJ3NlbGVjdDI6dW5zZWxlY3QnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRJbmRleGVzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50Lm9uKCdzZWxlY3QyOmNsb3NlJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLl9pc1RvdWNoZWQgPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=