UNPKG

@ng-flexy/form

Version:

Flexy components and tools to build Angular 8+ applications

403 lines 74.4 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; import { COMPLEX_TYPE_INDEX_MARKER, FlexyFormFieldType } from '../models/layout-json-schema.model'; import { FlexyLayoutJsonMapperService } from '@ng-flexy/layout'; import { cloneDeep, get, has } from 'lodash'; import { FlexyLoggerService } from '@ng-flexy/core'; import { FlexyFormsValidators } from '../validators/validators.utils'; import { FlexyForm } from '../models/form.model'; import { parseFormJson, replaceMarker } from './json-mapper.utils'; import { FLEXY_FORM_VALIDATORS } from '../form-options.token'; import * as i0 from "@angular/core"; import * as i1 from "../form-options.token"; import * as i2 from "@ng-flexy/layout"; import * as i3 from "@angular/forms"; import * as i4 from "@ng-flexy/core"; const INPUTS_READONLY_KEY = 'readonly'; const SCHEMA_CONTROL_NAME_KEY = 'name'; const SCHEMA_GROUP_KEY = 'groupKey'; const SCHEMA_COMPONENT_INPUTS_KEY = 'properties'; const SCHEMA_DEFAULT_KEY = 'default'; const ɵ0 = () => Validators.required, ɵ1 = data => Validators.maxLength(data), ɵ2 = data => Validators.minLength(data), ɵ3 = data => FlexyFormsValidators.minValidator(data), ɵ4 = data => FlexyFormsValidators.maxValidator(data), ɵ5 = () => FlexyFormsValidators.numberValidator, ɵ6 = () => FlexyFormsValidators.integerValidator, ɵ7 = () => FlexyFormsValidators.booleanValidator, ɵ8 = () => FlexyFormsValidators.emailValidator, ɵ9 = () => FlexyFormsValidators.noWhitespaceValidator, ɵ10 = () => FlexyFormsValidators.notEmptyValidator, ɵ11 = data => Validators.pattern(data), ɵ12 = data => FlexyFormsValidators.crossFieldValidator(data), ɵ13 = data => FlexyFormsValidators.crossFieldMinValidator(data), ɵ14 = data => FlexyFormsValidators.crossFieldMaxValidator(data), ɵ15 = data => FlexyFormsValidators.crossFieldAbsoluteMinValidator(data), ɵ16 = data => FlexyFormsValidators.forbiddenValuesValidator(data), ɵ17 = data => FlexyFormsValidators.arrayUniqueFieldsValidator(data), ɵ18 = data => FlexyFormsValidators.minLengthArray(data), ɵ19 = data => FlexyFormsValidators.maxLengthArray(data); const DEFAULT_VALIDATORS_MAP = { required: ɵ0, maxLength: ɵ1, minLength: ɵ2, min: ɵ3, max: ɵ4, number: ɵ5, integer: ɵ6, boolean: ɵ7, email: ɵ8, noWhitespace: ɵ9, notEmpty: ɵ10, pattern: ɵ11, crossField: ɵ12, crossFieldMin: ɵ13, crossFieldMax: ɵ14, crossFieldAbsoluteMin: ɵ15, forbiddenValues: ɵ16, arrayUniqueFields: ɵ17, minItems: ɵ18, maxItems: ɵ19 }; export class FlexyFormJsonMapperService { constructor(validatorsMap, jsonLayoutMapper, formBuilder, logger) { this.jsonLayoutMapper = jsonLayoutMapper; this.formBuilder = formBuilder; this.logger = logger; this._validatorsMap = DEFAULT_VALIDATORS_MAP; if (validatorsMap) { Object.assign(this._validatorsMap, validatorsMap); } } get supportedValidators() { return Object.keys(this._validatorsMap); } createForm(json, readonlyMode = false, formData) { this.logger.debug('createForm'); FlexyFormJsonMapperService.controlCounter = 0; const jsonSchema = parseFormJson(json); const rootFormGroup = new FormGroup({}); const dynamicSchema = this.map(jsonSchema, readonlyMode, formData, rootFormGroup); this.logger.debug('countOfControls', FlexyFormJsonMapperService.controlCounter); return new FlexyForm(rootFormGroup, dynamicSchema, formData); } createItemControl(itemsSchema, readonlyMode, value) { let control; if (itemsSchema.children) { control = new FormGroup({}); this.mapItem(itemsSchema, readonlyMode, value, control); } else { control = this.formBuilder.control(value ? value : get(itemsSchema, 'componentInputs.default'), itemsSchema.validators ? this.mapValidators(itemsSchema.validators) : []); } return control; } createArrayItemSchema(control, items, itemKeyDef, parentName, readonlyMode, formData, value, index, parentSchema = null) { const citems = cloneDeep(items); this.populateComplexTypeIndexMarker([citems], index + 1, value, itemKeyDef); const isComplex = citems && !!citems.children; let schema; if (isComplex) { const withRootValues = Object.assign({}, value); const groupSchema = this._jsonLayoutItemMap({}, '' + index, parentSchema); groupSchema.children = this.map([citems], readonlyMode, withRootValues, control, groupSchema); schema = groupSchema; } else { schema = this.jsonLayoutMapper.map([citems])[0]; schema.formControl = control; control.setValue(value); schema.id = parentSchema.id + ':' + index; if (!schema.componentInputs) { schema.componentInputs = {}; } schema.componentInputs[INPUTS_READONLY_KEY] = readonlyMode; } return schema; } createGroupItemSchema(control, items, itemKeyDef, parentName, readonlyMode, formData, value, key, parentSchema = null) { const citems = cloneDeep(items); this.populateComplexTypeIndexMarker([citems], key, value, itemKeyDef); const isComplex = citems && !!citems.children; let schema; if (isComplex) { const withRootValues = Object.assign({}, value); const groupSchema = this.map([citems], readonlyMode, withRootValues, control, null)[0]; schema = groupSchema; } else { schema = this.jsonLayoutMapper.map([citems])[0]; schema.formControl = control; control.setValue(value); if (!schema.componentInputs) { schema.componentInputs = {}; } schema.componentInputs[INPUTS_READONLY_KEY] = readonlyMode; schema.formName = citems.name; } schema.id = (parentSchema && parentSchema.id ? parentSchema.id + ':' : '') + key; schema.groupKey = key; return schema; } createSchema(json, readonlyMode = false, formData = {}, parentFormGroup, parentControlGroupName, parentSchema = null) { const schema = []; if (json && Array.isArray(json)) { json.forEach((jsonItem, index) => { const schemaItem = this.mapItem(jsonItem, readonlyMode, formData, parentFormGroup, parentControlGroupName, parentSchema, '' + index); let itemParentFormGroup = parentFormGroup; let itemParentControlGroupName = parentControlGroupName; if (schemaItem.formControl instanceof FormGroup) { itemParentFormGroup = schemaItem.formControl; if ([FlexyFormFieldType.Group, FlexyFormFieldType.Array].includes(jsonItem.type)) { itemParentControlGroupName = this.controlComplexName(jsonItem, itemParentControlGroupName); } } if (jsonItem.children) { schemaItem.children = this.createSchema(jsonItem.children, readonlyMode, formData, itemParentFormGroup, itemParentControlGroupName, schemaItem); } schema.push(schemaItem); }); } return schema; } map(json, readonlyMode = false, formData, parentFormGroup, parentSchema = null) { const dynamicSchema = this.createSchema(json, readonlyMode, formData, parentFormGroup, null, parentSchema); return dynamicSchema; } createControl(config) { return config instanceof AbstractControl ? config : config[1] ? this.formBuilder.control(config[0], config[1]) : this.formBuilder.control(config); } controlComplexName(jsonItem, parentName) { return (parentName && jsonItem.name[0] === '.' ? parentName : '') + jsonItem.name; } mapItem(jsonItem, readonlyMode = false, formData = {}, parentFormGroup, parentControlGroupName = null, parentSchema = null, schemaId = '') { const formSchemaItem = this._jsonLayoutItemMap(jsonItem, schemaId, parentSchema); if (readonlyMode) { if (!formSchemaItem.componentInputs) { formSchemaItem.componentInputs = {}; } formSchemaItem.componentInputs[INPUTS_READONLY_KEY] = readonlyMode; } let controlName = ''; if (jsonItem.name && jsonItem.type !== FlexyFormFieldType.Group && jsonItem.type !== FlexyFormFieldType.Array) { controlName = jsonItem.name; this.mapItemSetFieldControl(formSchemaItem, jsonItem, parentControlGroupName, formData); } else if (jsonItem.items && jsonItem.type === FlexyFormFieldType.Group) { const groupJsonItem = jsonItem; controlName = groupJsonItem.name; this.mapItemSetGroupControl(formSchemaItem, jsonItem, parentControlGroupName, readonlyMode); const formGroupName = (parentControlGroupName && groupJsonItem.name[0] === '.' ? parentControlGroupName : '') + groupJsonItem.name; const formGroupData = has(formData, formGroupName) ? get(formData, formGroupName) : void 0; if (formGroupData) { jsonItem.children = []; const isComplex = !!groupJsonItem.items.children; Object.keys(formGroupData).forEach(key => { const schemaJson = cloneDeep(groupJsonItem.items); schemaJson.name = '.' + key; if (isComplex) { schemaJson.type = FlexyFormFieldType.Group; } schemaJson[SCHEMA_GROUP_KEY] = key; this.populateComplexTypeIndexMarker([schemaJson], key, formGroupData[key], groupJsonItem.indexDef); groupJsonItem.children.push(schemaJson); }); } } else if (jsonItem.items && jsonItem.type === FlexyFormFieldType.Array) { const arrayJsonItem = jsonItem; controlName = arrayJsonItem.name; this.mapItemSetArrayControl(formSchemaItem, arrayJsonItem, parentControlGroupName, formData, readonlyMode); } else { controlName = jsonItem.type === FlexyFormFieldType.Group ? jsonItem.name : formSchemaItem.id ? 'g-' + formSchemaItem.id : 'd-' + Date.now(); formSchemaItem.groupKey = jsonItem.groupKey; // TODO to think: form control is required also for non FlexyFormFieldLayoutSchema formSchemaItem.formControl = new FormGroup({}, this.mapValidators(jsonItem.validators)); } const control = formSchemaItem.formControl; if (control) { parentFormGroup.addControl(this.unifyName(controlName, parentControlGroupName ? this.unifyName(parentControlGroupName) : ''), control); } return formSchemaItem; } _jsonLayoutItemMap(jsonItem, schemaId, parentSchema) { const schema = this.jsonLayoutMapper.mapItem(jsonItem, schemaId, parentSchema); // const SCHEMA_GROUP_KEY = 'groupKey'; const SCHEMA_IF = 'if'; const SCHEMA_CALC = 'calc'; // TODO tothink is problem with populate form group controls from external domain [SCHEMA_GROUP_KEY, SCHEMA_IF, SCHEMA_CALC].forEach(key => { if (jsonItem[key]) { schema[key] = jsonItem[key]; } }); return schema; } mapItemSetArrayControl(formSchemaItem, jsonItem, parentControlGroupName, formData, readonlyMode) { let formName = (parentControlGroupName && jsonItem.name[0] === '.' ? parentControlGroupName : '') + jsonItem.name; // its possible in array in group if (formName.endsWith('.')) { formName = formName.slice(0, -1); } const val = has(formData, formName) ? get(formData, formName) : void 0; const formControl = this.createArrayControl(jsonItem, readonlyMode, val); formSchemaItem.formControl = formControl; formSchemaItem.formName = formName; if (jsonItem.items) { formSchemaItem.items = this.createArrayItems(jsonItem.items, jsonItem.indexDef, formControl, formName, readonlyMode, val, formData, formSchemaItem); formSchemaItem.componentInputs = Object.assign(Object.assign({}, formSchemaItem.componentInputs), { jsonSchema: jsonItem, readonly: readonlyMode }); } } mapItemSetGroupControl(formSchemaItem, jsonItem, parentControlGroupName, readonlyMode) { const formGroupName = (parentControlGroupName && jsonItem.name[0] === '.' ? parentControlGroupName : '') + jsonItem.name; formSchemaItem.formControl = new FormGroup({}); if (jsonItem.items) { formSchemaItem.componentInputs = Object.assign(Object.assign({}, formSchemaItem.componentInputs), { jsonSchema: jsonItem, parentGroupName: formGroupName, readonly: readonlyMode }); } } mapItemSetFieldControl(formSchemaItem, jsonItem, parentControlGroupName, formData) { FlexyFormJsonMapperService.controlCounter++; const formName = (parentControlGroupName && jsonItem.name[0] === '.' ? parentControlGroupName : '') + jsonItem.name; const val = has(formData, formName) ? get(formData, formName) : void 0; const formControl = this.createControl(this.createControlConfig(jsonItem, val)); formSchemaItem.formName = formName; formSchemaItem.formControl = formControl; } createArrayItems(items, itemKeyDef, arrayControl, parentName, readonlyMode = false, values, formData, parentSchema = null) { const formArray = arrayControl; const formSchema = []; formArray.controls.forEach((control, index) => { let value; let key; if (values && Array.isArray(values)) { value = values[index]; key = '' + index; } else if (values && typeof values === 'object') { key = Object.keys(values)[index]; value = values[key]; } const schema = this.createArrayItemSchema(control, items, itemKeyDef, parentName, readonlyMode, formData, value, index, parentSchema); schema.formName = key; formSchema.push(schema); }); return formSchema; } populateComplexTypeIndexMarker(items, key, value, marker = COMPLEX_TYPE_INDEX_MARKER) { items.forEach(item => { if (item.name) { item.name = replaceMarker(item.name, marker, key); } if (item.if) { item.if = replaceMarker(item.if, marker, key); } if (item.calc) { item.calc = replaceMarker(item.calc, marker, key); } if (item.attributes) { Object.keys(item.attributes).forEach(attr => { if (typeof item.attributes[attr] === 'string') { item.attributes[attr] = replaceMarker('' + item.attributes[attr], marker, key); } else if (typeof item.attributes[attr] === 'object') { Object.keys(item.attributes[attr]).forEach(attrVal => { const replaced = replaceMarker(attrVal, marker, key); item.attributes[attr][attrVal] = replaceMarker('' + item.attributes[attr][attrVal], marker, key); if (replaced !== attrVal) { item.attributes[attr][replaced] = item.attributes[attr][attrVal]; delete item.attributes[attr][attrVal]; } }); } }); } if (item[SCHEMA_COMPONENT_INPUTS_KEY]) { const componentInputs = ['title', 'label', 'legend']; componentInputs.forEach(propName => { if (item[SCHEMA_COMPONENT_INPUTS_KEY][propName]) { item[SCHEMA_COMPONENT_INPUTS_KEY][propName] = replaceMarker(item[SCHEMA_COMPONENT_INPUTS_KEY][propName], marker, key); } }); } if (item.children) { this.populateComplexTypeIndexMarker(item.children, key, value, marker); } if (item.items) { this.populateComplexTypeIndexMarker([item.items], key, value, marker); } }); } createControlConfig(item, defaultValue) { if (item.name) { return [defaultValue !== void 0 ? defaultValue : item[SCHEMA_DEFAULT_KEY], this.mapValidators(item.validators)]; } return []; } createArrayControl(item, readonlyMode = false, values = []) { const arraySchema = item; const validators = []; // TODO to thkink // if (arraySchema.validators['minItems']) { // validators.push(FlexyFormsValidators.minLengthArray(arraySchema.validators['minItems'])); // } // if (arraySchema.validators['maxItems']) { // validators.push(FlexyFormsValidators.maxLengthArray(arraySchema.validators['maxItems'])); // } const formArray = new FormArray([], this.mapValidators(item.validators)); if (item.type === FlexyFormFieldType.Array && item.name) { if (values && Array.isArray(values)) { values.forEach(value => { formArray.push(this.createItemControl(arraySchema.items, readonlyMode, value)); }); } else if (values) { console.warn('Wrong type of data. Values should be array', values); } } return formArray; } unifyName(controlName, parentControlName = '') { if (controlName[0] === '.') { controlName = controlName.substring(1); } let name = controlName ? controlName.split('.').join('/') : 'p_' + Date.now(); if (parentControlName) { name = name.replace(parentControlName + '/', ''); } return name; } mapValidators(jsonValidator) { const validators = []; if (jsonValidator) { Object.keys(jsonValidator).forEach(key => { if (this._validatorsMap[key]) { validators.push(this._validatorsMap[key](jsonValidator[key])); } else { console.warn(`Validator ${key} is not supported`); } }); } return validators; } } FlexyFormJsonMapperService.controlCounter = 0; FlexyFormJsonMapperService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FlexyFormJsonMapperService_Factory() { return new FlexyFormJsonMapperService(i0.ɵɵinject(i1.FLEXY_FORM_VALIDATORS, 8), i0.ɵɵinject(i2.FlexyLayoutJsonMapperService), i0.ɵɵinject(i3.FormBuilder), i0.ɵɵinject(i4.FlexyLoggerService)); }, token: FlexyFormJsonMapperService, providedIn: "root" }); FlexyFormJsonMapperService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; FlexyFormJsonMapperService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [FLEXY_FORM_VALIDATORS,] }] }, { type: FlexyLayoutJsonMapperService }, { type: FormBuilder }, { type: FlexyLoggerService } ]; export { ɵ0, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9, ɵ10, ɵ11, ɵ12, ɵ13, ɵ14, ɵ15, ɵ16, ɵ17, ɵ18, ɵ19 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1tYXBwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9zZXJ2aWNlcy9qc29uLW1hcHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdHLE9BQU8sRUFDTCx5QkFBeUIsRUFJekIsa0JBQWtCLEVBSW5CLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLDRCQUE0QixFQUE0QyxNQUFNLGtCQUFrQixDQUFDO0FBQzFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUU3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7O0FBTTlELE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBRXZDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO0FBQ3BDLE1BQU0sMkJBQTJCLEdBQUcsWUFBWSxDQUFDO0FBQ2pELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1dBR3pCLEdBQUcsRUFBRSxDQUFDLFVB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QUFDLENBQUM7U0FDSjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7O0FBNWhCTSx5Q0FBYyxHQUFHLENBQUMsQ0FBQzs7O1lBSjNCLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7OzRDQVdJLFFBQVEsWUFBSSxNQUFNLFNBQUMscUJBQXFCO1lBekRwQyw0QkFBNEI7WUFaQSxXQUFXO1lBZXZDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBGbGV4eUZvcm1MYXlvdXRTY2hlbWEgfSBmcm9tICcuLi9tb2RlbHMvbGF5b3V0LXNjaGVtYS5tb2RlbCc7XG5pbXBvcnQge1xuICBDT01QTEVYX1RZUEVfSU5ERVhfTUFSS0VSLFxuICBGbGV4eUZvcm1DYWxjSnNvblNjaGVtYSxcbiAgRmxleHlGb3JtQ29tcGxleEZpZWxkTGF5b3V0SnNvblNjaGVtYSxcbiAgRmxleHlGb3JtRmllbGRMYXlvdXRKc29uU2NoZW1hLFxuICBGbGV4eUZvcm1GaWVsZFR5cGUsXG4gIEZsZXh5Rm9ybUlmSnNvblNjaGVtYSxcbiAgRmxleHlGb3JtTGF5b3V0SnNvbixcbiAgRmxleHlGb3JtTGF5b3V0SnNvblNjaGVtYVxufSBmcm9tICcuLi9tb2RlbHMvbGF5b3V0LWpzb24tc2NoZW1hLm1vZGVsJztcbmltcG9ydCB7IEZsZXh5TGF5b3V0SnNvbk1hcHBlclNlcnZpY2UsIEZsZXh5TGF5b3V0SnNvblNjaGVtYSwgRmxleHlMYXlvdXRTY2hlbWEgfSBmcm9tICdAbmctZmxleHkvbGF5b3V0JztcbmltcG9ydCB7IGNsb25lRGVlcCwgZ2V0LCBoYXMgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRmxleHlGb3JtRGF0YSB9IGZyb20gJy4uL21vZGVscy9mb3JtLmRhdGEnO1xuaW1wb3J0IHsgRmxleHlMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnQG5nLWZsZXh5L2NvcmUnO1xuaW1wb3J0IHsgRmxleHlGb3Jtc1ZhbGlkYXRvcnMgfSBmcm9tICcuLi92YWxpZGF0b3JzL3ZhbGlkYXRvcnMudXRpbHMnO1xuaW1wb3J0IHsgRmxleHlWYWxpZGF0b3JzRGF0YSB9IGZyb20gJy4uL21vZGVscy92YWxpZGF0b3JzLmRhdGEnO1xuaW1wb3J0IHsgRmxleHlGb3JtIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xuaW1wb3J0IHsgcGFyc2VGb3JtSnNvbiwgcmVwbGFjZU1hcmtlciB9IGZyb20gJy4vanNvbi1tYXBwZXIudXRpbHMnO1xuaW1wb3J0IHsgRkxFWFlfRk9STV9WQUxJREFUT1JTIH0gZnJvbSAnLi4vZm9ybS1vcHRpb25zLnRva2VuJztcblxuZXhwb3J0IGludGVyZmFjZSBGbGV4eUZvcm1WYWxpZGF0b3JzTWFwIHtcbiAgW25hbWU6IHN0cmluZ106IChkYXRhPykgPT4gVmFsaWRhdG9yRm47XG59XG5cbmNvbnN0IElOUFVUU19SRUFET05MWV9LRVkgPSAncmVhZG9ubHknO1xuXG5jb25zdCBTQ0hFTUFfQ09OVFJPTF9OQU1FX0tFWSA9ICduYW1lJztcbmNvbnN0IFNDSEVNQV9HUk9VUF9LRVkgPSAnZ3JvdXBLZXknO1xuY29uc3QgU0NIRU1BX0NPTVBPTkVOVF9JTlBVVFNfS0VZID0gJ3Byb3BlcnRpZXMnO1xuY29uc3QgU0NIRU1BX0RFRkFVTFRfS0VZID0gJ2RlZmF1bHQnO1xuXG5jb25zdCBERUZBVUxUX1ZBTElEQVRPUlNfTUFQOiBGbGV4eUZvcm1WYWxpZGF0b3JzTWFwID0ge1xuICByZXF1aXJlZDogKCkgPT4gVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgbWF4TGVuZ3RoOiBkYXRhID0+IFZhbGlkYXRvcnMubWF4TGVuZ3RoKGRhdGEpLFxuICBtaW5MZW5ndGg6IGRhdGEgPT4gVmFsaWRhdG9ycy5taW5MZW5ndGgoZGF0YSksXG4gIG1pbjogZGF0YSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5taW5WYWxpZGF0b3IoZGF0YSksXG4gIG1heDogZGF0YSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5tYXhWYWxpZGF0b3IoZGF0YSksXG4gIG51bWJlcjogKCkgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubnVtYmVyVmFsaWRhdG9yLFxuICBpbnRlZ2VyOiAoKSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5pbnRlZ2VyVmFsaWRhdG9yLFxuICBib29sZWFuOiAoKSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5ib29sZWFuVmFsaWRhdG9yLFxuICBlbWFpbDogKCkgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMuZW1haWxWYWxpZGF0b3IsXG4gIG5vV2hpdGVzcGFjZTogKCkgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubm9XaGl0ZXNwYWNlVmFsaWRhdG9yLFxuICBub3RFbXB0eTogKCkgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubm90RW1wdHlWYWxpZGF0b3IsXG4gIHBhdHRlcm46IGRhdGEgPT4gVmFsaWRhdG9ycy5wYXR0ZXJuKGRhdGEpLFxuICBjcm9zc0ZpZWxkOiBkYXRhID0+IEZsZXh5Rm9ybXNWYWxpZGF0b3JzLmNyb3NzRmllbGRWYWxpZGF0b3IoZGF0YSksXG4gIGNyb3NzRmllbGRNaW46IGRhdGEgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMuY3Jvc3NGaWVsZE1pblZhbGlkYXRvcihkYXRhKSxcbiAgY3Jvc3NGaWVsZE1heDogZGF0YSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5jcm9zc0ZpZWxkTWF4VmFsaWRhdG9yKGRhdGEpLFxuICBjcm9zc0ZpZWxkQWJzb2x1dGVNaW46IGRhdGEgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMuY3Jvc3NGaWVsZEFic29sdXRlTWluVmFsaWRhdG9yKGRhdGEpLFxuICBmb3JiaWRkZW5WYWx1ZXM6IGRhdGEgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMuZm9yYmlkZGVuVmFsdWVzVmFsaWRhdG9yKGRhdGEpLFxuICBhcnJheVVuaXF1ZUZpZWxkczogZGF0YSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5hcnJheVVuaXF1ZUZpZWxkc1ZhbGlkYXRvcihkYXRhKSxcbiAgbWluSXRlbXM6IGRhdGEgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubWluTGVuZ3RoQXJyYXkoZGF0YSksXG4gIG1heEl0ZW1zOiBkYXRhID0+IEZsZXh5Rm9ybXNWYWxpZGF0b3JzLm1heExlbmd0aEFycmF5KGRhdGEpXG59O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGbGV4eUZvcm1Kc29uTWFwcGVyU2VydmljZSB7XG4gIHN0YXRpYyBjb250cm9sQ291bnRlciA9IDA7XG5cbiAgZ2V0IHN1cHBvcnRlZFZhbGlkYXRvcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl92YWxpZGF0b3JzTWFwKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbGlkYXRvcnNNYXAgPSBERUZBVUxUX1ZBTElEQVRPUlNfTUFQO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRkxFWFlfRk9STV9WQUxJREFUT1JTKSB2YWxpZGF0b3JzTWFwOiBGbGV4eUZvcm1WYWxpZGF0b3JzTWFwLFxuICAgIHByaXZhdGUganNvbkxheW91dE1hcHBlcjogRmxleHlMYXlvdXRKc29uTWFwcGVyU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGxvZ2dlcjogRmxleHlMb2dnZXJTZXJ2aWNlXG4gICkge1xuICAgIGlmICh2YWxpZGF0b3JzTWFwKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3ZhbGlkYXRvcnNNYXAsIHZhbGlkYXRvcnNNYXApO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUZvcm0oanNvbjogRmxleHlGb3JtTGF5b3V0SnNvbiwgcmVhZG9ubHlNb2RlID0gZmFsc2UsIGZvcm1EYXRhOiBGbGV4eUZvcm1EYXRhKTogRmxleHlGb3JtIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY3JlYXRlRm9ybScpO1xuICAgIEZsZXh5Rm9ybUpzb25NYXBwZXJTZXJ2aWNlLmNvbnRyb2xDb3VudGVyID0gMDtcblxuICAgIGNvbnN0IGpzb25TY2hlbWEgPSBwYXJzZUZvcm1Kc29uKGpzb24pO1xuXG4gICAgY29uc3Qgcm9vdEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgIGNvbnN0IGR5bmFtaWNTY2hlbWE6IEZsZXh5Rm9ybUxheW91dFNjaGVtYVtdID0gdGhpcy5tYXAoanNvblNjaGVtYSwgcmVhZG9ubHlNb2RlLCBmb3JtRGF0YSwgcm9vdEZvcm1Hcm91cCk7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY291bnRPZkNvbnRyb2xzJywgRmxleHlGb3JtSnNvbk1hcHBlclNlcnZpY2UuY29udHJvbENvdW50ZXIpO1xuXG4gICAgcmV0dXJuIG5ldyBGbGV4eUZvcm0ocm9vdEZvcm1Hcm91cCwgZHluYW1pY1NjaGVtYSwgZm9ybURhdGEpO1xuICB9XG5cbiAgY3JlYXRlSXRlbUNvbnRyb2woaXRlbXNTY2hlbWE6IEZsZXh5Rm9ybUxheW91dEpzb25TY2hlbWEsIHJlYWRvbmx5TW9kZTogYm9vbGVhbiwgdmFsdWU6IEZsZXh5Rm9ybURhdGEpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIGxldCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG4gICAgaWYgKGl0ZW1zU2NoZW1hLmNoaWxkcmVuKSB7XG4gICAgICBjb250cm9sID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICB0aGlzLm1hcEl0ZW0oaXRlbXNTY2hlbWEsIHJlYWRvbmx5TW9kZSwgdmFsdWUsIGNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcbiAgICAgICAgdmFsdWUgPyB2YWx1ZSA6IGdldChpdGVtc1NjaGVtYSwgJ2NvbXBvbmVudElucHV0cy5kZWZhdWx0JyksXG4gICAgICAgIChpdGVtc1NjaGVtYSBhcyBGbGV4eUZvcm1GaWVsZExheW91dEpzb25TY2hlbWEpLnZhbGlkYXRvcnNcbiAgICAgICAgICA/IHRoaXMubWFwVmFsaWRhdG9ycygoaXRlbXNTY2hlbWEgYXMgRmxleHlGb3JtRmllbGRMYXlvdXRKc29uU2NoZW1hKS52YWxpZGF0b3JzKVxuICAgICAgICAgIDogW11cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sO1xuICB9XG5cbiAgY3JlYXRlQXJyYXlJdGVtU2NoZW1hKFxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgICBpdGVtczogRmxleHlGb3JtTGF5b3V0SnNvblNjaGVtYSxcbiAgICBpdGVtS2V5RGVmOiBzdHJpbmcsXG4gICAgcGFyZW50TmFtZTogc3RyaW5nLFxuICAgIHJlYWRvbmx5TW9kZTogYm9vbGVhbixcbiAgICBmb3JtRGF0YTogRmxleHlGb3JtRGF0YSxcbiAgICB2YWx1ZTogRmxleHlGb3JtRGF0YSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmVudFNjaGVtYTogRmxleHlGb3JtTGF5b3V0U2NoZW1hID0gbnVsbFxuICApOiBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSB7XG4gICAgY29uc3QgY2l0ZW1zID0gY2xvbmVEZWVwKGl0ZW1zKTtcblxuICAgIHRoaXMucG9wdWxhdGVDb21wbGV4VHlwZUluZGV4TWFya2VyKFtjaXRlbXNdLCBpbmRleCArIDEsIHZhbHVlLCBpdGVtS2V5RGVmKTtcblxuICAgIGNvbnN0IGlzQ29tcGxleCA9IGNpdGVtcyAmJiAhIWNpd