UNPKG

@formql/core

Version:

FormQL - A framework for building dynamic forms

293 lines 42.6 kB
var HelperService_1; import { __decorate } from "tslib"; import { Injectable } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import * as i0 from "@angular/core"; let HelperService = HelperService_1 = class HelperService { static evaluateCondition(condition, data) { 'use strict'; let response = { value: false, error: null }; if (condition && condition.trim() !== '' && condition !== 'false') { if (condition === 'true') { response.value = true; return response; } if (!data) return response; response = Object.assign({}, this.evaluate(condition, data)); if (response.value !== true) response.value = false; } return response; } static evaluateValue(path, data) { 'use strict'; let response = { value: null, error: null }; if (!data) return response; response = Object.assign({}, this.evaluate(path, data)); if (Number.isNaN(response.value) || response.value === Infinity) response.value = null; else response.value = this.deepCopy(response.value); return response; } static evaluate(path, data) { 'use strict'; const response = { value: null, error: null }; const props = Object.keys(data); const params = []; for (let i = 0; i < props.length; i++) params.push(data[props[i]]); params.push(path); props.push('path'); const expression = ` 'use strict' let window = undefined; let document = undefined; let alert = undefined; let a = undefined; return ${path}; `; props.push(expression); try { const evalFunc = new Function(...props); response.value = evalFunc(...params); } catch (err) { response.error = err; } return response; } static setValue(schema, value, data) { if (value === undefined) value = null; if (schema) { if (!data) data = {}; let key = schema; if (schema.indexOf('.') !== -1) { const arr = schema.split('.'); let item = data; for (let i = 0; i <= arr.length - 1; i++) { key = arr[i]; if (!item[key]) item[key] = {}; if (i !== arr.length - 1) item = item[key]; } item[key] = value; } else data[key] = value; } return data; } static getValue(schema, data, type) { if (!schema || !data || (data && Object.keys(data).length === 0 && data.constructor === Object)) return; try { const evalFunc = new Function('data', `return data.${schema};`); return HelperService_1.resolveType(evalFunc(data), type); } catch (err) { return null; } } static setValidators(componentResolverService, component, control) { const componentRef = componentResolverService.resolveComponent(component.componentName); if (!componentRef) return control; const type = componentRef.componentType; if (type && (!type['validators'] || (type['validators'] && type['validators'].length === 0))) return control; const validators = []; const rules = component.rules; if (rules != null) { const FormValidators = type['validators']; Object.keys(rules).forEach((key) => { const item = rules[key]; if (item.value && item.key !== 'readonly' && item.key !== 'hidden' && item.key !== 'value') { const validator = FormValidators.find((x) => x.key === item.key); if (validator && validator.validator) validators.push(validator.validator); } else if (item.value && item.key === 'readonly' && control.enabled) control.disable(); }); if (control.disabled && (!rules || (rules && !rules.readonly) || (rules && rules.readonly && !rules.readonly.value))) control.enable(); } if (validators.length > 0) control.setValidators(validators); return control; } static createReactiveFormStructure(form, initialiseData = true, data = null) { const formControls = {}; const components = {}; const pageGroup = new FormGroup({}); form.pages.forEach((page) => { const sectionGroup = {}; if (page.sections != null) page.sections.forEach((section) => { const componentGroup = {}; if (section.components != null) section.components.forEach((component) => { components[component.componentId] = component; const singleComponentGroup = new FormControl(); formControls[component.componentId] = singleComponentGroup; componentGroup[component.componentId] = singleComponentGroup; if (initialiseData) { if (!data) data = {}; data = HelperService_1.instantiateData(data, component.schema); try { const value = this.getValue(component.schema, data, component.type); if (value) { formControls[component.componentId].setValue(value); component.value = value; } } catch (err) { throw err; } } }); sectionGroup[section.sectionId] = new FormGroup(componentGroup); }); pageGroup[page.pageId] = new FormGroup(sectionGroup); }); return { pageGroup: pageGroup, formControls: formControls, components: components, data: data }; } static instantiateData(data, schema) { if (schema && schema.indexOf('.') !== -1) { const arr = schema.split('.'); let item = data; let key = ''; for (let i = 0; i <= arr.length - 2; i++) { key = arr[i]; if (!item[key]) item[key] = {}; if (i !== arr.length - 2) item = item[key]; } } return data; } static deepCopy(oldObj, ignoreProperty = null) { let newObj = oldObj; if (oldObj && typeof oldObj === 'object') { newObj = Object.prototype.toString.call(oldObj) === '[object Array]' ? [] : {}; for (const i in oldObj) if (!ignoreProperty || (ignoreProperty && !ignoreProperty.find((p) => p === i))) newObj[i] = this.deepCopy(oldObj[i]); } return newObj; } static propertyCopy(source, target, ignoreProperties = null) { if (source && typeof source === 'object') for (const i in source) if (!ignoreProperties || (ignoreProperties && !ignoreProperties.find((p) => p === i))) if (source[i] && typeof source[i] === 'object') { if (!target[i]) target[i] = {}; target[i] = this.propertyCopy(source[i], target[i]); } else target[i] = source[i]; else console.log(`propertyCopy function doesn't support primitives`); return target; } static formatForGraphQl(obj) { const updatedData = this.deepCopy(obj); if (updatedData['__typename']) delete updatedData['__typename']; let dataForQuery = ''; Object.keys(updatedData).forEach((fieldName) => { if (updatedData[fieldName] == null) dataForQuery += fieldName + ': null,'; else if (typeof updatedData[fieldName] === 'object') dataForQuery += this.formatForGraphQl(updatedData[fieldName]); else if (typeof updatedData[fieldName] === 'number' || typeof updatedData[fieldName] === 'boolean') dataForQuery += fieldName + `:${updatedData[fieldName]},`; else dataForQuery += fieldName + `:\"${updatedData[fieldName]},`; }); dataForQuery = `{${dataForQuery.slice(0, -1)}}`; return dataForQuery; } static formatError(error) { if (!error) return; if (error.error && error.error.message) error.message = error.error.message; return error; } static resolveType(value, type) { if (value === null || value === undefined || value === '') return null; else if (Number.isNaN(value)) return 0; switch (type) { case 'number': if (typeof value === 'string') value = value.replace(/[^\d\.]/g, ''); return Number(value); default: return value; } } static maskToArray(mask) { const result = []; if (mask) { const maskTrimmed = mask.trim().substring(1).slice(0, -1).replace('\\\\', '\\'); const arry = maskTrimmed.split(','); arry.forEach((item) => { result.push(item.trim().replace(/\"/g, '').replace(/\'/g, '')); }); } return result; } static updateTemplates(form) { form.pages.forEach((page) => { page.template.reRender = false; page.template = HelperService_1.deepCopy(page.template); page.sections.forEach((section) => { section.template.reRender = false; section.template = HelperService_1.deepCopy(section.template); }); }); return form; } static resetValidators(components, formControls, componentResolverService) { if (components && Object.keys(components).length > 0) Object.keys(components).forEach((key) => { const component = components[key]; if (component) { let componentControl = formControls[component.componentId]; if (componentControl) componentControl = HelperService_1.setValidators(componentResolverService, component, componentControl); } }); return formControls; } static validateForm(formGroup) { Object.keys(formGroup.controls).forEach((field) => { const control = formGroup.get(field); if (control instanceof FormControl) control.markAsTouched({ onlySelf: true }); else if (control instanceof FormGroup) this.validateForm(control); }); } }; HelperService.ɵprov = i0.ɵɵdefineInjectable({ factory: function HelperService_Factory() { return new HelperService(); }, token: HelperService, providedIn: "root" }); HelperService = HelperService_1 = __decorate([ Injectable({ providedIn: 'root' }) ], HelperService); export { HelperService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZm9ybXFsL2NvcmUvIiwic291cmNlcyI6WyJzZXJ2aWNlcy9oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBVXhELElBQWEsYUFBYSxxQkFBMUIsTUFBYSxhQUFhO0lBQ2pCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLElBQVM7UUFDMUQsWUFBWSxDQUFDO1FBQ2IsSUFBSSxRQUFRLEdBQWlCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFM0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ2pFLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtnQkFDeEIsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1lBRUQsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxRQUFRLENBQUM7WUFFM0IsUUFBUSxxQkFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBRSxDQUFDO1lBRWpELElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJO2dCQUFFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBWSxFQUFFLElBQVM7UUFDakQsWUFBWSxDQUFDO1FBRWIsSUFBSSxRQUFRLEdBQWlCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUs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WUFBWSxXQUFXO2dCQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDekUsSUFBSSxPQUFPLFlBQVksU0FBUztnQkFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUE7O0FBblRZLGFBQWE7SUFIekIsVUFBVSxDQUFDO1FBQ1YsVUFBVSxFQUFFLE1BQU07S0FDbkIsQ0FBQztHQUNXLGFBQWEsQ0FtVHpCO1NBblRZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL21vZGVscy9mb3JtLWNvbXBvbmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1FcnJvciwgRm9ybVdpbmRvdywgRm9ybUNvbXBvbmVudHMsIEZvcm1Db250cm9scyB9IGZyb20gJy4uL21vZGVscy9mb3JtLXdpbmRvdy5tb2RlbCc7XHJcbmltcG9ydCB7IEV2YWxSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy90eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybVZhbGlkYXRvciB9IGZyb20gJy4uL21vZGVscy9ydWxlLm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi9jb21wb25lbnQtcmVzb2x2ZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIZWxwZXJTZXJ2aWNlIHtcclxuICBwdWJsaWMgc3RhdGljIGV2YWx1YXRlQ29uZGl0aW9uKGNvbmRpdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpOiBFdmFsUmVzcG9uc2Uge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG4gICAgbGV0IHJlc3BvbnNlID0gPEV2YWxSZXNwb25zZT57IHZhbHVlOiBmYWxzZSwgZXJyb3I6IG51bGwgfTtcclxuXHJcbiAgICBpZiAoY29uZGl0aW9uICYmIGNvbmRpdGlvbi50cmltKCkgIT09ICcnICYmIGNvbmRpdGlvbiAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBpZiAoY29uZGl0aW9uID09PSAndHJ1ZScpIHtcclxuICAgICAgICByZXNwb25zZS52YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWRhdGEpIHJldHVybiByZXNwb25zZTtcclxuXHJcbiAgICAgIHJlc3BvbnNlID0geyAuLi50aGlzLmV2YWx1YXRlKGNvbmRpdGlvbiwgZGF0YSkgfTtcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS52YWx1ZSAhPT0gdHJ1ZSkgcmVzcG9uc2UudmFsdWUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZXZhbHVhdGVWYWx1ZShwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSk6IEV2YWxSZXNwb25zZSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlID0gPEV2YWxSZXNwb25zZT57IHZhbHVlOiBudWxsLCBlcnJvcjogbnVsbCB9O1xyXG5cclxuICAgIGlmICghZGF0YSkgcmV0dXJuIHJlc3BvbnNlO1xyXG5cclxuICAgIHJlc3BvbnNlID0geyAuLi50aGlzLmV2YWx1YXRlKHBhdGgsIGRhdGEpIH07XHJcblxyXG4gICAgaWYgKE51bWJlci5pc05hTihyZXNwb25zZS52YWx1ZSkgfHwgcmVzcG9uc2UudmFsdWUgPT09IEluZmluaXR5KSByZXNwb25zZS52YWx1ZSA9IG51bGw7XHJcbiAgICBlbHNlIHJlc3BvbnNlLnZhbHVlID0gdGhpcy5kZWVwQ29weShyZXNwb25zZS52YWx1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZXZhbHVhdGUocGF0aDogc3RyaW5nLCBkYXRhOiBhbnkpOiBFdmFsUmVzcG9uc2Uge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gPEV2YWxSZXNwb25zZT57IHZhbHVlOiBudWxsLCBlcnJvcjogbnVsbCB9O1xyXG5cclxuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoZGF0YSk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSBwYXJhbXMucHVzaChkYXRhW3Byb3BzW2ldXSk7XHJcblxyXG4gICAgcGFyYW1zLnB1c2gocGF0aCk7XHJcblxyXG4gICAgcHJvcHMucHVzaCgncGF0aCcpO1xyXG5cclxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBgXHJcbiAgICAgICAgICAgICd1c2Ugc3RyaWN0J1xyXG4gICAgICAgICAgICBsZXQgd2luZG93ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGxldCBhbGVydCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgbGV0IGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJldHVybiAke3BhdGh9O1xyXG4gICAgICAgIGA7XHJcblxyXG4gICAgcHJvcHMucHVzaChleHByZXNzaW9uKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBldmFsRnVuYyA9IG5ldyBGdW5jdGlvbiguLi5wcm9wcyk7XHJcbiAgICAgIHJlc3BvbnNlLnZhbHVlID0gZXZhbEZ1bmMoLi4ucGFyYW1zKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICByZXNwb25zZS5lcnJvciA9IGVycjtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmFsdWU8VCwgVT4oc2NoZW1hOiBzdHJpbmcsIHZhbHVlOiBULCBkYXRhOiBVKTogVSB7XHJcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB2YWx1ZSA9IG51bGw7XHJcbiAgICBpZiAoc2NoZW1hKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhKVxyXG4gICAgICAgICAgICBkYXRhID0ge30gYXMgVTtcclxuICAgICAgICBsZXQga2V5ID0gc2NoZW1hO1xyXG4gICAgICAgIGlmIChzY2hlbWEuaW5kZXhPZignLicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBzY2hlbWEuc3BsaXQoJy4nKTtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBkYXRhO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBhcnIubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBhcnJbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1ba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICBpdGVtW2tleV0gPSB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gYXJyLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1ba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpdGVtW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxufVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldFZhbHVlPFQsIFU+KHNjaGVtYTogc3RyaW5nLCBkYXRhOiBULCB0eXBlOiBzdHJpbmcpOiBVIHtcclxuICAgIGlmICghc2NoZW1hIHx8ICFkYXRhIHx8IChkYXRhICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCAmJiBkYXRhLmNvbnN0cnVjdG9yID09PSBPYmplY3QpKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZXZhbEZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2RhdGEnLCBgcmV0dXJuIGRhdGEuJHtzY2hlbWF9O2ApO1xyXG4gICAgICByZXR1cm4gSGVscGVyU2VydmljZS5yZXNvbHZlVHlwZShldmFsRnVuYyhkYXRhKSwgdHlwZSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFZhbGlkYXRvcnMoXHJcbiAgICBjb21wb25lbnRSZXNvbHZlclNlcnZpY2U6IENvbXBvbmVudFJlc29sdmVyU2VydmljZSxcclxuICAgIGNvbXBvbmVudDogRm9ybUNvbXBvbmVudDxhbnk+LFxyXG4gICAgY29udHJvbDogRm9ybUNvbnRyb2xcclxuICApOiBGb3JtQ29udHJvbCB7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb21wb25lbnRSZXNvbHZlclNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudChjb21wb25lbnQuY29tcG9uZW50TmFtZSk7XHJcblxyXG4gICAgaWYgKCFjb21wb25lbnRSZWYpIHJldHVybiBjb250cm9sO1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBjb21wb25lbnRSZWYuY29tcG9uZW50VHlwZTtcclxuXHJcbiAgICBpZiAodHlwZSAmJiAoIXR5cGVbJ3ZhbGlkYXRvcnMnXSB8fCAodHlwZVsndmFsaWRhdG9ycyddICYmIHR5cGVbJ3ZhbGlkYXRvcnMnXS5sZW5ndGggPT09IDApKSkgcmV0dXJuIGNvbnRyb2w7XHJcblxyXG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xyXG4gICAgY29uc3QgcnVsZXMgPSBjb21wb25lbnQucnVsZXM7XHJcbiAgICBpZiAocnVsZXMgIT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBGb3JtVmFsaWRhdG9ycyA9IDxBcnJheTxGb3JtVmFsaWRhdG9yPj50eXBlWyd2YWxpZGF0b3JzJ107XHJcbiAgICAgIE9iamVjdC5rZXlzKHJ1bGVzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBpdGVtID0gcnVsZXNba2V5XTtcclxuICAgICAgICBpZiAoaXRlbS52YWx1ZSAmJiBpdGVtLmtleSAhPT0gJ3JlYWRvbmx5JyAmJiBpdGVtLmtleSAhPT0gJ2hpZGRlbicgJiYgaXRlbS5rZXkgIT09ICd2YWx1ZScpIHtcclxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IEZvcm1WYWxpZGF0b3JzLmZpbmQoKHgpID0+IHgua2V5ID09PSBpdGVtLmtleSk7XHJcbiAgICAgICAgICBpZiAodmFsaWRhdG9yICYmIHZhbGlkYXRvci52YWxpZGF0b3IpIHZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IudmFsaWRhdG9yKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udmFsdWUgJiYgaXRlbS5rZXkgPT09ICdyZWFkb25seScgJiYgY29udHJvbC5lbmFibGVkKSBjb250cm9sLmRpc2FibGUoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb250cm9sLmRpc2FibGVkICYmXHJcbiAgICAgICAgKCFydWxlcyB8fCAocnVsZXMgJiYgIXJ1bGVzLnJlYWRvbmx5KSB8fCAocnVsZXMgJiYgcnVsZXMucmVhZG9ubHkgJiYgIXJ1bGVzLnJlYWRvbmx5LnZhbHVlKSlcclxuICAgICAgKVxyXG4gICAgICAgIGNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPiAwKSBjb250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcblxyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlYWN0aXZlRm9ybVN0cnVjdHVyZTxUPihmb3JtOiBGb3JtV2luZG93LCBpbml0aWFsaXNlRGF0YSA9IHRydWUsIGRhdGE6IFQgPSBudWxsKSB7XHJcbiAgICBjb25zdCBmb3JtQ29udHJvbHMgPSB7fSBhcyBGb3JtQ29udHJvbHM7XHJcbiAgICBjb25zdCBjb21wb25lbnRzID0ge30gYXMgRm9ybUNvbXBvbmVudHM7XHJcbiAgICBjb25zdCBwYWdlR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgIGZvcm0ucGFnZXMuZm9yRWFjaCgocGFnZSkgPT4ge1xyXG4gICAgICBjb25zdCBzZWN0aW9uR3JvdXA6IGFueSA9IHt9O1xyXG4gICAgICBpZiAocGFnZS5zZWN0aW9ucyAhPSBudWxsKVxyXG4gICAgICAgIHBhZ2Uuc2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50R3JvdXA6IGFueSA9IHt9O1xyXG4gICAgICAgICAgaWYgKHNlY3Rpb24uY29tcG9uZW50cyAhPSBudWxsKVxyXG4gICAgICAgICAgICBzZWN0aW9uLmNvbXBvbmVudHMuZm9yRWFjaCgoY29tcG9uZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnQuY29tcG9uZW50SWRdID0gY29tcG9uZW50O1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNpbmdsZUNvbXBvbmVudEdyb3VwID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzW2NvbXBvbmVudC5jb21wb25lbnRJZF0gPSBzaW5nbGVDb21wb25lbnRHcm91cDtcclxuICAgICAgICAgICAgICBjb21wb25lbnRHcm91cFtjb21wb25lbnQuY29tcG9uZW50SWRdID0gc2luZ2xlQ29tcG9uZW50R3JvdXA7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChpbml0aWFsaXNlRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBkYXRhID0ge30gYXMgVDtcclxuXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gSGVscGVyU2VydmljZS5pbnN0YW50aWF0ZURhdGEoZGF0YSwgY29tcG9uZW50LnNjaGVtYSk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoY29tcG9uZW50LnNjaGVtYSwgZGF0YSwgY29tcG9uZW50LnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHNbY29tcG9uZW50LmNvbXBvbmVudElkXS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIHNlY3Rpb25Hcm91cFtzZWN0aW9uLnNlY3Rpb25JZF0gPSBuZXcgRm9ybUdyb3VwKGNvbXBvbmVudEdyb3VwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgcGFnZUdyb3VwW3BhZ2UucGFnZUlkXSA9IG5ldyBGb3JtR3JvdXAoc2VjdGlvbkdyb3VwKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsgcGFnZUdyb3VwOiBwYWdlR3JvdXAsIGZvcm1Db250cm9sczogZm9ybUNvbnRyb2xzLCBjb21wb25lbnRzOiBjb21wb25lbnRzLCBkYXRhOiBkYXRhIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGluc3RhbnRpYXRlRGF0YTxUPihkYXRhOiBULCBzY2hlbWE6IHN0cmluZyk6IFQge1xyXG4gICAgaWYgKHNjaGVtYSAmJiBzY2hlbWEuaW5kZXhPZignLicpICE9PSAtMSkge1xyXG4gICAgICBjb25zdCBhcnIgPSBzY2hlbWEuc3BsaXQoJy4nKTtcclxuICAgICAgbGV0IGl0ZW0gPSBkYXRhO1xyXG4gICAgICBsZXQga2V5ID0gJyc7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGFyci5sZW5ndGggLSAyOyBpKyspIHtcclxuICAgICAgICBrZXkgPSBhcnJbaV07XHJcbiAgICAgICAgaWYgKCFpdGVtW2tleV0pIGl0ZW1ba2V5XSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoaSAhPT0gYXJyLmxlbmd0aCAtIDIpIGl0ZW0gPSBpdGVtW2tleV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBkZWVwQ29weShvbGRPYmo6IGFueSwgaWdub3JlUHJvcGVydHk6IEFycmF5PHN0cmluZz4gPSBudWxsKSB7XHJcbiAgICBsZXQgbmV3T2JqID0gb2xkT2JqO1xyXG4gICAgaWYgKG9sZE9iaiAmJiB0eXBlb2Ygb2xkT2JqID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBuZXdPYmogPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2xkT2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJyA/IFtdIDoge307XHJcbiAgICAgIGZvciAoY29uc3QgaSBpbiBvbGRPYmopXHJcbiAgICAgICAgaWYgKCFpZ25vcmVQcm9wZXJ0eSB8fCAoaWdub3JlUHJvcGVydHkgJiYgIWlnbm9yZVByb3BlcnR5LmZpbmQoKHApID0+IHAgPT09IGkpKSlcclxuICAgICAgICAgIG5ld09ialtpXSA9IHRoaXMuZGVlcENvcHkob2xkT2JqW2ldKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdPYmo7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHByb3BlcnR5Q29weShzb3VyY2U6IGFueSwgdGFyZ2V0OiBhbnksIGlnbm9yZVByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBudWxsKSB7XHJcbiAgICBpZiAoc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKVxyXG4gICAgICBmb3IgKGNvbnN0IGkgaW4gc291cmNlKVxyXG4gICAgICAgIGlmICghaWdub3JlUHJvcGVydGllcyB8fCAoaWdub3JlUHJvcGVydGllcyAmJiAhaWdub3JlUHJvcGVydGllcy5maW5kKChwKSA9PiBwID09PSBpKSkpXHJcbiAgICAgICAgICBpZiAoc291cmNlW2ldICYmIHR5cGVvZiBzb3VyY2VbaV0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIGlmICghdGFyZ2V0W2ldKSB0YXJnZXRbaV0gPSB7fTtcclxuICAgICAgICAgICAgdGFyZ2V0W2ldID0gdGhpcy5wcm9wZXJ0eUNvcHkoc291cmNlW2ldLCB0YXJnZXRbaV0pO1xyXG4gICAgICAgICAgfSBlbHNlIHRhcmdldFtpXSA9IHNvdXJjZVtpXTtcclxuICAgICAgICBlbHNlIGNvbnNvbGUubG9nKGBwcm9wZXJ0eUNvcHkgZnVuY3Rpb24gZG9lc24ndCBzdXBwb3J0IHByaW1pdGl2ZXNgKTtcclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBmb3JtYXRGb3JHcmFwaFFsKG9iajogYW55KSB7XHJcbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMuZGVlcENvcHkob2JqKTtcclxuXHJcbiAgICBpZiAodXBkYXRlZERhdGFbJ19fdHlwZW5hbWUnXSkgZGVsZXRlIHVwZGF0ZWREYXRhWydfX3R5cGVuYW1lJ107XHJcblxyXG4gICAgbGV0IGRhdGFGb3JRdWVyeSA9ICcnO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHVwZGF0ZWREYXRhKS5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcclxuICAgICAgaWYgKHVwZGF0ZWREYXRhW2ZpZWxkTmFtZV0gPT0gbnVsbCkgZGF0YUZvclF1ZXJ5ICs9IGZpZWxkTmFtZSArICc6IG51bGwsJztcclxuICAgICAgZWxzZSBpZiAodHlwZW9mIHVwZGF0ZWREYXRhW2ZpZWxkTmFtZV0gPT09ICdvYmplY3QnKVxyXG4gICAgICAgIGRhdGFGb3JRdWVyeSArPSB0aGlzLmZvcm1hdEZvckdyYXBoUWwodXBkYXRlZERhdGFbZmllbGROYW1lXSk7XHJcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB1cGRhdGVkRGF0YVtmaWVsZE5hbWVdID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdXBkYXRlZERhdGFbZmllbGROYW1lXSA9PT0gJ2Jvb2xlYW4nKVxyXG4gICAgICAgIGRhdGFGb3JRdWVyeSArPSBmaWVsZE5hbWUgKyBgOiR7dXBkYXRlZERhdGFbZmllbGROYW1lXX0sYDtcclxuICAgICAgZWxzZSBkYXRhRm9yUXVlcnkgKz0gZmllbGROYW1lICsgYDpcXFwiJHt1cGRhdGVkRGF0YVtmaWVsZE5hbWVdfSxgO1xyXG4gICAgfSk7XHJcbiAgICBkYXRhRm9yUXVlcnkgPSBgeyR7ZGF0YUZvclF1ZXJ5LnNsaWNlKDAsIC0xKX19YDtcclxuICAgIHJldHVybiBkYXRhRm9yUXVlcnk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGZvcm1hdEVycm9yKGVycm9yOiBGb3JtRXJyb3IpIHtcclxuICAgIGlmICghZXJyb3IpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3IubWVzc2FnZSkgZXJyb3IubWVzc2FnZSA9IGVycm9yLmVycm9yLm1lc3NhZ2U7XHJcblxyXG4gICAgcmV0dXJuIGVycm9yO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZXNvbHZlVHlwZSh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7XHJcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSByZXR1cm4gMDtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnbnVtYmVyJzpcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZFxcLl0vZywgJycpO1xyXG5cclxuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBtYXNrVG9BcnJheShtYXNrOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgaWYgKG1hc2spIHtcclxuICAgICAgY29uc3QgbWFza1RyaW1tZWQgPSBtYXNrLnRyaW0oKS5zdWJzdHJpbmcoMSkuc2xpY2UoMCwgLTEpLnJlcGxhY2UoJ1xcXFxcXFxcJywgJ1xcXFwnKTtcclxuICAgICAgY29uc3QgYXJyeSA9IG1hc2tUcmltbWVkLnNwbGl0KCcsJyk7XHJcbiAgICAgIGFycnkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpLnJlcGxhY2UoL1xcJy9nLCAnJykpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVRlbXBsYXRlcyhmb3JtOiBGb3JtV2luZG93KTogRm9ybVdpbmRvdyB7XHJcbiAgICBmb3JtLnBhZ2VzLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgcGFnZS50ZW1wbGF0ZS5yZVJlbmRlciA9IGZhbHNlO1xyXG4gICAgICBwYWdlLnRlbXBsYXRlID0gSGVscGVyU2VydmljZS5kZWVwQ29weShwYWdlLnRlbXBsYXRlKTtcclxuICAgICAgcGFnZS5zZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgc2VjdGlvbi50ZW1wbGF0ZS5yZVJlbmRlciA9IGZhbHNlO1xyXG4gICAgICAgIHNlY3Rpb24udGVtcGxhdGUgPSBIZWxwZXJTZXJ2aWNlLmRlZXBDb3B5KHNlY3Rpb24udGVtcGxhdGUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlc2V0VmFsaWRhdG9ycyhcclxuICAgIGNvbXBvbmVudHM6IEZvcm1Db21wb25lbnRzLFxyXG4gICAgZm9ybUNvbnRyb2xzOiBGb3JtQ29udHJvbHMsXHJcbiAgICBjb21wb25lbnRSZXNvbHZlclNlcnZpY2U6IENvbXBvbmVudFJlc29sdmVyU2VydmljZVxyXG4gICk6IEZvcm1Db250cm9scyB7XHJcbiAgICBpZiAoY29tcG9uZW50cyAmJiBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5sZW5ndGggPiAwKVxyXG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRzW2tleV07XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICAgICAgbGV0IGNvbXBvbmVudENvbnRyb2wgPSBmb3JtQ29udHJvbHNbY29tcG9uZW50LmNvbXBvbmVudElkXTtcclxuICAgICAgICAgIGlmIChjb21wb25lbnRDb250cm9sKVxyXG4gICAgICAgICAgICBjb21wb25lbnRDb250cm9sID0gSGVscGVyU2VydmljZS5zZXRWYWxpZGF0b3JzKGNvbXBvbmVudFJlc29sdmVyU2VydmljZSwgY29tcG9uZW50LCBjb21wb25lbnRDb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcm1Db250cm9scztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVGb3JtKGZvcm1Hcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZpZWxkKTtcclxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkgY29udHJvbC5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XHJcbiAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHRoaXMudmFsaWRhdGVGb3JtKGNvbnRyb2wpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==