public void TestSecondWriteMethod() { var idColumn = DbfFieldDescriptors.GetIntegerField("Id"); var nameColumn = DbfFieldDescriptors.GetStringField("Name"); var columns = new List <DbfFieldDescriptor>() { idColumn, nameColumn }; Func <MyClass, object> mapId = myClass => myClass.Id; Func <MyClass, object> mapName = myClass => myClass.Name; var mapping = new List <Func <MyClass, object> >() { mapId, mapName }; List <MyClass> values = new List <MyClass>(); values.Add(new MyClass() { Id = 1, Name = "name1" }); DbfFileFormat.Write(@"D:\yourFile.dbf", values, mapping, columns, Encoding.ASCII); }
public void TestFirstWriteMethod() { DataTable dt = new DataTable(); dt.Columns.Add("Id"); dt.Columns.Add("Name"); dt.Rows.Add("1", "Chirag"); DbfFileFormat.Write(@"D:\yourFile.DBF", dt, Encoding.Default); }
//Экспорт таблицы 4 в dbf public static bool ExportUnionReportT4ToDbf(string path, List <ExportUnionReportT4> export, string fileNameDbf, out string error) { error = string.Empty; if (path == string.Empty) { error = "path == string.Empty"; return(false); } if (!Directory.Exists(path)) { error = "!Directory.Exists(path)"; return(false); } if (export == null) { error = "export == null"; return(false); } string pathToTable = path + "\\" + fileNameDbf + ".dbf"; try { File.Delete(pathToTable); } catch (Exception exc) { error = exc.Message; return(false); } var encoding = Encoding.GetEncoding(1251); var stream = new FileStream(pathToTable, FileMode.Create); var writer = new BinaryWriter(stream); var columns = GetFieldDbfUnionReportT4(); var header = new DbfHeader(export.Count, columns.Count, DbfFileFormat.GetRecordLength(columns), encoding); writer.Write(IRI.Ket.IO.BinaryStream.StructureToByteArray(header)); foreach (DbfFieldDescriptor item in columns) { writer.Write(IRI.Ket.IO.BinaryStream.StructureToByteArray(item)); } //Terminator writer.Write(byte.Parse("0D", System.Globalization.NumberStyles.HexNumber)); foreach (var record in export) { // All dbf field records begin with a deleted flag field. Deleted - 0x2A (asterisk) else 0x20 (space) writer.Write(byte.Parse("20", System.Globalization.NumberStyles.HexNumber)); byte[] temp = null; string value = null; //1 PERIOD_M temp = new byte[columns.Find(rec => rec.Name == "PERIOD_M").Length]; value = record.PERIOD_M.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //2 PERIOD_M temp = new byte[columns.Find(rec => rec.Name == "PERIOD_Y").Length]; value = record.PERIOD_Y.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //3 UKR_GROMAD temp = new byte[columns.Find(rec => rec.Name == "UKR_GROMAD").Length]; value = record.UKR_GROMAD.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //4 NUMIDENT temp = new byte[columns.Find(rec => rec.Name == "NUMIDENT").Length]; value = record.NUMIDENT; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //5 LN temp = new byte[columns.Find(rec => rec.Name == "LN").Length]; value = record.LN; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //6 NM temp = new byte[columns.Find(rec => rec.Name == "NM").Length]; value = record.NM; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //7 FTN temp = new byte[columns.Find(rec => rec.Name == "FTN").Length]; value = record.FTN; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //8 C_PID temp = new byte[columns.Find(rec => rec.Name == "C_PID").Length]; value = record.C_PID; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //9 START_DT temp = new byte[columns.Find(rec => rec.Name == "START_DT").Length]; value = record.START_DT.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //10 STOP_DT temp = new byte[columns.Find(rec => rec.Name == "STOP_DT").Length]; value = record.STOP_DT.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //11 DAYS temp = new byte[columns.Find(rec => rec.Name == "DAYS").Length]; value = record.DAYS.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //12 HH temp = new byte[columns.Find(rec => rec.Name == "HH").Length]; value = record.HH.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //13 MM temp = new byte[columns.Find(rec => rec.Name == "MM").Length]; value = record.MM.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //14 NORMA_1 temp = new byte[columns.Find(rec => rec.Name == "NORMA_1").Length]; value = record.NORMA_1.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //15 NORMA_2 temp = new byte[columns.Find(rec => rec.Name == "NORMA_2").Length]; value = record.NORMA_2.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //16 NORMA_3 temp = new byte[columns.Find(rec => rec.Name == "NORMA_3").Length]; value = record.NORMA_3.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //17 NUM_NAK temp = new byte[columns.Find(rec => rec.Name == "NUM_NAK").Length]; value = record.NUM_NAK; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //18 DT_NAK temp = new byte[columns.Find(rec => rec.Name == "DT_NAK").Length]; value = record.DT_NAK.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //19 SEAZON temp = new byte[columns.Find(rec => rec.Name == "SEAZON").Length]; value = record.SEAZON.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //20 OZN temp = new byte[columns.Find(rec => rec.Name == "OZN").Length]; value = record.OZN.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); } writer.Write(byte.Parse("1A", System.Globalization.NumberStyles.HexNumber)); writer.Close(); stream.Close(); return(true); }
//Экспорт таблицы 2 в dbf public static bool ExportUnionReportT2ToDbf(string path, List <ExportUnionReportT2> export, string fileNameDbf, out string error) { error = string.Empty; if (path == string.Empty) { error = "path == string.Empty"; return(false); } if (!Directory.Exists(path)) { error = "!Directory.Exists(path)"; return(false); } if (export == null) { error = "export == null"; return(false); } string pathToTable = path + "\\" + fileNameDbf + ".dbf"; try { File.Delete(pathToTable); } catch (Exception exc) { error = exc.Message; return(false); } var encoding = Encoding.GetEncoding(1251); var stream = new FileStream(pathToTable, FileMode.Create); var writer = new BinaryWriter(stream); var columns = GetFieldDbfUnionReportT2(); var header = new DbfHeader(export.Count, columns.Count, DbfFileFormat.GetRecordLength(columns), encoding); writer.Write(IRI.Ket.IO.BinaryStream.StructureToByteArray(header)); foreach (DbfFieldDescriptor item in columns) { writer.Write(IRI.Ket.IO.BinaryStream.StructureToByteArray(item)); } //Terminator writer.Write(byte.Parse("0D", System.Globalization.NumberStyles.HexNumber)); foreach (var record in export) { writer.Write(byte.Parse("20", System.Globalization.NumberStyles.HexNumber)); byte[] temp = null; string value = null; //1 NP temp = new byte[columns.Find(rec => rec.Name == "NP").Length]; value = record.NP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //2 PERIOD temp = new byte[columns.Find(rec => rec.Name == "PERIOD").Length]; value = record.PERIOD.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //3 RIK temp = new byte[columns.Find(rec => rec.Name == "RIK").Length]; value = record.RIK.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //4 KOD temp = new byte[columns.Find(rec => rec.Name == "KOD").Length]; value = record.KOD; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //5 TYP temp = new byte[columns.Find(rec => rec.Name == "TYP").Length]; value = record.TYP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //6 TIN temp = new byte[columns.Find(rec => rec.Name == "TIN").Length]; value = record.TIN; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //7 S_NAR temp = new byte[columns.Find(rec => rec.Name == "S_NAR").Length]; value = record.S_NAR.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //8 S_DOX temp = new byte[columns.Find(rec => rec.Name == "S_DOX").Length]; value = record.S_DOX.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //9 S_TAXN temp = new byte[columns.Find(rec => rec.Name == "S_TAXN").Length]; value = record.S_TAXN.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //10 S_TAXP temp = new byte[columns.Find(rec => rec.Name == "S_TAXP").Length]; value = record.S_TAXP.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //11 OZN_DOX temp = new byte[columns.Find(rec => rec.Name == "OZN_DOX").Length]; value = record.OZN_DOX.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //12 D_PRIYN temp = new byte[columns.Find(rec => rec.Name == "D_PRIYN").Length]; value = record.D_PRIYN.ToString("yyyyMMdd"); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); ////13 D_ZVILN temp = new byte[columns.Find(rec => rec.Name == "D_ZVILN").Length]; value = record.D_ZVILN.ToString("yyyyMMdd"); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //14 OZN_PILG temp = new byte[columns.Find(rec => rec.Name == "OZN_PILG").Length]; value = record.OZN_PILG.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //15 OZNAKA temp = new byte[columns.Find(rec => rec.Name == "OZNAKA").Length]; value = record.OZNAKA.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //16 A051 temp = new byte[columns.Find(rec => rec.Name == "A051").Length]; value = record.A051.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //17 A05 temp = new byte[columns.Find(rec => rec.Name == "A05").Length]; value = record.A05.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); } writer.Write(byte.Parse("1A", System.Globalization.NumberStyles.HexNumber)); writer.Close(); stream.Close(); return(true); }
//Экспорт таблицы 1 в dbf public static bool ExportUnionReportT1ToDbf(string path, List <ExportUnionReportT1> export, string fileNameDbf, out string error) { error = string.Empty; if (path == string.Empty) { error = "path == string.Empty"; return(false); } if (!Directory.Exists(path)) { error = "!Directory.Exists(path)"; return(false); } if (export == null) { error = "export == null"; return(false); } string pathToTable = path + "\\" + fileNameDbf + ".dbf"; try { File.Delete(pathToTable); } catch (Exception exc) { error = exc.Message; return(false); } var encoding = Encoding.GetEncoding(1251); var stream = new FileStream(pathToTable, FileMode.Create); var writer = new BinaryWriter(stream); var columns = GetFieldDbfUnionReportT1(); var header = new DbfHeader(export.Count, columns.Count, DbfFileFormat.GetRecordLength(columns), encoding); writer.Write(IRI.Ket.IO.BinaryStream.StructureToByteArray(header)); foreach (DbfFieldDescriptor item in columns) { writer.Write(IRI.Ket.IO.BinaryStream.StructureToByteArray(item)); } //Terminator writer.Write(byte.Parse("0D", System.Globalization.NumberStyles.HexNumber)); foreach (var record in export) { // All dbf field records begin with a deleted flag field. Deleted - 0x2A (asterisk) else 0x20 (space) writer.Write(byte.Parse("20", System.Globalization.NumberStyles.HexNumber)); byte[] temp = null; string value = null; //1 PERIOD_M temp = new byte[columns.Find(rec => rec.Name == "PERIOD_M").Length]; value = record.PERIOD_M.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //2 PERIOD_M temp = new byte[columns.Find(rec => rec.Name == "PERIOD_Y").Length]; value = record.PERIOD_Y.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //3 UKR_GROMAD temp = new byte[columns.Find(rec => rec.Name == "UKR_GROMAD").Length]; value = record.UKR_GROMAD.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //4 ST temp = new byte[columns.Find(rec => rec.Name == "ST").Length]; value = record.ST.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //5 NUMIDENT temp = new byte[columns.Find(rec => rec.Name == "NUMIDENT").Length]; value = record.NUMIDENT; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //6 LN temp = new byte[columns.Find(rec => rec.Name == "LN").Length]; value = record.LN; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //7 NM temp = new byte[columns.Find(rec => rec.Name == "NM").Length]; value = record.NM; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //8 NM temp = new byte[columns.Find(rec => rec.Name == "FTN").Length]; value = record.FTN; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //9 ZO temp = new byte[columns.Find(rec => rec.Name == "ZO").Length]; value = record.ZO.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //10 PAY_TP temp = new byte[columns.Find(rec => rec.Name == "PAY_TP").Length]; value = record.PAY_TP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //11 PAY_TP temp = new byte[columns.Find(rec => rec.Name == "PAY_MNTH").Length]; value = record.PAY_MNTH.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //12 PAY_YEAR temp = new byte[columns.Find(rec => rec.Name == "PAY_YEAR").Length]; value = record.PAY_YEAR.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //13 KD_NP temp = new byte[columns.Find(rec => rec.Name == "KD_NP").Length]; value = record.KD_NP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //14 KD_NZP temp = new byte[columns.Find(rec => rec.Name == "KD_NZP").Length]; value = record.KD_NZP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //14 KD_PTV temp = new byte[columns.Find(rec => rec.Name == "KD_PTV").Length]; value = record.KD_PTV.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //14 KD_VP temp = new byte[columns.Find(rec => rec.Name == "KD_VP").Length]; value = record.KD_VP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //15 SUM_TOTAL temp = new byte[columns.Find(rec => rec.Name == "SUM_TOTAL").Length]; value = record.SUM_TOTAL.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //16 SUM_MAX temp = new byte[columns.Find(rec => rec.Name == "SUM_MAX").Length]; value = record.SUM_MAX.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //17 SUM_DIFF temp = new byte[columns.Find(rec => rec.Name == "SUM_DIFF").Length]; value = record.SUM_DIFF.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //18 SUM_INS temp = new byte[columns.Find(rec => rec.Name == "SUM_INS").Length]; value = record.SUM_INS.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //19 SUM_NARAH temp = new byte[columns.Find(rec => rec.Name == "SUM_NARAH").Length]; value = record.SUM_NARAH.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //20 OTK temp = new byte[columns.Find(rec => rec.Name == "OTK").Length]; value = record.OTK.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //21 EXP temp = new byte[columns.Find(rec => rec.Name == "EXP").Length]; value = record.EXP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //22 NRC temp = new byte[columns.Find(rec => rec.Name == "NRC").Length]; value = record.NRC.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //23 NRM temp = new byte[columns.Find(rec => rec.Name == "NRM").Length]; value = record.NRM.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); temp = new byte[columns.Find(rec => rec.Name == "OZN").Length]; value = record.OZN.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); } writer.Write(byte.Parse("1A", System.Globalization.NumberStyles.HexNumber)); writer.Close(); stream.Close(); return(true); }
//Экспорт таблицы 6 ЕСВ в dbf public static bool ExportDFToDbf(string path, int qrt, List <ExportDFRec> export, out string error) { error = string.Empty; if (path == string.Empty) { error = "path == string.Empty"; return(false); } if (!Directory.Exists(path)) { error = "!Directory.Exists(path)"; return(false); } if (qrt <= 0) { error = "qrt <= 0"; return(false); } if (qrt > 4) { error = "qrt > 4"; return(false); } if (export == null) { error = "export == null"; return(false); } string pathToDBF = path + "\\" + _nameDF + "." + qrt; try { File.Delete(pathToDBF); } catch (Exception exc) { error = exc.Message; return(false); } Encoding encoding = Encoding.GetEncoding(1251); Stream stream = new FileStream(pathToDBF, FileMode.Create); BinaryWriter writer = new BinaryWriter(stream); List <DbfFieldDescriptor> columns = GetFieldDbfDF(); DbfHeader header = new DbfHeader(export.Count, columns.Count, DbfFileFormat.GetRecordLength(columns), encoding); writer.Write(IRI.Ket.IO.BinaryStream.StructureToByteArray(header)); foreach (DbfFieldDescriptor item in columns) { writer.Write(IRI.Ket.IO.BinaryStream.StructureToByteArray(item)); } //Terminator writer.Write(byte.Parse("0D", System.Globalization.NumberStyles.HexNumber)); foreach (ExportDFRec record in export) { // All dbf field records begin with a deleted flag field. Deleted - 0x2A (asterisk) else 0x20 (space) writer.Write(byte.Parse("20", System.Globalization.NumberStyles.HexNumber)); byte[] temp = null; string value = null; //1 NP temp = new byte[columns.Find(rec => rec.Name == "NP").Length]; value = record.NP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //2 PERIOD temp = new byte[columns.Find(rec => rec.Name == "PERIOD").Length]; value = record.PERIOD.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //3 RIK temp = new byte[columns.Find(rec => rec.Name == "RIK").Length]; value = record.RIK.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //4 KOD temp = new byte[columns.Find(rec => rec.Name == "KOD").Length]; value = record.KOD; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //5 TYP temp = new byte[columns.Find(rec => rec.Name == "TYP").Length]; value = record.TYP.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //6 TIN temp = new byte[columns.Find(rec => rec.Name == "TIN").Length]; value = record.TIN; encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //7 S_NAR temp = new byte[columns.Find(rec => rec.Name == "S_NAR").Length]; value = record.S_NAR.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //8 S_DOX temp = new byte[columns.Find(rec => rec.Name == "S_DOX").Length]; value = record.S_DOX.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //9 S_TAXN temp = new byte[columns.Find(rec => rec.Name == "S_TAXN").Length]; value = record.S_TAXN.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //10 S_TAXP temp = new byte[columns.Find(rec => rec.Name == "S_TAXP").Length]; value = record.S_TAXP.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //11 OZN_DOX temp = new byte[columns.Find(rec => rec.Name == "OZN_DOX").Length]; value = record.OZN_DOX.ToString().Replace(',', '.'); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //12 D_PRIYN temp = new byte[columns.Find(rec => rec.Name == "D_PRIYN").Length]; value = record.D_PRIYN.ToString("yyyyMMdd"); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); ////13 D_ZVILN temp = new byte[columns.Find(rec => rec.Name == "D_ZVILN").Length]; value = record.D_ZVILN.ToString("yyyyMMdd"); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //14 OZN_PILG temp = new byte[columns.Find(rec => rec.Name == "OZN_PILG").Length]; value = record.OZN_PILG.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); //15 OZNAKA temp = new byte[columns.Find(rec => rec.Name == "OZNAKA").Length]; value = record.OZNAKA.ToString(); encoding.GetBytes(value, 0, value.Length, temp, 0); writer.Write(temp); } writer.Write(byte.Parse("1A", System.Globalization.NumberStyles.HexNumber)); writer.Close(); stream.Close(); return(true); }