UNPKG

@kre-form/ant

Version:

1,038 lines (1,035 loc) 98.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable, Inject } from "@angular/core"; import { Guid, clone, } from "@kre-form/core"; import { KreToFormFieldService } from "./formFieldService"; import * as _ from "lodash"; export class KreTransferService { /** * @param {?} toFormField */ constructor(toFormField) { this.toFormField = toFormField; } /** * @param {?} form_fields * @param {?} checkedFields * @return {?} */ transferLineToForm(form_fields, checkedFields) { /** @type {?} */ let obj = this.getFieldLineInfo(); if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; form_fields.splice(checkedField.index + 1, 0, obj); } else { form_fields.push(obj); } } /** * @param {?} form_fields * @param {?} checkedFields * @return {?} */ transferReferProcessToForm(form_fields, checkedFields) { /** @type {?} */ let obj = this.getFieldReferProcessInfo(); if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; form_fields.splice(checkedField.index + 1, 0, obj); } else { form_fields.push(obj); } } /** * @param {?} form_fields * @param {?} checkedFields * @return {?} */ transferAnchorToForm(form_fields, checkedFields) { /** @type {?} */ let obj = this.getFieldAnchorInfo(); if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; form_fields.splice(checkedField.index + 1, 0, obj); } else { form_fields.push(obj); } } /** * @param {?} form_fields * @param {?} checkedFields * @return {?} */ transferLabelToForm(form_fields, checkedFields) { /** @type {?} */ let obj = this.getFieldRemarkInfo(); if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; form_fields.splice(checkedField.index + 1, 0, obj); } else { form_fields.push(obj); } } /** * @param {?} form_fields * @param {?} checkedFields * @param {?} tableCode * @param {?=} businessTable * @return {?} */ transferGroupToForm(form_fields, checkedFields, tableCode, businessTable) { /** @type {?} */ let obj = this.getFieldGroupInfo(tableCode, businessTable); obj.tableCode = tableCode; if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; form_fields.splice(checkedField.index + 1, 0, obj); } else { form_fields.push(obj); } } /** * @param {?} form_fields * @param {?} checkedFields * @param {?} businessTable * @param {?} obj * @return {?} */ transferSelectFieldToForm(form_fields, checkedFields, businessTable, obj) { /** @type {?} */ let selectFields = []; /** @type {?} */ let tableFields = []; /** @type {?} */ let addFields = []; /** @type {?} */ let beginIndex = 0; Object.getOwnPropertyNames(obj).forEach((/** * @param {?} item * @return {?} */ (item) => { if (obj[item]) { selectFields.push(item); } })); if (!selectFields || selectFields.length < 1) return; tableFields = this.getTableFiledList(businessTable); if (!tableFields || tableFields.length < 1) return; if (form_fields && form_fields.length > 0) { beginIndex = form_fields.length; } selectFields.forEach((/** * @param {?} key * @return {?} */ (key) => { /** @type {?} */ let tableField = this.getTableFiledInfo(key, tableFields); if (tableField != null) { /** @type {?} */ let formField = this.toFormField.getKreFiledFunction(tableField); if (formField && formField != null) { addFields.push(formField); } } })); if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; beginIndex = checkedField.index + 1; } addFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { form_fields.splice(beginIndex + index, 0, item); })); } /** * @param {?} form_fields * @param {?} field * @param {?} type * @return {?} */ groupFieldMoveUpOrDown(form_fields, field, type) { this.clearGroupChecked(field); /** @type {?} */ let cloneFields = clone(form_fields); /** @type {?} */ let cloneField = clone(field); /** @type {?} */ let checkedFields = this.getGroupCheckFields(cloneField); if (checkedFields) { if (type === "up") { checkedFields.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.index > 0) { _.get(cloneField, "fieldArray.fieldGroup").splice(item.index, 1); _.get(cloneField, "fieldArray.fieldGroup").splice(item.index - 1, 0, item.field); } })); } else if (type === "down") { checkedFields.reverse().forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.index < _.get(cloneField, "fieldArray.fieldGroup").length - 1) { _.get(cloneField, "fieldArray.fieldGroup").splice(item.index, 1); _.get(cloneField, "fieldArray.fieldGroup").splice(item.index + 1, 0, item.field); } })); } } cloneFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { if (item.key === cloneField.key) { item.fieldArray = cloneField.fieldArray; if (item.hasOwnProperty("type") && item.hasOwnProperty("fieldGroup") && item.type === "repeat") { delete item.fieldGroup; } } })); return cloneFields; } /** * @param {?} form_fields * @param {?} field * @return {?} */ groupTransferLineToForm(form_fields, field) { this.clearGroupChecked(field); /** @type {?} */ let cloneFields = clone(form_fields); /** @type {?} */ let cloneField = clone(field); /** @type {?} */ let obj = this.getFieldLineInfo(); /** @type {?} */ let checkedFields = this.getGroupCheckFields(cloneField); if (!cloneField) return null; if (!cloneField.fieldArray || !cloneField.fieldArray.fieldGroup || cloneField.fieldArray.fieldGroup.length < 1) { _.get(cloneField, "fieldArray.fieldGroup", []); } if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; _.get(checkedField, "checked", true); _.get(cloneField, "fieldArray.fieldGroup").splice(checkedField.index + 1, 0, obj); } else { _.get(cloneField, "fieldArray.fieldGroup").push(obj); } cloneFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { if (item.key === cloneField.key) { item.fieldArray = cloneField.fieldArray; if (item.hasOwnProperty("type") && item.hasOwnProperty("fieldGroup") && item.type === "repeat") { delete item.fieldGroup; } } })); return cloneFields; } /** * @param {?} form_fields * @param {?} field * @return {?} */ groupTransferRemarkToForm(form_fields, field) { this.clearGroupChecked(field); /** @type {?} */ let cloneFields = clone(form_fields); /** @type {?} */ let cloneField = clone(field); /** @type {?} */ let obj = this.getFieldRemarkInfo(); /** @type {?} */ let checkedFields = this.getGroupCheckFields(cloneField); if (!cloneField) return null; if (!cloneField.fieldArray || !cloneField.fieldArray.fieldGroup || cloneField.fieldArray.fieldGroup.length < 1) { _.get(cloneField, "fieldArray.fieldGroup", []); } if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; _.get(checkedField, "checked", true); _.get(cloneField, "fieldArray.fieldGroup").splice(checkedField.index + 1, 0, obj); } else { _.get(cloneField, "fieldArray.fieldGroup").push(obj); } cloneFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { if (item.key === cloneField.key) { item.fieldArray = cloneField.fieldArray; if (item.hasOwnProperty("type") && item.hasOwnProperty("fieldGroup") && item.type === "repeat") { delete item.fieldGroup; } } })); return cloneFields; } /** * @param {?} form_fields * @param {?} groupField * @param {?} checkedFields * @param {?} businessTable * @param {?} obj * @return {?} */ groupTransferSelectFieldToForm(form_fields, groupField, checkedFields, businessTable, obj) { /** @type {?} */ let cloneFields = clone(form_fields); /** @type {?} */ let cloneGroupField = clone(groupField); /** @type {?} */ let selectFields = []; /** @type {?} */ let tableFields = []; /** @type {?} */ let addFields = []; /** @type {?} */ let beginIndex = 0; Object.getOwnPropertyNames(obj).forEach((/** * @param {?} item * @return {?} */ (item) => { if (obj[item]) { selectFields.push(item); } })); if (!selectFields || selectFields.length < 1) return; tableFields = this.getTableFiledList(businessTable); if (!tableFields || tableFields.length < 1) return; if (!cloneGroupField.fieldArray || !cloneGroupField.fieldArray.fieldGroup || cloneGroupField.fieldArray.fieldGroup.length < 1) { //_.get(cloneGroupField, "fieldArray.fieldGroup", []); if (cloneGroupField.fieldArray == undefined || cloneGroupField.fieldArray == null || cloneGroupField.fieldArray.fieldGroup == undefined || cloneGroupField.fieldArray.fieldGroup == null) { cloneGroupField.fieldArray = { fieldGroup: [], }; } } if (cloneGroupField && cloneGroupField.fieldArray && cloneGroupField.fieldArray.fieldGroup && cloneGroupField.fieldArray.fieldGroup.length > 0) { beginIndex = cloneGroupField.fieldArray.fieldGroup.length; } selectFields.forEach((/** * @param {?} key * @return {?} */ (key) => { /** @type {?} */ let tableField = this.getTableFiledInfo(key, tableFields); if (tableField != null) { /** @type {?} */ let formField = this.toFormField.getKreFiledFunction(tableField); if (formField && formField != null) { addFields.push(formField); } } })); if (checkedFields && checkedFields.length > 0) { /** @type {?} */ let checkedField = checkedFields[checkedFields.length - 1]; beginIndex = checkedField.index + 1; } else { } addFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { _.get(cloneGroupField, "fieldArray.fieldGroup").splice(beginIndex + index, 0, item); })); cloneFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { if (item.key === cloneGroupField.key) { item.fieldArray = cloneGroupField.fieldArray; if (item.hasOwnProperty("type") && item.hasOwnProperty("fieldGroup") && item.type === "repeat") { delete item.fieldGroup; } } })); return cloneFields; } /** * @param {?} form_fields * @param {?} field * @return {?} */ groupTransferDeleteForm(form_fields, field) { this.clearGroupChecked(field); /** @type {?} */ let cloneFields = clone(form_fields); /** @type {?} */ let cloneField = clone(field); /** @type {?} */ let checkedFields = this.getGroupCheckFields(cloneField); if (!checkedFields || checkedFields == null || checkedFields.length < 1) { return; } if (!cloneField.fieldArray || !cloneField.fieldArray.fieldGroup || cloneField.fieldArray.fieldGroup.length < 1) { return; } checkedFields.forEach((/** * @param {?} item * @return {?} */ (item) => { _.get(cloneField, "fieldArray.fieldGroup").forEach((/** * @param {?} field * @param {?} index * @param {?} object * @return {?} */ (field, index, object) => { if (field.key === item.field.key && (field.templateOptions == null || field.templateOptions.isButintin == undefined || field.templateOptions.isButintin == null || field.templateOptions.isButintin == false)) { object.splice(index, 1); } })); })); cloneFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { if (item.key === cloneField.key) { item.fieldArray = cloneField.fieldArray; if (item.hasOwnProperty("type") && item.hasOwnProperty("fieldGroup") && item.type === "repeat") { delete item.fieldGroup; } } })); return cloneFields; } /* groupTransferDeleteForm( form_fields: KreFormFieldConfig[], groupField: KreFormFieldConfig ) { let cloneFields: KreFormFieldConfig[] = clone(form_fields); let cloneGroupField: KreFormFieldConfig = clone(groupField); let checkedFields: ICheckedField[] = this.getGroupCheckFields(cloneGroupField); if (!checkedFields || checkedFields == null || checkedFields.length < 1) { return; } if ( !cloneGroupField.fieldArray || !cloneGroupField.fieldArray.fieldGroup || cloneGroupField.fieldArray.fieldGroup.length < 1 ) { return; } checkedFields.forEach((item: any) => { _.get(cloneGroupField, "fieldArray.fieldGroup").forEach( (field: any, index: any, object: any) => { if ( field.key === item.field.key && (field.templateOptions == null || field.templateOptions.isButintin == undefined || field.templateOptions.isButintin == null || field.templateOptions.isButintin == false) ) { object.splice(index, 1); } } ); }); cloneFields.forEach((item: any, index: any, object: any) => { if (item.key === cloneGroupField.key) { item.fieldArray = cloneGroupField.fieldArray; if ( item.hasOwnProperty("type") && item.hasOwnProperty("fieldGroup") && item.type === "repeat" ) { delete item.fieldGroup; } } }); return cloneFields; } */ /** * @param {?} form_fields * @param {?} new_field * @return {?} */ editFormFieldInfo(form_fields, new_field) { if (!form_fields) return; /** @type {?} */ let cloneFields = clone(form_fields); /** @type {?} */ let groupKey = ""; cloneFields.forEach((/** * @param {?} field * @param {?} index * @param {?} object * @return {?} */ (field, index, object) => { if (field.type === "repeat") { if (field.key === new_field.key) { if (field.templateOptions == undefined || field.templateOptions == null) { field.templateOptions = {}; } if (field.templateOptions && field.templateOptions != null && new_field.templateOptions && new_field.templateOptions != null && new_field.templateOptions.type && new_field.templateOptions.type != null) { field.templateOptions.type = new_field.templateOptions.type; } if (field.templateOptions && field.templateOptions != null && new_field.templateOptions && new_field.templateOptions != null && new_field.templateOptions.maxLength && new_field.templateOptions.maxLength != null) { field.templateOptions.maxLength = new_field.templateOptions.maxLength; } field.show = new_field.show; field.hide = new_field.hide; } if (field.fieldArray && field.fieldArray.fieldGroup && field.fieldArray.fieldGroup.length > 0) { _.get(field, "fieldArray.fieldGroup").forEach((/** * @param {?} groupField * @param {?} groupIndex * @param {?} groupObject * @return {?} */ (groupField, groupIndex, groupObject) => { if (groupField.key === new_field.key) { groupKey = field.key; groupObject.splice(groupIndex, 1); groupObject.splice(groupIndex, 0, new_field); } })); } } else { if (field.key === new_field.key) { object.splice(index, 1); object.splice(index, 0, new_field); } } })); if (groupKey != null && groupKey != "") { cloneFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { if (item.hasOwnProperty("type") && item.hasOwnProperty("fieldGroup") && item.type === "repeat") { delete item.fieldGroup; } })); } return { groupKey: groupKey, formFileds: cloneFields, }; } /** * @param {?} form_fields * @param {?} field * @return {?} */ deleteFormFieldInfo(form_fields, field) { /** @type {?} */ let cloneFields = clone(form_fields); /** @type {?} */ let cloneField = clone(field); /** @type {?} */ let groupKey; if (cloneFields != undefined && cloneFields != null && cloneField != undefined && cloneField != null && cloneFields.length > 0) { if (cloneField.key != undefined && cloneField.key != null) { cloneFields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { if (item.key === cloneField.key) { object.splice(index, 1); } if (item.fieldArray != undefined && item.fieldArray != null && item.fieldArray.fieldGroup != undefined && item.fieldArray.fieldGroup != null) { /** @type {?} */ let res = this.deleteGroupFormFieldInfo(item, field); if (res != null && res != "") { groupKey = res; if (item.hasOwnProperty("type") && item.hasOwnProperty("fieldGroup") && item.type === "repeat") { delete item.fieldGroup; } } } })); } } return { groupKey: groupKey, formFileds: cloneFields, }; } /** * @private * @param {?} fields * @param {?} field * @return {?} */ deleteGroupFormFieldInfo(fields, field) { /** @type {?} */ let form_fields = []; /** @type {?} */ let groupKey = ""; if (fields.fieldArray != undefined && fields.fieldArray != null && fields.fieldArray.fieldGroup != undefined && fields.fieldArray.fieldGroup != null) { form_fields = fields.fieldArray.fieldGroup; if (form_fields != undefined && form_fields != null && field != undefined && field != null && form_fields.length > 0) { if (field.key != undefined && field.key != null) { form_fields.forEach((/** * @param {?} item * @param {?} index * @param {?} object * @return {?} */ (item, index, object) => { if (item.key === field.key) { if (fields.key != undefined && fields.key != null) { groupKey = fields.key; object.splice(index, 1); } } })); } } } return groupKey; } /** * @private * @return {?} */ getFieldLineInfo() { /** @type {?} */ let obj = { key: Guid.create()["value"], guid: Guid.create()["value"], type: "line", status: 1, }; return obj; } /** * @private * @return {?} */ getFieldRemarkInfo() { /** @type {?} */ let obj = { key: Guid.create()["value"], guid: Guid.create()["value"], type: "htmlcontent", templateOptions: { description: "片段文本描述", isNav: true, }, status: 1, }; return obj; } /** * @private * @return {?} */ getFieldAnchorInfo() { /** @type {?} */ let obj = { key: Guid.create()["value"], guid: Guid.create()["value"], type: "anchor", status: 1, }; return obj; } /** * @private * @return {?} */ getFieldReferProcessInfo() { /** @type {?} */ let obj = { key: "comprehensive$df_comprehensiveapply$associationprocess", guid: Guid.create()["value"], type: "referProcess", status: 1, templateOptions: { showFieldButton: false, type: "table", label: "关联流程", }, fieldArray: { fieldGroup: [ { key: "comprehensive$df_comprehensiveapply$associationprocessid", type: "input", editor: false, show: true, templateOptions: { isButintin: false, required: false, description: "实例ID", isNav: true, hideLabel: false, hiddenTree: false, label: "实例ID", placeholder: "", lang: "", }, editProperty: { config: false, }, id: `formly_17_select_comprehensive$df_comprehensiveapply$associationprocessid_${Math.random()}`, hooks: {}, primitiveProperty: {}, }, { key: "comprehensive$df_comprehensiveapply$associationprocessname", type: "select", editor: false, show: true, templateOptions: { isButintin: false, required: false, description: "关联流程", isNav: true, hideLabel: false, hiddenTree: false, label: "关联流程", placeholder: "", lang: "", }, editProperty: { config: false, }, id: `formly_17_select_comprehensive$df_comprehensiveapply$associationprocessname_${Math.random()}`, hooks: {}, primitiveProperty: {}, }, ], }, }; return obj; } /** * @private * @param {?} tableCode * @param {?} businessTable * @return {?} */ getFieldGroupInfo(tableCode, businessTable) { /** @type {?} */ let type = "card"; if (businessTable && businessTable.child && businessTable.child.multiple && businessTable.child.multiple.length > 0) { businessTable.child.multiple.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.tableCode === tableCode && item.secondType !== undefined && item.secondType !== null && item.secondType !== "") { type = item.secondType; } })); } /** @type {?} */ let obj = { key: tableCode, guid: Guid.create()["value"], type: "repeat", fieldArray: { fieldGroup: [], }, templateOptions: { type: type, maxLength: 10, }, tableCode: "", status: 1, }; return obj; } //清空选中 /** * @private * @param {?} field * @return {?} */ clearGroupChecked(field) { if (!field || !field.fieldArray || !field.fieldArray.fieldGroup || !field.fieldGroup) return; field.fieldArray.fieldGroup.forEach((/** * @param {?} item * @param {?} index * @return {?} */ (item, index) => { item.checked = false; })); } //获取选中 /** * @param {?} field * @return {?} */ getGroupCheckFields(field) { /** @type {?} */ let checkedField = []; if (!field || !field.fieldArray || !field.fieldArray.fieldGroup || !field.fieldGroup || field.fieldGroup.length < 1) { return checkedField; } _.get(field, "fieldGroup[0].fieldGroup").forEach((/** * @param {?} item * @param {?} index * @return {?} */ (item, index) => { if (item.checked) { checkedField.push({ index: index, field: item }); _.get(field, "fieldArray.fieldGroup")[index].checked = true; } })); return checkedField; } /** * @private * @param {?} businessTable * @return {?} */ getTableFiledList(businessTable) { /** @type {?} */ let tableFields = []; if (businessTable) { if (businessTable.primary && businessTable.primary != null && businessTable.primary.tableFields && businessTable.primary.tableFields != null && businessTable.primary.tableFields.length > 0) { if (businessTable.primary.tableFields) { businessTable.primary.tableFields.forEach((/** * @param {?} el * @return {?} */ (el) => { el["tableCode"] = businessTable.primary.tableCode; })); tableFields = tableFields.concat(businessTable.primary.tableFields); } } if (businessTable.child && businessTable.child != null) { if (businessTable.child.single && businessTable.child.single != null && businessTable.child.single.length > 0) { businessTable.child.single.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.tableFields) { item.tableFields.forEach((/** * @param {?} el * @return {?} */ (el) => { el["tableCode"] = (/** @type {?} */ (item)).tableCode; })); tableFields = tableFields.concat(item.tableFields); } })); } if (businessTable.child.multiple && businessTable.child.multiple != null && businessTable.child.multiple.length > 0) { businessTable.child.multiple.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.tableFields) { item.tableFields.forEach((/** * @param {?} el * @return {?} */ (el) => { el["tableCode"] = (/** @type {?} */ (item)).tableCode; })); tableFields = tableFields.concat(item.tableFields); } })); } } } return tableFields; } /** * @private * @param {?} key * @param {?} tableFields * @return {?} */ getTableFiledInfo(key, tableFields) { /** @type {?} */ let resValue = {}; if (key && tableFields && tableFields.length > 0) { /** @type {?} */ let filterField = tableFields.filter((/** * @param {?} item * @return {?} */ (item) => { return item["fieldCode"] === key; })); if (filterField && filterField.length > 0) { return filterField[0]; } return resValue; } return resValue; } } KreTransferService.decorators = [ { type: Injectable } ]; /** @nocollapse */ KreTransferService.ctorParameters = () => [ { type: KreToFormFieldService, decorators: [{ type: Inject, args: [KreToFormFieldService,] }] } ]; if (false) { /** * @type {?} * @private */ KreTransferService.prototype.toFormField; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtyZS1mb3JtL2FudC8iLCJzb3VyY2VzIjpbImxpYi90b29scy90cmFuc2ZlclNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFHTCxJQUFJLEVBQ0osS0FBSyxHQUNOLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0QsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFHNUIsTUFBTSxPQUFPLGtCQUFrQjs7OztJQUM3QixZQUVVLFdBQWtDO1FBQWxDLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtJQUN6QyxDQUFDOzs7Ozs7SUFFSixrQkFBa0IsQ0FDaEIsV0FBaUMsRUFDakMsYUFBOEI7O1lBRTFCLEdBQUcsR0FBdUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1FBQ3JELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztnQkFDekMsWUFBWSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMxRCxXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0wsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN2QjtJQUNILENBQUM7Ozs7OztJQUNELDBCQUEwQixDQUN4QixXQUFpQyxFQUNqQyxhQUE4Qjs7WUFFMUIsR0FBRyxHQUF1QixJQUFJLENBQUMsd0JBQXdCLEVBQUU7UUFDN0QsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O2dCQUN6QyxZQUFZLEdBQUcs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