Пример #1
0
        /// <summary>Создание новой группы с сохранением её в базе и в ветке меню</summary>
        private void f_CreateNewGroup()
        {
            if (p_SelectedGroup == null)
            {
                return;
            }
            Dlg_EditorGroup dlg = new Dlg_EditorGroup();

            dlg.Text = "Новая группа";
            if (p_SelectedGroup.p_Group != null)
            {
                dlg.ctrl_LGroupValue.Text = p_SelectedGroup.p_Group.p_Name;
            }
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                Cl_Group group = new Cl_Group();
                group.p_Type = p_Type;
                group.p_Name = dlg.ctrl_TBName.Text;
                if (p_SelectedGroup.p_Group != null)
                {
                    group.p_ParentID = p_SelectedGroup.p_Group.p_ID;
                }
                Cl_App.m_DataContext.p_Groups.Add(group);
                Cl_App.m_DataContext.SaveChanges();
                if (p_SelectedGroup != null)
                {
                    p_SelectedGroup.Nodes.Add(new Ctrl_TreeNodeGroup(group));
                }
                else
                {
                    Nodes.Add(new Ctrl_TreeNodeGroup(group));
                }
            }
        }
Пример #2
0
        private void Ctrl_ElementNew_Click(object sender, EventArgs e)
        {
            using (var transaction = Cl_App.m_DataContext.Database.BeginTransaction())
            {
                try
                {
                    Cl_EntityLog eLog       = new Cl_EntityLog();
                    Cl_Element   newElement = (Cl_Element)Activator.CreateInstance(typeof(Cl_Element));
                    eLog.f_SetEntity(newElement);
                    Cl_Group group = null;
                    if (p_SelectedGroup != null && p_SelectedGroup.p_Group != null)
                    {
                        group = p_SelectedGroup.p_Group;
                    }
                    Dlg_EditorElement dlg = new Dlg_EditorElement();
                    dlg.Text = "Новый элемент";
                    if (group != null)
                    {
                        newElement.p_ParentGroup  = p_SelectedGroup.p_Group;
                        dlg.ctrl_LGroupValue.Text = p_SelectedGroup.p_Group.p_Name;
                    }
                    if (dlg.ShowDialog() != DialogResult.OK)
                    {
                        return;
                    }
                    newElement.p_Name        = dlg.ctrl_TBName.Text;
                    newElement.p_Comment     = dlg.ctrl_TBDecs.Text;
                    newElement.p_ElementType = (Cl_Element.E_ElementsTypes)dlg.ctrl_CB_ControlType.f_GetSelectedItem();
                    newElement.p_IsPartPre   = true;
                    if (dlg.ctrl_TBName.Text.Length > 0)
                    {
                        newElement.p_PartPre = dlg.ctrl_TBName.Text[0].ToString().ToUpper();
                        if (dlg.ctrl_TBName.Text.Length > 1)
                        {
                            newElement.p_PartPre += dlg.ctrl_TBName.Text.Substring(1, dlg.ctrl_TBName.Text.Length - 1);
                        }
                    }
                    newElement.p_SymmetryParamLeft  = "Слева";
                    newElement.p_SymmetryParamRight = "Справа";
                    Cl_App.m_DataContext.p_Elements.Add(newElement);

                    Cl_App.m_DataContext.SaveChanges();
                    newElement.p_ElementID = newElement.p_ID;
                    Cl_App.m_DataContext.SaveChanges();
                    eLog.f_SaveEntity(newElement);
                    transaction.Commit();

                    Ctrl_TreeNodeElement newNode = new Ctrl_TreeNodeElement(group, newElement);
                    SelectedNode.Nodes.Add(newNode);
                    SelectedNode = newNode;
                    e_AfterCreateElement?.Invoke(this, new TreeViewEventArgs(newNode));
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    MonitoringStub.Error("Error_Tree", "При создании нового элемента произошла ошибка", ex, null, null);
                    return;
                }
            }
        }
Пример #3
0
        /// <summary>Удаляет выбранную группу</summary>
        private void f_DeleteGroup()
        {
            if (p_SelectedGroup == null && p_SelectedGroup.p_Group == null)
            {
                return;
            }
            if (MessageBox.Show($"Удалить группу \"{p_SelectedGroup.p_Group.p_Name}\"?", "Удаление группы", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
            {
                return;
            }
            Cl_Group parentGroup = p_SelectedGroup.p_Group.p_Parent;

            if (parentGroup == null)
            {
                return;
            }
            p_SelectedGroup.p_Group.p_IsDelete = true;
            Cl_App.m_DataContext.SaveChanges();

            if (!p_IsShowDeleted)
            {
                SelectedNode.Remove();
            }
            else
            {
                p_SelectedGroup.p_Group = p_SelectedGroup.p_Group;
            }
        }
        private void f_PopulateTreeGroup(Cl_Group a_Group, TreeNodeCollection a_TreeNodes)
        {
            TreeNode node = new Ctrl_TreeNodeGroup(a_Group);

            a_TreeNodes.Add(node);
            var tpls = Cl_App.m_DataContext.p_Templates
                       .Where(t => t.p_ParentGroupID == a_Group.p_ID && t.p_Type == Cl_Template.E_TemplateType.Template && !t.p_IsDelete).GroupBy(t => t.p_TemplateID)
                       .Select(grp => grp
                               .OrderByDescending(v => v.p_Version)
                               .FirstOrDefault());

            foreach (Cl_Template tpl in tpls)
            {
                node.Nodes.Add(new Ctrl_TreeNodeTemplate(a_Group, tpl));
            }
            var dcGroups = Cl_App.m_DataContext.Entry(a_Group).Collection(g => g.p_SubGroups);

            if (!dcGroups.IsLoaded)
            {
                dcGroups.Load();
            }
            foreach (Cl_Group group in a_Group.p_SubGroups)
            {
                if (!group.p_IsDelete)
                {
                    f_PopulateTreeGroup(group, node.Nodes);
                }
            }
        }
Пример #5
0
        private void f_PopulateTreeGroup(Cl_Group a_Group, TreeNodeCollection a_TreeNodes)
        {
            TreeNode node = new Ctrl_TreeNodeGroup(a_Group);

            a_TreeNodes.Add(node);
            var els = Cl_App.m_DataContext.p_Elements
                      .Where(e => e.p_ParentGroupID == a_Group.p_ID && (p_IsShowDeleted ? true : !e.p_IsDelete)).GroupBy(e => e.p_ElementID)
                      .Select(grp => grp
                              .OrderByDescending(v => v.p_Version).FirstOrDefault())
                      .Include(e => e.p_ParamsValues);

            foreach (Cl_Element el in els)
            {
                node.Nodes.Add(new Ctrl_TreeNodeElement(a_Group, el));
            }
            var dcGroups = Cl_App.m_DataContext.Entry(a_Group).Collection(g => g.p_SubGroups);

            if (!dcGroups.IsLoaded)
            {
                dcGroups.Load();
            }
            foreach (Cl_Group group in a_Group.p_SubGroups)
            {
                if (!group.p_IsDelete || p_IsShowDeleted)
                {
                    f_PopulateTreeGroup(group, node.Nodes);
                }
            }
        }
Пример #6
0
        private static string f_GetGroupValue(object value)
        {
            if (value == null)
            {
                return("");
            }

            Cl_Group group = value as Cl_Group;

            return(group.f_GetFullName());
        }
Пример #7
0
        private void Ctrl_ImageNew_Click(object sender, EventArgs e)
        {
            using (var transaction = Cl_App.m_DataContext.Database.BeginTransaction())
            {
                try
                {
                    Cl_EntityLog eLog = new Cl_EntityLog();

                    Cl_Element newElement = (Cl_Element)Activator.CreateInstance(typeof(Cl_Element));
                    eLog.f_SetEntity(newElement);
                    Cl_Group group = null;
                    if (p_SelectedGroup != null && p_SelectedGroup.p_Group != null)
                    {
                        group = p_SelectedGroup.p_Group;
                    }
                    Dlg_EditorImage dlg = new Dlg_EditorImage();
                    dlg.Text = "Новый рисунок";
                    if (group != null)
                    {
                        newElement.p_ParentGroup  = p_SelectedGroup.p_Group;
                        dlg.ctrl_LGroupValue.Text = p_SelectedGroup.p_Group.p_Name;
                    }
                    if (dlg.ShowDialog() != DialogResult.OK)
                    {
                        return;
                    }
                    newElement.p_Name        = dlg.ctrl_TBName.Text;
                    newElement.p_Comment     = dlg.ctrl_TBDecs.Text;
                    newElement.p_ElementType = Cl_Element.E_ElementsTypes.Image;
                    Cl_App.m_DataContext.p_Elements.Add(newElement);
                    Cl_App.m_DataContext.SaveChanges();
                    newElement.p_ElementID = newElement.p_ID;
                    Cl_App.m_DataContext.SaveChanges();
                    eLog.f_SaveEntity(newElement);
                    transaction.Commit();

                    Ctrl_TreeNodeElement newNode = new Ctrl_TreeNodeElement(group, newElement);
                    SelectedNode.Nodes.Add(newNode);
                    SelectedNode = newNode;
                    e_AfterCreateElement?.Invoke(this, new TreeViewEventArgs(newNode));
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    MonitoringStub.Error("Error_Tree", "При создании нового элемента произошла ошибка", ex, null, null);
                    return;
                }
            }
        }
Пример #8
0
        private void Ctrl_TreeView_DragDrop(object sender, DragEventArgs e)
        {
            Point targetPoint = PointToClient(new Point(e.X, e.Y));
            Ctrl_TreeNodeGroup targetNodeGroup  = GetNodeAt(targetPoint) as Ctrl_TreeNodeGroup;
            Ctrl_TreeNodeGroup draggedNodeGroup = (Ctrl_TreeNodeGroup)e.Data.GetData(typeof(Ctrl_TreeNodeGroup));

            if (draggedNodeGroup != null)
            {
                if (!draggedNodeGroup.Equals(targetNodeGroup) && !f_ContainsNode(draggedNodeGroup, targetNodeGroup))
                {
                    if (e.Effect == DragDropEffects.Move)
                    {
                        Cl_Group groupDragged = Cl_App.m_DataContext.p_Groups.FirstOrDefault(g => g.p_ID == draggedNodeGroup.p_Group.p_ID);
                        if (groupDragged != null)
                        {
                            if (targetNodeGroup == null)
                            {
                                groupDragged.p_ParentID = null;
                            }
                            else
                            {
                                groupDragged.p_ParentID = targetNodeGroup.p_Group.p_ID;
                            }
                            Cl_App.m_DataContext.SaveChanges();

                            draggedNodeGroup.Remove();
                            if (targetNodeGroup == null)
                            {
                                Nodes.Add(draggedNodeGroup);
                            }
                            else
                            {
                                targetNodeGroup.Nodes.Insert(f_GetFirstGroupInNode(targetNodeGroup.Nodes), draggedNodeGroup);
                            }
                        }
                        else
                        {
                            MonitoringStub.Error("Error_Tree", "Не найдена группа шаблонов", new Exception("EX ERROR"), "groupDragged = null", null);
                        }
                    }
                }
            }
            else
            {
                f_TreeView_DragDrop(sender, e, targetNodeGroup);
            }
        }
 private void f_PopulateTreeGroup(Cl_Group.E_Type a_Type, Cl_Group a_Group, TreeNodeCollection a_TreeNodes)
 {
     if (p_ActiveTemplate != null)
     {
         TreeNode node = new Ctrl_TreeNodeGroup(a_Group);
         a_TreeNodes.Add(node);
         if (a_Type == Cl_Group.E_Type.Elements)
         {
             var els = Cl_App.m_DataContext.p_Elements
                       .Where(e => e.p_ParentGroupID == a_Group.p_ID && !e.p_IsDelete && e.p_Version > 0).GroupBy(e => e.p_ElementID)
                       .Select(grp => grp
                               .OrderByDescending(v => v.p_Version).FirstOrDefault())
                       .Include(e => e.p_ParamsValues);
             foreach (Cl_Element el in els)
             {
                 node.Nodes.Add(new Ctrl_TreeNodeElement(a_Group, el));
             }
         }
         else if (p_ActiveTemplate.p_Type == Cl_Template.E_TemplateType.Template)
         {
             var tpls = Cl_App.m_DataContext.p_Templates.Include(t => t.p_TemplateElements)
                        .Where(e => e.p_ParentGroupID == a_Group.p_ID && !e.p_IsDelete && (e.p_Type == Cl_Template.E_TemplateType.Block || e.p_Type == Cl_Template.E_TemplateType.Table)).GroupBy(e => e.p_TemplateID)
                        .Select(grp => grp
                                .OrderByDescending(v => v.p_Version).FirstOrDefault());
             foreach (Cl_Template tpl in tpls)
             {
                 node.Nodes.Add(new Ctrl_TreeNodeTemplate(a_Group, tpl));
             }
         }
         var dcGroups = Cl_App.m_DataContext.Entry(a_Group).Collection(g => g.p_SubGroups);
         if (!dcGroups.IsLoaded)
         {
             dcGroups.Load();
         }
         foreach (Cl_Group group in a_Group.p_SubGroups)
         {
             if (!group.p_IsDelete)
             {
                 f_PopulateTreeGroup(a_Type, group, node.Nodes);
             }
         }
     }
 }
Пример #10
0
 public Ctrl_TreeNodeElement(Cl_Group a_Group, Cl_Element a_Element)
 {
     p_Group   = a_Group;
     p_Element = a_Element;
     ForeColor = Color.Blue;
 }
 public Ctrl_TreeNodeGroup(Cl_Group a_Group)
 {
     p_Group = a_Group;
     Name    = a_Group.p_ID.ToString();
     Text    = a_Group.p_Name;
 }
        public void f_TestCreateRecord()
        {
            var temlName = "Тест проверки создания API работы с записями";
            var dc       = new Cl_DataContextMegaTemplate(f_GetConnectionString());

            dc.f_Init();
            var result = Cl_MedicalCardsFacade.f_GetInstance().f_Init(dc);

            Assert.AreEqual(true, result);
            result = Cl_TemplatesFacade.f_GetInstance().f_Init(dc);
            Assert.AreEqual(true, result);
            result = Cl_RecordsFacade.f_GetInstance().f_Init(dc, f_GetLocalResourcesPath());
            Assert.AreEqual(true, result);
            result = Cl_CatalogsFacade.f_GetInstance().f_Init(dc);
            Assert.AreEqual(true, result);

            var groupTpl = dc.p_Groups.FirstOrDefault(g => g.p_Type == Cl_Group.E_Type.Templates && g.p_Name == "test");

            if (groupTpl == null)
            {
                groupTpl = new Cl_Group()
                {
                    p_Name = "test", p_Type = Cl_Group.E_Type.Elements
                };
                dc.p_Groups.Add(groupTpl);
                dc.SaveChanges();
            }
            var groupEl = dc.p_Groups.FirstOrDefault(g => g.p_Type == Cl_Group.E_Type.Templates && g.p_Name == "test");

            if (groupEl == null)
            {
                groupEl = new Cl_Group()
                {
                    p_Name = "test", p_Type = Cl_Group.E_Type.Elements
                };
                dc.p_Groups.Add(groupEl);
                dc.SaveChanges();
            }

            if (!Cl_CatalogsFacade.f_GetInstance().f_HasCategory("Осмотр"))
            {
                Cl_CatalogsFacade.f_GetInstance().f_AddCategory(Cl_Category.E_CategoriesTypes.Total, "Осмотр");
            }
            if (!Cl_CatalogsFacade.f_GetInstance().f_HasCategory("Клиническая 1"))
            {
                Cl_CatalogsFacade.f_GetInstance().f_AddCategory(Cl_Category.E_CategoriesTypes.Clinic, "Клиническая 1");
            }

            var catTotal = Cl_CatalogsFacade.f_GetInstance().f_GetCategory("Осмотр");

            Assert.AreNotEqual(null, catTotal);
            var catClinic = Cl_CatalogsFacade.f_GetInstance().f_GetCategory("Клиническая 1");

            Assert.AreNotEqual(null, catClinic);

            var tmpl = Cl_TemplatesFacade.f_GetInstance().f_GetTemplateByName(temlName);

            if (tmpl == null)
            {
                tmpl = new Cl_Template()
                {
                    p_Name = temlName, p_Type = Cl_Template.E_TemplateType.Template
                };
                var elements = new List <Cl_TemplateElement>();

                var element = new Cl_Element()
                {
                    p_ParentGroupID = groupEl.p_ID,
                    p_ParentGroup   = groupEl,
                    p_Name          = "Формула 1",
                    p_Tag           = "one",
                    p_IsNumber      = true,
                    p_NumberRound   = 3
                };
                element.p_ParamsValues = new List <Cl_ElementParam>();
                for (int i = 1; i < 4; i++)
                {
                    element.p_ParamsValues.Add(new Cl_ElementParam()
                    {
                        p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.NormValues, p_Value = i.ToString()
                    });
                    element.p_ParamsValues.Add(new Cl_ElementParam()
                    {
                        p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.PatValues, p_Value = i.ToString()
                    });
                }
                elements.Add(new Cl_TemplateElement()
                {
                    p_Template = tmpl, p_ChildElement = element, p_Index = 0
                });

                element = new Cl_Element()
                {
                    p_ParentGroupID = groupEl.p_ID,
                    p_ParentGroup   = groupEl,
                    p_Name          = "Формула 2",
                    p_Tag           = "dva",
                    p_IsNumber      = true,
                    p_NumberRound   = 2
                };
                element.p_ParamsValues = new List <Cl_ElementParam>();
                for (int i = 1; i < 4; i++)
                {
                    element.p_ParamsValues.Add(new Cl_ElementParam()
                    {
                        p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.NormValues, p_Value = i.ToString()
                    });
                    element.p_ParamsValues.Add(new Cl_ElementParam()
                    {
                        p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.PatValues, p_Value = i.ToString()
                    });
                }
                elements.Add(new Cl_TemplateElement()
                {
                    p_Template = tmpl, p_ChildElement = element, p_Index = 1
                });
                element = new Cl_Element()
                {
                    p_ParentGroupID = groupEl.p_ID,
                    p_ParentGroup   = groupEl,
                    p_Name          = "Формула 3",
                    p_Tag           = "tri",
                    p_IsNumber      = true,
                    p_NumberRound   = 2
                };
                element.p_ParamsValues = new List <Cl_ElementParam>();
                for (int i = 1; i < 4; i++)
                {
                    element.p_ParamsValues.Add(new Cl_ElementParam()
                    {
                        p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.NormValues, p_Value = i.ToString()
                    });
                    element.p_ParamsValues.Add(new Cl_ElementParam()
                    {
                        p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.PatValues, p_Value = i.ToString()
                    });
                }
                elements.Add(new Cl_TemplateElement()
                {
                    p_Template = tmpl, p_ChildElement = element, p_Index = 2
                });
                tmpl.p_ParentGroupID    = groupTpl.p_ID;
                tmpl.p_ParentGroup      = groupTpl;
                tmpl.p_TemplateElements = elements;
                tmpl.p_CategoryTotalID  = catTotal.p_ID;
                tmpl.p_CategoryTotal    = catTotal;
                tmpl.p_CategoryClinicID = catClinic.p_ID;
                tmpl.p_CategoryClinic   = catClinic;

                dc.p_Templates.Add(tmpl);
                dc.SaveChanges();
            }
            Assert.AreNotEqual(null, tmpl);

            var elts = Cl_TemplatesFacade.f_GetInstance().f_GetElements(tmpl);

            Assert.AreNotEqual(null, elts);
            var vals = new List <Cl_RecordValue>();

            foreach (var el in elts)
            {
                vals.Add(new Cl_RecordValue()
                {
                    p_ElementID = el.p_ID, p_Element = el, p_ValueUser = "******"
                });
            }
            var medicalCard1 = Cl_MedicalCardsFacade.f_GetInstance().f_GetMedicalCard("777", 1);

            if (medicalCard1 == null)
            {
                medicalCard1 = Cl_MedicalCardsFacade.f_GetInstance().f_CreateMedicalCard("777", 1, Core.Permision.Cl_User.E_Sex.Man, "Иванов", "Иван", "Иванович", new DateTime(1996, 3, 11), "Медкарта API тест 777");
            }
            Assert.IsNotNull(medicalCard1);
            result = Cl_RecordsFacade.f_GetInstance().f_CreateRecord(medicalCard1, catTotal, catClinic, "Заголовок API тест - значения", "Клиника API тест значения", 56369,
                                                                     "Доктор_Фамилия", "Доктор_Имя", "Доктор_Отчество",
                                                                     tmpl, vals);
            Assert.AreEqual(true, result);
            result = Cl_RecordsFacade.f_GetInstance().f_CreateRecord(medicalCard1, catTotal, catClinic, "Заголовок API тест - файл", "Клиника API тест файл", 56369,
                                                                     "Доктор_Фамилия", "Доктор_Имя", "Доктор_Отчество",
                                                                     E_RecordFileType.HTML, Encoding.UTF8.GetBytes("<h1>API тест файл<h1>"));
            Assert.AreEqual(true, result);
        }
 public Ctrl_TreeNodeTemplate(Cl_Group a_Group, Cl_Template a_Template)
 {
     p_Group    = a_Group;
     p_Template = a_Template;
 }
Пример #14
0
        private void f_TemplateNew(Cl_Template.E_TemplateType a_TemplateType)
        {
            using (var transaction = Cl_App.m_DataContext.Database.BeginTransaction())
            {
                try
                {
                    Cl_EntityLog eLog = new Cl_EntityLog();

                    Cl_Template newTemplate = (Cl_Template)Activator.CreateInstance(typeof(Cl_Template));
                    eLog.f_SetEntity(newTemplate);
                    Cl_Group group = null;
                    if (p_SelectedGroup != null && p_SelectedGroup.p_Group != null)
                    {
                        group = p_SelectedGroup.p_Group;
                    }
                    Dlg_EditorTemplate dlg = new Dlg_EditorTemplate();
                    dlg.ctrlPCategories.Enabled = a_TemplateType == Cl_Template.E_TemplateType.Template;
                    if (a_TemplateType == Cl_Template.E_TemplateType.Template)
                    {
                        dlg.Text = "Новый шаблон";
                    }
                    else if (a_TemplateType == Cl_Template.E_TemplateType.Block)
                    {
                        dlg.Text = "Новый блок";
                    }
                    else if (a_TemplateType == Cl_Template.E_TemplateType.Table)
                    {
                        dlg.Text = "Новая таблица";
                    }
                    if (group != null)
                    {
                        newTemplate.p_ParentGroup = p_SelectedGroup.p_Group;
                        dlg.ctrl_LGroupValue.Text = p_SelectedGroup.p_Group.p_Name;
                    }
                    if (dlg.ShowDialog() != DialogResult.OK)
                    {
                        return;
                    }
                    newTemplate.p_Name  = dlg.ctrl_TBName.Text;
                    newTemplate.p_Title = dlg.ctrlTitle.Text;
                    newTemplate.p_Type  = a_TemplateType;
                    if (a_TemplateType == Cl_Template.E_TemplateType.Template)
                    {
                        var catTotal = (Cl_Category)dlg.ctrlCategoriesTotal.SelectedItem;
                        newTemplate.p_CategoryTotalID = catTotal.p_ID;
                        newTemplate.p_CategoryTotal   = catTotal;
                        var catClinic = (Cl_Category)dlg.ctrlCategoriesClinic.SelectedItem;
                        newTemplate.p_CategoryClinicID = catClinic.p_ID;
                        newTemplate.p_CategoryClinic   = catClinic;
                    }
                    Cl_App.m_DataContext.p_Templates.Add(newTemplate);
                    Cl_App.m_DataContext.SaveChanges();
                    newTemplate.p_TemplateID = newTemplate.p_ID;
                    Cl_App.m_DataContext.SaveChanges();
                    eLog.f_SaveEntity(newTemplate);
                    transaction.Commit();

                    SelectedNode.Nodes.Add(new Ctrl_TreeNodeTemplate(group, newTemplate));
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    MonitoringStub.Error("Error_Tree", "При создании нового шаблона произошла ошибка", ex, null, null);
                    return;
                }
            }
        }