Foksh قام بنشر نوفمبر 16 قام بنشر نوفمبر 16 السلام عليكم ورحمة الله وبركاته ، أخواني وأساتذتي ومعلمينا ( دون استثناء ) قمت بتنفيذ فكرة تشفير السجلات في الجداول ، والذي تهدف إلى حماية البيانات من المتطفلين عند محاولتهم استيراد بيانات الجداول . والفكرة تم تطبيقها وإكمالها خلال طرح مشاركة معلمي الفاضل @ابوخليل في رده على أخونا @الحلبي في مشاركة في موضوع سابق . ولكني هنا اعتمدت على الجدول ( EncryptionStatus ) يحتوي حقل واحد ( Status ) من نوع Yes / No لمعرفة حالة التشفير عند تشغيل التطبيق .. ⭐ البرنامج يهدف إلى تنفيذ عملية تشفير و فك تشفير على كافة جداول قاعدة البيانات باستخدام خوارزمية XOR . وتحتوي الأداة على عدة دوال و وظائف تم تقسيمها وتوزيعها بشكل منفصل لتسهيل فهم وصيانة وتعديل الكود حسب الرغبة والحاجة . وبشكل مختصر سأذكر بعض وظائف هذه الدوال تالياً ، ثم ننتقل الى الكود لاحقاً :- الدالة EncryptDecrypt :- هذه الدالة الرئيسية التي تعمل على تشفير أو الغاء التشفير ؛ حيث تستخدم مفتاح التشفير ( المحدد في strKey ) لتطبيق عملية XOR بين البيانات والنص المشفر . الدالة GetAllTables :- هذه الدالة تقوم بإرجاع قائمة بأسماء كل الجداول في قاعدة البيانات الحالية ( طبعاً باستثناء جداول النظام ) . الدالة CheckEncryptionStatus :- هذه الدالة تتحقق من حالة التشفير ، عن طريق التحقق من قيمة الحقل Status في جدول EncryptionStatus . بحيث إذا كانت قيمة الحقل = True ، فإن قاعدة البيانات تكون مشفرة . الدالة EncryptAllTablesIndependently : - تم إضافتها لاستدعائها عند الخلل ( إجراء إحترازي ) .... والعديد من الدوال . كود المديول :- Option Compare Database Public Const EnCodeKey As String = "Officna2024" Public Function EncryptDecrypt(strData As String, strKey As String) As String Dim i As Integer Dim strResult As String Dim keyLen As Integer Dim keyValue As Integer strResult = "" If Len(strKey) = 0 Then MsgBox "مفتاح التشفير غير صحيح", vbCritical, "" Exit Function End If keyLen = Len(strKey) For i = 1 To Len(strData) keyValue = Asc(Mid(strKey, ((i - 1) Mod keyLen) + 1)) strResult = strResult & Chr(Asc(Mid(strData, i, 1)) Xor keyValue) Next i EncryptDecrypt = strResult End Function Public Function GetAllTables() As Collection Dim db As DAO.Database Dim tblDef As DAO.TableDef Dim tblNames As New Collection Set db = CurrentDb For Each tblDef In db.TableDefs If Left(tblDef.Name, 4) <> "MSys" Then tblNames.Add tblDef.Name End If Next tblDef Set GetAllTables = tblNames End Function Public Function CheckEncryptionStatus() As Boolean On Error GoTo ErrorHandler Dim db As DAO.Database Dim rs As DAO.Recordset Dim status As Boolean Set db = CurrentDb Set rs = db.OpenRecordset("EncryptionStatus", dbOpenDynaset) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst status = rs!status Else status = False End If rs.Close Set rs = Nothing Set db = Nothing CheckEncryptionStatus = status Exit Function ErrorHandler: MsgBox "لا يمكنك استخدام هذا المشروع في الوقت الحالي", vbCritical, "" EncryptAllTablesIndependently EnCodeKey DoCmd.Quit Exit Function End Function Public Sub EncryptAllTablesIndependently(ByVal strKey As String) Dim db As DAO.Database Dim tblName As Variant Dim rs As DAO.Recordset Dim fld As DAO.Field Dim tblList As Collection If Len(strKey) = 0 Then MsgBox "مفتاح التشفير غير صحيح", vbCritical, "" Exit Sub End If Set db = CurrentDb Set tblList = GetAllTables() For Each tblName In tblList Set rs = db.OpenRecordset(tblName, dbOpenDynaset) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst Do Until rs.EOF For Each fld In rs.Fields If fld.Type = dbText Then rs.Edit rs(fld.Name).Value = EncryptDecrypt(Nz(rs(fld.Name), ""), strKey) rs.Update End If Next fld rs.MoveNext Loop End If rs.Close Next tblName End Sub Public Sub SetEncryptionStatus(status As Boolean) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("EncryptionStatus", dbOpenDynaset) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst rs.Edit rs!status = status rs.Update Else rs.AddNew rs!status = status rs.Update End If rs.Close End Sub Public Sub EncryptOrDecryptTables(ByVal strKey As String, ByVal isEncrypting As Boolean) Dim db As DAO.Database Dim tblName As Variant Dim rs As DAO.Recordset Dim fld As DAO.Field Dim tblList As Collection Dim action As String Set db = CurrentDb Set tblList = GetAllTables() action = IIf(isEncrypting, "تشفير", "فك التشفير") For Each tblName In tblList Set rs = db.OpenRecordset(tblName, dbOpenDynaset) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst Do Until rs.EOF For Each fld In rs.Fields If fld.Type = dbText Then rs.Edit rs(fld.Name).Value = EncryptDecrypt(Nz(rs(fld.Name), ""), strKey) rs.Update End If Next fld rs.MoveNext Loop End If rs.Close Next tblName MsgBox "تمت عملية " & action & " بنجاح", vbInformation, "" End Sub Public Sub HandleEncryptionOnFormOpen() If CheckEncryptionStatus() = True Then Call EncryptOrDecryptTables(EnCodeKey, False) SetEncryptionStatus False End If End Sub Public Sub HandleEncryptionOnFormClose() If CheckEncryptionStatus() = False Then Call EncryptOrDecryptTables(EnCodeKey, True) SetEncryptionStatus True End If End Sub Public Function GetTotalRecordCount() As Long Dim db As DAO.Database Dim tblDef As DAO.TableDef Dim totalCount As Long Dim rs As DAO.Recordset Set db = CurrentDb totalCount = 0 For Each tblDef In db.TableDefs If Left(tblDef.Name, 4) <> "MSys" Then Set rs = db.OpenRecordset(tblDef.Name, dbOpenSnapshot) If Not (rs.EOF And rs.BOF) Then rs.MoveLast totalCount = totalCount + rs.recordCount End If rs.Close End If Next tblDef Set db = Nothing GetTotalRecordCount = totalCount End Function تم تنفيذ الفكرة بطريقتين ، الأولى من خلال الإعتماد على النموذج الرئيسي الذي يفتح به المشروع ( في حدث عند التحميل يتم الغاء التشفير ) وعند زر إغلاق المشروع يوجد حدث لإعادة التشفير لجميع الجداول مرة واحدة وبسرعة مهما كان عدد السجلات . والثانية من خلال نموذج آخر عند النقر على زر Start يبدأ شريط التحميل والذي يعتمد على عدد السجلات في جميع الجداول التي تم تشفيرها بالتقدم من 0 - 100% . وعند اغلاق النموذج يتم اعادة التشفير مرة أخرى . ✔ خطوات الحصول على النتيجة الصحيحة كالآتي :- ✔ انسخ الجدول (EncryptionStatus ) والمديول ( Encryption ) إلى أي مشروع تريده . ✔ تأكد من أن جميع السجلات غير مشفرة . ✔ تأكد من أن حالة الحقل Status هي No . قمت بكتابة الموضوع على عجالة ، وتركت الباب مفتوح للنقاش . Tashfeer 2024.accdb 2 1
الحلبي قام بنشر نوفمبر 16 قام بنشر نوفمبر 16 منذ ساعه, Foksh said: تم تنفيذ الفكرة بطريقتين ، الأولى من خلال الإعتماد على النموذج الرئيسي الذي يفتح به المشروع والله يااخى العزيز ماذا اقول لك ـ عبقرى فعلا شوف ياصاحبى انا استخدمت الطريقة الاولى وهى الاعتماد على النموذج الرئيسى وهو هنا شاشة ادخال عادية مثل اى شاشة ان اضفت ما يلزم الى برنامجى كما اشرت حضرتك والمشكلة التى قابلتنى ان البرنامج مشفر طول الوقت وهذا مثال مصغر مرفق من برنامجى كيف يمكن التطبيق عليه واذا تم التطبيق يمكن لى ان انا اطبق على برنامجى جزاك الله كل خير مشتريات ومبيعات.accdb 1
Foksh قام بنشر نوفمبر 16 الكاتب قام بنشر نوفمبر 16 (معدل) 12 دقائق مضت, الحلبي said: والله يااخى العزيز ماذا اقول لك ـ عبقرى فعلا شوف ياصاحبى انا استخدمت الطريقة الاولى وهى الاعتماد على النموذج الرئيسى وهو هنا شاشة ادخال عادية مثل اى شاشة ان اضفت ما يلزم الى برنامجى كما اشرت حضرتك والمشكلة التى قابلتنى ان البرنامج مشفر طول الوقت وهذا مثال مصغر مرفق من برنامجى كيف يمكن التطبيق عليه واذا تم التطبيق يمكن لى ان انا اطبق على برنامجى جزاك الله كل خير مشتريات ومبيعات.accdb 1.22 \u0645\u064a\u062c\u0627 \u0628\u0627\u064a\u062a · 2 downloads هنا كانت مشكلتك تأكد من أن حالة الحقل Status هي No . هذا ملفك بعد التطبيق مشتريات ومبيعات.accdb تم تعديل نوفمبر 16 بواسطه Foksh
ابوخليل قام بنشر نوفمبر 16 قام بنشر نوفمبر 16 3 ساعات مضت, Foksh said: ✔ تأكد من أن حالة الحقل Status هي No . جميل جدا .. مع ان الحقل status ثغرة يمكن التلاعب بها فتنعكس العملية . هل الاعلان عن متغير رقمي عند الفتح وعندما يتم فك التشفير تتغير قيمته من اجل شرط التشفير يقوم بالمهمة بدلا من الحقل ؟ والافضل عند تغير قيمة المتغير ان تتغير الى : صفر ويكون هو الشرط لماذا ؟ ... خشية ان يحدث خطأ .. فاي error عند العمل على البرنامج مهما كان صغيرا يسبب مسح للذاكرة هنا لو تم مسح الذاكرة سيبقى المتغير على قيمته الافتراضية صفر 1
Moosak قام بنشر نوفمبر 17 قام بنشر نوفمبر 17 ما شاء الله تبارك الرحمن .. 😊🌼 سباق محتدم في الإبداعات والابتكارات هذه الفترة .. شكله موسم الإبداعات 😁👌 سلمت يمناك عم الحاج مستر @Foksh .. شغل معلمين 👍🙂 .. لكن سؤالي هو : هل هذه الحركة سوف تتوافق مع قواعد البيانات المشتركة لأكثر من مستخدم ؟ ألن يحصل تضارب بين المستخدمين عند التشفير وفكه وخصوصا وقت إدخال البيانات ؟ فرص حصول الأخطاء كبيرة .. وخصوصا لو نسينا تغيير حالة ال status قبل عملية إدخال البيانات .. هي مجرد أفكار ولعلها من وحي الخيال وضرب من ضروب الفكر فقط 🙂🖐 1
الحلبي قام بنشر نوفمبر 17 قام بنشر نوفمبر 17 (معدل) 12 ساعات مضت, Foksh said: تأكد من أن حالة الحقل Status هي No . بارك الله فيك وفى صحتك وعافيتك كلام جميل جدا وسحر فى الاكواد ـ الله يبارك لك فى علمك وفى اسرتك ـ امين صاحبى / فادى هل تقصد بان status هى no انها غير نشطة يعنى اتاكد اولا ان علامة الصح غير موجودة عليها ام العكس وانا اريد ان تلغى الرسالة التى تقول : "تم عملية فك التشفير بنجاح " والرسالة التى تقول "تم علمية التشفير بنجاح" انا قمت بالغاء الرسالة ولكن اريد ان يختصر الكود بقدر الامكان وسؤال تانى ارى انه سؤال ليس وقته وهو : هل ممكن نجعل التشفير للحقول الرقمية ايضا وليس للحقول النصية فقط لو كان بايدى لجعلتك ليس خبيرا فقط وليس من فريق المنتدى ولكن يتوج اسمك بعنوان كبير فى المنتدى ـ مع احترامى لكل فريق الموقع وخبراء المنتدى ـ ان كان تخيلى فى مكانه ولا انسى فضل ومساعدة سيخنا الجليل / ابو خليل فهو صاحب الفكرة واول من قام بمساعدتى زادك الله صحة وعافيه ـ واطال الله عمرك معلمنا الجليل جزاك الله كل خير تم تعديل نوفمبر 17 بواسطه الحلبي 1
Foksh قام بنشر نوفمبر 18 الكاتب قام بنشر نوفمبر 18 في 17/11/2024 at 01:00, ابوخليل said: جميل جدا .. مع ان الحقل status ثغرة يمكن التلاعب بها معلمنا يسعدني الحديث حول هذه النقطة .. فكرتي كانت كالآتي ، الآن عند حفظ وتشفير قاعدة البيانات الى ACCDE كمثال ، فلا اعتقد انه من السهل التلاعب بالجدول هذا تحديداً ، إذا كان المبرمج قد قام بإلغاء مفتاح الشيفت !! لذا كان همه ليس بالكبير للقلق حوله . في 17/11/2024 at 01:00, ابوخليل said: هل الاعلان عن متغير رقمي عند الفتح وعندما يتم فك التشفير تتغير قيمته من اجل شرط التشفير يقوم بالمهمة بدلا من الحقل ؟ والافضل عند تغير قيمة المتغير ان تتغير الى : صفر ويكون هو الشرط هذا كلام جميل ، ولم يخطر لي ( يبدو أنني كنت جداً على عجالة من أمري ) ، وأكيد نعم، يمكن استخدام متغير رقمي بدلاً من الاعتماد على حقل في جدول كما تم الأمر زهز اقتراح جميل . في 17/11/2024 at 08:05, Moosak said: لكن سؤالي هو : هل هذه الحركة سوف تتوافق مع قواعد البيانات المشتركة لأكثر من مستخدم ؟ اهلا مهندسنا الغالي ، بارك الله بك فعلاً في فكرتي لم أتم التوسع بها لهذا الغرض ، ولكنه قد يكون ممكناً في تطويرات وتحديثات قادمة
Foksh قام بنشر نوفمبر 18 الكاتب قام بنشر نوفمبر 18 في 17/11/2024 at 11:43, الحلبي said: هل تقصد بان status هى no انها غير نشطة يعنى اتاكد اولا ان علامة الصح غير موجودة عليها ام العكس هي فقط أول مرة يجب ان تتأكد منها في هذا الإصدار ، ولكن بناءً على الأفكار الرائعة من قبل معلمينا ومهندسينا فأعتقد أنها قابلة للتطوير والتوسيع ان شاء الله . في 17/11/2024 at 11:43, الحلبي said: وانا اريد ان تلغى الرسالة التى تقول : "تم عملية فك التشفير بنجاح " والرسالة التى تقول "تم علمية التشفير بنجاح" انا قمت بالغاء الرسالة ولكن اريد ان يختصر الكود بقدر الامكان هذه الرسالة تستطيع الغاء ظهورها من داخل المديول . وموضوع اختصار الكود ، تستطيع استخدام كود معلمنا وشيخنا الجليل ابو خليل وجعلهم في حدث عند الفتح والإغلاق لنموذج محدد . مع العلم أن الكود قابل للتوسع وقد يكون أكبر من هذا الحالي
gamal ghanem قام بنشر الثلاثاء at 06:32 قام بنشر الثلاثاء at 06:32 في 16/11/2024 at 20:20, Foksh said: السلام عليكم ورحمة الله وبركاته ، أخواني وأساتذتي ومعلمينا ( دون استثناء ) قمت بتنفيذ فكرة تشفير السجلات في الجداول ، والذي تهدف إلى حماية البيانات من المتطفلين عند محاولتهم استيراد بيانات الجداول . والفكرة تم تطبيقها وإكمالها خلال طرح مشاركة معلمي الفاضل @ابوخليل في رده على أخونا @الحلبي في مشاركة في موضوع سابق . ولكني هنا اعتمدت على الجدول ( EncryptionStatus ) يحتوي حقل واحد ( Status ) من نوع Yes / No لمعرفة حالة التشفير عند تشغيل التطبيق .. ⭐ البرنامج يهدف إلى تنفيذ عملية تشفير و فك تشفير على كافة جداول قاعدة البيانات باستخدام خوارزمية XOR . وتحتوي الأداة على عدة دوال و وظائف تم تقسيمها وتوزيعها بشكل منفصل لتسهيل فهم وصيانة وتعديل الكود حسب الرغبة والحاجة . وبشكل مختصر سأذكر بعض وظائف هذه الدوال تالياً ، ثم ننتقل الى الكود لاحقاً :- الدالة EncryptDecrypt :- هذه الدالة الرئيسية التي تعمل على تشفير أو الغاء التشفير ؛ حيث تستخدم مفتاح التشفير ( المحدد في strKey ) لتطبيق عملية XOR بين البيانات والنص المشفر . الدالة GetAllTables :- هذه الدالة تقوم بإرجاع قائمة بأسماء كل الجداول في قاعدة البيانات الحالية ( طبعاً باستثناء جداول النظام ) . الدالة CheckEncryptionStatus :- هذه الدالة تتحقق من حالة التشفير ، عن طريق التحقق من قيمة الحقل Status في جدول EncryptionStatus . بحيث إذا كانت قيمة الحقل = True ، فإن قاعدة البيانات تكون مشفرة . الدالة EncryptAllTablesIndependently : - تم إضافتها لاستدعائها عند الخلل ( إجراء إحترازي ) .... والعديد من الدوال . كود المديول :- Option Compare Database Public Const EnCodeKey As String = "Officna2024" Public Function EncryptDecrypt(strData As String, strKey As String) As String Dim i As Integer Dim strResult As String Dim keyLen As Integer Dim keyValue As Integer strResult = "" If Len(strKey) = 0 Then MsgBox "مفتاح التشفير غير صحيح", vbCritical, "" Exit Function End If keyLen = Len(strKey) For i = 1 To Len(strData) keyValue = Asc(Mid(strKey, ((i - 1) Mod keyLen) + 1)) strResult = strResult & Chr(Asc(Mid(strData, i, 1)) Xor keyValue) Next i EncryptDecrypt = strResult End Function Public Function GetAllTables() As Collection Dim db As DAO.Database Dim tblDef As DAO.TableDef Dim tblNames As New Collection Set db = CurrentDb For Each tblDef In db.TableDefs If Left(tblDef.Name, 4) <> "MSys" Then tblNames.Add tblDef.Name End If Next tblDef Set GetAllTables = tblNames End Function Public Function CheckEncryptionStatus() As Boolean On Error GoTo ErrorHandler Dim db As DAO.Database Dim rs As DAO.Recordset Dim status As Boolean Set db = CurrentDb Set rs = db.OpenRecordset("EncryptionStatus", dbOpenDynaset) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst status = rs!status Else status = False End If rs.Close Set rs = Nothing Set db = Nothing CheckEncryptionStatus = status Exit Function ErrorHandler: MsgBox "لا يمكنك استخدام هذا المشروع في الوقت الحالي", vbCritical, "" EncryptAllTablesIndependently EnCodeKey DoCmd.Quit Exit Function End Function Public Sub EncryptAllTablesIndependently(ByVal strKey As String) Dim db As DAO.Database Dim tblName As Variant Dim rs As DAO.Recordset Dim fld As DAO.Field Dim tblList As Collection If Len(strKey) = 0 Then MsgBox "مفتاح التشفير غير صحيح", vbCritical, "" Exit Sub End If Set db = CurrentDb Set tblList = GetAllTables() For Each tblName In tblList Set rs = db.OpenRecordset(tblName, dbOpenDynaset) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst Do Until rs.EOF For Each fld In rs.Fields If fld.Type = dbText Then rs.Edit rs(fld.Name).Value = EncryptDecrypt(Nz(rs(fld.Name), ""), strKey) rs.Update End If Next fld rs.MoveNext Loop End If rs.Close Next tblName End Sub Public Sub SetEncryptionStatus(status As Boolean) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("EncryptionStatus", dbOpenDynaset) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst rs.Edit rs!status = status rs.Update Else rs.AddNew rs!status = status rs.Update End If rs.Close End Sub Public Sub EncryptOrDecryptTables(ByVal strKey As String, ByVal isEncrypting As Boolean) Dim db As DAO.Database Dim tblName As Variant Dim rs As DAO.Recordset Dim fld As DAO.Field Dim tblList As Collection Dim action As String Set db = CurrentDb Set tblList = GetAllTables() action = IIf(isEncrypting, "تشفير", "فك التشفير") For Each tblName In tblList Set rs = db.OpenRecordset(tblName, dbOpenDynaset) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst Do Until rs.EOF For Each fld In rs.Fields If fld.Type = dbText Then rs.Edit rs(fld.Name).Value = EncryptDecrypt(Nz(rs(fld.Name), ""), strKey) rs.Update End If Next fld rs.MoveNext Loop End If rs.Close Next tblName MsgBox "تمت عملية " & action & " بنجاح", vbInformation, "" End Sub Public Sub HandleEncryptionOnFormOpen() If CheckEncryptionStatus() = True Then Call EncryptOrDecryptTables(EnCodeKey, False) SetEncryptionStatus False End If End Sub Public Sub HandleEncryptionOnFormClose() If CheckEncryptionStatus() = False Then Call EncryptOrDecryptTables(EnCodeKey, True) SetEncryptionStatus True End If End Sub Public Function GetTotalRecordCount() As Long Dim db As DAO.Database Dim tblDef As DAO.TableDef Dim totalCount As Long Dim rs As DAO.Recordset Set db = CurrentDb totalCount = 0 For Each tblDef In db.TableDefs If Left(tblDef.Name, 4) <> "MSys" Then Set rs = db.OpenRecordset(tblDef.Name, dbOpenSnapshot) If Not (rs.EOF And rs.BOF) Then rs.MoveLast totalCount = totalCount + rs.recordCount End If rs.Close End If Next tblDef Set db = Nothing GetTotalRecordCount = totalCount End Function تم تنفيذ الفكرة بطريقتين ، الأولى من خلال الإعتماد على النموذج الرئيسي الذي يفتح به المشروع ( في حدث عند التحميل يتم الغاء التشفير ) وعند زر إغلاق المشروع يوجد حدث لإعادة التشفير لجميع الجداول مرة واحدة وبسرعة مهما كان عدد السجلات . والثانية من خلال نموذج آخر عند النقر على زر Start يبدأ شريط التحميل والذي يعتمد على عدد السجلات في جميع الجداول التي تم تشفيرها بالتقدم من 0 - 100% . وعند اغلاق النموذج يتم اعادة التشفير مرة أخرى . ✔ خطوات الحصول على النتيجة الصحيحة كالآتي :- ✔ انسخ الجدول (EncryptionStatus ) والمديول ( Encryption ) إلى أي مشروع تريده . ✔ تأكد من أن جميع السجلات غير مشفرة . ✔ تأكد من أن حالة الحقل Status هي No . قمت بكتابة الموضوع على عجالة ، وتركت الباب مفتوح للنقاش . Tashfeer 2024.accdb 644 kB · 93 downloads كيفية تشفير ال vba أوة المديول أو الوحدات النمطية لعدم العبث بها
Foksh قام بنشر منذ 22 ساعات الكاتب قام بنشر منذ 22 ساعات في 17/12/2024 at 09:32, gamal ghanem said: كيفية تشفير ال vba أوة المديول أو الوحدات النمطية لعدم العبث بها عند حفظ الملف بصيغة accde لا أعتقد أنك بحاجة لهذه النقطة ، حتى لو لم تقم بقفل محرر الأكواد VBA بكلمة مرور .
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.