اذهب إلى المحتوى

لوحة المتصدرين

  1. إياد أحمد

    إياد أحمد

    الأعضاء


    • نقاط

      4

    • المساهمات

      92


  2. سامح أشرف

    سامح أشرف

    الأعضاء


    • نقاط

      4

    • المساهمات

      2934


  3. Mohssen A Mohssen

    Mohssen A Mohssen

    الأعضاء


    • نقاط

      2

    • المساهمات

      317


  4. Ali Haidar Ahmad

    Ali Haidar Ahmad

    الأعضاء


    • نقاط

      2

    • المساهمات

      1068


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 11/21/21 في كل الموقع

  1. أحاول جمع بعض المعلومات من المواقع المختلفة وأريد استخدام bs4 لاستخلاص بعض الفقرات من مواقع مختلفة، فيكف يمكنني القيام بذلك؟ على سبيل المثال لدي صفحة الويب التالية: https://undergrad.cs.umd.edu/what-computer-science أريد أن أقوم بسحب هذه الفقرة.
    1 نقطة
  2. لدي الموقع التالي: https://www.imdb.com/title/tt5648202/ وأحاول استخراج القيم التي تأخذها ال attribute (السمة) class ضمن الوسم main في الصفحة؟ كيف يمكنني الحصول عليها؟
    1 نقطة
  3. أريد مساعدة بشأن صفحة html تخص جدول توزيع المياه، مثل الظاهر في هذا الموقع.
    1 نقطة
  4. كيف يمكننا البحث عن نص معين داخل tag معين. على سبيل المثال البحث عن أي نص يحوي كلمة دورة ضمن الوسم h وإرجاع هذا ال tag؟
    1 نقطة
  5. قرأت في عدد من الأماكن أن لا يجب أن أستخدم الكود التالي: using namespace std; لكن بالرغم من ذلك، أليس الكود السابق يجعل مهمة التطوير أسهل؟ فبدلًا من إستعمال std::cout أكتب cout فقط. لماذا لا ينصح بإستخدام الكود السابق؟ هل يؤثر على سرعة تنفيذ البرنامج؟ أم يوجد سبب مختلف؟
    1 نقطة
  6. هدا الكمبوننت يجعل التطبيق بطيئا لاننى استخدمت فيه animation واستخدمته بكثرة فى أغلب سكرينات التطبيق .. هل يمكن فعل شئ فى الكود حتى يكون اسرع ؟ import React, {useEffect, useState, useRef, FC} from 'react'; import { Text, View, Animated, StyleProp, ViewStyle, TextStyle, TextInput, StyleSheet, I18nManager, } from 'react-native'; import {PixelPerfect} from './helper/pixelPerfect'; interface AnimatedInputInter { label: string; styleContainer?: StyleProp<ViewStyle>; styleLabelCon?: StyleProp<ViewStyle>; styleTextCon?: StyleProp<ViewStyle>; styleLabel?: StyleProp<TextStyle>; styleCustomWord?: StyleProp<TextStyle>; styleTextInput?: StyleProp<TextStyle>; keyboardType?: any; hasIcon?: boolean; multiline?: boolean; customIcon?: JSX.Element | JSX.Element[]; styleIconCon?: StyleProp<ViewStyle>; secureTextEntry?: boolean; hasWord?: boolean; customWord?: JSX.Element | JSX.Element[]; oneColor?: boolean | string; } export const AnimatedInput: FC<AnimatedInputInter> = ({ label, styleContainer, styleLabelCon, styleLabel, styleTextInput, keyboardType, hasIcon, hasWord, customWord, customIcon, styleIconCon, secureTextEntry, styleCustomWord, styleTextCon, multiline, oneColor, ...props }) => { const [value, setValue] = useState(''); const [fontSize, setFontSize] = useState(14); const [fontColor, setFontColor] = useState('#515C6F'); const moveText = useRef(new Animated.Value(0)).current; useEffect(() => { if (value !== '') { moveTextTop(); } else if (value === '') { moveTextBottom(); } }, [value]); const onChangeText = (text: string) => { setValue(text); }; const onFocusHandler = () => { if (value !== '') { moveTextTop(); } }; const onBlurHandler = () => { if (value === '') { moveTextBottom(); } }; const moveTextTop = () => { Animated.timing(moveText, { toValue: 1, duration: 200, useNativeDriver: true, }).start(); setFontSize(12); setFontColor('rgba(81,92,111,.5)'); }; const moveTextBottom = () => { Animated.timing(moveText, { toValue: 0, duration: 200, useNativeDriver: true, }).start(); setFontSize(14); setFontColor('#515C6F'); }; const yVal = moveText.interpolate({ inputRange: [0, 1], outputRange: [4, -7], }); const animStyle = { transform: [ { translateY: yVal, }, ], }; return ( <View style={[styles.container, styleContainer]}> {hasIcon && (customIcon ? ( <View style={[styles.iconCon, styleIconCon]}>{customIcon}</View> ) : ( <View style={styles.iconCon}> <Text>X</Text> </View> ))} <Animated.View style={[ styles.labelCon, animStyle, {left: hasIcon ? PixelPerfect(100) : PixelPerfect(30)}, styleLabelCon, ]}> <Text style={[ styles.label, styleLabel, {fontSize: fontSize, color: oneColor ? oneColor : fontColor}, ]}> {label} </Text> </Animated.View> <View style={[ { width: hasWord ? '80%' : '100%', paddingTop: 5, }, ]}> <TextInput textAlign={I18nManager.isRTL ? 'right' : 'left'} onPressIn={moveTextTop} style={[ styles.input, styleTextInput, { width: '100%', height: '40%', }, ]} // value={value} onChangeText={(text: string) => onChangeText(text)} editable={true} onFocus={onFocusHandler} onBlur={onBlurHandler} blurOnSubmit placeholderTextColor={'#727C8E'} keyboardType={keyboardType} secureTextEntry={secureTextEntry} multiline={multiline} {...props} /> </View> {hasWord && (customWord ? ( <View style={[styles.TextCon, styleTextCon]}>{customWord}</View> ) : ( <View style={styles.TextCon}> <Text style={styleCustomWord}>X</Text> </View> ))} </View> ); }; export default AnimatedInput; const styles = StyleSheet.create({ container: { backgroundColor: '#FFFFFF', paddingHorizontal: 10, borderColor: '#bdbdbd', borderRadius: 2, width: '100%', alignSelf: 'center', height: PixelPerfect(140), flexDirection: 'row', alignItems: 'center', }, input: { fontSize: PixelPerfect(25), color: '#000', height: '55%', flex: 4, marginTop: PixelPerfect(40), }, label: { color: '#7C8AA3', fontSize: PixelPerfect(25), }, labelCon: { top: PixelPerfect(40), position: 'absolute', borderRadius: 90, }, iconCon: { height: '100%', width: PixelPerfect(70), justifyContent: 'center', alignItems: 'center', }, TextCon: { height: '100%', width: PixelPerfect(100), justifyContent: 'center', alignItems: 'center', flex: 1, }, });
    1 نقطة
  7. أحاول أن أقوم بعمل ملفين header وأحد هذه الملفات معتمد على الآخر: الملف الأول square.h: int getSquareSides() { return 4; // مجرد كود بسيط } الملف الثاني geometry.h يعتمد على الملف الأول ويقوم بتضمينه كالتالي: #include "square.h" ملف main.cpp: #include "square.h" #include "geometry.h" int main() { // ... return 0; } عندما أقوم بتضمين كلا الملفين يظهر لي الخطأ التالي في ملف square.h: Error C2084 function 'int getSquareSides(void)' already has a body ما سبب هذا الخطأ؟ وكيف أقوم بتضمين ملف ترويسة header أكثر من مرة بدون ظهور هذا الخطأ؟
    1 نقطة
  8. كيف يمكننا القيام باستخراج عنوان الصفحة وجميع عناوين الويب URLs الموجودة ضمن صفحة معينة من خلال مكتبة BeautifulSoup في بايثون؟
    1 نقطة
  9. إن الدروس 17 كافية لتعلم الأساسيات التي تحتاجها في تعلمك لمجال تطوير الواجهات الأمامية، الهدف من الدورة ليس إحترافك للغة جافاسكربت في حد ذاتها و إنما الدخول في مجال تطوير الواجهات الأمامية و إستخدام التقنيات و اللغات الأساسية في تطوير الويب مع بعضها في مشاريع حقيقية و فعلية و هذا ما يُميز دورات أكاديمية حسوب عن بعضها: الجانب التطبيقي و الجانب التوجيهي هو أكثر شيء مفيد لك في أكاديمية حسوب. ليس الهدف من الدورات هو شرح كل الخاصيات الموجودة في لغة ما و إنما الهدف هو شرح المفاهيم الأساسية التي ستحتاج لها في مجال الدورة و في مُعظم المشاريع أي المفاهيم الأساسية و هذا الجزء سيتم شرحه في مسار الأساسيات و مفاهيم أخرى ستتعلمها في الجانب التطبيقي. ليست الدورة هي من ستُعلمك كل شيء الأكيد أنها ستكون جزء من تعلمك و دافع و حافز لك، لكن الجزء الأكبر الذي سيزيد من مستواك و يُطورك هو أنت، حبك للمجال، إرادتك و شغفك في التعلم. نصيحة ستفيدك في طريقك: أي شيء يمر عليك و لا تعرفه أو تجد فيه لُبس ما إبحث عنه و أقرأ عنه، إجعل مُحرك البحث صديقك الدائم، بالتوفيق.
    1 نقطة
  10. سوف يتم شرح أساسيات لغة جافاسكربت مثل المتغيرات والمعاملات وطباعة البيانات وجمل التحكم وحلقات التكرار وغيرها من المواضيع المهمة وأيضا سوف يتم شرح شجرة دوم -DOM- وكيفية الوصول لعناصر HTML , وأساسيات JQUERY أيضا , كل هذه الأشياء كافية للتعامل مع تصميم صفحات الانترنت ولن تحتاج لدورات خارجية , ولكن تحتاج للممارسة وتطبيق ما تعلمته في تصميم الصفحات , وأيضا ال 17 درس ليس هي وحدها , سوف يتم شرح المزيد خلال المسارات الأخرى من نفس الدورة وسوف يتم التعرف على الكثير من المكتبات والتقنيات أثناء الدورة مما يجعلك مؤهلا بشكل كافي لتصميم مواقع الانترنت ولكن ما تحتاجه هو الممارسة لاكتساب الخبرة
    1 نقطة
  11. يمكنك استخدام string streams. حيث أنه في هذه الطريقة، يعلن ال string stream عن كائن (stream object) يقوم أولاً بإدخال رقم ك stream في كائن، ثم يستخدم الدالة ()str لتحويله إلى سلسلة. #include<iostream> #include <sstream> // string streams من أجل #include <string> // string من أجل using namespace std; int main() { int x = 2513183; // output string stream إنشاء كائن ostringstream str1; // (stream) إرسال رقم كتدفق في سلسلة الإخراج str1 << x; // the str() converts number into string string s = str1.str(); // عرض النتيجة cout << "The newly formed string from number is : "; cout << s << endl; return 0; } // الخرج: /* The newly formed string from number is : 2513183 */ وللتحويل المعاكس (من سلسلة إلى رقم) يمكنك استخدم stringstream، وهي طريقة سهلة لتحويل سلاسل نصية من الأرقام إلى ints أو floats أو double. مثال: #include <iostream> #include <sstream> using namespace std; int main() { string s = "12345"; // stringstream كائن من الصنف stringstream obj(s); // الكائن له القيمة 12345 وسنقوم بدفقه إلى عدد الصحيح int x = 0; obj >> x; //يحمل القيمة المطلوبة x الآن المتغير cout << "Value of x : " << x; return 0; } /* Value of x : 12345 */
    1 نقطة
  12. الطريقة اليدوية هي تشكيل سلسسة نصية من العدد بتقسيمه لعوامله الرقمية، حيث نأخذ الأرقام من اليمين لليسار عن طريق باقِ القسمة على 10 ونكرر العملية بدمج المحارف التي سنكونها من هذه الأرقام، ثم نعكس السلسلة النصية الناتجة // دالة تعيد سلسلة نصية // تستقبل عدد رقم صحيح string number_to_string(int x) { if (!x) // x = 0 return "0"; string s = ""; // تهيئة السلسة الحاوية على الإجابة while(x) { // نأخذ آحاد الرقم من خلال باقي القسمة على 10 // نضيف للرقم المحرف الصفري مايكافئ عملية التحويل إلى محرف نصي s.push_back(x%10 + '0'); x /= 10; } // نعكس السلسة // العملية السابقة تضيف الأرقام في منزلة العشرات و المئات على يمين الأعدادا السابقة reverse(s.begin(), s.end()); return s; } كما يمكن استعمال sprintf حيث في المثال نكتب القيمة X في السلسلة النصية y #include <stdio.h> int main() { int x=23; char y[2]; //the output buffer sprintf(y,"%d",x); printf("%s",y) } ويمكن استخدام boost/lexical_cast وهو يوفر آلية تحويل الأنماط #include <iostream> #include <string> #include <boost/lexical_cast.hpp> int main() { int i = 10; // نمط الإعادة هو سلسلة نصية std::string s = boost::lexical_cast<std::string>(i); std::cout << s << std::endl; return 0; }
    1 نقطة
  13. بداية من ++C11 يمكنك أن تستخدم الدالة to_string لتحويل الأرقام بشكل عام إلى نصوص، كالتالي: #include <string> int main() { int x = 23; std::string s = std::to_string(x); return 0; } الكود السابق مشابهة لـ atoi و itoa في لغة C ولكن من خلال std:to_string يمكنك أيضًا أن تستعمل stringstream بدون مشكلة: int main() { int x = 10; std::stringstream ss; ss << x; std::string str = ss.str(); return 0; } ولكن الطريقة الأولى أسهل في الكتابة وأوضح في القراءة.
    1 نقطة
  14. تحتوي دورة إنشاء تطبيقات الويب بلغة PHP على مشروع واحد فقط يتم عمله بلغة PHP بدون إطار عمل والهدف منه هو تعلم أساسيات اللغة نفسها من متغيرات ودوال وحلقات وأصناف .. إلخ، وذلك لتأهيل الطالب للعمل على مشاريع أخرى بإستخدام Laravel أو WordPress، وذلك لأن سوق العمل يتطلب إستخدام إطار عمل معروف أكثر من إنشاء كل مشروع من الصفر بإستخدام PHP فقط، أيضًا توفر إطارات العمل الكثير من الوقت والمجهود على المبرمجين، حيث تأتي بالكثير من الأدوات والملفات المعدة مسبقًا والتي يمكن إستخدامها بشكل مباشر. وبالتالي يجب على الطالب أن يتدرب أكثر على إستخدام إطار عمل مشهور وواسع الإنتشار مثل Laravel بالتأكيد بعد تعلم أساسيات البرمجة بإستخدام PHP. أيضًا يفضل أن يستخدم المبرمج إطار عمل جاهز حتى ولو كان متقنًا للغة البرمجة التي يستعملها، لأن إطارات العمل مفتوحة المصدر يعمل عليها العشرات من المبرمجين المحترفين لتطويرها وكذلك لإضافة مميزات جديدة فيها وحمايتها من الثغرات وبالتالي لن يتمكن مبرمج واحد من عمل ما يقوم به عشرات المبرمجين المحترفين ومئات المبرجين الآخرين الذين يقوم بعمل العديد من الحزم والمكتبات لإطار العمل هذا. في حالة أردت أن تتدرب أكثر على لغة PHP فيمكنك أن تحاول تقليد أي موقع تراه من الصفر بإستخدام PHP وحدها أو حتى محاولة إنشاء مشاريع Laravel الموجودة في الدورة بدون إطار عمل.
    1 نقطة
  15. الطريقة1: نقوم بتعريف و تهيئة متغير يمثل كلمة على فارغ (سنسميه word )، ثم نمر على كل المحارف في السلسلة ، ونختبر فيما إذا كان المحرف الحالي عبارة عن مسافة فارغة، فهذا يعني أننا وصلنا لنهاية الكلمة، فنطبعها، ونقوم بضبط word على ""، وإلا فإننا نضيف المحرف الحالي إلى word. #include <iostream> using namespace std; void split(string str) { string word = ""; for (auto c : str) { if (c == ' ') { cout << word << endl; word = ""; } else { word = word + c; } } cout << word << endl; } int main() { string str = "One Two Three Four"; split(str); return 0; } /* One Two Three Four */ الطريقة2: من خلال استخدام الدالة strtok. التي لها الشكل التالي: strtok(char* str, const char* delim); حيث أن الوسيط الأول يمثل السلسلة التي نريد الحصول على الرموز منها. والثاني حرف التحديد ، أي الحرف الذي يفصل بين الرموز. وتستخدم هذه الدالة للقيام بعملية tokenizing (أي فصل النصوص إلى وحدات محرفية أو كلمات) بناءاً على delimiter محدد. ويقوم بإرجاع مؤشر إلى ال token التالي إذا كان موجوداً، وإذا لم يكن هناك token تالي موجوداً فإنه يقوم بإرجاع NULL. وبالتالي للحصول على جميع ال tokens (في حالتنا الكلمات)، ستكمن الفكرة في استدعاء هذه الدالة في حلقة. #include <bits/stdc++.h> using namespace std; void split(char str[]) { // token تعيد أول char *token = strtok(str, " "); // str[] استمر في طباعة الكلمات طالما يوجد أحد المحددات في while (token != NULL) { printf("%s\n", token); // طباعة الكلمة والنزول سطر token = strtok(NULL, " "); } } int main() { char str[] = "One Two Three Four"; split(str); return 0; } /* One Two Three Four */
    1 نقطة
  16. يكمن الفرق بين الطريقتين في مكان الملفات التي يبحث عنها الـ preprocessor: #include <filename> عند إستخدام الكود السابق يقوم الـ Preprocessor بالبحث عن الملفات حسب ترتيب إستدعائها في المجلدات المعدة مسبقًا في بيئة التطوير IDE أو في المصرف Compiler، وينم إستخدام هذه الطريقة في العادة لإستدعاء ملفات الترويسة Header الخاصة بالمكتبات القياسية Standard Libraries. في حين أن أستخدام الكود التالي: #include "filename" يقوم الـ Preprocessor بالبحث عن الملفات بداية من المجلد الحالي (مجلد التنفيذ CWD) عن الملفات حسب المسار المستخدم في جملة include، وتستخدم هذه الطريقة في العادة لإستدعاء ملفات الترويسة Header التى قام بكتابتها أو إضافتها المبرمج نفسه، وهي ليست جزء من مكتبات اللغة القياسية. يمكنك الإطلاع على هذه المقالة: ولمزيد من الشرح عن المعالجة الأولية Preprocessor أطلع على هذه المقالة:
    1 نقطة
  17. يمكننا كتابة دالة تقوم بالمرور على السلسلة النصية، وتجميع الحروف المتتالية (ماعدا الفراغات) وإضافتها لمصفوفة الإجابة والتي من الممكن أن تكون مصفوفة Vector بنمط String // الناتج وهو مصفوفة سلاسل السلسلة النصية void split_string(string text,vector<string>& words) { int i=0; // بداية السلسة char ch; // محرف مؤقت للقراءة string word; // سلسلة لتجميع الأحرف المتتالية التي تشكل سلسلة نصية // المرور على السلسلة while(ch=text[i++]) { if (isspace(ch)) // في حال وجدنا فراغ { if (!word.empty()) // إن كان لدينا كلمة { words.push_back(word); // نضيفها للإجابة } word = ""; // إعادة تهيئة المتغير المؤقت للكلمة } else // يوجد حرف { word += ch; // نضيف الحرف للكلمة الحالية } } if (!word.empty()) // بعد الانتهاء من الحلقة إن بقي لدينا أحرف ضمن السلسلة { words.push_back(word); // نضيف آخر كلمة } } لاحظ وجود شرط لتجاوز الفراغات المتتالية، حيث لا نضيف فراغ للمتغير الذي نقوم فيه بتجميع المحارف المتتالية
    1 نقطة
  18. function printNums(n) { if (!Number.isInteger(n)) return; // التحقق من العدد const nums = [...Array(n + 1).keys()]; // انشاء قائمة تحتوي أرقام من 0 الى العدد nums.map((num) => console.log(num.toString())); // انشاء حلقة لطبع الأعداد على شكل نص } printNums(9);
    1 نقطة
  19. بالإضافة إلى إجابة بلال يمكنك أيضًا في بداية الدالة التأكد أن الرقم الذي أدخله المستخدم من النوع integer عن طريق التالي التأكد أولاً من أن المتغير هو رقم ويمكن التأكد من ذلك عبر الدالة isNan حيث تعطي true إن كان المتغير ليس رقم وتعطي false إن كان رقم if(!isNan(number)) نقوم بعد ذلك بتحويل المتغير إلى رقم, لأنه من الممكن أن يكون موضوع بين عﻻمتي تنصيص فنقوم بالتحويل إلى رقم عبر الدالة Number Number(number) بعد ذلك نقوم بالتأكد أن الرقم integer عبر الدالة isInteger Number.isInteger(number) في النهاية يكون الشرط كالتالي if(!isNaN(number)&&Number.isInteger(Number(number))) ////do printing else console.log("برجاء إدخال رقم من النوع integer")
    1 نقطة
  20. يمكنك إنشاء باستخدام جافا سكريبت بهذه الطريقة function printNumber(a){ var q = parseInt(a, 10); for(var i=0; i<= a; i++){ console.log(i) } } بحيث تستقبل هذه الدالة العدد المراد طباعة الأرقام حسب قيمته , و لاحظ انه قمنا بتمرير العدد النصي الذي قمنا بتمريره للدالة إلى دالة parseInt لنقوم بتحويل العدد النصي إلى رقمي و من ثم قمنا بإنشاء حلقة تكرار من نوع for لكي نقوم بطباعة الأرقام وصولاً إلى العدد الذي قمنا بتمريره و يكون كامل الكود function printNumber(a){ var q = parseInt(a, 10); for(var i=0; i<= a; i++){ console.log(i) } } printNumber("9") و تكون نتيجة الكود التالي هي 0 1 2 3 4 5 6 7 8 9
    1 نقطة
  21. في البداية تحتاج إلى تخزين النص في متغير من نوع string: #include <iostream> #include <string> int main() { std::string sentence = "One Two Three Four"; return 0; } بعد ذلك ستحتاج إلى عمل string stream من خلال التابع istringstream الموجود في المكتبة sstream: #include <iostream> #include <string> // لإستخدام الكائن string #include <sstream> // لإستخدام الكائن istringstream int main() { std::string sentence = "One Two Three Four"; std::istringstream iss(sentence); return 0; } الآن يمكن إستخدام التابع copy الموجود في المكتبة sstream أيضًا لطباعة كل كلمة من النص عبر التابع cout #include <iostream> #include <string> #include <sstream> int main() { std::string sentence = "One Two Three Four"; std::istringstream iss(sentence); std::copy( std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::ostream_iterator<std::string>(std::cout, "\n") ); return 0 } بهذا الشكل سوف يكون الناتج كالتالي: One Two Three Four
    1 نقطة
  22. جميل .. قرأت بعض المقالات التي تتحدث عن ال CNN لكنها تتجاهل هذا الموضوع.. تحياتي
    1 نقطة
  23. السلام عليكم ماهو الفرق بين الحاجة والرغبة والطلب؟ وكيفية إستخدام كل منهم فى العملية التسويقية؟
    1 نقطة
  24. مرحبًا @Omar Khalifa، يعتمد هذا الأمر على العمل الذي تريد أن تعمل به، مثلًا إن كنت تريد برمجة تطبيقات React native و IOS فأنصحك بشراء ماك بوك، وذلك لسهولة تعامل الماك بوك مع هذه اللغات، حيث أنك عند بناء تطبيقات بلغة IOS و React native للأيفون لن تحتاج إلى محاكي Viewr حيث يؤمن لك الماك بوك بيئة عمل سهلة لهذه التطبيقات. أما إن كان هدفك هو فقط برمجة مواقع الويب واطبيقات Flutter بسيطة فيمكنك ذلك من خلال أي جهاز تريد ويندوز أو لينوكس أو حتى ماك، ولن تكون بحاجة إلى مواصفات عالية للحاسب، حيث أنه يكفيك ذاكر 8 جيجا و معالج جيل عاشر core i5. أما إذا كنت ترغب ببناء تطبيقات باستخدام لغة #C فيجب عليك إستخدام ويندوز وذلك ﻷن Microsoft هي الداعم الأساسي لهذه اللغة لذلك سوف تجد فيها سهولة عند استخدامها من قبل ويندوز. أكرر يعود هذا الأمر إلى طبيعة العمل والهدف من شرائك لهذا الحاسوب. أتمنى لك التوفيق..
    1 نقطة
×
×
  • أضف...