@yyasinaslan/easyform
Version:
Angular Easy Form
230 lines • 29.7 kB
JavaScript
import { FormArray, FormControl, FormGroup } from "@angular/forms";
import { AdvancedControlTypes } from "./interfaces/advanced-control-types";
import { EasyFormGenerator } from "./easy-form-generator";
import { EasyFormField } from "./easy-form-field";
export class EasyForm extends EasyFormGenerator {
constructor(schema, options) {
super();
// default options
this.options = {
showErrors: 'submitted',
components: {}
};
this.schema = schema;
this.options = { ...this.options, ...options };
this.formGroup = this.createFormGroup(this.schema);
}
get invalid() {
return this.formGroup.invalid;
}
get valid() {
return this.formGroup.valid;
}
get value() {
return this.formGroup.value;
}
get valueChanges() {
return this.formGroup.valueChanges;
}
/**
* Create a new instance of EasyForm
* @param schema
* @param options
*/
static create(schema, options) {
return new EasyForm(schema, options);
}
/**
* Traverse through schema and get definition
* @param path
*/
getSchema(path) {
const normalisedPath = typeof path == 'string' ? path.split('.') : path;
if (!path || path.length == 0) {
return null;
}
return this._getSchemaWithPath(normalisedPath, this.schema);
}
/**
* Disable all form
*/
disable() {
this.formGroup.disable();
}
/**
* Enable all form
*/
enable() {
this.formGroup.enable();
}
getComponentType(type) {
if (!this.options.components) {
return null;
}
const c = this.options.components[type];
if (!c) {
return null;
}
return c;
}
getControl(path) {
return this.formGroup.get(path);
}
getArrayControls(path) {
const arrayControl = this.getControl(path);
if (!arrayControl)
return [];
return arrayControl.controls;
}
getValue(path) {
if (path) {
return this.formGroup.get(path)?.value;
}
return this.formGroup.value;
}
getRawValue(path) {
if (path) {
return this.formGroup.get(path)?.getRawValue();
}
return this.formGroup.getRawValue();
}
setValue(value, path) {
if (path) {
this.formGroup.get(path)?.setValue(value);
return;
}
this.formGroup.setValue(value);
}
patchValue(value, path) {
if (path) {
this.formGroup.get(path)?.patchValue(value);
return;
}
this.formGroup.patchValue(value);
}
addToArray(path, value) {
const arr = this.formGroup.get(path);
const schema = this.getSchema(path);
if (!schema) {
throw new Error(`Cannot find form schema for ${path}`);
}
if (!arr) {
throw new Error(`Cannot find form array for ${path}`);
}
if (schema.controlType === AdvancedControlTypes.Array) {
const g = this.createFormGroup(schema.schema, value);
arr.push(g);
}
else if (schema.controlType === AdvancedControlTypes.ArraySimple) {
const arrayField = schema.schema;
const validations = arrayField.validations ?? {};
const control = new FormControl(value, this.createValidations(validations));
arr.push(control);
}
}
removeFromArray(path, index) {
const arr = this.formGroup.get(path);
if (arr) {
arr.removeAt(index);
}
}
createFormGroup(schema, initialValue, validations) {
const group = new FormGroup({});
for (const key in schema) {
const field = schema[key];
if (field.controlType == 'group') {
const g = this.createFormGroup(field.schema, field.initialValue, field.validations);
group.addControl(key, g);
}
else if (field.controlType == 'array') {
const a = this.createFormArray(field.schema, field.initialValue, field.validations);
group.addControl(key, a);
}
else if (field.controlType == 'arraySimple') {
const a = this.createSimpleFormArray(field, field.initialValue, field.validations);
group.addControl(key, a);
}
else {
const control = new FormControl(field.initialValue, field.validations ? this.createValidations(field.validations) : []);
group.addControl(key, control);
}
}
if (validations) {
group.addValidators(this.createValidations(validations));
}
if (initialValue) {
group.patchValue(initialValue);
}
return group;
}
createFormArray(schema, initialValue, validations) {
const array = new FormArray([]);
if (initialValue && Array.isArray(initialValue)) {
initialValue.forEach((item) => {
const group = this.createFormGroup(schema);
group.patchValue(item);
array.push(group);
});
}
if (validations) {
array.addValidators(this.createValidations(validations));
}
return array;
}
createSimpleFormArray(schema, initialValue, validations) {
const array = new FormArray([]);
const field = schema.schema;
if (initialValue && Array.isArray(initialValue)) {
initialValue.forEach((item, index) => {
const control = new FormControl(item, field.validations ? this.createValidations(field.validations) : []);
array.push(control);
});
}
if (validations) {
array.addValidators(this.createValidations(validations));
}
return array;
}
createValidations(validations) {
const validators = [];
if (validations) {
for (const validationKey in validations) {
const v = validations[validationKey];
validators.push(v.validator);
}
}
return validators;
}
_getSchemaWithPath(path, schema) {
const head = path[0];
const tail = path.slice(1);
const hasIndex = !!head.toString().match(/^[0-9]+/);
if (hasIndex) {
if (schema instanceof EasyFormField) {
return schema ?? null;
}
else {
if (tail.length == 0) {
return schema ?? null;
}
else {
return this._getSchemaWithPath(tail, schema);
}
}
}
if (schema instanceof EasyFormField) {
return schema.schema ?? null;
}
const childSchema = schema[head.toString()];
if (childSchema) {
if (tail.length == 0) {
return childSchema;
}
else {
return this._getSchemaWithPath(tail, childSchema.schema ?? {});
}
}
return null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWFzeS1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZWFzeS1mb3JtL3NyYy9saWIvZWFzeS1mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQWlCaEQsTUFBTSxPQUFPLFFBQTBCLFNBQVEsaUJBQWlCO0lBYzlELFlBQVksTUFBNkIsRUFBRSxPQUF5QjtRQUNsRSxLQUFLLEVBQUUsQ0FBQztRQVBWLGtCQUFrQjtRQUNYLFlBQU8sR0FBb0I7WUFDaEMsVUFBVSxFQUFFLFdBQVc7WUFDdkIsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO1FBSUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUks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QUM7WUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNyQixPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Rm9ybVNjaGVtYX0gZnJvbSBcIi4vaW50ZXJmYWNlcy9mb3JtLXNjaGVtYVwiO1xyXG5pbXBvcnQge1ZhbGlkYXRpb259IGZyb20gXCIuL2ludGVyZmFjZXMvdmFsaWRhdGlvblwiO1xyXG5pbXBvcnQge1NpZ25hbH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0Zvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7QmFzaWNDb250cm9sVHlwZXN9IGZyb20gXCIuL2ludGVyZmFjZXMvYmFzaWMtY29udHJvbC10eXBlc1wiO1xyXG5pbXBvcnQge0FkdmFuY2VkQ29udHJvbFR5cGVzfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2FkdmFuY2VkLWNvbnRyb2wtdHlwZXNcIjtcclxuaW1wb3J0IHtFYXN5Rm9ybUdlbmVyYXRvcn0gZnJvbSBcIi4vZWFzeS1mb3JtLWdlbmVyYXRvclwiO1xyXG5pbXBvcnQge0Vhc3lGb3JtQ29udHJvbENvbXBvbmVudCwgTGF6eUxvYWRpbmdDb21wb25lbnR9IGZyb20gXCIuL3Rva2Vucy9lYXN5LWZvcm0tY29uZmlnXCI7XHJcbmltcG9ydCB7RWFzeUZvcm1GaWVsZH0gZnJvbSBcIi4vZWFzeS1mb3JtLWZpZWxkXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVhc3lGb3JtT3B0aW9ucyB7XHJcbiAgc2hvd0Vycm9ycz86ICdzdWJtaXR0ZWQnIHwgJ3RvdWNoZWQnIHwgJ2RpcnR5JyB8ICdhbHdheXMnIHwgJ25ldmVyJztcclxuICAvLyBGb3JtIGJhc2VkIHZhbGlkYXRpb25zXHJcblxyXG4gIHZhbGlkYXRpb25zPzogUmVjb3JkPHN0cmluZywgVmFsaWRhdGlvbj47XHJcbiAgLy8gRGlzYWJsZWQgc3RhdGUgb2YgdGhlIGZvcm1cclxuXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuIHwgU2lnbmFsPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAvLyBGb3JtIGZpZWxkIGNvbXBvbmVudHNcclxuXHJcbiAgY29tcG9uZW50cz86IFJlY29yZDxzdHJpbmcsIEVhc3lGb3JtQ29udHJvbENvbXBvbmVudCB8IExhenlMb2FkaW5nQ29tcG9uZW50PlxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJbmZlclZhbHVlVHlwZTxTY2hlbWEgZXh0ZW5kcyBGb3JtU2NoZW1hPiA9IHsgW2tleSBpbiBrZXlvZiBTY2hlbWFdOiBTY2hlbWFba2V5XVsnaW5pdGlhbFZhbHVlJ10gfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBFYXN5Rm9ybTxWYWx1ZVR5cGUgPSBhbnk+IGV4dGVuZHMgRWFzeUZvcm1HZW5lcmF0b3Ige1xyXG5cclxuICAvKipcclxuICAgKiBSZWFjdGl2aXR5IG9mIGFjdHVhbCBmb3JtIGlzIG1hbmFnZWQgYnkgYW5ndWxhciByZWFjdGl2ZSBmb3JtXHJcbiAgICovXHJcbiAgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgc2NoZW1hITogRm9ybVNjaGVtYTxWYWx1ZVR5cGU+O1xyXG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xyXG4gIHB1YmxpYyBvcHRpb25zOiBFYXN5Rm9ybU9wdGlvbnMgPSB7XHJcbiAgICBzaG93RXJyb3JzOiAnc3VibWl0dGVkJyxcclxuICAgIGNvbXBvbmVudHM6IHt9XHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3Ioc2NoZW1hOiBGb3JtU2NoZW1hPFZhbHVlVHlwZT4sIG9wdGlvbnM/OiBFYXN5Rm9ybU9wdGlvbnMpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcclxuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLm9wdGlvbnMsIC4uLm9wdGlvbnN9O1xyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZUZvcm1Hcm91cCh0aGlzLnNjaGVtYSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5pbnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbGlkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IFZhbHVlVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAudmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWVDaGFuZ2VzKCk6IE9ic2VydmFibGU8VmFsdWVUeXBlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEVhc3lGb3JtXHJcbiAgICogQHBhcmFtIHNjaGVtYVxyXG4gICAqIEBwYXJhbSBvcHRpb25zXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGU8VCA9IGFueT4oc2NoZW1hOiBGb3JtU2NoZW1hPFQ+LCBvcHRpb25zPzogRWFzeUZvcm1PcHRpb25zKSB7XHJcbiAgICByZXR1cm4gbmV3IEVhc3lGb3JtPFQ+KHNjaGVtYSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmF2ZXJzZSB0aHJvdWdoIHNjaGVtYSBhbmQgZ2V0IGRlZmluaXRpb25cclxuICAgKiBAcGFyYW0gcGF0aFxyXG4gICAqL1xyXG4gIGdldFNjaGVtYShwYXRoOiBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSB7XHJcbiAgICBjb25zdCBub3JtYWxpc2VkUGF0aCA9IHR5cGVvZiBwYXRoID09ICdzdHJpbmcnID8gcGF0aC5zcGxpdCgnLicpIDogcGF0aDtcclxuICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2dldFNjaGVtYVdpdGhQYXRoKG5vcm1hbGlzZWRQYXRoLCB0aGlzLnNjaGVtYSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNhYmxlIGFsbCBmb3JtXHJcbiAgICovXHJcbiAgZGlzYWJsZSgpIHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlIGFsbCBmb3JtXHJcbiAgICovXHJcbiAgZW5hYmxlKCkge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAuZW5hYmxlKClcclxuICB9XHJcblxyXG4gIGdldENvbXBvbmVudFR5cGUodHlwZTogQmFzaWNDb250cm9sVHlwZXMgfCBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmNvbXBvbmVudHMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjID0gdGhpcy5vcHRpb25zLmNvbXBvbmVudHNbdHlwZV07XHJcbiAgICBpZiAoIWMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIGdldENvbnRyb2w8Q29udHJvbFR5cGUgPSBGb3JtQ29udHJvbD4ocGF0aDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldChwYXRoKSBhcyBDb250cm9sVHlwZTtcclxuICB9XHJcblxyXG4gIGdldEFycmF5Q29udHJvbHMocGF0aDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikge1xyXG4gICAgY29uc3QgYXJyYXlDb250cm9sID0gdGhpcy5nZXRDb250cm9sPEZvcm1BcnJheT4ocGF0aCk7XHJcbiAgICBpZiAoIWFycmF5Q29udHJvbCkgcmV0dXJuIFtdO1xyXG4gICAgcmV0dXJuIGFycmF5Q29udHJvbC5jb250cm9scyBhcyBGb3JtQ29udHJvbFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0VmFsdWU8VmFsdWVUeXBlID0gYW55PihwYXRoPzogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPik6IFZhbHVlVHlwZSB7XHJcbiAgICBpZiAocGF0aCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KHBhdGgpPy52YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldFJhd1ZhbHVlPFZhbHVlVHlwZSA9IGFueT4ocGF0aD86IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4pOiBWYWx1ZVR5cGUge1xyXG4gICAgaWYgKHBhdGgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldChwYXRoKT8uZ2V0UmF3VmFsdWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsdWUodmFsdWU6IGFueSwgcGF0aD86IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4pIHtcclxuICAgIGlmIChwYXRoKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChwYXRoKT8uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Hcm91cC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFZhbHVlKHZhbHVlOiBhbnksIHBhdGg/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSB7XHJcbiAgICBpZiAocGF0aCkge1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5nZXQocGF0aCk/LnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFkZFRvQXJyYXkocGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICBjb25zdCBhcnIgPSB0aGlzLmZvcm1Hcm91cC5nZXQocGF0aCkgYXMgRm9ybUFycmF5O1xyXG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEocGF0aCk7XHJcbiAgICBpZiAoIXNjaGVtYSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGZvcm0gc2NoZW1hIGZvciAke3BhdGh9YCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWFycikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGZvcm0gYXJyYXkgZm9yICR7cGF0aH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLmNvbnRyb2xUeXBlID09PSBBZHZhbmNlZENvbnRyb2xUeXBlcy5BcnJheSkge1xyXG4gICAgICBjb25zdCBnID0gdGhpcy5jcmVhdGVGb3JtR3JvdXAoc2NoZW1hLnNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBFYXN5Rm9ybUZpZWxkPiwgdmFsdWUpO1xyXG4gICAgICBhcnIucHVzaChnKTtcclxuICAgIH0gZWxzZSBpZiAoc2NoZW1hLmNvbnRyb2xUeXBlID09PSBBZHZhbmNlZENvbnRyb2xUeXBlcy5BcnJheVNpbXBsZSkge1xyXG4gICAgICBjb25zdCBhcnJheUZpZWxkID0gc2NoZW1hLnNjaGVtYSBhcyBFYXN5Rm9ybUZpZWxkO1xyXG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IGFycmF5RmllbGQudmFsaWRhdGlvbnMgPz8ge307XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodmFsdWUsIHRoaXMuY3JlYXRlVmFsaWRhdGlvbnModmFsaWRhdGlvbnMpKTtcclxuICAgICAgYXJyLnB1c2goY29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRnJvbUFycmF5KHBhdGg6IHN0cmluZywgaW5kZXg6IGFueSkge1xyXG4gICAgY29uc3QgYXJyID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHBhdGgpIGFzIEZvcm1BcnJheTtcclxuICAgIGlmIChhcnIpIHtcclxuICAgICAgYXJyLnJlbW92ZUF0KGluZGV4KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtR3JvdXAoc2NoZW1hOiBGb3JtU2NoZW1hLCBpbml0aWFsVmFsdWU/OiBhbnksIHZhbGlkYXRpb25zPzogRWFzeUZvcm1GaWVsZFsndmFsaWRhdGlvbnMnXSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBncm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSkge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYVtrZXldO1xyXG4gICAgICBpZiAoZmllbGQuY29udHJvbFR5cGUgPT0gJ2dyb3VwJykge1xyXG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLmNyZWF0ZUZvcm1Hcm91cChmaWVsZC5zY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgRWFzeUZvcm1GaWVsZD4sIGZpZWxkLmluaXRpYWxWYWx1ZSwgZmllbGQudmFsaWRhdGlvbnMpO1xyXG4gICAgICAgIGdyb3VwLmFkZENvbnRyb2woa2V5LCBnKTtcclxuICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sVHlwZSA9PSAnYXJyYXknKSB7XHJcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuY3JlYXRlRm9ybUFycmF5KGZpZWxkLnNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBFYXN5Rm9ybUZpZWxkPiwgZmllbGQuaW5pdGlhbFZhbHVlLCBmaWVsZC52YWxpZGF0aW9ucyk7XHJcbiAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIGEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLmNvbnRyb2xUeXBlID09ICdhcnJheVNpbXBsZScpIHtcclxuICAgICAgICBjb25zdCBhID0gdGhpcy5jcmVhdGVTaW1wbGVGb3JtQXJyYXkoZmllbGQgYXMgYW55LCBmaWVsZC5pbml0aWFsVmFsdWUsIGZpZWxkLnZhbGlkYXRpb25zKTtcclxuICAgICAgICBncm91cC5hZGRDb250cm9sKGtleSwgYSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChmaWVsZC5pbml0aWFsVmFsdWUsIGZpZWxkLnZhbGlkYXRpb25zID8gdGhpcy5jcmVhdGVWYWxpZGF0aW9ucyhmaWVsZC52YWxpZGF0aW9ucykgOiBbXSk7XHJcbiAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIGNvbnRyb2wpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbGlkYXRpb25zKSB7XHJcbiAgICAgIGdyb3VwLmFkZFZhbGlkYXRvcnModGhpcy5jcmVhdGVWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbml0aWFsVmFsdWUpIHtcclxuICAgICAgZ3JvdXAucGF0Y2hWYWx1ZShpbml0aWFsVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncm91cDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRm9ybUFycmF5KHNjaGVtYTogRm9ybVNjaGVtYSwgaW5pdGlhbFZhbHVlPzogYW55LCB2YWxpZGF0aW9ucz86IEVhc3lGb3JtRmllbGRbJ3ZhbGlkYXRpb25zJ10pOiBGb3JtQXJyYXkge1xyXG4gICAgY29uc3QgYXJyYXkgPSBuZXcgRm9ybUFycmF5PGFueT4oW10pO1xyXG5cclxuICAgIGlmIChpbml0aWFsVmFsdWUgJiYgQXJyYXkuaXNBcnJheShpbml0aWFsVmFsdWUpKSB7XHJcbiAgICAgIGluaXRpYWxWYWx1ZS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuY3JlYXRlRm9ybUdyb3VwKHNjaGVtYSk7XHJcbiAgICAgICAgZ3JvdXAucGF0Y2hWYWx1ZShpdGVtKTtcclxuICAgICAgICBhcnJheS5wdXNoKGdyb3VwKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbGlkYXRpb25zKSB7XHJcbiAgICAgIGFycmF5LmFkZFZhbGlkYXRvcnModGhpcy5jcmVhdGVWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2ltcGxlRm9ybUFycmF5KHNjaGVtYTogRWFzeUZvcm1GaWVsZCwgaW5pdGlhbFZhbHVlPzogYW55LCB2YWxpZGF0aW9ucz86IEVhc3lGb3JtRmllbGRbJ3ZhbGlkYXRpb25zJ10pOiBGb3JtQXJyYXkge1xyXG4gICAgY29uc3QgYXJyYXkgPSBuZXcgRm9ybUFycmF5PGFueT4oW10pO1xyXG4gICAgY29uc3QgZmllbGQgPSBzY2hlbWEuc2NoZW1hIGFzIEVhc3lGb3JtRmllbGQ7XHJcblxyXG4gICAgaWYgKGluaXRpYWxWYWx1ZSAmJiBBcnJheS5pc0FycmF5KGluaXRpYWxWYWx1ZSkpIHtcclxuICAgICAgaW5pdGlhbFZhbHVlLmZvckVhY2goKGl0ZW06IGFueSwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKGl0ZW0sIGZpZWxkLnZhbGlkYXRpb25zID8gdGhpcy5jcmVhdGVWYWxpZGF0aW9ucyhmaWVsZC52YWxpZGF0aW9ucykgOiBbXSk7XHJcbiAgICAgICAgYXJyYXkucHVzaChjb250cm9sKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbGlkYXRpb25zKSB7XHJcbiAgICAgIGFycmF5LmFkZFZhbGlkYXRvcnModGhpcy5jcmVhdGVWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVmFsaWRhdGlvbnModmFsaWRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFZhbGlkYXRpb24+KSB7XHJcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XHJcbiAgICBpZiAodmFsaWRhdGlvbnMpIHtcclxuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uS2V5IGluIHZhbGlkYXRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgdiA9IHZhbGlkYXRpb25zW3ZhbGlkYXRpb25LZXldO1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCh2LnZhbGlkYXRvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0U2NoZW1hV2l0aFBhdGgocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2NoZW1hOiBGb3JtU2NoZW1hIHwgRWFzeUZvcm1GaWVsZCk6IEZvcm1TY2hlbWEgfCBFYXN5Rm9ybUZpZWxkIHwgbnVsbCB7XHJcbiAgICBjb25zdCBoZWFkID0gcGF0aFswXTtcclxuICAgIGNvbnN0IHRhaWwgPSBwYXRoLnNsaWNlKDEpXHJcblxyXG4gICAgY29uc3QgaGFzSW5kZXggPSAhIWhlYWQudG9TdHJpbmcoKS5tYXRjaCgvXlswLTldKy8pO1xyXG4gICAgaWYgKGhhc0luZGV4KSB7XHJcbiAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBFYXN5Rm9ybUZpZWxkKSB7XHJcbiAgICAgICAgcmV0dXJuIHNjaGVtYSA/PyBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0YWlsLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gc2NoZW1hID8/IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTY2hlbWFXaXRoUGF0aCh0YWlsLCBzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgRWFzeUZvcm1GaWVsZCkge1xyXG4gICAgICByZXR1cm4gc2NoZW1hLnNjaGVtYSA/PyBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoaWxkU2NoZW1hID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBFYXN5Rm9ybUZpZWxkPilbaGVhZC50b1N0cmluZygpXTtcclxuICAgIGlmIChjaGlsZFNjaGVtYSkge1xyXG4gICAgICBpZiAodGFpbC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHJldHVybiBjaGlsZFNjaGVtYTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2NoZW1hV2l0aFBhdGgodGFpbCwgY2hpbGRTY2hlbWEuc2NoZW1hID8/IHt9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=