ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
217 lines • 31.7 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Injector } from '@angular/core';
import { UntypedFormControl, Validators } from '@angular/forms';
import { BooleanInputConverter } from '../../../../../decorators/input-converter';
import { SnackBarService } from '../../../../../services/snackbar.service';
import { OTranslateService } from '../../../../../services/translate/o-translate.service';
import { ObservableWrapper } from '../../../../../util/async';
import { Util } from '../../../../../util/util';
import { OTableComponent } from '../../../o-table.component';
import * as i0 from "@angular/core";
import * as i1 from "../../../o-table.component";
export const DEFAULT_INPUTS_O_TABLE_INSERTABLE_ROW = [
'columns',
'requiredColumns : required-columns',
'position',
'showPlaceHolder: show-placeholder',
'includeParentKeys: include-parent-keys'
];
export const DEFAULT_OUTPUTS_O_TABLE_INSERTABLE_ROW = [
'onPostInsertRecord'
];
export class OTableInsertableRowComponent {
constructor(injector, table) {
this.injector = injector;
this.table = table;
this.columnsArray = [];
this.requiredColumnsArray = [];
this.onPostInsertRecord = new EventEmitter();
this.columnEditors = {};
this.position = OTableInsertableRowComponent.DEFAULT_ROW_POSITION;
this.showPlaceHolder = false;
this.includeParentKeys = true;
this.enabled = true;
this.rowData = {};
this.controls = {};
this.translateService = this.injector.get(OTranslateService);
this.snackBarService = this.injector.get(SnackBarService);
}
ngOnInit() {
this.columnsArray = Util.parseArray(this.columns, true);
if (this.columnsArray.length === 0) {
this.columnsArray = this.table.oTableOptions.visibleColumns;
}
this.requiredColumnsArray = Util.parseArray(this.requiredColumns, true);
if (OTableInsertableRowComponent.AVAILABLE_ROW_POSITIONS.indexOf((this.position || '').toLowerCase()) === -1) {
this.position = OTableInsertableRowComponent.DEFAULT_ROW_POSITION;
}
this.table.setOTableInsertableRow(this);
}
isFirstRow() {
return this.position === 'first';
}
isColumnInsertable(column) {
return (this.columnsArray.indexOf(column.attr) !== -1);
}
isColumnRequired(column) {
return (this.requiredColumnsArray.indexOf(column.attr) !== -1);
}
initializeEditors() {
this.table.oTableOptions.columns
.filter((col) => this.isColumnInsertable(col)).forEach(col => {
const columnEditorType = col.editor ? col.editor.type : col.type;
if (col.definition) {
const editor = col.definition.buildCellEditor(columnEditorType, col.definition.container, col.definition, false);
this.columnEditors[col.attr] = editor;
let disabledCol = !this.enabled;
if (!disabledCol) {
const columnPermissions = this.table.getOColumnPermissions(col.attr);
disabledCol = columnPermissions.enabled === false;
}
editor.enabled = !disabledCol;
editor.showPlaceHolder = this.showPlaceHolder || editor.showPlaceHolder;
editor.table = this.table;
editor.tableColumn = col.editor ? col.editor.tableColumn : col.definition;
editor.orequired = this.isColumnRequired(col);
editor.formControl = this.getControl(col, disabledCol);
editor.formGroup.addControl(editor.cellEditorId, editor.formControl);
editor.controlArgs = { silent: true };
editor.rowData = this.rowData;
editor.startEdition(this.rowData);
editor.formControl.markAsUntouched();
}
});
}
useCellEditor(column) {
return this.isColumnInsertable(column) && Util.isDefined(this.columnEditors[column.attr]);
}
getControl(column, disabled = false) {
if (!this.controls[column.attr]) {
const validators = this.resolveValidators(column);
const cfg = {
value: undefined,
disabled: disabled
};
this.controls[column.attr] = new UntypedFormControl(cfg, validators);
}
return this.controls[column.attr];
}
resolveValidators(column) {
const validators = [];
if (column.definition && column.definition.angularValidatorsFn) {
column.definition.angularValidatorsFn.forEach((fn) => {
validators.push(fn);
});
}
if (this.isColumnRequired(column)) {
validators.push(Validators.required);
}
return validators;
}
getPlaceholder(column) {
let showPlaceHolder = this.showPlaceHolder;
const cellEditor = this.columnEditors[column.attr];
if (cellEditor) {
showPlaceHolder = cellEditor.showPlaceHolder;
}
else if (column.definition) {
showPlaceHolder = showPlaceHolder || column.definition.showPlaceHolder;
}
return showPlaceHolder ? this.translateService.get(column.title) : undefined;
}
handleKeyboardEvent(event) {
if (event.keyCode !== 13) {
return;
}
this.trWrapper = event.currentTarget;
event.preventDefault();
event.stopPropagation();
this.insertRecord();
}
insertRecord() {
if (!this.validateFields()) {
return;
}
const values = this.getAttributesValuesToInsert();
const insertObservable = this.table.insertRecord(values);
if (insertObservable) {
insertObservable.subscribe(res => {
this.onInsertSuccess(res);
}, error => {
this.table.showDialogError(error, 'MESSAGES.ERROR_INSERT');
});
}
}
validateFields() {
let valid = true;
Object.keys(this.controls).forEach((controlKey) => {
const control = this.controls[controlKey];
control.markAsTouched();
valid = valid && control.valid;
});
return valid;
}
getAttributesValuesToInsert() {
let attrValues = {};
if (this.includeParentKeys) {
attrValues = this.table.getParentKeysValues();
}
Object.keys(this.controls).forEach((controlKey) => {
attrValues[controlKey] = this.controls[controlKey].value;
});
return attrValues;
}
onInsertSuccess(res) {
ObservableWrapper.callEmit(this.onPostInsertRecord, res);
this.snackBarService.open('MESSAGES.INSERTED', { icon: 'check_circle' });
this.cleanFields();
if (this.table.daoTable.usingStaticData) {
this.table.setDataArray(res);
}
else {
this.table.reloadData();
}
}
cleanFields() {
const controlKeys = Object.keys(this.controls);
controlKeys.forEach((controlKey) => {
this.controls[controlKey].setValue(void 0);
});
const firstInputEl = this.trWrapper.querySelector('input');
if (firstInputEl) {
setTimeout(() => {
firstInputEl.focus();
});
}
}
columnHasError(column, error) {
const control = this.controls[column.attr];
return control && control.touched && control.hasError(error);
}
}
OTableInsertableRowComponent.AVAILABLE_ROW_POSITIONS = ['first', 'last'];
OTableInsertableRowComponent.DEFAULT_ROW_POSITION = 'last';
OTableInsertableRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableInsertableRowComponent, deps: [{ token: i0.Injector }, { token: forwardRef(() => OTableComponent) }], target: i0.ɵɵFactoryTarget.Component });
OTableInsertableRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableInsertableRowComponent, selector: "o-table-insertable-row", inputs: { columns: "columns", requiredColumns: ["required-columns", "requiredColumns"], position: "position", showPlaceHolder: ["show-placeholder", "showPlaceHolder"], includeParentKeys: ["include-parent-keys", "includeParentKeys"] }, outputs: { onPostInsertRecord: "onPostInsertRecord" }, ngImport: i0, template: ' ', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OTableInsertableRowComponent.prototype, "showPlaceHolder", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OTableInsertableRowComponent.prototype, "includeParentKeys", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableInsertableRowComponent, decorators: [{
type: Component,
args: [{
selector: 'o-table-insertable-row',
template: ' ',
changeDetection: ChangeDetectionStrategy.OnPush,
inputs: DEFAULT_INPUTS_O_TABLE_INSERTABLE_ROW,
outputs: DEFAULT_OUTPUTS_O_TABLE_INSERTABLE_ROW
}]
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.OTableComponent, decorators: [{
type: Inject,
args: [forwardRef(() => OTableComponent)]
}] }]; }, propDecorators: { showPlaceHolder: [], includeParentKeys: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1pbnNlcnRhYmxlLXJvdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9leHRlbnNpb25zL2hlYWRlci90YWJsZS1pbnNlcnRhYmxlLXJvdy9vLXRhYmxlLWluc2VydGFibGUtcm93LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLGtCQUFrQixFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUUxRixPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFFN0QsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUc7SUFFbkQsU0FBUztJQUNULG9DQUFvQztJQUVwQyxVQUFVO0lBQ1YsbUNBQW1DO0lBQ25DLHdDQUF3QztDQUN6QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUc7SUFDcEQsb0JBQW9CO0NBQ3JCLENBQUM7QUFVRixNQUFNLE9BQU8sNEJBQTRCO0lBNEJ2QyxZQUNZLFFBQWtCLEVBQ3lCLEtBQXNCO1FBRGpFLGFBQVEsR0FB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Q0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7QUE1TWEsb0RBQXVCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUMsaURBQW9CLEdBQUcsTUFBTSxDQUFDOzBIQUhqQyw0QkFBNEIsMENBOEI3QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDOzhHQTlCaEMsNEJBQTRCLGdXQU43QixHQUFHO0FBdUJiO0lBQUMscUJBQXFCLEVBQUU7O3FFQUNTO0FBQ2pDO0lBQUMscUJBQXFCLEVBQUU7O3VFQUNVOzRGQXBCdkIsNEJBQTRCO2tCQVJ4QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLFFBQVEsRUFBRSxHQUFHO29CQUNiLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxNQUFNLEVBQUUscUNBQXFDO29CQUM3QyxPQUFPLEVBQUUsc0NBQXNDO2lCQUNoRDs7MEJBZ0NJLE1BQU07MkJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQzs0Q0FaM0MsZUFBZSxNQUVmLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5qZWN0LCBJbmplY3RvciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBTbmFja0JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXJ2aWNlcy9zbmFja2Jhci5zZXJ2aWNlJztcbmltcG9ydCB7IE9UcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlL28tdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmFibGVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbC9hc3luYyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9CYXNlVGFibGVDZWxsRWRpdG9yIH0gZnJvbSAnLi4vLi4vLi4vY29sdW1uL2NlbGwtZWRpdG9yL28tYmFzZS10YWJsZS1jZWxsLWVkaXRvci5jbGFzcyc7XG5pbXBvcnQgdHlwZSB7IE9Db2x1bW4gfSBmcm9tICcuLi8uLi8uLi9jb2x1bW4vby1jb2x1bW4uY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vby10YWJsZS5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlBVVFNfT19UQUJMRV9JTlNFUlRBQkxFX1JPVyA9IFtcbiAgLy8gY29sdW1ucyBbc3RyaW5nXTogY29sdW1ucyB0aGF0IGNhbiBiZSBpbnNlcnRlZCwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogYWxsIHZpc2libGUgY29sdW1ucy5cbiAgJ2NvbHVtbnMnLFxuICAncmVxdWlyZWRDb2x1bW5zIDogcmVxdWlyZWQtY29sdW1ucycsXG4gIC8vIHBvc2l0aW9uIFtmaXJzdCB8bGFzdCBdIGRlZmF1bHQ6IGxhc3RcbiAgJ3Bvc2l0aW9uJyxcbiAgJ3Nob3dQbGFjZUhvbGRlcjogc2hvdy1wbGFjZWhvbGRlcicsXG4gICdpbmNsdWRlUGFyZW50S2V5czogaW5jbHVkZS1wYXJlbnQta2V5cydcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19UQUJMRV9JTlNFUlRBQkxFX1JPVyA9IFtcbiAgJ29uUG9zdEluc2VydFJlY29yZCdcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tdGFibGUtaW5zZXJ0YWJsZS1yb3cnLFxuICB0ZW1wbGF0ZTogJyAnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW5wdXRzOiBERUZBVUxUX0lOUFVUU19PX1RBQkxFX0lOU0VSVEFCTEVfUk9XLFxuICBvdXRwdXRzOiBERUZBVUxUX09VVFBVVFNfT19UQUJMRV9JTlNFUlRBQkxFX1JPV1xufSlcblxuZXhwb3J0IGNsYXNzIE9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgQVZBSUxBQkxFX1JPV19QT1NJVElPTlMgPSBbJ2ZpcnN0JywgJ2xhc3QnXTtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1JPV19QT1NJVElPTiA9ICdsYXN0JztcblxuICBwcm90ZWN0ZWQgY29sdW1uczogc3RyaW5nO1xuICBwcm90ZWN0ZWQgY29sdW1uc0FycmF5OiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVkQ29sdW1uczogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVxdWlyZWRDb2x1bW5zQXJyYXk6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICBvblBvc3RJbnNlcnRSZWNvcmQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBjb2x1bW5FZGl0b3JzOiBhbnkgPSB7fTtcbiAgdHJXcmFwcGVyOiBFdmVudFRhcmdldDtcblxuICBwcm90ZWN0ZWQgcG9zaXRpb246IHN0cmluZyA9IE9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuREVGQVVMVF9ST1dfUE9TSVRJT047XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dQbGFjZUhvbGRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgaW5jbHVkZVBhcmVudEtleXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGVuYWJsZWQgPSB0cnVlO1xuICByb3dEYXRhID0ge307XG4gIHByb3RlY3RlZCBjb250cm9sczogYW55ID0ge307XG4gIHRyYW5zbGF0ZVNlcnZpY2U6IE9UcmFuc2xhdGVTZXJ2aWNlO1xuICBzbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBPVGFibGVDb21wb25lbnQpKSBwcm90ZWN0ZWQgdGFibGU6IE9UYWJsZUNvbXBvbmVudFxuICApIHtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChPVHJhbnNsYXRlU2VydmljZSk7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChTbmFja0JhclNlcnZpY2UpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb2x1bW5zQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5jb2x1bW5zLCB0cnVlKTtcbiAgICBpZiAodGhpcy5jb2x1bW5zQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNvbHVtbnNBcnJheSA9IHRoaXMudGFibGUub1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucztcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlZENvbHVtbnNBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLnJlcXVpcmVkQ29sdW1ucywgdHJ1ZSk7XG4gICAgaWYgKE9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuQVZBSUxBQkxFX1JPV19QT1NJVElPTlMuaW5kZXhPZigodGhpcy5wb3NpdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX1JPV19QT1NJVElPTjtcbiAgICB9XG4gICAgdGhpcy50YWJsZS5zZXRPVGFibGVJbnNlcnRhYmxlUm93KHRoaXMpO1xuICB9XG5cbiAgaXNGaXJzdFJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gJ2ZpcnN0JztcbiAgfVxuXG4gIGlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuY29sdW1uc0FycmF5LmluZGV4T2YoY29sdW1uLmF0dHIpICE9PSAtMSk7XG4gIH1cblxuICBpc0NvbHVtblJlcXVpcmVkKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5yZXF1aXJlZENvbHVtbnNBcnJheS5pbmRleE9mKGNvbHVtbi5hdHRyKSAhPT0gLTEpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUVkaXRvcnMoKTogdm9pZCB7XG4gICAgdGhpcy50YWJsZS5vVGFibGVPcHRpb25zLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gdGhpcy5pc0NvbHVtbkluc2VydGFibGUoY29sKSkuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW5FZGl0b3JUeXBlID0gY29sLmVkaXRvciA/IGNvbC5lZGl0b3IudHlwZSA6IGNvbC50eXBlO1xuICAgICAgICBpZiAoY29sLmRlZmluaXRpb24pIHtcbiAgICAgICAgICBjb25zdCBlZGl0b3I6IE9CYXNlVGFibGVDZWxsRWRpdG9yID0gY29sLmRlZmluaXRpb24uYnVpbGRDZWxsRWRpdG9yKGNvbHVtbkVkaXRvclR5cGUsIGNvbC5kZWZpbml0aW9uLmNvbnRhaW5lciwgY29sLmRlZmluaXRpb24sIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmNvbHVtbkVkaXRvcnNbY29sLmF0dHJdID0gZWRpdG9yO1xuICAgICAgICAgIGxldCBkaXNhYmxlZENvbCA9ICF0aGlzLmVuYWJsZWQ7XG4gICAgICAgICAgaWYgKCFkaXNhYmxlZENvbCkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uUGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IHRoaXMudGFibGUuZ2V0T0NvbHVtblBlcm1pc3Npb25zKGNvbC5hdHRyKTtcbiAgICAgICAgICAgIGRpc2FibGVkQ29sID0gY29sdW1uUGVybWlzc2lvbnMuZW5hYmxlZCA9PT0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVkaXRvci5lbmFibGVkID0gIWRpc2FibGVkQ29sO1xuICAgICAgICAgIGVkaXRvci5zaG93UGxhY2VIb2xkZXIgPSB0aGlzLnNob3dQbGFjZUhvbGRlciB8fCBlZGl0b3Iuc2hvd1BsYWNlSG9sZGVyO1xuICAgICAgICAgIGVkaXRvci50YWJsZSA9IHRoaXMudGFibGU7XG4gICAgICAgICAgZWRpdG9yLnRhYmxlQ29sdW1uID0gY29sLmVkaXRvciA/IGNvbC5lZGl0b3IudGFibGVDb2x1bW4gOiBjb2wuZGVmaW5pdGlvbjtcbiAgICAgICAgICBlZGl0b3Iub3JlcXVpcmVkID0gdGhpcy5pc0NvbHVtblJlcXVpcmVkKGNvbCk7XG4gICAgICAgICAgZWRpdG9yLmZvcm1Db250cm9sID0gdGhpcy5nZXRDb250cm9sKGNvbCwgZGlzYWJsZWRDb2wpO1xuICAgICAgICAgIGVkaXRvci5mb3JtR3JvdXAuYWRkQ29udHJvbChlZGl0b3IuY2VsbEVkaXRvcklkLCBlZGl0b3IuZm9ybUNvbnRyb2wpO1xuICAgICAgICAgIGVkaXRvci5jb250cm9sQXJncyA9IHsgc2lsZW50OiB0cnVlIH07XG4gICAgICAgICAgZWRpdG9yLnJvd0RhdGEgPSB0aGlzLnJvd0RhdGE7XG4gICAgICAgICAgZWRpdG9yLnN0YXJ0RWRpdGlvbih0aGlzLnJvd0RhdGEpO1xuICAgICAgICAgIGVkaXRvci5mb3JtQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxuXG4gIHVzZUNlbGxFZGl0b3IoY29sdW1uOiBPQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5jb2x1bW5FZGl0b3JzW2NvbHVtbi5hdHRyXSk7XG4gIH1cblxuICBnZXRDb250cm9sKGNvbHVtbjogT0NvbHVtbiwgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IFVudHlwZWRGb3JtQ29udHJvbCB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xzW2NvbHVtbi5hdHRyXSkge1xuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IHRoaXMucmVzb2x2ZVZhbGlkYXRvcnMoY29sdW1uKTtcbiAgICAgIGNvbnN0IGNmZyA9IHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgICB9O1xuICAgICAgdGhpcy5jb250cm9sc1tjb2x1bW4uYXR0cl0gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKGNmZywgdmFsaWRhdG9ycyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzW2NvbHVtbi5hdHRyXTtcbiAgfVxuXG4gIHJlc29sdmVWYWxpZGF0b3JzKGNvbHVtbjogT0NvbHVtbik6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcbiAgICBpZiAoY29sdW1uLmRlZmluaXRpb24gJiYgY29sdW1uLmRlZmluaXRpb24uYW5ndWxhclZhbGlkYXRvcnNGbikge1xuICAgICAgY29sdW1uLmRlZmluaXRpb24uYW5ndWxhclZhbGlkYXRvcnNGbi5mb3JFYWNoKChmbjogVmFsaWRhdG9yRm4pID0+IHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKGZuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0NvbHVtblJlcXVpcmVkKGNvbHVtbikpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuICBnZXRQbGFjZWhvbGRlcihjb2x1bW46IE9Db2x1bW4pOiBzdHJpbmcge1xuICAgIGxldCBzaG93UGxhY2VIb2xkZXIgPSB0aGlzLnNob3dQbGFjZUhvbGRlcjtcbiAgICBjb25zdCBjZWxsRWRpdG9yID0gdGhpcy5jb2x1bW5FZGl0b3JzW2NvbHVtbi5hdHRyXTtcbiAgICBpZiAoY2VsbEVkaXRvcikge1xuICAgICAgc2hvd1BsYWNlSG9sZGVyID0gY2VsbEVkaXRvci5zaG93UGxhY2VIb2xkZXI7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4uZGVmaW5pdGlvbikge1xuICAgICAgc2hvd1BsYWNlSG9sZGVyID0gc2hvd1BsYWNlSG9sZGVyIHx8IGNvbHVtbi5kZWZpbml0aW9uLnNob3dQbGFjZUhvbGRlcjtcbiAgICB9XG4gICAgcmV0dXJuIHNob3dQbGFjZUhvbGRlciA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoY29sdW1uLnRpdGxlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSAhPT0gMTMpIHtcbiAgICAgIC8vIG5vdCBpbnRyb1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRyV3JhcHBlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaW5zZXJ0UmVjb3JkKCk7XG4gIH1cblxuICBpbnNlcnRSZWNvcmQoKSB7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRmllbGRzKCkpIHtcbiAgICAgIC8vIHRoaXMudGFibGUuc2hvd0RpYWxvZ0Vycm9yKCdUQUJMRS5ST1dfVkFMSURBVElPTl9FUlJPUicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNWYWx1ZXNUb0luc2VydCgpO1xuICAgIGNvbnN0IGluc2VydE9ic2VydmFibGU6IE9ic2VydmFibGU8YW55PiA9IHRoaXMudGFibGUuaW5zZXJ0UmVjb3JkKHZhbHVlcyk7XG4gICAgaWYgKGluc2VydE9ic2VydmFibGUpIHtcbiAgICAgIGluc2VydE9ic2VydmFibGUuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIHRoaXMub25JbnNlcnRTdWNjZXNzKHJlcyk7XG4gICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgIHRoaXMudGFibGUuc2hvd0RpYWxvZ0Vycm9yKGVycm9yLCAnTUVTU0FHRVMuRVJST1JfSU5TRVJUJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVGaWVsZHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICAvLyBjb2x1bW5zIHdpdGggbm8gZWRpdG9yIGRlZmluZWRcbiAgICBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKS5mb3JFYWNoKChjb250cm9sS2V5KSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9sc1tjb250cm9sS2V5XTtcbiAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgdmFsaWQgPSB2YWxpZCAmJiBjb250cm9sLnZhbGlkO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBdHRyaWJ1dGVzVmFsdWVzVG9JbnNlcnQoKTogb2JqZWN0IHtcbiAgICBsZXQgYXR0clZhbHVlcyA9IHt9O1xuICAgIGlmICh0aGlzLmluY2x1ZGVQYXJlbnRLZXlzKSB7XG4gICAgICBhdHRyVmFsdWVzID0gdGhpcy50YWJsZS5nZXRQYXJlbnRLZXlzVmFsdWVzKCk7XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmZvckVhY2goKGNvbnRyb2xLZXkpID0+IHtcbiAgICAgIGF0dHJWYWx1ZXNbY29udHJvbEtleV0gPSB0aGlzLmNvbnRyb2xzW2NvbnRyb2xLZXldLnZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiBhdHRyVmFsdWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5zZXJ0U3VjY2VzcyhyZXM6IGFueSkge1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25Qb3N0SW5zZXJ0UmVjb3JkLCByZXMpO1xuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLklOU0VSVEVEJywgeyBpY29uOiAnY2hlY2tfY2lyY2xlJyB9KTtcbiAgICB0aGlzLmNsZWFuRmllbGRzKCk7XG5cbiAgICBpZiAodGhpcy50YWJsZS5kYW9UYWJsZS51c2luZ1N0YXRpY0RhdGEpIHtcbiAgICAgIHRoaXMudGFibGUuc2V0RGF0YUFycmF5KHJlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFibGUucmVsb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhbkZpZWxkcygpIHtcbiAgICAvLyBjb2x1bW5zIHdpdGggbm8gZWRpdG9yIGRlZmluZWRcbiAgICBjb25zdCBjb250cm9sS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpO1xuICAgIGNvbnRyb2xLZXlzLmZvckVhY2goKGNvbnRyb2xLZXkpID0+IHtcbiAgICAgIHRoaXMuY29udHJvbHNbY29udHJvbEtleV0uc2V0VmFsdWUodm9pZCAwKTtcbiAgICB9KTtcbiAgICBjb25zdCBmaXJzdElucHV0RWwgPSAodGhpcy50cldyYXBwZXIgYXMgYW55KS5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmIChmaXJzdElucHV0RWwpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaXJzdElucHV0RWwuZm9jdXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbHVtbkhhc0Vycm9yKGNvbHVtbjogT0NvbHVtbiwgZXJyb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xzW2NvbHVtbi5hdHRyXTtcbiAgICByZXR1cm4gY29udHJvbCAmJiBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5oYXNFcnJvcihlcnJvcik7XG4gIH1cblxufVxuIl19